Difference between revisions of "Tintin"

From Flexible Survival
Jump to: navigation, search
m
m (Stitching void rooms within a grid.)
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
For anyone who wishes to use TinTin++ here are a few handy Flexible Survival scripts which you can use (or cut and paste out of). This probably isn't the ideal way to go about this and, frankly, I find the scripting language in TinTin++ to be pretty obtuse but it's a good client otherwise.
+
==Install==
  
The commands that follow should be copied into their own files in a folder of your choosing. Strictly speaking you could copy everything into one text file but I like keeping things seperate for experimenting. My scripts are in a folder called tt in my home directory. You can start them with TinTin++ from the command line using:
+
===Required packages (for Debian Linux)===
  
tt++ tt/start
+
Become root, either via '''sudo -i''' or some other method.
  
 +
Run all of these commands as '''root''' (yes, bash is probably pre-installed, this is just making sure).
  
Generic connection script, note that this is linux based so the log file location needs to be changed if you're using WinTin in linux I save it with the name 'start':
+
apt-get update
<pre>
+
apt-get install tmux tintin++ bash git nano \
#session fs flexiblesurvival.com 2000
+
libcommon-sense-perl \
#split
+
libdatetime-perl \
#log {overwrite} {/home/user/tt/log}
+
libdatetime-event-sunrise-perl \
 +
libfile-changenotify-perl \
 +
libfile-pid-perl \
 +
libjson-perl \
 +
libtest-lwp-useragent-perl \
 +
libpath-class-perl \
 +
libtime-duration-perl
  
#nop insert your own login details
+
Type '''exit''' (or ctrl+d) to end the session if you opened a new root session for this.
#send connect username password
 
  
#nop seems to fix minor formatting issue
+
FIXME: Are Getopt::Long and Term::ANSIColor built in, there don't seem to be Debian packages.
#config {packet patch} {0.5}
 
  
#nop Prevent the session from timing out
+
===Download the script package===
#nop some other timed events can be added here too
 
#TICKER {keepalive} {#cr} {300.00}
 
#TICKER {timestamp} {time} {120}
 
  
#nop you can read in other script files
+
Next, run these commands as your normal user account (not root).  Replace any bold names with file-paths of your choosing.  Also remember that once a path exists, tab-complete often works for typing it out.
#read tt/scripts
 
  
#nop this prints out the time, the delay above calls it every two minutes
+
cd '''AnywhereYouWant'''
#nop handy to remind you it's 4am and you should probably sleep.
+
git clone https://gitlab.com/inutt/flexible-survival-ui.git '''fs-ui'''
#alias {time}
+
chmod +x '''fs-ui'''/flexible_survival
{
+
'''fs-ui'''/flexible_survival
        #format line {%c%t} {light green} {%T};
 
        #showme {$line}
 
}
 
</pre>
 
  
 +
===Very minimal config.json===
  
Here's the main script - note the extra, unused variables and scope for expansion. I saved mine with the name 'scripts'.
+
nano '''fs-ui'''/config.json
Remember that this needs '''your''' character name so replace Anden in the script where you see it!
 
Note that this assumes you want chat channels and health/energy stats in separate windows.
 
<pre>
 
#config {packet patch} {0.5};
 
  
#send {botmode off}
+
Above nano is used to edit the config file, if you prefer a different editor use that.  The launcher script should have setup the config file to be readable only by admins (root) and your exact user account.
#var boton 0
 
#var battle 0
 
  
#nop This section of code dumps out anything with the channel name into a seperate file. You'll need to use
+
* '''"character": "",''' and
#nop tail -f tt/chatlog in a seperate window to see this
+
* '''"password": "",''' MUST be filled out.
#event {RECEIVED LINE}
 
