TinTin++ Help
╭──────────────────────────────────────────────────────────────────────╮ │ Home │ ╰──────────────────────────────────────────────────────────────────────╯
ACTION EDITING LOG SCREEN ALIAS ELSE LOOP SCREEN READER ALL ELSEIF MACRO SCRIPT BELL END MAP SEND BREAK ESCAPE CODES MAPPING SESSION BUFFER EVENT MATH SESSIONNAME BUTTON FOREACH MATHEMATICS SHOWME CASE FORMAT MESSAGE SNOOP CAT FUNCTION METRIC SYSTEM SPEEDWALK CHARACTERS GAG MOUSE SPLIT CHAT GREETING MSDP SSL CLASS GREP MSLP STATEMENTS COLORS HELP NOP SUBSTITUTE COMMANDS HIGHLIGHT PARSE SUBSTITUTIONS CONFIG HISTORY PATH SUSPEND CONTINUE IF PATHDIR SWITCH COORDINATES IGNORE PCRE SYSTEM CR INDEX PORT TAB CURSOR INFO PROMPT TEXTIN DAEMON INTRODUCTION READ TICKER DEBUG KEYPAD REGEXP TIME DEFAULT KILL REPEAT TRIGGERS DELAY LINE REPLACE VARIABLE DRAW LIST RETURN WHILE ECHO LISTS RUN WRITE EDIT LOCAL SCAN ZAP
ACTION
If the message starts with a ~ color codes must be matched. You can enable #config {convert meta} on to display meta characters.
For more information on pattern matching see the section on PCRE.
Example: #action {%1 tells you ‘%2’} {tell %1 I’m afk.}Actions can be triggered by the #show command. If you don’t want a #show to get triggered use: #line ignore #show {text}
Actions are ordered alphabetically and only one action can trigger at a time. To change the order you can assign a priority, which defaults to 5, with a lower number indicating a higher priority. The priority can be a floating point number and should be between 1 and 9.
To remove an action with %* as the message, use #unaction {%%} or #unaction {\%}. Alternatively you could wrap the action inside a class, and kill that class when you no longer need the action.
Comment: You can remove an action with the #unaction command. Related: pcre, gag, highlight, prompt and substitute.Typing ‘k orc’ would result in attacking the orc followed by a kick.
You can create multi-word aliases by using variables in the name section.
Example: #alias {k %1 with %2} {draw %2;attack %1;slash %1 with %2; kick at %2;strike %1 with %2}Using the above alias you could type k blue smurf with battle axe
To have an alias that matches all user input, use %* as the name.
Example: #alias {%*} {#show You wrote: %0}Aliases are ordered alphabetically and only one alias can trigger at a time. To change the order you can assign a priority, which defaults to 5, with a lower number indicating a higher priority. The priority can be a floating point number.
To remove an alias with %* as the name, use #unalias {%%} or #unalias {\%}. Alternatively you can wrap the alias inside a class, and kill that class when you no longer need the alias.
For more information on pattern matching see the section on PCRE.
Comment: You can remove an alias with the #unalias command. Related: cursor, history, keypad, macro, speedwalk and tab.If you aren’t watching the screen this could be useful if you don’t want to miss out on a conversation with Bubba. Alternatively you can use #system to play a sound file.
Some terminals will allow you to use VT100 Operating System Commands to change the terminal’s bell behavior which can be used to flash the taskbar icon and or focus the window on receival of a bell.
Example: #action {Bubba tells you} {#screen save title;#screen set title Tell!; #bell ring;#delay 10 #screen load title}The above example will save your window title, change the title to ‘Tell!’, ring the bell, next reset the window title after 10 seconds.
It’s possible to set the terminal to pop to the foreground upon ringing of the alarm bell.
Example: #bell focus on;#bell ring;#bell focus offIt’s possible to adjust the alarm bell volume on some terminals.
Example: #loop {1} {8} {cnt} {#line substitute variables #delay {$cnt} {#show Volume $cnt: #bell volume $cnt;#bell} Related: screenThe break command can be used inside the #else, #elseif, #if, #foreach, #loop, #parse, #switch, and #while statements. When #break is found, tintin will stop executing the statement it is currently in and move on to the next.
Example: #while {1} {#math cnt $cnt + 1;#if {$cnt == 20} {#break}} Related: statementsThe size of the scrollback buffer can be configured using #config buffer_size &;size&;. The size must be either 100, 1000, 10000, 100000 or 1000000 lines.
While scrolling through the scrollback buffer incoming text is not displayed, this can be disabled using #config scroll_lock off. The scroll lock is automatically disabled when manual input is received, subsequently #buffer up and down only work properly when used in a macro or mouse event.
#buffer {clear} {[lower bound]} {[upper bound]} Without an argument this will clear the entire scrollback buffer. Otherwise it will clear the given range.Positive numbers are measured from the start of the scrollback buffer, negative numbers from the end.
#buffer {down} [lines] Moves your scrollback buffer down one page and displays the page. If a line number is provided it will scroll down the given number of lines. #buffer {end} Moves you to the end of your scrollback buffer and displays the page. Disables scroll lock mode. Most useful when used in a #macro. #buffer {find} {[number]} {&;string&;} {[variable]} Moves the buffer to the given string which can contain a regular expression. Optionally you can provide the number of matches to skip, allowing you to jump further back in the buffer.A positive number searches from the start of the buffer, a negative number from the end. If you provide a variable the location will be stored and no jump takes place.
#buffer {get} {&;variable&;} {&;lower bound&;} {[upper bound]} Allows you to store one or several lines from your scrollback buffer (including color codes) into a variable. The lower and upper bound must be between 1 and the size of the buffer. If the upper bound is omitted the given line is stored as a standard variable. If an upper bound is given the lines between the two bounds are stored as a list.Positive numbers are measured from the start of the scrollback buffer, negative numbers from the end.
#buffer {home} Moves you to the top of your scrollback buffer and displays the page. Enables scroll lock mode. Most useful when used in a #macro. #buffer {info} {[save]} {[variable]} Display buffer info, optionally save the data to a variable. #buffer {jump} {&;location&;} Moves the buffer to the given location. A positive number jumps from the start of the buffer, a negative number from the end. #buffer {lock} {on|off} Toggles the lock on the scrollback buffer. When locked, newly incoming text won’t be displayed, any command will disable the lock, though several buffer commands will re-enable the lock. When unlocking it’ll move you to the end of your scrollback buffer and display the page. #buffer {refresh} Marks the buffer as needing to be refreshed, only useful while in vertical split mode. #buffer {up} [lines] Moves your scrollback buffer up one page and displays the page. Enables scroll lock mode. Most useful when used in a #macro. You can use #buffer {up} {1} to move the scrollback buffer up 1 line. #buffer {write} {&;filename&;} Writes the scrollback buffer to the given file. Example: #macro {\e[F} {#buffer end} Related: echo, grep, macro, showme and screen.The square part should exists of two coordinates defining the upper left and bottom right corner using row, col, row, col syntax. The square arguments should be separated by spaces, semi-colons or braces.
By default the button is set to respond to a mouse button press, to respond to other button presses you must add a 5th argument to the square that defines the button press type. You can enable #info button on to see button events and their type as they happen.
The priority part is optional and determines the priority of the button, it defaults to 5.
You must enable #config {mouse tracking} on for buttons to work.
This command draws no visible button, you’ll have to do so separately if needed.
Example: #button {1;1;2;2} {#show You clicked the upper left corner.}Buttons are ordered alphabetically and only one button can trigger at a time. To change the order you can assign a priority, which defaults to 5, with a lower number indicating a higher priority. The priority can be a floating point number.
Comment: To see button clicks trigger use #info button on. Comment: You can remove a button with the #unbutton command. Related: delay, event and ticker.When comparing strings both the switch and case arguments must be surrounded in quotes.
Example:#function {reverse_direction} { #switch {&;%1&;} { #case {&;north&;} {#return south}; #case {&;east&;} {#return west}; #case {&;south&;} {#return north}; #case {&;west&;} {#return east}; #case {&;up&;} {#return down}; #case {&;down&;} {#return up} } }
This function returns the reverse direction. @reverse_direction{north} would return south.
Related: default, statements and switch.Related
: portKeep in mind that you need to use #class save before using #class clear and #class load
Example: #class rich kill;#class rich read poor.tin Deletes all triggers of ‘rich’ class if any. Read ‘poor.tin’ file, all triggers loaded will be assigned to the ‘rich’ class. Related: config, debug, ignore, info, kill, line and message.Parameter ‘x’: VT100 code
0 - Reset all colors and codes to default 1 - Bold 2 - Dim 3 - Italic 4 - Underscore 5 - Blink 7 - Reverse 8 - Skip (use previous code)
Parameter ‘y’: Foreground color Parameter ‘z’: Background color
0 - Black 5 - Magenta 1 - Red 6 - Cyan 2 - Green 7 - White 3 - Yellow 8 - Skip 4 - Blue 9 - Default
Example: #show &;125&;Bold green on a magenta background.For xterm 256 colors support use &;aaa&; to &;fff&; for RGB foreground colors and &;AAA&; to &;FFF&; for RGB background colors. For the grayscale foreground colors use &;g00&; to &;g23&;, for grayscale background colors use &;G00&; to &;G23&;.
The tertiary colors are as follows:
&;acf&; - Azure &;afc&; - Jade &;caf&; - Violet &;cfa&; - Lime &;fac&; - Pink &;fca&; - Orange
Example: #show &;acf&;Azure &;afc&;Jade &;caf&;Violet Example: #show &;cfa&;Lime &;fac&;Pink &;fca&;OrangeFor 12 bit truecolor use &;F000&; to &;FFFF&; for foreground colors and &;B000&; to &;BFFF&; for background colors.
For 24 bit truecolor use &;F000000&; to &;FFFFFFF&; for foreground colors and &;B000000&; to &;BFFFFFF&; for background colors.
If the color code exceeds your configured color mode it will be downgraded to the closest match.
Related: characters, coordinates, escape_codes, mathematics and pcre.If you configure the global session (the one you see as you start up tintin) all sessions started will inherite these settings.
It’s advised to make a configuration file to read on startup if you do not like the default settings.
Use #config without an argument to see your current configuration as well as a brief explanation of each config option.
The following config options are not listed by default:
#CONFIG {AUTO TAB} {NUMBER} Buffer lines used for tab completion #CONFIG {CHILD LOCK} {ON|OFF} Enable or disable command input. #CONFIG {CONNECT RETRY} {NUMBER} Seconds to try to connect on failure. #CONFIG {CONVERT META} {ON|OFF} Shows color codes and key bindings. #CONFIG {DEBUG TELNET} {ON|OFF} Shows telnet negotiations y/n. #CONFIG {HIBERNATE} {ON|OFF} Enable or disable low CPU usage mode. #CONFIG {LOG LEVEL} {LOW|HIGH} LOW logs server output before triggers. #CONFIG {INHERITANCE} {ON|OFF} Session trigger inheritance y/n. #CONFIG {MCCP} {ON|OFF} Enable or disable MCCP support. #CONFIG {RANDOM SEED} {NUMBER} Seed value used for random numbers. #CONFIG {TAB WIDTH} {NUMBER} Number of spaces used for a tab #CONFIG {TINTIN CHAR} {SYMBOL} Character used for TinTin++ commands.
Related: class and line.The continue command can be used inside the #FOREACH, #LOOP, #PARSE, #WHILE and #SWITCH commands. When #CONTINUE is found, tintin will go to the end of the command and proceed as normal, which may be to reiterate the command.
Example: #loop 1 10 cnt {#if {$cnt % 2 == 0} {#continue} {say $cnt}} Related: break, foreach, list, loop, parse, repeat, return and while.When the 0,0 coordinate is in the bottom left corner tintin uses a standard x,y notation. This type of argument is used by the #map jump command.
The vast majority of tintin commands use y,x / row,col notation, primarily because that is the notation used by the VT100 standard used for terminal emulation.
Squares A square argument takes 2 coordinates. The first coordinate defines the upper left corner, the last coordinate defines the bottom right corner. The upper left corner of the terminal is defined as 1,1 and the bottom right corner as -1,-1. This type of argument is used by #draw, #button and #map offset. Panes A pane argument takes 4 size values, which are: top pane, bottom pane, left pane, right pane. When a negative value is provided the size is the maximum size, minus the value. This type of argument is used by the #split command. Ranges A range argument takes 2 values known as the upper bound and lower bound. The upper bound (first value) defines the start of the range, the lower bound (second value) the end. The first index of a range is defined as 1. When a negative value is provides the last index is defined as -1. This type of argument is used by #buffer and #variable. Related: characters, colors, escape_codes, mathematics and pcre.Sends a carriage return to the session. Useful for aliases that need extra carriage returns.
This command is obsolete as you can accomplish the same using #send without an argument or #send {}.
Related: forallThe cursor command’s primarly goal is adding customizable input editing with macros. Subsequently many cursor commands only work properly when used within a macro or event.
#cursor flag EOL end of line character(s) ECHO local echo OVERTYPE overtype mode #cursor macro PRESERVE do not erase the macro from the macro input buffer RESET erase the macro input buffer #cursor tab CASELESS makes tab completion caseless COMPLETE makes tab completion work while editingDICTIONARY performs tab completion on the dictionary INPUT performs tab completion on the input history LIST performs tab completion on the tab completion list SCROLLBACK performs tab completion on the scrollback buffer
BACKWARD specifies tab completion to go backward FORWARD specifies tab completion to go forward
Multiple options can/must be specified at once.
Related: alias, history, keypad, macro, speedwalk and tab.You can launch tintin and attach the first daemonized instance using tt++ -R. To attach a named instance use tt++ -R&;name&;.
Related: script, system and run.If you for example set ACTIONS to ON you will get debug information whenever an action is triggered.
#debug {listname} {log} will silently write debugging information to the log file, you must be logging in order for this to work.
Not every list has debug support yet.
Related: class, ignore, info, kill and message.Nanosecond floating point precision is allowed. Delays will fire in 0.01 second intervals.
Named delays are treated as one-shot tickers, see #help tick.
Example: #delay {1} {#show last};#show first This will print ‘first’, and ‘last’ around one second later. Comment: If you want to remove a delay with the #undelay command you can add a name as the first argument, be aware this changes the syntax. If the name is a number keep in mind that delays with the same numeric name will not be overwritten Related: event and ticker.The &;square&; arguments should exists of two coordinates defining the upper left and bottom right corner using row, col, row, col syntax.
The square arguments can be negative, in which case the coordinates are calculated from the opposite side of the screen. In the case the screen is 80 columns wide using #draw box 1 60 10 70 will be the equivalent of #draw box 1 -21 10 -11, but with different screen widths the boxes would be drawn in different places.
You can prefix the option with a color code or color name to color the lines and shapes.
You can further prefix the option as following:
ASCII draw in ASCII mode. BALIGN bottom align text. BLANKED blank the lines and corners. BOTTOM draw on the bottom side if possible. BOXED draw a box along the square. BUMPED precede the draw with an enter. CALIGN both LALIGN and RALIGN to center text. CIRCLED circle the corners. CONVERT draw text with meta conversion. CROSSED cross the corners. CURSIVE draw text with cursive letters. FAT draw text with fat letters. FILLED fill circles and jewels. FOREGROUND draw even if session is not active. GRID draw TABLE as a grid. HORIZONTAL draw horizontal if possible. HUGE draw text in huge letters. JEWELED diamond the corners. JOINTED draw corners. LALIGN left align text. LEFT draw on the left side if possible. NUMBERED draw numbers instead of lines. PRUNED prune the corners. RALIGN right align text. RIGHT draw on the right side if possible. ROUNDED round the corners. SANSSERIF draw text with sansserif letters. SCALED fit the square to the text size. SCROLL draw in the scrolling region. SHADOWED shadow HUGE text. TALIGN top align text too large to fit. TEED tee the corners. TOP draw on the top side if possible. TRACED trace HUGE text. TUBED draw tubes instead of lines. UALIGN unwrap and rewrap text. UNICODE draw in unicode mode. VERTICAL draw vertical if possible.
The following types are available.
[HORIZONTAL]
BAR {&;MIN&;;&;MAX&;;[COLOR]} will draw a bar, use two 256 color codes for a color gradient. [ASCII|UNICODE|HUGE] BOX {[TEXT1]} {[TEXT2]} will draw a box. [BOXED|FOREGROUND] BUFFER will draw the scrollback buffer. [BLANKED|CIRCLED|CROSSED|JEWELED|ROUNDED|TEED|PRUNED] CORNER will draw a corner. [BLANKED|HORIZONTAL|NUMBERED|TUBED|VERTICAL] LINE {[TEXT]} will draw a line. [BOXED] MAP will draw the map RAIN {&;VARIABLE&;} {[SPAWN]} {[FADE]} {[LEGEND]} will draw digital rain SPAWN (0.01-100) FADE (1-100). [JOINTED|TOP|LEFT|BOTTOM|RIGHT] SIDE will draw one or more sides of a box. [GRID] TABLE {[LIST1]} {[LIST2]} will draw a table. [CURSIVE|FAT|HUGE|SANSSERIF] TILE {[TEXT1]} {[TEXT2]} will draw a tileAll draw types take an optional text argument as long as a valid square with enough space has been defined. Text is automatically word wrapped and text formatting can be customized with the BALIGN, TALIGN, LALIGN, RALIGN, and UALIGN options.
Example: #draw Blue box 1 1 3 20 {Hello world!} Related: buffer, echo, grep and showme.The echo command does not trigger actions.
As with the #show command you can split the {format} argument up into two braced arguments, in which case the 2nd argument is the row number.
Example: #echo {The current date is %t.} {%Y-%m-%d %H:%M:%S} #echo {[%38s][%-38s]} {Hello World} {Hello World} #echo {{this is %s on the top row} {1}} {printed} Related: buffer, format, grep and showme.Terminates tintin and return to unix. On most systems, ctrl-c has the same result.
The message is optional and is printed before tintin exits. When using #end {\} tintin will terminate silently.
Related: zap\a beep the terminal. \c send a control character, \ca for ctrl-a. \e start an escape sequence. \f send a form feed. \n send a line feed. \r send a carriage return. \t send a horizontal tab. \x print an 8 bit character using hexadecimal, \xFF for example. \x7B send the ‘{’ character. \x7D send the ‘}’ character. \u print a 16 bit unicode character, \uFFFD for example. \u{} print a 8-21 bit unicode character, \u{2AF21} for example. \U print a 21 bit unicode character, \U02AF21 for example. \v send a vertical tab
Ending a line with \ will stop tintin from appending a line feed. To escape arguments in an alias or action use %%0 %%1 %%2 etc.
Related: characters, colors, coordinates, mathematics and pcre.Use #event without an argument to see a list of possible events with a brief description. Use #event %* to see the current list of defined events. Use #info {events} {on} to see events get thrown.
Events, like triggers in general, are case sensitive and event names must be defined using all upper case letters. Only one event can be defined for each event type.
To enable mouse events use #config mouse_tracking on, to see mouse events use #config mouse_tracking info.
CATCH EVENTS CATCH &;EVENT&; Some events can be prefixed with CATCH to interrupt default behavior. CLASS EVENTS CLASS ACTIVATED [CLASS], CLASS_CLEAR [CLASS], CLASS CREATED [CLASS], CLASS DEACTIVATED [CLASS], CLASS DESTROYED [CLASS], CLASS_LOAD [CLASS] %0 class name FORMAT EVENTS REFORMAT &;MESSAGE&; Use #return to change MESSAGE GAG EVENTS GAG &;EVENT&; Some events can be prefixed with GAG to gag default system messages. INPUT EVENTS EDIT STARTED, EDIT FINISHED %0 name %1 lines %2 size %3 data EDIT RESUMED, EDIT SUSPENDED %0 name HISTORY UPDATE %0 command RECEIVED KEYPRESS, PROCESSED KEYPRESS %0 character %1 unicode index %2 edit row %3 edit column RECEIVED INPUT [NAME] %0 raw text RECEIVED INPUT CHARACTER %0 character %1 unicode index %2 size %3 width NO SESSION ACTIVE %0 raw text %1 size SEND OUTPUT %0 raw text %1 size SENT OUTPUT %0 raw text %1 size MAP EVENTS END OF PATH, END OF RUN, MAP UPDATED VTMAP These events have no additional arguments. MAP CREATE EXIT, MAP DELETE EXIT %0 vnum %1 exit name %2 exit cmd %3 exit vnum MAP CREATE ROOM, MAP DELETE ROOM %0 vnum %1 name MAP ENTER MAP, MAP EXIT MAP %0 vnum MAP ENTER ROOM [VNUM] %0 new vnum %1 old vnum %2 direction MAP EXIT ROOM [VNUM] %0 old vnum %1 new vnum %2 direction MAP FOLLOW MAP %0 old vnum %1 new vnum %2 exit name MAP REGION &;MOUSE&;, MAP ROOM &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 vnum %5 info MOUSE EVENTS DOUBLE-CLICKED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line LONG-CLICKED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line MOVED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line PRESSED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line SHORT-CLICKED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line RELEASED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line SCROLLED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line TRIPLE-CLICKED &;MOUSE&; %0 row %1 col %2 -row %3 -col %4 word %5 line MAP &;MOUSE EVENT&; Mouse events can be prefixed with MAP to only trigger when the mouse event occurs inside the VT100 map region. SWIPED [DIR] %0 dir %1 button %2 row %3 col %4 -row %5 -col %6 row %7 col %8 -row %9 -col %10 rows %11 cols OUTPUT EVENTS BUFFER UPDATE, DISPLAY UPDATE These events have no additional arguments. PROCESSED LINE %0 raw text %1 plain text %2 prompt (0 or 1) RECEIVED LINE %0 raw text %1 plain text RECEIVED OUTPUT %0 raw text %1 plain text RECEIVED PROMPT %0 raw text %1 plain text PORT EVENTS CHAT MESSAGE %0 raw text %1 plain text CHAT SNOOP REQUEST %0 name %1 ip %2 port PORT CONNECTION %0 name %1 ip %2 port PORT DISCONNECTION %0 name %1 ip %2 port PORT LOG MESSAGE %0 name %1 ip %2 port %3 data %4 plain data PORT MESSAGE %0 raw text %1 plain text PORT RECEIVED MESSAGE %0 name %1 ip %2 port %3 data %4 plain data PORT RECEIVED DATA %0 name %1 ip %2 port %3 data %4 size SCAN EVENTS SCAN CSV HEADER %0 all args %1 arg1 %2 arg2 … %99 arg99 SCAN CSV LINE %0 all args %1 arg1 %2 arg3 … %99 arg99 SCAN TSV HEADER %0 all args %1 arg1 %2 arg3 … %99 arg99 SCAN TSV LINE %0 all args %1 arg1 %2 arg3 … %99 arg99 SCREEN EVENTS SCREEN DIMENSIONS %0 height %1 width SCREEN FOCUS %0 focus (0 or 1) SCREEN LOCATION %0 rows %1 cols %2 height %3 width SCREEN MOUSE LOCATION %0 row %1 col %2 -row %3 -col %4 pix row %5 pix col %6 -pix row %7 -pix col %8 location SCREEN RESIZE %0 rows %1 cols %2 height %3 width SCREEN SIZE %0 rows %1 cols SCREEN SPLIT %0 top row %1 top col %2 bot row %3 bot col SCREEN UNSPLIT %0 top row %1 top col %2 bot row %3 bot col SESSION EVENTS SESSION ACTIVATED %0 name SESSION CONNECTED %0 name %1 host %2 ip %3 port %4 file SESSION CREATED %0 name %1 host %2 ip %3 port %4 file SESSION DEACTIVATED %0 name SESSION DISCONNECTED %0 name %1 host %2 ip %3 port SESSION TIMED OUT %0 name %1 host %2 ip %3 port SYSTEM EVENTS CONFIG %0 name %1 value DAEMON ATTACH TIMEOUT %0 file %1 pid DAEMON ATTACHED %0 file %1 pid DAEMON DETACHED %0 file %1 pid PROGRAM START %0 startup arguments PROGRAM TERMINATION %0 goodbye message READ ERROR %0 filename %1 error message READ FILE %0 filename WRITE ERROR %0 filename %1 error message WRITE FILE %0 filename SYSTEM CRASH %0 message SYSTEM ERROR %0 name %1 system msg %2 error %3 error msg UNKNOWN COMMAND %0 raw text SIGUSR %0 signal TELNET EVENTS IAC &;EVENT&; IAC TELNET events are made visible using #config telnet info. IAC SB GMCP %0 module %1 data %2 plain data IAC SB GMCP &;MODULE&; %1 data %2 plain data IAC SB MSSP %0 variable %1 data IAC SB MSDP %0 variable %1 data %2 plain data IAC SB MSDP [VAR] %0 variable %1 data %2 plain data IAC SB NEW-ENVIRON %0 variable %1 data %2 plain data IAC SB ZMP &;VAR&; %0 variable %1 data IAC SB &;VAR&; %0 variable %1 raw data %2 plain data TIME EVENTS DATE &;MONTH-DAY OF MONTH&; [HOUR:MINUTE], DAY [DAY OF MONTH], HOUR [HOUR], MONTH [DAY OF MONTH], TIME &;HOUR:MINUTE&;[:SECOND], WEEK [DAY OF WEEK], YEAR [YEAR] %0 year %1 month %2 day of week %3 day of month %4 hour %5 minute %6 second VARIABLE EVENTS VARIABLE UPDATE &;VAR&; %0 name %1 new value %2 path VARIABLE UPDATED &;VAR&; %0 name %1 new value %2 path VT100 EVENTS VT100 SCROLL REGION %0 top row %1 bot row %2 rows %3 cols %4 wrapTo see all events trigger use #info event on. Since this can get rather spammy it’s possible to gag event info messages.
Example: #event {SESSION CONNECTED} {#read mychar.tin} Comment: You can remove an event with the #unevent command. Related: button, delay and ticker.If you use #format inside an alias or action you must escape %1s as %+1s or %%1s or %\1s so the %1 isn’t substituted by the trigger.
#format {test} {%+9s} {string} pad string with up to 9 spaces #format {test} {%-9s} {string} post pad string with up to 9 spaces #format {test} {%.8s} {string} copy at most 8 characters #format {test} {%a} {number} print corresponding charset character #format {test} {%c} {string} use a highlight color name #format {test} {%d} {number} print a number with integer formatting #format {test} {%f} {string} perform floating point math #format {test} {%g} {number} perform thousand grouping on {number} #format {test} {%h} {string} turn text into a header line #format {test} {%l} {string} lowercase text #format {test} {%m} {string} perform mathematical calculation #format {test} {%n} {name} capitalize the first letter #format {test} {%p} {string} strip leading and trailing spaces #format {test} {%r} {string} reverse text, hiya = ayih #format {test} {%s} {string} print given string #format {test} {%t} {format} display time with strftime format optional {{format}{time}} syntax #format {test} {%u} {string} uppercase text #format {list} {%w} {string} store word wrapped text in {list} optional {{string}{width}} syntax #format {test} {%x} {hex} print corresponding charset character #format {test} {%A} {char} store corresponding character value #format {test} {%D} {hex} convert hex to decimal in {test} #format {hash} {%H} {string} store a 64 bit string hash in {hash} #format {test} {%L} {string} store the string length in {test} #format {test} {%M} {number} convert number to metric in {test} #format {test} {%S} {string} store the number of spelling errors #format {time} {%T} {} store the epoch time in {time} #format {time} {%U} {} store the micro epoch time in {time} #format {test} {%X} {dec} convert dec to hexadecimal in {test}
#format {test} {%%} a literal % character
Comment: See #help TIME for help on the %t argument. Related: cat, echo, function, local, math, replace, script, time and variable.Be aware that each function should use the #return command at the end of the function with the result, or set the {result} variable.
To use a function use the @ character before the function name. The function arguments should be placed between braces behind the function name with argument separated by semicolons.
Functions can be escaped by adding additional @ signs.
Example: #function test #return 42;#showme @@test{}The function itself can use the provided arguments which are stored in %1 to %99, with %0 holding all arguments.
Example: #function {rnd} {#math {result} {1 d (%2 - %1 + 1) + %1 - 1}} #show A random number between 100 and 200: @rnd{100;200} Example: #function gettime {#format result %t %H:%M} #show The current time is @gettime{} Comment: You can remove a function with the #unfunction command. Related: format, local, math, replace, script and variable.There are a system messages that can be gagged using gag events.
Comment: You can remove a gag with the #ungag command. Related: action, highlight, prompt and substitute.By default grep searches from the end of the scrollback buffer to the beginning, this can be reversed by using a negative page number.
Example: #grep Bubba tells you This will show all occasions where bubba tells you something. Related: buffer, echo and showme.Available color options are:
reset - resets the color state to default light - turns the color light. dark - turns the color dark. underscore - underscores the text. blink - makes the text blink. reverse - reverse foreground and background color. b - makes next color the background color.
Available color names are:
&;abd&; - azure &;acf&; - Azure &;aad&; - blue &;aaf&; - Blue &;add&; - cyan &;aff&; - Cyan &;aaa&; - ebony &;bbb&; - Ebony &;ada&; - green &;afa&; - Green &;adb&; - jade &;afc&; - Jade &;bda&; - lime &;cfa&; - Lime &;dad&; - magenta &;faf&; - Magenta &;dba&; - orange &;fca&; - Orange &;dab&; - pink &;fac&; - Pink &;daa&; - red &;faa&; - Red &;ccc&; - silver &;eee&; - Silver &;cba&; - tan &;eda&; - Tan &;bad&; - violet &;caf&; - Violet &;ddd&; - white &;fff&; - White &;dda&; - yellow &;ffa&; - Yellow
Colors can be provided as either a color code or one of the valid color names. If the color name is in all lower case a dark color is printed. If the first letter of the color name is capitalized a light color is printed.
The %1-99 variables can be used as ‘wildcards’ that will match with any text. They are useful for highlighting a complete line. The %0 variable should never be used in highlights.
You may start the string to highlight with a ^ to only highlight text if it begins the line.
Besides color names also &;abc&; color codes can be used.
Example: #high {Valgar} {reverse underscore Jade} Prints every occurrence of ‘Valgar’ in underscored reverse video Jade. Example: #high {^You{|r} %1} {light cyan} Prints every line that starts with ‘You’ in light cyan. Example: #high {Bubba} {red underscore b Green} Highlights the name Bubba as red underscored text on green background. Comment: See ‘#help action’, for more information about triggers. Comment: See ‘#help substitute’, for more advanced color substitution. Comment: This command only works with ANSI/VT100 terminals or emulators. Comment: You can remove a highlight with the #unhighlight command. Related: action, gag, prompt and substitute.Without an argument all available options are shown.
By default all commands are saved to the history list and the history list is saved between sessions in the ~/.tintin/history.txt file.
You can set the character to repeat a command in the history with the #config {REPEAT CHAR} {&;character&;} configuration option, by default this is set to the exclamation mark.
You can use ! by itself to repeat the last command, or !&;text&; to repeat the last command starting with the given text.
You can use #config {REPEAT ENTER} {ON} to repeat the last command when you press enter on an empty line.
You can press ctrl-r to enter an interactive regex enabled history search mode, or by issuing #cursor {history search}.
TinTin++ tries to bind the arrow up and down keys to scroll through the history list by default. You can bind these with a macro yourself using #cursor {history next} and #cursor {history prev}. Many #cursor commands only work properly when bound with a macro.
Related: alias, cursor, keypad, macro, speedwalk and tab.The conditional is evaluated exactly the same as in the #math command, if the conditional evaluates as anything except 0 the commands are executed. See the ‘math’ helpfile for more information.
To handle the case where an if statement is false it can be followed by the #else command. Alternatively, the else can be provided as the third argument.
Example: #action {%0 gives you %1 gold coins.} {#if {%1 &; 5000} {thank %0}} If someone gives you more than 5000 coins, thank them. Example: #alias {k} {#if {&;%0&; == &;&;} {kill $target};#else {kill %0}} Example: #if {&;%0&; == &;{bli|bla}&;} {#showme %0 is either bli or bla.} Related: case, default, else, elseif, math, switch and regexp.If you for example use #IGNORE ACTIONS ON actions will no longer trigger. Not every list can be ignored.
Related: class, debug, info, kill and message.By providing the name of a list and the LIST option it shows all triggers/variables associated with that list. With the SAVE option this data is written to the info variable.
#info arguments will show matched trigger arguments. #info big5toutf will show the big5 to utf8 translation table. #info cpu will show information about tintin’s cpu usage. #info environ will show the environment variables. #info input will show information about the input line. #info matches will show matched command arguments. #info mccp will show information about data compression. #info memory will show information about the memory stack. #info output will show information about the mud output buffers. #info stack will show the low level debugging stack. #info session will show information on the session. #info sessions will show information on all sessions. #info system will show some system information. #info tokenizer will show information about the script stack. #info unicode will show information on the provided character.
Related: class, debug, ignore, kill and message.Read more about the command file in the files section below. Remember one thing though. All actions, aliases, substitutions, etc, defined when starting up TinTin++ are inherited by all sessions.
If you want to exit TinTin++ type ‘#end’ or press ctrl-d on an empty line.
For the WinTin++ users, if you want to paste text use shift-insert, text is automatically copied upon selection. This is typical Linux behavior, but it can take some getting used to.
Basic features I’ll start by explaining some of the very basic and important features:All TinTin++ commands starts with a ‘#’.
Example: #help – #help is a client command, and isn’t sent to the server.All TinTin++ commands can be abbreviated when typed.
#he – Typing #he is the same as typing #help though it’s suggested to use at least 3 letter abbreviations just in case another command is added that starts with ‘he’.
All commands can be separated with a ‘;’.
n;l dragon;s;say Dan Dare is back! – do these 4 commands There are 3 ways ';'s can be overruled.
\say Hello ;) – Lines starting with a ‘\’ aren’t parsed by TinTin++. say Hello \;) – The escape character can escape 1 letter. #config verbatim on – Everything is sent as is except ‘#’ commands.
Connecting to a server Command: #session {session name} {server address} {port}Example
: #session someone tintin.sourceforge.net 4321You can have more than one session, in which case you can switch between sessions typing #&;session name&;.
You can get a list of all sessions by typing: #session. The current active session is marked with (active). Snooped sessions with (snooped). MCCP sessions (compression) with (mccp 2) and (mccp 3).
Split Command: #splitThe split command will create a separated input and output area.
Using the #prompt command you can capture the prompt and place it on the split line. To get rid of the split interface you can use #unsplit which will restore the terminal settings to default.
Alias Command: #alias {name} {commands} The syntax of the #alias command is almost like alias in csh. Use this command to define aliases. The variables %0, %1… %9 contain the arguments to the aliased command as follows: the %0 variable contains all the arguments. the %1 variable contains the 1st argument … the %9 variable contains the 9th argument Example: #alias greet say Greetings, most honorable %1If you want an alias to execute more commands, you must use braces.
Example: #alias ws {wake;stand} To delete an alias use the #unalias command.WARNING! TinTin++ doesn’t baby sit, and hence does not check for recursive aliases! You can avoid recursion by escaping the entire line.
Example: #alias put \put %1 in %2Or by using the send command.
Example: #alias put #send put %1 in %2 Action Command: #action {action-text} {commands} Use this command to define an action to take place when a particular text appears on your screen. There are 99 variables you can use as wildcards in the action-text.These variables are %1, %2, %3 … %9, %10, %11 … %97, %98, %99.
Example: #action {You are hungry} {get bread bag;eat bread}Example
: #action {%1 has arrived.} shake %1 – shake hands with people arriving. Example: #action {%1 tells you ‘%2’} {tell bob %1 told me ‘%2’} – forward tells. Example: #action {tells you} #bell – beep on tell.You can have TinTin++ ignore actions if you type ‘#ignore actions on’.
You can see what commands TinTin++ executes when an action triggers by typing ‘#debug actions on’.
You can remove actions with the #unaction command.
Command files When you order TinTin++ to read a command file, it parses all the text in the file. You can use command files to keep aliases/actions in, login to a server (name, password etc…) and basically all kinds of commands.You can make the command files with either a text editor (suggested), or use the #write command to write out a file.
Commands for files:
#read filename – read and execute the file.
#write filename – write all actions/aliases/substitutes/etc known for the current session to a file.
Example: #session x mymud.com 1234 myname mypassword #split #action {^You are hungry.} {eat bread}If you save the above five lines to a file named ‘mymud.tin’ you can use ‘tt++ mymud.tin’ to start tintin and execute the file, connecting you to your mud, logging in, enabling split mode, and setting an action to eat a bread whenever you go hungry.
Highlight Command: #highlight {text} {color} This command works a bit like #action. The purpose of this command is to substitute text from the server with color you provide. This command is a simplified version of the #substitute command. Example: #high {Snowy} {light yellow}Example
: #high {%Snowy%} {light yellow} Use #unhigh to delete highlights. Speedwalk If you type a command consisting ONLY of letters and numbers n, e, s, w, u, d - then this command can be interpreted as a serie of movement commands. Example: ssw2n – go south, south, west, north, northIf you have problems with typing some commands that actually ONLY consists of these letters, then type them in CAPS. For example when checking the NEWS or when asked to enter NEW as your name.
You must enable speedwalking with: #config speedwalk on.
Ticker Command: #ticker {name} {commands} {seconds} The name can be whatever you want it to be, and is only required for the unticker command. The commands will be executed every x amount of seconds, which is specified in the interval part. Example: #tick {tick} {#delay 50 #show 10 SECONDS TO TICK!;#show TICK!!!} {60} This creates a ticker with the name {tick} which will print TICK!!!, as well as print a warning when the next tick will occure.You can remove tickers with #untick
Repeating Commands You can repeat a command, the syntax is: #number command Example: #5 cackle – if you just killed bob the wizard. Example: #10 {buy bread;put bread bag} – repeat these 2 commands 10 times. Example: #100 ooc w00t w00t!!! – nochannel yourself. History TinTin++ has a limited subset of the csh history features.! – repeat the last command !cast – repeat the last command starting with cast ctrl-r – enter the reverse history search mode.
Map commands TinTin++ has a powerful highly configurable automapper. Whenever you type n/ne/e/se/s/sw/w/nw/n/u/d tt++ tries to keep track of your movement.Commands for map:
#map create – create a map. #map goto 1 – go to the first room in the map, created by default. #map map – display the map. #map undo – undo your last map alteration. #map write &;filename&; – save the map to file. #map read &;filename&; – load a map from file.
There are many other map options and it’s beyond the scope of this help section to explain everything there is to know, but I’ll give a set of commands that will get most people started.
#map create #split 12 1 #map flag unicode on #map flag vt on #map goto 1
These commands will create a 12 row vt100 split section at the top of your screen where a map drawn using unicode characters is displayed.
Example: #action {There is no exit in that direction.} {#map undo} The map will be automatically created as you move around. Help Command: #help {subject} The help command is your friend and contains the same helpfiles inside TinTin++ as are available on the website. If you type #help without an argument you will see the various available help subjects which try to explain the TinTin++ commands and features in greater detail. Entries in cyan describe commands, while entries in white describe various features, often in greater detail. That’s all for the introduction, enjoy Related: characters, colors, coordinates, editing, escape_codes, greeting, keypad, lists, mapping, mathematics, screen_reader, sessionname, speedwalk, statements, suspend and time.Xterm may require disabling Alt/NumLock Modifiers (num-lock) in the ctrl left-click menu. Or edit ~/.Xresources and add XTerm*VT100.numLock:false
Mac OS X Terminal requires enabling ‘strict vt100 keypad behavior’ in Terminal -&; Window Settings -&; Emulation.
Related: colors, coordinates, escape_codes, mathematics and pcre.With one argument a specific list can be cleared.
With two arguments the triggers in the chosen list that match the given pattern will be removed.
Example: #kill alias %test Related: class, debug, ignore, info and message.When using #line log and logging in html format use \c&; \c&; \c&; \c&; to log a literal &; &; &; and &;.
Related: class and config.The index should be between +1 and the list’s size. You can also give a negative value, in which case -1 equals the last item in the list, -2 the second last, etc.
When inserting an item a positive index will prepend the item at the given index, while a negative index will append the item.
The add and create options allow using multiple items, as well as semicolon separated items.
The get option will return the item or the indexation. Use $var[&;index&;] to retrieve the nested data of a list table.
The order, sort and simplify options will perform the operation on the given list. Optional items can be provided which are added to the new or existing list before the operation is executed. Sorting and ordering are stable.
The indexate option prepares a table or list table for order, sort, filter, refine, and find operations for the given key. It is similar to the SELECT option in SQL. All entries must contain the given key.
A size of 0 is returned for an empty or non-existent list. You can directly access the size of a list using &;var[].
You can directly access elements in a list variable using $var[+1], $var[+2], $var[-1], etc.
Related: break, continue, foreach, loop, parse, repeat, return and while.-
Basic variable: The standard key = value variable.
-
Simple list: A string that contains semicolon delimited fields. {a;b;c}. Can be saved as a variable.
-
Brace list: A string in which fields are delimited with braces. {a}{b}{c}. Brace lists cannot be stored as a variable because tables use braces as well, they must be stored as a simple list instead.
-
Table: Think of this as variables nested within another variable. Or as variables contained within another variable.
-
List: A table that uses integers for its indexes. Also known as an array. The #list command is a utility command for using tables as arrays.
To see if the ‘simple’ variable exists you can use &;{simple} which will display 0 if the variable does not exist, or the variable’s index if it exists.
If you have multiple variables they are sorted alphabetically and numerically. While it’s not all that relevant for simple variables, the first variable has index 1, the second variable index 2, and so on.
Variable names need to start with a letter and only exist of letters, numbers, and underscores. If you need to use a non standard variable name this is possible using braces.
Example: #variable {:)} {Happy Happy!};#show ${:)}Variables can be accessed using their index. While primarily useful for tables it is possible to do this for simple variables. Use +1 for the first variable, +2 for the second variable, etc. Use -1 for the last variable, -2 for the second last variable, etc.
Example: #show The first variable is: *{+1} with value: ${+1} Removing Variables To remove a variable, use #unvariable or #unvar (every command can be abbreviated). It’s possible to remove multiple variables at once using #unvar {var 1} {var 2} {etc}Variables are unique to each session, so if you have multiple sessions, removing a variable from one session won’t remove it from other sessions.
If you remove a table variable, all variables contained within that table variable are removed as well.
Simple Lists A simple list is a string that contains semicolon delimited fields. Commands can be entered as simple lists, for example: #show {a};#show {b} will execute a single line as two commands.Several commands take a simple list as their input, these are: #foreach, #line substitute, #path load, #list create, and #highlight.
Brace Lists A brace list is a string in which fields are delimited with braces. Most commands take a brace list for their arguments, for example: #session {x} {mud.com} {1234} {mud.tin}. The session command takes 4 arguments, the 4th argument (command file) is optional.Commands that take a simple list as their input will also accept a brace list, keep in mind you’ll have to embed the brace list in an extra set of braces, for example: #path load {{n}{s}{w}{w}}, which is identical to: #path load {n;s;w;w}.
Brace lists cannot be stored as variables because TinTin++ will confuse them with tables. You can convert a brace list to a table variable using: #list {bracelist} {create} {{a}{b}{c}} this will look internally as: {{1}{a}{2}{b}{3}{c}}. You can then convert this table back to a simple list using: #list {bracelist} {simplify} which will change it to {a;b;c}.
Braces cannot easily be escaped in TinTin++. Using \{ or \} will not work. The reason for this is due to several factors, but primarily backward compatibility. To escape braces you must define them using hexadecimal notation using \x7B and \x7D. See #help escape for a list of escape options, and the help file will also remind you of how to escape braces.
Tables Tables are key/value pairs stored within a variable. Tables are also known as associative arrays, dictionaries, maps, nested variables, structures, and probably a couple of other names. There are several ways to create and access tables. Example: #variable {friendlist} {{bob}{bob@mail.com} {bubba}{sunset@gmail.com}}This will create a friendlist with two entries, the key is the name of the friend, the value is the email address of the friend. You can see the email address of bob using: #show {$friendlist[bob]}. You can also define this table as following:
Example: #variable {friendlist[bob]} {bob@mail.com} #variable {friendlist[bubba]} {sunset@gmail.com}This would create the exact same table as the single line declaration used previously. To see the first key in the table use: *friendlist[+1], to see the first value in the table use: $friendlist[+1]. To see the size of the table use &;friendlist[]. To print a bracelist of all friends use *friendlist[], to print a bracelist of all friends whose name starts with the letter ‘a’ you would use: friendlist[a%]. Similarly to see the number of friends you have whose name ends with the letter ‘b’ you would use: &;friendlist[%*b].
See #help regexp for a brief overview of regular expression options. While TinTin++ supports PCRE (perl-compatible regular expressions), it embeds them within its own regular expression syntax that is simpler and less invasive, while still allowing the full power of PCRE for those who need it.
Example: #unvariable {friendlist[bubba]}This would remove {bubba} from the friendlist. To remove the entire friendlist you would use: #unvariable {friendlist}.
Example: #variable {friendlist} {{bob} {{email}{bob@ma.il} {phone}{123456789}}}There is no limit to the number of nests, simply add more braces. To see Bob’s email in this example you would use: #show {$friendlist[bob][email]}.
To merge two tables the #cat command can be used.
Example: #variable {bli} {{a}{1}{b}{2}} #variable {blo} {{c}{3}{d}{4}} #cat {blo} {$bli} Lists Tables are sorted alphabetically with the exception of numbers which are sorted numerically. If you want to determine the sorting order yourself you can use use the #list command which helps you to use tables as arrays. Example: #action {%1 chats %2} {#list chats add {%0}}Each time a chat is received it’s added to the end of the ‘chats’ list variable. If you type #variable chats this might look like:
#VARIABLE {chats} { {1} {Bubba chats Hi} {2} {Bob chats Hi bub} {3} {Bubba chats Bye} {4} {Bob chats bub bye} } Parsing There are various ways to parse lists and tables, using either #loop, #foreach, #while, or #&;number&;.#loop takes two numeric arguments, incrementing or decrementing the first number until it matches the second number. The value of the loop counter is stored in the provided variable.
#foreach takes either a simple list or a brace list as its first argument. Foreach will go through each item in the list and store the value in the provided variable.
#while will perform an if check on the first argument, if the result is true it will execute the commands in the second argument. Then it performs an if check on the first argument again. It will continue to repeat until the if check returns 0 or the loop is interrupted with a control flow command. It takes special care to avoid infinite loops.
#&;number&; will execute the provided argument ‘number’ times. For example: #4 {#show beep! \a}
Here are some examples.
Example: #list friends create {bob;bubba;zorro}Internally this looks like {{1}{bob}{2}{bubba}{3}{zorro}} and the list can be parsed in various ways.
Example: #foreach {$friends[%*]} {name} {#show $name} Example: #foreach {friends[%]} {i} {#show $friends[$i]} Example: #loop {1} {&;friends[]} {i} {#show $friends[+$i]} Example: #math i 1;#while {&;friends[+$i]} {#show $friends[+$i]; #math i $i + 1} Example: #math i 1;#&;friends[] {#show $friends[+$i];#math i $i + 1}Each of the five examples above performs the same task; printing the three names in the friends list.
If you want to get a better look at what goes on behind the scenes while executing scripts you can use ‘#debug all on’. To stop seeing debug information use ‘#debug all off’.
List Tables List tables are also known as databases and the #list command has several options to manipulate them.For these options to work properly all tables need to have identical keys. Here is an example list table.
#var {friendlist} { {1}{{name}{bob} {age}{54}} {2}{{name}{bubba} {age}{21}} {3}{{name}{pamela} {age}{36}} }
To sort the list table by age you would use:
#list friendlist indexate age #list friendlist order
To remove everyone whose name starts with a ‘b’ you would use:
#list friendlist indexate name #list friendlist filter {} {b%*}
The filter option only supports regular expressions. To filter using mathematics you would loop through the list backwards:
#loop &;friendlist[] 1 index { #if {$friendlist[+$index][age] &; 30} { #list friendlist delete $index } }
Alternatively you can use the refine option.
#list friendlist indexate age #list friendlist refine {&;0 &;= 30}
To add an item to a list table there are two options:
#list friendlist add {{{name}{hobo} {age}{42}}} #list friendlist insert -1 {{name}{hobo} {age}{42}}
Optimization TinTin++ tables are exceptionally fast while they remain under 100 items. Once a table grows beyond 10000 items there can be performance issues when inserting and removing items in the beginning or middle of the table.The plan is to eventually implement an indexable and flexible data structure for large tables.
If you load a large table from file it’s important to make sure it’s sorted, when using #write to save a table it’s automatically sorted.
If you notice performance issues on large tables it’s relatively easy to create a hash table.
Example:#alias {sethash} { #format hash %H %1; #math hash1 $hash % 100; #math hash2 $hash / 100 % 100; #var hashtable[$hash1][$hash2][%1] %2 }
#function {gethash} { #format hash %H %1; #math hash1 $hash % 100; #math hash2 $hash / 100 % 100; #return $hashtable[$hash1][$hash2][%1] }
#alias {test} { sethash bli hey; sethash bla hi; sethash blo hello; #show The value of bla is: @gethash{bla} }
The above script will rapidly store and retrieve over 1 million items. Looping through a hash table is relatively easy as well.
Example:#alias {showhash} { #foreach {hashtable[%]} {hash1} { #foreach {hashtable[$hash1][%]} {hash2} { #echo {%-20s = %s} {hashtable[$hash1][$hash2]} {$hashtable[$hash1][$hash2]} } } }
Related: break, continue, foreach, loop, parse, repeat, return and while.Commands that store information to a variable will use a local variable if it exists.
Avoid setting the result variable as local in a function. Similarly, it is best to avoid setting a local variable that is identical to an existing regular variable.
Example: #alias {swap} {#local x %0;#replace x {e} {u};#show $x} Comment: You can remove a local variable with the #unlocal command. Related: format, function, math, replace, script and variable.The key sequence sent to the terminal when pressing a function key differs for every OS and terminal. To find out what sequence is sent you can enable the CONVERT META config option.
Another option is pressing ctrl-v, which will enable CONVERT META for the next key pressed.
If you only want a key sequence to trigger at the start of an input line prefix the key sequence with ^.
Example: #macro {(press ctrl-v)(press F1)} {#show \e[2J;#buffer lock} Clear the screen and lock the window when you press F1, useful when the boss is near. Example: #macro {\eOM} {#cursor enter} Makes the keypad’s enter key work as an enter in keypad mode. Example: #macro {^nn} {n} Makes pressing n twice on an empty line execute north. Comment: Not all terminals properly initialize the keypad key sequences. If this is the case you can still use the keypad, but instead of the arrow keys use ctrl b, f, p, and n. Comment: You can remove a macro with the #unmacro command. Related: alias, cursor, history, keypad, speedwalk and tab.The map command is the backbone of the auto mapping feature.
#map at &;exit|vnum&; &;command&; Execute the command at the given exit or vnum. #map center &;x&; &;y&; &;z&; Sets displaying center of the map viewer, default is 0 0 0. #map color &;field&; [value] Sets the map color for the given color field. Use #map color reset to restore colors to default. #map create &;size&; Creates a new map and room 1. The default size is 50000 rooms. #map destroy {area|world} &;name&; Deletes the map or given area. #map delete &;exit|vnum&; Deletes the room for the given exit or vnum. #map dig &;exit|vnum&; [new|&;vnum&;] Creates an exit for the given exit name. If no valid exit name is given or no existing room is found a new room is created. Useful for portal links and other alternative forms of transportation. If the ‘new’ argument is provided all existing rooms are ignored and a new room is created. If a room vnum is given as the second argument an exit will be created leading to the given room vnum. If the room vnum doesn’t exist a new room is created. #map entrance &;exit&; &;option&; &;arg&; [both] Set the entrance data for the given exit. You must specify a valid two-way exit for this to work. #map exit &;exit&; &;option&; &;arg&; [both] Set the exit data. Useful with a closed door where you can set the exit command: ‘#map exit e command {open east;e}’. Use #map exit &;exit&; for a list of available options. Use #map exit &;exit&; save to save all exit data. #map exitflag &;exit&; &;AVOID|BLOCK|HIDE|INVIS&; [on|off] Set exit flags. See #map roomflag for more info. #map explore &;exit&; Explores the given exit until a dead end or an intersection is found. The route is stored in #path and can subsequently be used with #walk. Useful for long roads. #map find &;name&; &;exits&; &;desc&; &;area&; &;note&; &;terrain&; &;flag&; searches for the given room name. If found the shortest path from your current location to the destination is calculated. The route is stored in #path and can subsequently be used with the various #path commands. If #map flag nofollow is set it will store the exit commands instead of the exit names.If &;exits&; is provided all exits must be matched, if &;roomdesc&;, &;roomarea&; or &;roomnote&; or &;roomterrain&; or &;roomflag&; is provided these are matched as well against the room to be found.
These search options are also available for the at, delete, goto, link, list and run commands.
#map flag asciigraphics Takes up more space but draws a more detailed map that displays the ne se sw nw exits and room symbols. #map flag asciivnums Display room vnums if asciigraphics is enabled. #map flag direction Display an arrow on the map showing the direction of your last movement command. #map flag fast Limit coordinate searches to a 50 room radius. Useful to speed up map drawing and room creation on large maps. #map flag nofollow When you enter movement commands the map will no longer automatically follow along. Useful for MSDP and GMCP automapping scripts. When you use #map find in nofollow mode it will store the exit command instead of the exit name into the path. #map flag pancake Makes the map display rooms above or below you. You can use #map color room for a color gradient. #map flag quiet Silence map messages when creating new rooms through movement. #map flag static Will make the map static so new rooms are no longer created when walking into an unmapped direction. Useful when you’re done mapping and regularly bump into walls accidentally creating a new room. #map dig etc will still work. #map flag symbolgraphics Draw a 1x1 map using the defined room symbols. #map flag terrain Fill up empty space surrounding rooms with terrain symbols #map flag vtgraphics Enables vt line drawing on some terminals #map flag vtmap Will enable the vtmap which is shown in the top split screen if you have one. You can create a 16 rows high top screen by using ‘#split 16 1’. #map get &;option&; &;variable&; [vnum] Store a map value into a variable, if no vnum is given the current room is used. Use ‘all’ as the option to store all values as a table. #map get roomexits &;variable&; Store all room exits into variable. #map global &;room vnum&; Set the vnum of a room that contains global exits, for example an exit named ‘recall’ that leads to the recall location. The room can contain multiple exits, in case there are multiple commands that are similar to recall. #map goto &;room vnum&; [dig] Takes you to the given room vnum, with the dig argument a new room will be created if none exists. #map goto &;name&; &;exits&; &;desc&; &;area&; &;note&; &;terrain&; Takes you to the given room name, if you provide exits those must match. #map info [save] Gives information about the map and room you are in. If the save argument is given the map data is saved to the info[map] variable. #map insert &;direction&; [roomflag] Insert a room in the given direction. Most useful for inserting void rooms. #map jump &;x&; &;y&; &;z&; Jump to the given coordinate, which is relative to your current room. #map landmark &;name&; &;vnum&; [description] [size] Creates an alias to target the provided room vnum. The description is optional and should be brief. The size determines from how many rooms away the landmark can be seen. #map leave Makes you leave the map. Useful when entering a maze. You can return to your last known room using #map return. #map legend &;legend&; [symbols|reset] #map legend &;legend&; &;index&; [symbol] There are several legends and sub-legends available for drawing maps to suit personal preference and character sets. Use #map legend all to see the legend as currently defined. Use #map legend &;legend&; &;reset&; to set the default legend. Use #map legend &;legend&; &;character list&; to create a custom legend. Custom legends are stored in the map file and can be saved and loaded using #map write and #map read. #map link &;direction&; &;room name&; [both] Links two rooms. If the both argument and a valid direction is given the link is two ways. #map list &;name&; &;exits&; &;desc&; &;area&; &;note&; &;terrain&; Lists all matching rooms and their distance. The following search keywords are supported.{distance} &;arg&; will list rooms within given distance. {roomarea} &;arg&; will list rooms with matching area name. {roomdesc} &;arg&; will list rooms with matching room desc. {roomexits} &;arg&; will list rooms with identical room exits. Use * as an exit to ignore non pathdir exits. {roomflag} &;arg&; will list rooms with matching room flags. {roomid} &;arg&; will list rooms with identical id name. {roomname} &;arg&; will list rooms with matching room name. {roomnote} &;arg&; will list rooms with matching room note. {roomterrain} &;arg&; will list rooms with matching room terrain. {variable} &;arg&; will save the output to given variable.
#map map &;rows&; &;cols&; &;append|overwrite|list|variable&; &;name&; Display a drawing of the map of the given height and width. All arguments are optional. If {rows} or {cols} are set to {} or {0} they will use the scrolling window size as the default. If {rows} or {cols} are a negative number this number is subtracted from the scrolling window size. #map map &;rows&; &;cols&; draw &;square&; Display a drawing of the map of the given height and width. The square argument exists of 4 numbers formulating the top left corner and bottom right corner of a square.If you use {append|overwrite} the map is written to the specified file name which must be given as the 4th argument. If you use {list|variable} the map is saved to the specified variable name.
#map move &;direction&; This does the same as an actual movement command, updating your location on the map and creating new rooms. Useful when you are following someone and want the map to follow along. You will need to create actions using ‘#map move’, for this to work. #map offset &;row&; &;col&; &;row&; &;col&; Define the offset of the vtmap as a square. Without an argument it defaults to the entire top split region. #map read &;filename&; Will load the given map file. #map resize &;size&; Resize the map, setting the maximum number of rooms. #map return Returns you to your last known room after leaving the map or loading a map. #map roomflag &;flags&; &;get|on|off&; #map roomflag avoid When set, ‘#map find’ will avoid a route leading through that room. Useful for locked doors, etc. #map roomflag block When set the automapper will prevent movement into or through the room. Useful for death traps. #map roomflag hide When set, ‘#map’ will not display the map beyond this room. When mapping overlapping areas or areas that aren’t build consistently you need this flag as well to stop auto-linking, unless you use void rooms. #map roomflag invis When set the room will be colored with the INVIS color. #map roomflag leave When entering a room with this flag, you will automatically leave the map. Useful when set at the entrance of an unmappable maze. #map roomflag noglobal This marks a room as not allowing global transportation, like norecall rooms that block recall. #map roomflag void When set the room becomes a spacing room that can be used to connect otherwise overlapping areas. A void room should only have two exits. When entering a void room you are moved to the connecting room until you enter a non void room. #map roomflag static When set the room will no longer be autolinked when walking around. Useful for mapping mazes. #map run &;room name&; [delay] Calculates the shortest path to the destination and walks you there. The delay is optional and requires using braces. Besides the room name a list of exits can be provided for more precise matching. #map set &;option&; &;value&; [vnum] Set a map value for your current room, or given room if a room vnum is provided. #map sync &;filename&; Similar to #map read except the current map won’t be unloaded or overwritten. #map terrain &;name&; &;symbol&; [flag] Set the terrain symbol and flag. #map terrain &;name&; &;symbol&; [DENSE|SPARSE|SCANT] Determine symbol density, omit for the default. #map terrain &;name&; &;symbol&; [NARROW|WIDE|VAST] Determine symbol spread range, omit for the default. #map terrain &;name&; &;symbol&; [FADEIN|FADEOUT] Determine symbol spread density, omit for the default. #map terrain &;name&; &;symbol&; [DOUBLE] You’re using two characters for the symbol. #map travel &;direction&; &;delay&; Follows the direction until a dead end or an intersection is found. Use braces around the direction if you use the delay, which will add the given delay between movements. Use #path stop to stop a delayed run. #map undo Will undo your last move. If this created a room or a link they will be deleted, otherwise you’ll simply move back a room. Useful if you walked into a non-existent direction. #map uninsert &;direction&; Exact opposite of the insert command. #map unlandmark &;name&; Removes a landmark. #map unlink &;direction&; [both] Will remove the exit, this isn’t two way so you can have the properly display no exit rooms and mazes. If you use the both argument the exit is removed two-ways. #map unterrain &;name&; Removes a terrain. #map update [now] Sets the vtmap to update within the next 0.1 seconds, or instantly with the now argument. #map vnum &;low&; [high] Change the room vnum to the given number, if a range is provided the first available room in that range is selected. #map write &;filename&; [force] Will save the map, if you want to save a map to a .tin file you must provide the {force} argument. Related: path, pathdir and speedwalk.The first command sets the top split lines to 16 and the bottom split line to 1. If you want a smaller or larger map display you can use a different value than 16.
If you don’t need to display diagonal exits and prefer a more compact look you can use #map flag AsciiGraphics off. This will enable the standard display which uses UTF-8 box drawing characters, results may vary depending on the font used.
If your terminal supports UTF-8 you can also give #map flag unicode on a try.
If you want to display the map in a different location of the screen use something like:
#split 0 1 0 -80 #map offset 1 81 -4 -1This will display the map on the right side of the screen, if the width of the screen is wide enough.
#map undo If you accidentally walk into the wall on your MUD the mapper will still create a new room. You can easily fix this mistake by using #map undo. If you want to move around on the map without moving around on the MUD you can use: #map move {direction}. To delete a room manually you can use: #map delete {direction}. To create a room manually you can use: #map dig {direction}. #map write &;filename&; You can save your map using #map write, to load a map you can use #map read &;filename&;. You can return to the room you were in when the map was last saved by using #map return. You can use #event to automatically read and write the map on session start and end. #map set &;option&; &;value&; You can set the room name using #map set roomname &;name&;. You either have to do this manually or create triggers to set the room name automatically. Once the room name is set you can use #map goto with the room name to visit it. If there are two rooms with the same name #map goto will go to the most nearby room. If you want to always go to the same room you should memorize the room number or create a landmark. #map landmark firstroom 1 You can further narrow down the matches by providing additional arguments, for example: #map goto {dark alley} {roomexits} {n;e} {roomarea} {Haddock Ville} You can set the room weight using #map set roomweight {value}. The weight by default is set to 1.0 and it represents the difficulty of traversing the room. If you have a lake as an alternative route, and traversing water rooms is 4 times slower than regular rooms, then you could set the weight of the lake rooms to 4.0. If the lake is 3 rooms wide the total weight is 12. If walking around the lake has a weight less than 12 the mapper will go around the lake, if the weight is greater than 12 the mapper will take a route through the lake.You can set the room symbol using #map set roomsymbol {value}. The symbol should be one, two, or three characters, which can be colorized. You can for example mark shops with an ‘S’ and colorize the ‘S’ depending on what type of shop it is.
#map run &;location&; &;delay&; The run command will have tintin find the shortest path to the given location and execute the movement commands to get there. You can provide a delay in seconds with floating point precision, for example: #map run {dark alley} {0.5} This will make you walk towards the nearest dark alley with 0.5 second intervals. Typical MUDs accept commands at 0.25 second intervals. #map insert {direction} {flag} The insert command is useful for adding spacer rooms called void rooms. Often rooms overlap, and by adding void rooms you can stretch out exits. For example: #map insert north void. You cannot enter void rooms once they’ve been created, so you’ll have to use #map info in an adjacent room to find the room vnum, then use #map goto {vnum} to visit.It’s also possible to align rooms using void rooms. This is easily done using #map insert north void.
Related: map, path and pathdir.Operators Priority Function
! 0 logical not ~ 0 bitwise not d 1 integer random dice
-
2 integer multiply
** 2 integer power / 2 integer divide // 2 integer sqrt // 2 or cbrt // 3 % 2 integer modulo
-
3 integer addition
-
3 integer subtraction
&;&; 4 bitwise shift &;&; 4 bitwise shift … 4 integer range &; 5 logical greater than &;= 5 logical greater than or equal &; 5 logical less than &;= 5 logical less than or equal == 6 logical equal (can use regex) === 6 logical equal (never regex) != 6 logical not equal (can use regex) !== 6 logical not equal (never regex) &; 7 bitwise and ^ 8 bitwise xor | 9 bitwise or &;&; 10 logical and ^^ 11 logical xor || 12 logical or ? 13 logical ternary if (unfinished code) : 14 logical ternary else
True is any non-zero number, and False is zero. Parentheses () have highest precedence, so inside the () is always evaluated first.
Strings must be enclosed in &; &; or { } and in the case of an == or != operation a regex is performed with the regular expression in the right-hand string. In the case of a &;= or &;= operation the alphabetic order is compared.
The #if and #switch commands use #math. Several commands accepting numeric input allow math operations as well, such as #delay.
Floating point precision is added by using the decimal . operator or using #format with the %f flag character.
Example: #math {heals} {$mana / 40} Assuming there is a variable $mana, divides its value by 40 and stores the result in $heals. Example: #action {^You receive %0 experience} {updatexp %0} #alias updatexp {#math {xpneed} {$xpneed - %0} Let’s say you have a variable which stores xp needed for your next level. The above will modify that variable after every kill, showing the amount still needed. Example: #action {%0 tells %1} {#if {{%0} == {Bubba} &;&; $afk} {reply I’m away, my friend.}} When you are away from keyboard, it will only reply to your friend. Related: cat, format, function, local, mathematics, replace, script and variable.! 0 logical not ~ 0 bitwise not
-
1 integer multiply
** 1 integer power / 1 integer divide // 1 integer sqrt // 2 or cbrt // 3 % 1 integer modulo d 1 integer random dice roll
-
2 integer addition
-
2 integer subtraction
&;&; 3 bitwise shift &;&; 3 bitwise shift &; 4 logical greater than &;= 4 logical greater than or equal &; 4 logical less than &;= 4 logical less than or equal == 5 logical equal != 5 logical not equal &; 6 bitwise and ^ 7 bitwise xor | 8 bitwise or &;&; 9 logical and ^^ 10 logical xor || 11 logical or
Operator priority can be ignored by using parentheses, for example (1 + 1) * 2 equals 4, while 1 + 1 * 2 equals 3.
String operations Operators Priority Function&; 4 alphabetical greater than &;= 4 alphabetical greater than or equal &; 4 alphabetical less than &;= 4 alphabetical less than or equal == 5 alphabetical equal using regex != 5 alphabetical not equal using regex === 5 alphabetical equal !== 5 alphabetical not equal
Strings must be encased in double quotes or braces. The &; &;= &; &;= operators perform basic string comparisons. The == != operators perform regular expressions, with the argument on the left being the string, and the argument on the right being the regex. For example {bla} == {%*a} would evaluate as 1.
Related: math and regexp.To see mouse events as they happen use #CONFIG MOUSE INFO. This information can then be used to create mouse events with the #event command and buttons with the #button command.
Visual buttons and pop-ups can be drawn on the screen with the #draw command.
The input field can be changed and renamed using #screen inputregion, which allows creating named events for enter handling.
Links can be created using the MSLP protocol which will generate link specific events when clicked.
In order to copy/paste, most terminals require that you press the shift key during selection.
Related: button, draw, event and mslp.Available MSDP events can be queried using the MSDP protocol as described in the specification.
https://tintin.mudhalla.net/protocols/msdp Related: event and port.The simplest link can be created by surrounding a keyword with the \e[4m and \e[24m tags.
Example: #substitute {\b{n|e|s|w|u|d}\b} {\e[4m%1\e[24m}This would display ‘Exits: n, e, w.’ as ‘Exits: n, e, w.’.
When clicked this would trigger the PRESSED LINK MOUSE BUTTON ONE event of which %4 will hold the link command and %6 holds the link name, which in the case of a simple link will be empty.
Example: #event {PRESSED LINK MOUSE BUTTON ONE} {#send {%4}}Keep in mind that if you change PRESSED to DOUBLE-CLICKED the link will only work if the text does not scroll in between clicks.
If you want to create a complex link use an OSC code.
Example: #sub {\bsmurf\b} {\e]68;1;;say I hate smurfs!\a\e[4m%0\e[24m}If you have the LINK event of the previous example set, the %4 argument will contain ‘say I hate smurfs!’.
Example: #sub {\bgoblin\b} {\e]68;1;SEND;kill goblin\a\e[4m%0\e[24m}Notice the previous instance of ;; has been replaced with ;SEND; which will name the link. This will generate a named event.
Example: #event {PRESSED LINK SEND MOUSE BUTTON ONE} {#send {%4}}By naming links you can organize things a little bit better instead of tunneling everything through the same event.
Keep in mind that the server is allowed to use \e]68;1;\a as well, subsequently various security measures are in place.
To create secure links, which are filtered out when sent by a server, you need to use \e]68;2;\a, and they instead trigger the SECURE LINK event.
To create a link that is not underlined, use \e]4;24m text \e]24m.
Example: #sub {%* tells %*} {\e]68;2;EXEC;#cursor set tell %1 \a\e[4;24m%0\e[24m} #event {PRESSED SECURE LINK EXEC MOUSE BUTTON ONE} {%4}This would make you start a reply when clicking on a tell.
Website: https://tintin.mudhalla.net/protocols/mslp Related: event and port.A valid alternative for #nop is #0.
Comment: By using braces you can comment out multiple lines of code in a script file.For commenting out an entire trigger and especially large sections of triggers you would want to use /* text */
Example: #nop This is the start of my script file. Related: readThe first argument is a direction, the second argument is the reversed direction. The reverse direction of north is south, etc.
The third argument is a spatial coordinate which is a power of two. ‘n’ is 1, ‘e’ is 2, ‘s’ is 4, ‘w’ is ‘8’, ‘u’ is 16, ‘d’ is 32. The exception is for compound directions, whose value should be the sum of the values of each cardinal direction it is composed of. For example, ‘nw’ is the sum of ‘n’ and ‘w’ which is 1 + 8, so ‘nw’ needs to be given the value of 9. This value is required for the #map functionality to work properly.
Example: #pathdir {ue} {dw} {18} #pathdir {dw} {ue} {40} Comment: You can remove a pathdir with the #unpathdir command. Related: map and path.Regular expressions are an integral part of TinTin++, but keep in mind that tintin doesn’t allow you to use regular expressions directly, instead it uses a simpler intermediate syntax that still allows more complex expressions when needed.
Commands that utilize regular expressions are: action, alias, elseif, gag, grep, highlight, if, kill, local, math, prompt, regexp, replace, substitute, switch, variable and while. Several other commands use regular expressions in minor ways. Fortunately the basics are very easy to learn.
TinTin++ Regular Expression The following support is available for regular expressions. ^ match start of line. $ match of end of line. \ escape one character. %1-%99 match of any text, stored in the corresponding index. %0 should be avoided in the regex, contains all matched text. { } embed a perl compatible regular expression, matches are stored. %!{ } embed a perl compatible regular expression, matches are not stored.[ ] . + | ( ) ? * are treated as normal text unless used within braces. Keep in mind that { } is replaced with ( ) automatically unless %!{ } is used.
TinTin++ Description POSIX %a Match zero or more characters including newlines ([^\0]?) %A Match zero or more newlines ([\n]?) %c Match zero or more ansi color codes ((?:\e\[[0-9;]m)?) %d Match zero or more digits ([0-9]?) %D Match zero or more non-digits ([^0-9]?) %i Matches become case insensitive (?i) %I Matches become case sensitive (default) (?-i) %s Match zero or more spaces ([\r\n\t ]?) %S Match zero or more non-spaces ([^\r\n\t ]?) %w Match zero or more word characters ([A-Za-z0-9_]?) %W Match zero or more non-word characters ([^A-Za-z0-9_]?) %? Match zero or one character (.??) %. Match one character (.) %+ Match one or more characters (.+?) %* Match zero or more characters excluding newlines (.*?) Ranges If you want to match 1 digit use %+1d, if you want to match between 3 and 5 spaces use %+3…5s, if you want to match 1 or more word characters use %+1…w, etc. Variables If you use %1 in an action to perform a match the matched string is stored in the %1 variable which can be used in the action body. Example: #act {%1 says ‘Tickle me’} {tickle %1}If you use %2 the match is stored in %2, etc. If you use an unnumbered match like %* or %S the match is stored at the last used index incremented by one.
Example: #act {%3 says ‘%*’} {#if {&;%4&; == &;Tickle me&;} {tickle %3}}The maximum variable index is 99. If you begin an action with %* the match is stored in %1. You should never use %0 in the trigger part of an action, when used in the body of an action %0 contains all the parts of the string that were matched.
To prevent a match from being stored use %!*, %!w, etc.
Perl Compatible Regular Expressions You can embed a PCRE (Perl Compatible Regular Expression) using curley braces { }, these braces are replaced with parentheses ( ) unless you use %!{ }. Or You can separate alternatives within a PCRE using the | character. Example: #act {%* raises {his|her|its} eyebrows.} {say 42…} Brackets You can group alternatives and ranges within a PCRE using brackets. Example: #act {%* says 'Who is number {[1-9]}?} {say $number[%2] is number %2}The example only triggers if someone provides a number between 1 and 9. Any other character will cause the action to not trigger.
Example: #act {%* says 'Set password to {[^0-9]*}$} {say The password must contain at least one number, not for security reasons, but just to annoy you.} {4}When the ^ character is used within brackets it creates an inverse search, [^0-9] matches every character except for a number between 0 and 9.
Quantification A quantifier placed after a match specifies how often the match is allowed to occur. ? repeat zero or one time. * repeat zero or multiple times. + repeat once or multiple times. {n} repeat exactly n times, n must be a number. {n,} repeat at least n times, n must be a number. {n,o} repeat between n and o times, n and o must be a number. Example: #act {%* says 'Who is number {[1-9][0-9]{0,2}}?} {Say $number[%2] is number %2}The example only triggers if someone provides a number between 1 and 999.
Parantheses TinTin Regular Expressions automatically add parenthesis, for example %* translates to (.?) in PCRE unless the % is found at the start or end of the line, in which cases it translates to (.*). Paranthesis in PCRE causes a change in execution priority similar to mathematical expressions, but parentheses also causes the match to be stored to a variable.When nesting multiple sets of parentheses each nest is assigned its numerical variable in order of appearance.
Example: #act {%* chats ‘{Mu(ha)+}’} {chat %2ha!}If someone chats Muha you will chat Muhaha! If someone chats Muhaha you will chat Muhahaha!
Lazy vs Greedy By default regex matches are greedy, meaning {.*} will capture as much text as possible. Example: #regex {bli bla blo} {^{.} {.}$} {#show Arg1=(&;1) Arg2=(&;2)}This will display: Arg1=(bli bla) Arg2=(blo)
By appending a ? behind a regex it becomes lazy, meaning {.*?} will capture as little text as possible.
Example: #regex {bli bla blo} {^{.?} {.?}$} {#show Arg1=(&;1) Arg2=(&;2)}This will display: Arg1=(bli) Arg2=(bla blo).
Escape Codes PCRE support the following escape codes. PCRE Description POSIX \A Match start of string ^ \b Match word boundaries (^|\r|\n|\t| |$) \B Match non-word boundaries [^\r\n\t ] \c Insert control character \c \d Match digits [0-9] \D Match non-digits [^0-9] \e Insert escape character \e \f Insert form feed character \f \n Insert line feed character \n \r Insert carriage return character \r \s Match spaces [\r\n\t ] \S Match non-spaces [^\r\n\t ] \t Insert tab character \t \w Match letters, numbers, and underscores [A-Za-z0-9_] \W Match non-letters, numbers, and underscores [^A-Za-z0-9_] \x Insert hex character \x \Z Match end of string $ \\ Match a backslash \\\s matches one space, \s+ matches one or multiple spaces, the use of {\s+} is required for this sequence to work in tintin, \s by itself will work outside of a set of braces.
Use \% to forcibly match a literal % character.
Color triggers To make matching easier text triggers (Actions, Gags, Highlights, Prompts, and Substitutes) have their color codes stripped. If you want to create a color trigger you must start the triggers with a ~ (tilde). To make escape codes visible use #config {convert meta} on. Example: #action {~\e[1;37m%1} {#var roomname %1}If the room name is the only line on the server in bright white white color trigger will save the roomname.
This covers the basics. PCRE has more options, most of which are somewhat obscure, so you’ll have to read a PCRE manual for additional information.
Related: map and path.The port command is very similar to chat except that it creates a new session dedicated to receiving socket connections at the given port number without built-in support for a communication protocol.
You can init with 0 as the port number to create a dummy session.
Related: all, chat, run, session, sessionname, snoop, ssl and zap.The row number is optional and useful if you use a non standard split mode. A positive row number draws #row lines from the top while a negative number draws #row lines from the bottom. Without an argument #prompt will write to the default split line, which is one row above the input line, typically at row -2.
If the row number is set to 0, #prompt will behave like #substitute. This is useful to let tintin know that a prompt was received so you can use #config packet_patch with minimal interference.
The col number is optional and can be used to set the column index. A positive col number draws the given number of columns from the left, while a negative col number draws from the right. If you leave the col number empty tintin will clear the row before printing at the start of the row.
The #show command takes a row and col argument as well so it’s also possible to place text on your split lines using #show.
Example: #prompt {[%] % (%) &; } {[%1] %2 (%3)} Example: #prompt {[%] %* (%*) &; } {} {-2} If the &;new text&; argument is left empty the original text is used, including colors. Use {\} for a blank line. Comment: See #help split for more information on split mode. Comment: See #help substitute for more information on text substitutions. Comment: You can remove a prompt with the #unprompt command. Related: action, gag, highlight and substitute.If you uses braces you can use several lines for each command. You must match every { with a } for the read command to work.
You can comment out triggers using /* text */
Related: log, scan, textin and write.The expression can contain escapes, and if you want to match a literal \ character you’ll have to use \\ to match a single backslash.
Variables are stored in &;1 to &;99 with &;0 holding the matched substring.
The #regex command is not a proper statement like #if, when using #return or #break in the {true} argument it won’t terminate any loop the #regex command is nested within.
^ force match of start of line. $ force match of end of line. \ escape one character. %1-%99 lazy match of any text, available at %1-%99. %0 should be avoided in triggers, and if left alone lists all matches. { } embed a raw regular expression, matches are stored to %1-%99. %!{ } embed a raw regular expression, matches are not stored. [ ] . + | ( ) ? * are treated as normal text unlessed used within braces. Keep in mind that { } is replaced with ( ) automatically unless %!{ } is used.Of the following the (lazy) match is available at %1-%99 + 1
%a match zero or more characters including newlines. %A match zero or more newlines. %c match zero or more ansi color codes. %d match zero or more digits. %D match zero or more non digits. %s match zero or more spaces. %S match zero or more non spaces. %w match zero or more word characters. %W match zero or more non word characters.Experimental (subject to change) matches are:
%p match zero or more printable characters. %P match zero or more non printable characters. %u match zero or more unicode characters. %U match zero or more non unicode characters.If you want to match 1 digit use %+1d, if you want to match between 3 and 5 spaces use %+3…5s, if you want to match 0 or more word characters use %+0…w, etc.
%+ match one or more characters. %? match zero or one character. %. match one character. %* match zero or more characters. %i matching becomes case insensitive. %I matching becomes case sensitive (default).The match is automatically stored to a value between %1 and %99 starting at %1 and incrementing by 1 for every regex. If you use %15 as a regular expression, the next unnumbered regular expression would be %16. To prevent a match from being stored use %!*, %!w, etc.
Example: #regexp {bli bla blo} {bli {.*} blo} {#show &;1} Comment: Like an alias or function #regex has its own scope. Related: pcre and replace.Variables are stored in &;1 to &;99 with &;0 holding the entire matched substring.
Example: #function rnd #math result 1d9;#replace test {%.} {@rnd{}} Related: cat, format, function, local, math, script and variable.The SCAN CSV HEADER event is triggered on the first line of the csv file. The SCAN CSV LINE event is triggered on the second and each subsequent line of the csv file. The %0 argument contains the entire line, with %1 containing the first value, %2 the second value, etc, all the way up to %99.
Values containing spaces must be surrounded with quotes, keep in mind newlines within quotes are not supported. Use two quotes to print one literal quote character.
#scan {dir} &;filename&; &;variable&; The scan dir command will read the given filename or directory and store any gathered information into the provided variable. #scan {json} &;filename&; &;variable&; The scan json command will read the given filename and store the data in the provided tintin variable. #scan {tsv} &;filename&; The scan tsv &;filename&; command reads in a tab separated value file without printing the content to the screen. Instead it triggers the SCAN TSV HEADER event for the first line and SCAN TSV LINE for all subsequent lines. #scan {file} &;filename&; {commands} The scan file command reads the given files and executes the commands argument. &;0 contains the raw content of the file and &;1 contains the plain content. &;2 contains the raw byte size of the file and &;3 the plain byte size. &;5 contains the line count. #scan {txt} &;filename&; The scan txt &;filename&; command reads in a file and sends its content to the screen as if it was sent by a server. After using scan you can use page-up and down to view the file.This command is useful to convert ansi color files to html or viewing raw log files.
Actions, highlights, and substitutions will trigger as normal, and it is possible to create an action to execute #scan abort to prematurely stop the scan.
Related: read and textin.https://tintin.mudhalla.net/protocols/mtts
With the screen reader mode enabled TinTin++ will try to remove or alter visual elements where possible.
Related: configThis is useful for running php, perl, ruby, and python scripts. You can run these scripts either from file or from within tintin if the scripting language allows this.
If you provide a variable the output of the script is stored as a list.
Example: #script {ruby -e ‘print &;#show hello world&;’} Example: #script {python -c ‘print &;#show hello world&;’} Example: #script {php -r ‘echo &;#show hello world&;’} Example: #script {path} {pwd};#show The path is $path[1]. Related: format, function, local, math, replace and variable.If a file name is given the file is only read if the session succesfully connects.
Without an argument #session shows the currently defined sessions.
If you have more than one session, you can use the following commands:
#session {-} Switch to the previous session. #session {+} Switch to the next session. #session {&;number&;} Switch to the given session. Session 0 is the startup session, +1 the first, +2 the second, and -1 is the last session. Sessions are (currently) sorted in order of creation. #gts Switch to the startup session. The name gts stands for global tintin session. #ats Switch to the active session. The name ats stands for active tintin session. not necessarily the calling session. #{name} Activates to the session with the given name. #{name} {command}: Executes a command with the given session without changing the active session. @&;name&;{text}: Parse text in the given session, substituting the variables and functions, and print the result in the current active session.
The startup session is named ‘gts’ and can be used for relog scripts. Do keep in mind that tickers do not work in the startup session.
Example: #event {SESSION DISCONNECTED} {#gts #delay 10 #ses %0 tintin.net 4321} Related: all, port, run, sessionname, snoop, ssl and zap.When you create a session with the #session command you must specify a session name, the session name, prepended with a hashtag, can be used to activate the session when used without an argument. If an argument is given it will be executed by that session as a command, the session will not be activated.
Example: #ses one tintin.net 23;#ses two tintin.net 23;#one;#two grinThis will create two sessions, the session that was created last (two in this case) will be automatically activated upon creation. Using #one, session one is activated. Using #two grin, the grin social will be executed by session two, session one will remain the active session.
If you send a variable to another session it will be substituted before being passed. If you want the variable value of the receiving session to be used you need to use ‘$${variable}’ to properly escape it.
Syntax: @[sessionname]{substitution} If you want to pull the value of a variable from another session you can do so in a similar way as you would use a #function call. Using #showme {@two{$test}} in session one would print the value of $test, as defined by session two. Related: suspendActions can be triggered by the show command. If you want to avoid this from happening use: #line ignore #show {&;string&;}.
Example: #tick {TICK} {#delay 50 #show 10 SECONDS TO TICK!!!} {60} Comment: The #prompt helpfile contains more information on using the option {row} and {col} arguments. Related: buffer, draw, echo, grep and prompt.You can toggle off snoop mode by executing #snoop a second time.
By using the scroll argument you will snoop the session’s scroll region which will overwrite the display of whichever session is active. You can change the size and location of a session’s scroll region by using the #split and #screen scrollregion commands.
Related: all, port, run, session, sessionname, ssl and zap.You can enable speedwalking with #CONFIG {SPEEDWALK} {ON}.
Example: Without speedwalk, you have to type: s;s;w;w;w;w;w;s;s;s;w;w;w;n;n;w With speedwalk, you only have to type: 2s5w3s3w2nw SPEEDWALK V2 Modern MUDs have increasingly adopted the use of diagonal exits, like ne, nw, sw, and se. To make accomodations for this the #map and #path command no longer interpret nesw as a speedwalk and require this to be written as 1n1e1s1w, which then allows 2ne2e to execute ne;ne;e;e.Speedwalks entered on the input line continue to use the v1 system.
The #path load command is backward compatible with v1 speedwalks and to load v2 speedwalks the #path unzip command needs to be used, unless the speedwalk was saved using #path save in which case a v2 compatible format is used that can also contain timing data.
Example: #path unzip 3n1e2nw Example: #map move 3ne1d Related: keypad, mapping and repeat.#split allows the creation of a top status bar, a left and right status bar, a scrolling region, a bottom status bar, and an input line.
╭────────────────────────────────╮ │ top bar │ ├──────┬──────────────────┬──────┤ │ left │ scrolling │ right│ │ bar │ region │ bar │ ├──────┴──────────────────┴──────┤ │ bottom bar │ ├────────────────────────────────┤ │ input bar │ ╰────────────────────────────────╯ By default the bottom status bar is filled with dashes — and subsequently it is also known as the split line. The scrolling region is also known as the main screen and this is where all incoming text is displayed by default.If you use #split without an argument it will set the height of the top status bar to 0 lines and the bottom status bar to 1 line.
If you use #split with one argument it will set the height of the top status bar to the given number of lines and the bottom status bar will be set to 1 line.
If you use two arguments the first argument is the height of the top status bar and the second argument the height of the bottom status bar.
The third and fourth argument are optional and default to 0.
The fifth argument is optional and sets the size of the input bar, it defaults to 1.
It is possible to use negative arguments in which case the bar width defines the minimum width of the scrolling region.
Example: #split 0 0 This will create a split screen with just a scrolling region and an input line. Great for the minimalist. Example: #split 1 1 0 -80 This will create a split screen with a single line top and bottom bar. The left bar has a width of 0 while the right bar will be of variable width. If for example the screen is 100 columns wide, 80 columns will be used for the scrolling region, leaving a right bar with a width of 20 columns.To avoid displaying problems it’s suggesed to use #prompt to capture the prompt sent by the MUD.
Comment: You can display text on the split line(s) with the #prompt and #show {line} {row} commands. Comment: You can remove split mode with the #unsplit command. Related: echo, prompt and showme.#break #case {value} {true} #continue #default {commands} #else {commands} #elseif {expression} {true} #foreach {list} {variable} {commands} #if {expression} {true} #loop {min} {max} {variable} {commands} #parse {string} {variable} {commands} #return {value} #switch {expression} {commands} #while {expression} {commands}
Related: mathematics, pcre and repeat.The %1-%99 variables can be used to capture text and use it as part of the new output.
Color codes can be used to color the new text, to restore the color to that of the original line the &;900&; color code can be used.
If only one argument is given, all active substitutions that match the argument are displayed. Wildcards can be used, see ‘#help regex’ for additional information on that subject.
If no argument is given, all subs are displayed.
Example: #sub {Zoe} {ZOE} Any instance of Zoe will be replaced with ZOE. Example: #sub {~\e[0;34m} {\e[1;34m} Replace generic dark blue color codes with bright blue ones. Example: #sub {%1massacres%2} {&;018&;%1&;118&;MASSACRES&;018&;%2} Replace a line containing ‘massacres’ with ‘MASSACRES’ in red. Comment: See ‘#help action’, for more information about triggers. Comment: See ‘#help colors’, for more information. Comment: You can remove a substitution with the #unsubstitute command. Related: action, gag, highlight and prompt.All variables and functions can be escaped by doubling the sign, like $$variable_name or @@function_name. To escape a variable twice use $$$var_name. One escape is removed each time tintin needs to substitute a variable or function.
Arguments %0 - %99 The percent sign followed by a number is used for arguments by the following triggers:alias, action, button, event, function, prompt, and substitute.
&;0 - &;99 The ampersand sign followed by a number is used for arguments in the regex and replace commands.All trigger and command arguments can be escaped by doubling the sign like %%1 or &;&;1. One escape is removed each time tintin substitutes trigger or command arguments. To escape three times triple the sign like %%%1, etc.
Colors &;000&; Three alphanumeric characters encapsulated by the less- and greater- than signs are used for 4 and 8 bit color codes. &;0000&; Either a B (background) or F (foreground) followed by three hexadecimal characters encapsulated by &; &; signs are used for 12 bit color codes. Requires truecolor capable terminal. &;0000000&; Either a B (background) or F (foreground) followed by six hexadecimal characters encapsulated by &; &; signs are used for 24 bit color codes. Requires truecolor capable terminal.More information is available at #help color.
Escapes \ The back slash is used to escape a character. All available options are listed at #help escape. Escapes are typically escaped when text leaves the client, by being sent to a server, the shell, being displayed on the screen, or being processed as part of a regex. Escapes try to mimic escapes in PCRE when possible. Related: characters, colors, escape_codes and pcre.Temporarily suspends tintin and returns you to your shell. To return to tintin, type ‘fg’ at the shell prompt.
While suspended your tintin sessions will freeze. To keep a suspended session running use the #daemon command.
Related: sessionnameWhen comparing strings both the switch and case arguments must be enclosed in quote characters.
If the ‘default’ command is found and no ‘case’ statement has been matched the default command’s argument is executed.
Example: #switch {1d4} {#case 1 cackle;#case 2 smile;#default giggle} Related: statementsIf no tabs are defined tintin will use the scrollback buffer for auto tab completion.
Tabbing behavior can be modified with the #cursor tab command which by default is bound to the tab key.
Example: #macro \t #cursor tab list scrollback caseless forward Comment: You can remove a tab with the #untab command. Related: alias, cursor, history, keypad, macro and speedwalk.The delay is in seconds and takes a floating point number which is cumulatively applied to each outgoing line.
Related: scan and send.When using %t the argument should contain strftime format specifiers. Below are some common specifiers, see man strftime for the full list.
%a Abbreviated name of the day of the week (mon … sun). %A Full name of the day of the week. (Monday … Sunday) %b Abbreviated name of the month (Jan … Dec) %B Full name of the month. (January … December) %C 2 digit numeric century. (19 … 20) %d 2 digit numeric day of the month (01 … 31) %H 2 digit numeric 24-hour clock hour. (00 … 23) %I 2 digit numeric 12-hour clock hour. (01 … 12) %j 3 digit numeric day of the year (001 … 366) %m 2 digit numeric month of the year (01 … 12) %M 2 digit numeric minute of the hour (00 … 59) %p Abbreviated 12 hour clock period (AM … PM) %P Abbreviated 12 hour clock period (am … pm) %S 2 digit numeric second of the minute (00 …59 %u 1 digit numeric day of the week (1 … 7) %U 2 digit numeric Sunday week of the year (00 … 53 %w 1 digit numeric day of the week (0 … 6) %W 2 digit numeric Monday week of the year (00 … 53 %y 2 digit numeric year. (70 … 38) %Y 4 digit numeric year. (1970 … 2038) %z 5 digit timezone offset. (-1200 … +1400) %Z Abbreviated name of the time zone. (CET, GMT, etc)
Related: echo, event and format.Triggers can be disabled with the #ignore command. The #message command can be used to disable messages generated or related to the corresponding trigger, though this is generally not needed.
The #debug command will generate useful debugging information for the corresponding trigger when enabled. The #info command can be used on triggers to generate additional information that might be of use.
Example: #info event onWhen #info event is set to on you will see when most events are raised. Since this can get rather spammy some of the events won’t generate messages, unless you have an event in the same category set already.
Text triggers When a block of text arrives from the host it is split into individual lines, and all action, prompt, gag, substitute, and highlight triggers are checked for each line. Only one action can trigger per line, while the other triggers can trigger multiple times. Packet fragmentation MUDs that send long blurbs of text, don’t have MCCP support, have a bad connection, or a combination of all three, will deliver broken packets. This can cause triggers to not fire, as well as displaying problems if #split is enabled.To mitigate this you can use
#config packet_patch 0.5.TinTin++ will automatically enable packet patching if the IAC GA or IAC EOR telnet sequences are used to mark the end of the prompt. A MUD can negotiate the EOR option: https://tintin.mudhalla.net/protocols/eor
In addition #prompt can be used to make packet patching less noticable.
Color triggers By default most color, control, and vt100 codes are stripped from incoming text before being ran through the trigger engine. To create a trigger that runs on the unstripped text, the regular expression in the trigger should start with a ~.To view control codes you can use
#config convert_meta on which will translate both input and output codes to PCRE escape sequences. Multi-line triggers If an action or substitution contains the \n sequence it will be turned into a multi-line trigger. A multi-line trigger is executed on incoming blocks of text from the MUD, and they will not trigger if the regular expression spans more than one block. You can visualize incoming blocks by using the following event:#event {RECEIVED OUTPUT} {#echo &;058&;%+80h BLOCK}
Since the %* expression does not capture the \n sequence it is required to use %a to capture multiple lines. To capture the start of the block use \A and for the end use \Z. You can use ^ and $ to capture the start and end of a line.
Multi-line triggers trigger before regular triggers. Multiple multi-line actions can trigger per block, and each multi-line action can trigger multiple times per block. Packet fragmentation is not currently handled.
Multi-line triggers are experimental and subject to change.
Input triggers The alias, history and pathdir triggers are checked for each line of input. The macro and tab triggers are checked for key presses. Time triggers The delay, path, and ticker triggers will execute at a set timed interval. Substitution triggers The function and variable triggers will generally execute right before the final processing of a line of text. Mouse triggers The button trigger is checked for each mouse input. #config mouse must be set to on to enable mouse tracking. Event triggers Events can be used for a wide variety of pre-defined triggers. Related: pcre, substitutions and escape_codes.The name of a variable must exist of only letters, numbers and underscores in order to be substituted. If you do not meet these requirements do not panic, simply encapsulate the variable in braces:
Example: #variable {cool website} {https://tintin.mudhalla.net} #chat I was on ${cool website} yesterday!.Variables can be escaped by adding additional $ signs.
Example: #var test 42;#showme $$testVariables can be nested using brackets:
Example: #var hp[self] 34;#var hp[target] 46You can see the first nest of a variable using $variable[+1] and the last nest using $variable[-1]. Using $variable[-2] will report the second last variable, and so on. To show all indices use *variable[]. To show all values use $variable[]. To show all values from index 2 through 4 use $variable[+2…4].
Nested variables are also known as tables, table generally being used to refer to several variables nested within one specific variable.
It’s possible to use regular expressions.
Example: #show {Targets starting with the letter A: $targets[A%*]To disable using regular expressions start the match with ‘=’.
Example: #show {A target literally defined as A%: $targets[=A%]To see the internal index of a variable use &;&;variable name&;. To see the size of a table you would use: &;targets[] or &;targets[%*]. A non existent nested variable will report itself as 0.
Example: #show {Number of targets starting with A: &;targets[A%*]In some scripts you need to know the name of a nested variable. This is also known as the key, and you can get it using *variable. For example *target[+1]. To get the first variable’s name use *{+1}.
It’s also possible to declare a table using brace notation. Using #var hp[self] 34 is the equivalent of #var {hp} {{self}{34}}. This also allows merging tables. #var hp[self] 34;#var hp[target] 46 is the equivalent of #var {hp} {{self}{34} {target}{46}} as well as #var {hp} {{self}{34}} {{target}{46}} or if you want to get creative the equivalent of #var hp[self] 34;#var {hp} {$hp} {{target}{46}}.
Comment: You can remove a variable with the #unvariable command. Related: cat, format, function, local, math, replace and script.When a ‘while’ command is encourated, the conditional is evaluated, and if TRUE (any non-zero result) the commands are executed. The ‘while’ loop will be repeated indefinitely until the conditional is FALSE or the #BREAK or #RETURN commands are found.
The ‘while’ statement is only evaluated if it is read, so you must nest it inside a trigger, like an alias or action.
The conditional is evaluated exactly the same as in the ‘math’ command.
Example: #math cnt 0;#while {$cnt &; 20} {#math cnt $cnt + 1;say $cnt} Comment: See ‘#help math’, for more information. Related: statementsBy default you cannot write to .map files to prevent accidentally overwriting a map file. Use the FORCE argument to ignore this protection.
Related: log, read, scan and textin.