Documentation: Difference between revisions

From Dyrdex.com
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
=About=
Realms tintin++ package by Dyrdex. I have no idea what I'm doing, this is my first foray into programming of any sort. Please forgive my terrible terrible coding!
This is a package of configurations for TinTin++. Rather than show actual code here, this documentation will explain how to use the package.  


(An additional document will be created with specific code for common tasks)
=Get the files=
You can curl or wget this stuff. I update it too frequently to keep a tar.gz up there. Should probably switch to github.
http://dyrdex.com/tinrod/


To view the actual code:
=Setup=
Visit http://dyrdex.com/tintin/tintin.dyrdex/
  1. Edit tinrod/main.tin
Download the packages from http://dyrdex.com/tintin/ and open on your system.
 
==What it Does==
Connect to Realms with an alias 'go charname' and...
  -Load a config for that character (Set any specific alias, char's equipment, etc)
  -Load a config for his class      (Set primary 'hit', class triggers (think mage bot), other shared stuff for all chars in class.
  -Load a config based on if you're a magic user or not    (should we cast dispel or wear an amulet, q spring or c spring, etc)
  -Load a config based on guild/order affiliation          (set donation container names, hq navigation aliasing, order heal names, etc)
  -Load configs for 'modules'      (speedwalking, damage tracking, potion tracking, speech logging, etc)
  -Load a set of aliases by which other triggers/configs can be toggled on/off  (toggle re-spell triggers, autofighting, remote control, etc)
 
  Provide some nice features:
  -Speedwalking
  -Autofighting (autoheal + autohit)
  -Inventory tracking, auto-restocking,
  -Custom prompt to show # of potions and spell duration's in prompt.
  -EQ damage tracking and auto-removal
  -Toggle-able re-spell triggers
  -Togle-able run scripting
  -Auto...track/re-arm/search/dig/style/drink/save. no-idle.
  -Botification (Remote control) of alts.
 
==How does it do that?==
 
The connection scripting is explained below to further detail the flowchart of how configs are loaded for each character.
In general, for each character, you get the ability to set things very locally (for that char only) and upwards through other layers (class, genre, organization) until the global layer. This allows all chars that would possibly want to share a config be able to share it, so you the code can exist in a singular place.  
   
   
  The organization of the files somewhat outlines the manner in which each character ends up configured:
  Edit line 26: path to the tinrod directory on your system (i.e. just 'tinrod' if you've got it at ~home/tinrod) and execute tt++ from ~home
Edit line 32 with your password where it says PASSWORD_HERE


  /speech_log.tin              The log of channel text.
  2. Run tintin++ along with the main.tin file, you'll probably want to set a shell alias for this:
    /path/to/tt++ /path/to/tinrod/main.tin
/newtin/...                   The directory containing the goods.
    /main.tin                 Used to connect, read char, class, genre, order, and module configs.
    /mod_config.tin            The module config. Calls various modules contained in /scripts/...
    /scripts/...              Contains various modular scripts, can be called from anywhere, or are toggle-able.
    /characters/...            Contains character config files.
    /classes/...              Contains class config files.
    /genres/...                Contains genre (and organization) config files.
    /runs/...                  Contains run/area specific trigger sets.


==Disclaimer==
3. Connect to the mud using the alias 'go CHARNAME'
I'm not a programmer. I do webserver administration for a living. I know FreeBSD, spend my time watching/tweaking/restarting Apache/MySQL, postfix, firewalls, grepping logs, and piping some basic shell commands together. I have NO clue what I'm doing as far as actual programming of anything, seriously. Someone who knows how to program will likely think I'm a moron, which I fully admit. I'm sure there are wayyyyyy better ways to do some of this, and wayyyyy more stuff you can do if you know how. Unfortunately, I don't know how, so this is just a package that sets me up with the basic functionality, a few nice perks, saves a few keystrokes, and that's about it.
If you DO know how to program this stuff - please by god e-mail me: dyrdex@gmail.com


= Installation Instructions =
4. Setup your character config.
 
    4a: run 'menu' to see all configurable character options.
        NOTE: After setting the 'affiliation' option (to 'ds' presumably) do 'reload'.
              This loads in the current file, and prevents you from overwriting it with a blank one later.
    4b: set your containers and inventory counts by running 'setinv' TWICE (yes do it twice initially)


==Get the files==
5. Setup your equipment damage tracking (or at LEAST setup your weapon, as its required for the disarm trigger).
http://dyrdex.com/tintin/
    Run the following aliases:
    5a: eqon
    5b: (id a piece of equipment via any means)
    5c: keyis KEYWORD
    5d: (repeat id and keyis for every piece of eq)
    5e: eqoff
   
   
Available in both .tar.gz and .zip format, as well as flat files.
    5f: NOTE: for lights and weapons you must manually enter the AC since its not present in 'identify' output.
              After id'ing, do:
              itemac 20  (for lights, and 12 for weapons).  
    5g: acset 


That package actually also contains the tintin source, which you probably already have.  
At this point you should be basically good to go. Most of the other features should 'just work'.  
You really only need the following files:
  /tintin/main.tin
  /tintin/speech_log.tin
  /newtin
Just make sure they remain in that relative structure within your tintin directory.  


If you do wanna run tintin itself out of the source in my archive, the tt++ executable there will need recompiled for your system
I guess, I need to tell you what all those features are....
http://tintin.sourceforge.net/install.php


=Features=
==Stuff in main.tin==
1. Quick Connect/Reconnect, Saving of stuff to your configs.


==Set Your Password==
2. TinTin options
Set your password in line 1 of /tintin/newtin/main.tin
#ALIAS          {go %0} {#ses %0 realmsofdespair.com 4000;%0;PASSWORD_HERE;&& \x0D && #cr};
(All chars must use same password under this setup)


==Connect==
3. Multi-Session control


I am stupid, and coded all paths relative to the tintin directory.  
4. Speech Logging
Add it to your $PATH
  or
cd /path/to/tintin/


Execute the tt++ executable followed by the path to the main.tin script. Like:
5. MSDP Support
./path/to/tintin/src/tt++ /path/to/tintin/newtin/main.tin


I have a bash alias setup for this in my .bashrc:
6. Inventory Tracking
alias runtin='~HOME/tintin/tt++ ~HOME/tintin/newtin/main.tin'


So for me, to run this I do:
7. Gameplay options (trigger on/offs)
cd tintin
runtin


Once tintin is up and running, to connect to the mud use the 'go %0' alias setup in main.tin. %0 is your character name.
8. Gameplay automation
go dyrdex


===Connection Scripting Explained===
9. EQ Tracking
This is just detail on what's happening under the hood, if you just want to start playing, do 'go charname' and skip to [[#Set_Required_Variables]]


10. Mob Tracking


The connection script main.tin contains:
11. Run Scripting
'''Trigger''' "Welcome to Realms of Despair" 
      Reads in:
      Character specific: newtin/characters/CHARNAME_up_stuff.tin
      Global Modules:    newtin/mod_config.tin
**IMPORTANT**
This trigger is essential for ALL other scripting to load.
If you exit out of realms/tintin without issuing 'quit' - i.e. going LinkDead you do not receive the Welcome screen upon next login.
Use the 'reload' alias after LD/RC to manually handle reloading of all configs. Or, quit properly, and log back in.
After successful login, the 'score' command is ran and the "Class:" there sets $char_class variable. Configs are then read based on that:
'''Trigger'''  "Class: %0"
    Reads in
    Class & Genre:      newtin/scripts/class_genre_conf.tin
          This script itself reads in two or more scripts: 
    Class config:      newtin/classes/${char_class}_classconfig.tin  (e.g Thief_classconfig.tin)
    Genre config:      newtin/genres/nonmagics.tin or magics.tin.
          The magic/nonmagic configs setup fly/dispel/createspring aliases based on potion usage or spellcasting.
    Recall script:    newtin/scripts/recallscript.tin
          This is just a simple alias to get/recite recall. However, since Barb's don't do that, I ended up making every class BUT barbs read this script.
          (Barb recalling managed directly out of Barb class config)
          (Vampires also pose a problem as they have SOME spells, they don't read a magic/non config, and are just managed out of their class config)
    Prompt script:    newtin/scripts/mana_prompt.tin  or  nonmana_prompt.tin  or  blood_prompt.tin


Finally, main.tin also triggers upon the presence of "Order:  Dragonslayer" in 'score' and reads in a DS specific config:
===Quick Connect===
  '''Trigger'''    "Order: Dragonslayer"
  Alias: go %0
   
   
    Organization config: newtin/genres/dragonslayer.tin
  This is how you connect. Type 'go dyrdex' for example.
All your chars need to share the same password (which is hardcoded into main.tin line 32)


Upon quitting the game, configs will be saved based on the connected character specifically, and his class.
  Alias: quit
  newtin/characters/CHARNAME_up_stuff.tin
newtin/classes/CLASSNAME_classconfig.tin
   
   
  So, the FIRST time you connect a new charname or class, you may receive a 'cannot read file' type warning since those don't get created until the first quit. Just quit (writes out configs), and you should be able to log back in without any errors.
  The word 'quit' is aliases to write out all your configs before actually quitting the mud.  
 
  This writes: character, class, affiliation, and mobs list to the appropriate configs upon quit.  
==Set Required Variables==
 
1. Upon FIRST login with a char, you must set the Potion and Item(recall) container variables once by running this alias:
  setinv    (Note: I always forget if its setinv or invset, so, I actually set up both, both work, all the time)
 
In case you ever want to set container variables manually, there are also aliases for that:
potcon CONTAINER  (Should set to my.CONTAINER)
itemcon CONTAINER  (Should set to my.CONTAINER)


These vars are saved out to your character config, so should only need set ONCE, or until you change your container setup.
  Alias: saveconf
 
2. Set your HIT variable:
hitis HITNAME (alias for: #var hit HITNAME) (this gets saved to your Class config)
 
3. Set your Weapon name, keyword (used for DISARM trigger), and AC (used for auto-removal pre-scrap)
eqon
(identify your weapon via spell or scroll)
keyis KEYWORD (enter a valid keyword for your weapon, the most unique word available is best)
itemac ##    (weapons have no AC, but eq is stripped if AC is unset or < 4, so set to something higher than 4 or 99 to disable auto-strip)
eqoff
   
   
  do eqstat to confirm the item was stored correctly.
  This does the same thing as 'quit' but without quitting.  
--This is also the eq damage tracking system. See [[#EQ_Damage_Tracking]] for more.  


4. Set the 'wearall' alias for your given set of equipment. (saved to Character config)
===TinTin Config Options===
If you have no layerable equpiment, just do:
    #alias wearlall {wear all}
For Layered gear, obviously make this alias do everything you need. Most of mine are one of these:
    #alias wearall {wear cloak; wear all}
    #alias wearall {wear tunic;wear gamb;wear haub;wear hide;wear gry;wear runecape;wear tab;wear cloak;wear all}


=Commands=
Nothing fancy here, just your basic tintin config options. Set as desired.  
This section provides a general list of aliases which are used either to control tintin stuff itself or are used 'in-game'.  


This section will not reference which config each command is setup in, this is just a general outline of available commands.
===Multi-Session Config===


==Client Commands==
Alias:  (shorthand) (session name)
(Setup in /newtin/main.tin)
These are all configured at the upper-most session level (The GTS session)
'''Save Options'''
charwrite      "Save to character config" mode. (Default)
classwrite    "Save to class config" mode. 
nowrite        "Don't save" mode. Useful for testing and development.
'''Session Options'''
ses#          Toggle to session # 
botson        Has ALL open sessions run 'boton' to enable speech command
botsoff        Has ALL open sessions run 'botoff' to disable speech command
allquit        Has ALL open sessions run 'quit' to logoff.
logall        Runs go A, go B, go C, etc, where A-Z would be your characters. Quick-log army.
'''Load Options'''
reload        Must be run after LD or RC. Since no 'welcome' message occurs, this manually triggers all config loads.
'''Terminal Options'''
line          Runs #split so you get an input line, and custom prompting.
                *Custom prompting only works in this mode, and your game prompt must be configured. See [[#Custom_Prompt]]
unline        Un-split the terminal, back to default game prompt and no text-entry line.


The Following are setup in various scripts under /newtin/scripts. Grepping for them would be the best way to find them specifically.
Since tintin allows you to multi sessions in the background, these let you switch to, or send commands to, bg'd sessions quickly:
'''Prompt Related'''
Since each session we open is named a character name, you can type that character to control that session.  
setnonmanaprompt Sets your in-game prompt so it triggers my tintin replacement prompt - for non-mana using classes.
We can then setup aliases to shorthand those session names even further.  
setmanaprompt  Sets your in-game prompt so it triggers my tintin replacement prompt - for mana users
setbloodprompt Sets your in-game prompt so it triggers my tintin replacement prompt - for blood point users.
setlowbiemanaprompt  Can you guess?
'''AutoFight Related'''
fighton        Enables fight/heal loop
fightoff      Disables fight/heal loop
ver            Runs 'version' which triggers a 'heal or hit' action ONE_TIME (loopable via fighton/off)
hitis BLA      Set 'hit' to BLA
gogo          Fight script gets disabled by'too full' or 'out of heals'. Run gogo to re-enable fight scripting.
'''Speedwalking Related'''
finddir %0    Search the directions list for term %0 to find the short-hand code for the area and display full directions.
'''Inventory/EQ Management'''
findcons      If 'varseton' has been enabled, this will rescan your containers and set those variables for pot_con and item_con
setinv        Runs 'findcons' then scans your inventory and takes stock of potions currently tracked.
potcon BLA    Manually set pot_con to BLA  (would encourage you to actually enter my.BLA)
itemcon BLA    Manually set item_con to BLA (would encourage you to actually enter my.BLA)
'''EQ Tracking Related'''
eqstat        Show all tracked eq db data.
itemfind BLA  Show item BLA in the eq db.
eqon/off      Enable/Disable auto-entry via identify spell/scroll.
eqset          Manually specify a piece of eq as being scanned for entry into the eq db.
itemac %0      Manually set ac/maxAC of item currently specified as being scanned.
keyis %0      Manually set the keyword of the item currently specified as being scanned.
remeq          Remove a piece of eq from the eq db.


==Game Aliases==
Probably best to just look at this section of main.tin to understand this better
recall        finds and uses a recall scroll
You'll want to setup a shorthand for each character.  
repwear        remove all; repair all; wearall
wearall        {wear x; wear y; wear z; etc) For handling layers.  
trackgo MOB    auto track mob
stoptrack      force stop tracking
say mstat      echos current opponent name, level, and health percentage
heal          quaff 1 heal  (q heal $pot_con)
heal4          quaff 4 heals
heale          quaff 8 heals
healup        Heal up to FULL hp  (or, within 99hp really)


blue          quaff dragonslayer orchid mana potion
So, for example, setting this up;
  blueup        quaff up to FULL mana (or, within 89mn really)
  #ALIAS          {dym} {#dymrex}


qtank          quaff tankset
Allows me to control Dymrex, when he is 'backgrounded', by doing:
spring        creates a mystical spring (quaffs potion if non-magic, casts if magic) (so..potions required)
  dym say hello
dispel        wears amulet of dispersal or casts it depending on magic/non char. (amulet required)
shockstick    uses 'a sorcerer's walking stick' to cast shockshield
  firestick      uses 'a staff of Barad-Dur' to cast fireshield
cameo          uses 'a jade cameo' to cast iceshield.


healmin ##    These set your preferred 'on hand' quantities for these potions.
If you want to foreground Dymrex, just do:
sancmin ##    Once in Dragonslayer donation room. Use 'restock' alias to fill up to these levels.
  dym
truemin ##
manamin ##
blindmin ##
  springmin ##


Dragonslayer ONLY:
You can also setup quick connect aliases here to log groups/armies, etc.  
100heals      fills your potion container with 100 heals from the donation shelf
gettank        gets a full tankset from donation shelf and puts it in your potion container.
drotank        get a tankset from your potion container and drop it on the ground.
restock        fills your potion container with pre-set quotas of tracked potions.


==Hit & Target Commands==
  Alias: groupall %0
  hit            ($hit $target) Both $hit and $target variables must be set
hitis HITNAME  Set's preferred hit variable. Alias for (#var hit HITNAME) Saves to CLASS config file.
targ MOB      Set's current target. Alias for (#var target MOB)
say target MOB Same
k MOB          Same.
kil MOB        Same.
bs MOB        Same.
vom MOB        Same.
   
   
  Other initial attack commands could be setup similarly so that your attack itself sets the target.
  Allows you to have all your sessions follow %0 and has %0 group them.  


==On/Off switches==
  Alias: regroup
 
  sancon/sancoff        requaff sanctuary potion upon expiration message
trueon/trueoff        requaff truesight potion upon expiration message
shieldsup/shieldsdown  request for fresh elem-shelds upon expiration via 'say SPELLNAME' (mage must be present)
    ***May revise or setup another option to use shockstick/firestick/cameo instead of requesting from Mage
celeston/celestoff    cleric only. recast of celestial might upon expiration.
tranceon/tranceoff    set magic/cleric to go back to trancing after any cast.
   
   
  varseton/varsetoff    See above. Enable to re-run findcons or setinv to reset/scan variables for containers and potion on-hand numbers.
  Does the same as groupall, but does it again.  
                        **Need to disable afterwards or everytime you pull out a potion/recall it'll reset the number to '1'
eqon/eqoff            Enable triggers to capture item data from 'identify' and update the item database for eq damage tracking.
fighton/fightoff      enable auto fight/heal loop.
immobon/immoboff      toggle re-immobilize trigger to constantly immob mob upon standing back up.
boton/botoff          toggle speech command responsiveness
                        (See [[#Remote_Speech_Command]] for available speech commands)
'''Various run-specific on/offs.'''
runseth/killseth      Load triggers for seth himself
runmith/killmith      Load triggers for golding Mithril Hall
runso/killso          Load triggers for Sin/Olsen
 
==Spell Triggers==
say spellme  - if mage present, casts 'spell' on you
say shields  - if mage present, casts all elemental shields on you
say all      - if cleric/mage present, casts all he can cast on you
*there are mage/cleric triggers for EVERYTHING they cast. See Mage/Cleric config.
 
=Modules=
Upon connection, 'modules' are loaded when main.tin reads in mod_config.tin.
 
I set it up this way so chunks of code could be enabled/disabled for debugging. Over time, will likely consolidate upwards.  


<pre>
=== Speech Logging ===
newtin/scripts/basic_utilities.tin;    --A LOT in here. I keep adding to it. I've commented the script itself with details.
newtin/scripts/dirslist.tin;          --Speedwalking Module
newtin/scripts/quitscript.tin;        --An alias for 'quit' so that it saves char/class aliases/actions to their respective configs.
newtin/scripts/onoffs.tin;            --The toggle-able stuff config, aliasing to turn things on/off.
newtin/scripts/inventory.tin;          --Inventory/Potion tracking and management of 'in-stock' quantities.
newtin/scripts/speech_logging.tin;    --Sets up logging of speech lines to a file (at /tintin/speech_log.tin)
newtin/scripts/eq_tracking.tin        --Sets up equipment stat/damage tracking database
newtin/scripts/msdp.tin                --Sets up MSDP support. Used in custom prompting to display affects.
newtin/scripts/multi.tin              --Sets up aliasing for managing multiple characters from a single session.
newtin/scripts/runs.tin                --Toggle specific run trigger sets on/off. (Runs scripts are in /newtin/runs/)
</pre>


==Basic Utilities==
Log: ~tinrod/speech_logging.tin


This script is heavily commented, so it may just be best to read it directly. Sets up the majority of the basic command aliases and simple triggers.  
This needs work, but for now it just grabs certain channels/socials and logs them.  
Open a second terminal and tail -f /path/to/tinrod/speech_logging.tin


  /newtin/scripts/basic_utilities.tin
  Alias: savelog %0
 
'''Synopsis'''
-Setup basic client related aliases to set what save-mode you're in, split the screen for custom prompting, establish potion/item cons.
-Trigger a "IF damaged, heal. ELSE, hit" statement upon seeing output of 'version' mud command
-Replace the output of ver "SMAUG 2.1" with "AUTOFIGHTING" just for visual clarification of what's happenin
-Targetting/Hit variable setting aliases
-Heal alising & 'getting full/drink spring' management
-'is DEAD!!' alias to turn off any re-spell triggers you may have enabled.
-Recall alias
-Auto Style (style %0 until successful)
-Auto Tracking
-Auto re-search, re-dig
-DISARMS trigger
-DH potion buyer char alias and triggering
-Tankset alias
-Elemental shield item aliases
-Anti-Idle auto-save ticker
 
==Speedwalking==
 
Aliasing to send chars to game areas from DH []
newtin/scripts/dirslist.tin
 
'''Usage'''
goBLA        Speedwalk to area BLA where BLA is my own shorthand for the area name. See list below.
 
Some specific mobs or places: 
gokarl      Go to Karl in KoTR, remove all, repair all, and recall.
goseth      Go the whole way to the Chaos Maze in Seth's Fortress
gojade      From exit of chaos maze, go to outside Jade's room.
govla        Go to Vl'aresch (to favor)
goaen        Go to A'enari (to favor)
 
'''Search Function'''
If you're not sure of what the shorthand key for an area is, you can search for it with the 'finddir' alias
The full directions set is also displayed in case you want to see that for some reason. 
   
   
  finddir BLA  Searches for the term BLA in the dirslist.tin file. Case insensitive, and any term in the area name will work.  
  Will write out your entire buffer to a log file named %0.
NOTE: writes to your current working directory, not within the tinrod directory.  
finddir moon
#NOP Temple of the Moon = tom
#ALIAS {gotom} {nw;w;w;#4 n;e;look painting;open n;n;#49 w;#8 s;sw;#3 w;n};


CURRENT AREA LOCATIONS AVAILABLE:
=== MSDP Support ===
<pre>
#NOP Area Name = Shorthand Key


#NOP Bartok Grove = bar
This *should* 'just work' automatically upon login at this point. If it doesn't, use this alias to 'start' it:
#NOP Shadowport = shad
  Alias: msdp_report
#NOP Morgul Vale = morg
#NOP Blasted Lands = bl
#NOP Salburg = sal
#NOP Coral Depths = cd
#NOP Cursed Lands = cl
#NOP Darkhaven Art Gallery = dag
#NOP Dragon's Pass = dpass
#NOP Elemental Canyon = elem
#NOP Glimwinkles Windmill = glim
#NOP Kontaur = kon
#NOP La Chute Deu L'ancients = lachute
#NOP Lake of Tich'Pyga = tich
#NOP Lamech's Abandoned Manor = lam
#NOP Mithrill Hall = mith
#NOP Mountain of Lost Souls = mols
#NOP Nevermore = nev
#NOP Ocean Keep = ok
#NOP Sentinel = sent
#NOP Seth's Fortress = seth (Whole way to Chaos Maze -- DON'T WALK NORTH BY ACCIDENT)
#NOP Seth's Forress from exit of Chaos Maze to outside Jade's room. = jade
#NOP Shattered Refuge = shat
#NOP Temple of the Moon = tom
#NOP Tree of Life = tol
#NOP Village of Edo = edo
#NOP Village of Tar'pa Cithm (Barbarian Hometown) = barb
#NOP The Wilds = wilds
#NOP Wyvern's Tower = wyv
#NOP Karl the repair guy and recall = karl
#NOP V'laresch = vla
#NOP A'enari = aen
#NOP MacMillan Family Farm = mac
#NOP Dunhill Demesnes = dun


** Incomplete, only have added areas as I go to them really. Many more to add and will probably add more specific people/mobs too.
MSDP Var's Further detail. For use in your own scripting, call msdp stuff as follows:
</pre>
  All variable: $msdp_info
 
  All variables + their values: $msdp_info[]
==Quit Script==
  One thing: $msdp_info[THING] (note caps is required)
newtin/scripts/quitscript.tin
 
This is a stupid simple script that should probably just be condensed up into something else.
 
Sets up 'quit' as an alias for:  
  1. Write all actions/alises under the character_connected class out to the character config file. (e.g newtin/characters/GUY_connected_up.tin
2. Write all actions/alises under the char_class class out to the. (e.g. newtin/classes/Thief_classconfig.tin)
3. Sends the actual 'quit' command to the mod.
 
==Trigger Toggles==
newtin/scripts/onoffs.tin
 
Command aliases to enable/disable triger sets for specific purposes that we don't want enabled all the time:  
  See Above: [[#On.2FOff_switches]]
 
Description of functionality:
  Each 'on' alias does:  
  1. Open new class (sanc_trig in example below)
    Read a script containing the trigger/alias we want into that class (all scripts read out of /newtin/scripts/)
    (Class is closed automatically after read)
2. ReOpen the default character_connected class.
   
   
  Example Code:  
  For all affects: $msdp_info[AFFECTS]
#ALIAS {sancon} {
  For ONE affect$msdp_info[AFFECTS][sanctuary]
        #CLASS {sanc_trig} {read} {newtin/scripts/sanc_trig.tin};
        #CLASS ${char_connected}_up {open};
        }
 
  Each 'off' script simply kills that class, which destroys all triggers/aliases which were setup in it:  
  1. Kill the class that was loaded by the 'on' alias
2. ReOpen the default character_connected class.
   
   
  Code:
  If you're unsure, play around with #showme $msdp_info[THING] and whatnot till you find what you need, or email me.
#ALIAS {sancoff} {
        #CLASS {sanc_trig} {kill};
        #CLASS ${char_connected}_up {open};
        }


==Inventory Mgmt==
=== Inventory Tracking ===
Scripting to track inventory items, restock, etc.
Aliases: varseton/varsetoff, findcons, inventoryupdate, setinv.
Script: newtin/scripts/inv_vars.tin
Script: newtin/scripts/inventory.tin


Initial 'on hand' values are taken by enabling the inv_vars.tin trigger set. We don't always want these triggers enabled however, so they are a toggle.  
I identify a potion container and an item container and save those as variables.  
varseton/varsetoff  (toggle inv_vars.tin triggers to set the following variables upon 'seeing' things via findcons and setinv aliases)
I track a select group of potions/items within those containers and adjust values as used/stocked.  
Values of the most useful potions are displayed in the prompt.


'''newtin/scripts/inv_vars.tin'''  - Sets up triggers for capturing the following variables: 
Important to note that these counts get integrated into 2 other scripts/purposes.  
'''Variable'''        '''Definition'''
1. In the 'ds' affiliation script, there is a 'restock' alias. Set your preferred levels via the 'menu' alias options.
  OHrecalls    On-Hand recall scrolls quantity - can be standard recall scrolls, tribal runes, or Dragonslayer recalls
2. Potion quaffing is tracked, and this used by the autofight script, so that you always drink spring after 8 potions (when fighting).  
  OHheals      On-Hand heal potions quantity  - can be standard violet pots, or Dragonslayer heals.
  OHspringpots  On-Hand create-spring potions quantity
  OHtrues      On-Hand truesight potions
  OHsancs      On-Hand sanctuary potions
  OHblues      On-Hand mana potions (Currently setup for Dragonslayer orchid pots, didn't actually add "blue potions" cuz I forgot.


Additionally, inv_vars.tin contains the pattern matching used by the 'findcons' alias to identify containers and set the pot_cont and item_con variables.
  Alias: clearinv
  '''Container Pattern Matching''' - Currently Supported Containers:  
  Dracocutis of the Isorla
  Gnomish crafted metal potion container
  a laundry basket
  a pouch of purple cloth
  Kahl's Green Dragonhide Pouch
  an old decaying basket
  an extradimensional portal 
  a small birch chest
   
   
  Originally, I had this setup to simply grab a %0 and set that as the var, so it would work with ANY container, but that was problematic.
  Clears inventory tracking values.  
Discrepancies between container names and keywords were a pain to sort out. Given I only use 2/3 containers ever, was easier to script explicitly.
 
'''newtin/scripts/inventory.tin'''
This script is always enabled. It manages the upkeep of inventory 'on hand' values and the math for that.
 
Synopsis of inventory.tin:
-Set minimum values of tracked potions. Useful for 'restock' aliasing, or 'low stock' notifications.
-Increment/Decrement 'on-hand' values based on 'putting' items in the container or 'quaff/recite' usage triggers.


===How to set your inventory===
  Alias: setinv (also invset, because I can never remember which way it goes, so just setup both!)
  The one-step method:  
      setinv -OR- invset (both do the same thing)
 
 
There are multiple aliases you can run if you want to go through things step by step:
Manual step-by-step:
      varseton
      findcons
      inventoryupdate
      varsetoff
 
Running #var you should now see variables setup for your containers and potion quantities.
#VARIABLE {OHheals}={141}
#VARIABLE {OHrecalls}={21}
#VARIABLE {OHsancs}={2}
#VARIABLE {OHspringpots}={6}
#VARIABLE {OHtrues}={2}
#VARIABLE {item_con}={my.laundry}
#VARIABLE {pot_con}={my.draco}
 
===Restocking===
Restocking alias:
Currently, this is only available to chars in Dragonslayer given that it uses DS specific potion names and donation room containers.
newtin/genres/dragonslayer.tin
 
====Configuratation====
Inventory management, adjusting of quantities on-hand, etc, is handled out of newtin/scripts/inventory.tin
 
First, you must configure your preferred minimum-on-hand quantities that you'd like to restock up to.
Set these with the following aliases for 'potion'min ## where ## is the minimum value you want to keep in stock:
   
   
  healmin ##
  This uses 'finditem' to find a heal and a recall, and sets your container variables accordingly.
  manamin ##
  Then, it examines those containers to get counts on the things it tracks upon the sight of them.
  truemin ##
  Then the 'at sight' triggers are disabled so further examinations don't adjust levels anymore.
  sancmin ##
  There are also manual controls, listed below:
springmin ##


====Usage====
  Alias: potcon %0
Be in the donation room (The Dragon's Hoard) and there are several aliases to stock things:
 
  Alias: restock
Usage: Will 'restock' up to defined "Minimum" quotas.
        Only heals, manas, trues, sancs, create-springs are currently tracked.
   
   
  Notes:
  Sets your potions container to %0 (use the keyword for the object)
      For heals, the code is smart enough to 'get' in batches of 10, so you can get large quantities to attain a quota of whatever (default 100)
      For the others, the code is dumber, and if you want/need more then one 'pull' of 10 it's going to fail cuz it'll just try "get ## potion" which you can't carry.
 
Alias: 100heals
Usage: Must be in DS donation room. Uses 'fill' to fill 100 heals into your $pot_con
 
Alias: gettank
Usage: Must be in the DS donation room. Get's a full tankset and puts it in your $pot_con
 
====Incomplete/ToDo====
I need to find all the 'Oops... (potion name) is knocked from your hand' messages and add stock adjustments for those into inventory.tin
 
(Oops messages with heals (ds heals) IS currently setup, so your heal counts SHOULD be accurate)
 
=====Adding additional potions to inventory tracking=====
 
To track additional inventory counts, of anything really, you'll need to set the following:


In /newtin/genres/inventory.tin
  Alias: itemcon %0
  To Set item quota, and usage/restock decrement/increments of on-hand quantities:  
Create an alias to set the quota to re-stock of that item
    #ALIAS {FOOmin %0} {#VAR {min_FOO} {%0}}
Setup the item usage success message in the DECREMENTS section to decrease the on-hand count by 1 upon usage.
    You use a FOO 
   
   
  Setup the item usage fail message in the DECREMENTS section
  Sets your item container to %0 (use the keyword for the object)
    You drop a FOO
Setup the singular and multi item deposit messages to INCREMENT its on-hand value
    You put a FOO in..  -> increment by 1
    You put a FOO (%0) in -> increment by %0
Setup the math to determine how many you are lacking and need to restock to bring you up to quota:
  *See the script itself under the restock alias section and just copy/paste blocks for other potions but change the var names
  *The 'heals' potion of this is currently the only thing 'smart' enough to handle getting more than 10 of an item.
 
In /newtin/scripts/inv_vars.tin
Setup the 'on sight' trigger to adjust values based on what you see in your container. (Used by the 'setinv' command.)
    #ACTION {a item of FOO (%0)} {#VAR OHfoos %0}
 
==Speech/Channel Logging==
newtin/scripts/speech_logging.tin
 
The following channels are logged out to a file at /tintin/speech_log.tin
ordertalks
says, exclaims, wonders
tells you
chats
asks
answers
yells


To setup a secondary window for speech logging, which is nice during a run when too much text is flying by to catch conversation:
Open a new terminal window
tail -f /path/to/tintin/speech_log.tin
Of course, that will lack colorization. If you'd like to add color to that log to differentiate between the different channels logged:
Google about it, I used this primarily: https://unix.stackexchange.com/questions/8414/how-to-have-tail-f-show-colored-output
I ended up going with 'colorex'  (https://bitbucket.org/linibou/colorex/wiki/Home)
In a new terminal, I run:
   
   
tail -f speech_log.tin | colorex -y .\*ordertalks.\* --green .\*says.\* --green .\*exclaims.\* --cyan .\*tells.\* -r 'chats|asks|answers' -m .\*yells.\*
=== Gameplay Options ===
I would suggest adding an alias to that in your shell config. (In my case, this is .zshrc)
alias tinlog="tail -f speech_log.tin | colorex -y .\*ordertalks.\* --green .\*says.\* --green .\*exclaims.\* --cyan .\*tells.\* -r 'chats|asks|answers' -m .\*yells.\*"


These are a bunch of things you might want to turn on/off here and there for whatever purposes.


==EQ Damage Tracking==
  Alias: teston / testoff
  newtin/scripts/eq_tracking.tin
newtin/scripts/id_eq.tin
 
The eq_tracking.tin script contains the triggers for tracking ac, adjusting values, and auto-removing eq.
 
The id_eq.tin script is a toggle on/off script which must be enabled for initial gear scanning to set eq inventory and ac stats.
 
===Commands===
 
There are a few aliases entailed in this that you should be aware of:
eqon/eqoff                            Toggle triggers to capture item vars from 'identify' output
eqset {%0}                            Manually set a piece of eq for entry. Use the FULL descriptive name of the object in brackets.
itemac %0                              Manually set items AC and Max AC to %0
keyis KEYWORD                          Set's the item's keyword for command usage
eqstat                                Display all tracked eq stats
itemfind ITEM                          Display specific item eq stats (matches based on item name, any terms found in item name work)
acset                                  Reset all AC values to max
repairall                              Reset all AC values to max, then issue in-game 'repair all' command
remeq                                  Remove a piece of eq from the tracked eq list
 
===How to Use===
====Entering Item Data====
Using 'identify' to auto-enter details:  
eqon                                  Enables triggers to capture item vars
do identify on a piece of gear.        Capture item name, current AC, max AC values.
keyis KEYWORD                          Set functional keyword for item
..(repeat identify/keyis for all gear)
eqoff                                  Disables triggers so no further data is captured by subsequent 'identify's on other eq.
   
   
Manually Entering Items (Necessary for weapons and lights)
This is for developing new stuff quickly. It reads in (or kills) whatever you have written in /tinrod/scripts/test_script.tin
(Set weapons to 12 and lights to 20)
eqset Full Item Name                  Set item to be scanned (also clears any existing info in the eq db for the item)
itemac %0                              Set the items AC and maxAC values to %0 (presumes item is currently at max ac)
keyis KEYWORD                          Set functional keyword for item


====Removing Item Data====
  Alias: eqon / eqoff
Removing Items
  remeq ITEMNAME.
   
   
  Sometimes removing items can be tricky because of the way special characters work. If necessary, just hard edit the variable:
  Toggles the equipment tracking triggers. Turn on before id'ing gear. Turn off after. Explained above.  
quit from your character
open newtin/characters/CHARNAME_up_stuff.tin
edit the {eqlist} var (see below for formatting)
 
====Displaying Item Data====
eqstat                                Display all tracked eq stats
itemfind BLA                          Display all tracked eq stats for any items which include the term BLA anywhere in name or key.
 
====Auto-Removal of Items====
'''Warnings and Actions'''
Currently the script is configured to remove an item once it reaches an AC of '5' explicitly (line 16 newtin/scripts/eq_tracking.tin)
 
===Item DB===
This system essentially lets you build up an item db for each character.
It's not important to remove equipment from the db if you're not wearing it, the eqlist can contain tons of eq. If the trigger sees ANY of those names being damaged, its AC will be adjusted and actions taken accordingly. So, you can build a huge list for each char really.  
 
The Item DB is stored in the 'eqlist' variable. Each item name is a nested variable, and each items ac, max ac, and keyword, are nested within each item name:


  #var {eqlist} {
  Alias: immobon / immoboff
                {Andvarinaut}{{ac}{16}{acMAX}{16}{key}{andvar}}
                {the ring of the ancient gods}{{ac}{12}{acMAX}{12}{key}{ancient}}
                {scales of alpha \& omega}{{ac}{40}{acMAX}{40}{key}{1.scales}}
                }
Generically:   {FULL ITEM NAME} {Current AC}{##} {Max AC}{##} {Keyword}{Key for item}
   
   
(In your config script that'll all be condense so it looks like one long string)
  This will enable/disable re-immobilize triggers. This is actually redundant now because you can set this up elsewhere.  
  See the 'menu' options for Bot Type, set 'bot tank' then 'boton' and you get the same thing.  
  This took me a lont time to figure out, so, if you want to mess with stuff, it's probably useful information to show how to call each var:
$eqlist[]                      Outputs all item full names
$eqlist[Andvarinaut][ac]      Outputs 16
$eqlist[Andvarinaut][key]      Outputs andvar
The damage trigger basically adjusts #var $eqlist[%0][ac] by -1 anytime it sees the message '%0 gets damaged'.
 
===Screenshots===
Full output of 'eqstat' as well as 2 examples if 'itemfind' showing specific item data:
[[Image:Eqstat.jpg]]
 
===ReCasting===
 
This is all garbage. I need a way better philosophy of how to deal with failed spells.
should prrrrobably just be disabled for now. (comment it out of newtin/mod_config.tin)
 
newtin/scripts/nonfight_recast.tin
 
When NOT fighting ($fighting var = 0) failure message triggers "!" (resend last command)
 
That works well enough if you're casting spells one by one.  
  It fails entirely when trying to do 'all' or 'shields' for instance and a spell in the middle fails.
That spell is lost, and instead the final spell of the group is recast.
If THAT Spell is already applied, then even a successful cast will result in failure messages indefinitely...
  -You've now got a runaway trigger firing! You're Welcome!
 
When Fighting ($fighting var = 1), failure message triggers "version" (triggers my heal/hit triggers)
 
This is basically currently geared for auto re-hitting with a mage/ceric via qspike or virtue.
The logic would go:
  VERSION -> check health -> IF necessary (heal + rerun version) ELSE -> cast hit spell
  FAILED  -> rerun version
  SUCCESS -> rerun version
 
This part works well enough so long as your ONLY hitting with a spell. If you try to cast other stuff during a fight, this becomes a nuisance.
 
==Custom Prompt==
 
Custom prompting via tintin works by staging the tintin #prompt command to pattern match your in-game prompt, and then substitute/rearrange that however you want.
 
The tintin prompt is useful because you can configure it to include tintin variables, and MSDP data.  


There are a few other functions the custom prompting handles:
  Alias: glasson / glassoff
Gathers HP/Mana/Gold variables.
Sets 'fighting' variable
    NOTE: If 'fighton' alias has been ran to enable autofighting, a hit is issued to start off the autofighting loop.
If Blinded, sets a notification in the prompt
Auto-Cure-Blindness function:
    If Blind, then check trusight, If True will expire before blind, quaff cure-blind.
    NOTE: this is only attempted ONCE, as it would runaway if you don't have a cure-blind in inventory.
    NOTE: On-Screen notifications are printed when attempting to cure blind, so you should see when it fires and if it works.
 
 
 
===Split Mode===
Custom prompts in tintin only work when in #split mode.
This, unfortunately also disables your ability to scroll back up in your buffer.
I have found no resolution or workaround to that as of yet.
The alias 'unline' will undo the custom prompt/split, so you can scroll up.
However, any subsequent incoming prompt from the mud will re-trigger the split and custom prompt.
 
The custom prompt is setup as such:
  Top Line: Name, hp/max, mana/max, moves, align, hide/sneak/fly/etc, Truesight and Sanc rounds remaining.
Mid Line:  Personal information - Area, Gold, Inventory, Favor. (If blind, a notification !!!BLIND!!! appears here)
Bot Line:* Mob information: Name, Level, Health description, Health percentage, Command/Wait State.
            *NOTE: Bottom Line (mob info) only appears when fighting.
 
===Pattern Matching===
TinTin's custom prompting is essentially a trigger on your in-game prompt. It works like this:
Trigger on your actual in-game prompt by pattern matching the whole string.
Gag that in-game prompt and substitute it with a custom tintin prompt on a specific line.
 
Thus, for tintin custom prompting to work, your in game prompt must match what the custom prompting scripts expect.
I've made alises which will adjust your in-game prompt accordingly
NOTE: You should run 'prompt' and 'fprompt' in-game and note those down first, as this will blow them away:
 
Depending on if your class uses mana, no-mana, blood, or if you are a lowbie and want to see exp, set your mud prompt with:
   
   
  setmanaprompt            Mage, Cleric, Ranger, Fathomer, Augurer, etc.  
  For Fathomer glasseye skill, redo upon expiration.  
setnonmanaprompt        Thief, Warrior, Barbarian
setbloodprompt          Vampire
setlowbiemanaprompt      Lowbie-Mana Users
  (I didn't setup a lowbie-non-mana user yet, it's a pain, just use the mana one and deal with the extraneous field)


The script newtin/scripts/class_genre_conf.tin specifies which tintin prompt to load for each class.
  Alias: shieldson / shields off
  I have heavily commented these scripts so hopefully it takes you less time to figure out how these work than it took me.
/newtin/scripts/mana_prompt.tin
/newtin/scripts/nonmana_prompt.tin
/newtin/scripts/blood_prompt.tin
/newtin/scripts/lowbie_mana_prompt.tin
   
   
  *Yes, these COULD also be combined into a single script, given that only 1 is gonna match your in-game prompt. But, too lazy to condense.
  Upon expiration, request fresh e-shields from your mage bot. Adjust this for your own chars and bot aliases.  
 
===Output===
The output is a two-line prompt when not-fighting, and a 3 line prompt when fighting.
 
There is also a !!!!BLIND!!!! notification that get's added to the middle line when you are blind
  (You may not see that very much, because auto-cure-blind is also setup)
 
[[Image:Tintin frompt.png]]


 
  Alias: celeston / celestoff
  KEY:  
True (#) = rounds remaining on truesight      --from msdp AFFECTS var
Sanc (#) = rounds remaining on sanctuary      --from msdp AFFECTS var
hl = heals on hand                            --from examining your containers with the 'setinv' alias
mn = mana potions on hand                    --ibid on down
sn = sanctuary pots on hand.
ts = truesights on hand
sp = create spring potions on hand            --(not shown above)
   
   
  Cure blindness potions are also tracked so could be added to the inventory prompt display, but I choose not to do that as of yet
  For cleric celestial might... I never use this, but did once for about 5 minutes so its setup.


===Customization===  
=== Gameplay Automation ===
This example code set's up how to match & replace your in-game prompt, include regular variables, and the msdp variables.
This should lay the ground work for whatever tweaking you'd like to do.
The main thing that's tricky is making damn sure the #prompt command matches you in-game prompt format EXACTLY.
Once you've got your in-game prompt correct, and the tintin #prompt substitution happening, adding in variables to the display is simple,
The prompt configs are HIGHLY commented, so read those and it should be clear how to adjust to your liking.


===Room to Improve===
This section contains a ton of misc stuff to auto-do-stuff in the game.


The current custom prompts work well, but there's a bit of philosophical problem.
  Auto-style/search/dig/fly/track, etc.  
  Anytime you want to make a change to all your chars, you have to edit ALL the prompt configs: mana/non/blood/lowbie.  
  Anti-Idle (auto-save every 500 seconds)
  Since there's prompt/fprompt for each, plus lines for blind/not-blind, that's 16 lines of code in 4 files that need edited.


Now that I've got msdp support working, a lot of the variables I'm catching from the in-game prompt don't necessarily need to be gathered that way.
  Aliases......Results:
  character name, hp, maxhp, mana, max mana, gold, align, are all currently captured from the in-game prompt.  
  supcor      supplicate corpse, get all, wear all.  
 
  trackgo %0  track mob named %0 and automatically continue to track/move/track/move
So, one potential simpliciation which I might implement soon (but if not here's the idea and you can have at it yourself)
  stoptrack    stop tracking
1. Set ALL characters in-game prompts to be very minimalistic, because we don't really need that data anymore.  
  heal         quaff 1 heal
    i.e. have one alias to set any and all char's prompts to a very basic prompt.  
heal4        quaff 4 heals
  2. Setup a giant singular prompt file which would have conditionals for each class/genre type.
  heale        quaff 8 heals
    1. Setup some type of master file that associates char names with what type of prompt they get
blue        quaff a ds orchid mana potion
    2. Have the prompt script refer to that master file and lookup the correct prompt for the connected character.
blueup      quaff orchids until mana is full
    3. Setup the tintin custom prompt to display nearly all data from msdp, instead of captured vars from mud prompt.  
  qtank        quaff a tankset
 
  drotank     drop a tankset
You'd still have to edit a lot of lines in that file to make a global change, but at least its all in one file?
shockstick  use shockshield stick
 
  cameo        use iceshield cameo
==AutoFight==
  firestick    use fireshield staff
===Compenents===
  goneut      use a pillow to get align back within +/- 80 of 0.  
 
  /newtin/scripts/fighton.tin
      Toggled on/off by 'fighton' and 'fightoff' aliases specified in /newtin/scripts/onoffs.tin
 
Some aspects of this stuff are actually always enabled in newtin/scripts/basic_utilities.tin
  - hp tracking
  - 'version' triggering heal/hit check
  - hit and target aliasing
 
'''Variables Used''':
  $hp        Current HP: captured from prompt
  $hpMAX     Max HP: captured from prompt
  $damage    Result of MaxHP - Current HP = Damage taken.
  $fighting  Used to flag us fighting or not, essentially gets used to intiate FIRST command to start loop and that's all.
  $canquaff  Used to determine if we are even able to quaff a potion. If not, disables further attempts to do so to prevent runaway failures.
   
   
'''Triggers Used''':  
  Also various 'target setting' aliases, but this is pretty much taken care of automatically now by the mob tracking system.  
1. '''(CHARNAME)F'''  : My fprompt starts with this. The 'F' makes it different from regular prompt so it fires this trigger.  
But, in case you just wanna manually set your target variable, check out this section for options, there's a lot.  
            ALWAYS: set hp/maxhp/damage variables based on frprompt fields.
            IF $fighting variable is set to 0 (we are not yet fighting) set it to 1 and run 'ver'. Go to 2.
            ELSEIF: $fighting variable is set to 1 (we are already fighting i.e. have already started the heal/hit loop) Then: Do nothing.
                    (This starts the fight, and heal/hit loop with the initial send of 'ver'. Then it ignores further fprompts.  
   
   
  2. '''SMAUG 2.1'''  : Output of('ver' command) triggers the IF statements:
  Also Dh potion buying, if you have a potion buyer, just put a small birch chest on him and give him 1m.  
            IF the 'canquaff' variable is set to 0, it means we're out of heals or totally full, so don't do anything.
                    (Prevents runaway heal attempts)
            ELSEIF damage > 100; THEN heal & run 'version' again.
                    (Thus heals one at a time: check, heal, recheck, heal, recheck, heal, up to dam < 100.
            ELSE damage < 100; THEN $hit the $target
   
    If you run 'ver' without 'fighton' being enabled the logic stops here, you would heal until you hit, and then nothing happens.
    If 'fighton' is enabled, then the following step is also applied, which loops back to running 'ver' to restart everything once more.
       
3. '''Your hit *''' : Output of various class 'hit' commands. See below for included hit messages so far.
                    (Upon display, run ver. Ver waits in mud buffer for hit lag to resolve, then shows asap. Go To 2.
                   


'''Aliases Used''':
=== Equipment Damage Tracking ===
fighton    Enables recursive loop
fightoff  Disables looping
ver        Runs 'version'
targ %0    Sets $target variable (multiple aliases for this, see [[#Hit_.26_Target_Commands]]
gogo      Re-enables the package if it gets disabled by inability to quaff heals. See 'Additional Triggers' just below in this section.


This has already been explained above, but, process is:
1. eqon
2. (id a piece of gear)
3. keyis KEYWORD
(3a. IF light/weapon: itemac 20/12 respectively)
4. eqoff


'''ALIAS: fighton'''
To view your current eq stats:  
eqstat


This alias reads in the necessary triggers to cause additional 'version' commands which restart the loop indefinitely.
To remove a piece of gear from the eq db:
   
  remeq a weapon of striking (use the full name of the object)
  Triggers re-start the loop by doing 'version' upon hit messages. Currently supported hits:
circle
leap
grasp
rend
smash
stun
vindur gong
Just add other hit messages into the file so any 'hit' causes another 'ver' to create a loop.


'''ALIAS: fightoff'''
To reset damage values to 0:  
acset


  Disables the triggers above so that hit messages do not trigger further 'version' commands to restart the loop.
To find a specific piece of gear only
  itemfind %0  (case sensitive)


===Logic===
When we see the Fprompt if you're not currently flagged as 'fighting'($fighting = 1) then set fighting=1 and issue 'version' to initiate heal/hit check.
"Version" triggers an HP check, heals up if necessary to witihn 100 hp of max, then issues a $hit to $target. 
Monitor for various 'hit' messages. Upon those hit messages - issue 'version' once more. This will appear on sceen as soon as hit lag resolves.
If a spell attack fails, re-run 'version' once more.


The Loop:
With 'fighton' enabled, the logical loop is as such:
0. k MOB (sets $targ as MOB) (The $hit variable is also already defined upon login via the class config, can be reset with 'hitis HITNAME' as well)
1. IF the Fprompt appears, flag us as fighting, and issue initial 'version' command. (Also IF the Fprompt appears again, and we're flagged fighting, do nothing)
      -This is used to START a fight at first sight of Fprompt by sending 'ver', but not sending additional ones on each subsequent fprompt.
2. Version appears on screen. Triggers step 3. 
3. IF damage is greater than 100, take a heal and ReRun 'version'. Return to step 2.
    ELSEIF damage is less than 100. Proceed to step 4.
4. Issue a hit to the target
5. Hit message appears on the screen. Triggers step 6. (Hit lag active)
6. Send 'version' command to mud, it sits in mud buffer while hit lag resolves.
7. Hit lag resolves. Version command processed. Return to step 2.
8. Regular (non-fprompt) appears on screen (fight is over): set $fighting variable to 0.


===Additional Triggers===  
=== Run Scripting ===
"You Cannot Circle" -------------> reset $hit variable from 'circle' to 'leap'
"...has no blood to feed upon" --> fightoff (should make this just switch the attack to a none-blood attack)
(Spell MISS messages) -----------> version (rerun heal/hit trigger)
"You are too full..." -----------> set's the 'can quaff' flag to 'no' and disables further fight/heal triggering. Back to manual control.
"You don't see that" ------------> (out of heals) does the same as above. Back to manual control.


===How to use===
These are each kinda their own beast. For when general autofighting doesn't work well.  
First, make sure your hit message (and miss message) are be setup in /newtin/scripts/fighton.tin.  
circle, leap, rend, stun, smash, grasp, vindur, qspike, already setup there. Add others similarly.
Each hit/miss mesasge just triggers the 'version' mud command:
#ACTION {Your strike} {ver}


====Variables which need set====
I would just suggest reading each one. They're not great yet, just all kinda 'in the works'.
$pot_con  (See [[#How_to_set_your_inventory]]
<pre>
$hit     
Bishop/Krakov are basically flee then healup scripts.
$target
Collosus is kinda the same, very unfinished
Edo Dragon heads are useful for having your ranger snipe heads from above to aggro them.
Mithril Hall isn't totally automated, just some time saving stuff in there.
Seth sets up some stuff to track who is tanking and when he chills, but not anything else (like hitting).
</pre>


There are several aliases for setting your preferred hit and the target.
== AutoFight ==


HIT:
Configurable via the options shown in 'menu'  
Use the 'hitis' alias to set your preferred recurring auto-hit.
hitis rend
This is saved out to your class config upon quit, so it should save session to session.
If you typically use the same hit, then it'll already be there.


TARGET:
Uses a 'minhealth' variable, under which you will heal up. Above which you will hit.  
The easiset way to target an enemy is just to use a custom 'attack' command which does that, such as:
k MOB  (sets MOB as the $target and then does 'kill MOB')
kil MOB
bs MOB
vom MOB
There are also some more explicit commands, and speech triggered methods:
targ MOB
say target MOB  (will set it on YOU and any alts in the room running this package)
say targ MOB    (same)
gt targ MOB    (will set it on any group members running this package if the multi module is loaded (it is by default).
These are all setup in newtin/scripts/basic_utilities.tin
Add others similarly.  


Without going into 'how it work' let's just get to 'how to use'


====Attacking====
Gonna use these aliases:
hitis HITNAME
minhealth #####
manaoff or manaon
fighton / fightoff to enable/disable autofighting.
pause    to totally pause this stuff
resume  to restart
 
So, first set those all up. Some notes on that: 
A: For spells, do hitis {c 'vindur gong'} in curly brackets like that.
B: If your 'hit' uses mana, do 'manaon'. If it does not, go 'manaoff'.
C: If things get screwed up, just type 'pause' to pause the whole thing. Some conditions do this automatically.
D: Use 'resume' to restart everything.


Once you've set your hit message triggers, and the required variables, simply begin a fight and it should auto-fire the loop.
The logic follows as such:
If you have not already triggered this check, and
If the check has not failed for some reason already (meaning it would continue to fail infinitely), and
If the autofight system is not purposefully paused, and
If you aren't at 8 potions in the stomach, and
If you won't be blind once truesight expires, and
If you don't have a remainder of heals to quaff from a previous healup run, and
If you have the sanctuary spell (or sacral divinity, or holy sanctity), and
If your health is above the minhealth value you setup in your menu, and
If you are not configured as a tank (who doesn't hit), and
If you are not a vampire in need of blood, and
If you are not a mana user
Then Hit the Target, and re-run this check.
(If you ARE a mana user, and mana is under 200, then Hit the Target and sip 4 mana pots until within 200 of full mana.)


For aggro mobs, you'll want to set the target before walking into them.


====Stall-outs, Fail-Safes, and Restarts====
If any of those fail, rectify them, and recurse:
=====Stalls=====
If nothing is happening, this means an action occurred which did not result in another 'version' command being sent to the mud.
Run 'ver' manually to run the heal/hit check and see if it loops or stalls.
   
   
  Sometimes this 'just happens'. You can always run 'ver' to do a one-off heal/hit check and then work on making it loop after the fight.
  If this check has already been fired: do nothing
If this check has already failed: echo alert, echo vars, disable autofighting.
If the system is paused, echo as such.
If you ARE at 8 potions: drink spring (if you can't find it, make one, if you can't make one, say 'no spring!')
If you WILL be blind when true runs, quaff cure blind now. (and if you fail, say 'blind' and pause the system until cured)
If you have remaindered heals to quaff, quaff them.
If you don't have sanc, quaff it (and if you fail, echo that, set an override, and recheck)
If your health isn't up to snuff, heal up to full, recheck.
If you are a tank, don't even hit, just pass all if-checks and then recurse and recheck. (never hit)
If you are a vamp with under 20 blood, feed, recheck.
If you are a mana user, and mana is under 200, sneak in 4 mana pots with each hit.  
   
   
  Figure out what you did which is not setup to trigger 'ver'. It's most likely your hit/miss message is not in fighton.tin or there is a variant of it you did not add there yet, a typo, etc.  
Also: if you are EVER blinded in a fight:
  The system is paused, you 'say blind' and upon that blindness expiring you will automatically quaff truesight and turn 'trueon'.  


=====Fail-Safe=====
=== Debugging ===
Autofighting is automatically disabled if you cannot quaff heals. This would occur in two cases:
No heals remaining in $pot_con.
Stomach too full, cannot drink any more.
Both of these set a flag variable $canquaff to 0 meaning, you cannot quaff, and this preempts the hit/heal check. 
You will see
*****CANNOT QUAFF --Too Full or Out of Stock-- Run gogo to clear*****


Drinking from a spring will clear that flag and re-enable the hit/heal loop once more.  
Currently there are debugging echo's built into the check which you will see if you enable this. This helps me develop it.  
It can also be manually cleared with the 'gogo' alias.  


=====Restart=====
You can edit out all the #SHOWME lines to get rid of those, but be warned, it's a bitch to debug without them.  
ver      This runs a heal/hit check manually.
          Theoretically, even if the loop isn't looping, you could just always use this manually, and that would be decent really.
gogo      This alias force clears the $canquaff flag and re-runs 'ver'.
          If you see the fail-safe warning again, try gogo, if it recurs it is likely accurate and you cannot quaff.
          Drink a spring, or take manual control for awhile ignoring the failsafe message until you CAN drink a spring.


==Multiplay Remote Piloting==
=== Hit Support ===
Module configuration: newtin/scripts/multi.tin


This one is a bit hard to explain. Basically multi works really well in tintin by default, so these are just some small tweaks I've made to setup some aliasing for it. Unlike other parts of this package, this one I pretty much just hardcoded with my character names, so you would have to do the same. You COULD set things up to detect your character names automatically and then make all these things work on variables, but, honestly I haven't had the need yet. The key here is that the connection alias 'go charname' opens a session with session-name charname. Tintin allows you to send commands to other sessions via their session-names, thus, you can jump to other sessions, or send to commands to them, using that session-name, which is the charname, which is nice and makes sense. You'll see what I mean below:
The whole thing works based on your hit message triggering the recursion. So, ALLLL hit messages have to trigger that.  


===Opening Multiple Sessions===
So far I have a lot, but not all setup. See the bottom of the tinrod/scripts/autofighting.tin file, it should be obvious what I mean.  
After connecting one character to the mud with the 'go char1name' alias. Just do it again and 'go char2name'. Boom, 2 chars 1 cup.
You will only physically see the session you've selected. This is sometimes not cool, cuz you wanna monitor chars simultaneously.
Thus, there are two ways to manage multi'ing -
    Remote Session Control -- for when you're truly multi in a single terminal running multiple sessions.  
    Remote Speech Control  -- for when you've got multiple terminals/instances of tintin running separately (so you can see em all)


===Remote Session Command===
If your autofight isn't working, or it only seems to fire 'once' make sure your hit message is setup in that file like all the others.  
When tintin opens multiple sessions in the same terminal, you can send commands to any of those directly with #sessioname commands.
In this package, session names are your character names, which is set when you do 'go char1name'. It makes the session name 'char1name'
    Let's say you have two characters logged: Bob and Tom. (so you did 'go bob', he connected, then did 'go tom', and he connected)
    From the 'Tom' session you can do:
    #bob say hello I'm being controlled by Tom's session!
To make things even easier, I also added aliasing to abbreviate the session names and eliminate the # prefix:
    See /newtin/main.tin
For example:
    #ALIAS          {dard} {#dardex}
That alias allows me to control the dardex character from another session with commands like:
    dard say hello I'm being controlled by another session!
It's also useful to know that tintin provides a #all command which will send a command to ALL open sessions:
#all nod
Char1 nods
Char2 nods
Char3 nods
Char4 nods
etc.
 
====Configuration====
Setup in newtin/scripts/globals.tin (which is loaded by newtin/main.tin upon startup)
The following will always work for every char since they are loaded in the GTS session.
Thus - you can just run tintin, and do 'logall' for instance to log your army. 
 
ses              - List all open sessions. 
logall          - Connect to all specified characters (char list hard-coded in newtin/main.tin)
allquit          - Quit out ALL connected sessions.
char            - Sets up the shorthand for controlling the #char session. Also hard-coded - see the file.
 
Setup in newtin/scripts/multi.tin, the following will only work AFTER connecting to the mud (not from GTS session)
This script is still something I am thinking about how to use really.
It contains things you would need once connected to the mud on 1 session.
These will NOT work from the unconnected GTS session.
dymsarmy        - For when I log my char Dymrex, and want to log the rest of my army without disconnecting.
                    (Otherwise, I'd have to quit Dym, then do logall at the GTS)
                    (Theoretically you could setup different armies here. I only have 1, and Dym is always my leader)
groupall %0      - All chars follow %0, and %0 groups them. Thus, %0 is your group leader.
                    Also enabled Remote Speech Control on all characters. So you can control directly, or by speech.
                    (Also presumes your leader is your #1 session (first logged) and puts you on that session. 
regroup %0      - Just re-does the above really, in case someone falls out.  
botson/off      - All char's enable Remote Speech Logging. If you want to enable speech commands without grouping.
allfight        - All char's enable autofighting (fighton alias)
 
===Remote Speech Command===
There is a on/off toggle which enables characters to receive command from remote characters via 'say'.
This is necessary if you are not nesting sessions in a single terminal. (So you can physically see them both)
If you have multiple terminals open, then you can send commands directly to alts via tintin, so must use in-game speech triggering.
boton/botoff    Setup in /newtin/scripts/onoffs.tin
Once on, the bot chars respond per the configuration in /newtin/scripts/bot_control.tin
say fighton  -- character who's implemented 'boton' would execute 'fighton' autofighting loop
say fightoff -- character who's implemented 'boton' would execute 'fightoff' to disable autofighting loop
say immobon  -- bot char enables re-immobilize trigger to constantly immob
say immoboff -- bot char disabled re-immobilize trigger
say immo %0  -- bot character casts immob against mob %0


And the over-arching wildcards to make a bot 'do THIS':
=== Target Support ===
tell BOTCHAR 'bc foo bar'  -- bot char executes 'foo bar'


Group-talk control - for when multi'ing in a large group of bot chars:  
The AF script always hits a specific target. This data is pulled from the mob tracking system, so read on below:
gt foo bar  -- All bots in the group execute 'foo bar'


== Mob Tracking ==


===Example setup===
Everytime you fight anything, you can capture the mob data from msdp and set a mob keyword.


To gold mithril hall, I do:
Those keywords become the 'target' variable when autofighting is enabled.  
runtin        - start tintin++ at GTS session
go dymrex    - Log character Dymrex
dymsarmy      - Log my other alts
groupall dym  - All chars follow Dymrex, and Dyrex groups them.
allfight      - All chars enable autofighting
runmith      - Loads the mithril hall trigger set out of /newtin/runs/mithril.tin
Quil mithmage - My mage char Quiltran, session shorthand Quil, runs his 'mithmage' alias. (which is in his class config)
(go pick a fight - the runmith triggerset includes triggers to have my leader grouptalk this upon seeing Bruenor (and other mobs))
gt targ bru  - Entire army targets Bruenor
I'm still figuring out how best to multi, so obviously this could be made much more efficient. For now, I'm testing the pieces.


==Run Scripting==
If a mob is not already setup in the mob tracking db, you will be prompted to enter the keyword with this alias:
This is a relatively new section. Now that I have most of the client functionality down, I'm starting to script actual gameplay in specific areas and/or for specific tasks/runs/etc. Thus far, I only have 2 places setup, and even then, only partially.


===Toggles===
  mobkey %0    (i.e. mobkey demon)
  To toggle run scripting on/off for a run, there is code contained in /newtin/scripts/runs.tin which sets up these aliases:
runseth    - Enable triggers for Seth himself
killseth  - Disables the Seth triggers
runmith    - Enable triggers for golding Mithril Hall
killmith  - Disables the golding triggers
   
   
  *Yes, it IS hilarious that these are the only two things I have setup.
  Note: upon entering the mobkey, autofighting is automatically restarted.
 
  NOTE: DO NOT TYPE MOBKEY BEFORRREEE YOU (or your group) is ready to start the fight: Cuz you WILL $hit $target and start it.   
===Runs===
====Seth====
1. Triggers to eat 3 apples upon his chill attack
 
2. Monitors for his acid spell which occurs each time he switches to a new tank:
-If the new tank is you, automatically removes your weapon. 
-If he switches to someone else, re-wear your weapon.
-If you weren't tanking, and he switches to someone else, still not you, do nothing.
 
====Mithril Hall====
  NOTE: there are some character specific things setup at the top of this file for my own army. Remove, or adjust for your char names.
Primarily, they have my 'loot carrier' empty his loot container, my mage begin midasing, and my neut chars re-align with a moldy pillow.  
  Also, these triggers are ONLY loaded on the group leader. This prevents other chars from tanking, looting corpse, etc.


What it does is silly and really is just a test on load/unloading run scripting, but it does make golding a bit faster.
To view the entire mob database:  
Intended for use after logging an army, grouping, and enabling autofight and remote speech commands on all chars.
  Alias: mobstat
Aliases:
      logall/dymsarmy  - logall if i have no chars connected, dyms army if dymrex is already connected and I just need the others.
                        (logall is setup in globals.tin, dymsarmy in multi.tin)
      groupall %0      - All chars follow %0 and are grouped. All chars also enable 'botson' speech command triggers.
      gomith          - Army walks to Mithril Hall
      allfight        - All chars enable autofighting via 'fighton'
      runmith          - Mithril Hall triggers are loaded.
      midasmage        - At some point, run this to have my mage break from the group and load the MH item name midas triggers.
      fixalign        - At some point, run this (numerous times) to have my neut chars break group and use pillow to fix align.
      regroup          - Run after either of the above to regroup the chars who broke off to midas/align.
 
The 'runmith' triggers really just do a couple simple things:
 
1. Upon sight, the leader sets the target for the group to hit via grouptalk.
    (Mobs are: Regis, Wulfgar, Bruenor, Cattie-Brie, Drizzt, Artemis, worshipers, hounds, and clerics).
2. The leader loots those corpses, and puts the loot in an empty laundry basket specifically used for this purpose (hard coded)
  3. Alias 'dropit' just empties the loot basket and fires my mage's midas script coded for all this gear specifically.
    (Was thinking of making a fully featured 'midas' script that midas's ANYTHING, or anything out of a list of things, but, meh)
 
=Testing/Development=
 
There is a dedicated developmental script and aliases that make testing new code a bit easier.
 
  Dev file:  
   
   
        /newtin/scripts/test_script.tin
  Note: I also started saving mob level as well, seems like it could be useful for future leveling purposes.
   
Aliases:  
        teston    -- Reads in the above script into the 'testing' class.
        testoff  -- Kills the 'testing' class and everything setup in it.  


So basically, if you wanna try new stuff and need to make frequent edits, rather than continuously connecting/disconnecting:
=Contact=
Have 2 terminals open, one connected to the mud, and one editing /newtin/scripts/test_script.tin
Make your edits to the test script, save it.
In the game, do 'teston'
See if your code works. If not:
In the game, do 'testoff'
Re-edit the script. Save it.
In the game 'teston' again, test your code again, and 'testoff' again if more edits are required.


Once it works, figure out what actual script to put your code into.
If anybody ever uses this, feel free to contact me at dyrdex@gmail.com about it.
 
NOTE: If actions/aliases for a term already exist, those will always precedence over stuff read in via this test script.
      It's for development of NEW things based on new trigger/alias terms only.
      If you want to re-do the code for an existing thing, it'll have to be removed from it's original location first so
      there is nothing configured for that term in the base code. Then you could dev new stuff for it via this script.
 
=TO DO=
1. Add more 'remote control' commands so that tank can say/tell things to bots for specific actions more quickly than typing them out.
2. Re-casting improvements:
    Track 'last casted' and if it fails, store it as a 'needs recasted' var, and cast those until they receive success message.
    How to track last INPUT command? Not sure that's possible. Log inputs and tail the last 1 line?
3. Add in triggers to handle status ailments or whatnot
4. Vette all 'hit messages' and find all 'miss messages'.
5. Find all 'you can't do that' messages and setup auto-change-hit triggers upon those, similar to "you cannot circle" above.
KNOWN
 
=BUGS=
BUG: Too many 'ver' commands get sent to mud.
    This bug occurs in the following case:
        1. You are fighting more than 1 mob.
        2. The first mob dies. The prompt toggles back to non-fighting prompt for a split second.
        3. The other mob in the room is the same 'target' name as the initial opponent.
    The bug itself:
        1. You issue a hit to your opponent. They die upon that hit.
        2. That hit message has already triggered another 'ver' and it's already in the mud buffer waiting processing.
        3. The prompt will change from fprompt to regular prompt. Set's $fighting var to 0 (not fighting).
        3. 'ver' output triggers heal/hit. If you hit:
        4. Since the mob is dead, you would TYPICALLY get a failure message ala "They're not here" etc.
            4a. This may not happen if... there is another mob by the same target name in the room! So then:
        6. BUG: The hit in the muds command buffer intended for target A lands on new target B
        7. This hit message triggers a 'ver', let's call it "ver A".
            7a. This means the original hit/heal loop is essentially uninterrupted, triggered by target A and hitting target B after A died.
        8. The prompt flips back to the frompt upon hitting target B.
        9. The Fprompt triggers a check on the $fighting, since its 0, triggers another 'ver'. let's call it "ver b"
 
    End result:
        You get 2 'ver' outputs
              (AUTOFIGHTING) <--Carried over from original fight, still going.
              (AUTOFIGHTING) <--Initiated because prompt flipped back to regular and then fprompt again, resetting $fighting var. Fight re-initiated.
        Triggering 2 actions
              (You HIT the TARGET)
              (You HIT the TARGET)
        Which trigger 2 more 'ver' outputs, and this all now runs in clumps of 2 checks and 2 actions. If you kill a 3rd mob, it goes to 3, etc.
    Solutions:
        Manage the $fighting variable better upon death? Perhaps delay it's removal several seconds to allow hits in buffer to resolve?

Revision as of 19:03, 24 April 2018

Realms tintin++ package by Dyrdex. I have no idea what I'm doing, this is my first foray into programming of any sort. Please forgive my terrible terrible coding!

Get the files

You can curl or wget this stuff. I update it too frequently to keep a tar.gz up there. Should probably switch to github.

http://dyrdex.com/tinrod/

Setup

1. Edit tinrod/main.tin

Edit line 26: path to the tinrod directory on your system (i.e. just 'tinrod' if you've got it at ~home/tinrod) and execute tt++ from ~home
Edit line 32 with your password where it says PASSWORD_HERE
2. Run tintin++ along with the main.tin file, you'll probably want to set a shell alias for this: 
    /path/to/tt++ /path/to/tinrod/main.tin
3. Connect to the mud using the alias 'go CHARNAME'
4. Setup your character config. 
 
   4a: run 'menu' to see all configurable character options. 
       NOTE: After setting the 'affiliation' option (to 'ds' presumably) do 'reload'. 
             This loads in the current file, and prevents you from overwriting it with a blank one later. 
   4b: set your containers and inventory counts by running 'setinv' TWICE (yes do it twice initially)
5. Setup your equipment damage tracking (or at LEAST setup your weapon, as its required for the disarm trigger). 
   Run the following aliases: 
   5a: eqon
   5b: (id a piece of equipment via any means)
   5c: keyis KEYWORD
   5d: (repeat id and keyis for every piece of eq)
   5e: eqoff

   5f: NOTE: for lights and weapons you must manually enter the AC since its not present in 'identify' output.
             After id'ing, do: 
             itemac 20   (for lights, and 12 for weapons). 
   5g: acset  

At this point you should be basically good to go. Most of the other features should 'just work'.

I guess, I need to tell you what all those features are....

Features

Stuff in main.tin

1. Quick Connect/Reconnect, Saving of stuff to your configs.

2. TinTin options

3. Multi-Session control

4. Speech Logging

5. MSDP Support

6. Inventory Tracking

7. Gameplay options (trigger on/offs)

8. Gameplay automation

9. EQ Tracking

10. Mob Tracking

11. Run Scripting

Quick Connect

Alias: go %0

This is how you connect. Type 'go dyrdex' for example. 
All your chars need to share the same password (which is hardcoded into main.tin line 32)
Alias: quit

The word 'quit' is aliases to write out all your configs before actually quitting the mud. 
This writes: character, class, affiliation, and mobs list to the appropriate configs upon quit. 
Alias: saveconf

This does the same thing as 'quit' but without quitting. 

TinTin Config Options

Nothing fancy here, just your basic tintin config options. Set as desired.

Multi-Session Config

Alias:  (shorthand) (session name)

Since tintin allows you to multi sessions in the background, these let you switch to, or send commands to, bg'd sessions quickly: Since each session we open is named a character name, you can type that character to control that session. We can then setup aliases to shorthand those session names even further.

Probably best to just look at this section of main.tin to understand this better You'll want to setup a shorthand for each character.

So, for example, setting this up;

#ALIAS          {dym} {#dymrex}

Allows me to control Dymrex, when he is 'backgrounded', by doing:

dym say hello

If you want to foreground Dymrex, just do:

dym

You can also setup quick connect aliases here to log groups/armies, etc.

Alias: groupall %0

Allows you to have all your sessions follow %0 and has %0 group them. 
Alias: regroup

Does the same as groupall, but does it again. 

Speech Logging

Log: ~tinrod/speech_logging.tin

This needs work, but for now it just grabs certain channels/socials and logs them. Open a second terminal and tail -f /path/to/tinrod/speech_logging.tin

Alias: savelog %0

Will write out your entire buffer to a log file named %0.
NOTE: writes to your current working directory, not within the tinrod directory. 

MSDP Support

This *should* 'just work' automatically upon login at this point. If it doesn't, use this alias to 'start' it:

Alias: msdp_report

MSDP Var's Further detail. For use in your own scripting, call msdp stuff as follows:

All variable: $msdp_info
All variables + their values: $msdp_info[]
One thing: $msdp_info[THING]  (note caps is required)

For all affects: $msdp_info[AFFECTS]
For ONE affect:  $msdp_info[AFFECTS][sanctuary]

If you're unsure, play around with #showme $msdp_info[THING] and whatnot till you find what you need, or email me. 

Inventory Tracking

I identify a potion container and an item container and save those as variables. I track a select group of potions/items within those containers and adjust values as used/stocked. Values of the most useful potions are displayed in the prompt.

Important to note that these counts get integrated into 2 other scripts/purposes. 1. In the 'ds' affiliation script, there is a 'restock' alias. Set your preferred levels via the 'menu' alias options. 2. Potion quaffing is tracked, and this used by the autofight script, so that you always drink spring after 8 potions (when fighting).

Alias: clearinv

Clears inventory tracking values. 
Alias: setinv (also invset, because I can never remember which way it goes, so just setup both!)

This uses 'finditem' to find a heal and a recall, and sets your container variables accordingly. 
Then, it examines those containers to get counts on the things it tracks upon the sight of them.
Then the 'at sight' triggers are disabled so further examinations don't adjust levels anymore. 
There are also manual controls, listed below: 
Alias: potcon %0

Sets your potions container to %0 (use the keyword for the object)
Alias: itemcon %0

Sets your item container to %0 (use the keyword for the object)


Gameplay Options

These are a bunch of things you might want to turn on/off here and there for whatever purposes.

Alias: teston / testoff

This is for developing new stuff quickly. It reads in (or kills) whatever you have written in /tinrod/scripts/test_script.tin
Alias: eqon / eqoff

Toggles the equipment tracking triggers. Turn on before id'ing gear. Turn off after. Explained above. 
Alias: immobon / immoboff

This will enable/disable re-immobilize triggers. This is actually redundant now because you can set this up elsewhere. 
See the 'menu' options for Bot Type, set 'bot tank' then 'boton' and you get the same thing. 
Alias: glasson / glassoff

For Fathomer glasseye skill, redo upon expiration. 
Alias: shieldson / shields off

Upon expiration, request fresh e-shields from your mage bot. Adjust this for your own chars and bot aliases. 
Alias: celeston / celestoff

For cleric celestial might... I never use this, but did once for about 5 minutes so its setup. 

Gameplay Automation

This section contains a ton of misc stuff to auto-do-stuff in the game.

Auto-style/search/dig/fly/track, etc. 
Anti-Idle (auto-save every 500 seconds) 
Aliases......Results:
supcor       supplicate corpse, get all, wear all. 
trackgo %0   track mob named %0 and automatically continue to track/move/track/move
stoptrack    stop tracking
heal         quaff 1 heal
heal4        quaff 4 heals
heale        quaff 8 heals
blue         quaff a ds orchid mana potion
blueup       quaff orchids until mana is full
qtank        quaff a tankset
drotank      drop a tankset
shockstick   use shockshield stick
cameo        use iceshield cameo
firestick    use fireshield staff
goneut       use a pillow to get align back within +/- 80 of 0. 

Also various 'target setting' aliases, but this is pretty much taken care of automatically now by the mob tracking system. 
But, in case you just wanna manually set your target variable, check out this section for options, there's a lot. 

Also Dh potion buying, if you have a potion buyer, just put a small birch chest on him and give him 1m. 

Equipment Damage Tracking

This has already been explained above, but, process is:

1. eqon
2. (id a piece of gear)
3. keyis KEYWORD
(3a. IF light/weapon: itemac 20/12 respectively)
4. eqoff

To view your current eq stats:

eqstat

To remove a piece of gear from the eq db:

remeq a weapon of striking  (use the full name of the object)

To reset damage values to 0:

acset

To find a specific piece of gear only

itemfind %0  (case sensitive)


Run Scripting

These are each kinda their own beast. For when general autofighting doesn't work well.

I would just suggest reading each one. They're not great yet, just all kinda 'in the works'.

Bishop/Krakov are basically flee then healup scripts. 
Collosus is kinda the same, very unfinished
Edo Dragon heads are useful for having your ranger snipe heads from above to aggro them. 
Mithril Hall isn't totally automated, just some time saving stuff in there. 
Seth sets up some stuff to track who is tanking and when he chills, but not anything else (like hitting).

AutoFight

Configurable via the options shown in 'menu'

Uses a 'minhealth' variable, under which you will heal up. Above which you will hit.

Without going into 'how it work' let's just get to 'how to use'

Gonna use these aliases:

hitis HITNAME
minhealth #####
manaoff or manaon
fighton / fightoff to enable/disable autofighting. 
pause    to totally pause this stuff
resume   to restart 
  

So, first set those all up. Some notes on that:

A: For spells, do hitis {c 'vindur gong'} in curly brackets like that. 
B: If your 'hit' uses mana, do 'manaon'. If it does not, go 'manaoff'. 
C: If things get screwed up, just type 'pause' to pause the whole thing. Some conditions do this automatically. 
D: Use 'resume' to restart everything. 

The logic follows as such:

If you have not already triggered this check, and
If the check has not failed for some reason already (meaning it would continue to fail infinitely), and
If the autofight system is not purposefully paused, and
If you aren't at 8 potions in the stomach, and
If you won't be blind once truesight expires, and
If you don't have a remainder of heals to quaff from a previous healup run, and
If you have the sanctuary spell (or sacral divinity, or holy sanctity), and
If your health is above the minhealth value you setup in your menu, and
If you are not configured as a tank (who doesn't hit), and
If you are not a vampire in need of blood, and
If you are not a mana user
Then Hit the Target, and re-run this check. 
(If you ARE a mana user, and mana is under 200, then Hit the Target and sip 4 mana pots until within 200 of full mana.)


If any of those fail, rectify them, and recurse:

If this check has already been fired: do nothing
If this check has already failed: echo alert, echo vars, disable autofighting. 
If the system is paused, echo as such. 
If you ARE at 8 potions: drink spring (if you can't find it, make one, if you can't make one, say 'no spring!')
If you WILL be blind when true runs, quaff cure blind now. (and if you fail, say 'blind' and pause the system until cured)
If you have remaindered heals to quaff, quaff them. 
If you don't have sanc, quaff it (and if you fail, echo that, set an override, and recheck)
If your health isn't up to snuff, heal up to full, recheck.
If you are a tank, don't even hit, just pass all if-checks and then recurse and recheck. (never hit) 
If you are a vamp with under 20 blood, feed, recheck.
If you are a mana user, and mana is under 200, sneak in 4 mana pots with each hit. 

Also: if you are EVER blinded in a fight:

The system is paused, you 'say blind' and upon that blindness expiring you will automatically quaff truesight and turn 'trueon'. 

Debugging

Currently there are debugging echo's built into the check which you will see if you enable this. This helps me develop it.

You can edit out all the #SHOWME lines to get rid of those, but be warned, it's a bitch to debug without them.

Hit Support

The whole thing works based on your hit message triggering the recursion. So, ALLLL hit messages have to trigger that.

So far I have a lot, but not all setup. See the bottom of the tinrod/scripts/autofighting.tin file, it should be obvious what I mean.

If your autofight isn't working, or it only seems to fire 'once' make sure your hit message is setup in that file like all the others.

Target Support

The AF script always hits a specific target. This data is pulled from the mob tracking system, so read on below:

Mob Tracking

Everytime you fight anything, you can capture the mob data from msdp and set a mob keyword.

Those keywords become the 'target' variable when autofighting is enabled.

If a mob is not already setup in the mob tracking db, you will be prompted to enter the keyword with this alias:

mobkey %0    (i.e. mobkey demon)

Note: upon entering the mobkey, autofighting is automatically restarted.
NOTE: DO NOT TYPE MOBKEY BEFORRREEE YOU (or your group) is ready to start the fight: Cuz you WILL $hit $target and start it.  

To view the entire mob database:

Alias: mobstat

Note: I also started saving mob level as well, seems like it could be useful for future leveling purposes.

Contact

If anybody ever uses this, feel free to contact me at dyrdex@gmail.com about it.