{
 
    #act {^[Public] %*$} {#line logverbatim {tt/chatlog} {%0}; #line gag};
 
    #act {^[Newbie] %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^<OOC> %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^[Science] %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^[Lfg] %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^[Auction] %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^[Bile] %*$} {#line log {tt/chatlog} {%0}; #line gag};
 
    #act {^[Rp] %*$} {#line log {tt/chatlog} {%0}; #line gag}
 
}
 
  
#send stats
+
JSON ignores non-printing 'whitespace' and requires that a key/value sets (contained in { } and called an object) have values in the middle separated by commas, but NO comma at the end.  {"character": "USER", "password": "PASSWORD"}. Any values you don't want to change can be deleted. Thus this might be an example minimal configuration file:
#act {HP[%6/%7                  %21]} {#var hpnow %6; #var hpmax %7}
 
#act {XP [  %8]Freecred[ %9]} {#var xp %8; #var freecred [%9]}
 
#act {Energy[ %10/ %11 %21]} {#var ennow %10; #var enmax %11}
 
#act {Level[ %12] XP to Level[ %13]Mako [  %14] Tokens[  %15]} {#var lvl %12; #var xpneeded %13; #var mako %14; #var tokens %15}
 
#act {Hero              [ %16] Resources          [%17]} {#var heropts %16; #var resources %17}
 
  
#highlight {Anden} {red}
+
{
 +
    "fs": {
 +
        "character": "YOURUSER",
 +
        "password": "YOURPASS"
 +
    }
 +
}
  
#act {Type +reward now!} {+reward}
+
In the above the extra commas after the password line, and that closing } after the "fs" key have been removed.  Again, the whitespace doesn't matter, so it could also be just (with no spaces even).
#act {(You sense a new message at OOC - %1 by Avatar: +REWARD)} {+reward}
 
  
#act {^<Botmode> Your bot mode is now enabled} {#var boton 1}
+
{"fs":{"character":"YOURUSER","password":"YOURPASS"}}
#act {^<Botmode> Your bot mode is now disabled} {#var boton 0}
 
  
#act {<InGame> The fight is over} {#if {"$boton" == "1"} {search web}}
+
===Setting where the window splits to panes===  
#act {<InGame> You ran into a puzzle} {#if {"$boton" == "1"} {search web}}
 
#act {<InGame> Your battle ended unexpectedly!} {#if {"$boton" == "1"} {search web}}
 
  
#act {You are holding as much XP as you can} {#send botmode off}
+
The numbers in the '''tmux''' section are how you configure the split of the window. You'll probably want to keep them and change them to suit your own needs.
#act {<InGame> You are out of patrol points.} {#send botmode off}
 
#act {^<Random Encounter> Anden is ambushed!} {#send target 1.; #var battle 1}
 
#act {^<///////} {#var battle 0; #if {"$boton" == "1"} {#send {mprompt}}}
 
#act {^<%6/%7 hp %10 /%11 m 0 /0 mv}
 
{
 
    #line gag;
 
    #var hp_temp $hpnow;
 
    #var en_temp $ennow;
 
    #var hpnow %6;
 
    #var hpmax %7;
 
    #var ennow %10;
 
    #var enmax %11;
 
    #math {hp_percent}{100 * $hpnow / $hpmax};
 
    #math {en_percent}{100 * $ennow / $enmax};
 
    #format {stat} {%c%t %cHP: %s  %cEN: %s} {white} {%T} {light green} {$hp_percent} {blue} {$en_percent};
 
    #line log {tt/hp} {$stat}
 
}
 
</pre>
 
  
 +
    14 chat
 +
  ------+-----------
 +
  status|
 +
  ------|  main
 +
  map 27|
 +
  64=>  |
 +
    "chat_height": 14,
 +
    "map_width": 64,
 +
    "map_height": 27,
 +
    "status_height": 16
  
If you like your chat time stamped replace the #EVENT in the code above with this one:
+
Note: '''status_height''' doesn't actually set the height.  It tells the status update script how tall this section is so that it ''might'' omit some spacing or features to fit.
<pre>
 
#event {RECEIVED LINE}
 
