Current Version
Implementation of 3k MIP info system for Tintin++, as used by the Portal mud client.
Collects a LOT of very useful information for you to use in your own scripts and info displays.
Save this to a file, load it after connecting to 3K and it will start up the MIP system.
It saves the most recent data of each MIP type into $mip[mipflag] fields. It also saves personal stats like HP, SP etc into $my[hp][current], $my[sp][current] etc, along with $opponent[longname], $opponent[hp] etc.
See the comments within the code (and the information on the older version of MIP below) for more information.
Changes:
Version 0.008
A few code tweaks and cleanups
Now collects guildline information, stored into $mip[gline][name_of_gline_tag]
#class {cMip} {kill};
#class {cMip} {open};
#NOP ***** Set MIP ID Code **********;
#VAR {mip} {};
#VAR {mip[Version]} {0.008};
#VAR {mip[id]} {};
#LOOP {1} {5} {i}
{
#MATH {temp[digit]} {1d10 - 1};
#VAR {mip[id]} {$mip[id]$temp[digit]};
};
#UNVAR {temp[digit]};
#NOP ***** Kick Off MIP *************;
#SEND {3klient $mip[id]~~Tin$mip[Version]}
#NOP ***** Extract Raw Data *********;
#ACTION {~{\#K\%$mip[id](.{3})(.{3})(.*)}}
{
#VAR {mip[charcount]} {0};
#VAR {mip[out]} {};
#VAR {mip[overflow]} {};
#VAR {mip[source]} {%0};
#MATH {mip[%3][length]} {%2 - 3};
#VAR {mip[%3][data]} {%4};
#REPLACE {mip[%3][data]} {"} {'};
#PARSE {$mip[%3][data]} {i}
{
#MATH {mip[charcount]} {$mip[charcount] + 1};
#VAR {mip[delta]} {$mip[%3][length]};
#IF {"${mip[char2]}${mip[char1]}${i}" == "x7B"} {#MATH {mip[delta]} {$mip[delta] + 3}};
#IF {"${mip[char2]}${mip[char1]}${i}" == "x7D"} {#MATH {mip[delta]} {$mip[delta] + 3}};
#IF {"$i" == ";"} {#MATH {mip[delta]} {$mip[delta] + 1}};
#IF {$mip[charcount] <= $mip[delta]}
{
#VAR {mip[%3][length]} {$mip[delta]};
#VAR {mip[out]} {${mip[out]}${i}};
}
{
#VAR {mip[overflow]} {${mip[overflow]}${i}};
};
#VAR {mip[char2]} {$mip[char1]};
#VAR {mip[char1]} {$i};
};
#VAR {mip[%3][data]} {$mip[out]};
#if {"${mip[overflow]}" != ""} {#SHOWME {${mip[overflow]}};};
.aMipProcess%3 {$mip[%3][data]};
#LINE GAG;
} {1};
#NOP ***** Individual Processes ***;
#ALIAS {.aMipProcessAAA} {#NOP %1;#NOP Sound;};
#ALIAS {.aMipProcessAAB} {#NOP %1;#NOP Image;};
#ALIAS {.aMipProcessAAC}
{
#NOP Reboot Time;
#VAR {session[RebootTime]} {%1};
};
#ALIAS {.aMipProcessAAD} {#NOP %1;#NOP Music;};
#ALIAS {.aMipProcessAAF} {#NOP %1;#NOP Uptime;};
#ALIAS {.aMipProcessAAG} {#NOP %1;#NOP AVI movie;};
#ALIAS {.aMipProcessAAH} {#NOP %1;#NOP Download Media;};
#ALIAS {.aMipProcessBAA} {#NOP %1;#NOP Special Textstring;};
#ALIAS {.aMipProcessBAB}
{
#NOP 2 Way Communications;
#REGEX {%1} {{(.*)\~(.*)\~(.*)}}
{
#IF {"&3" != "0"}
{
#IF {"&2" == "x"}
{
event_raise e_message {[&3]>&4} {message} {me} {&3} {%1};
}
{
event_raise e_message {[&3]<&4} {message} {&3} {me} {%1};
};
};
};
};
#ALIAS {.aMipProcessBAC} {#NOP %1;#NOP Special Textstring2;};
#ALIAS {.aMipProcessBAD} {#NOP %1;#NOP Room Description;};
#ALIAS {.aMipProcessBAE} {#NOP %1;#NOP Mud Lag;};
#ALIAS {.aMipProcessBAF} {#NOP %1;#NOP Send Edit;};
#ALIAS {.aMipProcessBBA} {#NOP %1;#NOP Guild Point1 Mask;};
#ALIAS {.aMipProcessBBB} {#NOP %1;#NOP Guild Point2 Mask;};
#ALIAS {.aMipProcessBBC} {#NOP %1;#NOP Hit Point Mask;};
#ALIAS {.aMipProcessBBD} {#NOP %1;#NOP Spell Point Mask;};
#ALIAS {.aMipProcessCAA}
{
#NOP **** Chat Messages ****;
#REGEX {%1} {{(.*)\~(.*)\~(.*)\~(.*)}}
{
#VAR {temp[Data]} {};
#VAR {temp[Data][player]} {&4};
#VAR {temp[Data][command]} {&2};
#VAR {temp[Data][line]} {&3};
#NOP Do something with the data here:
#VAR {temp} {};
}
};
#ALIAS {.aMipProcessCAP}
{
#NOP %1;
#NOP Window Caption Text;
#FORMAT {temp} {%h} {%0};
};
#ALIAS {.aMipProcessCCF} {#NOP %1;#NOP Send File Line;};
#ALIAS {.aMipProcessCDF} {#NOP %1;#NOP Send File Begin;};
#ALIAS {.aMipProcessCEF} {#NOP %1;#NOP Send File End;};
#ALIAS {.aMipProcessDDD} {#NOP %1;#NOP Room Exits;};
#ALIAS {.aMipProcessFFF}
{
#VAR {mip[FFF][flag]} {0};
#VAR {mip[FFF][toggle]} {0};
#PARSE {%1} {i}
{
#IF {"$mip[FFF][flag]" == "0"}
{
#VAR {mip[FFF][flag]} {$i};
#VAR {mip[FFF][$i]} {};
#VAR {mip[FFF][$i][data]} {};
}
{
#IF {"$i" == "~"}
{
#IF {"$mip[FFF][toggle]" == "0"}
{
#VAR {mip[FFF][toggle]} {1};
}
{
#IF {"$mip[FFF][$mip[FFF][flag]][data]" != ""}
{
.aMipProcessFFF${mip[FFF][flag]} {$mip[FFF][${mip[FFF][flag]}][data]};
};
#VAR {mip[FFF][flag]} {0};
#VAR {mip[FFF][toggle]} {0};
};
}
{
#VAR {mip[FFF][${mip[FFF][flag]}][data]} {${mip[FFF][${mip[FFF][flag]}][data]}${i}};
};
};
};
#IF {"$mip[FFF][$mip[FFF][flag]][data]" != "0"}
{
.aMipProcessFFF${mip[FFF][flag]} {$mip[FFF][${mip[FFF][flag]}][data]};
};
};
#ALIAS {.aMipProcessFFFA}
{
#NOP Hit Points;
#FORMAT {my[hp][current]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFB}
{
#NOP Hit Points Maximum;
#FORMAT {my[hp][max]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFC}
{
#NOP Spell Points;
#FORMAT {my[sp][current]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFD}
{
#NOP Spell Points Maximum;
#FORMAT {my[sp][max]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFE}
{
#NOP Guild Points1;
#FORMAT {my[np][current]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFF}
{
#NOP Guild Points1 Maximum;
#FORMAT {my[np][max]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFG}
{
#NOP Guild Points2;
#FORMAT {my[repower]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFH} {#NOP %1;#NOP Guild Points2 Maximum;};
#ALIAS {.aMipProcessFFFI}
{
#NOP Primary Guild Line;
#NOP #SHOWME @fMipColourConv{{%1}};
.aMipProcessGline {%1};
};
#ALIAS {.aMipProcessFFFJ}
{
#NOP Secondary Guild Line;
#NOP #SHOWME @fMipColourConv{{%1}};
.aMipProcessGline {%1};
};
#ALIAS {.aMipProcessFFFK}
{
#NOP Mob Fighting;
#IF {"%1" != ""}
{
#VAR {opponent} {};
#VAR {opponent[longname]} {%1};
}
{
#VAR {opponent[hp]} {};
};
};
#ALIAS {.aMipProcessFFFL}
{
#NOP Mob Health;
#FORMAT {opponent[hp]} {%d} {%1};
};
#ALIAS {.aMipProcessFFFM} {#NOP %1;#NOP Mob Image File;};
#ALIAS {.aMipProcessGline}
{
#VAR {temp} {};
#IF {"%1" != ""}
{
#VAR {temp[gline]} {%1};
#REPLACE {temp[gline]} { } {;};
#FOREACH {$temp[gline]} {i}
{
#IF {"$i" != ""}
{
#REGEX {$i} {{^(\<\w{1}|)(.+)\:(.+?)(%|)(X\>|>|)$}}
{
#VAR {mip[gline][&3]} {&4};
};
};
};
};
};
#function {fMipColourConv}
{
#VAR {result} {%1};
#REPLACE {result} {>} {<099>};
#REPLACE {result} {<y} {<839>};
#REPLACE {result} {<r} {<819>};
#REPLACE {result} {<b} {<849>};
#REPLACE {result} {<g} {<829>};
#REPLACE {result} {<c} {<869>};
#REPLACE {result} {<v} {<859>};
#REPLACE {result} {<s} {<279>};
};
#class {cMip} {close};
Pre 1.99.7 Version of MIP
This is no longer being maintained. Please upgrade to Tintin++ 2 and use the version above.
Here is a rudamentary implementation of MIP for Tintin++. Its a work in progress (and there are links to other TinTin++ functions of mine, some of which have yet to be published on here, e.g. ".aMessageWindow")
The MIP code parsing tends to be about 95% successful, which means you do get left with occasional MIP encoded messages being randomly displayed from time to time, and those data messages don't therefore get loaded into. However it is a fairly sucessful skeleton to work from, and I am currently using it day-to-day.
When the script is loaded, a random 5 digit MIP ID is generated and sent to the mud to start MIP message transmission. As MIP messaged are received, they are captured by identifying the MIP ID and gagged. If the captured line is longer than the specified length of the MIP message, the outstanding section at the end is echoed back out untouched (Tintin automatically re-parses text that is output with #SHOWME, so any more MIP messages within the line will be caught on subsequent passes).
The 3 letter line code is extracted from the message, and the rest of the data is passed to the alias set up for that code. In the case of FFF datalines, the data is then re-processed and passed down to sub-aliases for each further FFF subtype. Most of these line code types (and FFF subtypes) are currently empty, but a few of the key ones (like HP, SP, guild points, chat lines etc) have code in them currently. To identify which 3 letter code specifies what refer to the MIP Spec.
Example:
#K%00005008AAC12:46> Hello world
The line is recognised as containing MIP by the section "#K%00005" (has to match the held MIP ID) and gagged.
The next 3 characters specify that the MIP data content is 008 characters long, which leaves "AAC12:46" as the data and "> Hello world" as extra non-mip stuff. The extra non-mip stuff is output back to the screen, and the string "AAC12:46" is sent to the alias "aMipProcessAAC" for further processing.
Enjoy.
#class {cMip} {kill};
#class {cMip} {open};
#VAR {vMipVersion} {0.001};
#CONFIG {packet patch} {0.01};
#NOP ***** Set MIP ID Code **********;
#VAR {vMipID} {$gvNull};
#LOOP {1 5}
{
#MATH {vTemp} {1d10 - 1};
#VAR {vMipID} {$vMipID$vTemp};
};
#UNVAR {vTemp};
#NOP ***** Kick Off MIP *************;
#SEND {3klient $vMipID~~Tin$vMipVersion}
#NOP ***** Extract Raw Data *********;
#FORALL {{$vMipID}}
{
#ACTION {~{\#K\%&0(.{3})(.*)}}
{
#VAR {vMipSource} {%0};
#VAR {vMipData} {%3};
#VAR {vMipDataLength} {%2};
#VAR {vMipDataChar2} {$gvNull};
#VAR {vMipDataChar1} {$gvNull};
#VAR {vMipDataCharCount} {0};
#REPLACE {vMipData} {"} {'};
#PARSE {$vMipData}
{
#MATH {vMipDataCharCount} {$vMipDataCharCount + 1};
#VAR {vMipDataLengthDelta} {$vMipDataLength};
#IF {"${vMipDataChar2}${vMipDataChar1}&&0" == "x7B"} {#MATH {vMipDataLengthDelta} {$vMipDataLengthDelta + 3}};
#IF {"${vMipDataChar2}${vMipDataChar1}&&0" == "x7D"} {#MATH {vMipDataLengthDelta} {$vMipDataLengthDelta + 3}};
#IF {"&&0" == ";"} {#MATH {vMipDataLengthDelta} {$vMipDataLengthDelta + 1}};
#IF {$vMipDataCharCount <= $vMipDataLengthDelta}
{
#VAR {vMipDataLength} {$vMipDataLengthDelta};
};
#VAR {vMipDataChar2} {$vMipDataChar1};
#VAR {vMipDataChar1} {&&0};
};
#REGEX {$vMipData} {(.{$vMipDataLength})(.*)}
{
#format {vMipLength} {%L} {{&&2}};
#IF {$vMipLength > 0} {#SHOWME {&&2};};
#UNVAR {vMipLength};
aMipProcess {&&1};
};
#LINE GAG;
} {1};
};
#NOP ***** Split Data *************;
#ALIAS {aMipProcess}
{
#REGEX {%1} {(.{3})(.*)}
{
aMipProcess&1 {&2};
};
};
#NOP ***** Individual Processes ***;
#ALIAS {aMipProcessAAA} {#NOP %1;};
#ALIAS {aMipProcessAAB} {#NOP %1;};
#ALIAS {aMipProcessAAC} {#NOP %1;};
#ALIAS {aMipProcessAAD} {#NOP %1;};
#ALIAS {aMipProcessAAF} {#NOP %1;};
#ALIAS {aMipProcessAAG} {#NOP %1;};
#ALIAS {aMipProcessAAH} {#NOP %1;};
#ALIAS {aMipProcessBAA} {#NOP %1;};
#ALIAS {aMipProcessBAB}
{
#NOP 2 Way Communications;
#REGEX {%1} {(.*)\~(.*)\~(.*)}
{
#IF {"&1" == "x"}
{
.aMessageWindow {[&2]>&3};
}
{
.aMessageWindow {[&2]<&3};
};
};
};
#ALIAS {aMipProcessBAC} {#NOP %1;};
#ALIAS {aMipProcessBAD} {#NOP %1;};
#ALIAS {aMipProcessBAE} {#NOP %1;};
#ALIAS {aMipProcessBAF} {#NOP %1;};
#ALIAS {aMipProcessBBA} {#NOP %1;};
#ALIAS {aMipProcessBBB} {#NOP %1;};
#ALIAS {aMipProcessBBC} {#NOP %1;};
#ALIAS {aMipProcessBBD} {#NOP %1;};
#ALIAS {aMipProcessCAA}
{
#NOP **** Chat Messages ****;
#REGEX {%1} {(.*)\~(.*)\~(.*)\~(.*)}
{
.aMessageWindow {&4};
}
};
#ALIAS {aMipProcessCAP} {#NOP %1;};
#ALIAS {aMipProcessCCF} {#NOP %1;};
#ALIAS {aMipProcessCDF} {#NOP %1;};
#ALIAS {aMipProcessCEF} {#NOP %1;};
#ALIAS {aMipProcessDDD} {#NOP %1;};
#ALIAS {aMipProcessFFF}
{
#VAR {vMipFFFData} {$gvNull};
#VAR {vMipFFFFlag} {$gvNull};
#VAR {vMipFFFToggle} {0};
#PARSE {%1}
{
#IF {"$vMipFFFFlag" == "$gvNull"}
{
#VAR {vMipFFFFlag} {&0};
}
{
#IF {"&0" == "~"}
{
#IF {$vMipFFFToggle == 0}
{
#VAR {vMipFFFToggle} {1};
}
{
aMipProcessFFF${vMipFFFFlag} {$vMipFFFData};
#VAR {vMipFFFData} {$gvNull};
#VAR {vMipFFFFlag} {$gvNull};
#VAR {vMipFFFToggle} {0};
};
}
{
#VAR {vMipFFFData} {${vMipFFFData}&0};
};
};
};
aMipProcessFFF${vMipFFFFlag} {$vMipFFFData};
#UNVAR {vMipFFFData};
#UNVAR {vMipFFFFlag};
};
#ALIAS {aMipProcessFFFA}
{
#var {vHP} {%1};
};
#ALIAS {aMipProcessFFFB}
{
#var {vHPMax} {%1};
};
#ALIAS {aMipProcessFFFC}
{
#var {vSP} {%1};
};
#ALIAS {aMipProcessFFFD}
{
#var {vSPMax} {%1};
};
#ALIAS {aMipProcessFFFE}
{
#var {vNP} {%1};
};
#ALIAS {aMipProcessFFFF}
{
#var {vNPMax} {%1};
};
#ALIAS {aMipProcessFFFG}
{
#var vRepower {%1};
};
#ALIAS {aMipProcessFFFH} {#NOP %1;};
#ALIAS {aMipProcessFFFI} {#NOP %1;};
#ALIAS {aMipProcessFFFJ} {#NOP %1;};
#ALIAS {aMipProcessFFFK}
{
#IF {"%1" != ""}
{
#VAR {vVsName} {%1};
};
};
#ALIAS {aMipProcessFFFL}
{
#VAR {vVsHP} {%1};
};
#ALIAS {aMipProcessFFFM} {#NOP %1;};
#class {cMip} {close};





