mirror of
https://github.com/scandum/tintin
synced 2026-08-13 20:23:04 -04:00
1226 lines
29 KiB
Text
1226 lines
29 KiB
Text
#nop -------------------------------------------------------------------------
|
|
#nop Learn by example
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Loop through room 1 to 1000 and change the color of rooms with the
|
|
#nop static (16) flag to <168>.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {color_static}
|
|
{
|
|
#loop 1 1000 vnum
|
|
{
|
|
#map at $vnum
|
|
{
|
|
#map get roomflags result;
|
|
#if {$result & 16}
|
|
{
|
|
#map set roomcolor <168>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Capture system information. #script stores the output as a list,
|
|
#nop hence the need to convert it into a normal variable.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#script {dir} {pwd}
|
|
#var dir $dir[1]
|
|
|
|
#script {home} {echo $HOME}
|
|
#var home $home[1]
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Automatically reconnect on disconnect.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {SESSION CONNECTED}
|
|
{
|
|
#event {SESSION DISCONNECTED}
|
|
{
|
|
#gts #delay 5 {#session %0 %1 %3}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Execute a random social at random time intervals.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#tick {randomsocial}
|
|
{
|
|
#delay {1d180}
|
|
{
|
|
#switch {1d4}
|
|
{
|
|
#case {1} {cheer};
|
|
#case {2} {greet all};
|
|
#case {3} {smile};
|
|
#case {4} {laugh self}
|
|
}
|
|
}
|
|
}
|
|
{200}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Maintain a friendlist. %i creates a case insensitive regex.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#variable {friendlist}
|
|
{
|
|
{bubba};{pamela};{cookie};{harry potter}
|
|
}
|
|
|
|
#function isfriend
|
|
{
|
|
#return &friendlist[%i%0];
|
|
}
|
|
|
|
#act {%1 follows you.}
|
|
{
|
|
#if {@isfriend{%1}}
|
|
{
|
|
group %1
|
|
};
|
|
#else
|
|
{
|
|
unfollow %1
|
|
}
|
|
}
|
|
|
|
#alias {addfriend}
|
|
{
|
|
#format name %l {%0};
|
|
|
|
#var friendlist[$name] {};
|
|
|
|
#showme $name has been added to your friendlist.
|
|
}
|
|
|
|
#alias {delfriend}
|
|
{
|
|
#format name %l {%0};
|
|
|
|
#if {@isfriend{$name}}
|
|
{
|
|
#unvar friendlist[$name];
|
|
#showme $name has been deleted from your friendlist.
|
|
};
|
|
#else
|
|
{
|
|
#showme $name is not on your friendlist.
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Append a goto to your current room when saving a map. Alternatively, you
|
|
#nop can use #map return.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {savemap}
|
|
{
|
|
#map write %0;
|
|
#map get roomvnum room;
|
|
#system echo '#map goto $room' >> %0
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Log all text to a file with a timestamp with decisecond precision.
|
|
#nop Alternatively you can use #log timestamp.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#function {timestamp}
|
|
{
|
|
#format utime {%U};
|
|
|
|
#format result {%t.%m} {%Y-%m-%d %H:%M:%S} {$utime % 1000000 / 100000}
|
|
}
|
|
|
|
#event {RECEIVED LINE}
|
|
{
|
|
#line log mylog.txt {<178>@timestamp{} \};
|
|
#line log mylog.txt
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Old school tick support.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#tick {oldtick}
|
|
{
|
|
#delay 50 #showme #10 SECONDS TO TICK!!;
|
|
#showme #TICK!!!
|
|
}
|
|
{60}
|
|
|
|
#alias {tickers}
|
|
{
|
|
#info tickers save;
|
|
|
|
#echo {<128>%+20s %+20s %+20s} {Name} {Interval} {Remaining};
|
|
|
|
#draw Yellow scroll line 1 1 1 62;
|
|
|
|
#format utime %U;
|
|
|
|
#loop 1 &info[TICKERS][] index
|
|
{
|
|
#math uval $info[TICKERS][+$index][arg3] * 1000000;
|
|
|
|
#echo {%+20s %+20s %+20m}
|
|
{$info[TICKERS][+$index][arg1]}
|
|
{$info[TICKERS][+$index][arg3]}
|
|
{($uval - ($utime - $info[TICKERS][+$index][arg4]) % $uval) / 1000000.00}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Execute speedwalks with .
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {.%0}
|
|
{
|
|
#var cnt {};
|
|
|
|
#parse {%0} {char}
|
|
{
|
|
#if {"$char" >= "0" && "$char" <= "9"}
|
|
{
|
|
#var cnt $cnt$char
|
|
};
|
|
#elseif {"$cnt" == ""}
|
|
{
|
|
#send $char
|
|
};
|
|
#else
|
|
{
|
|
#$cnt #send $char;
|
|
#var cnt {}
|
|
}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Targetting script
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#var targets {}
|
|
|
|
#alias {target}
|
|
{
|
|
#if {"%0" == ""}
|
|
{
|
|
#showme {Current targets: $targets[]}
|
|
};
|
|
#elseif {&targets[%0]}
|
|
{
|
|
#unvar targets[%0];
|
|
#showme Target '%0' removed.
|
|
};
|
|
#else
|
|
{
|
|
#var targets[%0] {};
|
|
#showme Target '%0' added.
|
|
}
|
|
}
|
|
|
|
#act {%1 arrives}
|
|
{
|
|
#if {&targets[%1]} {kill %1}
|
|
}
|
|
|
|
#act {%1 is standing here}
|
|
{
|
|
#if {&targets[%1]} {kill %1}
|
|
}
|
|
|
|
#action {%1 is dead! R.I.P.}
|
|
{
|
|
#if {&targets[%1]} {target %1}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Show xterm 256 colors.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {color_table}
|
|
{
|
|
#var temp {};
|
|
|
|
#foreach {0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15} {var1}
|
|
{
|
|
#showme {$var1 \e[38;5;${var1}m}
|
|
};
|
|
|
|
#foreach {a;b;c;d;e;f} {var1}
|
|
{
|
|
#foreach {a;b;c;d;e;f} {var2}
|
|
{
|
|
#foreach {a;b;c;d;e;f} {var3}
|
|
{
|
|
#var temp {$temp <$var1$var2$var3><<888>$var1$var2$var3>}
|
|
};
|
|
#showme $temp;
|
|
#var temp {}
|
|
}
|
|
};
|
|
|
|
#loop 0 23 cnt
|
|
{
|
|
#format temp {$temp <g%+02s><<888>g%+02s} {$cnt} {$cnt};
|
|
};
|
|
#showme $temp
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Draw a health bar. Alternatively: #draw bar -2 1 -2 20 {%1;%2;<faa><afa>}
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {hpbar}
|
|
{
|
|
#math {hp_percent}{100 * %1 / %2};
|
|
#math {hpbars1} {$hp_percent / 5};
|
|
#math {hpbars2} {20 - $hpbars1};
|
|
|
|
#format {hpbar} {<011>%+${hpbars1}s<099><000>%+${hpbars2}s<099> };
|
|
|
|
#showme [$hpbar]
|
|
}
|
|
|
|
#alias {test}
|
|
{
|
|
hpbar 30 100
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Syntax: sleep <seconds to delay> {commands}
|
|
#nop
|
|
#nop If there is already a pending sleep the delay will be stacked.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#var sleeptime 0
|
|
#var sleepcurr 0
|
|
|
|
#alias {sleep %1 %2}
|
|
{
|
|
#format sleeptime %U;
|
|
|
|
#if {$sleeptime > $sleepcurr}
|
|
{
|
|
#math sleepcurr $sleeptime + (%1) * 1000000;
|
|
|
|
#delay {%1} %2;
|
|
};
|
|
#else
|
|
{
|
|
#math sleepcurr $sleepcurr + (%1) * 1000000;
|
|
|
|
#delay {($sleepcurr - $sleeptime) / 1000000.000} %2
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This function and substitution will highlight spelling errors as red.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#function spellcheck
|
|
{
|
|
#format result %S %1;
|
|
#if {$result == 0}
|
|
{
|
|
#var result %1
|
|
};
|
|
#else
|
|
{
|
|
#var result <118>%1<900>
|
|
}
|
|
}
|
|
|
|
#substitute {{\b[a-zA-Z]+\b}} {@spellcheck{%1}}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This function and substitution will add a speed reader to the split line
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#split
|
|
|
|
#function {spellcheck}
|
|
{
|
|
#format result %S %1;
|
|
#if {$result == 0}
|
|
{
|
|
#var result %1
|
|
};
|
|
#else
|
|
{
|
|
#var result <118>%1<900>
|
|
};
|
|
#list speedread ins -1 {$result}
|
|
}
|
|
|
|
#substitute {{\b[a-zA-Z]+\b}} {@spellcheck{%1}}
|
|
|
|
#tick {speedread}
|
|
{
|
|
#if {&{speedread[]}}
|
|
{
|
|
#draw tile -2 1 -2 20 {$speedread[1]};
|
|
#list speedread delete 1
|
|
}
|
|
}
|
|
{0.1}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This function tests the random number engine
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {random}
|
|
{
|
|
#var random {};
|
|
#loop 1 1000 cnt
|
|
{
|
|
#math tmp 1d1000000000 % 10;
|
|
#math random[$tmp] $random[$tmp] + 1
|
|
};
|
|
#var random
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This macro allows pasting multi-line code fragments on pressing ctrl-v.
|
|
#nop Alternatively, use ctrl-enter after pressing ctrl-v and pasting a script.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#macro {\cv}
|
|
{
|
|
#cursor {convert meta} on;
|
|
#line oneshot #event {CATCH RECEIVED INPUT}
|
|
{
|
|
#line sub {esc} #var paste {%0};
|
|
#replace paste {\\n\\n} {;};
|
|
#replace paste {\\n} {};
|
|
#replace paste {\\t} {};
|
|
#replace paste {;;} {;};
|
|
#1 {$paste}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This event will cause tintin to always report your screen width as 80
|
|
#nop columns
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {CATCH IAC DO NAWS}
|
|
{
|
|
#screen get rows ROWS;
|
|
#format ROWS %a $ROWS;
|
|
|
|
#send {\xFF\xFB\x1F\xFF\xFA\x1F\x50\x00${ROWS}\x00\xFF\xF0\}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Remove duplicate lines and add a counter. Does not work in gts because
|
|
#nop it uses named delays.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#var repeat[str] {}
|
|
#var repeat[cnt] 1
|
|
|
|
#act {~%+}
|
|
{
|
|
#if {{%0} === {$repeat[str]}}
|
|
{
|
|
#math repeat[cnt] $repeat[cnt] + 1;
|
|
#delay {repeat} {repeat_show} {0}
|
|
};
|
|
#else
|
|
{
|
|
repeat_show;
|
|
#var repeat[str] {%0}
|
|
};
|
|
#line gag
|
|
}
|
|
|
|
#alias {repeat_show}
|
|
{
|
|
#if {$repeat[cnt] <= 1}
|
|
{
|
|
#line ignore #showme {$repeat[str]}
|
|
};
|
|
#else
|
|
{
|
|
#line ignore #showme {<128>($repeat[cnt]) <088>$repeat[str]}
|
|
};
|
|
#var repeat[str] {};
|
|
#var repeat[cnt] 1
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop These macros will allow you to move around with the arrow keys while
|
|
#nop holding down the control key. You can move ne by pressing arrow up +
|
|
#nop right simultaniously. Move up by pressing arrow up + down simultaniously.
|
|
#nop Move down by pressing arrow left + right simultaniously.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#macro {\e[1;5A} {#cursor macro preserve;#delay {move} {#cursor macro reset;n} {0.05}}
|
|
#macro {\e[1;5C} {#cursor macro preserve;#delay {move} {#cursor macro reset;e} {0.05}}
|
|
#macro {\e[1;5B} {#cursor macro preserve;#delay {move} {#cursor macro reset;s} {0.05}}
|
|
#macro {\e[1;5D} {#cursor macro preserve;#delay {move} {#cursor macro reset;w} {0.05}}
|
|
|
|
#macro {\e[1;5A\e[1;5A} {#undelay {move};#cursor macro reset;n;n}
|
|
#macro {\e[1;5C\e[1;5C} {#undelay {move};#cursor macro reset;e;e}
|
|
#macro {\e[1;5B\e[1;5B} {#undelay {move};#cursor macro reset;s;s}
|
|
#macro {\e[1;5D\e[1;5D} {#undelay {move};#cursor macro reset;w;w}
|
|
|
|
#macro {\e[1;5A\e[1;5B} {#undelay {move};#cursor macro reset;u}
|
|
#macro {\e[1;5B\e[1;5A} {#undelay {move};#cursor macro reset;u}
|
|
|
|
#macro {\e[1;5C\e[1;5D} {#undelay {move};#cursor macro reset;d}
|
|
#macro {\e[1;5D\e[1;5C} {#undelay {move};#cursor macro reset;d}
|
|
|
|
#macro {\e[1;5A\e[1;5C} {#undelay {move};#cursor macro reset;ne}
|
|
#macro {\e[1;5C\e[1;5A} {#undelay {move};#cursor macro reset;ne}
|
|
|
|
#macro {\e[1;5B\e[1;5C} {#undelay {move};#cursor macro reset;se}
|
|
#macro {\e[1;5C\e[1;5B} {#undelay {move};#cursor macro reset;se}
|
|
|
|
#macro {\e[1;5D\e[1;5B} {#undelay {move};#cursor macro reset;sw}
|
|
#macro {\e[1;5B\e[1;5D} {#undelay {move};#cursor macro reset;sw}
|
|
|
|
#macro {\e[1;5D\e[1;5A} {#undelay {move};#cursor macro reset;nw}
|
|
#macro {\e[1;5A\e[1;5D} {#undelay {move};#cursor macro reset;nw}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Place tells in the top 5 lines of the screen
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#VARIABLE {COMMS} {}
|
|
|
|
#ACTION {~%1 tells you %2}
|
|
{
|
|
addtowin %1 tells you %2
|
|
}
|
|
|
|
#ACTION {~%1 chats %2}
|
|
{
|
|
addtowin %1 chats %2
|
|
}
|
|
|
|
#ALIAS {addtowin}
|
|
{
|
|
#format temp {%w} {%0};
|
|
|
|
#loop {1} {&temp[]} {cnt}
|
|
{
|
|
#list COMMS ins -1 {$temp[$cnt]}
|
|
};
|
|
#while {&COMMS[] > 100}
|
|
{
|
|
#list COMMS del 1
|
|
};
|
|
showwin
|
|
}
|
|
|
|
#ALIAS {showwin}
|
|
{
|
|
#screen clear square 1 1 5 -1;
|
|
|
|
#list temp create $COMMS[-5..-1];
|
|
|
|
#loop {1} {&temp[]} {cnt}
|
|
{
|
|
#regexp {$temp[$cnt]} {^$}
|
|
{
|
|
#nop
|
|
};
|
|
#else
|
|
{
|
|
#line ignore #showme {$temp[$cnt]} {$cnt} {1}
|
|
}
|
|
}
|
|
}
|
|
|
|
#ALIAS {test}
|
|
{
|
|
#split 5 1;
|
|
#showme <138>Bubba tells you 'hello';
|
|
#showme <158>Pamela chats 'bye';
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Display two sessions next to each other
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {SCREEN RESIZE}
|
|
{
|
|
#var ROWS %0;
|
|
#var COLS %1;
|
|
#draw line 1 {$COLS / 2} -3 {$COLS / 2};
|
|
|
|
#left #screen scroll 1 1 -3 {$COLS / 2 - 1};
|
|
#right #screen scroll 1 {$COLS / 2 + 1} -3 -1;
|
|
}
|
|
|
|
#event {PROGRAM START}
|
|
{
|
|
#screen raise SCREEN RESIZE;
|
|
#ses right localhost 4321;
|
|
#ses left localhost 4321;
|
|
}
|
|
|
|
#event {SESSION CREATED}
|
|
{
|
|
#var name %0;
|
|
}
|
|
|
|
#event {SESSION ACTIVATED}
|
|
{
|
|
#gts #var active %0;
|
|
}
|
|
|
|
#event {RECEIVED OUTPUT}
|
|
{
|
|
#if {"@gts{$active}" == "$name"}
|
|
{
|
|
#return;
|
|
};
|
|
|
|
#switch {"$name"}
|
|
{
|
|
#case {"left"} {#draw Red boxed foreground buffer 1 1 -3 {$COLS / 2 - 1};};
|
|
#case {"right"}{#draw Red boxed foreground buffer 1 {$COLS / 2 + 1} -3 -1};
|
|
};
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Follow the group leader on the map.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#var short_dir
|
|
{
|
|
{north}{n}
|
|
{northeast}{ne}
|
|
{east}{e}
|
|
{southeast}{se}
|
|
{south}{s}
|
|
{southwest}{sw}
|
|
{west}{w}
|
|
{northwest}{nw}
|
|
}
|
|
|
|
#action {%1 walks %2.$}
|
|
{
|
|
#var {follow_targets[%1]} {$short_dir[%2]}
|
|
}
|
|
|
|
#action {^You follow %1.$}
|
|
{
|
|
#if {&follow_targets[%1]}
|
|
{
|
|
#map move $follow_targets[%1]
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Use mouse click to change the input cursor's position.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#config mouse on
|
|
|
|
#split
|
|
|
|
#event {SHORT-CLICKED MOUSE BUTTON ONE -1}
|
|
{
|
|
#cursor position %1
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Move the VT100 map from the top to the right of the screen
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#map create
|
|
#map flag vtmap
|
|
#map flag unicode
|
|
#map goto 1
|
|
|
|
#split 0 1 0 -80;
|
|
#map offset 1 82 -5 -1
|
|
|
|
#screen resize horizontal 120
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Add clickable session tabs at the top of the screen
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {PROGRAM START}
|
|
{
|
|
#split 3 1;
|
|
#config mouse on;
|
|
#var active gts;
|
|
session_activated gts;
|
|
}
|
|
|
|
#event {SESSION CREATED}
|
|
{
|
|
#gts session_activated %0
|
|
}
|
|
|
|
#event {SESSION ACTIVATED}
|
|
{
|
|
#gts session_activated %0
|
|
}
|
|
|
|
#alias {session_activated}
|
|
{
|
|
#line sub esc #var sessions[$active] {<138>\e]68;2;TABS;#$active\a\e[4;24m$active\e[24m};
|
|
#var active {%0};
|
|
#line sub esc #var sessions[%0] {<128>\e]68;2;TABS;#nop\a\e[4;24m%0\e[24m};
|
|
#draw foreground Azure table 1 1 3 -1 {$sessions[%*]}
|
|
}
|
|
|
|
#event {PRESSED SECURE LINK TABS MOUSE BUTTON ONE}
|
|
{
|
|
%4
|
|
}
|
|
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Add basic MXP link and color handling
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#config mouse on
|
|
|
|
#event {IAC DO MXP}
|
|
{
|
|
#send {\xFF\xFB\x5B\}
|
|
}
|
|
|
|
#function {mxp_link}
|
|
{
|
|
#line sub esc #var result {\e]68;1;%1;%2\a\e[4m%3\e[24m}
|
|
}
|
|
|
|
#act {~\e[1z<VERSION>} {#send {\e[4z<VERSION MXP=1.0 CLIENT=TINTIN++ VERSION=2.02.04>}}
|
|
#act {~\e[1z<SUPPORT>} {#send {\e[4z<SUPPORTS +SEND +COLOR>}}
|
|
|
|
#sub {~\e[4z<COLOR #%1>%2\e[4z</COLOR>} {<f%1>%2<900>}
|
|
|
|
#sub {~\e[4z<SEND HREF="%1">%2\e[4z</SEND>} {@mxp_link{MXP;%1;%2}}
|
|
|
|
#event {PRESSED LINK MXP MOUSE BUTTON ONE}
|
|
{
|
|
#send {%4}
|
|
}
|
|
|
|
#sub {~\e[4z{<RExits>|</RExits>|<RDesc>|</RDesc>|<PROMPT>|</PROMPT>|<RName>|</RName>}} {}
|
|
|
|
#sub {~\e[4z<RNum %d />} {}
|
|
|
|
#sub {<} {<}
|
|
#sub {>} {>}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Example script for using #list indexing.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#var players[1] {{name}{bubba}{age}{15}{level}{24}}
|
|
#var players[2] {{name}{pamela}{age}{19}{level}{2}}
|
|
#var players[3] {{name}{ronald}{age}{69}{level}{13}}
|
|
#var players[4] {{name}{bubba}{age}{26}{level}{30}}
|
|
#var players[5] {{name}{ronald}{age}{11}{level}{31}}
|
|
|
|
#alias {display}
|
|
{
|
|
#var out {};
|
|
|
|
#loop 1 &players[] cnt
|
|
{
|
|
#var out[$cnt] {$cnt;$players[+$cnt][name];$players[+$cnt][age];$players[+$cnt][level]};
|
|
};
|
|
#draw scroll grid table 1 1 2+&players[]*2 80 $out[%*]
|
|
}
|
|
|
|
#alias {test1}
|
|
{
|
|
#list players index name;
|
|
#list players order;
|
|
display
|
|
}
|
|
|
|
#alias {test2}
|
|
{
|
|
#list players index name;
|
|
#list players order;
|
|
#list players reverse;
|
|
display;
|
|
}
|
|
|
|
#alias {test3}
|
|
{
|
|
#list players index name;
|
|
#list players order;
|
|
#list players index level;
|
|
#list players order;
|
|
display
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Example script for creating clickable menus in the scrolling region.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#con mouse on
|
|
|
|
#function link {#var result {\e]68;1;%1;%2\a\e[4m%3\e[24m}}
|
|
|
|
#event {PRESSED LINK MENU MOUSE BUTTON ONE}
|
|
{
|
|
#local {link} {%4};
|
|
|
|
#foreach {*link[]} {key}
|
|
{
|
|
#line {substitute} {variables;functions}
|
|
{
|
|
#var link[$key] {@link{MENU_ITEM;$link[$key];<faa>$key}}
|
|
}
|
|
};
|
|
#draw Azure scaled box %0+1 %1 %0+1 %1+9 $link[%*]
|
|
}
|
|
|
|
#event {PRESSED LINK MENU_ITEM MOUSE BUTTON ONE}
|
|
{
|
|
#showme {<ffa>%4};
|
|
#buffer refresh
|
|
}
|
|
|
|
#showme {Example link: @link{MENU;{{bli}{bla}{blo}{blu}};<128>click me}}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This creates two input lines that can be switched between using the tab
|
|
#nop key.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#line quiet #split
|
|
|
|
#macro {\t} {inputswitch}
|
|
|
|
#var input[width] 1
|
|
|
|
#alias {inputswitch}
|
|
{
|
|
#cursor get {input[current]};
|
|
#cursor clear;
|
|
#cursor set {$input[buffer2]};
|
|
#cursor end;
|
|
#var input[buffer2] {$input[current]};
|
|
#draw Ebony tile {-1-$input[width]} 1 -2 -1 {$input[buffer2]}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This allows for split screen scroll back, just use the mouse wheel in
|
|
#nop the upper half of the screen.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {PROGRAM START}
|
|
{
|
|
#config mouse on;
|
|
#var SCROLL[MODE] 0;
|
|
#split 0 1;
|
|
#screen raise SCREEN RESIZE;
|
|
}
|
|
|
|
#event {SCREEN RESIZE}
|
|
{
|
|
#var ROWS %0;
|
|
#var COLS %1;
|
|
#screen get SCROLL_TOP_ROW SCROLL[TOP_ROW];
|
|
#screen get SCROLL_TOP_COL SCROLL[TOP_COL];
|
|
#screen get SCROLL_BOT_ROW SCROLL[BOT_ROW];
|
|
#screen get SCROLL_BOT_COL SCROLL[BOT_COL];
|
|
}
|
|
|
|
#EVENT {SCROLLED MOUSE WHEEL UP}
|
|
{
|
|
#if {$SCROLL[MODE] == 0}
|
|
{
|
|
#if {%0 < $ROWS / 2}
|
|
{
|
|
#var SCROLL[MODE] 1;
|
|
#var SCROLL[OLD_ROW] $SCROLL[BOT_ROW];
|
|
#math SCROLL[BOT_ROW] $SCROLL[OLD_ROW] / 2;
|
|
#var BUFFER {};
|
|
#screen scroll $SCROLL[TOP_ROW] $SCROLL[TOP_COL] $SCROLL[BOT_ROW] $SCROLL[BOT_COL];
|
|
|
|
#draw red teed line $SCROLL[BOT_ROW]+1 $SCROLL[TOP_COL] $SCROLL[BOT_ROW]+1 $SCROLL[BOT_COL];
|
|
|
|
#nop #screen clear square $SCROLL[BOT_ROW]+2 $SCROLL[TOP_COL] $SCROLL[OLD_ROW] $SCROLL[BOT_COL];
|
|
};
|
|
};
|
|
#if {$SCROLL[MODE] == 1}
|
|
{
|
|
#buffer up 1
|
|
}
|
|
}
|
|
|
|
#EVENT {SCROLLED MOUSE WHEEL DOWN}
|
|
{
|
|
#if {$SCROLL[MODE] == 1}
|
|
{
|
|
#if {%0 < $ROWS / 2}
|
|
{
|
|
#buffer down 1;
|
|
|
|
#buffer info save SCROLL[INFO];
|
|
|
|
#if {$SCROLL[INFO][LINE] == -1}
|
|
{
|
|
#var SCROLL[MODE] 0;
|
|
#var SCROLL[BOT_ROW] $SCROLL[OLD_ROW];
|
|
|
|
#split 0 1;
|
|
#buffer end;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#event {RECEIVED LINE}
|
|
{
|
|
#if {$SCROLL[MODE] == 1}
|
|
{
|
|
#if {&BUFFER[] > $ROWS}
|
|
{
|
|
#list BUFFER del 1
|
|
};
|
|
#list BUFFER add {%0};
|
|
|
|
#draw tile $SCROLL[BOT_ROW]+2 $SCROLL[TOP_COL] $SCROLL[OLD_ROW] $SCROLL[BOT_COL] $BUFFER[%*];
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This is a script to connect to Gemstone 4.
|
|
#nop Visit play.net/gs4, login, and hit the 'GO PLAY' button.
|
|
#nop Select the Storm Front radio button and hit the 'GO PLAY' button.
|
|
#nop Save the .sal file to your script directory and name it gemstone.sal.
|
|
#nop Use the 'gemstone' alias to connect.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {gemstone}
|
|
{
|
|
#var gemstone {};
|
|
|
|
#line oneshot #action {^GAMEHOST=%*} {#var gemstone[host] %%1};
|
|
#line oneshot #action {^GAMEPORT=%*} {#var gemstone[port] %%1};
|
|
#line oneshot #action {^KEY=%*} {#var gemstone[key] %%1};
|
|
|
|
#scan txt gemstone.sal;
|
|
|
|
#if {&gemstone[] != 3}
|
|
{
|
|
#showme Failed to load gemstone.sal file.;
|
|
#return
|
|
};
|
|
#ses gemstone $gemstone[host] $gemstone[port];
|
|
#send {$gemstone[key]};
|
|
#send {>/FE:JAVA}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Start a dated log file in the logs directory when a session connects. See
|
|
#nop #help time for the available date options for #format %t.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {SESSION CONNECTED}
|
|
{
|
|
#format date %t %Y-%m-%d-%H-%M;
|
|
|
|
#log append logs/%0_$date.log
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Sometimes an error doesn't give enough information and it's useful to
|
|
#nop see the calling script.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {RECEIVED ERROR}
|
|
{
|
|
#echo <118>%h { TOKENIZER };
|
|
#info tokenizer -1;
|
|
#echo <118>%h
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop It can be annoying to have short commands clog up the command history.
|
|
#nop This script will remove commands shorter than 3 letters.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#event {HISTORY UPDATE}
|
|
{
|
|
#if {{%0} != {%+3*%*}}
|
|
{
|
|
#history delete
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Run to a room when you click it on the vtmap.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#config mouse on
|
|
|
|
#event {MAP ROOM SHORT-CLICKED MOUSE BUTTON ONE}
|
|
{
|
|
#map run {%4} 0.25
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop zMUD has the feature where your last command is highlighted and any input
|
|
#nop other than enter will clear it. This scripts reproduces this behavior.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#CONFIG REPEAT_ENTER ON
|
|
|
|
#event {HISTORY UPDATE}
|
|
{
|
|
#delay 0 #line ignore #showme {<aaf><FFF><788>%0<088>} {-1};
|
|
#var last_input {%0}
|
|
}
|
|
|
|
#event {PROCESSED KEYPRESS}
|
|
{
|
|
#if {{%1} != {10} && {$last_input} !== {}}
|
|
{
|
|
#var last_input {};
|
|
#line ignore #showme {} {-1};
|
|
#cursor end;
|
|
#history insert {}
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Digitalize a spoken number, example: wton one hundred and thirty-six
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {wton}
|
|
{
|
|
#var wton {%0};
|
|
#replace wton {-} {};
|
|
#replace wton { and } {};
|
|
|
|
#replace wton {ninety} {+90};
|
|
#replace wton {eighty} {+80};
|
|
#replace wton {seventy} {+70};
|
|
#replace wton {sixty} {+60};
|
|
#replace wton {fifty} {+50};
|
|
#replace wton {forty} {+40};
|
|
#replace wton {thirty} {+30};
|
|
#replace wton {twenty} {+20};
|
|
#replace wton {twelve} {+12};
|
|
#replace wton {eleven} {+11};
|
|
#replace wton {teen} {+10};
|
|
#replace wton {ten} {+10};
|
|
#replace wton {nine} {+9};
|
|
#replace wton {eight} {+8};
|
|
#replace wton {eigh} {+8};
|
|
#replace wton {seven} {+7};
|
|
#replace wton {six} {+6};
|
|
#replace wton {five} {+5};
|
|
#replace wton {fif} {+5};
|
|
#replace wton {four} {+4};
|
|
#replace wton {three} {+3};
|
|
#replace wton {thir} {+3};
|
|
#replace wton {two} {+2};
|
|
#replace wton {one} {+1};
|
|
|
|
#replace wton {%S billion} {+ (&1) * 1000000000};
|
|
#replace wton {%S million} {+ (&1) * 1000000};
|
|
#replace wton {%S thousand} {+ (&1) * 1000};
|
|
#replace wton {%S hundred} {+ (&1) * 100};
|
|
|
|
#math wton $wton;
|
|
|
|
#line ignore #showme <118>wton %0 = $wton
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Utility aliases to save variables as json, and load json as variables.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias {json_save}
|
|
{
|
|
#if {"%1" == "" || "%2" == ""}
|
|
{
|
|
#showme Syntax: json_save <variable> <filename>;
|
|
#return
|
|
};
|
|
|
|
#line quiet #log remove %2;
|
|
#line json {%1} {#line log {%2} {&0}}
|
|
}
|
|
|
|
#alias {json_load}
|
|
{
|
|
#if {"%1" == "" || "%2" == ""}
|
|
{
|
|
#showme Syntax: json_load <variable> <filename>;
|
|
#return
|
|
};
|
|
#line quiet #unvar {%2};
|
|
#scan json {%2} {%1}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Example of switching to an editing window, with mouse support. Use #edit
|
|
#nop create to start editing. After editing is finished you can use #edit save
|
|
#nop to store the data to a variable.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#config mouse on
|
|
|
|
#event {PROGRAM START}
|
|
{
|
|
#screen raise {SCREEN RESIZE}
|
|
}
|
|
|
|
#event {SCREEN RESIZE}
|
|
{
|
|
#screen clear all;
|
|
|
|
#screen scroll 2 2 -10 -2;
|
|
#screen input -7 2 -2 -2;
|
|
|
|
#draw azure rounded left right bot top side 1 1 -9 -1;
|
|
#draw azure rounded left right bot top side -8 1 -1 -1
|
|
}
|
|
|
|
#event {PRESSED INPUT MOUSE BUTTON ONE}
|
|
{
|
|
#cursor position %0 %1
|
|
}
|
|
|
|
#event {EDIT STARTED}
|
|
{
|
|
#screen inputregion 2 2 -10 -2;
|
|
#screen scrollregion -7 2 -2 -2
|
|
}
|
|
|
|
#event {CATCH EDIT FINISHED}
|
|
{
|
|
#screen input -7 2 -2 -2;
|
|
#screen scroll 2 2 -10 -2;
|
|
#showme <138>EDIT FINISHED %0. LINES: %1 SIZE: %2
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Example script for drawing health bars
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#split 26 0
|
|
#screen clear top
|
|
|
|
#alias {draw_bar}
|
|
{
|
|
#math value 0;
|
|
#loop 1 26 cnt
|
|
{
|
|
#draw ralign tile $cnt 1 $cnt 8 <178>$value/100;
|
|
#draw horizontal bar $cnt 10 $cnt 20 {$value;100;%0};
|
|
#math value $value + 4
|
|
}
|
|
}
|
|
|
|
draw_bar <faa><afa>
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop This script uses the '#snoop <session> scroll` option to display output
|
|
#nop to another session. Split is used to reserve the top 6 rows, and the
|
|
#nop scroll region of the snooped session is set to the top 5 rows.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#line background #port init comm 0
|
|
|
|
#ACTION {~%1 tells you %2}
|
|
{
|
|
#comm #showme {%1 tells you %2\}
|
|
}
|
|
|
|
#ACTION {~%1 chats %2}
|
|
{
|
|
#comm #showme {%1 chats %2\}
|
|
}
|
|
|
|
#ALIAS {test}
|
|
{
|
|
#split 6 1;
|
|
#screen clear top;
|
|
#draw green horizontal line 6 1 6 -1;
|
|
|
|
#comm #screen scrollregion 1 1 5 -1;
|
|
#snoop comm scroll;
|
|
|
|
#showme <138>Bubba tells you 'hello';
|
|
#showme <158>Pamela chats 'bye';
|
|
#showme <168>Bobby tells you 'bli bla blo';
|
|
#showme <158>Dobby chats 'blu'
|
|
}
|
|
|
|
#CONFIG MOUSE ON
|
|
|
|
#BUTTON {1;1;5;-1;SCROLLED MOUSE WHEEL UP} {#comm #buffer up 1}
|
|
#BUTTON {1;1;5;-1;SCROLLED MOUSE WHEEL DOWN} {#comm #buffer down 1}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop Enable the kitty terminal input extensions as specified at:
|
|
#nop https://sw.kovidgoyal.net/kitty/keyboard-protocol/
|
|
#nop This allows the numpad keys to be bound properly. Tested with Kitty and
|
|
#nop Ghostty terminals.
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#alias kitty_keypad
|
|
{
|
|
#if {"%1" == "on"}
|
|
{
|
|
#showme {>>> enabling kitty input\e[>1u};
|
|
#nop Set up the numpad keys;
|
|
#macro {\e[57423u} {nw};
|
|
#macro {\e[57419u} {n};
|
|
#macro {\e[57421u} {ne};
|
|
#macro {\e[57417u} {w};
|
|
#macro {\e[57427u} {!};
|
|
#macro {\e[57418u} {e};
|
|
#macro {\e[57424u} {sw};
|
|
#macro {\e[57420u} {s};
|
|
#macro {\e[57422u} {se};
|
|
#nop Set up the line editor keys;
|
|
#macro {\e[97;5u} {#cursor HOME};
|
|
#macro {\e[98;5u} {#cursor BACKWARD};
|
|
#macro {\e[100;5u} {#cursor CTRL_DELETE};
|
|
#macro {\e[101;5u} {#cursor END};
|
|
#macro {\e[102;5u} {#cursor FORWARD};
|
|
#macro {\e[104;5u} {#cursor BACKSPACE};
|
|
#macro {\e[107;5u} {#cursor CLEAR_RIGHT};
|
|
#macro {\e[110;5u} {#cursor HISTORY_NEXT};
|
|
#macro {\e[112;5u} {#cursor HISTORY_PREV};
|
|
#macro {\e[114;5u} {#cursor HISTORY_SEARCH};
|
|
#macro {\e[117;5u} {#cursor CLEAR_LEFT};
|
|
#macro {\e[118;5u} {#cursor CONVERT_META};
|
|
#macro {\e[119;5u} {#cursor DELETE_WORD_LEFT};
|
|
#macro {\e[121;5u} {#cursor PASTE_BUFFER};
|
|
#macro {\e[122;5u} {#cursor SUSPEND};
|
|
#nop Reset the terminal state at exit;
|
|
#gts #event {PROGRAM TERMINATION} {#line verbose #showme >>> disabling kitty input\e[<1u}
|
|
};
|
|
#if {"%1" == "off"}
|
|
{
|
|
#showme {>>> disabling kitty input\e[<1u};
|
|
}
|
|
}
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop
|
|
#nop -------------------------------------------------------------------------
|
|
|
|
#nop -------------------------------------------------------------------------
|
|
#nop
|
|
#nop -------------------------------------------------------------------------
|