{
 
    #act {^[Public] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Newbie] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^<OOC> %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Science] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Lfg] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Auction] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Bile] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Rp] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
    #act {^[Update] %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
 
  
    #act {^You page, %* to %*$} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag};
+
===Final config.json===
    #act { pages, %* to you.} {#format {temp} {%t %0} {%T}; #line log {tt/chatlog} {$temp}; #line gag}
 
}
 
</pre>
 
  
 +
You probably also want to set "data_dir": "SOMETHING", which is where your map data and log files will be stored.  This won't be created for you, so make sure you create it first. E.G.
  
I hope this is useful, if you do like it and use it you can compensate me with hugs! ^_^
+
mkdir "~/Documents/Flexible Survival Logs"
  
Anden :3
+
Then your config.json file might look something like this
 +
nano '''fs-ui'''/config.json
 +
 
 +
{
 +
    "tmux": {
 +
        "session_name": "Flexible Survival",
 +
        "chat_height": 14,
 +
        "map_width": 64,
 +
        "map_height": 27,
 +
        "status_height": 16
 +
    },
 +
    "fs": {
 +
        "character": "YOURUSER",
 +
        "password": "YOURPASS",
 +
        "data_dir": "~/Documents/Flexible Survival Logs"
 +
    }
 +
}
 +
 
 +
If you want near-realtime weather, please sign up for [https://home.openweathermap.org/users/sign_up An OpenWeatherMap account] and make sure you retain and fill out the '''api_key''' with your account key. (NOT a login/password, but an account token that looks a bit like HEX00341AFEAAA0358 but longer, and probably actually all hex.)
 +
 
 +
If you're using WSL this gets more complicated.  "/mnt/c/Users/WindowsAccountName/My Documents/Flexible Survival Logs" might work for most.  If it doesn't, talk to whomever maintains the PC.  Tab-completion is really helpful here... mkdir /mnt/c/User (TAB) and then hit tab a couple more times to get a good guess at user account and My Documents locations to start in.
 +
 
 +
With that setup you SHOULD be able to (after setup!)
 +
 
 +
===Get updates===
 +
 
 +
cd '''fs-ui'''
 +
git pull
 +
 +
This can be run any time (in where-ever you had the download stored).  If there are any updates or bugfixes; though you might need to update your config.json file to use new features.
 +
 
 +
==Connect==
 +
 
 +
* '''fs-ui'''/flexible_survival
 +
 
 +
When running '''Ctrl+B (arrow key)''' (hold down control, tap b, release both; then press an arrow key) can be used to move the input-focus between panes (text areas within that window).  '''Up''' and '''Down''' arrow keys are the ones you'll care about.  Up to go to the chat channels, down to go back to muck input.  You type all commands in the main muck window, even though the text shows up above.
 +
 
 +
==Automapping==
 +
 
 +
Inutt automated a lot of the mapping stuff, the 80% of it that's easy and not dependent on foreknowledge of inconsistencies.
 +
 
 +
On perfectly grid like streets, where all of the rooms are pixels on a grid, it works very well.
 +
 
 +
===Undo===
 +
 
 +
If you tried to go a given direction, and it wasn't a valid direction, you MAY need to undo.  Inutt's main.tin script catches some, but not all, of these error messages.  Undo will move you back on the map and delete the most recently created room.
 +
 
 +
#map undo
 +
 
 +
===Leaving the Grid (in a grid direction)===
 +
 
 +
When you _leave_ the main streets, the room-scale changes. For any combination of N, E, W, S, U, D that is NOT on the same 3D grid you need to insert a void room to tell the auto-mapper you're leaving that scale and thus also map.
 +
 
 +
Unfortunately due to the way TinTin++'s mapping works you have to do this 'in reverse' (after you've already left the grid).
 +
 
 +
DIRECTIONOUT is whichever way goes back the way you came.  DIRECTIONIN is the direction you'd take FROM that other room to go back to where you're actually standing now.
 +
 
 +
