tintin/SCRIPTS
2026-01-27 07:21:18 +01:00

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 {&lt;} {<}
#sub {&gt;} {>}
#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 -------------------------------------------------------------------------