#map insert DIRECTIONOUT void
 +
#map goto VNUM (the void room ID that got created)
 +
#map roomflag hide
 +
#map move DIRECTIONIN
 +
 
 +
===Leaving the Grid (not a cardinal direction)===
 +
 
 +
When entering a room that is NOT one of the cardinal directions you'll first need to 'dig' a room towards that path.
 +
 
 +
#map dig OFFGRID new (if you've never been there before, new is optional)
 +
#map dig OFFGRID VNUM (the number of the room you're going back to)
 +
 +
#map info (will list info about the current room, including 'exits' that lead here)
 +
 +
An example, Zypher's Front Door and Main Lobby.
 +
 
 +
#map dig o
 +
o
 +
#map info
 +
#map dig z ROOMID
 +
 
 +
You get the ROOMID from the Entrance list in the info dump.
 +
 
 +
===Searching for what you want===
 +
 
 +
While you might think that '''#map find''' is what you want, it isn't.  This finds a route to someplace you might be thinking of.  If you want a list of results, that's what '''#map list''' is for.  (I know, someone years ago should have called 'find' 'route' instead.)
 +
 
 +
This can be rather useful for getting a list of rooms in an area.  Like Zypher's building.  Which has both an elevator and a stairwell.
 +
 
 +
Go up/down the stack in Zephyr if you haven't already.  Since my gohome takes me to Triage, Basement 1 I like to '''dig''' E1 from there first.
 +
 
 +
#map list {roomarea} {Zephyr Inc}
 +
#map dig e1
 +
e1
 +
 
 +
I'm going to use the names in this example in place of VNUMs, please use the VNUM instead.
 +
 
 +
Inside of E1
 +
#map dig b1 Living Quarters & Child Care, Basement 1
 +
#map dig f1 Main Lobby, Floor 1
 +
#map dig f2 Main Lobby, Floor 2
 +
#map dig f3 Main Lobby, Floor 3
 +
#map dig f4 Circular Hallway, Floor 4
 +
#map dig b2 Dormitories
 +
#map dig b3 new
 +
#map info
 +
 
 +
I hadn't been to b3 yet, '''new''' is optional, but clarifies the directions.  The NEXT info command shows there isn't an exit back to e1 yet.  The dig command will be used to create one (use the VNUM from the info run while above, inside of E1).
 +
 
 +
b3
 +
#map info
 +
#map dig o VNUM
 +
o
 +
b2
 +
#map dig e1 VNUM
 +
e1
 +
f1
 +
#map dig e1 VNUM
 +
e1
 +
f2
 +
#map dig e1 VNUM
 +
e1
 +
f3
 +
#map dig e1 VNUM
 +
e1
 +
f4
 +
#map dig e1 VNUM
 +
 +
===Delete / Remove an Exit (unlink)===
 +
 
 +
The command isn't any of the words you'd probably think to look for; Not Delete (which kills a room, by VNUM or relative exit towards), Nor is it Remove (not a command), it's Unlink.
 +
 
 +
#map unlink ExitDirection
 +
 
 +
===Global Teleports===
 +
 
 +
A special, in this case for normal players fake, room is needed for holding a list of 'exits' that work globally (anywhere).
 +
 
 +
In my example beneath, I went to my respawn point and decided to call 'GLOBAL', an exit that doesn't exist, the way to the global room.
 +
 
 +
Note your current '''Room vnum:''' room number to return to, this will be called VNUMBACK later.  Then move the context of the map system to the newly created GLOBAL room.
 +
 
 +
#map info
 +
#map dig GLOBAL
 +
#map goto VNUM(from dig's new room)
 +
#map set {roomarea} {GLOBAL}
 +
#map set {roomname} {GLOBAL}
 +
#map info
 +
 +
You can use #map list {roomarea} {GLOBAL} to find this room's vnum again, these don't all have to be added at the same time; you can return later to add new 'global exists' as you find more one line commands that uniquely take you to an exact room.  This is less helpful for, E.G. scripted NPC movements (like going to bed with an NPC in their room, or to another city).
 +
 
 +
#map list {roomarea} {GLOBAL}
 +
#map goto VNUM
 +
#map dig gohome VNUM
 +
#map dig home VNUM
 +
#map dig respawn VNUM
 +
#map dig upgrade dojo VNUM
 +
#map dig tport ...
 +
...
 +
#map goto VNUMBACK (that VNUM of where you actually are on the MUCK / MUD)
 +
 
 +
===Eureka===
 +
 
 +
Eureka is recent enough to have an OK coverage on the [https://flexiblesurvival.com/mapping official map].  However as you can see from glancing at it, there will need to be a judicious use of void (but not hidden) rooms to make the scaling match.
 +
 
 +
#map insert (directionback) void
 +
 
 +
The actual bad part comes with inserting void rooms to join spans.
 +
 
 +
#map leave
 +
#map return
 +
(Note the room number)
 +
... Go around the gap
 +
#map dig ((direction of gap)) ((actual room number))
 +
#map insert ((direction of gap)) void
 +
(Note the ***void***room number)
 +
((direction of gap; this moves you to the side that's missing a - (has a space instead) ))
 +
#map dig ((Direction towards that new voidroom)) ((voidroom number))
 +
 
 +
===Off the Map===
 +
 
 +
This pair of commands allows you to stop adding to the map automatically, and then toggle it back on when you've returned to the same room you started the command inside of.
 +
 
 +
#map leave
 +
#map return
 +
OR
 +
#map goto VNUM (useful if you gohome / etc)
 +
 
 +
As another reminder, you can also search for the room area (between the [ ] brackets) to get a room VNUM to return to if you've gone to a different spot.
 +
 
 +
#map list {roomarea} {AREA NAME}
 +
 
 +
==Windows 10 WSL==
 +
 
 +
If you'd like to use TinTin++ on Windows, installing a [https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux WSL] based distribution such as Debian is highly recommended.  If you have experience with a different distribution maintaining a server, including getting perl5 dependencies installed based on error messages, then go ahead and go with that.  Debian has been selected here for being focused on Freedom, Liberty, and Stability, as well as generally providing clear directions for upgrades.
 +
 
 +
Note: Windows 10 S tries to be a "safe" OS that [https://devblogs.microsoft.com/commandline/will-linux-distros-run-on-windows-10-s/ restricts user freedom, and thus won't run even WSL].  They also offer an upgrade, for a fee, to normal-freedom Windows 10 (no S).
 +
 
 +
Please follow Debian's [https://wiki.debian.org/InstallingDebianOn/Microsoft/Windows/SubsystemForLinux official guide] for installing on WSL.  It will likely have links updated as versions of things change.
 +
 
 +
==History==
 +
 
 +
[https://en.wikipedia.org/wiki/TinTin%2B%2B TinTin++] is the result of almost 30 years of development by a series of programmers.  While an absolute dinosaur of a computer from the era of it's origin in the mid 1990s probably couldn't run it today, just about anything from the last 20 years probably can.
 +
 
 +
Several older versions of this wiki page exist (updated during 2013 and 2015) with the final version of that series updated on [https://wiki.flexiblesurvival.com/index.php?title=Tintin&oldid=310992 2015-08-25T14:09:09] you might find Anden's examples useful if interested in battle tactics, though they're written assuming python2 (which is no longer supported); while Inutt's code repository uses some perl5 helpers that could be replaced or omitted entirely without breaking the basic multipane functionality. (They help produce the formatted status window and optionally near realtime weather.)
 +
 
 +
Inutt, one of the coding wizards for FS, has a nice setup for TinTin that's published on their [https://gitlab.com/inutt/flexible-survival-ui GitLab] page.  Ketsueki made some small contributions (currently a pull request) to make it more suitable for users with different terminal sizes.  Though it does expect a computer screen capable of displaying at least 120 columns of characters across (in that case a split of about 29 for the map and status area, and thus 90 or so for the main text area is recommended).  If you're on a 1080p+ monitor, using a normal Graphical User Interface (E.G. Windows, OS X, anything else that runs a web browser) and using a full-screen "terminal" program of any sort (find one you like for your OS) you probably do have that many columns.

Latest revision as of 08:33, 11 May 2020

Install

Required packages (for Debian Linux)

Become root, either via sudo -i or some other method.

Run all of these commands as root (yes, bash is probably pre-installed, this is just making sure).

apt-get update
apt-get install tmux tintin++ bash git nano \
libcommon-sense-perl \
libdatetime-perl \
libdatetime-event-sunrise-perl \
libfile-changenotify-perl \
libfile-pid-perl \
libjson-perl \
libtest-lwp-useragent-perl \
libpath-class-perl \
libtime-duration-perl

Type exit (or ctrl+d) to end the session if you opened a new root session for this.

FIXME: Are Getopt::Long and Term::ANSIColor built in, there don't seem to be Debian packages.

Download the script package

Next, run these commands as your normal user account (not root). Replace any bold names with file-paths of your choosing. Also remember that once a path exists, tab-complete often works for typing it out.

cd AnywhereYouWant
git clone https://gitlab.com/inutt/flexible-survival-ui.git fs-ui
chmod +x fs-ui/flexible_survival
fs-ui/flexible_survival

Very minimal config.json

nano fs-ui/config.json

Above nano is used to edit the config file, if you prefer a different editor use that. The launcher script should have setup the config file to be readable only by admins (root) and your exact user account.

  • "character": "", and
  • "password": "", MUST be filled out.

JSON ignores non-printing 'whitespace' and requires that a key/value sets (contained in { } and called an object) have values in the middle separated by commas, but NO comma at the end. {"character": "USER", "password": "PASSWORD"}. Any values you don't want to change can be deleted. Thus this might be an example minimal configuration file:

{
    "fs": {
       "character": "YOURUSER",
       "password": "YOURPASS"
    }
}

In the above the extra commas after the password line, and that closing } after the "fs" key have been removed. Again, the whitespace doesn't matter, so it could also be just (with no spaces even).

{"fs":{"character":"YOURUSER","password":"YOURPASS"}}

Setting where the window splits to panes

The numbers in the tmux section are how you configure the split of the window. You'll probably want to keep them and change them to suit your own needs.

    14 chat
 ------+-----------
 status|
 ------|   main
 map 27|
 64=>  |
   "chat_height": 14,
   "map_width": 64,
   "map_height": 27,
   "status_height": 16

Note: status_height doesn't actually set the height. It tells the status update script how tall this section is so that it might omit some spacing or features to fit.

Final config.json

You probably also want to set "data_dir": "SOMETHING", which is where your map data and log files will be stored. This won't be created for you, so make sure you create it first. E.G.

mkdir "~/Documents/Flexible Survival Logs"

Then your config.json file might look something like this

nano fs-ui/config.json
{
    "tmux": {
        "session_name": "Flexible Survival",
        "chat_height": 14,
        "map_width": 64,
        "map_height": 27,
        "status_height": 16
    },
    "fs": {
        "character": "YOURUSER",
        "password": "YOURPASS",
        "data_dir": "~/Documents/Flexible Survival Logs"
    }
}

If you want near-realtime weather, please sign up for An OpenWeatherMap account and make sure you retain and fill out the api_key with your account key. (NOT a login/password, but an account token that looks a bit like HEX00341AFEAAA0358 but longer, and probably actually all hex.)

If you're using WSL this gets more complicated. "/mnt/c/Users/WindowsAccountName/My Documents/Flexible Survival Logs" might work for most. If it doesn't, talk to whomever maintains the PC. Tab-completion is really helpful here... mkdir /mnt/c/User (TAB) and then hit tab a couple more times to get a good guess at user account and My Documents locations to start in.

With that setup you SHOULD be able to (after setup!)

Get updates

cd fs-ui
git pull

This can be run any time (in where-ever you had the download stored). If there are any updates or bugfixes; though you might need to update your config.json file to use new features.

Connect

  • fs-ui/flexible_survival

When running Ctrl+B (arrow key) (hold down control, tap b, release both; then press an arrow key) can be used to move the input-focus between panes (text areas within that window). Up and Down arrow keys are the ones you'll care about. Up to go to the chat channels, down to go back to muck input. You type all commands in the main muck window, even though the text shows up above.

Automapping

Inutt automated a lot of the mapping stuff, the 80% of it that's easy and not dependent on foreknowledge of inconsistencies.

On perfectly grid like streets, where all of the rooms are pixels on a grid, it works very well.

Undo

If you tried to go a given direction, and it wasn't a valid direction, you MAY need to undo. Inutt's main.tin script catches some, but not all, of these error messages. Undo will move you back on the map and delete the most recently created room.

#map undo

Leaving the Grid (in a grid direction)

When you _leave_ the main streets, the room-scale changes. For any combination of N, E, W, S, U, D that is NOT on the same 3D grid you need to insert a void room to tell the auto-mapper you're leaving that scale and thus also map.

Unfortunately due to the way TinTin++'s mapping works you have to do this 'in reverse' (after you've already left the grid).

DIRECTIONOUT is whichever way goes back the way you came. DIRECTIONIN is the direction you'd take FROM that other room to go back to where you're actually standing now.

#map insert DIRECTIONOUT void
#map goto VNUM (the void room ID that got created)
#map roomflag hide
#map move DIRECTIONIN

Leaving the Grid (not a cardinal direction)

When entering a room that is NOT one of the cardinal directions you'll first need to 'dig' a room towards that path.

#map dig OFFGRID new (if you've never been there before, new is optional)
#map dig OFFGRID VNUM (the number of the room you're going back to)

#map info (will list info about the current room, including 'exits' that lead here)

An example, Zypher's Front Door and Main Lobby.

#map dig o
o
#map info
#map dig z ROOMID

You get the ROOMID from the Entrance list in the info dump.

Searching for what you want

While you might think that #map find is what you want, it isn't. This finds a route to someplace you might be thinking of. If you want a list of results, that's what #map list is for. (I know, someone years ago should have called 'find' 'route' instead.)

This can be rather useful for getting a list of rooms in an area. Like Zypher's building. Which has both an elevator and a stairwell.

Go up/down the stack in Zephyr if you haven't already. Since my gohome takes me to Triage, Basement 1 I like to dig E1 from there first.

#map list {roomarea} {Zephyr Inc}
#map dig e1
e1

I'm going to use the names in this example in place of VNUMs, please use the VNUM instead.

Inside of E1
#map dig b1 Living Quarters & Child Care, Basement 1
#map dig f1 Main Lobby, Floor 1
#map dig f2 Main Lobby, Floor 2
#map dig f3 Main Lobby, Floor 3
#map dig f4 Circular Hallway, Floor 4
#map dig b2 Dormitories
#map dig b3 new
#map info

I hadn't been to b3 yet, new is optional, but clarifies the directions. The NEXT info command shows there isn't an exit back to e1 yet. The dig command will be used to create one (use the VNUM from the info run while above, inside of E1).

b3
#map info
#map dig o VNUM
o
b2
#map dig e1 VNUM
e1
f1
#map dig e1 VNUM
e1
f2
#map dig e1 VNUM
e1
f3
#map dig e1 VNUM
e1
f4
#map dig e1 VNUM

Delete / Remove an Exit (unlink)

The command isn't any of the words you'd probably think to look for; Not Delete (which kills a room, by VNUM or relative exit towards), Nor is it Remove (not a command), it's Unlink.

#map unlink ExitDirection

Global Teleports

A special, in this case for normal players fake, room is needed for holding a list of 'exits' that work globally (anywhere).

In my example beneath, I went to my respawn point and decided to call 'GLOBAL', an exit that doesn't exist, the way to the global room.

Note your current Room vnum: room number to return to, this will be called VNUMBACK later. Then move the context of the map system to the newly created GLOBAL room.

#map info
#map dig GLOBAL
#map goto VNUM(from dig's new room)
#map set {roomarea} {GLOBAL}
#map set {roomname} {GLOBAL}
#map info

You can use #map list {roomarea} {GLOBAL} to find this room's vnum again, these don't all have to be added at the same time; you can return later to add new 'global exists' as you find more one line commands that uniquely take you to an exact room. This is less helpful for, E.G. scripted NPC movements (like going to bed with an NPC in their room, or to another city).

#map list {roomarea} {GLOBAL}
#map goto VNUM
#map dig gohome VNUM
#map dig home VNUM
#map dig respawn VNUM
#map dig upgrade dojo VNUM
#map dig tport ...
...
#map goto VNUMBACK (that VNUM of where you actually are on the MUCK / MUD)

Eureka

Eureka is recent enough to have an OK coverage on the official map. However as you can see from glancing at it, there will need to be a judicious use of void (but not hidden) rooms to make the scaling match.

#map insert (directionback) void

The actual bad part comes with inserting void rooms to join spans.

#map leave
#map return
(Note the room number)
... Go around the gap
#map dig ((direction of gap)) ((actual room number))
#map insert ((direction of gap)) void
(Note the ***void***room number)
((direction of gap; this moves you to the side that's missing a - (has a space instead) ))
#map dig ((Direction towards that new voidroom)) ((voidroom number))

Off the Map

This pair of commands allows you to stop adding to the map automatically, and then toggle it back on when you've returned to the same room you started the command inside of.

#map leave
#map return
OR
#map goto VNUM (useful if you gohome / etc)

As another reminder, you can also search for the room area (between the [ ] brackets) to get a room VNUM to return to if you've gone to a different spot.

#map list {roomarea} {AREA NAME}

Windows 10 WSL

If you'd like to use TinTin++ on Windows, installing a WSL based distribution such as Debian is highly recommended. If you have experience with a different distribution maintaining a server, including getting perl5 dependencies installed based on error messages, then go ahead and go with that. Debian has been selected here for being focused on Freedom, Liberty, and Stability, as well as generally providing clear directions for upgrades.

Note: Windows 10 S tries to be a "safe" OS that restricts user freedom, and thus won't run even WSL. They also offer an upgrade, for a fee, to normal-freedom Windows 10 (no S).

Please follow Debian's official guide for installing on WSL. It will likely have links updated as versions of things change.

History

TinTin++ is the result of almost 30 years of development by a series of programmers. While an absolute dinosaur of a computer from the era of it's origin in the mid 1990s probably couldn't run it today, just about anything from the last 20 years probably can.

Several older versions of this wiki page exist (updated during 2013 and 2015) with the final version of that series updated on 2015-08-25T14:09:09 you might find Anden's examples useful if interested in battle tactics, though they're written assuming python2 (which is no longer supported); while Inutt's code repository uses some perl5 helpers that could be replaced or omitted entirely without breaking the basic multipane functionality. (They help produce the formatted status window and optionally near realtime weather.)

Inutt, one of the coding wizards for FS, has a nice setup for TinTin that's published on their GitLab page. Ketsueki made some small contributions (currently a pull request) to make it more suitable for users with different terminal sizes. Though it does expect a computer screen capable of displaying at least 120 columns of characters across (in that case a split of about 29 for the map and status area, and thus 90 or so for the main text area is recommended). If you're on a 1080p+ monitor, using a normal Graphical User Interface (E.G. Windows, OS X, anything else that runs a web browser) and using a full-screen "terminal" program of any sort (find one you like for your OS) you probably do have that many columns.