Difference between revisions of "Manual:DIL Manual"
Jump to navigation
Jump to search
Line 1: | Line 1: | ||
− | + | ||
<H2>DIL DOCUMENTATION</H2> | <H2>DIL DOCUMENTATION</H2> | ||
'''Version 4.0''' | '''Version 4.0''' | ||
− | + | ||
'''Current Version by: Whistler@valhalla.com''' | '''Current Version by: Whistler@valhalla.com''' | ||
− | + | ||
<h3>Index</h3> | <h3>Index</h3> | ||
[[#making|Making a Program]] | [[#making|Making a Program]] | ||
Line 68: | Line 68: | ||
[[#built_func|Built-In Functions]] | [[#built_func|Built-In Functions]] | ||
[[#bfasctime|asctime()]] | [[#bfasctime|asctime()]] | ||
− | [[# | + | [[#bfatoi|atoi()]] |
− | |||
− | |||
− | |||
− | |||
− | |||
[[#bfcancarry|cancarry()]] | [[#bfcancarry|cancarry()]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[#bfcheckpassword|check_password()]] | [[#bfcheckpassword|check_password()]] | ||
[[#bfcomm|command()]] | [[#bfcomm|command()]] | ||
Line 95: | Line 76: | ||
[[#bfdd|dildestroy()]] | [[#bfdd|dildestroy()]] | ||
[[#bfdf|dilfind()]] | [[#bfdf|dilfind()]] | ||
− | [[# | + | [[#bfeq|equipment()]] |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[#bffilesize|filesize()]] | [[#bffilesize|filesize()]] | ||
[[#bffindr|findroom()]] | [[#bffindr|findroom()]] | ||
+ | [[#bffindru|findrndunit()]] | ||
[[#bffinds|findsymbolic()]] | [[#bffinds|findsymbolic()]] | ||
+ | [[#bffindu|findunit()]] | ||
+ | [[#bffits|fits()]] | ||
+ | [[#bfgcolor|getcolor()]] | ||
[[#bfgword|getword()]] | [[#bfgword|getword()]] | ||
[[#bfgwords|getwords()]] | [[#bfgwords|getwords()]] | ||
[[#bfghead|ghead()]] | [[#bfghead|ghead()]] | ||
− | [[# | + | [[#bfisaff|isaff()]] |
+ | [[#bfislight|islight()]] | ||
+ | [[#bfisplayer|isplayer()]] | ||
+ | [[#bfisset|isset()]] | ||
+ | [[#bfitoa|itoa()]] | ||
[[#bfleft|left()]] | [[#bfleft|left()]] | ||
[[#bflen|length()]] | [[#bflen|length()]] | ||
[[#bfload|load()]] | [[#bfload|load()]] | ||
[[#bfloadstr|loadstr()]] | [[#bfloadstr|loadstr()]] | ||
+ | [[#bfmelee|meleeattack()]] | ||
+ | [[#bfmeleedamage|meleedamage()]] | ||
+ | [[#bfmid|mid()]] | ||
+ | [[#bfmonstr|moneystring()]] | ||
+ | [[#bfop|opponent()]] | ||
[[#bforoll|openroll()]] | [[#bforoll|openroll()]] | ||
[[#bfpathto|pathto()]] | [[#bfpathto|pathto()]] | ||
− | [[# | + | [[#bfpaychk|paycheck()]] |
+ | [[#bfpurse|purse()]] | ||
+ | [[#bfreplace|replace()]] | ||
+ | [[#bfrestore|restore()]] | ||
[[#bfright|right()]] | [[#bfright|right()]] | ||
[[#bfrnd|rnd()]] | [[#bfrnd|rnd()]] | ||
− | [[# | + | [[#bfsavestr|savestr()]] |
− | [[# | + | [[#bfsend_pre|send_pre()]] |
− | [[# | + | [[#bfskill_name|skill_name()]] |
− | [[# | + | [[#bfsplind|spellindex()]] |
+ | [[#bfsplinf|spellinfo()]] | ||
+ | [[#bfsplit|split()]] | ||
+ | [[#bfstrdir|strdir()]] | ||
+ | [[#bfstrcmp|strcmp()]] | ||
+ | [[#bfstrncmp|strncmp()]] | ||
+ | [[#bftextformat|textformat()]] | ||
+ | [[#bftolower|tolower()]] | ||
+ | [[#bftoupper|toupper()]] | ||
+ | [[#bftranmon|transfermoney()]] | ||
+ | [[#bfvis|visible()]] | ||
+ | [[#bfweapon_name|weapon_name()]] | ||
+ | [[#bfweapon_info|weapon_info()]] | ||
+ | [[#biproc|Built-In Procedures]] | ||
[[#bpacc_mod|acc_modify()]] | [[#bpacc_mod|acc_modify()]] | ||
− | [[# | + | [[#bpact|act()]] |
− | + | [[#bpaddaff|addaff()]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[# | ||
[[#bpaddcolor|addcolor()]] | [[#bpaddcolor|addcolor()]] | ||
− | [[# | + | [[#bpaddeq|addequip()]] |
− | |||
− | |||
− | |||
[[#bpaddex|addextra()]] | [[#bpaddex|addextra()]] | ||
[[#bpadds|addstring()]] | [[#bpadds|addstring()]] | ||
− | [[# | + | [[#bpatt_s|attack_spell()]] |
− | [[# | + | [[#bpbeginedit|beginedit()]] |
− | [[# | + | [[#bpblock|block]] |
− | [[# | + | [[#bpcast_s|cast_spell()]] |
− | [[# | + | [[#bpchangecolor|changecolor()]] |
+ | [[#bpchngs|change_speed()]] | ||
+ | [[#bpclear|clear()]] | ||
+ | [[#bpdc|dilcopy()]] | ||
+ | [[#bpdelcolor|delcolor()]] | ||
+ | [[#bpdp|delete_player()]] | ||
[[#bpdest|destroy()]] | [[#bpdest|destroy()]] | ||
− | [[# | + | [[#bpexec|exec()]] |
+ | [[#bpexp|experience()]] | ||
+ | [[#bpflog|flog()]] | ||
+ | [[#bpfol|follow()]] | ||
+ | [[#bpgamestate|gamestate()]] | ||
+ | [[#bpinsert|insert()]] | ||
+ | [[#bpinterr|interrupt()]] | ||
+ | [[#bpkilledit|killedit]] | ||
[[#bplink|link()]] | [[#bplink|link()]] | ||
− | [[# | + | [[#bplog|log()]] |
− | [[# | + | [[#bplogcrime|logcrime()]] |
− | [[# | + | [[#bpnopri|nopriority]] |
+ | [[#bpona|on_activation()]] | ||
+ | [[#bppagestring|pagestring()]] | ||
+ | [[#bpp_u|position_update()]] | ||
+ | [[#bppri|priority]] | ||
[[#bpreboot|reboot]] | [[#bpreboot|reboot]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[#bpremove|remove()]] | [[#bpremove|remove()]] | ||
[[#bpresetlevel|reset_level()]] | [[#bpresetlevel|reset_level()]] | ||
Line 162: | Line 166: | ||
[[#bpresetrace|reset_race()]] | [[#bpresetrace|reset_race()]] | ||
[[#bpsec|secure()]] | [[#bpsec|secure()]] | ||
− | [[# | + | [[#bpsend|send()]] |
− | [[# | + | [[#bpsendall|sendtoall()]] |
− | [[# | + | [[#bpsendalld|sendtoalldil()]] |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[#bpsendt|sendtext()]] | [[#bpsendt|sendtext()]] | ||
− | [[# | + | [[#bpsendto|sendto()]] |
− | [[# | + | [[#bpsend_done|send_done()]] |
+ | [[#bpset|set()]] | ||
+ | [[#bpsetbright|setbright()]] | ||
[[#bpsetfight|set_fighting()]] | [[#bpsetfight|set_fighting()]] | ||
[[#bpsetweight|setweight()]] | [[#bpsetweight|setweight()]] | ||
− | [[# | + | [[#bpsetpassword|set_password()]] |
− | [[# | + | [[#bpstore|store()]] |
− | [[# | + | [[#bpstopfighting|stop_fighting()]] |
− | [[# | + | [[#bpsubaff|subaff()]] |
− | [[# | + | [[#bpsubex|subextra()]] |
− | [[# | + | [[#bpsubs|substring()]] |
− | [[# | + | [[#bpuneq|unequip()]] |
− | [[# | + | [[#bfunitdir|unitdir()]] |
− | [[# | + | [[#bpunsec|unsecure()]] |
− | [[# | + | [[#bpunset|unset()]] |
− | [[# | + | [[#bpwait|wait()]] |
− | [[# | + | [[#bpwalkto|walkto()]] |
[[#note|Ending Notes]] | [[#note|Ending Notes]] | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
<center> | <center> | ||
Line 195: | Line 195: | ||
Experience in C is recommended, but PASCAL or BASIC in some form or other | Experience in C is recommended, but PASCAL or BASIC in some form or other | ||
will do just fine too. | will do just fine too. | ||
− | + | ||
DIL is a simple programming language with fixed types reflecting the types | DIL is a simple programming language with fixed types reflecting the types | ||
used in Valhalla Mud. The language gives you almost endless possibilities in | used in Valhalla Mud. The language gives you almost endless possibilities in | ||
Line 201: | Line 201: | ||
making the game interesting and intelligent. | making the game interesting and intelligent. | ||
</center> | </center> | ||
− | <!--LINK--><span id="making" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>Making a Program</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="making" /> | |
+ | |||
<h3>'''Making a program:'''</h3> | <h3>'''Making a program:'''</h3> | ||
− | + | ||
You define your DIL programs within your zone file. Each program you make is a | You define your DIL programs within your zone file. Each program you make is a | ||
*template*. Such a template must be equipped with a unique name (for that zone). | *template*. Such a template must be equipped with a unique name (for that zone). | ||
Templates can either be defined in a new %dil section, just below the %zone | Templates can either be defined in a new %dil section, just below the %zone | ||
section in the zone file, or directly attached to units defined in your zonefile. | section in the zone file, or directly attached to units defined in your zonefile. | ||
− | + | ||
If you define your DIL templates inside a unit definition, that unit is | If you define your DIL templates inside a unit definition, that unit is | ||
automatically assigned a program using that template. If you want to use an | automatically assigned a program using that template. If you want to use an | ||
Line 216: | Line 217: | ||
optional parameters in parenthesis. The parameters of a template called with | optional parameters in parenthesis. The parameters of a template called with | ||
'dilcopy' may only be of types integer, strings and stringlists. | 'dilcopy' may only be of types integer, strings and stringlists. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
dilcopy myfunc@myzone("say Hello, my friend!", 1, CMD_SAY, {"name1", "name2"}); | dilcopy myfunc@myzone("say Hello, my friend!", 1, CMD_SAY, {"name1", "name2"}); | ||
− | + | ||
DIL templates can always be reused. In fact, with version 2.0 of DIL, programs | DIL templates can always be reused. In fact, with version 2.0 of DIL, programs | ||
are no longer saved with equipment, but only a symbolic reference is used. That | are no longer saved with equipment, but only a symbolic reference is used. That | ||
Line 227: | Line 228: | ||
found, the program is halted and rendered useless until such a reference can be | found, the program is halted and rendered useless until such a reference can be | ||
found during loading. | found during loading. | ||
− | + | ||
Technical note: | Technical note: | ||
− | + | ||
When you use several 'dilcopy' in your zonefile, only one instance is present | When you use several 'dilcopy' in your zonefile, only one instance is present | ||
game-time, thus saving tremendous amounts of memory. It is similar to a shared | game-time, thus saving tremendous amounts of memory. It is similar to a shared | ||
library, in which code is shared but variables are not. | library, in which code is shared but variables are not. | ||
− | + | ||
You may use your templates to define both procedure and functions for your other | You may use your templates to define both procedure and functions for your other | ||
templates to call. | templates to call. | ||
− | + | ||
A template is defined by beginning with 'dilbegin' and ending with 'dilend'. | A template is defined by beginning with 'dilbegin' and ending with 'dilend'. | ||
Inside the template your program section is defined, marked by the keyword 'code', | Inside the template your program section is defined, marked by the keyword 'code', | ||
followed by the program itself; | followed by the program itself; | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin myprogram(); | dilbegin myprogram(); | ||
var | var | ||
i : integer; | i : integer; | ||
j : integer; | j : integer; | ||
− | + | ||
code | code | ||
{ | { | ||
Line 257: | Line 258: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
This simple template does nothing but making its owner say 'Hello world' once | This simple template does nothing but making its owner say 'Hello world' once | ||
every 5 seconds. The template is called 'myprogram' and takes no arguments. The | every 5 seconds. The template is called 'myprogram' and takes no arguments. The | ||
Line 264: | Line 265: | ||
referring to the unit owning the DIL program. Other inline variables will be | referring to the unit owning the DIL program. Other inline variables will be | ||
explained later. | explained later. | ||
− | + | ||
For a DIL program to work, it must be part of a *unit*: a room, player, non-player | For a DIL program to work, it must be part of a *unit*: a room, player, non-player | ||
or object. The program uses *messages* to operate. Your program gets activated | or object. The program uses *messages* to operate. Your program gets activated | ||
Line 270: | Line 271: | ||
of time has passed. You decide yourself in the program, what to wait for, before | of time has passed. You decide yourself in the program, what to wait for, before | ||
the program continues executing. | the program continues executing. | ||
− | + | ||
Supposing you want your program to contain variables, you have to put them in a | Supposing you want your program to contain variables, you have to put them in a | ||
section before the 'code' section marked 'var'. The variables are declared by | section before the 'code' section marked 'var'. The variables are declared by | ||
their type and their name, separated by a ':' and ended by a ';' | their type and their name, separated by a ':' and ended by a ';' | ||
− | + | ||
For an example, see the program above. Variables of type 'string', 'stringlist' | For an example, see the program above. Variables of type 'string', 'stringlist' | ||
and 'integer' are saved, if the unit the program is attached to is saved with | and 'integer' are saved, if the unit the program is attached to is saved with | ||
Line 283: | Line 284: | ||
variable of a unit located in your local environment (the units directly 'visible' | variable of a unit located in your local environment (the units directly 'visible' | ||
to the unit who owns the DIL program) (see the secure / unsecure functions). | to the unit who owns the DIL program) (see the secure / unsecure functions). | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Data Types</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="types" /> | ||
<h3>'''Data Types:'''</h3> | <h3>'''Data Types:'''</h3> | ||
− | + | ||
DIL supports a fixed set of types you can use and manipulate. Through these, you | DIL supports a fixed set of types you can use and manipulate. Through these, you | ||
can get and manipulate information about almost anything in the game. The types | can get and manipulate information about almost anything in the game. The types | ||
are listed below: | are listed below: | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="str" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>string</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="str" /> | ||
'''String:''' | '''String:''' | ||
− | + | ||
A string is some text. They are used for a lot of things such as command | A string is some text. They are used for a lot of things such as command | ||
arguments, room descriptions etc. String variables are automatically resized and | arguments, room descriptions etc. String variables are automatically resized and | ||
Line 305: | Line 308: | ||
'<' (less than), | '<' (less than), | ||
'>' (greater than. | '>' (greater than. | ||
− | + | ||
Static strings are defined just as in the rest of the zone, within double | Static strings are defined just as in the rest of the zone, within double | ||
quotations. Strings may be searched easily with the 'in' operator. Variables | quotations. Strings may be searched easily with the 'in' operator. Variables | ||
of type string are saved with DIL programs, if attached to a saved unit. | of type string are saved with DIL programs, if attached to a saved unit. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
"This is a static string" | "This is a static string" | ||
− | + | ||
Strings may also be added to each other, in an expression. | Strings may also be added to each other, in an expression. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
"say "+itoa(42)+" is the answer!" | "say "+itoa(42)+" is the answer!" | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
if (self.name == self.names.[1]) ... | if (self.name == self.names.[1]) ... | ||
− | + | ||
Elements of the string can also be accessed by referencing them by their position. | Elements of the string can also be accessed by referencing them by their position. | ||
− | + | ||
'''Example''' | '''Example''' | ||
if (str.[3]==f]) | if (str.[3]==f]) | ||
Line 331: | Line 334: | ||
exec ("say The 4th element is a F.",self); | exec ("say The 4th element is a F.",self); | ||
} | } | ||
− | + | ||
'''Note''' | '''Note''' | ||
Currently you can only access the single elements of a string you can not set | Currently you can only access the single elements of a string you can not set | ||
Line 337: | Line 340: | ||
copying one string to the other one element at a time and changing any that you | copying one string to the other one element at a time and changing any that you | ||
want something like this. | want something like this. | ||
− | + | ||
'''Example''' | '''Example''' | ||
i:=0; | i:=0; | ||
Line 350: | Line 353: | ||
} | } | ||
str:=newstr; | str:=newstr; | ||
− | + | ||
This snip of Dil would replace any 'f' in a string with a 'b' remember dil is | This snip of Dil would replace any 'f' in a string with a 'b' remember dil is | ||
not case sensitive so it will also replace an 'F'. | not case sensitive so it will also replace an 'F'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="strl" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>stringlist</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="strl" /> | ||
'''Stringlist:''' | '''Stringlist:''' | ||
− | + | ||
A stringlist is a list of separate strings. This is used for things such as | A stringlist is a list of separate strings. This is used for things such as | ||
(multiple) names or keywords. You may request a specified word in a stringlist | (multiple) names or keywords. You may request a specified word in a stringlist | ||
by its number. | by its number. | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
mystring := self.names.[2]; | mystring := self.names.[2]; | ||
− | + | ||
Returning null if out of bounds of the stringlist (see 'length()'). Static | Returning null if out of bounds of the stringlist (see 'length()'). Static | ||
stringlists are defined just as in the rest of the zonefile, as a comma separated | stringlists are defined just as in the rest of the zonefile, as a comma separated | ||
list of static strings within curly brackets. | list of static strings within curly brackets. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
mysrtringlist := {"Some string","another string","the last string"} | mysrtringlist := {"Some string","another string","the last string"} | ||
− | + | ||
Stringlists are modified through the 'addstring()' and 'substring()' procedures. | Stringlists are modified through the 'addstring()' and 'substring()' procedures. | ||
Stringlists are searched easily by the 'in' operator. See documentation below. | Stringlists are searched easily by the 'in' operator. See documentation below. | ||
They can also be set directly (see example above). Variables of type string are | They can also be set directly (see example above). Variables of type string are | ||
saved with DIL programs, if attached to a saved unit. | saved with DIL programs, if attached to a saved unit. | ||
− | + | ||
Elements of each separate string in a stringlist can be accessed by appending | Elements of each separate string in a stringlist can be accessed by appending | ||
a separate position at the end of the request for a string as follows: | a separate position at the end of the request for a string as follows: | ||
− | + | ||
'''Example''' | '''Example''' | ||
if (strlist.[5].[3]=="b"){ | if (strlist.[5].[3]=="b"){ | ||
do something | do something | ||
} | } | ||
− | + | ||
'''Note''' | '''Note''' | ||
See the strings for more information on accessing a single element. | See the strings for more information on accessing a single element. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="int" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>integer</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="int" /> | ||
'''Integer:''' | '''Integer:''' | ||
− | + | ||
Non-fraction numbers can be used throughout your DIL programs. They are given | Non-fraction numbers can be used throughout your DIL programs. They are given | ||
normally, or in normal C style hexadecimal, preceded with '0x'. Integers are | normally, or in normal C style hexadecimal, preceded with '0x'. Integers are | ||
signed 32-bit integers. Variables of type string are saved with DIL programs, | signed 32-bit integers. Variables of type string are saved with DIL programs, | ||
if attached to a saved unit. | if attached to a saved unit. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
0x10 | 0x10 | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
2 | 2 | ||
− | + | ||
Integers are used within expressions as both number value and boolean(true/false) | Integers are used within expressions as both number value and boolean(true/false) | ||
values. You may use comparison between integers through the comparison operators: | values. You may use comparison between integers through the comparison operators: | ||
Line 414: | Line 419: | ||
'>=' (greater or equal) | '>=' (greater or equal) | ||
'!=' (not equal). | '!=' (not equal). | ||
− | + | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
if (42<12) ... | if (42<12) ... | ||
− | + | ||
Returning the boolean value (true/false) depending on the comparison between | Returning the boolean value (true/false) depending on the comparison between | ||
integers. The result may be stored in an integer variable, and tested later, or | integers. The result may be stored in an integer variable, and tested later, or | ||
Line 425: | Line 430: | ||
expression themselves, using LOGICAL operators 'and','not','or', which allows | expression themselves, using LOGICAL operators 'and','not','or', which allows | ||
you to combine the expressions. | you to combine the expressions. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
if ( not ( (self.hp<42) or (self.level>10) ) ) .. | if ( not ( (self.hp<42) or (self.level>10) ) ) .. | ||
− | + | ||
Integer expressions may also use a number of other operators: | Integer expressions may also use a number of other operators: | ||
'+' (addition) | '+' (addition) | ||
Line 437: | Line 442: | ||
'|' (bitwise or, for flags), | '|' (bitwise or, for flags), | ||
'&' (bitwise and, for flags) | '&' (bitwise and, for flags) | ||
− | + | ||
Precedence rules for using these operators are still somewhat messed up. You'd | Precedence rules for using these operators are still somewhat messed up. You'd | ||
better use parenthesis where ever possible. | better use parenthesis where ever possible. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="intlist" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>integerlist</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="intlist" /> | ||
'''Intlist:''' | '''Intlist:''' | ||
− | + | ||
Intlists are an array of integer types. They can be set directly as follows: | Intlists are an array of integer types. They can be set directly as follows: | ||
− | + | ||
'''Example''' | '''Example''' | ||
− | + | ||
wpn:={5,3,6,9,3,9}; | wpn:={5,3,6,9,3,9}; | ||
− | + | ||
The intlists can be accessed in the same way stringlist are accessed as follows. | The intlists can be accessed in the same way stringlist are accessed as follows. | ||
− | + | ||
'''Example''' | '''Example''' | ||
− | + | ||
if (wpn.[5]==5) | if (wpn.[5]==5) | ||
{ | { | ||
do something | do something | ||
} | } | ||
− | + | ||
The intlists are saved on savable units. | The intlists are saved on savable units. | ||
− | + | ||
'''Type: '''<i><!--CODE-->intlist</i><!--ENDCODE--> | '''Type: '''<i><!--CODE-->intlist</i><!--ENDCODE--> | ||
− | + | ||
This variable type allows you to keep an ordered list of integers with out | This variable type allows you to keep an ordered list of integers with out | ||
having to create a variable for each integer. | having to create a variable for each integer. | ||
Line 469: | Line 475: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
myintlist:={1,5,9,2,8,5}; | myintlist:={1,5,9,2,8,5}; | ||
myintlist.[10]:=50; | myintlist.[10]:=50; | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
If you set a index that is higher then the highest index, every index in | If you set a index that is higher then the highest index, every index in | ||
between will be set to zero. For example if you only have two values in the | between will be set to zero. For example if you only have two values in the | ||
Line 484: | Line 490: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
if (myintlist.[5]==5){ | if (myintlist.[5]==5){ | ||
stuff | stuff | ||
} | } | ||
− | + | ||
if (myintlist<myint){ | if (myintlist<myint){ | ||
stuff | stuff | ||
} | } | ||
− | + | ||
i:=0; | i:=0; | ||
ln:=length(myintlist); | ln:=length(myintlist); | ||
Line 499: | Line 505: | ||
i:=i+1; | i:=i+1; | ||
} | } | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also:''' | '''See Also:''' | ||
Line 507: | Line 513: | ||
[[#bpremove|Remove]] | [[#bpremove|Remove]] | ||
[[#eptr|Extraptr]] | [[#eptr|Extraptr]] | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>extraptr</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="eptr" /> | ||
'''Extraptr:''' | '''Extraptr:''' | ||
− | + | ||
Extra descriptions, quests structures, etc can be searched and manipulated | Extra descriptions, quests structures, etc can be searched and manipulated | ||
using variables of this type. There is no way to declare static structures of | using variables of this type. There is no way to declare static structures of | ||
Line 516: | Line 523: | ||
the 'in' operator (See below). Extraptr variables are 'volatile', and thus | the 'in' operator (See below). Extraptr variables are 'volatile', and thus | ||
cleared whenever there is a possibility that they are rendered unusable. | cleared whenever there is a possibility that they are rendered unusable. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>cmdptr</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="cptr" /> | ||
'''Type: '''<i><!--CODE-->cmdptr</i><!--ENDCODE--> | '''Type: '''<i><!--CODE-->cmdptr</i><!--ENDCODE--> | ||
'''cmdptr fields''' | '''cmdptr fields''' | ||
− | + | ||
− | + | ||
'''name''' | '''name''' | ||
string - command name | string - command name | ||
Line 537: | Line 545: | ||
'''previous''' | '''previous''' | ||
cmdptr - pointer to the previous cmdptr | cmdptr - pointer to the previous cmdptr | ||
− | + | ||
− | + | ||
The cmdptr can be used to search the command list or display all the commands. | The cmdptr can be used to search the command list or display all the commands. | ||
I0t is also now possible to sort the commands by type by defining your own command | I0t is also now possible to sort the commands by type by defining your own command | ||
types and using the type field to sort on. | types and using the type field to sort on. | ||
− | + | ||
In order to get the first command in the list you use the following function: | In order to get the first command in the list you use the following function: | ||
'''Function: '''<i><!--CODE-->chead();</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->chead();</i><!--ENDCODE--> | ||
Line 550: | Line 558: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin cmdtst(arg : string); | dilbegin cmdtst(arg : string); | ||
var | var | ||
cmd : cmdptr; | cmd : cmdptr; | ||
st : string; | st : string; | ||
− | + | ||
code | code | ||
{ | { | ||
cmd := chead(); | cmd := chead(); | ||
− | + | ||
while (cmd) | while (cmd) | ||
{ | { | ||
Line 567: | Line 575: | ||
cmd := cmd.next; | cmd := cmd.next; | ||
} | } | ||
− | + | ||
cmd:=getcommand("kick"); | cmd:=getcommand("kick"); | ||
sendtext ("You must be "+itoa(cmd.level+" to use kick&n",self); | sendtext ("You must be "+itoa(cmd.level+" to use kick&n",self); | ||
− | + | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="uptr" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>unitptr</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="uptr" /> | ||
'''Unitptr:''' | '''Unitptr:''' | ||
− | + | ||
Unit pointers are used to keep track of units: rooms, players, non-player or | Unit pointers are used to keep track of units: rooms, players, non-player or | ||
objects. Through a variable of this type you can access most of the information | objects. Through a variable of this type you can access most of the information | ||
in a unit. Unitptr variables are 'volatile', and thus cleared whenever there is | in a unit. Unitptr variables are 'volatile', and thus cleared whenever there is | ||
a possibility that they are rendered unusable. | a possibility that they are rendered unusable. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>zoneptr</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="zptr" /> | |
+ | |||
'''Type: '''<i><!--CODE-->zoneptr</i><!--ENDCODE--> | '''Type: '''<i><!--CODE-->zoneptr</i><!--ENDCODE--> | ||
'''Zone Pointer Fields''' | '''Zone Pointer Fields''' | ||
− | + | ||
− | + | ||
<!--TERM--> '''next''' | <!--TERM--> '''next''' | ||
<!--DEFINITION--> unitptr - pointer to next zoneptr | <!--DEFINITION--> unitptr - pointer to next zoneptr | ||
Line 633: | Line 643: | ||
<!--TERM--> '''help''' | <!--TERM--> '''help''' | ||
<!--DEFINITION--> string - the Zone Help | <!--DEFINITION--> string - the Zone Help | ||
− | + | ||
− | + | ||
The 'zoneptr' works like a unitptr. To get the first zoneptr in the global | The 'zoneptr' works like a unitptr. To get the first zoneptr in the global | ||
list of zones you use 'zhead'. | list of zones you use 'zhead'. | ||
Line 641: | Line 651: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin zonelist (arg:string); | dilbegin zonelist (arg:string); | ||
var | var | ||
Line 657: | Line 667: | ||
z:=z.next; | z:=z.next; | ||
} | } | ||
− | + | ||
pagestring (buf,self); | pagestring (buf,self); | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Messages</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="messies" /> | ||
<h3>'''Messages:'''</h3> | <h3>'''Messages:'''</h3> | ||
− | + | ||
In DIL, a program attached to a unit gets activated when the program receives | In DIL, a program attached to a unit gets activated when the program receives | ||
a message. In order to save CPU usage, there are a number of different message | a message. In order to save CPU usage, there are a number of different message | ||
Line 682: | Line 693: | ||
reactivate on. The second parameter is an expression, which also must evaluate | reactivate on. The second parameter is an expression, which also must evaluate | ||
to TRUE. 'pause' is just special instances of the 'wait()' command. | to TRUE. 'pause' is just special instances of the 'wait()' command. | ||
− | + | ||
− | + | ||
<strong>Caveat Builder: </strong> | <strong>Caveat Builder: </strong> | ||
− | + | ||
Whenever you construct the arguments for the wait command, bear in mind that | Whenever you construct the arguments for the wait command, bear in mind that | ||
ALL your tests will be executed EVERYTIME a message of the relevant kind comes | ALL your tests will be executed EVERYTIME a message of the relevant kind comes | ||
through. Thus you should keep the length of the activation expression to a | through. Thus you should keep the length of the activation expression to a | ||
reasonable minimum, and you should NEVER use the time-consuming findxxx-functions. | reasonable minimum, and you should NEVER use the time-consuming findxxx-functions. | ||
− | + | ||
Valid example (That prohibits a player from removing an object): | Valid example (That prohibits a player from removing an object): | ||
− | + | ||
:glue: | :glue: | ||
− | + | ||
− | + | ||
wait(SFB_CMD,command(CMD_REMOVE)); | wait(SFB_CMD,command(CMD_REMOVE)); | ||
u := findunit(activator,argument,FIND_UNIT_IN_ME,null ); | u := findunit(activator,argument,FIND_UNIT_IN_ME,null ); | ||
Line 706: | Line 717: | ||
block; | block; | ||
goto glue; | goto glue; | ||
− | + | ||
'''See Also:''' | '''See Also:''' | ||
[[#findunit.html|Dil and Findunit()]] | [[#findunit.html|Dil and Findunit()]] | ||
− | + | ||
The message categories are as follows: | The message categories are as follows: | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbcmd" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_CMD</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="sfbcmd" /> | |
+ | |||
SFB_CMD Command message | SFB_CMD Command message | ||
− | + | ||
When this flag is set, the program gets activated by all commands (legal | When this flag is set, the program gets activated by all commands (legal | ||
or illegal) issued by PC's or NPC's. Moving around is also considered a | or illegal) issued by PC's or NPC's. Moving around is also considered a | ||
command. | command. | ||
− | + | ||
Assume a janitor executes the command ' | Assume a janitor executes the command ' | ||
Ge all from corpse', | Ge all from corpse', | ||
And Ge interprets to 'get' | And Ge interprets to 'get' | ||
− | + | ||
then this will occur in the DIL program: | then this will occur in the DIL program: | ||
− | + | ||
'activator'... is a unitptr to the janitor. | 'activator'... is a unitptr to the janitor. | ||
'cmdstr'...... is a string which contains 'get' | 'cmdstr'...... is a string which contains 'get' | ||
Line 731: | Line 743: | ||
'excmdstr_case'...... is a string which contains 'Ge' | 'excmdstr_case'...... is a string which contains 'Ge' | ||
'argument'.... will contain 'all from corpse' | 'argument'.... will contain 'all from corpse' | ||
− | + | ||
command(CMD_GET) will evaluate to TRUE. | command(CMD_GET) will evaluate to TRUE. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbdone" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_DONE</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="sfbdone" /> | |
+ | |||
SFB_DONE 'Command has now been executed' message | SFB_DONE 'Command has now been executed' message | ||
− | + | ||
When this flag is set, the program gets activated by all successful commands | When this flag is set, the program gets activated by all successful commands | ||
issued by PC's or NPC's. The 'activator', 'medium' and 'target' special | issued by PC's or NPC's. The 'activator', 'medium' and 'target' special | ||
values are used as follows: | values are used as follows: | ||
− | + | ||
'activator'... The PC / NPC which executed the command | 'activator'... The PC / NPC which executed the command | ||
'medium'...... The unit which is operated upon. | 'medium'...... The unit which is operated upon. | ||
'target'...... The target of the operation. | 'target'...... The target of the operation. | ||
− | + | ||
For example, assume the player John gives a garlic to Mary the Lumberjack | For example, assume the player John gives a garlic to Mary the Lumberjack | ||
wife. The following values are set: | wife. The following values are set: | ||
− | + | ||
activator == John (unitptr) | activator == John (unitptr) | ||
medium == Mushroom (unitptr) | medium == Mushroom (unitptr) | ||
target == Mary (unitptr) | target == Mary (unitptr) | ||
− | + | ||
command(CMD_GIVE) will evaluate to true. | command(CMD_GIVE) will evaluate to true. | ||
− | + | ||
You thus know that Mary has in fact received the mushroom. It is NOT possible | You thus know that Mary has in fact received the mushroom. It is NOT possible | ||
to block (using the 'block' command) these commands since they have already | to block (using the 'block' command) these commands since they have already | ||
Line 762: | Line 775: | ||
be a unitptr to where the unit was taken from, and target would be the object | be a unitptr to where the unit was taken from, and target would be the object | ||
which was taken. | which was taken. | ||
− | + | ||
See the file commands.txt for a description of how the arguments are set for | See the file commands.txt for a description of how the arguments are set for | ||
each command. If you can not find a command in there, just ask to get it | each command. If you can not find a command in there, just ask to get it | ||
implemented. Especially you should pay attention to the non-obvious SFB_DONE | implemented. Especially you should pay attention to the non-obvious SFB_DONE | ||
command(CMD_AUTO_ENTER). | command(CMD_AUTO_ENTER). | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbtick" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_TICK</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="sfbtick" /> | |
+ | |||
SFB_TICK Timer message | SFB_TICK Timer message | ||
− | + | ||
When this flag is set, the routine gets activated by a "clock". The clock | When this flag is set, the routine gets activated by a "clock". The clock | ||
ticks (in 1/4th of a second) are determined by the 'heartbeat' variable. | ticks (in 1/4th of a second) are determined by the 'heartbeat' variable. | ||
− | + | ||
'activator'... is null. | 'activator'... is null. | ||
'argument'.... will be empty. | 'argument'.... will be empty. | ||
− | + | ||
command(CMD_AUTO_TICK) will evaluate to TRUE. | command(CMD_AUTO_TICK) will evaluate to TRUE. | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbcom" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_COM</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="sfbcom" /> | ||
SFB_COM Combat message | SFB_COM Combat message | ||
− | + | ||
When this flag is set, the routine gets activated whenever a combat is in | When this flag is set, the routine gets activated whenever a combat is in | ||
progress. The unit containing the DIL program needs not be involved in the | progress. The unit containing the DIL program needs not be involved in the | ||
combat itself: | combat itself: | ||
− | + | ||
'activator'... is a unitptr to the PC/NPC about to hit someone else. | 'activator'... is a unitptr to the PC/NPC about to hit someone else. | ||
'argument'.... is empty. | 'argument'.... is empty. | ||
− | + | ||
command(CMD_AUTO_COMBAT) will evaluate to TRUE. | command(CMD_AUTO_COMBAT) will evaluate to TRUE. | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbdead" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_DEAD</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="sfbdead" /> | ||
SFB_DEAD Death message | SFB_DEAD Death message | ||
− | + | ||
When this flag is set, the routine gets activated when a PC or NPC dies: | When this flag is set, the routine gets activated when a PC or NPC dies: | ||
− | + | ||
'activator'... will point to the PC/NPC that is about to die. | 'activator'... will point to the PC/NPC that is about to die. | ||
'argument'.... is empty. | 'argument'.... is empty. | ||
− | + | ||
command(CMD_AUTO_DEATH) will evaluate to TRUE | command(CMD_AUTO_DEATH) will evaluate to TRUE | ||
− | + | ||
The SFB_DEAD message is sent, just as the character dies, while his items are | The SFB_DEAD message is sent, just as the character dies, while his items are | ||
still equipped, just before the corpse is created. The character's '.fighting' | still equipped, just before the corpse is created. The character's '.fighting' | ||
field points to his primary opponent, although this person does not necessarily | field points to his primary opponent, although this person does not necessarily | ||
have to be the one that killed him. | have to be the one that killed him. | ||
− | + | ||
This can be exploited by making items wiz invisible (the .minv field) just as | This can be exploited by making items wiz invisible (the .minv field) just as | ||
the message is received, causing them to stay inside the player rather than | the message is received, causing them to stay inside the player rather than | ||
Line 814: | Line 830: | ||
be a part of the player (remember to make it un-wizinvis when the player | be a part of the player (remember to make it un-wizinvis when the player | ||
returns from heaven - players should not have access to items while in heaven). | returns from heaven - players should not have access to items while in heaven). | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbmsg" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_MSG</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="sfbmsg" /> | |
+ | |||
SFB_MSG User message | SFB_MSG User message | ||
− | + | ||
When this flag is set, the routine gets activated when a message is passed | When this flag is set, the routine gets activated when a message is passed | ||
to it. Messages can be passed with the DIL commands 'sendto' and 'send': | to it. Messages can be passed with the DIL commands 'sendto' and 'send': | ||
− | + | ||
'activator'... is a unitptr to the unit sending the message. | 'activator'... is a unitptr to the unit sending the message. | ||
'argument'.... is a string containing possible data from the sender. | 'argument'.... is a string containing possible data from the sender. | ||
− | + | ||
command(CMD_AUTO_MSG) will evaluate to true. | command(CMD_AUTO_MSG) will evaluate to true. | ||
− | + | ||
− | + | ||
Messages are normally not generated by actions performed by the owner of the | Messages are normally not generated by actions performed by the owner of the | ||
program. For a program to be able to be aware of messages from the owner, a | program. For a program to be able to be aware of messages from the owner, a | ||
keyword 'aware' should be listed just after 'dilbegin'. | keyword 'aware' should be listed just after 'dilbegin'. | ||
− | + | ||
When a unit is saved, normally, the DIL programs in it would restart when the | When a unit is saved, normally, the DIL programs in it would restart when the | ||
program is loaded. However it is possible to let DIL programs recall their | program is loaded. However it is possible to let DIL programs recall their | ||
Line 840: | Line 857: | ||
inside a template called as a function or procedure from inside the original | inside a template called as a function or procedure from inside the original | ||
template. 'secure' and interrupts are not recalled upon loading the template. | template. 'secure' and interrupts are not recalled upon loading the template. | ||
− | + | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin recall aware mute(); | dilbegin recall aware mute(); | ||
var | var | ||
i : integer; | i : integer; | ||
− | + | ||
code | code | ||
{ | { | ||
Line 861: | Line 878: | ||
i := i - 1; | i := i - 1; | ||
} | } | ||
− | + | ||
i:=10; | i:=10; | ||
while (i>0) | while (i>0) | ||
Line 870: | Line 887: | ||
i := i - 1; | i := i - 1; | ||
} | } | ||
− | + | ||
i:=10; | i:=10; | ||
while (i>0) | while (i>0) | ||
Line 882: | Line 899: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
/* When attached to a PC, the pc will be unable to utter a sound the first 10 | /* When attached to a PC, the pc will be unable to utter a sound the first 10 | ||
sound command, and blood will spurt out. | sound command, and blood will spurt out. | ||
Line 895: | Line 912: | ||
time not having to pass the extra messages. | time not having to pass the extra messages. | ||
*/ | */ | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="sfbpre" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>SFB_PRE</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="sfbpre" /> | |
+ | |||
SFB_PRE Command preprocessing | SFB_PRE Command preprocessing | ||
− | + | ||
When this flag is set, the program is activated by a few special events | When this flag is set, the program is activated by a few special events | ||
which can then be blocked or changed. Currently, this event is triggered | which can then be blocked or changed. Currently, this event is triggered | ||
just prior to a spell being cast, and just prior to any sort of damage | just prior to a spell being cast, and just prior to any sort of damage | ||
being given to a target. | being given to a target. | ||
− | + | ||
PRE "command(CMD_CAST)" | PRE "command(CMD_CAST)" | ||
− | + | ||
Assume a a spell is cast from player A on player B with a scroll C. | Assume a a spell is cast from player A on player B with a scroll C. | ||
− | + | ||
'activator'... is a unitptr to A. | 'activator'... is a unitptr to A. | ||
'medium' ... is a unitptr to C. | 'medium' ... is a unitptr to C. | ||
'target' ... is a unitptr to B. | 'target' ... is a unitptr to B. | ||
− | + | ||
command(CMD_CAST) will evaluate to TRUE. | command(CMD_CAST) will evaluate to TRUE. | ||
− | + | ||
'argument'.... will contain a number followed by any | 'argument'.... will contain a number followed by any | ||
argument to the spell itself. You should | argument to the spell itself. You should | ||
Line 923: | Line 941: | ||
If you decide to block the spell, you ought to set it | If you decide to block the spell, you ought to set it | ||
to -1. | to -1. | ||
− | + | ||
Example: | Example: | ||
wait(SFB_PRE, command(CMD_CAST)); | wait(SFB_PRE, command(CMD_CAST)); | ||
− | + | ||
s := getword(argument); | s := getword(argument); | ||
splno := atoi(s); | splno := atoi(s); | ||
− | + | ||
if (splno == SPL_FIREBALL_3) | if (splno == SPL_FIREBALL_3) | ||
power := 0; /* No damage */ | power := 0; /* No damage */ | ||
... | ... | ||
− | + | ||
− | + | ||
PRE "command(CMD_AUTO_DAMAGE)" | PRE "command(CMD_AUTO_DAMAGE)" | ||
− | + | ||
Assume that damage is given from player A to player B with a sword C. | Assume that damage is given from player A to player B with a sword C. | ||
− | + | ||
'activator'... is a unitptr to A. | 'activator'... is a unitptr to A. | ||
'medium' ... is a unitptr to C. | 'medium' ... is a unitptr to C. | ||
'target' ... is a unitptr to B. | 'target' ... is a unitptr to B. | ||
− | + | ||
command(CMD_AUTO_DAMAGE) will evaluate to TRUE. | command(CMD_AUTO_DAMAGE) will evaluate to TRUE. | ||
− | + | ||
'power' .... is set to how much damage will be given. You can change | 'power' .... is set to how much damage will be given. You can change | ||
this number at will, but you should not set it to less | this number at will, but you should not set it to less | ||
than zero. | than zero. | ||
− | + | ||
'argument'.... will contain three numbers that you must parse to | 'argument'.... will contain three numbers that you must parse to | ||
determine what kind of damage we're talking about. | determine what kind of damage we're talking about. | ||
− | + | ||
First number is the attack group, this can be one of | First number is the attack group, this can be one of | ||
MSG_TYPE_XXX from values.h and/or vme.h. | MSG_TYPE_XXX from values.h and/or vme.h. | ||
− | + | ||
Second number is dependant on the attack group and | Second number is dependant on the attack group and | ||
identifies what damage compared to the group. For | identifies what damage compared to the group. For | ||
example WPN_XXX for weapon group. | example WPN_XXX for weapon group. | ||
− | + | ||
Third number is the body hit location, one of WEAR_XXX, | Third number is the body hit location, one of WEAR_XXX, | ||
(but not all of them, just hands, feet, legs, body, head, | (but not all of them, just hands, feet, legs, body, head, | ||
arms, i.e. the armour positions, not positions like finger | arms, i.e. the armour positions, not positions like finger | ||
or ear). | or ear). | ||
− | + | ||
− | + | ||
Example: | Example: | ||
wait(SFB_PRE, command(CMD_AUTO_DAMAGE)); | wait(SFB_PRE, command(CMD_AUTO_DAMAGE)); | ||
− | + | ||
s1 := getword(argument); | s1 := getword(argument); | ||
grpno := atoi(s1); | grpno := atoi(s1); | ||
− | + | ||
s2 := getword(argument); | s2 := getword(argument); | ||
atkno := atoi(s2); | atkno := atoi(s2); | ||
− | + | ||
s3 := getword(argument); | s3 := getword(argument); | ||
hitloc := atoi(s3); | hitloc := atoi(s3); | ||
− | + | ||
if (grpno == MSG_TYPE_SPELL) | if (grpno == MSG_TYPE_SPELL) | ||
{ | { | ||
Line 987: | Line 1,005: | ||
} | } | ||
... | ... | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
'''<i>A note upon activating a DIL program</i>''' | '''<i>A note upon activating a DIL program</i>''' | ||
− | + | ||
This is what you can't do: | This is what you can't do: | ||
− | + | ||
If a DIL program is already active, e.g. it is sending a message or | If a DIL program is already active, e.g. it is sending a message or | ||
perhaps using "exec" to perform an action, then it can not be activated. | perhaps using "exec" to perform an action, then it can not be activated. | ||
Thus, any active DIL program is unable to catch further messages. | Thus, any active DIL program is unable to catch further messages. | ||
Imagine this setting: | Imagine this setting: | ||
− | + | ||
You have five program P1..P5. P1 sends a message, which is intercepted | You have five program P1..P5. P1 sends a message, which is intercepted | ||
by P2. P2 now sends a message, but since P1 is busy it can not process | by P2. P2 now sends a message, but since P1 is busy it can not process | ||
Line 1,007: | Line 1,025: | ||
are "busy". If P5 sends a message no-one can act upon it. When P5 | are "busy". If P5 sends a message no-one can act upon it. When P5 | ||
returns, so does P4, P3, P2 and finally P1. | returns, so does P4, P3, P2 and finally P1. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Built-In Variables</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="built_in" /> | ||
<h3>'''Built-in Variables:'''</h3> | <h3>'''Built-in Variables:'''</h3> | ||
− | <!--LINK--><span id="cmdstr" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>cmdstr</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="cmdstr" /> | ||
'cmdstr' | 'cmdstr' | ||
This variable is a string which contains the "command" which was entered | This variable is a string which contains the "command" which was entered | ||
by a player. The result of adding: | by a player. The result of adding: | ||
− | + | ||
cmdstr + " " + argument | cmdstr + " " + argument | ||
− | + | ||
is the entire string as entered by the player. | is the entire string as entered by the player. | ||
The 'cmdstr' is EXPANDED by the interpreter, so assume a player | The 'cmdstr' is EXPANDED by the interpreter, so assume a player | ||
types 's' then the string is expanded to 'south'. | types 's' then the string is expanded to 'south'. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>excmdstr</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="excmdstr" /> | ||
'excmdstr' | 'excmdstr' | ||
This variable is a string which contains the "first string" which was entered | This variable is a string which contains the "first string" which was entered | ||
by a player. The result of adding: | by a player. The result of adding: | ||
− | + | ||
excmdstr + " " + argument | excmdstr + " " + argument | ||
− | + | ||
is the entire string as entered by the player. The 'excmdstr' is not | is the entire string as entered by the player. The 'excmdstr' is not | ||
EXPANDED by the interpreter, but it is converted to lower case. So | EXPANDED by the interpreter, but it is converted to lower case. So | ||
Line 1,034: | Line 1,055: | ||
'excmdstr' is however changed to all lower case if you don't want | 'excmdstr' is however changed to all lower case if you don't want | ||
this see 'excmdstr_case'. | this see 'excmdstr_case'. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>excmdstr_case</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="excmdstr_case" /> | ||
'excmdstr_case' | 'excmdstr_case' | ||
This variable is a string which contains the "first string" which was entered | This variable is a string which contains the "first string" which was entered | ||
by a player. The result of adding: | by a player. The result of adding: | ||
− | + | ||
excmdstr_case + " " + argument | excmdstr_case + " " + argument | ||
− | + | ||
is the entire string as entered by the player. | is the entire string as entered by the player. | ||
The 'excmdstr' is not changed in anyway from how a player types it. | The 'excmdstr' is not changed in anyway from how a player types it. | ||
If a player types 'S' then the 'excmdstr_case' will have 'S' in it. | If a player types 'S' then the 'excmdstr_case' will have 'S' in it. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="self" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>self</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="self" /> | ||
'self' | 'self' | ||
This variable is a unitptr to the unit owning the DIL program. | This variable is a unitptr to the unit owning the DIL program. | ||
Line 1,054: | Line 1,077: | ||
For example, if Mary has a program, then self.title equals | For example, if Mary has a program, then self.title equals | ||
"Mary the Lumberjack wife" | "Mary the Lumberjack wife" | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="activator" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>activator</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="activator" /> | ||
'activator' | 'activator' | ||
This variable is a unit pointer to the unit which activated the DIL | This variable is a unit pointer to the unit which activated the DIL | ||
Line 1,062: | Line 1,086: | ||
and the program was setup to catch it, with : wait (SFB_CMD...). | and the program was setup to catch it, with : wait (SFB_CMD...). | ||
See description of messages for more information. | See description of messages for more information. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="targ" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>target</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="targ" /> | ||
'target' | 'target' | ||
This variable is a unit pointer to the unit which is the target of the | This variable is a unit pointer to the unit which is the target of the | ||
Line 1,070: | Line 1,095: | ||
destination in a give command. | destination in a give command. | ||
See description of messages for more information. | See description of messages for more information. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="medium" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>medium</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="medium" /> | ||
'medium' | 'medium' | ||
This variable is a unit pointer to the unit which was used during an | This variable is a unit pointer to the unit which was used during an | ||
Line 1,078: | Line 1,104: | ||
was the medium in a get operation. | was the medium in a get operation. | ||
See description of messages for more information. | See description of messages for more information. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="power" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>power</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="power" /> | ||
'power' | 'power' | ||
This variable is an integer which can be reassigned. It is used in | This variable is an integer which can be reassigned. It is used in | ||
Line 1,087: | Line 1,114: | ||
This could then be reduced to 50 by assigning a new number. | This could then be reduced to 50 by assigning a new number. | ||
See description of messages for more information. | See description of messages for more information. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="argu" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>argument</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="argu" /> | ||
'argument' | 'argument' | ||
This variable is a string, showing the argument of a command resulting | This variable is a string, showing the argument of a command resulting | ||
in the activation of the DIL program. See SFB_CMD for example. | in the activation of the DIL program. See SFB_CMD for example. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="hb" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>heartbeat</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="hb" /> | ||
'heartbeat' | 'heartbeat' | ||
This is the DIL programs heartbeat. It can be assigned runtime to | This is the DIL programs heartbeat. It can be assigned runtime to | ||
Line 1,103: | Line 1,132: | ||
Example: | Example: | ||
heartbeat := PULSE_SEC*25; /* Tick every 25 seconds */ | heartbeat := PULSE_SEC*25; /* Tick every 25 seconds */ | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="null" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>null</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="null" /> | ||
'null' | 'null' | ||
This is a null pointer. | This is a null pointer. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="weather" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>weather</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="weather" /> | ||
'weather' | 'weather' | ||
This is the state of the mud-weather. It will equal one of the | This is the state of the mud-weather. It will equal one of the | ||
SKY_XXX values in values.h and/or vme.h. | SKY_XXX values in values.h and/or vme.h. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bvrealtime" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>realtime</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bvrealtime" /> | ||
'realtime' | 'realtime' | ||
This variable returns the number of seconds passed since 1970 something. | This variable returns the number of seconds passed since 1970 something. | ||
For C buffs this is equivalent to time(NULL). | For C buffs this is equivalent to time(NULL). | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="mmmm" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>mud(day,month,..)</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="mmmm" /> | ||
'mudday' | 'mudday' | ||
'mudhour' | 'mudhour' | ||
Line 1,129: | Line 1,162: | ||
These variables lets your program keep track of the time in the mud. | These variables lets your program keep track of the time in the mud. | ||
They all have integer types. | They all have integer types. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>DIL Constructs</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="const" /> | ||
<h3>'''DIL constructs:'''</h3> | <h3>'''DIL constructs:'''</h3> | ||
− | + | ||
DIL offers a set of construct for you to program with. | DIL offers a set of construct for you to program with. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="dcif" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>if()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="dcif" /> | ||
'''if:''' | '''if:''' | ||
The if statement is much like C. It takes any type as | The if statement is much like C. It takes any type as | ||
argument. Non integers are considered 'TRUE' if they are | argument. Non integers are considered 'TRUE' if they are | ||
not null. | not null. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,159: | Line 1,194: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,173: | Line 1,208: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,185: | Line 1,220: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>goto</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="dcgoto" /> | ||
'''goto:''' | '''goto:''' | ||
The goto statement lets you jump about in the code. | The goto statement lets you jump about in the code. | ||
Labels in your DIL programs, for 'goto' or interrupts | Labels in your DIL programs, for 'goto' or interrupts | ||
are defined within ':'. For an example, see the program below. | are defined within ':'. For an example, see the program below. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,207: | Line 1,243: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="dcwhile" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>while()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="dcwhile" /> | ||
'''while:''' | '''while:''' | ||
The while statement lets you execute a series of | The while statement lets you execute a series of | ||
statements while an expression evaluates to TRUE. | statements while an expression evaluates to TRUE. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,228: | Line 1,265: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
− | '''break:''' <!--LINK--><span id="dcbreak" /> | + | '''break:''' <!--PAGENAMESTART--><span style="color: red"><b>break</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="dcbreak" /> | ||
The break statement makes you break out of any | The break statement makes you break out of any | ||
loop you're currently in. | loop you're currently in. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,250: | Line 1,288: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="dccont" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>continue</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="dccont" /> | ||
'''continue:''' | '''continue:''' | ||
The continue statement makes you jump to the top | The continue statement makes you jump to the top | ||
of any loop you're currently in. | of any loop you're currently in. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,274: | Line 1,313: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="ongoto" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>on ... goto ...</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="ongoto" /> | ||
'''on <i>n</i> goto <i>la</i>, <i>lb</i>, ..., <i>ln</i>:''' | '''on <i>n</i> goto <i>la</i>, <i>lb</i>, ..., <i>ln</i>:''' | ||
− | + | ||
This construct is an easy way of performing a goto operation | This construct is an easy way of performing a goto operation | ||
based on the result of an integer. The integer value 'n' must | based on the result of an integer. The integer value 'n' must | ||
Line 1,284: | Line 1,324: | ||
in the label-list. If n is outside this range, the on-goto operation | in the label-list. If n is outside this range, the on-goto operation | ||
is skipped and execution continues at the next instruction. | is skipped and execution continues at the next instruction. | ||
− | + | ||
Based on the value of 'n' execution continues at the label | Based on the value of 'n' execution continues at the label | ||
corresponding to number 'n' in the list. I.e. if n is 0, then | corresponding to number 'n' in the list. I.e. if n is 0, then | ||
execution continues at the first specified label, if n is 1 | execution continues at the first specified label, if n is 1 | ||
then at the second, etc. etc. | then at the second, etc. etc. | ||
− | + | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
Assume you have an integer 'i' larger than zero, which takes | Assume you have an integer 'i' larger than zero, which takes | ||
on 0, 1, 2, 3, 4 or 5. Based on each value you need to take a | on 0, 1, 2, 3, 4 or 5. Based on each value you need to take a | ||
different action, this is how you can do it: | different action, this is how you can do it: | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
on i goto grin, laugh, grin, nada, poke, laugh; | on i goto grin, laugh, grin, nada, poke, laugh; | ||
log("Value was not in the range 0..5"); | log("Value was not in the range 0..5"); | ||
quit; | quit; | ||
− | + | ||
:laugh: | :laugh: | ||
exec("grin", self); | exec("grin", self); | ||
goto ...; | goto ...; | ||
− | + | ||
:grin: | :grin: | ||
exec("cackle", self); | exec("cackle", self); | ||
goto ...; | goto ...; | ||
− | + | ||
:blank: | :blank: | ||
exec("cry", self); | exec("cry", self); | ||
goto ...; | goto ...; | ||
− | + | ||
:poke: | :poke: | ||
exec("smirk", self); | exec("smirk", self); | ||
Line 1,320: | Line 1,360: | ||
</nowiki> | </nowiki> | ||
It is often used in this context | It is often used in this context | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
on rnd(0,4) goto l1, l2, l3, l4, l5; | on rnd(0,4) goto l1, l2, l3, l4, l5; | ||
− | + | ||
:l1: | :l1: | ||
bla; | bla; | ||
− | + | ||
:l2: | :l2: | ||
bla; | bla; | ||
− | + | ||
.... | .... | ||
− | + | ||
</nowiki> | </nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="forea" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>foreach()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="forea" /> | ||
'''foreach:''' | '''foreach:''' | ||
Foreach is an easy way to process all the units in the | Foreach is an easy way to process all the units in the | ||
Line 1,344: | Line 1,385: | ||
continue in a foreach statement. The unit executing the | continue in a foreach statement. The unit executing the | ||
foreach ('self') is always a part of the foreach. | foreach ('self') is always a part of the foreach. | ||
− | + | ||
It is important to understand that the units in the local | It is important to understand that the units in the local | ||
environment are relative to the 'self' executing the foreach. | environment are relative to the 'self' executing the foreach. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
This foreach is copied onto the spell caster, and hence all units | This foreach is copied onto the spell caster, and hence all units | ||
Line 1,353: | Line 1,394: | ||
Assume that it was executed on the spell caster's staff, then all units | Assume that it was executed on the spell caster's staff, then all units | ||
found would be relative to the staff, i.e. the spell caster's inventory. | found would be relative to the staff, i.e. the spell caster's inventory. | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
... | ... | ||
foreach (UNIT_ST_PC|UNIT_ST_NPC, u) | foreach (UNIT_ST_PC|UNIT_ST_NPC, u) | ||
Line 1,373: | Line 1,414: | ||
} | } | ||
...</nowiki> | ...</nowiki> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Assignment</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="assgn" /> | |
+ | |||
<h3>'''Assignment:'''</h3> | <h3>'''Assignment:'''</h3> | ||
You can assign values to the variables you declare | You can assign values to the variables you declare | ||
Line 1,383: | Line 1,425: | ||
of an expression | of an expression | ||
(the addition of strings below as an example) | (the addition of strings below as an example) | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
var | var | ||
Line 1,403: | Line 1,445: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Expressions</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="express" /> | |
+ | |||
<h3>'''Expressions:'''</h3> | <h3>'''Expressions:'''</h3> | ||
The expressions used in assignment can return any | The expressions used in assignment can return any | ||
Line 1,413: | Line 1,456: | ||
in any action being taken. Fail is returned when you | in any action being taken. Fail is returned when you | ||
request a field from a null pointer, or the like. | request a field from a null pointer, or the like. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
var | var | ||
Line 1,437: | Line 1,480: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="ops" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>Operators</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="ops" /> | ||
<h3>'''Operators:'''</h3> | <h3>'''Operators:'''</h3> | ||
− | + | ||
DIL features many other operators. For integers, | DIL features many other operators. For integers, | ||
'<', '>', '<=', '>=', '!=' '==' signify less than, | '<', '>', '<=', '>=', '!=' '==' signify less than, | ||
Line 1,452: | Line 1,496: | ||
The '$=' and '#=' is considered obsolete, and only | The '$=' and '#=' is considered obsolete, and only | ||
used for backward compatibility. | used for backward compatibility. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="ein" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>in</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="ein" /> | ||
'''in:''' | '''in:''' | ||
The special operator 'in' is a multipurpose operator for | The special operator 'in' is a multipurpose operator for | ||
Line 1,460: | Line 1,505: | ||
quests and extra descriptions, stringlists and search | quests and extra descriptions, stringlists and search | ||
for words in strings. | for words in strings. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="esins" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>string in string</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="esins" /> | ||
string 'in' string | string 'in' string | ||
Argument 1: A string to find. | Argument 1: A string to find. | ||
Argument 2: A string to search. | Argument 2: A string to search. | ||
Return: TRUE, if first string is found in second string. | Return: TRUE, if first string is found in second string. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,480: | Line 1,526: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="esinsl" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>string in stringlist</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="esinsl" /> | ||
string 'in' stringlist | string 'in' stringlist | ||
Argument 1: A string to find. | Argument 1: A string to find. | ||
Line 1,489: | Line 1,536: | ||
non existent. If found the number equals the index of the | non existent. If found the number equals the index of the | ||
string found plus one. | string found plus one. | ||
− | + | ||
Example 1: | Example 1: | ||
s := "c"; | s := "c"; | ||
sl := {"a","b","c","d"}; | sl := {"a","b","c","d"}; | ||
i := s in sl; | i := s in sl; | ||
− | + | ||
The result of 'i' is 3, and sl.[i-1] equals "c" (s). | The result of 'i' is 3, and sl.[i-1] equals "c" (s). | ||
− | + | ||
Example 2: | Example 2: | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,509: | Line 1,556: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="esine" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>string in extraptr</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="esine" /> | ||
string in extraptr | string in extraptr | ||
Argument 1: A string to find. | Argument 1: A string to find. | ||
Line 1,518: | Line 1,566: | ||
null if none. (names must be exact letter by letter | null if none. (names must be exact letter by letter | ||
match, although case is ignored). | match, although case is ignored). | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,533: | Line 1,581: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Functions</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="funcs" /> | ||
<h3>Functions:</h3> | <h3>Functions:</h3> | ||
DIL features an extended set of built-in functions | DIL features an extended set of built-in functions | ||
Line 1,540: | Line 1,589: | ||
any expression in DIL. The built-in functions are | any expression in DIL. The built-in functions are | ||
listed later. | listed later. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
code | code | ||
Line 1,552: | Line 1,601: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
DIL also lets you use templates as functions, but in a | DIL also lets you use templates as functions, but in a | ||
limited way. Using templates as functions, you may only | limited way. Using templates as functions, you may only | ||
use the return value to assign it to one of the variables | use the return value to assign it to one of the variables | ||
declared in the 'var' section. No fields. | declared in the 'var' section. No fields. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin integer bar(s:string); | dilbegin integer bar(s:string); | ||
code | code | ||
Line 1,569: | Line 1,618: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
external | external | ||
Line 1,584: | Line 1,633: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="fquit" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>quit</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="fquit" /> | ||
quit: | quit: | ||
This simple command quits the entire DIL program, even if | This simple command quits the entire DIL program, even if | ||
called while inside a procedure or function. | called while inside a procedure or function. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="fret" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>return</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="fret" /> | ||
return: | return: | ||
Return from a call to a procedure template (no return type | Return from a call to a procedure template (no return type | ||
declared). The execution continues from where the procedure | declared). The execution continues from where the procedure | ||
was called. | was called. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="fret2" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>return()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="fret2" /> | ||
return(): | return(): | ||
Return from a call to a function (return type declared). | Return from a call to a function (return type declared). | ||
The expression inside the parenthesis evaluates to the value | The expression inside the parenthesis evaluates to the value | ||
returned. | returned. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
DIL also allows for game-time *symbolic* resolving of | DIL also allows for game-time *symbolic* resolving of | ||
function/procedure names. This allows you to pass template names | function/procedure names. This allows you to pass template names | ||
Line 1,612: | Line 1,664: | ||
function call requires taxing look ups and type check runtime, so | function call requires taxing look ups and type check runtime, so | ||
use the normal kind of procedures if possible. | use the normal kind of procedures if possible. | ||
− | + | ||
In effect, the syntax of a symbolic call is similar to that of | In effect, the syntax of a symbolic call is similar to that of | ||
a normal, except you use a string variable as function name | a normal, except you use a string variable as function name | ||
Line 1,620: | Line 1,672: | ||
is made. Otherwise, the call is skipped. Note that you will get no | is made. Otherwise, the call is skipped. Note that you will get no | ||
type check by the compiler when using symbolic references. | type check by the compiler when using symbolic references. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Fields</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="fields" /> | ||
<h3>'''Fields:'''</h3> | <h3>'''Fields:'''</h3> | ||
− | + | ||
The 'extraptr' and 'unitptr' types contain information which is available to | The 'extraptr' and 'unitptr' types contain information which is available to | ||
you by using fields. For example (self is a unitptr), self.inside is a | you by using fields. For example (self is a unitptr), self.inside is a | ||
Line 1,632: | Line 1,685: | ||
indirectly using certain procedure calls in DIL. Others may not be changed | indirectly using certain procedure calls in DIL. Others may not be changed | ||
at all. All are readable for DIL programs. | at all. All are readable for DIL programs. | ||
− | + | ||
The extraptr structure is used for several things. The primary is | The extraptr structure is used for several things. The primary is | ||
extra descriptions for units, and quest data. Keywords in the 'names' | extra descriptions for units, and quest data. Keywords in the 'names' | ||
field and the actual description/data in the 'descr' field. | field and the actual description/data in the 'descr' field. | ||
− | + | ||
In the following (RW) means the value may be assigned new values by DIL, | In the following (RW) means the value may be assigned new values by DIL, | ||
while (RO) means the the value only can be read. A (RO) value might be | while (RO) means the the value only can be read. A (RO) value might be | ||
possible to change through built-in functions/procedures | possible to change through built-in functions/procedures | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="extra" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>extraptr</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="extra" /> | ||
'''The extraptr has the following fields:''' | '''The extraptr has the following fields:''' | ||
− | + | ||
extraptr: | extraptr: | ||
'names' :stringlist (RW) | 'names' :stringlist (RW) | ||
Line 1,653: | Line 1,707: | ||
'vals' :intlist (RW) | 'vals' :intlist (RW) | ||
vals is a list of integer values attached to this extra. | vals is a list of integer values attached to this extra. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
The unitptr is the key structure in the MUD, containing any kind of the | The unitptr is the key structure in the MUD, containing any kind of the | ||
following subtypes: | following subtypes: | ||
− | + | ||
object : a normal object, a sword, a vail, etc. | object : a normal object, a sword, a vail, etc. | ||
room : a room, location or the like. | room : a room, location or the like. | ||
pc : a playing character. | pc : a playing character. | ||
npc : a non playing character (mobile, monster, etc) | npc : a non playing character (mobile, monster, etc) | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="unit" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>unitptr</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="unit" /> | ||
'''The unitptr has the following fields:''' | '''The unitptr has the following fields:''' | ||
− | + | ||
unitptr: | unitptr: | ||
'names' :stringlist (RW) | 'names' :stringlist (RW) | ||
Line 1,768: | Line 1,823: | ||
Returns the number of units loaded in the game | Returns the number of units loaded in the game | ||
of this definition (zoneidx,nameidx / idx) | of this definition (zoneidx,nameidx / idx) | ||
− | <!--LINK--><span id="uobj" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>UNIT_ST_OBJ</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="uobj" /> | ||
'''if the type is UNIT_ST_OBJ''' | '''if the type is UNIT_ST_OBJ''' | ||
− | + | ||
'objecttype' :integer (RW) | 'objecttype' :integer (RW) | ||
The type of an object, see ITEM_* in values.h and/or vme.h for types. | The type of an object, see ITEM_* in values.h and/or vme.h for types. | ||
Line 1,789: | Line 1,845: | ||
inventory to tell if they are equipped by that PC/NPC. | inventory to tell if they are equipped by that PC/NPC. | ||
use the 'addequip()' and 'unequip()' procedures. | use the 'addequip()' and 'unequip()' procedures. | ||
− | <!--LINK--><span id="uroom" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>UNIT_ST_ROOM</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="uroom" /> | ||
'''if the type is UNIT_ST_ROOM''' | '''if the type is UNIT_ST_ROOM''' | ||
− | + | ||
Note: the descr fields of exits are available as standard extra | Note: the descr fields of exits are available as standard extra | ||
keywords, ie. 'north' ,'east',...,'down'. | keywords, ie. 'north' ,'east',...,'down'. | ||
Example: | Example: | ||
ex := 'north' in self.extra; | ex := 'north' in self.extra; | ||
− | + | ||
'exit_names'[] :stringlist (RW) | 'exit_names'[] :stringlist (RW) | ||
The names matching the exit name 'open grate' The index should | The names matching the exit name 'open grate' The index should | ||
Line 1,817: | Line 1,874: | ||
'movement' :integer (RW) | 'movement' :integer (RW) | ||
The type of movement in the room, see SECT_* in values.h and/or vme.h | The type of movement in the room, see SECT_* in values.h and/or vme.h | ||
− | <!--LINK--><span id="upcnpc" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>UNIT_ST_PC and UNIT_ST_NPC</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="upcnpc" /> | ||
'''if the type is UNIT_ST_PC or UNIT_ST_NPC ''' | '''if the type is UNIT_ST_PC or UNIT_ST_NPC ''' | ||
− | + | ||
'speed' :integer (RO) | 'speed' :integer (RO) | ||
The current default combat-speed (as seen by wstat) | The current default combat-speed (as seen by wstat) | ||
Line 1,861: | Line 1,919: | ||
'weapons'[] :integer (RO) | 'weapons'[] :integer (RO) | ||
The weapon skills of a PC/NPC. Index should be WPN_* in values.h and/or vme.h | The weapon skills of a PC/NPC. Index should be WPN_* in values.h and/or vme.h | ||
− | <!--LINK--><span id="unpc" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>UNIT_ST_NPC</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="unpc" /> | ||
'''if the type is UNIT_ST_NPC ''' | '''if the type is UNIT_ST_NPC ''' | ||
− | + | ||
'defaultpos' :integer (RW) | 'defaultpos' :integer (RW) | ||
The default position of an NPC, see POSITION_* in values.h and/or vme.h | The default position of an NPC, see POSITION_* in values.h and/or vme.h | ||
Line 1,872: | Line 1,931: | ||
'switched' :unitptr (RW) | 'switched' :unitptr (RW) | ||
Character that is switched into this NPC. | Character that is switched into this NPC. | ||
− | <!--LINK--><span id="upc" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>UNIT_ST_PC</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="upc" /> | ||
'''if the type is UNIT_ST_PC''' | '''if the type is UNIT_ST_PC''' | ||
− | + | ||
'birth' :integer (RO) | 'birth' :integer (RO) | ||
The time a PC was created. | The time a PC was created. | ||
Line 1,916: | Line 1,976: | ||
credit of the player, what would be shown on total in wstat | credit of the player, what would be shown on total in wstat | ||
<player> acc. | <player> acc. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Built-In Functions</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="built_func" /> | |
+ | |||
<h3>Built-In Functions:</h3> | <h3>Built-In Functions:</h3> | ||
− | + | ||
The following are definitions and documentation for the | The following are definitions and documentation for the | ||
built-in functions in DIL. The definitions are not | built-in functions in DIL. The definitions are not | ||
definitions 'as such', but serve to distinguish arguments | definitions 'as such', but serve to distinguish arguments | ||
in the documentation below. | in the documentation below. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfasctime" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>asctime()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfasctime" /> | ||
string asctime(i : integer) | string asctime(i : integer) | ||
i : the time to convert in seconds ([[#bvrealtime|realtime]] variable) | i : the time to convert in seconds ([[#bvrealtime|realtime]] variable) | ||
− | + | ||
Returns: The seconds converted into an ascii format date of the following | Returns: The seconds converted into an ascii format date of the following | ||
form "Mon Nov 18 18:49:08 1996" | form "Mon Nov 18 18:49:08 1996" | ||
− | + | ||
Example: | Example: | ||
log(asctime(realtime)); | log(asctime(realtime)); | ||
− | + | ||
</PRE | </PRE | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>strcmp()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfstrcmp" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer strcmp( s1:string, s2:string) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer strcmp( s1:string, s2:string) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''s1''' | <!--TERM--> '''s1''' | ||
<!--DEFINITION--> first string | <!--DEFINITION--> first string | ||
<!--TERM--> '''s2''' | <!--TERM--> '''s2''' | ||
<!--DEFINITION--> second string | <!--DEFINITION--> second string | ||
− | + | ||
'''returns''' | '''returns''' | ||
<!--TERM--> '''-1''' | <!--TERM--> '''-1''' | ||
Line 1,956: | Line 2,019: | ||
<!--TERM--> '''1''' | <!--TERM--> '''1''' | ||
<!--DEFINITION--> if s1 > s2 | <!--DEFINITION--> if s1 > s2 | ||
− | + | ||
− | + | ||
This allows you to compare strings with case sensitivity in place. If | This allows you to compare strings with case sensitivity in place. If | ||
you don't care about the case of the string use the normal '==' '>', | you don't care about the case of the string use the normal '==' '>', | ||
Line 1,964: | Line 2,027: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
if (strcmp("I Care about Capitals",s2)==0)) | if (strcmp("I Care about Capitals",s2)==0)) | ||
{ | { | ||
Line 1,970: | Line 2,033: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>strncmp()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfstrncmp" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer strcmp( s1:string, s2:string l :integer) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer strcmp( s1:string, s2:string l :integer) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''s1''' | <!--TERM--> '''s1''' | ||
<!--DEFINITION--> first string | <!--DEFINITION--> first string | ||
Line 1,987: | Line 2,051: | ||
<!--TERM--> '''l''' | <!--TERM--> '''l''' | ||
<!--DEFINITION--> amount of significant digits to compare | <!--DEFINITION--> amount of significant digits to compare | ||
− | + | ||
'''returns''' | '''returns''' | ||
<!--TERM--> '''-1''' | <!--TERM--> '''-1''' | ||
Line 1,995: | Line 2,059: | ||
<!--TERM--> '''1''' | <!--TERM--> '''1''' | ||
<!--DEFINITION--> if s1 > s2 | <!--DEFINITION--> if s1 > s2 | ||
− | + | ||
− | + | ||
This allows you to compare strings with case sensitivity in place and it | This allows you to compare strings with case sensitivity in place and it | ||
allows you to choose how much of the strings are compared. | allows you to choose how much of the strings are compared. | ||
Line 2,002: | Line 2,066: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
if (strcmp("Mark Carper",s2,4)==0)) | if (strcmp("Mark Carper",s2,4)==0)) | ||
{ | { | ||
Line 2,008: | Line 2,072: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bftextformat" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>textformat()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bftextformat" /> | ||
string textformat(s : string) | string textformat(s : string) | ||
s : The text string to format. The string is formatted according to | s : The text string to format. The string is formatted according to | ||
the escape format codes as defined in one of the other documents. | the escape format codes as defined in one of the other documents. | ||
− | + | ||
Returns: The formatted string which will automatically adapt to each | Returns: The formatted string which will automatically adapt to each | ||
individual player's settings. | individual player's settings. | ||
− | + | ||
Example: | Example: | ||
ts := note.extra.descr; | ts := note.extra.descr; | ||
rs := textformat(ts); | rs := textformat(ts); | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfsplind" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>spellindex()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfsplind" /> | ||
integer spellindex(s : string) | integer spellindex(s : string) | ||
s : The abbreviated or full spell name | s : The abbreviated or full spell name | ||
− | + | ||
Returns: -1 if no such spell, otherwise it returns the spell index | Returns: -1 if no such spell, otherwise it returns the spell index | ||
for that spell. | for that spell. | ||
− | + | ||
Example: | Example: | ||
s := "cu li wo"; /* cure light wounds */ | s := "cu li wo"; /* cure light wounds */ | ||
i := spellindex(s); | i := spellindex(s); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfsplinf" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>spellinfo()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfsplinf" /> | ||
string spellinfo(idx : integer, i1 : integer, i2 : integer, i3 : integer, | string spellinfo(idx : integer, i1 : integer, i2 : integer, i3 : integer, | ||
i4 : integer, i5 : integer, i6 : integer, i7 : integer, ) | i4 : integer, i5 : integer, i6 : integer, i7 : integer, ) | ||
− | + | ||
idx : The spell index (SPL_XXX). You might want to use spellindex | idx : The spell index (SPL_XXX). You might want to use spellindex | ||
to find this value. | to find this value. | ||
− | + | ||
Returns: | Returns: | ||
The full name of the spell, or the empty string if no such spell. | The full name of the spell, or the empty string if no such spell. | ||
− | + | ||
All the integer parameters are set to the following values: | All the integer parameters are set to the following values: | ||
i1 : Spell realm (MAG / DIC) | i1 : Spell realm (MAG / DIC) | ||
Line 2,062: | Line 2,129: | ||
i6 : Mediums (MEDIA_XXX) | i6 : Mediums (MEDIA_XXX) | ||
i7 : Targets (FIND_UNIT_XXX & TAR_XXX) | i7 : Targets (FIND_UNIT_XXX & TAR_XXX) | ||
− | + | ||
Example: | Example: | ||
s := "cu li wo"; /* cure light wounds */ | s := "cu li wo"; /* cure light wounds */ | ||
Line 2,068: | Line 2,135: | ||
s := spellinfo(i, i1, i2, i3, i4, i5, i6, i7); | s := spellinfo(i, i1, i2, i3, i4, i5, i6, i7); | ||
/* s & i1 - i7 now set */ | /* s & i1 - i7 now set */ | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>beginedit()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpbeginedit" /> | |
+ | |||
'''Function:''' <i><!--CODE-->beginedit ( u : unitptr);</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->beginedit ( u : unitptr);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> the PC unit doing the editing | <!--DEFINITION--> the PC unit doing the editing | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> When done editing it returns SFB_EDIT and activator is set to PC | <!--DEFINITION--> When done editing it returns SFB_EDIT and activator is set to PC | ||
− | + | ||
The 'BEGINEDIT' function sets a PC into editing mode. while in edit mode | The 'BEGINEDIT' function sets a PC into editing mode. while in edit mode | ||
the PC field 'editing is set to true. Once the PC is done editing a 'SFB_EDIT' | the PC field 'editing is set to true. Once the PC is done editing a 'SFB_EDIT' | ||
Line 2,087: | Line 2,155: | ||
the 'killedit' function | the 'killedit' function | ||
[[#sect-beginedit|interrupt editing before done]] | [[#sect-beginedit|interrupt editing before done]] | ||
− | + | ||
'''example:''' | '''example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin edextra (); | dilbegin edextra (); | ||
var | var | ||
Line 2,104: | Line 2,172: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL is an example of how you could make a command to set the | The previous DIL is an example of how you could make a command to set the | ||
general extra which is the characters description when you do 'look player' | general extra which is the characters description when you do 'look player' | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfcancarry" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>cancarry()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bfcancarry" /> | |
+ | |||
integer can_carry(ch : unitptr, u : unitptr, n : integer) | integer can_carry(ch : unitptr, u : unitptr, n : integer) | ||
ch : The character to check | ch : The character to check | ||
u : The unit to check if he can carry. | u : The unit to check if he can carry. | ||
n : How many copies of that unit. | n : How many copies of that unit. | ||
− | + | ||
Returns: 0 if 'ch' can carry 'n' times 'u'. | Returns: 0 if 'ch' can carry 'n' times 'u'. | ||
1 if 'n' items are too many (his hands are full) | 1 if 'n' items are too many (his hands are full) | ||
2 if 'n' times 'u' are too heavy | 2 if 'n' times 'u' are too heavy | ||
− | + | ||
Example: | Example: | ||
− | + | ||
i := can_carry(activator, item, 1); | i := can_carry(activator, item, 1); | ||
− | + | ||
if (i == 1) | if (i == 1) | ||
exec("say Your hands are full!", self); | exec("say Your hands are full!", self); | ||
Line 2,134: | Line 2,203: | ||
else | else | ||
exec("give "+item.name+" to "+activator.name, self); | exec("give "+item.name+" to "+activator.name, self); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bffits" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>fits()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bffits" /> | ||
string fits( char : unitptr, obj : unitptr, pos : integer ); | string fits( char : unitptr, obj : unitptr, pos : integer ); | ||
char: Character which we want to test if obj can be fitted upon | char: Character which we want to test if obj can be fitted upon | ||
Line 2,142: | Line 2,212: | ||
pos: -1 or WEAR_XXX | pos: -1 or WEAR_XXX | ||
Returns: Empty string if ok, or a textual description of the size problem. | Returns: Empty string if ok, or a textual description of the size problem. | ||
− | + | ||
Fits tests if "obj" can be worn by "char" in position "pos". If | Fits tests if "obj" can be worn by "char" in position "pos". If | ||
pos is -1, then fits automatically figures out the default worn | pos is -1, then fits automatically figures out the default worn | ||
position for "obj". | position for "obj". | ||
− | + | ||
Example: | Example: | ||
− | + | ||
s := fits(self, obj, -1); | s := fits(self, obj, -1); | ||
if (s != "") | if (s != "") | ||
exec("say Don't buy it, its "+s, self); | exec("say Don't buy it, its "+s, self); | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>replace()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfreplace" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string replace( t :string, n : string, o : string);</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string replace( t :string, n : string, o : string);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''t''' | <!--TERM--> '''t''' | ||
<!--DEFINITION--> the target string you want to replace | <!--DEFINITION--> the target string you want to replace | ||
Line 2,166: | Line 2,237: | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the string with the old string replaced by the new string | <!--DEFINITION--> the string with the old string replaced by the new string | ||
− | + | ||
This function replaces all occurences of a string in another string with a | This function replaces all occurences of a string in another string with a | ||
new string. | new string. | ||
Line 2,173: | Line 2,244: | ||
<i><!--CODE-->"Jafar the human %l%" := replace(%t%,pc.title,"Jafar %t% %l%");</i><!--ENDCODE--> | <i><!--CODE-->"Jafar the human %l%" := replace(%t%,pc.title,"Jafar %t% %l%");</i><!--ENDCODE--> | ||
<i><!--CODE-->"Jafar the human 1" := replace(%l%,itoa(pc.vlevel),"Jafar the human %l%");</i><!--ENDCODE--> | <i><!--CODE-->"Jafar the human 1" := replace(%l%,itoa(pc.vlevel),"Jafar the human %l%");</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>restore()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfrestore" /> | |
+ | |||
'''Function:''' <i><!--CODE-->unitptr restore( filename : string , u : unitptr );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->unitptr restore( filename : string , u : unitptr );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The name of the Unit file | <!--DEFINITION--> The name of the Unit file | ||
Line 2,185: | Line 2,257: | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> if 'u' null returns a pointer to the Unit loaded, if 'u' not null returns null and loads Units from the specified file into the unit 'u' | <!--DEFINITION--> if 'u' null returns a pointer to the Unit loaded, if 'u' not null returns null and loads Units from the specified file into the unit 'u' | ||
− | + | ||
restore loads a copy of a unit or units which were previously saved with the | restore loads a copy of a unit or units which were previously saved with the | ||
'store' command. Just as with "load", the unit is put inside the unit which | 'store' command. Just as with "load", the unit is put inside the unit which | ||
Line 2,207: | Line 2,279: | ||
server. If the Dil that uses Restore saves at certain times try to make it so | server. If the Dil that uses Restore saves at certain times try to make it so | ||
the saves are spread out over as large amounts of time as possible. | the saves are spread out over as large amounts of time as possible. | ||
− | + | ||
'''Example 1:''' | '''Example 1:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin chest_load (); | dilbegin chest_load (); | ||
var | var | ||
Line 2,224: | Line 2,296: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
waist:=restore("chest."+self.zoneidx,chest); | waist:=restore("chest."+self.zoneidx,chest); | ||
/* | /* | ||
Line 2,234: | Line 2,306: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''Example 2:''' | '''Example 2:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin chest_load (); | dilbegin chest_load (); | ||
var | var | ||
Line 2,251: | Line 2,323: | ||
chest:=load("donate_chest@"+self.zoneidx); | chest:=load("donate_chest@"+self.zoneidx); | ||
/*load a new one if there is nothing restored*/ | /*load a new one if there is nothing restored*/ | ||
− | + | ||
link (chest, self);/*link item into room*/ | link (chest, self);/*link item into room*/ | ||
quit;/*destroy the load dil.*/ | quit;/*destroy the load dil.*/ | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''Note:''' Example 1 is to be used if 'storall' was used not storing a container. | '''Note:''' Example 1 is to be used if 'storall' was used not storing a container. | ||
Line 2,266: | Line 2,338: | ||
[[#bpstore|Store a Unit to a Unit file]] and | [[#bpstore|Store a Unit to a Unit file]] and | ||
[[#bfdelunit|Delete a Unit file]]. | [[#bfdelunit|Delete a Unit file]]. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfmelee" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>meleeattack()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfmelee" /> | ||
integer meleeattack ( ch : unitptr, vict : unitptr, | integer meleeattack ( ch : unitptr, vict : unitptr, | ||
bonus : integer, wtype : integer ) | bonus : integer, wtype : integer ) | ||
Line 2,278: | Line 2,351: | ||
used for the attack purpose, otherwise the default weapon/hand | used for the attack purpose, otherwise the default weapon/hand | ||
attack is used. | attack is used. | ||
− | + | ||
result: 'ch' performs a melee attack (using whatever weapon is wielded | result: 'ch' performs a melee attack (using whatever weapon is wielded | ||
or his bare hands) against 'vict'. Returns the amount of damage | or his bare hands) against 'vict'. Returns the amount of damage | ||
given (-1 is failed). | given (-1 is failed). | ||
− | + | ||
If wtype is within a valid weapon range (WPN_XXX) any weapon will | If wtype is within a valid weapon range (WPN_XXX) any weapon will | ||
be bypassed, and the value will be used as the attacktype. Good | be bypassed, and the value will be used as the attacktype. Good | ||
Line 2,290: | Line 2,363: | ||
BOTH a weapon type WPN_CIRCLE_KICK and a skill "kick" in order for | BOTH a weapon type WPN_CIRCLE_KICK and a skill "kick" in order for | ||
it to work. | it to work. | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>meleedamage()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfmeleedamage" /> | |
+ | |||
'''Function: ''' | '''Function: ''' | ||
<i><!--CODE-->meleedamage ( c : unitptr, v : unitptr, b : integer, wt : integer );</i><!--ENDCODE--> | <i><!--CODE-->meleedamage ( c : unitptr, v : unitptr, b : integer, wt : integer );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''c''' | <!--TERM--> '''c''' | ||
<!--DEFINITION--> the character that should make an additional attack | <!--DEFINITION--> the character that should make an additional attack | ||
Line 2,308: | Line 2,382: | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> The amount of damage done or -1 for failed | <!--DEFINITION--> The amount of damage done or -1 for failed | ||
− | + | ||
ch' performs an attack (using whatever weapon is wielded or his bare hands) against 'vict'. | ch' performs an attack (using whatever weapon is wielded or his bare hands) against 'vict'. | ||
If wtype is within a valid weapon range (WPN_XXX) any weapon will be bypassed, | If wtype is within a valid weapon range (WPN_XXX) any weapon will be bypassed, | ||
Line 2,319: | Line 2,393: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin kick(arg : string); | dilbegin kick(arg : string); | ||
external | external | ||
provoked_attack (victim : unitptr, ch : unitptr); | provoked_attack (victim : unitptr, ch : unitptr); | ||
− | + | ||
var | var | ||
bonus : integer; | bonus : integer; | ||
targ : unitptr; | targ : unitptr; | ||
− | + | ||
code | code | ||
{ | { | ||
Line 2,335: | Line 2,409: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (arg == "") | if (arg == "") | ||
{ | { | ||
Line 2,343: | Line 2,417: | ||
goto kick; | goto kick; | ||
} | } | ||
− | + | ||
act("Kick who?", A_SOMEONE, self, null, null, TO_CHAR); | act("Kick who?", A_SOMEONE, self, null, null, TO_CHAR); | ||
quit; | quit; | ||
} | } | ||
− | + | ||
targ := findunit(self, arg, FIND_UNIT_SURRO, null); | targ := findunit(self, arg, FIND_UNIT_SURRO, null); | ||
− | + | ||
if ((targ == null) or not visible(self, targ)) | if ((targ == null) or not visible(self, targ)) | ||
{ | { | ||
Line 2,355: | Line 2,429: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (not (targ.type & (UNIT_ST_PC | UNIT_ST_NPC))) | if (not (targ.type & (UNIT_ST_PC | UNIT_ST_NPC))) | ||
{ | { | ||
Line 2,362: | Line 2,436: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (targ == self) | if (targ == self) | ||
{ | { | ||
Line 2,371: | Line 2,445: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if ((targ.type==UNIT_ST_PC) and | if ((targ.type==UNIT_ST_PC) and | ||
(self.type==UNIT_ST_PC)) | (self.type==UNIT_ST_PC)) | ||
Line 2,381: | Line 2,455: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (not(isset (targ.pcflags, PC_PK_RELAXED))) | if (not(isset (targ.pcflags, PC_PK_RELAXED))) | ||
{ | { | ||
Line 2,389: | Line 2,463: | ||
} | } | ||
} | } | ||
− | + | ||
− | + | ||
:kick: | :kick: | ||
/* Penalty for wielding a weapon while kicking! */ | /* Penalty for wielding a weapon while kicking! */ | ||
Line 2,406: | Line 2,480: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>mid()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfmid" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string mid ( o : string, s : integer, e : integer );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string mid ( o : string, s : integer, e : integer );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''o''' | <!--TERM--> '''o''' | ||
<!--DEFINITION--> the original string to be parsed | <!--DEFINITION--> the original string to be parsed | ||
Line 2,425: | Line 2,500: | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the portion of the string defined by the 's' and 'e' values | <!--DEFINITION--> the portion of the string defined by the 's' and 'e' values | ||
− | + | ||
This function parses the string passed to it and returns the portion of the string | This function parses the string passed to it and returns the portion of the string | ||
defined by the start value and the end value that is also passed to the function. | defined by the start value and the end value that is also passed to the function. | ||
'''Example:''' <i><!--CODE-->"rock" := mid ("sprocket",3,6);</i><!--ENDCODE--> | '''Example:''' <i><!--CODE-->"rock" := mid ("sprocket",3,6);</i><!--ENDCODE--> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfmonstr" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>moneystring()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfmonstr" /> | ||
string moneystring(amt : integer, verbose : integer) | string moneystring(amt : integer, verbose : integer) | ||
amt : The amount of money | amt : The amount of money | ||
Line 2,437: | Line 2,513: | ||
if abbreviated money types (cp). | if abbreviated money types (cp). | ||
result : The moneystring for the given currency. | result : The moneystring for the given currency. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfeq" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>equipment()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfeq" /> | ||
unitptr equipment ( u : unitptr , i : integer ) | unitptr equipment ( u : unitptr , i : integer ) | ||
u : The character to search. | u : The character to search. | ||
Line 2,445: | Line 2,522: | ||
result: Returns the unit on 'u' which is equipped on position 'i'. | result: Returns the unit on 'u' which is equipped on position 'i'. | ||
See WEAR_* in values.h and/or vme.h | See WEAR_* in values.h and/or vme.h | ||
− | + | ||
− | <!--LINK--><span id="bftolower" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>tolower()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bftolower" /> | |
− | + | ||
+ | |||
'''Function:''' <i><!--CODE-->string tolower ( s : string );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string tolower ( s : string );</i><!--ENDCODE--> | ||
<!--TERM--> '''s''' | <!--TERM--> '''s''' | ||
Line 2,454: | Line 2,532: | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the string passed in lower cased | <!--DEFINITION--> the string passed in lower cased | ||
− | + | ||
This function returns a copy of the string passed in but with out capitals. | This function returns a copy of the string passed in but with out capitals. | ||
'''Example:''' <i><!--CODE-->"hello!" := tolower("HELLO!");</i><!--ENDCODE--> | '''Example:''' <i><!--CODE-->"hello!" := tolower("HELLO!");</i><!--ENDCODE--> | ||
− | <!--LINK--><span id="bftoupper" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>toupper()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bftoupper" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string toupper ( s : string );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string toupper ( s : string );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''s''' | <!--TERM--> '''s''' | ||
<!--DEFINITION--> String to lower case | <!--DEFINITION--> String to lower case | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the string passed in lower cased | <!--DEFINITION--> the string passed in lower cased | ||
− | + | ||
This function returns a copy of the string passed in with all characters changed | This function returns a copy of the string passed in with all characters changed | ||
to be capitalized. | to be capitalized. | ||
'''Example:''' <i><!--CODE-->"HELLO!" := toupper ("hello!");</i><!--ENDCODE--> | '''Example:''' <i><!--CODE-->"HELLO!" := toupper ("hello!");</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfvis" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>visible()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfvis" /> | ||
integer visible(u1 : unitptr, u2 : unitptr) | integer visible(u1 : unitptr, u2 : unitptr) | ||
u1: The character who is looking at u2 | u1: The character who is looking at u2 | ||
Line 2,478: | Line 2,558: | ||
return: TRUE if u1 can see u2, FALSE otherwise. | return: TRUE if u1 can see u2, FALSE otherwise. | ||
Example: if (visible(self, victim)) ... | Example: if (visible(self, victim)) ... | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfop" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>opponent()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfop" /> | ||
integer opponent(u1 : unitptr, u2 : unitptr) | integer opponent(u1 : unitptr, u2 : unitptr) | ||
u1, u2: Two characters | u1, u2: Two characters | ||
return: TRUE if u1 is in combat with u2, FALSE otherwise. | return: TRUE if u1 is in combat with u2, FALSE otherwise. | ||
Example: if (opponent(self, victim)) ... | Example: if (opponent(self, victim)) ... | ||
− | + | ||
When in a combat, you are usually only melee-attacking one opponent, | When in a combat, you are usually only melee-attacking one opponent, | ||
although you may have many other opponents. This function lets you | although you may have many other opponents. This function lets you | ||
check if you are directly / indirectly an opponent to another unit. | check if you are directly / indirectly an opponent to another unit. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfpurse" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>purse()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfpurse" /> | ||
integer purse(u : unitptr, coinage : integer) | integer purse(u : unitptr, coinage : integer) | ||
u : The unit to check | u : The unit to check | ||
Line 2,498: | Line 2,580: | ||
Example: if (purse(self, PLATINUM_PIECE) > 10) | Example: if (purse(self, PLATINUM_PIECE) > 10) | ||
exec("say I am loaded with platinum!", self); | exec("say I am loaded with platinum!", self); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfatoi" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>atoi()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfatoi" /> | ||
integer atoi ( s : string ) | integer atoi ( s : string ) | ||
s : A string with a number. | s : A string with a number. | ||
return: The number in the string. | return: The number in the string. | ||
Example: i := atoi("42"); | Example: i := atoi("42"); | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>check_password()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfcheckpassword" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer check_password( u : unitptr, s : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer check_password( u : unitptr, s : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> the unit that you want to check the password of | <!--DEFINITION--> the unit that you want to check the password of | ||
Line 2,518: | Line 2,602: | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> Returns an integer TRUE if pcname is the units password FALSE if not | <!--DEFINITION--> Returns an integer TRUE if pcname is the units password FALSE if not | ||
− | + | ||
This function checks the string against the units password and returns TRUE | This function checks the string against the units password and returns TRUE | ||
if they match. | if they match. | ||
Line 2,524: | Line 2,608: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
if (not check_password(pc,arg)) | if (not check_password(pc,arg)) | ||
{ | { | ||
Line 2,530: | Line 2,614: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfcomm" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>command()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfcomm" /> | ||
integer command ( cmd : string or integer ) | integer command ( cmd : string or integer ) | ||
cmd : A string of the full typed command, e.g. "push" or "say". | cmd : A string of the full typed command, e.g. "push" or "say". | ||
Line 2,546: | Line 2,631: | ||
return: Whether the command specified by the activator is the one of | return: Whether the command specified by the activator is the one of | ||
the argument. | the argument. | ||
− | + | ||
It is noteworthy, that unlike simple compares like this; | It is noteworthy, that unlike simple compares like this; | ||
− | + | ||
if ("spook" in cmdstr) { | if ("spook" in cmdstr) { | ||
... | ... | ||
Line 2,558: | Line 2,643: | ||
... | ... | ||
} | } | ||
− | + | ||
where the first will activate even if the cmdstr is "nospook", and the | where the first will activate even if the cmdstr is "nospook", and the | ||
second only if cmdstr equals the word "spook" to the letter, the | second only if cmdstr equals the word "spook" to the letter, the | ||
following construct will activate as long as the contents | following construct will activate as long as the contents | ||
of cmdstr doesn't conflict with cmd; | of cmdstr doesn't conflict with cmd; | ||
− | + | ||
if (command("spook")) { | if (command("spook")) { | ||
... | ... | ||
... | ... | ||
} | } | ||
− | + | ||
ie, it will receive the same kind of treatment as a 'regular' command. | ie, it will receive the same kind of treatment as a 'regular' command. | ||
That means that you provide ease of use to the user (allowing shorthand | That means that you provide ease of use to the user (allowing shorthand | ||
Line 2,576: | Line 2,661: | ||
there are no white-space in it, ie, that the argument does only | there are no white-space in it, ie, that the argument does only | ||
consist of letters. | consist of letters. | ||
− | + | ||
Example: | Example: | ||
command("spook"); | command("spook"); | ||
− | + | ||
is a valid string, while this construct; | is a valid string, while this construct; | ||
− | + | ||
command("spook him"); | command("spook him"); | ||
− | + | ||
is NOT valid. The reason of that is that cmdstr only contains the | is NOT valid. The reason of that is that cmdstr only contains the | ||
FIRST word of the input from the player, and thus the latter | FIRST word of the input from the player, and thus the latter | ||
Line 2,590: | Line 2,675: | ||
never equal "spook" (which would indeed be the text in cmdstr | never equal "spook" (which would indeed be the text in cmdstr | ||
if the player entered the string "spook him".) | if the player entered the string "spook him".) | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>delstr()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfdelstr" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer delstr( filename : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer delstr( filename : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The name of the String file to be deleted | <!--DEFINITION--> The name of the String file to be deleted | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> Returns an integer TRUE if deleted FALSE if not | <!--DEFINITION--> Returns an integer TRUE if deleted FALSE if not | ||
− | + | ||
The delstr is used to delete files that are used with the 'loadstr' and | The delstr is used to delete files that are used with the 'loadstr' and | ||
'savestr' functions. The delstr function will only delete files that | 'savestr' functions. The delstr function will only delete files that | ||
Line 2,608: | Line 2,694: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin news|del ("arg : string /*filename to be deleted); | dilbegin news|del ("arg : string /*filename to be deleted); | ||
var | var | ||
Line 2,620: | Line 2,706: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
sendtext ("News file deleted[&]n",self); | sendtext ("News file deleted[&]n",self); | ||
quit;/*dil delete routine done | quit;/*dil delete routine done | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also''' <i><!--CODE--> | '''See Also''' <i><!--CODE--> | ||
[[#bfloadstr|Load String file]] and | [[#bfloadstr|Load String file]] and | ||
[[#bfsavestr|Save String file]]</i><!--ENDCODE--> | [[#bfsavestr|Save String file]]</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>delunit()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfdelunit" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer delunit( filename : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer delunit( filename : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The name of the Unit file to be deleted. | <!--DEFINITION--> The name of the Unit file to be deleted. | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> Returns an integer TRUE if deleted FALSE if not delunit is used to delete files that are used with the 'Restore' and 'store' functions. | <!--DEFINITION--> Returns an integer TRUE if deleted FALSE if not delunit is used to delete files that are used with the 'Restore' and 'store' functions. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin chest_del ("arg : string /*filename to be deleted*/); | dilbegin chest_del ("arg : string /*filename to be deleted*/); | ||
var | var | ||
Line 2,659: | Line 2,746: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
sendtext("Chest file deleted[&]n",self); | sendtext("Chest file deleted[&]n",self); | ||
quit;/*dil delete routine done | quit;/*dil delete routine done | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also''' | '''See Also''' | ||
[[#bfrestore|Restore a Unit from a Unit file]] and | [[#bfrestore|Restore a Unit from a Unit file]] and | ||
[[#bpstore|Store Units to a Unit file]]. | [[#bpstore|Store Units to a Unit file]]. | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfdd" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>dildestroy()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfdd" /> | ||
integer dildestroy( s : string, u : unitptr ) | integer dildestroy( s : string, u : unitptr ) | ||
s : name of dil template to delete. | s : name of dil template to delete. | ||
Line 2,681: | Line 2,769: | ||
return: Whether a program using a template with same name as in 's' | return: Whether a program using a template with same name as in 's' | ||
attached to unit 'u' was deleted. | attached to unit 'u' was deleted. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfdf" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>dilfind()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfdf" /> | ||
integer dilfind( s : string, u : unitptr ) | integer dilfind( s : string, u : unitptr ) | ||
s : name of dil template to find. | s : name of dil template to find. | ||
Line 2,689: | Line 2,778: | ||
return: Whether a program using a template with same name as in 's' | return: Whether a program using a template with same name as in 's' | ||
attached to unit 'u' was found. | attached to unit 'u' was found. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfitoa" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>itoa()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfitoa" /> | ||
string itoa ( i : integer ) | string itoa ( i : integer ) | ||
i : A number. | i : A number. | ||
return: A string with the number. | return: A string with the number. | ||
Example: s := itoa(42); | Example: s := itoa(42); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfisaff" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>isaff()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfisaff" /> | ||
integer isaff ( u : unitptr , i : integer ) | integer isaff ( u : unitptr , i : integer ) | ||
u : A unit to be examined. | u : A unit to be examined. | ||
i : An id of an affect, see ID_* in values.h and/or vme.h | i : An id of an affect, see ID_* in values.h and/or vme.h | ||
return: TRUE, if unit 'u' is affected by affect id 'i' | return: TRUE, if unit 'u' is affected by affect id 'i' | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>islight()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfislight" /> | |
+ | |||
'''Function: '''<i><!--CODE-->integer islight ( u : unitptr )</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->integer islight ( u : unitptr )</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> Unit that you are checking | <!--DEFINITION--> Unit that you are checking | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> ''TRUE' if item is a light, 'FALSE' if it is notway to small', 'to small', 'way to large', 'to large', or null if fits | <!--DEFINITION--> ''TRUE' if item is a light, 'FALSE' if it is notway to small', 'to small', 'way to large', 'to large', or null if fits | ||
− | + | ||
Simply checks the item to see if it is a light. | Simply checks the item to see if it is a light. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>isplayer()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfisplayer" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer isplayer( pcname : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer isplayer( pcname : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''pcname''' | <!--TERM--> '''pcname''' | ||
<!--DEFINITION--> the name of the player being checked | <!--DEFINITION--> the name of the player being checked | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> Returns an integer TRUE if pcname is a player FALSE if not | <!--DEFINITION--> Returns an integer TRUE if pcname is a player FALSE if not | ||
− | + | ||
This function is used to find out if a string you pass to it is a player or not. | This function is used to find out if a string you pass to it is a player or not. | ||
This can be used and is used to find out if a player is truly a player that an | This can be used and is used to find out if a player is truly a player that an | ||
Line 2,736: | Line 2,829: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
if (not isplayer(arg)) | if (not isplayer(arg)) | ||
{ | { | ||
Line 2,742: | Line 2,835: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfisset" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>isset()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfisset" /> | ||
integer isset ( i : integer , bit : integer ) | integer isset ( i : integer , bit : integer ) | ||
i : An integer to examine. | i : An integer to examine. | ||
Line 2,758: | Line 2,852: | ||
return: TRUE, if bits in 'bit' is set in 'i'. | return: TRUE, if bits in 'bit' is set in 'i'. | ||
Example: if (isset(self.manipulate, MANIPULATE_TAKE)) ... | Example: if (isset(self.manipulate, MANIPULATE_TAKE)) ... | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfpaychk" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>paycheck()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfpaychk" /> | ||
integer paycheck( u1 : unitptr, u2:unitptr) | integer paycheck( u1 : unitptr, u2:unitptr) | ||
u1 : unit to check against | u1 : unit to check against | ||
Line 2,769: | Line 2,864: | ||
function checks if the player has pay-access (if needed) to | function checks if the player has pay-access (if needed) to | ||
the zone in which u1 is located. | the zone in which u1 is located. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bffindu" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>findunit()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bffindu" /> | ||
unitptr findunit ( u : unitptr , s : string , i : integer , l : unitptr ) | unitptr findunit ( u : unitptr , s : string , i : integer , l : unitptr ) | ||
u : The unit the local environment is relative to. | u : The unit the local environment is relative to. | ||
Line 2,780: | Line 2,876: | ||
return: If the unit is found, the function returns that unit. | return: If the unit is found, the function returns that unit. | ||
Returns null if nothing found. | Returns null if nothing found. | ||
− | + | ||
The first argument is typically the char that's looking for something, | The first argument is typically the char that's looking for something, | ||
i.e. if Mary needs a spoon to stir the pot, she'll be the first argument. | i.e. if Mary needs a spoon to stir the pot, she'll be the first argument. | ||
− | + | ||
The second argument is what you're looking for, represented by a string. | The second argument is what you're looking for, represented by a string. | ||
In the above mentioned example, that'd be "spoon". | In the above mentioned example, that'd be "spoon". | ||
− | + | ||
For the second or third argument, you have a choice, as you'll only need to | For the second or third argument, you have a choice, as you'll only need to | ||
use one of them, and let the other be 0 or null. For instance, if you have | use one of them, and let the other be 0 or null. For instance, if you have | ||
a pointer to Mary's kitchen utensil pot, you can use the line: | a pointer to Mary's kitchen utensil pot, you can use the line: | ||
− | + | ||
findunit(mary, "spoon", 0, pot); | findunit(mary, "spoon", 0, pot); | ||
− | + | ||
Or you can just let her look around for it with: | Or you can just let her look around for it with: | ||
− | + | ||
findunit(mary, "spoon", FIND_UNIT_INVEN or FIND_UNIT_SURRO, null); | findunit(mary, "spoon", FIND_UNIT_INVEN or FIND_UNIT_SURRO, null); | ||
− | + | ||
You can use all the FIND_UNIT_ values defined in values.h and/or vme.h, if you | You can use all the FIND_UNIT_ values defined in values.h and/or vme.h, if you | ||
want to look for something for example within the zone (FIND_UNIT_ZONE), the | want to look for something for example within the zone (FIND_UNIT_ZONE), the | ||
Line 2,803: | Line 2,899: | ||
(FIND_UNIT_INVEN and FIND_UNIT_EQUIP). Finally, as in the example above, | (FIND_UNIT_INVEN and FIND_UNIT_EQUIP). Finally, as in the example above, | ||
you can look in the room of the char (FIND_UNIT_SURRO). | you can look in the room of the char (FIND_UNIT_SURRO). | ||
− | + | ||
Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will be ignored. | Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will be ignored. | ||
− | + | ||
The flags for findunit, intuitively: | The flags for findunit, intuitively: | ||
− | + | ||
− | + | ||
FIND_UNIT_EQUIP: | FIND_UNIT_EQUIP: | ||
The objects you will see with `equipment' | The objects you will see with `equipment' | ||
Assumes first argument to findunit is a char. | Assumes first argument to findunit is a char. | ||
− | + | ||
− | + | ||
FIND_UNIT_INVEN: | FIND_UNIT_INVEN: | ||
The objects you will see with `inventory' or `look in bag' | The objects you will see with `inventory' or `look in bag' | ||
− | + | ||
− | + | ||
FIND_UNIT_SURRO: | FIND_UNIT_SURRO: | ||
The objects you can see, and get with `get', | The objects you can see, and get with `get', | ||
or the characters you can `poke' :-) | or the characters you can `poke' :-) | ||
− | + | ||
− | + | ||
FIND_UNIT_ZONE: | FIND_UNIT_ZONE: | ||
As FIND_UNIT_WORLD, only more local. | As FIND_UNIT_WORLD, only more local. | ||
− | + | ||
− | + | ||
FIND_UNIT_WORLD: | FIND_UNIT_WORLD: | ||
Any object in the entire world. Does NOT start looking close to the | Any object in the entire world. Does NOT start looking close to the | ||
object of findunit's first argument, but rather somewhat randomly. | object of findunit's first argument, but rather somewhat randomly. | ||
− | + | ||
− | + | ||
On top of these, the following (new) values are defined: | On top of these, the following (new) values are defined: | ||
− | + | ||
− | + | ||
FIND_UNIT_IN_ME: | FIND_UNIT_IN_ME: | ||
Anything inside of the object of the first argument. | Anything inside of the object of the first argument. | ||
− | + | ||
− | + | ||
FIND_UNIT_HERE: | FIND_UNIT_HERE: | ||
Anything `here', i.e. in object or around it (same as IN_ME + SURRO) | Anything `here', i.e. in object or around it (same as IN_ME + SURRO) | ||
− | + | ||
− | + | ||
FIND_UNIT_GLOBAL: | FIND_UNIT_GLOBAL: | ||
ANYTHING, starting close to object and working out. | ANYTHING, starting close to object and working out. | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bffindru" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>findrndunit()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bffindru" /> | ||
unitptr findrndunit( u : unitptr, sv : integer, uf : integer) | unitptr findrndunit( u : unitptr, sv : integer, uf : integer) | ||
Returns: A pointer to a random unit, or null | Returns: A pointer to a random unit, or null | ||
Line 2,857: | Line 2,954: | ||
sv : The search-location, a value (not bit vector) of FIND_UNIT_XXX | sv : The search-location, a value (not bit vector) of FIND_UNIT_XXX | ||
uf : Bit vector. The unit flags which can match of UNIT_ST_XXX | uf : Bit vector. The unit flags which can match of UNIT_ST_XXX | ||
− | + | ||
Example: u := findrndunit(self, FIND_UNIT_ZONE, UNIT_ST_PC|UNIT_ST_NPC); | Example: u := findrndunit(self, FIND_UNIT_ZONE, UNIT_ST_PC|UNIT_ST_NPC); | ||
− | + | ||
This routine returns a random unit. Notice how the 'uf' lets you | This routine returns a random unit. Notice how the 'uf' lets you | ||
specify exactly what unit types to look for. The 'sv' is not a | specify exactly what unit types to look for. The 'sv' is not a | ||
Line 2,865: | Line 2,962: | ||
you need to search multiple environments, then call the routine | you need to search multiple environments, then call the routine | ||
once for each. | once for each. | ||
− | + | ||
Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will | Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will | ||
pick a random player which in addition to being in the search | pick a random player which in addition to being in the search | ||
Line 2,872: | Line 2,969: | ||
for paying players only (or not). Asking for objects would | for paying players only (or not). Asking for objects would | ||
return no unit (null). | return no unit (null). | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>filesize()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bffilesize" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer filesize ( filename :string);</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer filesize ( filename :string);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''file''' | <!--TERM--> '''file''' | ||
<!--DEFINITION--> The file name you want to check | <!--DEFINITION--> The file name you want to check | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> a file size in bites 0 if no file | <!--DEFINITION--> a file size in bites 0 if no file | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
This function does exactly what it says it does it checks a files size. | This function does exactly what it says it does it checks a files size. | ||
− | + | ||
'''Example DIL:''' | '''Example DIL:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin notebook (); | dilbegin notebook (); | ||
code | code | ||
Line 2,921: | Line 3,019: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL example shows how you could use the 'filesize' instruction to | The previous DIL example shows how you could use the 'filesize' instruction to | ||
check the size of a player stored notebook. | check the size of a player stored notebook. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bffindr" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>findroom()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bffindr" /> | ||
unitptr findroom ( s : string ) | unitptr findroom ( s : string ) | ||
s : Symbolic name of room. | s : Symbolic name of room. | ||
return: A pointer to the room, or null | return: A pointer to the room, or null | ||
Example: findroom("inn@udgaard") | Example: findroom("inn@udgaard") | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bffinds" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>findsymbolic()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bffinds" /> | ||
unitptr findsymbolic ( s : string ) | unitptr findsymbolic ( s : string ) | ||
s : Symbolic name of the NPC or Object to find. | s : Symbolic name of the NPC or Object to find. | ||
return: A pointer to an instance of the unit, or null. | return: A pointer to an instance of the unit, or null. | ||
Example: findsymbolic("bread@midgaard") | Example: findsymbolic("bread@midgaard") | ||
− | + | ||
This routine supplements findroom and findunit. It comes in handy,if it is | This routine supplements findroom and findunit. It comes in handy,if it is | ||
important to get a correct reference to a NPC in the world. If for example, | important to get a correct reference to a NPC in the world. If for example, | ||
Line 2,954: | Line 3,054: | ||
Norway. It will NOT locate rooms, for the only reason that findroom is a | Norway. It will NOT locate rooms, for the only reason that findroom is a | ||
lot more efficient. | lot more efficient. | ||
− | + | ||
− | + | ||
unitptr findsymbolic ( u : unitptr, s : string, i : integer ) | unitptr findsymbolic ( u : unitptr, s : string, i : integer ) | ||
u : Search is relative to this unit. | u : Search is relative to this unit. | ||
Line 2,962: | Line 3,062: | ||
return: A pointer to an instance of the unit, or null. | return: A pointer to an instance of the unit, or null. | ||
Example: findsymbolic(self, "bread@midgaard", FIND_UNIT_INVEN) | Example: findsymbolic(self, "bread@midgaard", FIND_UNIT_INVEN) | ||
− | + | ||
This routine supplements findroom, findunit and findsymbolic(#). It comes in | This routine supplements findroom, findunit and findsymbolic(#). It comes in | ||
handy, if it is important to get a correct reference to a unit somewhere | handy, if it is important to get a correct reference to a unit somewhere | ||
Line 2,971: | Line 3,071: | ||
she would be certain that it is in fact her own cooking pot that she is | she would be certain that it is in fact her own cooking pot that she is | ||
carrying around, and not some other pot from a Joe Blow's zone. | carrying around, and not some other pot from a Joe Blow's zone. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin zonelog (s:string); | dilbegin zonelog (s:string); | ||
code | code | ||
Line 2,982: | Line 3,082: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL function will work in any zone to log to a file with that zones | The previous DIL function will work in any zone to log to a file with that zones | ||
name each zone could use it to keep zone logs separate. | name each zone could use it to keep zone logs separate. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfgword" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>getword()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfgword" /> | ||
string getword ( var s : string ) | string getword ( var s : string ) | ||
s : A string with zero or more words separated by space. | s : A string with zero or more words separated by space. | ||
return: The first word of the string. | return: The first word of the string. | ||
− | + | ||
NB: The argument string has the returned word removed. | NB: The argument string has the returned word removed. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfgwords" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>getwords()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfgwords" /> | ||
stringlist getwords ( var s : string ) | stringlist getwords ( var s : string ) | ||
s : A string with zero or more words separated by space. | s : A string with zero or more words separated by space. | ||
return: A stringlist where each string was a word in 's'. | return: A stringlist where each string was a word in 's'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfghead" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>ghead()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfghead" /> | ||
unitptr ghead ( ) | unitptr ghead ( ) | ||
− | + | ||
return the first unit in the global list which will be the last | return the first unit in the global list which will be the last | ||
char to have logged on. | char to have logged on. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfsplit" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>split()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfsplit" /> | ||
stringlist split ( var s : string, var t : string) | stringlist split ( var s : string, var t : string) | ||
s : A string with zero or more words separated by var t. | s : A string with zero or more words separated by var t. | ||
return: A stringlist where each string was a word in 's' | return: A stringlist where each string was a word in 's' | ||
separated by string 't'. | separated by string 't'. | ||
− | + | ||
You can use '&x' to split a string by line. This is very usefull when reading in files with 'loadstr'. | You can use '&x' to split a string by line. This is very usefull when reading in files with 'loadstr'. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>left()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfleft" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string left ( o : string, l : integer );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string left ( o : string, l : integer );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''o''' | <!--TERM--> '''o''' | ||
<!--DEFINITION--> the original string to be parsed | <!--DEFINITION--> the original string to be parsed | ||
Line 3,030: | Line 3,135: | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the left portion of the string with length l | <!--DEFINITION--> the left portion of the string with length l | ||
− | + | ||
This function parses the string passed to it and returns the number | This function parses the string passed to it and returns the number | ||
of characters defined in its second argument. | of characters defined in its second argument. | ||
− | + | ||
'''Example:''' <i><!--CODE-->"short" := left ("shorten me",5);</i><!--ENDCODE--> | '''Example:''' <i><!--CODE-->"short" := left ("shorten me",5);</i><!--ENDCODE--> | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin aware describe (arg:string); | dilbegin aware describe (arg:string); | ||
var | var | ||
Line 3,059: | Line 3,164: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
args:=getwords(arg); | args:=getwords(arg); | ||
ln:=length(args); | ln:=length(args); | ||
Line 3,069: | Line 3,174: | ||
else if (ln>1) | else if (ln>1) | ||
goto two_word; | goto two_word; | ||
− | + | ||
:one_word: | :one_word: | ||
− | + | ||
if ((arg==left("help",length(arg))) or | if ((arg==left("help",length(arg))) or | ||
(arg=="")) | (arg=="")) | ||
goto hlp_dscr; | goto hlp_dscr; | ||
− | + | ||
oneword := {"arms","butt","ears","eyes","face","feet", | oneword := {"arms","butt","ears","eyes","face","feet", | ||
"general","hair","hands","head","legs", | "general","hair","hands","head","legs", | ||
"mouth","neck","nose","nostrils","teeth", | "mouth","neck","nose","nostrils","teeth", | ||
"toes","tongue"}; | "toes","tongue"}; | ||
− | + | ||
i := 0; | i := 0; | ||
ln := length(args.[0]); | ln := length(args.[0]); | ||
Line 3,093: | Line 3,198: | ||
i := i+1; | i := i+1; | ||
} | } | ||
− | + | ||
if (temp=="ERROR") | if (temp=="ERROR") | ||
{ | { | ||
Line 3,099: | Line 3,204: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
goto describe; | goto describe; | ||
− | + | ||
:two_word: | :two_word: | ||
− | + | ||
oneword := {"arm","leg","foot","hand","eye","ear"}; | oneword := {"arm","leg","foot","hand","eye","ear"}; | ||
temp := "ERROR"; | temp := "ERROR"; | ||
Line 3,116: | Line 3,221: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
i := 0; | i := 0; | ||
while (i<6) | while (i<6) | ||
Line 3,127: | Line 3,232: | ||
i := i+1; | i := i+1; | ||
} | } | ||
− | + | ||
if (temp=="ERROR") | if (temp=="ERROR") | ||
{ | { | ||
Line 3,133: | Line 3,238: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
temp := side+" "+temp; | temp := side+" "+temp; | ||
− | + | ||
:describe: | :describe: | ||
if (temp=="General") | if (temp=="General") | ||
Line 3,141: | Line 3,246: | ||
else | else | ||
location := temp; | location := temp; | ||
− | + | ||
x := location in self.extra; | x := location in self.extra; | ||
if (x!=null) | if (x!=null) | ||
Line 3,152: | Line 3,257: | ||
else | else | ||
sendtext ("Enter a text you would like others to see when they look at your "+location+".&n",self); | sendtext ("Enter a text you would like others to see when they look at your "+location+".&n",self); | ||
− | + | ||
beginedit (self); | beginedit (self); | ||
wait(SFB_EDIT,self==activator) ; | wait(SFB_EDIT,self==activator) ; | ||
Line 3,162: | Line 3,267: | ||
sendtext ("Description added.&n",self); | sendtext ("Description added.&n",self); | ||
quit; | quit; | ||
− | + | ||
:hlp_dscr: | :hlp_dscr: | ||
− | + | ||
sendtext ("&nCorrect usage of 'describe':&n&n",self); | sendtext ("&nCorrect usage of 'describe':&n&n",self); | ||
sendtext ("describe <position>&n&n",self); | sendtext ("describe <position>&n&n",self); | ||
Line 3,181: | Line 3,286: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bflen" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>length()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bflen" /> | ||
integer length ( a : string or stringlist ) | integer length ( a : string or stringlist ) | ||
a : a string or stringlist to examine. | a : a string or stringlist to examine. | ||
return: The length of the string in characters, or the number | return: The length of the string in characters, or the number | ||
of strings in a list. | of strings in a list. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfload" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>load()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bfload" /> | |
+ | |||
unitptr load ( s : string ) | unitptr load ( s : string ) | ||
s : Symbolic name of unit. | s : Symbolic name of unit. | ||
Line 3,203: | Line 3,310: | ||
which loaded it. Use for example the link command to move | which loaded it. Use for example the link command to move | ||
it into other units. | it into other units. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>loadstr()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfloadstr" /> | |
+ | |||
'''Function:''' | '''Function:''' | ||
<i><!--CODE-->integer loadstr( filename : string , buff : string );</i><!--ENDCODE--> | <i><!--CODE-->integer loadstr( filename : string , buff : string );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The name of the string file to be loaded | <!--DEFINITION--> The name of the string file to be loaded | ||
Line 3,215: | Line 3,323: | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> <i><!--CODE-->FILE_LOADED, FILE_NOT_FOUND, FILE_OUT_OF_MEMORY,or FILE_TO_LARGE</i><!--ENDCODE--> | <!--DEFINITION--> <i><!--CODE-->FILE_LOADED, FILE_NOT_FOUND, FILE_OUT_OF_MEMORY,or FILE_TO_LARGE</i><!--ENDCODE--> | ||
− | + | ||
Loadstr is used to load strings from disk that were saved either by savestr | Loadstr is used to load strings from disk that were saved either by savestr | ||
or any text editor. | or any text editor. | ||
Line 3,229: | Line 3,337: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin news_load (); | dilbegin news_load (); | ||
var | var | ||
Line 3,242: | Line 3,350: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
sendtext(buff+"[&]n",self); | sendtext(buff+"[&]n",self); | ||
quit;/*dil load routine done destroy self.*/ | quit;/*dil load routine done destroy self.*/ | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also''' <i><!--CODE--> | '''See Also''' <i><!--CODE--> | ||
[[#bfdelstr|Delete a String file]] and | [[#bfdelstr|Delete a String file]] and | ||
[[#bfsavestr|Save String file]]</i><!--ENDCODE--> | [[#bfsavestr|Save String file]]</i><!--ENDCODE--> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bforoll" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>openroll()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bforoll" /> | ||
integer openroll( dice : integer , end : integer ) | integer openroll( dice : integer , end : integer ) | ||
dice : The size of the dice being rolled. | dice : The size of the dice being rolled. | ||
Line 3,263: | Line 3,372: | ||
Example: i := openroll(100,5); The "100" roll continues on values | Example: i := openroll(100,5); The "100" roll continues on values | ||
96 - 100 and on values 1 - 5. | 96 - 100 and on values 1 - 5. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfpathto" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>pathto()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfpathto" /> | ||
integer pathto( from : unitptr, to : unitptr ) | integer pathto( from : unitptr, to : unitptr ) | ||
from : The unit which the path is taken from | from : The unit which the path is taken from | ||
Line 3,271: | Line 3,381: | ||
returns: DIR_XXX from values.h and/or vme.h. | returns: DIR_XXX from values.h and/or vme.h. | ||
Example: i := pathto(self, findroom("inn@midgaard")); | Example: i := pathto(self, findroom("inn@midgaard")); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bppagestring" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>pagestring()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bppagestring" /> | ||
pathto(buff : string, u : unitptr ) | pathto(buff : string, u : unitptr ) | ||
buff : The string that is to be paged to the player. | buff : The string that is to be paged to the player. | ||
Line 3,282: | Line 3,393: | ||
would format the buff string to the player so the buff text doesn't scroll | would format the buff string to the player so the buff text doesn't scroll | ||
off the screen until after the player presses enter. | off the screen until after the player presses enter. | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>right()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfright" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string right ( o : string, r : integer );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string right ( o : string, r : integer );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''o''' | <!--TERM--> '''o''' | ||
<!--DEFINITION--> the original string to be parsed | <!--DEFINITION--> the original string to be parsed | ||
Line 3,295: | Line 3,407: | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> the right portion of the string with length r | <!--DEFINITION--> the right portion of the string with length r | ||
− | + | ||
This function parses the string passed to it and returns the number of characters | This function parses the string passed to it and returns the number of characters | ||
from the right defined in its second argument. | from the right defined in its second argument. | ||
'''Example:''' <i><!--CODE-->"Easy" := right ("This is Easy",4);</i><!--ENDCODE--> | '''Example:''' <i><!--CODE-->"Easy" := right ("This is Easy",4);</i><!--ENDCODE--> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bfrnd" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>rnd()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfrnd" /> | ||
integer rnd ( i1 : integer , i2 : integer ) | integer rnd ( i1 : integer , i2 : integer ) | ||
i1 : Start of range. | i1 : Start of range. | ||
Line 3,307: | Line 3,420: | ||
return: A random integer in an interval from 'i1' to 'i2'. | return: A random integer in an interval from 'i1' to 'i2'. | ||
Example: i := rnd(1,10); | Example: i := rnd(1,10); | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>Built-In Procedures</b></span><!--PAGENAMEEND--> | |
+ | <!--LINK--><span id="biproc" /> | ||
<h3>Built-In Procedures:</h3> | <h3>Built-In Procedures:</h3> | ||
DIL features some built-in procedures that allows you increased control over | DIL features some built-in procedures that allows you increased control over | ||
Line 3,317: | Line 3,431: | ||
return types of the expressions used for built-in procedure calls are checked | return types of the expressions used for built-in procedure calls are checked | ||
by the compiler. | by the compiler. | ||
− | + | ||
DIL also lets you call templates defined in the current or other zones. The | DIL also lets you call templates defined in the current or other zones. The | ||
naming of templates follows the normal naming convention for zone, using the | naming of templates follows the normal naming convention for zone, using the | ||
Line 3,327: | Line 3,441: | ||
declaration parenthesis (as well as in the original declaration of that template) | declaration parenthesis (as well as in the original declaration of that template) | ||
(see example below) | (see example below) | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin bar(s:string); | dilbegin bar(s:string); | ||
code | code | ||
Line 3,339: | Line 3,453: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin foo(); | dilbegin foo(); | ||
external | external | ||
Line 3,353: | Line 3,467: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
When the procedure is called, the argument expressions are calculated, and | When the procedure is called, the argument expressions are calculated, and | ||
passed to the template. Built-in procedures, their arguments and function | passed to the template. Built-in procedures, their arguments and function | ||
are listed later. | are listed later. | ||
− | + | ||
The following are definitions and documentation for the built-in procedures | The following are definitions and documentation for the built-in procedures | ||
in DIL. The definitions are not definitions 'as such', but serve to distinguish | in DIL. The definitions are not definitions 'as such', but serve to distinguish | ||
arguments in the documentation below. | arguments in the documentation below. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpfol" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>follow()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpfol" /> | ||
follow( f : unitptr, m : unitptr ) | follow( f : unitptr, m : unitptr ) | ||
f : The character to follow | f : The character to follow | ||
m : The character to be followed | m : The character to be followed | ||
− | + | ||
Unconditionally makes 'f' follow 'm', even if 'f' is mortally | Unconditionally makes 'f' follow 'm', even if 'f' is mortally | ||
wounded, sleeping, fighting or whatever. | wounded, sleeping, fighting or whatever. | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>flog()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpflog" /> | |
+ | |||
'''Function:''' <i><!--CODE-->flog (filename : string, s : string, wa : string );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->flog (filename : string, s : string, wa : string );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The Filename of the file to appear in the log directory. | <!--DEFINITION--> The Filename of the file to appear in the log directory. | ||
Line 3,384: | Line 3,500: | ||
<!--TERM--> '''wa''' | <!--TERM--> '''wa''' | ||
<!--DEFINITION--> Write or Append | <!--DEFINITION--> Write or Append | ||
− | + | ||
The 'flog' function allows you to split up your logs in the log directory | The 'flog' function allows you to split up your logs in the log directory | ||
so that you don't end up with everything in the main vme.log. | so that you don't end up with everything in the main vme.log. | ||
Line 3,393: | Line 3,509: | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin zonelog (s:string); | dilbegin zonelog (s:string); | ||
code | code | ||
Line 3,403: | Line 3,519: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL function will work in any zone to log to a file with that | The previous DIL function will work in any zone to log to a file with that | ||
zones name each zone could use it to keep zone logs separate. | zones name each zone could use it to keep zone logs separate. | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bplogcrime" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>logcrime()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bplogcrime" /> | ||
logcrime( c : unitptr, v : unitptr, t : integer ) | logcrime( c : unitptr, v : unitptr, t : integer ) | ||
c : The criminal (main suspect) | c : The criminal (main suspect) | ||
v : The victim | v : The victim | ||
t : The crime type (CRIME_XXX) | t : The crime type (CRIME_XXX) | ||
− | + | ||
Registers a crime committed against 'v' by 'c'. Use the | Registers a crime committed against 'v' by 'c'. Use the | ||
CRIME_XXX values from values.h and/or vme.h as the 't' argument. | CRIME_XXX values from values.h and/or vme.h as the 't' argument. | ||
Line 3,424: | Line 3,541: | ||
of the criminal, etc. In stuff like steal, remember to make | of the criminal, etc. In stuff like steal, remember to make | ||
the criminal visible if he fails his attempts. | the criminal visible if he fails his attempts. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpacc_mod" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>acc_modify()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpacc_mod" /> | ||
acc_modify( u : unitptr, i : integer ) | acc_modify( u : unitptr, i : integer ) | ||
u : A player | u : A player | ||
i : An amount in 1/100s, for example 100 would equal $1.00, and | i : An amount in 1/100s, for example 100 would equal $1.00, and | ||
-100 would equal -$1.00. | -100 would equal -$1.00. | ||
− | + | ||
Access only allowed with 'root' access and all transactions are | Access only allowed with 'root' access and all transactions are | ||
registered in the specially encrypted account log file. Use with | registered in the specially encrypted account log file. Use with | ||
great caution, and always test thoroughly before using. | great caution, and always test thoroughly before using. | ||
Use without prior permission may cause deletion of god / zone. | Use without prior permission may cause deletion of god / zone. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>strdir()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfstrdir" /> | |
+ | |||
'''Function:''' <i><!--CODE-->stringlist strdir( match : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->stringlist strdir( match : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''match''' | <!--TERM--> '''match''' | ||
<!--DEFINITION--> The wild card file you want to match or '*' for all. | <!--DEFINITION--> The wild card file you want to match or '*' for all. | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> a Stringlist with all the filenames that match the 'match' argument. | <!--DEFINITION--> a Stringlist with all the filenames that match the 'match' argument. | ||
− | + | ||
The 'match' argument uses the same wild cards as the Linux 'ls' command | The 'match' argument uses the same wild cards as the Linux 'ls' command | ||
so the following will work. | so the following will work. | ||
− | + | ||
<!--TERM--> '''*''' | <!--TERM--> '''*''' | ||
<!--DEFINITION--> Match any character or group of characters | <!--DEFINITION--> Match any character or group of characters | ||
Line 3,456: | Line 3,575: | ||
<!--TERM--> '''[...]''' | <!--TERM--> '''[...]''' | ||
<!--DEFINITION--> Match one of a set of characters | <!--DEFINITION--> Match one of a set of characters | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
"corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... | "corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... | ||
"corpse?" matches corpse1 corpses corpse5 ... | "corpse?" matches corpse1 corpses corpse5 ... | ||
Line 3,466: | Line 3,585: | ||
"[a-z]*" about zoo man father ... | "[a-z]*" about zoo man father ... | ||
"start[nm]end" matches startnend startmend | "start[nm]end" matches startnend startmend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''Example DIL:''' | '''Example DIL:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin wanted (); | dilbegin wanted (); | ||
var | var | ||
Line 3,482: | Line 3,601: | ||
code | code | ||
{ | { | ||
− | + | ||
wantedlist := strdir ("dead*"); | wantedlist := strdir ("dead*"); | ||
− | + | ||
i := 0; | i := 0; | ||
ln := length (wantedlist); | ln := length (wantedlist); | ||
− | + | ||
while (i < ln ) | while (i < ln ) | ||
{ | { | ||
Line 3,494: | Line 3,613: | ||
i:=i+1; | i:=i+1; | ||
} | } | ||
− | + | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL would be an example of a command to check the wanted dead | The previous DIL would be an example of a command to check the wanted dead | ||
Line 3,507: | Line 3,626: | ||
'dead' and separated it with a '.' and the players name. For example if | 'dead' and separated it with a '.' and the players name. For example if | ||
'whistler' was wanted dead the file name would be 'dead.whistler' | 'whistler' was wanted dead the file name would be 'dead.whistler' | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>set_password()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpsetpassword" /> | |
+ | |||
'''Function:''' <i><!--CODE-->set_password( u : unitptr, s : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->set_password( u : unitptr, s : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> the unit that you want to set the password of | <!--DEFINITION--> the unit that you want to set the password of | ||
<!--TERM--> '''s''' | <!--TERM--> '''s''' | ||
<!--DEFINITION--> the password you are using to set | <!--DEFINITION--> the password you are using to set | ||
− | + | ||
This function sets a unit password it only works on Players characters of corse. | This function sets a unit password it only works on Players characters of corse. | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin aware do_password (arg:string); | dilbegin aware do_password (arg:string); | ||
var | var | ||
prmt:string; | prmt:string; | ||
firstpwd:string; | firstpwd:string; | ||
− | + | ||
i:integer; | i:integer; | ||
tlist:stringlist; | tlist:stringlist; | ||
− | + | ||
code | code | ||
{ | { | ||
− | + | ||
if(self.type != UNIT_ST_PC) quit; | if(self.type != UNIT_ST_PC) quit; | ||
arg:=""; | arg:=""; | ||
Line 3,552: | Line 3,672: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (length(excmdstr)>16){ | if (length(excmdstr)>16){ | ||
sendtext ("Password to long. Try again.&n",self); | sendtext ("Password to long. Try again.&n",self); | ||
Line 3,558: | Line 3,678: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
firstpwd:=excmdstr; | firstpwd:=excmdstr; | ||
self.prompt:="Enter password again: "; | self.prompt:="Enter password again: "; | ||
− | + | ||
wait (SFB_CMD,self==activator); | wait (SFB_CMD,self==activator); | ||
block; | block; | ||
Line 3,572: | Line 3,692: | ||
sendtext("Changed your Password to '"+excmdstr+"' Please write it down!&n",self); | sendtext("Changed your Password to '"+excmdstr+"' Please write it down!&n",self); | ||
self.prompt:=prmt; | self.prompt:=prmt; | ||
− | + | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>store()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpstore" /> | |
+ | |||
'''Function:''' <i><!--CODE-->store( u : unitptr , filename : string , container : integer );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->store( u : unitptr , filename : string , container : integer );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> The Unit that has the contents to be stored or is to be stored | <!--DEFINITION--> The Unit that has the contents to be stored or is to be stored | ||
Line 3,597: | Line 3,718: | ||
<!--TERM--> '''container''' | <!--TERM--> '''container''' | ||
<!--DEFINITION--> Do you want to save the container 'TRUE' for yes, 'False' for no | <!--DEFINITION--> Do you want to save the container 'TRUE' for yes, 'False' for no | ||
− | + | ||
− | + | ||
Store saves a copy of a unit or units. If the container value is 'TRUE' | Store saves a copy of a unit or units. If the container value is 'TRUE' | ||
everything inside including the container itself will be saved. If the container | everything inside including the container itself will be saved. If the container | ||
Line 3,606: | Line 3,727: | ||
'FALSE' value for container would be good for temporary storage of PC inventory | 'FALSE' value for container would be good for temporary storage of PC inventory | ||
or for storing room contents. | or for storing room contents. | ||
− | + | ||
− | + | ||
The 'store' and 'restore' are perfect for operations such as | The 'store' and 'restore' are perfect for operations such as | ||
mud mailing objects from player to player, storage devices for players that will | mud mailing objects from player to player, storage devices for players that will | ||
Line 3,615: | Line 3,736: | ||
used on a room to store the contents of a room any NPC or objects in the room | used on a room to store the contents of a room any NPC or objects in the room | ||
would be saved through reboot. | would be saved through reboot. | ||
− | + | ||
− | + | ||
'''Disk access is always slow'''. | '''Disk access is always slow'''. | ||
If you use store on a continues basis, it is essential that you do so ONLY if it | If you use store on a continues basis, it is essential that you do so ONLY if it | ||
Line 3,625: | Line 3,746: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin save_contents (); | dilbegin save_contents (); | ||
code | code | ||
{ | { | ||
− | + | ||
:start: | :start: | ||
wait (SFB_CMD,command ("store")); wait for the store command*/ | wait (SFB_CMD,command ("store")); wait for the store command*/ | ||
Line 3,637: | Line 3,758: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''Example 2:''' | '''Example 2:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
− | + | ||
− | + | ||
dilbegin save_container_n_contents (); | dilbegin save_container_n_contents (); | ||
code | code | ||
{ | { | ||
− | + | ||
:start: | :start: | ||
wait (SFB_CMD,command ("store")); wait for the store command*/ | wait (SFB_CMD,command ("store")); wait for the store command*/ | ||
Line 3,656: | Line 3,777: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also''' | '''See Also''' | ||
[[#bfrestore|Store a Unit to a Unit file]] and | [[#bfrestore|Store a Unit to a Unit file]] and | ||
[[#bfdelunit|Delete a Unit file]]. | [[#bfdelunit|Delete a Unit file]]. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpp_u" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>position_update()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpp_u" /> | ||
position_update ( u : unitptr ) | position_update ( u : unitptr ) | ||
u : A pointer to a player or a monster. The character will be | u : A pointer to a player or a monster. The character will be | ||
Line 3,671: | Line 3,793: | ||
wounded, revived, etc. depending on current hitpoints. | wounded, revived, etc. depending on current hitpoints. | ||
Useful when tampering with the 'hp' field. Example: | Useful when tampering with the 'hp' field. Example: | ||
− | + | ||
pc.hp := pc.hp - 100; | pc.hp := pc.hp - 100; | ||
position_update(pc); | position_update(pc); | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>send_done()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpsend_done" /> | |
+ | |||
'''Function:'''</i><!--ENDCODE--> | '''Function:'''</i><!--ENDCODE--> | ||
send_done( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);</i><!--ENDCODE--> | send_done( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''c''' | <!--TERM--> '''c''' | ||
<!--DEFINITION--> the command string that is sending the message | <!--DEFINITION--> the command string that is sending the message | ||
Line 3,694: | Line 3,817: | ||
<!--TERM--> '''o''' | <!--TERM--> '''o''' | ||
<!--DEFINITION--> the unitptr (other) you also want the message to go to | <!--DEFINITION--> the unitptr (other) you also want the message to go to | ||
− | + | ||
− | + | ||
This sends the 'SFB_DONE' message to any dils that are waiting for it in the | This sends the 'SFB_DONE' message to any dils that are waiting for it in the | ||
surrounding area and to the other pointer if not null. The following is just | surrounding area and to the other pointer if not null. The following is just | ||
one example you can find many more in '''commands.zon''' | one example you can find many more in '''commands.zon''' | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin do_read (arg:string); | dilbegin do_read (arg:string); | ||
var | var | ||
Line 3,724: | Line 3,847: | ||
goto read_quit; | goto read_quit; | ||
} | } | ||
− | + | ||
if (itoa (i)!=arg) | if (itoa (i)!=arg) | ||
{ | { | ||
Line 3,730: | Line 3,853: | ||
goto read_quit; | goto read_quit; | ||
} | } | ||
− | + | ||
u:=self.outside.inside; | u:=self.outside.inside; | ||
while (u!=null) | while (u!=null) | ||
Line 3,738: | Line 3,861: | ||
u:=u.next; | u:=u.next; | ||
} | } | ||
− | + | ||
if (u==null) | if (u==null) | ||
{ | { | ||
Line 3,744: | Line 3,867: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (u.extra.["$BOARD_L_RES"].descr!="") | if (u.extra.["$BOARD_L_RES"].descr!="") | ||
{ | { | ||
Line 3,755: | Line 3,878: | ||
} | } | ||
} | } | ||
− | + | ||
brdname:=u.names.[length (u.names)-1]; | brdname:=u.names.[length (u.names)-1]; | ||
i:=loadstr (brdname+".idx",temp); | i:=loadstr (brdname+".idx",temp); | ||
Line 3,764: | Line 3,887: | ||
goto read_quit; | goto read_quit; | ||
} | } | ||
− | + | ||
templist:=split(temp,"&x"); | templist:=split(temp,"&x"); | ||
ln:=length (templist); | ln:=length (templist); | ||
Line 3,775: | Line 3,898: | ||
goto read_quit; | goto read_quit; | ||
} | } | ||
− | + | ||
i:=atoi(arg); | i:=atoi(arg); | ||
temp:=templist.[i-1]; | temp:=templist.[i-1]; | ||
Line 3,792: | Line 3,915: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
templist:=split(f_name,"."); | templist:=split(f_name,"."); | ||
if (length(templist)<2) | if (length(templist)<2) | ||
Line 3,800: | Line 3,923: | ||
act ("Message "+arg+": Re: "+temp, | act ("Message "+arg+": Re: "+temp, | ||
A_ALWAYS,self,null,null,TO_CHAR); | A_ALWAYS,self,null,null,TO_CHAR); | ||
− | + | ||
pagestring(buff,self); | pagestring(buff,self); | ||
− | + | ||
:read_quit: | :read_quit: | ||
send_done("read",self,null,u,0,arg,null); | send_done("read",self,null,u,0,arg,null); | ||
Line 3,808: | Line 3,931: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | <!--LINK--><span id="bfsend_pre" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>send_pre()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bfsend_pre" /> | ||
'''Function:'''</i><!--ENDCODE-->send_pre( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);</i><!--ENDCODE--> | '''Function:'''</i><!--ENDCODE-->send_pre( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''c''' | <!--TERM--> '''c''' | ||
<!--DEFINITION--> the command string that is sending the message | <!--DEFINITION--> the command string that is sending the message | ||
Line 3,829: | Line 3,953: | ||
<!--TERM--> '''o''' | <!--TERM--> '''o''' | ||
<!--DEFINITION--> the unitptr (other) you also want the message to go to | <!--DEFINITION--> the unitptr (other) you also want the message to go to | ||
− | + | ||
− | + | ||
− | + | ||
New Function send_pre() takes same arguments as send_done but returns either | New Function send_pre() takes same arguments as send_done but returns either | ||
SFR_SHARE or SFR_BLOCK. | SFR_SHARE or SFR_BLOCK. | ||
Line 3,839: | Line 3,963: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin cmdtst(arg : string); | dilbegin cmdtst(arg : string); | ||
var | var | ||
Line 3,846: | Line 3,970: | ||
{ | { | ||
i:=send_pre("cmdtest",self,null,null,0,argument,null); | i:=send_pre("cmdtest",self,null,null,0,argument,null); | ||
− | + | ||
if (i == SFR_BLOCK) | if (i == SFR_BLOCK) | ||
quit; | quit; | ||
− | + | ||
sendtext ("No one blocked me!&n",self); | sendtext ("No one blocked me!&n",self); | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
dilbegin pretest(); | dilbegin pretest(); | ||
code | code | ||
Line 3,867: | Line 3,991: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpset" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>set()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpset" /> | ||
set ( var i : integer , bit : integer ) | set ( var i : integer , bit : integer ) | ||
i : Integer variable to alter. | i : Integer variable to alter. | ||
bit : Bits to set in integer variable. | bit : Bits to set in integer variable. | ||
result: Sets bits in 'i' | result: Sets bits in 'i' | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpunset" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>unset()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpunset" /> | ||
unset ( var i : integer , bit : integer ) | unset ( var i : integer , bit : integer ) | ||
i : Integer variable to alter. | i : Integer variable to alter. | ||
bit : Bits to unset in integer variable. | bit : Bits to unset in integer variable. | ||
result: unset bits in 'i'. | result: unset bits in 'i'. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>addcolor()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpaddcolor" /> | |
+ | |||
'''Function: '''<i><!--CODE-->addcolor (ch : unitptr, ks : string, cstr : string ) ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->addcolor (ch : unitptr, ks : string, cstr : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''ch''' | <!--TERM--> '''ch''' | ||
<!--DEFINITION--> character you are adding the color to | <!--DEFINITION--> character you are adding the color to | ||
Line 3,898: | Line 4,025: | ||
<!--TERM--> '''cstr''' | <!--TERM--> '''cstr''' | ||
<!--DEFINITION--> color string | <!--DEFINITION--> color string | ||
− | + | ||
This function allows your Dils to create and add their own personal colors to a players | This function allows your Dils to create and add their own personal colors to a players | ||
color list. That way you can actually make an act in a color that the player chooses or | color list. That way you can actually make an act in a color that the player chooses or | ||
you yourself choose. | you yourself choose. | ||
'''Function: '''<i><!--CODE-->addcolor(pc, "clan_who","&c+w&bn");</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->addcolor(pc, "clan_who","&c+w&bn");</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>delcolor()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpdelcolor" /> | |
+ | |||
'''Function: '''<i><!--CODE-->delcolor (ch : unitptr, ks : string) ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->delcolor (ch : unitptr, ks : string) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''ch''' | <!--TERM--> '''ch''' | ||
<!--DEFINITION--> character you are deleting the color from | <!--DEFINITION--> character you are deleting the color from | ||
<!--TERM--> '''ks''' | <!--TERM--> '''ks''' | ||
<!--DEFINITION--> key string for the color | <!--DEFINITION--> key string for the color | ||
− | + | ||
This function is used to delete any colors from a players personal color list. | This function is used to delete any colors from a players personal color list. | ||
'''Function: '''<i><!--CODE-->delcolor(pc, "clan_who");</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->delcolor(pc, "clan_who");</i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>getcolor()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfgcolor" /> | |
+ | |||
'''Function: '''<i><!--CODE--> string getcolor (ch : unitptr, ks : string) ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE--> string getcolor (ch : unitptr, ks : string) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''ch''' | <!--TERM--> '''ch''' | ||
<!--DEFINITION--> character you are deleting the color from | <!--DEFINITION--> character you are deleting the color from | ||
Line 3,927: | Line 4,056: | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> returns the color in a string | <!--DEFINITION--> returns the color in a string | ||
− | + | ||
This function returns what color a player has for a key in the players list. | This function returns what color a player has for a key in the players list. | ||
'''Function: '''<i><!--CODE-->string := getcolor(pc, "clan_who");</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->string := getcolor(pc, "clan_who");</i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>changecolor()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpchangecolor" /> | |
+ | |||
'''Function: '''<i><!--CODE-->changecolor (ch : unitptr, ks : string, cstr : string ) ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->changecolor (ch : unitptr, ks : string, cstr : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''ch''' | <!--TERM--> '''ch''' | ||
<!--DEFINITION--> character you are changing the color on | <!--DEFINITION--> character you are changing the color on | ||
Line 3,941: | Line 4,071: | ||
<!--TERM--> '''cstr''' | <!--TERM--> '''cstr''' | ||
<!--DEFINITION--> color string | <!--DEFINITION--> color string | ||
− | + | ||
This will change a color in a players personal list. | This will change a color in a players personal list. | ||
'''Function: '''<i><!--CODE-->changecolor(pc, "clan_who","&c+w&bn");</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->changecolor(pc, "clan_who","&c+w&bn");</i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>gamestate()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpgamestate" /> | |
+ | |||
'''Function: '''<i><!--CODE--> gamestate( u : unitptr, gs : integer ); </i><!--ENDCODE--> | '''Function: '''<i><!--CODE--> gamestate( u : unitptr, gs : integer ); </i><!--ENDCODE--> | ||
Change the gamestate of a unitptr, uses the GS_ defines from the | Change the gamestate of a unitptr, uses the GS_ defines from the | ||
Line 3,956: | Line 4,087: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin informer(); | dilbegin informer(); | ||
var | var | ||
Line 3,963: | Line 4,094: | ||
{ | { | ||
heartbeat := PULSE_SEC; | heartbeat := PULSE_SEC; | ||
− | + | ||
tgt := ghead(); | tgt := ghead(); | ||
− | + | ||
while(tgt.type == UNIT_ST_PC) | while(tgt.type == UNIT_ST_PC) | ||
{ | { | ||
− | + | ||
if((isset(tgt.pcflags,PC_INFORM)) and (tgt != self)) | if((isset(tgt.pcflags,PC_INFORM)) and (tgt != self)) | ||
{ | { | ||
Line 3,979: | Line 4,110: | ||
} | } | ||
} | } | ||
− | + | ||
tgt := tgt.gnext; | tgt := tgt.gnext; | ||
} | } | ||
− | + | ||
return; | return; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
dilbegin aware on_connect(); | dilbegin aware on_connect(); | ||
external | external | ||
informer(); | informer(); | ||
login_modify(tgt : unitptr); | login_modify(tgt : unitptr); | ||
− | + | ||
var | var | ||
wizlvl : integer; | wizlvl : integer; | ||
Line 4,002: | Line 4,133: | ||
{ | { | ||
heartbeat := PULSE_SEC; | heartbeat := PULSE_SEC; | ||
− | + | ||
if(dilfind("do_quit@commands",self)) | if(dilfind("do_quit@commands",self)) | ||
i := dildestroy("do_quit@commands", self); | i := dildestroy("do_quit@commands", self); | ||
− | + | ||
err := loadstr("motd",motd); | err := loadstr("motd",motd); | ||
− | + | ||
if(err > 0) | if(err > 0) | ||
{ | { | ||
motd := textformat(motd); | motd := textformat(motd); | ||
sendtext(motd+"&n&n", self); | sendtext(motd+"&n&n", self); | ||
− | + | ||
} | } | ||
− | + | ||
err := loadstr("welcome",welcome); | err := loadstr("welcome",welcome); | ||
if(welcome) | if(welcome) | ||
welcome := textformat(welcome); | welcome := textformat(welcome); | ||
− | + | ||
if (self.level < 200) | if (self.level < 200) | ||
{ | { | ||
− | + | ||
login_modify(self); | login_modify(self); | ||
dilcopy ("clan_delete@clans",self); | dilcopy ("clan_delete@clans",self); | ||
dilcopy ("clan_clear@clans",self); | dilcopy ("clan_clear@clans",self); | ||
− | + | ||
− | + | ||
if(err > 0) | if(err > 0) | ||
sendtext("&n"+welcome+"&n&n", self); | sendtext("&n"+welcome+"&n&n", self); | ||
Line 4,034: | Line 4,165: | ||
} | } | ||
gamestate(self, GS_MENU); | gamestate(self, GS_MENU); | ||
− | + | ||
:wiz_menu: | :wiz_menu: | ||
sendtext("Welcome to Valhalla&n&n", self); | sendtext("Welcome to Valhalla&n&n", self); | ||
Line 4,042: | Line 4,173: | ||
sendtext("Make your choice: ", self); | sendtext("Make your choice: ", self); | ||
wait(SFB_CMD, TRUE); | wait(SFB_CMD, TRUE); | ||
− | + | ||
if (command("1") ) | if (command("1") ) | ||
{ | { | ||
Line 4,071: | Line 4,202: | ||
goto wiz_menu; | goto wiz_menu; | ||
} | } | ||
− | + | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
Look in '''vme.h''' for the possible values you can send to the menu | Look in '''vme.h''' for the possible values you can send to the menu | ||
function. | function. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpaddex" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>addextra()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpaddex" /> | ||
addextra ( var e : extraptr, l : stringlist , s : string ) | addextra ( var e : extraptr, l : stringlist , s : string ) | ||
e : Extra description list to add element to. | e : Extra description list to add element to. | ||
Line 4,089: | Line 4,221: | ||
s : String for the .descr field. | s : String for the .descr field. | ||
result: Adds an extra description to a list of extra descriptions. | result: Adds an extra description to a list of extra descriptions. | ||
− | + | ||
<strong>CAVEAT</strong> builder: You cannot use an extraptr variable as the e | <strong>CAVEAT</strong> builder: You cannot use an extraptr variable as the e | ||
argument, but you may continue to use the following form: | argument, but you may continue to use the following form: | ||
− | + | ||
... | ... | ||
... | ... | ||
Line 4,098: | Line 4,230: | ||
... | ... | ||
... | ... | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpadds" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>addstring()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpadds" /> | ||
addstring ( var l : stringlist, s : string ) | addstring ( var l : stringlist, s : string ) | ||
l : Stringlist to add string to. | l : Stringlist to add string to. | ||
s : String to add. | s : String to add. | ||
result : Adds a string 's' to a stringlist 'l'. | result : Adds a string 's' to a stringlist 'l'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsubex" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>subextra()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsubex" /> | ||
subextra ( var e : extraptr, s : string ) | subextra ( var e : extraptr, s : string ) | ||
e : Extra description list to remove element from. | e : Extra description list to remove element from. | ||
s : String matching .names field in element | s : String matching .names field in element | ||
result: Removes first extra description from list with matching name. | result: Removes first extra description from list with matching name. | ||
− | + | ||
<emp>CAVEAT</EMP> builder: You cannot use an extraptr variable as the e | <emp>CAVEAT</EMP> builder: You cannot use an extraptr variable as the e | ||
argument, but you may continue to use the following form: | argument, but you may continue to use the following form: | ||
− | + | ||
... | ... | ||
... | ... | ||
Line 4,121: | Line 4,255: | ||
... | ... | ||
... | ... | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsubs" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>substring()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsubs" /> | ||
substring ( var l : stringlist, s : string ) | substring ( var l : stringlist, s : string ) | ||
l : Stringlist to remove string from. | l : Stringlist to remove string from. | ||
s : String to remove | s : String to remove | ||
result: Removes string 's' from stringlist 'l'. | result: Removes string 's' from stringlist 'l'. | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>stop_fighting()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpstopfighting" /> | |
+ | |||
'''Function:''' <i><!--CODE-->stop_fighting( ch: unitptr, vict : unitptr ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->stop_fighting( ch: unitptr, vict : unitptr ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''ch''' | <!--TERM--> '''ch''' | ||
<!--DEFINITION--> unitptr - person you are stoping the fighting for | <!--DEFINITION--> unitptr - person you are stoping the fighting for | ||
<!--TERM--> '''vict''' | <!--TERM--> '''vict''' | ||
<!--DEFINITION--> unitptr - person you are removing from the fighting or null for everyone | <!--DEFINITION--> unitptr - person you are removing from the fighting or null for everyone | ||
− | + | ||
This function can be used to cancel combat in a room or with two people. | This function can be used to cancel combat in a room or with two people. | ||
The following example copied to a player will stop any fight the player is in. | The following example copied to a player will stop any fight the player is in. | ||
Line 4,145: | Line 4,281: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin stop_combat(); | dilbegin stop_combat(); | ||
code | code | ||
Line 4,153: | Line 4,289: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsubaff" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>subaff()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsubaff" /> | ||
subaff ( u : unitptr, i : integer ) | subaff ( u : unitptr, i : integer ) | ||
u : Unit remove affect from. | u : Unit remove affect from. | ||
i : Affect id to remove, see ID_* in values.h and/or vme.h | i : Affect id to remove, see ID_* in values.h and/or vme.h | ||
result: Removes first affect at 'u' with matching id 'i'. | result: Removes first affect at 'u' with matching id 'i'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpaddaff" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>addaff()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpaddaff" /> | ||
addaff ( u : unitptr, id : integer, tif_first : integer, tif_tick : integer, | addaff ( u : unitptr, id : integer, tif_first : integer, tif_tick : integer, | ||
tif_last : integer, apf : integer, )XXX | tif_last : integer, apf : integer, )XXX | ||
Line 4,173: | Line 4,311: | ||
id : Affect id to add, see ID_* in values.h and/or vme.h | id : Affect id to add, see ID_* in values.h and/or vme.h | ||
result: Adds affect 'id' at 'u' with first, tick, and last TIF_XXX's | result: Adds affect 'id' at 'u' with first, tick, and last TIF_XXX's | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>destroy()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpdest" /> | |
+ | |||
'''Function:''' <i><!--CODE-->destroy ( u : unitptr );</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->destroy ( u : unitptr );</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> :Unit to remove from game | <!--DEFINITION--> :Unit to remove from game | ||
− | + | ||
The destroy function works in two ways depending on the Unit being acted on. | The destroy function works in two ways depending on the Unit being acted on. | ||
If the Unit being acted on is a PC the player is saved and ejected from the game. | If the Unit being acted on is a PC the player is saved and ejected from the game. | ||
Line 4,190: | Line 4,329: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin purge_all_pc(); | dilbegin purge_all_pc(); | ||
var | var | ||
Line 4,199: | Line 4,338: | ||
u:=ghead();/*get first pc in game list*/ | u:=ghead();/*get first pc in game list*/ | ||
n:=u; | n:=u; | ||
− | + | ||
− | + | ||
while (n.type==UNIT_ST_PC)/*while unit is a pc*/ | while (n.type==UNIT_ST_PC)/*while unit is a pc*/ | ||
{ | { | ||
Line 4,206: | Line 4,345: | ||
destroy(u); | destroy(u); | ||
} | } | ||
− | + | ||
quit;/*done whiping out the players*/ | quit;/*done whiping out the players*/ | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpwalkto" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>walkto()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpwalkto" /> | ||
walkto ( u : unitptr ) | walkto ( u : unitptr ) | ||
u : Room to walk to. | u : Room to walk to. | ||
result: Makes unit (self) walk to room, taking a 'step' at each 'tick'. | result: Makes unit (self) walk to room, taking a 'step' at each 'tick'. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
walkto(findroom("inn@udgaard"));</nowiki> | walkto(findroom("inn@udgaard"));</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bplink" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>link()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bplink" /> | ||
link ( u : unitptr, t : unitptr ) | link ( u : unitptr, t : unitptr ) | ||
u : Unit to link. | u : Unit to link. | ||
Line 4,234: | Line 4,375: | ||
result: Link a unit into another unit hierarchy. (Automatically | result: Link a unit into another unit hierarchy. (Automatically | ||
unequipps if equipped). | unequipps if equipped). | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>weapon_name()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfweapon_name" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string weapon_name( i : integer ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string weapon_name( i : integer ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''i''' | <!--TERM--> '''i''' | ||
<!--DEFINITION--> Weapon to get the name of ass defined in 'values.h' and 'weapons.def' | <!--DEFINITION--> Weapon to get the name of ass defined in 'values.h' and 'weapons.def' | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> The name of the weapon that corresponds with the integer value | <!--DEFINITION--> The name of the weapon that corresponds with the integer value | ||
− | + | ||
'''example:''' | '''example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
myweap:=weapon_name(5); | myweap:=weapon_name(5); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>weapon_info()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfweapon_info" /> | |
+ | |||
'''Function:''' <i><!--CODE-->intlist weapon_info( i : integer ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->intlist weapon_info( i : integer ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''i''' | <!--TERM--> '''i''' | ||
<!--DEFINITION--> Weapon to get the info of ass defined in 'values.h' and 'weapons.def' | <!--DEFINITION--> Weapon to get the info of ass defined in 'values.h' and 'weapons.def' | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> Intlist containing 4 values: | <!--DEFINITION--> Intlist containing 4 values: | ||
− | + | ||
<!--TERM--> '''0''' | <!--TERM--> '''0''' | ||
<!--DEFINITION--> Number of hands | <!--DEFINITION--> Number of hands | ||
Line 4,272: | Line 4,415: | ||
<!--TERM--> '''3''' | <!--TERM--> '''3''' | ||
<!--DEFINITION--> shield block value | <!--DEFINITION--> shield block value | ||
− | + | ||
− | + | ||
This function gives you access to the values in the weapons.def file. | This function gives you access to the values in the weapons.def file. | ||
With this things like 'wear' equipment' and 'look' are much easier to | With this things like 'wear' equipment' and 'look' are much easier to | ||
Line 4,280: | Line 4,423: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilcopy id_weap (arg:string); | dilcopy id_weap (arg:string); | ||
var | var | ||
Line 4,288: | Line 4,431: | ||
{ | { | ||
il:=weapon_info(atoi(arg)); | il:=weapon_info(atoi(arg)); | ||
− | + | ||
if (il!=null) | if (il!=null) | ||
{ | { | ||
Line 4,300: | Line 4,443: | ||
sendtext ("No such weapon.&n",self); | sendtext ("No such weapon.&n",self); | ||
} | } | ||
− | + | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>skill_name()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfskill_name" /> | |
+ | |||
'''Function:''' <i><!--CODE-->string skill_name( i : integer ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->string skill_name( i : integer ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''i''' | <!--TERM--> '''i''' | ||
<!--DEFINITION--> Skill to get the name of ass defined in 'values.h' and 'commands.def' | <!--DEFINITION--> Skill to get the name of ass defined in 'values.h' and 'commands.def' | ||
<!--TERM--> '''returns''' | <!--TERM--> '''returns''' | ||
<!--DEFINITION--> The name of the skill that corresponds with the integer value | <!--DEFINITION--> The name of the skill that corresponds with the integer value | ||
− | + | ||
'''example:''' | '''example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
myski:=skill_name(5); | myski:=skill_name(5); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>reboot</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpreboot" /> | |
+ | |||
'''Function: '''<i><!--CODE-->reboot ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->reboot ;</i><!--ENDCODE--> | ||
This function works like a quit command. Anything after the reboot function in a Dil will not be | This function works like a quit command. Anything after the reboot function in a Dil will not be | ||
Line 4,340: | Line 4,485: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin cmd_reboot (arg:string); | dilbegin cmd_reboot (arg:string); | ||
code | code | ||
Line 4,348: | Line 4,493: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>killedit</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpkilledit" /> | |
+ | |||
'''Function: '''<i><!--CODE-->killedit ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->killedit ;</i><!--ENDCODE--> | ||
This function is used to kill the editor on a PC if it needs to | This function is used to kill the editor on a PC if it needs to | ||
Line 4,365: | Line 4,511: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin editextra (arg:string); | dilbegin editextra (arg:string); | ||
code | code | ||
Line 4,380: | Line 4,526: | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpexp" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>experience()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpexp" /> | ||
experience ( i : integer, u : unitptr ) | experience ( i : integer, u : unitptr ) | ||
i : A integer number of experience to gain or loose. | i : A integer number of experience to gain or loose. | ||
Line 4,396: | Line 4,543: | ||
experience). USE WITH CARE! SUGGEST THAT YOU ONLY USE | experience). USE WITH CARE! SUGGEST THAT YOU ONLY USE | ||
INTEGER CONSTANTS AS THE EXPRESSION TO AVOID ERRORS. | INTEGER CONSTANTS AS THE EXPRESSION TO AVOID ERRORS. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpact" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>act()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bpact" /> | |
+ | |||
The purpose of act is to send a message to a number of players '''present''' in | The purpose of act is to send a message to a number of players '''present''' in | ||
a room. The room is defined as the room containing the afore mentioned | a room. The room is defined as the room containing the afore mentioned | ||
character (provided he himself is in the room, i.e. not in a closed | character (provided he himself is in the room, i.e. not in a closed | ||
container.) | container.) | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
'''Syntax:''' | '''Syntax:''' | ||
− | + | ||
act(message, visibility, char, medium, victim, to_whom); | act(message, visibility, char, medium, victim, to_whom); | ||
− | + | ||
− | + | ||
<!--TERM--> '''message''' | <!--TERM--> '''message''' | ||
<!--DEFINITION--> - is a string that will be shown to other mobiles when the act is executed. To refer to the following arguments use the [[#formatters|formatters]] listed below. | <!--DEFINITION--> - is a string that will be shown to other mobiles when the act is executed. To refer to the following arguments use the [[#formatters|formatters]] listed below. | ||
Line 4,443: | Line 4,591: | ||
<!--TERM--> <b><!--CODE-->TO_REST</b><!--ENDCODE--> | <!--TERM--> <b><!--CODE-->TO_REST</b><!--ENDCODE--> | ||
<!--DEFINITION--> This is a bit different from the rest. In sends the message to all other units in the local environment, excluding those inside 'char'. | <!--DEFINITION--> This is a bit different from the rest. In sends the message to all other units in the local environment, excluding those inside 'char'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
<!--LINK--><span id="formatters" /> | <!--LINK--><span id="formatters" /> | ||
'''Act Formatters''' | '''Act Formatters''' | ||
− | + | ||
Just as the description formatters, act has its own set of formatters that | Just as the description formatters, act has its own set of formatters that | ||
enable you to create generic messages that will be interpreted at run-time, | enable you to create generic messages that will be interpreted at run-time, | ||
lessening the load on you. | lessening the load on you. | ||
− | + | ||
The format string is a normal message, containing some special characters: | The format string is a normal message, containing some special characters: | ||
− | + | ||
<!--TERM--> '$$' | <!--TERM--> '$$' | ||
<!--DEFINITION--> will be sent to the receiver as a single `$' | <!--DEFINITION--> will be sent to the receiver as a single `$' | ||
− | + | ||
'$', followed by a number and an extra character. | '$', followed by a number and an extra character. | ||
'''The numbers:''' | '''The numbers:''' | ||
− | + | ||
<!--TERM--> '1' | <!--TERM--> '1' | ||
<!--DEFINITION--> means this formatter refers to the 'char' argument. | <!--DEFINITION--> means this formatter refers to the 'char' argument. | ||
Line 4,467: | Line 4,615: | ||
<!--TERM--> '3' | <!--TERM--> '3' | ||
<!--DEFINITION--> means this formatter refers to the 'victim' argument. | <!--DEFINITION--> means this formatter refers to the 'victim' argument. | ||
− | + | ||
'''The characters''' | '''The characters''' | ||
− | + | ||
<!--TERM--> 'N' | <!--TERM--> 'N' | ||
<!--DEFINITION--> the formatter will be replaced with the name of the unit, or (depending on the visibility) 'something' or 'someone'. | <!--DEFINITION--> the formatter will be replaced with the name of the unit, or (depending on the visibility) 'something' or 'someone'. | ||
Line 4,486: | Line 4,634: | ||
<!--TERM--> 't' | <!--TERM--> 't' | ||
<!--DEFINITION--> the string in the argument referred by the number. | <!--DEFINITION--> the string in the argument referred by the number. | ||
− | + | ||
− | + | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
act("You step over $2n.", A_SOMEONE, self, litter, null, TO_CHAR); | act("You step over $2n.", A_SOMEONE, self, litter, null, TO_CHAR); | ||
act("$1n steps over $2n.", A_SOMEONE, self, litter, null, TO_REST);</nowiki> | act("$1n steps over $2n.", A_SOMEONE, self, litter, null, TO_REST);</nowiki> | ||
− | + | ||
− | + | ||
'''See Also:''' | '''See Also:''' | ||
[[#act.html|DIL Act() for Dummies]] | [[#act.html|DIL Act() for Dummies]] | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpexec" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>exec()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpexec" /> | ||
exec ( s : string , u : unitptr ) | exec ( s : string , u : unitptr ) | ||
s : Command and arguments to perform. | s : Command and arguments to perform. | ||
Line 4,511: | Line 4,660: | ||
"get key". If there is no 'key' available, the PC will get | "get key". If there is no 'key' available, the PC will get | ||
notified the normal way. Plenty of examples are given above. | notified the normal way. Plenty of examples are given above. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpwait" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>wait()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpwait" /> | ||
wait ( i : integer , dilexp ) | wait ( i : integer , dilexp ) | ||
i : Message class to accept, see SFB_* in values.h and/or vme.h | i : Message class to accept, see SFB_* in values.h and/or vme.h | ||
Line 4,523: | Line 4,673: | ||
the chapter on messages. | the chapter on messages. | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
wait (SFB_TICK|SFB_MSG, TRUE) | wait (SFB_TICK|SFB_MSG, TRUE) | ||
/* Will accept a message, either from another DIL program or a | /* Will accept a message, either from another DIL program or a | ||
Line 4,529: | Line 4,679: | ||
such message will reactivate the DIL program. | such message will reactivate the DIL program. | ||
*/ | */ | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
wait (SFB_CMD, command("transmutate")) | wait (SFB_CMD, command("transmutate")) | ||
/* waits for an command entered named 'transmutate'. | /* waits for an command entered named 'transmutate'. | ||
Line 4,538: | Line 4,688: | ||
message for unknown commands). | message for unknown commands). | ||
*/ | */ | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>savestr()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfsavestr" /> | |
+ | |||
'''Function:''' <i><!--CODE-->integer savestr( filename : string , buff : string , wa :string);</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->integer savestr( filename : string , buff : string , wa :string);</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''filename''' | <!--TERM--> '''filename''' | ||
<!--DEFINITION--> The name of the String file to save the String to | <!--DEFINITION--> The name of the String file to save the String to | ||
Line 4,552: | Line 4,703: | ||
<!--TERM--> '''Return''' | <!--TERM--> '''Return''' | ||
<!--DEFINITION--> <i><!--CODE-->FILE_SAVED, FILE_NOT_SAVED, FILE_NOT_CREATED, or FILE_ILEGAL_OPP</i><!--ENDCODE--> | <!--DEFINITION--> <i><!--CODE-->FILE_SAVED, FILE_NOT_SAVED, FILE_NOT_CREATED, or FILE_ILEGAL_OPP</i><!--ENDCODE--> | ||
− | + | ||
Savestr is used to save strings to disk to be loaded later by the 'load' function. | Savestr is used to save strings to disk to be loaded later by the 'load' function. | ||
The 'savestr' and 'Loadstr' is perfect for operations such as | The 'savestr' and 'Loadstr' is perfect for operations such as | ||
Line 4,570: | Line 4,721: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin news_save (arg:string /*for saving*/); | dilbegin news_save (arg:string /*for saving*/); | ||
var | var | ||
Line 4,582: | Line 4,733: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
sendtext("New news file wrote.[&]n",self); | sendtext("New news file wrote.[&]n",self); | ||
quit;/*dil save routine done destroy self.*/ | quit;/*dil save routine done destroy self.*/ | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''See Also''' <i><!--CODE--> | '''See Also''' <i><!--CODE--> | ||
[[#bfdelstr|Delete a String file]] and | [[#bfdelstr|Delete a String file]] and | ||
[[#bfloadstr|Load a String file]]</i><!--ENDCODE--> | [[#bfloadstr|Load a String file]]</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>remove()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpremove" /> | |
+ | |||
'''Function:''' <i><!--CODE-->remove( sl : stringlist, i : integer ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->remove( sl : stringlist, i : integer ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''sl''' | <!--TERM--> '''sl''' | ||
<!--DEFINITION--> the stringlist you are removing from | <!--DEFINITION--> the stringlist you are removing from | ||
<!--TERM--> '''i''' | <!--TERM--> '''i''' | ||
<!--DEFINITION--> the index you want to remove | <!--DEFINITION--> the index you want to remove | ||
− | + | ||
This function allows you to remove a string from a stringlist with out | This function allows you to remove a string from a stringlist with out | ||
leaving a blank spot in the stringlist. | leaving a blank spot in the stringlist. | ||
'''Example: '''<i><!--CODE-->remove (sl, i);</i><!--ENDCODE--> | '''Example: '''<i><!--CODE-->remove (sl, i);</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>reset_level()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpresetlevel" /> | |
+ | |||
'''Function:''' <i><!--CODE-->reset_level( u : unitptr ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->reset_level( u : unitptr ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> player your resetting | <!--DEFINITION--> player your resetting | ||
− | + | ||
This function simply resets a players level. Can be used in functions | This function simply resets a players level. Can be used in functions | ||
like reroll where you set the players back to the way he first logged on. | like reroll where you set the players back to the way he first logged on. | ||
Line 4,625: | Line 4,778: | ||
[[#bpresetvlevel|reset a players virtual level]] and | [[#bpresetvlevel|reset a players virtual level]] and | ||
[[#bpresetrace|reset a players race information]]</i><!--ENDCODE--> | [[#bpresetrace|reset a players race information]]</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>reset_vlevel()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpresetvlevel" /> | |
+ | |||
'''Function:''' <i><!--CODE-->reset_vlevel( u : unitptr ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->reset_vlevel( u : unitptr ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> player your resetting | <!--DEFINITION--> player your resetting | ||
− | + | ||
This function simply resets a players virtual level. Can be used in functions | This function simply resets a players virtual level. Can be used in functions | ||
like reroll where you set the players back to the way he first logged on. | like reroll where you set the players back to the way he first logged on. | ||
Line 4,641: | Line 4,795: | ||
[[#bpresetlevel|reset a players level]] and | [[#bpresetlevel|reset a players level]] and | ||
[[#bpresetrace|reset a players race information]]</i><!--ENDCODE--> | [[#bpresetrace|reset a players race information]]</i><!--ENDCODE--> | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>reset_race()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpresetrace" /> | |
+ | |||
'''Function:''' <i><!--CODE-->reset_race( u : unitptr ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->reset_race( u : unitptr ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''u''' | <!--TERM--> '''u''' | ||
<!--DEFINITION--> player your resetting | <!--DEFINITION--> player your resetting | ||
− | + | ||
Reset a characters race, weight, height, age, lifespan, and costs for training. | Reset a characters race, weight, height, age, lifespan, and costs for training. | ||
As if you first log on the character. Great for reroll along with 'reset_level' and 'reset_vlevel'. | As if you first log on the character. Great for reroll along with 'reset_level' and 'reset_vlevel'. | ||
Line 4,656: | Line 4,811: | ||
[[#bpresetlevel|reset a players level]] and | [[#bpresetlevel|reset a players level]] and | ||
[[#bpresetvlevel|reset a players virtual level]]</i><!--ENDCODE--> | [[#bpresetvlevel|reset a players virtual level]]</i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsec" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>secure()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsec" /> | ||
secure ( u : unitptr , label ) | secure ( u : unitptr , label ) | ||
u : Unit to secure. | u : Unit to secure. | ||
Line 4,674: | Line 4,830: | ||
several secured units leave local environment, the last such | several secured units leave local environment, the last such | ||
event will determine the point of execution upon return. | event will determine the point of execution upon return. | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>unitdir()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bfunitdir" /> | |
+ | |||
'''Function:''' <i><!--CODE-->stringlist unitdir( match : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->stringlist unitdir( match : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''match''' | <!--TERM--> '''match''' | ||
<!--DEFINITION--> The wild card file you want to match or '*' for all. | <!--DEFINITION--> The wild card file you want to match or '*' for all. | ||
<!--TERM--> '''return''' | <!--TERM--> '''return''' | ||
<!--DEFINITION--> a Stringlist with all the filenames that match the 'match' argument. | <!--DEFINITION--> a Stringlist with all the filenames that match the 'match' argument. | ||
− | + | ||
The 'match' argument uses the same wild cards as the Linux 'ls' command | The 'match' argument uses the same wild cards as the Linux 'ls' command | ||
so the following will work. | so the following will work. | ||
− | + | ||
<!--TERM--> '''*''' | <!--TERM--> '''*''' | ||
<!--DEFINITION--> Match any character or group of characters | <!--DEFINITION--> Match any character or group of characters | ||
Line 4,693: | Line 4,850: | ||
<!--TERM--> '''[...]''' | <!--TERM--> '''[...]''' | ||
<!--DEFINITION--> Match one of a set of characters | <!--DEFINITION--> Match one of a set of characters | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
"corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... | "corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... | ||
"corpse?" matches corpse1 corpses corpse5 ... | "corpse?" matches corpse1 corpses corpse5 ... | ||
Line 4,703: | Line 4,860: | ||
"[a-z]*" about zoo man father ... | "[a-z]*" about zoo man father ... | ||
"start[nm]end" matches startnend startmend | "start[nm]end" matches startnend startmend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
'''Example DIL:''' | '''Example DIL:''' | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin aware reload_corpse(); | dilbegin aware reload_corpse(); | ||
var | var | ||
Line 4,734: | Line 4,891: | ||
i:=i+1; | i:=i+1; | ||
} | } | ||
− | + | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
The previous DIL example is the DIL used in restoring corpses to the game in | The previous DIL example is the DIL used in restoring corpses to the game in | ||
Line 4,746: | Line 4,903: | ||
by reading through the file death.zon in the vme2.0/zone. | by reading through the file death.zon in the vme2.0/zone. | ||
directory. | directory. | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpunsec" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>unsecure()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpunsec" /> | ||
unsecure ( u : unitptr ) | unsecure ( u : unitptr ) | ||
u : Secured unit. | u : Secured unit. | ||
result: Drop secure on a given unit. | result: Drop secure on a given unit. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpblock" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>block</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpblock" /> | ||
block | block | ||
result: Blocks any command issued by a player or mobile. Blocking a | result: Blocks any command issued by a player or mobile. Blocking a | ||
Line 4,762: | Line 4,921: | ||
which intercepts a command, reacts on it in a special way, | which intercepts a command, reacts on it in a special way, | ||
and does not need the standard way of reacting. | and does not need the standard way of reacting. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bppri" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>priority</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bppri" /> | ||
priority | priority | ||
result: Set until nopriority command. When set, no special routines | result: Set until nopriority command. When set, no special routines | ||
Line 4,770: | Line 4,930: | ||
to make other special routines idle. See haon-dor.zon for an | to make other special routines idle. See haon-dor.zon for an | ||
example. | example. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpnopri" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>nopriority</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpnopri" /> | ||
nopriority | nopriority | ||
result: Cancels the priority procedure. | result: Cancels the priority procedure. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpaddeq" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>addequip()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpaddeq" /> | ||
addequip ( u : unitptr , i : integer ) | addequip ( u : unitptr , i : integer ) | ||
u : Unit to equip. | u : Unit to equip. | ||
Line 4,783: | Line 4,945: | ||
result: Equips unit, presumed to be in inventory PC/NPC at | result: Equips unit, presumed to be in inventory PC/NPC at | ||
given position. See WEAR_* in values.h and/or vme.h | given position. See WEAR_* in values.h and/or vme.h | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpuneq" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>unequip()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpuneq" /> | ||
unequip ( u : unitptr ) | unequip ( u : unitptr ) | ||
u : Unit to unequip. | u : Unit to unequip. | ||
result: Unequipes unit presumed to be in equipment of PC/NPC. | result: Unequipes unit presumed to be in equipment of PC/NPC. | ||
− | + | ||
− | + | ||
− | + | <!--PAGENAMESTART--><span style="color: red"><b>delete_player()</b></span><!--PAGENAMEEND--> | |
− | + | <!--LINK--><span id="bpdp" /> | |
+ | |||
'''Function:''' <i><!--CODE-->delete_player( s : string ) ;</i><!--ENDCODE--> | '''Function:''' <i><!--CODE-->delete_player( s : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''s''' | <!--TERM--> '''s''' | ||
<!--DEFINITION--> the player name you want to delete | <!--DEFINITION--> the player name you want to delete | ||
− | + | ||
This function deletes a player but it doesn't check to see if it | This function deletes a player but it doesn't check to see if it | ||
was deleted or if it even existed you will have to do that with 'isplayer'. | was deleted or if it even existed you will have to do that with 'isplayer'. | ||
Line 4,803: | Line 4,967: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin aware do_delete (arg:string); | dilbegin aware do_delete (arg:string); | ||
var | var | ||
Line 4,810: | Line 4,974: | ||
code | code | ||
{ | { | ||
− | + | ||
if(self.type != UNIT_ST_PC) quit; | if(self.type != UNIT_ST_PC) quit; | ||
− | + | ||
if (self.level>200) | if (self.level>200) | ||
goto admin_delete; | goto admin_delete; | ||
− | + | ||
:char_delete: | :char_delete: | ||
if (arg!="self forever") | if (arg!="self forever") | ||
Line 4,822: | Line 4,986: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
err:=loadstr("delete.txt",temp); | err:=loadstr("delete.txt",temp); | ||
− | + | ||
if (err<1) | if (err<1) | ||
goto no_insure; | goto no_insure; | ||
− | + | ||
sendtext (temp,self); | sendtext (temp,self); | ||
− | + | ||
sendtext ("If your sure you still want to delete your character, 'say delete me'&n",self); | sendtext ("If your sure you still want to delete your character, 'say delete me'&n",self); | ||
sendtext ("Doing anything else will abort the deletion.&n",self); | sendtext ("Doing anything else will abort the deletion.&n",self); | ||
− | + | ||
wait (SFB_CMD, self==activator); | wait (SFB_CMD, self==activator); | ||
if (command ("say")) | if (command ("say")) | ||
− | + | ||
if (argument=="delete me") | if (argument=="delete me") | ||
if (self.extra.[CLAN_RANK]!=null) | if (self.extra.[CLAN_RANK]!=null) | ||
exec ("cdefect",self); | exec ("cdefect",self); | ||
delete_player(self.name); | delete_player(self.name); | ||
− | + | ||
sendtext("Deletion aborted&n",self); | sendtext("Deletion aborted&n",self); | ||
− | + | ||
quit; | quit; | ||
− | + | ||
:no_insure: | :no_insure: | ||
if (self.extra.[CLAN_RANK]!=null) | if (self.extra.[CLAN_RANK]!=null) | ||
exec ("cdefect",self); | exec ("cdefect",self); | ||
delete_player(self.name); | delete_player(self.name); | ||
− | + | ||
quit; | quit; | ||
:admin_delete: | :admin_delete: | ||
Line 4,858: | Line 5,022: | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (arg==self.name){ | if (arg==self.name){ | ||
sendtext ("To delete self you need to type 'delete self forever'&n",self); | sendtext ("To delete self you need to type 'delete self forever'&n",self); | ||
quit; | quit; | ||
} | } | ||
− | + | ||
if (not isplayer(arg)) | if (not isplayer(arg)) | ||
{ | { | ||
Line 4,870: | Line 5,034: | ||
} | } | ||
dilcopy ("god_delete@clans("+arg+")",self); | dilcopy ("god_delete@clans("+arg+")",self); | ||
− | + | ||
sendtext (arg+" has been deleted.&n",self); | sendtext (arg+" has been deleted.&n",self); | ||
quit; | quit; | ||
} | } | ||
dilend | dilend | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpdc" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>dilcopy()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpdc" /> | ||
dilcopy( s : string, u : unitptr ) | dilcopy( s : string, u : unitptr ) | ||
s : Name template to attach to unit. | s : Name template to attach to unit. | ||
Line 4,890: | Line 5,055: | ||
result: Attaches a DIL program to a unit 'u', which uses a template | result: Attaches a DIL program to a unit 'u', which uses a template | ||
named by 's'. | named by 's'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsendt" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>sendtext()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsendt" /> | ||
sendtext( s : string, u : unitptr ) | sendtext( s : string, u : unitptr ) | ||
s : text to send | s : text to send | ||
Line 4,898: | Line 5,064: | ||
result: Sends the string 's' to 'u'. Useful only for nanny stuff, | result: Sends the string 's' to 'u'. Useful only for nanny stuff, | ||
because no new line appended. | because no new line appended. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpchngs" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>change_speed()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpchngs" /> | ||
change_speed( u : unitptr, i : integer ) | change_speed( u : unitptr, i : integer ) | ||
u : the unit on which you wish to alter the current combat speed. | u : the unit on which you wish to alter the current combat speed. | ||
i : the amount to add to the speed. | i : the amount to add to the speed. | ||
− | + | ||
Beware, this is not the 'speed' as in the speed field, rather this is | Beware, this is not the 'speed' as in the speed field, rather this is | ||
the speed which is calculated during combat. It is used for spells like | the speed which is calculated during combat. It is used for spells like | ||
'stun' which effectively puts the character out of combat for one | 'stun' which effectively puts the character out of combat for one | ||
round. Such a spell would be implemented like: | round. Such a spell would be implemented like: | ||
− | + | ||
change_speed(u, 12) | change_speed(u, 12) | ||
− | + | ||
and would only cause any effect if 'u' was fighting already (if not, | and would only cause any effect if 'u' was fighting already (if not, | ||
use setfighting). | use setfighting). | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bftranmon" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>transfermoney()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bftranmon" /> | ||
integer transfermoney( f : unitptr, t : unitptr, amount : integer) | integer transfermoney( f : unitptr, t : unitptr, amount : integer) | ||
f : The char the money is taken from | f : The char the money is taken from | ||
Line 4,922: | Line 5,090: | ||
amount : How much money. | amount : How much money. | ||
Returns: TRUE is money was transferred, FALSE if could not afford. | Returns: TRUE is money was transferred, FALSE if could not afford. | ||
− | + | ||
If 'f' is null and 't' isn't, then money is created and given to 't'. | If 'f' is null and 't' isn't, then money is created and given to 't'. | ||
If 'f' isn't null but 't' is, then money is removed from 'f'. | If 'f' isn't null but 't' is, then money is removed from 'f'. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsetfight" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>set_fighting()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsetfight" /> | ||
set_fighting( u : unitptr, t : unitptr ) | set_fighting( u : unitptr, t : unitptr ) | ||
u : the unit on which attacks. | u : the unit on which attacks. | ||
t : the unit being attacked. | t : the unit being attacked. | ||
− | + | ||
This is used to set two characters fighting. If the attacker is | This is used to set two characters fighting. If the attacker is | ||
fighting already, the target will simply be inserted into the | fighting already, the target will simply be inserted into the | ||
opponent list and perhaps killed a little later. | opponent list and perhaps killed a little later. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsetweight" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>setweight()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsetweight" /> | ||
setweight( u : unitptr, i : integer ) | setweight( u : unitptr, i : integer ) | ||
u : the unit on which you wish to alter the weight. | u : the unit on which you wish to alter the weight. | ||
i : the new weight | i : the new weight | ||
− | + | ||
This is needed on for example drink-containers. I.e. if you wish to | This is needed on for example drink-containers. I.e. if you wish to | ||
remove or add some liquid, you must also adjust the weight of the | remove or add some liquid, you must also adjust the weight of the | ||
container, or you will mess up things. | container, or you will mess up things. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsetbright" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>setbright()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsetbright" /> | ||
setbright( u : unitptr, i : integer ) | setbright( u : unitptr, i : integer ) | ||
u : the unit on which you want to change the brightness. | u : the unit on which you want to change the brightness. | ||
i : the new brightness | i : the new brightness | ||
− | + | ||
When you want to increase / decrease the amount of light shed by a | When you want to increase / decrease the amount of light shed by a | ||
unit, use this function. Units with "bright" light up rooms so that | unit, use this function. Units with "bright" light up rooms so that | ||
people can see. | people can see. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bplog" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>log()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bplog" /> | ||
log( s : string ) | log( s : string ) | ||
s : Text to put in the log. | s : Text to put in the log. | ||
result: Puts text in the log for debugging purposes. | result: Puts text in the log for debugging purposes. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsend" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>send()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsend" /> | ||
send ( s : string ) | send ( s : string ) | ||
s : Message to send. | s : Message to send. | ||
Line 4,970: | Line 5,143: | ||
by those DIL programs in the local environment that is not set up | by those DIL programs in the local environment that is not set up | ||
to wait for that message class. | to wait for that message class. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsendto" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>sendto()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsendto" /> | ||
sendto ( s : string , u : unitptr ) | sendto ( s : string , u : unitptr ) | ||
s : Message to send. | s : Message to send. | ||
Line 4,980: | Line 5,154: | ||
received by those DIL programs in the local environment that is | received by those DIL programs in the local environment that is | ||
not set up to wait for that message class. | not set up to wait for that message class. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsendall" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>sendtoall()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsendall" /> | ||
sendtoall( m : string, s : string ) | sendtoall( m : string, s : string ) | ||
m : Message to send. | m : Message to send. | ||
s : Name idx to send message to. | s : Name idx to send message to. | ||
result: Send a message to all units matching a given database name. | result: Send a message to all units matching a given database name. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
sendtoall ( "some message", "rabbit@haon-dor"); | sendtoall ( "some message", "rabbit@haon-dor"); | ||
− | + | ||
The message "some message" is sent to all units in the world matching the | The message "some message" is sent to all units in the world matching the | ||
data base name "rabbit@haon-dor". Like 'send()' and 'sendto()', the | data base name "rabbit@haon-dor". Like 'send()' and 'sendto()', the | ||
message received matches the SFB_MSG message class. | message received matches the SFB_MSG message class. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpsendalld" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>sendtoalldil()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpsendalld" /> | ||
sendtoalldil( m : string, s : string ) | sendtoalldil( m : string, s : string ) | ||
m : Message to send. | m : Message to send. | ||
s : Name idx to a DIL program to send message to. | s : Name idx to a DIL program to send message to. | ||
result: Send a message to all DIL programs matching a given database name. | result: Send a message to all DIL programs matching a given database name. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
sendtoalldil ( "some message", "intercomm@cemetery"); | sendtoalldil ( "some message", "intercomm@cemetery"); | ||
− | + | ||
The message "some message" is sent to all DIL program in the world | The message "some message" is sent to all DIL program in the world | ||
matching the data base name "intercomm@cemetery". | matching the data base name "intercomm@cemetery". | ||
Like 'send()' and 'sendto()', the | Like 'send()' and 'sendto()', the | ||
message received matches the SFB_MSG message class. | message received matches the SFB_MSG message class. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpcast_s" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>cast_spell()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpcast_s" /> | ||
cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr ) | cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr ) | ||
− | + | ||
WILL EVENTUALLY BE OBSOLETE AND REPLACED BY THE CAST_SPELL BELOW. | WILL EVENTUALLY BE OBSOLETE AND REPLACED BY THE CAST_SPELL BELOW. | ||
− | + | ||
i : Spell index to cast. See SPL_* in values.h and/or vme.h. | i : Spell index to cast. See SPL_* in values.h and/or vme.h. | ||
caster : The caster of the spell. | caster : The caster of the spell. | ||
medium : The medium, with which the spell is cast, might be caster. | medium : The medium, with which the spell is cast, might be caster. | ||
target : The target of the spell. | target : The target of the spell. | ||
− | + | ||
Use this to cast spells without performing all the usual mana stuff, etc. | Use this to cast spells without performing all the usual mana stuff, etc. | ||
Very useful with for example rings / items possessing magical abilities. | Very useful with for example rings / items possessing magical abilities. | ||
− | + | ||
integer cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr, effect : string ) | integer cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr, effect : string ) | ||
i : Spell index to cast. See SPL_* in values.h and/or vme.h. | i : Spell index to cast. See SPL_* in values.h and/or vme.h. | ||
Line 5,036: | Line 5,213: | ||
appear. | appear. | ||
returns: The result of the spell. | returns: The result of the spell. | ||
− | + | ||
Use this to cast spells without performing all the usual mana stuff, etc. | Use this to cast spells without performing all the usual mana stuff, etc. | ||
Very useful with for example rings / items possessing magical abilities. | Very useful with for example rings / items possessing magical abilities. | ||
Please note that in the two programs below the variable 'hm' represents | Please note that in the two programs below the variable 'hm' represents | ||
the number of hitpoints that will be deducted from the target. | the number of hitpoints that will be deducted from the target. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
%dil | %dil | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin myeffect(medi : unitptr, targ : unitptr, hm : integer); | dilbegin myeffect(medi : unitptr, targ : unitptr, hm : integer); | ||
code | code | ||
Line 5,057: | Line 5,234: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
..... | ..... | ||
− | + | ||
%... | %... | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin test(); | dilbegin test(); | ||
var | var | ||
Line 5,070: | Line 5,247: | ||
{ | { | ||
wait(SFB_DONE, command("beg")); | wait(SFB_DONE, command("beg")); | ||
− | + | ||
n := cast_spell(SPL_FIREBALL_1, self, self, activator, "myeffect@wiz"); | n := cast_spell(SPL_FIREBALL_1, self, self, activator, "myeffect@wiz"); | ||
− | + | ||
exec("say Result of spell was "+itoa(n), self); | exec("say Result of spell was "+itoa(n), self); | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpatt_s" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>attack_spell()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpatt_s" /> | ||
integer attack_spell( n : integer, caster : unitptr, medium : unitptr, | integer attack_spell( n : integer, caster : unitptr, medium : unitptr, | ||
target : unitptr, bonus : integer) | target : unitptr, bonus : integer) | ||
Line 5,087: | Line 5,265: | ||
target : The target of the spell. | target : The target of the spell. | ||
bonus : Possible (+) advantage or (-) penalty. | bonus : Possible (+) advantage or (-) penalty. | ||
− | + | ||
This is low-level internal spell stuff used to develop new spells. Do not | This is low-level internal spell stuff used to develop new spells. Do not | ||
use unless you know what you are doing and have been allowed to do so by | use unless you know what you are doing and have been allowed to do so by | ||
your Admin. | your Admin. | ||
− | + | ||
− | + | ||
− | + | ||
− | <!--LINK--><span id="bpinsert" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>insert()</b></span><!--PAGENAMEEND--> |
− | + | <!--LINK--><span id="bpinsert" /> | |
+ | |||
'''Function: '''<i><!--CODE-->insert( sl : <stringlist or intlist>, i : integer, s : string ) ;</i><!--ENDCODE--> | '''Function: '''<i><!--CODE-->insert( sl : <stringlist or intlist>, i : integer, s : string ) ;</i><!--ENDCODE--> | ||
− | + | ||
<!--TERM--> '''sl''' | <!--TERM--> '''sl''' | ||
<!--DEFINITION--> the stringlist or intlist you are inserting to | <!--DEFINITION--> the stringlist or intlist you are inserting to | ||
Line 5,104: | Line 5,283: | ||
<!--TERM--> '''s''' | <!--TERM--> '''s''' | ||
<!--DEFINITION--> the string you want to insert | <!--DEFINITION--> the string you want to insert | ||
− | + | ||
This function allows you to insert a string in a stringlist or intlist | This function allows you to insert a string in a stringlist or intlist | ||
with out re-writing the entire stringlist or intlist to do it. The | with out re-writing the entire stringlist or intlist to do it. The | ||
Line 5,111: | Line 5,290: | ||
<i><!--CODE--> | <i><!--CODE--> | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
dilbegin stringlist add_in_order (sl:stringlist,s:string); | dilbegin stringlist add_in_order (sl:stringlist,s:string); | ||
var | var | ||
Line 5,123: | Line 5,302: | ||
return (sl); | return (sl); | ||
} | } | ||
− | + | ||
ln:=length(s); | ln:=length(s); | ||
i:=0; | i:=0; | ||
Line 5,135: | Line 5,314: | ||
i:=i+1; | i:=i+1; | ||
} | } | ||
− | + | ||
addstring (sl,s); | addstring (sl,s); | ||
return (sl); | return (sl); | ||
} | } | ||
dilend | dilend | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | + | ||
</i><!--ENDCODE--> | </i><!--ENDCODE--> | ||
− | + | ||
− | + | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpinterr" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>interrupt()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpinterr" /> | ||
integer interrupt( flags : integer, dilexp, label ) | integer interrupt( flags : integer, dilexp, label ) | ||
− | + | ||
Set up interrupt matching message classes matching "flags", | Set up interrupt matching message classes matching "flags", | ||
for example "SFB_COM" or "SFB_COM | SFB_MSG". | for example "SFB_COM" or "SFB_COM | SFB_MSG". | ||
− | + | ||
When the program is activated on either of the specified conditions | When the program is activated on either of the specified conditions | ||
the 'dilexp' is evaluated. If true, then execution continues at 'label', | the 'dilexp' is evaluated. If true, then execution continues at 'label', | ||
otherwise the next interrupt is checked (if any). | otherwise the next interrupt is checked (if any). | ||
− | + | ||
Interrupts are saved (restored), when 'recall' is set. | Interrupts are saved (restored), when 'recall' is set. | ||
Returns an integer which is used for clear() to clear an interrupt. | Returns an integer which is used for clear() to clear an interrupt. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
− | + | ||
The following program shows, that the owner (self) of the program keeps | The following program shows, that the owner (self) of the program keeps | ||
snoring while sleeping. The on_activation ensures that the program | snoring while sleeping. The on_activation ensures that the program | ||
Line 5,170: | Line 5,350: | ||
reacts on all flags (without actually setting them so that the program | reacts on all flags (without actually setting them so that the program | ||
is activated). | is activated). | ||
− | + | ||
When the program receives the message "relief" the snoring stops briefly. | When the program receives the message "relief" the snoring stops briefly. | ||
As used, "relief" may only be set once. | As used, "relief" may only be set once. | ||
− | + | ||
When the program receives the message "cured", the snoring stops completely | When the program receives the message "cured", the snoring stops completely | ||
(i.e. the program quits itself). | (i.e. the program quits itself). | ||
− | + | ||
<nowiki> | <nowiki> | ||
− | + | ||
dilbegin | dilbegin | ||
− | + | ||
var | var | ||
i : integer; | i : integer; | ||
− | + | ||
code | code | ||
{ | { | ||
Line 5,190: | Line 5,370: | ||
program will skip if you are not sleeping. If you are sleeping you can | program will skip if you are not sleeping. If you are sleeping you can | ||
be relieved. */ | be relieved. */ | ||
− | + | ||
interrupt(SFB_MSG, argument == "cured", the_end); | interrupt(SFB_MSG, argument == "cured", the_end); | ||
− | + | ||
on_activation(self.position != POSITION_SLEEPING, skip); | on_activation(self.position != POSITION_SLEEPING, skip); | ||
− | + | ||
i1 := interrupt(SFB_MSG, argument == "relief", relief); | i1 := interrupt(SFB_MSG, argument == "relief", relief); | ||
− | + | ||
:loop: | :loop: | ||
exec("snore", self); | exec("snore", self); | ||
pause; | pause; | ||
goto loop; | goto loop; | ||
− | + | ||
:relief: | :relief: | ||
/* Suppose you can only be relieved once, then we must clear interrupt */ | /* Suppose you can only be relieved once, then we must clear interrupt */ | ||
Line 5,208: | Line 5,388: | ||
pause; | pause; | ||
goto loop; | goto loop; | ||
− | + | ||
:the_end: | :the_end: | ||
/* Person is cured... */ | /* Person is cured... */ | ||
Line 5,214: | Line 5,394: | ||
} | } | ||
dilend</nowiki> | dilend</nowiki> | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpclear" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>clear()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpclear" /> | ||
clear( i : integer ) | clear( i : integer ) | ||
− | + | ||
Clears the interrupt number "i". If i is invalid, this will either | Clears the interrupt number "i". If i is invalid, this will either | ||
clear an wrong interrupt or do nothing. | clear an wrong interrupt or do nothing. | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="bpona" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>on_activation()</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="bpona" /> | ||
integer on_activation ( dilexp , label ) | integer on_activation ( dilexp , label ) | ||
dilexp : A boolean DIL expression. | dilexp : A boolean DIL expression. | ||
label : Label to jump to - OR the reserved keyword SKIP. | label : Label to jump to - OR the reserved keyword SKIP. | ||
returns : The index to the interrupt handing the on_activation. | returns : The index to the interrupt handing the on_activation. | ||
− | + | ||
result: Sets up an interrupt that is executed before every activation | result: Sets up an interrupt that is executed before every activation | ||
of the DIL program. This is for example useful to catch | of the DIL program. This is for example useful to catch | ||
Line 5,238: | Line 5,420: | ||
dilexp evaluates to false, or if the label is skip, the activation | dilexp evaluates to false, or if the label is skip, the activation | ||
remains active. Use the clear() to remove the on_activation. | remains active. Use the clear() to remove the on_activation. | ||
− | + | ||
'''Example:''' | '''Example:''' | ||
on_activation(self.position <= POSITION_SLEEPING, skip); | on_activation(self.position <= POSITION_SLEEPING, skip); | ||
or | or | ||
on_activation(self.position > POSITION_SLEEPING, let_me_sleep); | on_activation(self.position > POSITION_SLEEPING, let_me_sleep); | ||
− | + | ||
---~---~---~---~---~---~---~---~--- | ---~---~---~---~---~---~---~---~--- | ||
− | <!--LINK--><span id="note" /> | + | <!--PAGENAMESTART--><span style="color: red"><b>Ending Notes</b></span><!--PAGENAMEEND--> |
+ | <!--LINK--><span id="note" /> | ||
How 'Done' messages (SFB_DONE) are treated. Note that not all commands are | How 'Done' messages (SFB_DONE) are treated. Note that not all commands are | ||
implemented, if you are missing one, let Papi know and it will be created. | implemented, if you are missing one, let Papi know and it will be created. | ||
See [[#docs/command.txt|commands.txt]] for details. | See [[#docs/command.txt|commands.txt]] for details. | ||
− | + | ||
This page last updated 03-27-2001, Ken Perry "Whistler" | This page last updated 03-27-2001, Ken Perry "Whistler" |
Revision as of 10:29, 27 May 2020
Contents
DIL DOCUMENTATION
Version 4.0
Current Version by: Whistler@valhalla.com
Index
Making a Program Data Types string stringlist integer integerlist extraptr cmdptr unitptr zoneptr Messages SFB_CMD SFB_DONE SFB_TICK SFB_COM SFB_DEAD SFB_MSG SFB_PRE Built-In Variables cmdstr excmdstr excmdstr_case self activator target medium power argument heartbeat null weather realtime mud(day,month,..) DIL Constructs if() goto while() break continue on ... goto ... foreach() Assignment Expressions Operators in string in string string in stringlist string in extraptr Functions quit return return() Fields extraptr unitptr UNIT_ST_OBJ UNIT_ST_ROOM UNIT_ST_PC and UNIT_ST_NPC UNIT_ST_NPC UNIT_ST_PC Built-In Functions asctime() atoi() cancarry() check_password() command() delstr() delunit() dildestroy() dilfind() equipment() filesize() findroom() findrndunit() findsymbolic() findunit() fits() getcolor() getword() getwords() ghead() isaff() islight() isplayer() isset() itoa() left() length() load() loadstr() meleeattack() meleedamage() mid() moneystring() opponent() openroll() pathto() paycheck() purse() replace() restore() right() rnd() savestr() send_pre() skill_name() spellindex() spellinfo() split() strdir() strcmp() strncmp() textformat() tolower() toupper() transfermoney() visible() weapon_name() weapon_info() Built-In Procedures acc_modify() act() addaff() addcolor() addequip() addextra() addstring() attack_spell() beginedit() block cast_spell() changecolor() change_speed() clear() dilcopy() delcolor() delete_player() destroy() exec() experience() flog() follow() gamestate() insert() interrupt() killedit link() log() logcrime() nopriority on_activation() pagestring() position_update() priority reboot remove() reset_level() reset_vlevel() reset_race() secure() send() sendtoall() sendtoalldil() sendtext() sendto() send_done() set() setbright() set_fighting() setweight() set_password() store() stop_fighting() subaff() subextra() substring() unequip() unitdir() unsecure() unset() wait() walkto() Ending Notes
---~---~---~---~---~---~---~---~---
This documentation is designed for people with some experience in programming. Experience in C is recommended, but PASCAL or BASIC in some form or other will do just fine too.
DIL is a simple programming language with fixed types reflecting the types used in Valhalla Mud. The language gives you almost endless possibilities in designing your adventures and quests. It gives you the control you need for making the game interesting and intelligent.
Making a Program
Making a program:
You define your DIL programs within your zone file. Each program you make is a *template*. Such a template must be equipped with a unique name (for that zone). Templates can either be defined in a new %dil section, just below the %zone section in the zone file, or directly attached to units defined in your zonefile.
If you define your DIL templates inside a unit definition, that unit is automatically assigned a program using that template. If you want to use an already designed template, either in your own, or another zone, you use a special function named "dilcopy", that takes the name of a template, and any optional parameters in parenthesis. The parameters of a template called with 'dilcopy' may only be of types integer, strings and stringlists.
Example:
dilcopy myfunc@myzone("say Hello, my friend!", 1, CMD_SAY, {"name1", "name2"});
DIL templates can always be reused. In fact, with version 2.0 of DIL, programs are no longer saved with equipment, but only a symbolic reference is used. That way, if you make a change in your zone, ALL units using that program are changed. This however requires you keep the name. Upon loading, if a template is not found, the program is halted and rendered useless until such a reference can be found during loading.
Technical note:
When you use several 'dilcopy' in your zonefile, only one instance is present game-time, thus saving tremendous amounts of memory. It is similar to a shared library, in which code is shared but variables are not.
You may use your templates to define both procedure and functions for your other templates to call.
A template is defined by beginning with 'dilbegin' and ending with 'dilend'. Inside the template your program section is defined, marked by the keyword 'code', followed by the program itself;
dilbegin myprogram(); var i : integer; j : integer; code { heartbeat:=PULSE_SEC*5; :start: exec("say Hello world", self); pause; goto start; } dilend
This simple template does nothing but making its owner say 'Hello world' once every 5 seconds. The template is called 'myprogram' and takes no arguments. The 'pause' command waits for the program to receive a timer message, whose interval is set by the 'inline' variable 'heartbeat'. The 'self' variable is a unitptr referring to the unit owning the DIL program. Other inline variables will be explained later.
For a DIL program to work, it must be part of a *unit*: a room, player, non-player or object. The program uses *messages* to operate. Your program gets activated when it receives a message that some command is being executed, or a certain amount of time has passed. You decide yourself in the program, what to wait for, before the program continues executing.
Supposing you want your program to contain variables, you have to put them in a section before the 'code' section marked 'var'. The variables are declared by their type and their name, separated by a ':' and ended by a ';'
For an example, see the program above. Variables of type 'string', 'stringlist' and 'integer' are saved, if the unit the program is attached to is saved with player inventory. Variables of type 'unitpr' and 'extraptr' are 'volatile'. This means that they are cleared whenever there is a chance that their contents may have been rendered non usable. This ensures that you do not have any 'loose' pointers. However it is possible to 'secure' the contents of a 'unitptr' type variable of a unit located in your local environment (the units directly 'visible' to the unit who owns the DIL program) (see the secure / unsecure functions).
Data Types
Data Types:
DIL supports a fixed set of types you can use and manipulate. Through these, you can get and manipulate information about almost anything in the game. The types are listed below:
---~---~---~---~---~---~---~---~---
string
String:
A string is some text. They are used for a lot of things such as command arguments, room descriptions etc. String variables are automatically resized and allocated when you assign them, so you do not have to worry about the string length nor allocation in your DIL programs. Strings may be compared either with '==' (equal to), '!=' (not equal), '<=' (less than or equal to), '>=' (greater than or equal to) '<' (less than), '>' (greater than.
Static strings are defined just as in the rest of the zone, within double quotations. Strings may be searched easily with the 'in' operator. Variables of type string are saved with DIL programs, if attached to a saved unit.
Example:
"This is a static string"
Strings may also be added to each other, in an expression.
Example:
"say "+itoa(42)+" is the answer!"
Example:
if (self.name == self.names.[1]) ...
Elements of the string can also be accessed by referencing them by their position.
Example if (str.[3]==f]) { exec ("say The 4th element is a F.",self); }
Note Currently you can only access the single elements of a string you can not set them. In the future this will be possible. You can still accomplish this by copying one string to the other one element at a time and changing any that you want something like this.
Example i:=0; ln:=length (str); while (str.[i]<ln) { if (str.[i]=="f") newstr.[i]:="b"; else newstr:=str.[i]; i:=i+1; } str:=newstr;
This snip of Dil would replace any 'f' in a string with a 'b' remember dil is not case sensitive so it will also replace an 'F'.
---~---~---~---~---~---~---~---~---
stringlist
Stringlist:
A stringlist is a list of separate strings. This is used for things such as (multiple) names or keywords. You may request a specified word in a stringlist by its number. Example:
mystring := self.names.[2];
Returning null if out of bounds of the stringlist (see 'length()'). Static stringlists are defined just as in the rest of the zonefile, as a comma separated list of static strings within curly brackets.
Example:
mysrtringlist := {"Some string","another string","the last string"}
Stringlists are modified through the 'addstring()' and 'substring()' procedures. Stringlists are searched easily by the 'in' operator. See documentation below. They can also be set directly (see example above). Variables of type string are saved with DIL programs, if attached to a saved unit.
Elements of each separate string in a stringlist can be accessed by appending a separate position at the end of the request for a string as follows:
Example if (strlist.[5].[3]=="b"){ do something }
Note See the strings for more information on accessing a single element.
---~---~---~---~---~---~---~---~---
integer
Integer:
Non-fraction numbers can be used throughout your DIL programs. They are given normally, or in normal C style hexadecimal, preceded with '0x'. Integers are signed 32-bit integers. Variables of type string are saved with DIL programs, if attached to a saved unit.
Example:
0x10
Example:
2
Integers are used within expressions as both number value and boolean(true/false) values. You may use comparison between integers through the comparison operators: '==' (equality), '<' (less than), '>' (greater than), '<=' (less or equal), '>=' (greater or equal) '!=' (not equal).
Example:
if (42<12) ...
Returning the boolean value (true/false) depending on the comparison between integers. The result may be stored in an integer variable, and tested later, or used directly in an 'if' or 'while', etc. You may also operate on boolean expression themselves, using LOGICAL operators 'and','not','or', which allows you to combine the expressions.
Example:
if ( not ( (self.hp<42) or (self.level>10) ) ) ..
Integer expressions may also use a number of other operators: '+' (addition) '-' (subtraction/negation), '*' (multiplication), '/' (division), '|' (bitwise or, for flags), '&' (bitwise and, for flags)
Precedence rules for using these operators are still somewhat messed up. You'd better use parenthesis where ever possible.
---~---~---~---~---~---~---~---~---
integerlist
Intlist:
Intlists are an array of integer types. They can be set directly as follows:
Example
wpn:={5,3,6,9,3,9};
The intlists can be accessed in the same way stringlist are accessed as follows.
Example
if (wpn.[5]==5) { do something }
The intlists are saved on savable units.
Type: intlist
This variable type allows you to keep an ordered list of integers with out having to create a variable for each integer. Example: Setting an intlist ---~---~---~---~---~---~---~---~---
myintlist:={1,5,9,2,8,5}; myintlist.[10]:=50;
---~---~---~---~---~---~---~---~---
If you set a index that is higher then the highest index, every index in between will be set to zero. For example if you only have two values in the intlist and you set index value 10 to 50 all indexes between 2 and 10 will be set to 0. Example: Using intlists ---~---~---~---~---~---~---~---~---
if (myintlist.[5]==5){ stuff }
if (myintlist<myint){ stuff }
i:=0; ln:=length(myintlist); while (i<ln){ myintlist.[i]:=i; i:=i+1; }
---~---~---~---~---~---~---~---~---
See Also: Insert Remove Extraptr
extraptr
Extraptr:
Extra descriptions, quests structures, etc can be searched and manipulated using variables of this type. There is no way to declare static structures of this type in DIL programs. Lists of extra descriptions are easily searched with the 'in' operator (See below). Extraptr variables are 'volatile', and thus cleared whenever there is a possibility that they are rendered unusable.
cmdptr
Type: cmdptr cmdptr fields
name string - command name type integer - command type like social or skill or just command level integer - minimum level to use command loglevel integer - level of character that can see the log 0 for no logs position integer - minimum position to use command next cmdptr - pointer to the next cmdptr previous cmdptr - pointer to the previous cmdptr
The cmdptr can be used to search the command list or display all the commands. I0t is also now possible to sort the commands by type by defining your own command types and using the type field to sort on.
In order to get the first command in the list you use the following function: Function: chead(); If you want to get a specific command then you use the following function: Function: cmdptr := getcommand (s : string ); Example: ---~---~---~---~---~---~---~---~---
dilbegin cmdtst(arg : string); var cmd : cmdptr; st : string;
code { cmd := chead();
while (cmd) { st := cmd.name + " " + itoa(cmd.level) + " " + itoa(cmd.type) + " " + itoa(cmd.loglevel) + " " + itoa(cmd.position); act("CMD: $2t", A_ALWAYS, self, st, null, TO_CHAR); cmd := cmd.next; }
cmd:=getcommand("kick"); sendtext ("You must be "+itoa(cmd.level+" to use kick&n",self);
quit; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
unitptr
Unitptr:
Unit pointers are used to keep track of units: rooms, players, non-player or objects. Through a variable of this type you can access most of the information in a unit. Unitptr variables are 'volatile', and thus cleared whenever there is a possibility that they are rendered unusable.
zoneptr
Type: zoneptr Zone Pointer Fields
next unitptr - pointer to next zoneptr previous unitptr - pointer to previous zone creators stringlist - list of creators name string - zone name (%zone) title string - zone title (title "") rooms unitptr - pointer to the base room objs unitptr - pointer to the base objects of the zone npcs unitptr - pointer to base NPCs of the zone resetmode integer- reset mode of zone in 'values.h' resettime integer - the reset time of the zone access integer - the access level of the zone loadlevel integer - the loadlevel of the zone payonly integer - the paystatus of the zone roomcount integer - the number of rooms in a zone objcount integer - the numbner of objects in a zone npccount integer - the number of npcs/mobiles in a zone fname string - the filename of a zone notes string - the Zone Notes help string - the Zone Help
The 'zoneptr' works like a unitptr. To get the first zoneptr in the global list of zones you use 'zhead'. Example: zoneptr := zhead(); Zone list command ---~---~---~---~---~---~---~---~---
dilbegin zonelist (arg:string); var z:zoneptr; buf:string; code { z:=zhead(); while (z) { buf:="Name: "+z.name+"&n"; buf:=buf+"Filename: "+z.fname+"&n"; buf:=buf+"Creator: "+z.creators.[0]+"&n"; buf:=buf+"Notes: &n"+z.notes+"&n&n"; z:=z.next; }
pagestring (buf,self); quit; } dilend
---~---~---~---~---~---~---~---~---
Messages
Messages:
In DIL, a program attached to a unit gets activated when the program receives a message. In order to save CPU usage, there are a number of different message categories which can cause activation of a program. The 'wait()' commands first parameter is an integer, telling what message categories the program should reactivate on. The second parameter is an expression, which also must evaluate to TRUE. 'pause' is just special instances of the 'wait()' command.
Caveat Builder:
Whenever you construct the arguments for the wait command, bear in mind that ALL your tests will be executed EVERYTIME a message of the relevant kind comes through. Thus you should keep the length of the activation expression to a reasonable minimum, and you should NEVER use the time-consuming findxxx-functions.
Valid example (That prohibits a player from removing an object):
:glue:
wait(SFB_CMD,command(CMD_REMOVE)); u := findunit(activator,argument,FIND_UNIT_IN_ME,null ); if (u != self) { goto glue; } act("You can't remove $2n, it's sticky.", A_SOMEONE,activator,self,null,TO_CHAR);); block; goto glue;
See Also: Dil and Findunit()
The message categories are as follows:
---~---~---~---~---~---~---~---~---
SFB_CMD
SFB_CMD Command message
When this flag is set, the program gets activated by all commands (legal or illegal) issued by PC's or NPC's. Moving around is also considered a command.
Assume a janitor executes the command ' Ge all from corpse', And Ge interprets to 'get'
then this will occur in the DIL program:
'activator'... is a unitptr to the janitor. 'cmdstr'...... is a string which contains 'get' 'excmdstr'...... is a string which contains 'ge' 'excmdstr_case'...... is a string which contains 'Ge' 'argument'.... will contain 'all from corpse'
command(CMD_GET) will evaluate to TRUE.
---~---~---~---~---~---~---~---~---
SFB_DONE
SFB_DONE 'Command has now been executed' message
When this flag is set, the program gets activated by all successful commands issued by PC's or NPC's. The 'activator', 'medium' and 'target' special values are used as follows:
'activator'... The PC / NPC which executed the command 'medium'...... The unit which is operated upon. 'target'...... The target of the operation.
For example, assume the player John gives a garlic to Mary the Lumberjack wife. The following values are set:
activator == John (unitptr) medium == Mushroom (unitptr) target == Mary (unitptr)
command(CMD_GIVE) will evaluate to true.
You thus know that Mary has in fact received the mushroom. It is NOT possible to block (using the 'block' command) these commands since they have already been executed at the time of notification. In a 'get' command, medium would be a unitptr to where the unit was taken from, and target would be the object which was taken.
See the file commands.txt for a description of how the arguments are set for each command. If you can not find a command in there, just ask to get it implemented. Especially you should pay attention to the non-obvious SFB_DONE command(CMD_AUTO_ENTER).
---~---~---~---~---~---~---~---~---
SFB_TICK
SFB_TICK Timer message
When this flag is set, the routine gets activated by a "clock". The clock ticks (in 1/4th of a second) are determined by the 'heartbeat' variable.
'activator'... is null. 'argument'.... will be empty.
command(CMD_AUTO_TICK) will evaluate to TRUE.
---~---~---~---~---~---~---~---~---
SFB_COM
SFB_COM Combat message
When this flag is set, the routine gets activated whenever a combat is in progress. The unit containing the DIL program needs not be involved in the combat itself:
'activator'... is a unitptr to the PC/NPC about to hit someone else. 'argument'.... is empty.
command(CMD_AUTO_COMBAT) will evaluate to TRUE.
---~---~---~---~---~---~---~---~---
SFB_DEAD
SFB_DEAD Death message
When this flag is set, the routine gets activated when a PC or NPC dies:
'activator'... will point to the PC/NPC that is about to die. 'argument'.... is empty.
command(CMD_AUTO_DEATH) will evaluate to TRUE
The SFB_DEAD message is sent, just as the character dies, while his items are still equipped, just before the corpse is created. The character's '.fighting' field points to his primary opponent, although this person does not necessarily have to be the one that killed him.
This can be exploited by making items wiz invisible (the .minv field) just as the message is received, causing them to stay inside the player rather than being transferred to the corpse. This does both give the ultimate crash protection, as well as a means of letting items, such as bribe items, forever be a part of the player (remember to make it un-wizinvis when the player returns from heaven - players should not have access to items while in heaven).
---~---~---~---~---~---~---~---~---
SFB_MSG
SFB_MSG User message
When this flag is set, the routine gets activated when a message is passed to it. Messages can be passed with the DIL commands 'sendto' and 'send':
'activator'... is a unitptr to the unit sending the message. 'argument'.... is a string containing possible data from the sender.
command(CMD_AUTO_MSG) will evaluate to true.
Messages are normally not generated by actions performed by the owner of the program. For a program to be able to be aware of messages from the owner, a keyword 'aware' should be listed just after 'dilbegin'.
When a unit is saved, normally, the DIL programs in it would restart when the program is loaded. However it is possible to let DIL programs recall their execution from where they left off when they where saved. This is done by listing the keyword 'recall' after the 'dilbegin'. This is however a bit limited. Only the status of the original template are saved. Not the state inside a template called as a function or procedure from inside the original template. 'secure' and interrupts are not recalled upon loading the template.
Example:
dilbegin recall aware mute(); var i : integer; code { i:=10; while (i>0) { wait(SFB_CMD,command(CMD_SAY) or command(CMD_SHOUT)); exec("emote tries to make a sound, but only blood spurts through"+ "the lips",self); block; i := i - 1; } i:=10; while (i>0) { wait(SFB_CMD,command(CMD_SAY) or command(CMD_SHOUT)); exec("emote tries to make a sound, but can't",self); block; i := i - 1; } i:=10; while (i>0) { wait(SFB_CMD,command(CMD_SAY) or command(CMD_SHOUT)); exec("emote tries to make a loud sound, but can't",self); block; i := i - 1; } quit; } dilend
/* When attached to a PC, the pc will be unable to utter a sound the first 10 sound command, and blood will spurt out. The next 10 sound commands, the victim just can't shout. The last 10 sound commands only say will work. In the end, 'quit' removes the program all together. The smart thing is that the 'aware' keyword lets the program receive messages from the owner (player) commands. Secondly, the keyword 'recall' makes sure that the program does not start over, if the victim quits in the middle, but restart at the position it had attained. Do not put in the 'aware' if it is not needed. It saves some interpretation time not having to pass the extra messages. */
---~---~---~---~---~---~---~---~---
SFB_PRE
SFB_PRE Command preprocessing
When this flag is set, the program is activated by a few special events which can then be blocked or changed. Currently, this event is triggered just prior to a spell being cast, and just prior to any sort of damage being given to a target.
PRE "command(CMD_CAST)"
Assume a a spell is cast from player A on player B with a scroll C.
'activator'... is a unitptr to A. 'medium' ... is a unitptr to C. 'target' ... is a unitptr to B.
command(CMD_CAST) will evaluate to TRUE.
'argument'.... will contain a number followed by any argument to the spell itself. You should parse this number, it equals the spell number SPL_XXX. 'power' .... is set to 'HM', i.e. how powerful the spell cast is going to be. YOu can change this number at will. If you decide to block the spell, you ought to set it to -1.
Example: wait(SFB_PRE, command(CMD_CAST));
s := getword(argument); splno := atoi(s);
if (splno == SPL_FIREBALL_3) power := 0; /* No damage */ ...
PRE "command(CMD_AUTO_DAMAGE)"
Assume that damage is given from player A to player B with a sword C.
'activator'... is a unitptr to A. 'medium' ... is a unitptr to C. 'target' ... is a unitptr to B.
command(CMD_AUTO_DAMAGE) will evaluate to TRUE.
'power' .... is set to how much damage will be given. You can change this number at will, but you should not set it to less than zero.
'argument'.... will contain three numbers that you must parse to determine what kind of damage we're talking about.
First number is the attack group, this can be one of MSG_TYPE_XXX from values.h and/or vme.h.
Second number is dependant on the attack group and identifies what damage compared to the group. For example WPN_XXX for weapon group.
Third number is the body hit location, one of WEAR_XXX, (but not all of them, just hands, feet, legs, body, head, arms, i.e. the armour positions, not positions like finger or ear).
Example: wait(SFB_PRE, command(CMD_AUTO_DAMAGE));
s1 := getword(argument); grpno := atoi(s1);
s2 := getword(argument); atkno := atoi(s2);
s3 := getword(argument); hitloc := atoi(s3);
if (grpno == MSG_TYPE_SPELL) { if ((s2 == SPL_FINGER_DEATH)) { act("Your scarabaeus lights up as it protects your life force."); power := -1; block; } } ...
---~---~---~---~---~---~---~---~---
A note upon activating a DIL program
This is what you can't do:
If a DIL program is already active, e.g. it is sending a message or perhaps using "exec" to perform an action, then it can not be activated. Thus, any active DIL program is unable to catch further messages. Imagine this setting:
You have five program P1..P5. P1 sends a message, which is intercepted by P2. P2 now sends a message, but since P1 is busy it can not process the message. P3..P5 are however possible candidates. Assume P3 sends a message, and P4 acts upon it. P4 now sends a message and the ONLY program which can catch it is P5, since all the other programs are "busy". If P5 sends a message no-one can act upon it. When P5 returns, so does P4, P3, P2 and finally P1.
Built-In Variables
Built-in Variables:
cmdstr
'cmdstr' This variable is a string which contains the "command" which was entered by a player. The result of adding:
cmdstr + " " + argument
is the entire string as entered by the player. The 'cmdstr' is EXPANDED by the interpreter, so assume a player types 's' then the string is expanded to 'south'.
excmdstr
'excmdstr' This variable is a string which contains the "first string" which was entered by a player. The result of adding:
excmdstr + " " + argument
is the entire string as entered by the player. The 'excmdstr' is not EXPANDED by the interpreter, but it is converted to lower case. So assume a player types 'S' then the string is returned as 's'. The 'excmdstr' is however changed to all lower case if you don't want this see 'excmdstr_case'.
excmdstr_case
'excmdstr_case' This variable is a string which contains the "first string" which was entered by a player. The result of adding:
excmdstr_case + " " + argument
is the entire string as entered by the player. The 'excmdstr' is not changed in anyway from how a player types it. If a player types 'S' then the 'excmdstr_case' will have 'S' in it.
---~---~---~---~---~---~---~---~---
self
'self' This variable is a unitptr to the unit owning the DIL program. For C++ people, this is like the 'this' pointer. For example, if Mary has a program, then self.title equals "Mary the Lumberjack wife"
---~---~---~---~---~---~---~---~---
activator
'activator' This variable is a unit pointer to the unit which activated the DIL program. It is set if 'activator' issued a command or unknown command and the program was setup to catch it, with : wait (SFB_CMD...). See description of messages for more information.
---~---~---~---~---~---~---~---~---
target
'target' This variable is a unit pointer to the unit which is the target of the current operation. For 'done' messages this could for example be the destination in a give command. See description of messages for more information.
---~---~---~---~---~---~---~---~---
medium
'medium' This variable is a unit pointer to the unit which was used during an operation. For 'done' messages this could for example be a bag which was the medium in a get operation. See description of messages for more information.
---~---~---~---~---~---~---~---~---
power
'power' This variable is an integer which can be reassigned. It is used in permission messages and in a few done messages. For example a permission request to damage a person with 100 damage would have power equal 100. This could then be reduced to 50 by assigning a new number. See description of messages for more information.
---~---~---~---~---~---~---~---~---
argument
'argument' This variable is a string, showing the argument of a command resulting in the activation of the DIL program. See SFB_CMD for example.
---~---~---~---~---~---~---~---~---
heartbeat
'heartbeat' This is the DIL programs heartbeat. It can be assigned runtime to change the rate with which SFB_TICK is activated. Do not set it too low, and remember that it is specified in 1/4th of a second. use the constant PULSE_SEC to multiply your wanted delay, for Example: heartbeat := PULSE_SEC*25; /* Tick every 25 seconds */
---~---~---~---~---~---~---~---~---
null
'null' This is a null pointer.
---~---~---~---~---~---~---~---~---
weather
'weather' This is the state of the mud-weather. It will equal one of the SKY_XXX values in values.h and/or vme.h.
---~---~---~---~---~---~---~---~---
realtime
'realtime' This variable returns the number of seconds passed since 1970 something. For C buffs this is equivalent to time(NULL).
---~---~---~---~---~---~---~---~---
mud(day,month,..)
'mudday' 'mudhour' 'mudmonth' 'mudyear' These variables lets your program keep track of the time in the mud. They all have integer types.
DIL Constructs
DIL constructs:
DIL offers a set of construct for you to program with.
---~---~---~---~---~---~---~---~---
if()
if: The if statement is much like C. It takes any type as argument. Non integers are considered 'TRUE' if they are not null.
Example:
dilbegin foo(); code { if (self.hp>10) { exec("say Hehe!",self); } else { exec("say ouch!", self); } } dilend
Example:
dilbegin foo(); code { if (self.loaded>10) { exec("say its getting crowded!",self); } } dilend
Example:
dilbegin foo(); code { if (self.loaded<10) exec("say plenty of room!",self); } dilend
---~---~---~---~---~---~---~---~---
goto
goto: The goto statement lets you jump about in the code. Labels in your DIL programs, for 'goto' or interrupts are defined within ':'. For an example, see the program below.
Example:
dilbegin foo(); code { :mylabel: exec("say Hello world",self); pause; goto mylabel; } dilend
---~---~---~---~---~---~---~---~---
while()
while: The while statement lets you execute a series of statements while an expression evaluates to TRUE.
Example:
dilbegin foo(); code { while (not self.inside) { exec("say I own nothing", self); pause; } exec("say ahh.. now i own something", self); } dilend
---~---~---~---~---~---~---~---~---
break: break
The break statement makes you break out of any loop you're currently in.
Example:
dilbegin foo(); code { while (self.inside) { if (self.position < POSITION_SLEEPING) break; exec("say I own something", self); pause; } } dilend
---~---~---~---~---~---~---~---~---
continue
continue: The continue statement makes you jump to the top of any loop you're currently in.
Example:
dilbegin foo(); code { while (self.inside) { if (self.position < POSITION_SLEEPING) break; pause; if (self.hp<0) continue; exec("say I own something", self); pause; } } dilend
---~---~---~---~---~---~---~---~---
on ... goto ...
on n goto la, lb, ..., ln:
This construct is an easy way of performing a goto operation based on the result of an integer. The integer value 'n' must be zero or positive and less than the number of labels specified in the label-list. If n is outside this range, the on-goto operation is skipped and execution continues at the next instruction.
Based on the value of 'n' execution continues at the label corresponding to number 'n' in the list. I.e. if n is 0, then execution continues at the first specified label, if n is 1 then at the second, etc. etc.
Example:
Assume you have an integer 'i' larger than zero, which takes on 0, 1, 2, 3, 4 or 5. Based on each value you need to take a different action, this is how you can do it:
on i goto grin, laugh, grin, nada, poke, laugh; log("Value was not in the range 0..5"); quit; :laugh: exec("grin", self); goto ...; :grin: exec("cackle", self); goto ...; :blank: exec("cry", self); goto ...; :poke: exec("smirk", self); goto ...; It is often used in this context
on rnd(0,4) goto l1, l2, l3, l4, l5; :l1: bla; :l2: bla; ....
---~---~---~---~---~---~---~---~---
foreach()
foreach: Foreach is an easy way to process all the units in the local environment relative to the 'self' executing the foreach. Foreach takes care of creating a list of local units, and of securing them. You can use both break and continue in a foreach statement. The unit executing the foreach ('self') is always a part of the foreach.
It is important to understand that the units in the local environment are relative to the 'self' executing the foreach.
Example: This foreach is copied onto the spell caster, and hence all units relative to the spell caster (i.e. self) are processed in the foreach. Assume that it was executed on the spell caster's staff, then all units found would be relative to the staff, i.e. the spell caster's inventory.
... foreach (UNIT_ST_PC|UNIT_ST_NPC, u) { if (u.hp < u.max_hp) { act("Warm raindrops fall upon you, cleaning your wounds.", A_ALWAYS, u, null, null, TO_CHAR); u.hp := u.hp + 6; if (u.hp > u.max_hp) u.hp := u.max_hp; } else act("Warm raindrops fall upon you.", A_ALWAYS, u, null, null, TO_CHAR); pause; } ...
Assignment
Assignment:
You can assign values to the variables you declare in your 'var' section, and some of the built-in variables. This is done by the ':=' operator. Note that you can also assign a variable the result of an expression (the addition of strings below as an example)
Example:
dilbegin foo(); var myvarsl : stringlist; myvars : string; code { :start: myvarsl := {"a string","another","the first"}; myvars := self.name+" XX "; myvarsl.[2] := "the last"; myvarsl.[3] := "illegal"; /* Will not work since [3] is not defined */ pause; goto start: } dilend
Expressions
Expressions:
The expressions used in assignment can return any of the types you can declare variables. Also they might return fail or null. An expression returning fail will not result in any action being taken. Fail is returned when you request a field from a null pointer, or the like.
Example:
dilbegin foo(); var myvarsl : stringlist; myvars : string; myvarint : integer; myvaredp : extraptr; myvarunit : unitptr; code { :start: myvarunit := self.inside.next; myvarsl := {"a string","another","the last"}; myvars := self.name+" XX "+itoa(self.hp); myvarint := activator.hp; myvaredp := "Rabbit Stew Complete" in activator.quests; pause; goto start: } dilend
---~---~---~---~---~---~---~---~---
Operators
Operators:
DIL features many other operators. For integers, '<', '>', '<=', '>=', '!=' '==' signify less than, greater than, less or equal, greater or equal, not equal, and equality operators. Furthermore, you can compare strings with '==' or '$=' for equality test, and '!=' for non equality. Pointers may also use '==' and '!=' and you may force DIL to compare pointers, even for strings with the '#=' pointer-equality operator. The '$=' and '#=' is considered obsolete, and only used for backward compatibility.
---~---~---~---~---~---~---~---~---
in
in: The special operator 'in' is a multipurpose operator for a lot of things. It allows you to search through quests and extra descriptions, stringlists and search for words in strings.
---~---~---~---~---~---~---~---~---
string in string
string 'in' string Argument 1: A string to find. Argument 2: A string to search. Return: TRUE, if first string is found in second string.
Example:
dilbegin foo(); code { if ("guard" in activator.title) exec("say hello guard",self); pause; } dilend
---~---~---~---~---~---~---~---~---
string in stringlist
string 'in' stringlist Argument 1: A string to find. Argument 2: A stringlist to search. Returns: 1.. if first string is found in stringlist, or 0 if it is non existent. If found the number equals the index of the string found plus one.
Example 1: s := "c"; sl := {"a","b","c","d"}; i := s in sl;
The result of 'i' is 3, and sl.[i-1] equals "c" (s).
Example 2:
dilbegin foo(); code { if ("james" in activator.names) exec("say hello james.",self); pause; } dilend
---~---~---~---~---~---~---~---~---
string in extraptr
string in extraptr Argument 1: A string to find. Argument 2: An extra description list to search. Return: Extraptr to first entry with string matching .names or null if none. (names must be exact letter by letter match, although case is ignored).
Example:
dilbegin foo(); code { if ("Rabbit Stew Complete" in activator.quests) { exec("say wow!, you helped Mary get her stew!", self); exec("app ", self); } pause; } dilend
Functions
Functions:
DIL features an extended set of built-in functions for extended program control. Built-in functions can be part of any expression in DIL. The built-in functions are listed later.
Example:
dilbegin foo(); code { exec("say I exist in "+itoa(self.loaded)+"copies", self); pause; } dilend
DIL also lets you use templates as functions, but in a limited way. Using templates as functions, you may only use the return value to assign it to one of the variables declared in the 'var' section. No fields.
Example:
dilbegin integer bar(s:string); code { exec("say "+s,self); return rnd(1,10); } dilend
dilbegin foo(); external integer bar(s:string); var myint:integer; code { myint := bar("rolling the dice."); exec("say I rolled a "+itoa(myint)); pause; } dilend
---~---~---~---~---~---~---~---~---
quit
quit: This simple command quits the entire DIL program, even if called while inside a procedure or function.
---~---~---~---~---~---~---~---~---
return
return: Return from a call to a procedure template (no return type declared). The execution continues from where the procedure was called.
---~---~---~---~---~---~---~---~---
return()
return(): Return from a call to a function (return type declared). The expression inside the parenthesis evaluates to the value returned.
---~---~---~---~---~---~---~---~---
DIL also allows for game-time *symbolic* resolving of function/procedure names. This allows you to pass template names as string arguments and call them in your program. This kind of function call requires taxing look ups and type check runtime, so use the normal kind of procedures if possible.
In effect, the syntax of a symbolic call is similar to that of a normal, except you use a string variable as function name instead of the real function name. If the string variable contains a valid reference to a procedure/function, and all the argument types matches the found templates argument types, the call is made. Otherwise, the call is skipped. Note that you will get no type check by the compiler when using symbolic references.
Fields
Fields:
The 'extraptr' and 'unitptr' types contain information which is available to you by using fields. For example (self is a unitptr), self.inside is a unitptr to what is inside the 'self' unit. (Hence '.inside' is the field). And self.inside.outside is a unitptr to self (assuming that something is actually inside self, otherwise self.inside would evaluate to null). Some fields may not be changed by DIL programs directly but must be modified indirectly using certain procedure calls in DIL. Others may not be changed at all. All are readable for DIL programs.
The extraptr structure is used for several things. The primary is extra descriptions for units, and quest data. Keywords in the 'names' field and the actual description/data in the 'descr' field.
In the following (RW) means the value may be assigned new values by DIL,
while (RO) means the the value only can be read. A (RO) value might be
possible to change through built-in functions/procedures
---~---~---~---~---~---~---~---~---
extraptr
The extraptr has the following fields:
extraptr: 'names' :stringlist (RW) names is a list of strings of names, that the extra description matches on. 'descr' :string (RW) descr is the contents of the extra description. 'next' :extraptr (RO) next is the next extra description in a list. 'vals' :intlist (RW) vals is a list of integer values attached to this extra.
---~---~---~---~---~---~---~---~---
The unitptr is the key structure in the MUD, containing any kind of the following subtypes:
object : a normal object, a sword, a vail, etc. room : a room, location or the like. pc : a playing character. npc : a non playing character (mobile, monster, etc)
---~---~---~---~---~---~---~---~---
unitptr
The unitptr has the following fields:
unitptr:
'names' :stringlist (RW)
A list of names that matches the unit.
'name' :string (RW)
The first name in the namelist in 'names'
'outside_descr' :string (RW)
The description of the unit from the 'outside'. f.inst.
the description of a boat, seen from the outside.
'inside_descr' :string (RW)
The description of the unit from the 'inside'. f.inst.
the description of a boat, seen from the inside.
'next' :unitptr (RO)
The next unit in the local list of units. For instance, the
units in the inventory of a PC, is linked with this field.
'title' :string (RW)
The title of the unit.
'extra' :extraptr (RW)
Extra descriptions of the unit (identify, look at, read etc.).
'outside' :unitptr (RO)
The outside of the unit hierarchy (carried by, contained by).
For instance, the contents of a bag have their 'outside'
field pointing to the bag.
'inside' :unitptr (RO)
The inside of the unit hierarchy (carry, contains).
For instance the first unit in a PC's inventory is referenced
by the 'inside' field.
'key' :string (RO)
The key that will open this unitptr
For instance "big_key@blackzon"
by the 'inside' field.
'gnext' :unitptr (RO)
Next unit in the global list of units.
'gprevious' :unitptr (RO)
Previous unit in the global list of units.
'hasfunc' :integer (RO)
Returns TRUE if unit has special functions attached to it.
'max_hp' :integer (RO/RW)
The maximum hitpoints of unit, RO for players, RW for mobiles.
'max_mana' :integer (RO)
The maximum mana of the character (player or mobile).
'max_endurance' :integer (RO)
The maximum endurance of the character (player or mobile).
'lifespan' :integer (RW)
The lifespan of a character, write permission only on root access.
'hp' :integer (RW)
The current hitpoints of unit. For objects, this can render
it 'broken' by being set low. If an unit has -1 hitpoints
its considered unbreakable.
'manipulate' :integer (RW)
Bits that specify how unit can be handled, see MANIPULATE_*
flags in values.h and/or vme.h
'flags' :integer (RW)
Bits that specify different properties of a unit, see
UNIT_FL_* in values.h and/or vme.h
'baseweight' :integer (RO)
The empty weight of the unit. This can be set with the
procedure 'setweight()'
'weight' :integer (RO)
The current weight of the unit (and its contents).
'capacity' :integer (RW)
The amount of weight the unit can contain.
'height' :integer (RW)
The height of a PC/NPC, the length of a rope, the size of weapons,
armours, and shields.
'alignment' :integer (RW)
The alignment of the unit. [1000..-1000],
1000 is good, 0 is neutral, -1000 is evil.
'openflags' :integer (RW)
Bits thats specify how a unit may be opened, locked, etc,
see EX_* in values.
'light' :integer (RO)
How much light is inside the unit.
'bright' :integer (RO)
How much the unit lights up. This can be set with the
procedure 'setbright()'
'illum' :integer (RO)
How much light units inside a transparent unit create
'minv' :integer (RW)
The 'wizard invisibility' level.
'spells'[] :integer (RO)
The defence/skill of the different spell spheres/spells
The index should be one of the SPL_* in values.h and/or vme.h
'zoneidx' :string (RO)
The unique database name (in the zone) for this unit.
'nameidx' :string (RO)
The unique database zone name for this unit.
'idx' :integer (RO)
The unique database index (in the zone) for this unit.
This provides a smart alternative to check for zoneidx
and nameidx. Thus if (u1.idx == u2.idx) then
(u1.nameidx == u2.nameidx) and (u1.zoneidx == u2.zoneidx).
Be warned, this value change between each reboot, so do not
count on it for purposes of saving.
'zone' :string (RO)
The name of the zone the unit is in.
'type' :integer (RO)
The type of the unit, see UNIT_ST_* in values.h and/or vme.h
'loadcount' :integer (RO)
Returns the number of units loaded in the game
of this definition (zoneidx,nameidx / idx)
UNIT_ST_OBJ
if the type is UNIT_ST_OBJ
'objecttype' :integer (RW)
The type of an object, see ITEM_* in values.h and/or vme.h for types.
'value'[] :integer (RW)
Values for an object. The meaning of the values differ
from object type to object type. Index should be [0..4].
These values are used differently for each object type.
'objectflags' :integer (RW)
Bits specifying special properties for an object. Some
combinations may not be logical, see OBJ_* in values.h and/or vme.h
'cost' :integer (RW)
The basic cost of an object. (old gold value)
'rent' :integer (RW)
The basic cost of renting an object. Mostly used on very
special objects. (old gold value)
'equip' :integer (RO)
The position in equipment. This is used by units in a PC/NPC's
inventory to tell if they are equipped by that PC/NPC.
use the 'addequip()' and 'unequip()' procedures.
UNIT_ST_ROOM
if the type is UNIT_ST_ROOM
Note: the descr fields of exits are available as standard extra keywords, ie. 'north' ,'east',...,'down'. Example: ex := 'north' in self.extra;
'exit_names'[] :stringlist (RW)
The names matching the exit name 'open grate' The index should
be one of NORTH EAST SOUTH WEST UP DOWN in values.h and/or vme.h
Example:
sl := self.exit_names[SOUTH];
act("The $2t slides open as you press the button.",
A_ALWAYS, activator, sl.[0], null, TO_CHAR);
'exit_info'[] :integer (RW)
Bits specifying the conditions of the exits, see EX_* in
values.h and/or vme.h The index should be one of NORTH EAST SOUTH WEST
UP DOWN in values.h and/or vme.h
'exit_to'[] :unitptr (RO)
The unit, the direction exits to. The index should
be one of NORTH EAST SOUTH WEST UP DOWN in values.h and/or vme.h
You may not change the directions through DIL programs.
'roomflags' :integer (RW)
Bits specifying properties of the room, see ROOM_FL_* in
values.h and/or vme.h
'movement' :integer (RW)
The type of movement in the room, see SECT_* in values.h and/or vme.h
UNIT_ST_PC and UNIT_ST_NPC
if the type is UNIT_ST_PC or UNIT_ST_NPC
'speed' :integer (RO)
The current default combat-speed (as seen by wstat)
'fighting' :unitptr (RO)
The unit the PC/NPC is fighting.
'master' :unitptr (RO)
The unit the PC/NPC is following.
'follower' :unitptr (RO)
The first follower of a PC/NPC. There is currently no way
of finding other followers, except using a foreach loop in
the local environment.
'exp' :integer (RO)
The number of experience points for PC, or experience
quality of monster. The exp can be set by the function
'experience()'
'charflags' :integer (RW)
Bits specifying by spells affects and other PC/NPC affects,
and many other things, see CHAR_* in values.h and/or vme.h
'lastroom' :unitptr (RO)
The room the player just left.
'mana' :integer (RW)
The amount of mana a PC/CHAR has left.
'dex_red' :integer (RO)
The amount of DEX reduction the PC/NPC suffers due to
encumbrance or otherwise.
'endurance' :integer (RW)
The amount of endurance a PC/NPC has left.
'attack_type' :integer (RW)
The non-weapon attack type of a PC/NPC.
'race' :integer (RW)
The race of a PC/NPC, see RACE_* in values.h and/or vme.h
'sex' :integer (RW)
The sex of a PC/NPC, see SEX_* in values.h and/or vme.h
'level' :integer (RO)
The level of a PC/NPC.
'position' :integer (RW)
The position of a PC/NPC, see POSITION_* in values.h and/or vme.h
affected by the 'position_update()' procedure
'abilities'[] :integer (RO)
The abilities of a PC/NPC. Index should be ABIL_* in values.h and/or vme.h
'weapons'[] :integer (RO)
The weapon skills of a PC/NPC. Index should be WPN_* in values.h and/or vme.h
UNIT_ST_NPC
if the type is UNIT_ST_NPC
'defaultpos' :integer (RW)
The default position of an NPC, see POSITION_* in values.h and/or vme.h
'natural_armour' :integer (RW)
The natural armour of the NPC when naked.
'npcflags' :integer (RW)
Some small options for NPC's see NPC_* in values.h and/or vme.h
'switched' :unitptr (RW)
Character that is switched into this NPC.
UNIT_ST_PC
if the type is UNIT_ST_PC
'birth' :integer (RO) The time a PC was created. 'editing' :integer (RO) Is the PC editing? TRUE for yes FALSE for no. 'hometown' :integer (RO) The hometown of a PC. 'pcflags' :integer (RW) The setup of player options. See PC_* in values.h and/or vme.h 'playtime' :integer (RO) The time a PC has played. 'skill_points' :integer (RW) The amount of unused skill points the PC has. 'ability_points' :integer (RW) The amount of unused ability points the PC has. 'exptol' :integer (RW) The amount of experience player needs to level 'skills'[] :integer (RO) The skills of a PC. Index should be SKI_* in values.h and/or vme.h 'guild' :string (RW) The guild the PC belongs to. 'prompt' :string (RW) The players prompt string.. 'crimes' :integer (RW) The number of crimes the PC has. 'full' :integer (RW) How hungry the PC is. 'thirst' :integer (RW) How thirsty the PC is. 'drunk' :integer (RW) How drunk the PC is. 'quests' :extraptr (RW) The quests a PC is finishing/has finished. 'info' :extraptr (RW) The info structure of a PC. 'acc_balance' : integer (RO) If the game is in accounting mode, then this returns the balance of the player, what would be shown on balance in wstat <player> acc. 'acc_total' : integer (RO) If the game is in accounting mode, then this returns the total credit of the player, what would be shown on total in wstat <player> acc.
Built-In Functions
Built-In Functions:
The following are definitions and documentation for the built-in functions in DIL. The definitions are not definitions 'as such', but serve to distinguish arguments in the documentation below.
---~---~---~---~---~---~---~---~---
asctime()
string asctime(i : integer) i : the time to convert in seconds (realtime variable)
Returns: The seconds converted into an ascii format date of the following form "Mon Nov 18 18:49:08 1996"
Example: log(asctime(realtime));
</PRE
strcmp()
Function: integer strcmp( s1:string, s2:string) ;
s1 first string s2 second string
returns -1 if s1 < s2 0 if s1 = s2 1 if s1 > s2
This allows you to compare strings with case sensitivity in place. If you don't care about the case of the string use the normal '==' '>', '<', '<=', '>=', symbols. example: ---~---~---~---~---~---~---~---~---
if (strcmp("I Care about Capitals",s2)==0)) { sendtext ("You care I can see.&n",self); quit; }
---~---~---~---~---~---~---~---~---
strncmp()
Function: integer strcmp( s1:string, s2:string l :integer) ;
s1 first string s2 second string l amount of significant digits to compare
returns -1 if s1 < s2 0 if s1 = s2 1 if s1 > s2
This allows you to compare strings with case sensitivity in place and it allows you to choose how much of the strings are compared. example: ---~---~---~---~---~---~---~---~---
if (strcmp("Mark Carper",s2,4)==0)) { sendtext ("Hi Mark how is it going?&n",self); quit; }
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
textformat()
string textformat(s : string) s : The text string to format. The string is formatted according to the escape format codes as defined in one of the other documents.
Returns: The formatted string which will automatically adapt to each individual player's settings.
Example: ts := note.extra.descr; rs := textformat(ts);
---~---~---~---~---~---~---~---~---
spellindex()
integer spellindex(s : string) s : The abbreviated or full spell name
Returns: -1 if no such spell, otherwise it returns the spell index for that spell.
Example: s := "cu li wo"; /* cure light wounds */ i := spellindex(s);
---~---~---~---~---~---~---~---~---
spellinfo()
string spellinfo(idx : integer, i1 : integer, i2 : integer, i3 : integer, i4 : integer, i5 : integer, i6 : integer, i7 : integer, )
idx : The spell index (SPL_XXX). You might want to use spellindex to find this value.
Returns: The full name of the spell, or the empty string if no such spell.
All the integer parameters are set to the following values: i1 : Spell realm (MAG / DIC) i2 : Spell sphere (SPL_XXX) i3 : Mana usage i4 : 0 if a non-offensive spell, non-zero otherwise i5 : Resistance required (SPLCST_XXX) i6 : Mediums (MEDIA_XXX) i7 : Targets (FIND_UNIT_XXX & TAR_XXX)
Example: s := "cu li wo"; /* cure light wounds */ i := spellindex(s); s := spellinfo(i, i1, i2, i3, i4, i5, i6, i7); /* s & i1 - i7 now set */
beginedit()
Function: beginedit ( u : unitptr);
u the PC unit doing the editing return When done editing it returns SFB_EDIT and activator is set to PC
The 'BEGINEDIT' function sets a PC into editing mode. while in edit mode the PC field 'editing is set to true. Once the PC is done editing a 'SFB_EDIT' message is sent to the unit editing to continue on with the DIL. If for some reason the PC needs to break out of the editor before it is done editing then the Dil needs to call the 'killedit' function interrupt editing before done
example: ---~---~---~---~---~---~---~---~---
dilbegin edextra (); var temp:string; code { beginedit (self); wait(SFB_EDIT,self==activator) ; temp:=textformat(argument); addextra (self.extra,"general",temp); quit; } dilend
---~---~---~---~---~---~---~---~---
The previous DIL is an example of how you could make a command to set the general extra which is the characters description when you do 'look player'
---~---~---~---~---~---~---~---~---
cancarry()
integer can_carry(ch : unitptr, u : unitptr, n : integer) ch : The character to check u : The unit to check if he can carry. n : How many copies of that unit.
Returns: 0 if 'ch' can carry 'n' times 'u'. 1 if 'n' items are too many (his hands are full) 2 if 'n' times 'u' are too heavy
Example:
i := can_carry(activator, item, 1);
if (i == 1) exec("say Your hands are full!", self); else if (i == 2) exec("say You cant carry that much weight.", self); else exec("give "+item.name+" to "+activator.name, self);
---~---~---~---~---~---~---~---~---
fits()
string fits( char : unitptr, obj : unitptr, pos : integer ); char: Character which we want to test if obj can be fitted upon obj: The object we want to see if fits char. pos: -1 or WEAR_XXX Returns: Empty string if ok, or a textual description of the size problem.
Fits tests if "obj" can be worn by "char" in position "pos". If pos is -1, then fits automatically figures out the default worn position for "obj".
Example:
s := fits(self, obj, -1); if (s != "") exec("say Don't buy it, its "+s, self);
replace()
Function: string replace( t :string, n : string, o : string);
t the target string you want to replace n what you want to replace the target with o the original string return the string with the old string replaced by the new string
This function replaces all occurences of a string in another string with a new string. Example: "Jafar %t% %l%" := replace(%n%,pc.name,"%n% %t% %l%"); "Jafar the human %l%" := replace(%t%,pc.title,"Jafar %t% %l%"); "Jafar the human 1" := replace(%l%,itoa(pc.vlevel),"Jafar the human %l%");
restore()
Function: unitptr restore( filename : string , u : unitptr );
filename The name of the Unit file u The Unit you want to restore into or null if none Return if 'u' null returns a pointer to the Unit loaded, if 'u' not null returns null and loads Units from the specified file into the unit 'u'
restore loads a copy of a unit or units which were previously saved with the 'store' command. Just as with "load", the unit is put inside the unit which executes the restore command unless the 'u' argument is not null. If the 'u' argument is an unitptr like room, object, npc, or pc the items restored will be placed inside the 'u' Unit.. Note, It is only possible to restore items as long as the main-database contains a reference for the unit 'name@zone'. Use 'Store' and 'Restore' sparingly, remember that items saved in player's inventories are automatically saved in this instance. The 'store' and 'restore' are perfect for operations such as mud mailing objects from player to player, storage devices for players that will keep inventory through a reboot. Even the ability to save a players inventory while they fight in an arena and restore it to them undamaged when finished. Finally it could be used to save a donation room through reboots since it can be used on a room to store the contents of a room any NPC or objects in the room would be saved through reboot. Disk access is always slow. If you use 'Restore' on a continuous basis always attempt to keep file sizes to a minimum for quick loading. Otherwise you might cause serious delays on the server. If the Dil that uses Restore saves at certain times try to make it so the saves are spread out over as large amounts of time as possible.
Example 1: ---~---~---~---~---~---~---~---~---
dilbegin chest_load (); var waist:unitptr;/*to hold the null returned in this example*/ chest:unitptr;/*pointer to the storage chest*/ code { chest:=load ("chest@myzone");/*get the container*/ if (chest==null) { log ("Error");/*log an error*/ quit; }
waist:=restore("chest."+self.zoneidx,chest); /* restore given filename into chest waist can be ignored in this dil since it is not used. */ link (chest, self);/*link chest into room*/ quit;/*dil load routine done destroy self.*/ } dilend
---~---~---~---~---~---~---~---~---
Example 2: ---~---~---~---~---~---~---~---~---
dilbegin chest_load (); var chest:unitptr;/*item to be loaded*/ code { chest:=restore("chest."+self.zoneidx,null);/*restore into chest*/ if (chest== null)/*see if something was restored*/ chest:=load("donate_chest@"+self.zoneidx); /*load a new one if there is nothing restored*/
link (chest, self);/*link item into room*/ quit;/*destroy the load dil.*/ } dilend
---~---~---~---~---~---~---~---~---
Note: Example 1 is to be used if 'storall' was used not storing a container. Example 2 is for items stored with 'store' with the container saved as well. See Also Store a Unit to a Unit file and Delete a Unit file.
---~---~---~---~---~---~---~---~---
meleeattack()
integer meleeattack ( ch : unitptr, vict : unitptr, bonus : integer, wtype : integer ) ch : The character which should make an additional attack. vict : The victim of the attack. bonus : Any penalty or bonus added to the attack. wtype : The weapon type of the attack, if a valid type then that is used for the attack purpose, otherwise the default weapon/hand attack is used.
result: 'ch' performs a melee attack (using whatever weapon is wielded or his bare hands) against 'vict'. Returns the amount of damage given (-1 is failed).
If wtype is within a valid weapon range (WPN_XXX) any weapon will be bypassed, and the value will be used as the attacktype. Good for things like "meleeattack(ch, vict, bonus, WPN_CIRCLE_KICK)" if you want person to be able to perform an extra attack even though wielding a weapon or something. Note that this will require BOTH a weapon type WPN_CIRCLE_KICK and a skill "kick" in order for it to work.
meleedamage()
Function: meleedamage ( c : unitptr, v : unitptr, b : integer, wt : integer );
c the character that should make an additional attack v the character being attacked b any penalty or bonus added to the attack. wt the weapon type of the attack, if a valid type then that is used for the attack purpose, otherwise the default weapon/hand attack is used. returns The amount of damage done or -1 for failed
ch' performs an attack (using whatever weapon is wielded or his bare hands) against 'vict'. If wtype is within a valid weapon range (WPN_XXX) any weapon will be bypassed, and the value will be used as the attacktype. Good for things like "meleeattack (ch, vict, bonus, WPN_CIRCLE_KICK)" If you want person to be able to perform an extra attack even though wielding a weapon or something. Note that this will require BOTH a weapon type WPN_CIRCLE_KICK and a skill "kick" in order for it to work. Example: ---~---~---~---~---~---~---~---~---
dilbegin kick(arg : string); external provoked_attack (victim : unitptr, ch : unitptr);
var bonus : integer; targ : unitptr;
code { if ((self.type == UNIT_ST_PC) and (self.weapons[WPN_KICK] <= 0)) { act("You must practice first.", A_ALWAYS, self, null, null, TO_CHAR); quit; }
if (arg == "") { if (self.fighting) { targ := self.fighting; goto kick; }
act("Kick who?", A_SOMEONE, self, null, null, TO_CHAR); quit; }
targ := findunit(self, arg, FIND_UNIT_SURRO, null);
if ((targ == null) or not visible(self, targ)) { act("That person is not here!", A_SOMEONE, self, null, null, TO_CHAR); quit; }
if (not (targ.type & (UNIT_ST_PC | UNIT_ST_NPC))) { act("You can't kick that, silly!", A_SOMEONE, self, null, null, TO_CHAR); quit; }
if (targ == self) { act("You kick yourself.", A_HIDEINV, self, null, null, TO_CHAR); act("$1n kicks $1mself.", A_HIDEINV, self, null, null, TO_ROOM); quit; }
if ((targ.type==UNIT_ST_PC) and (self.type==UNIT_ST_PC)) { if (not(isset (self.pcflags, PC_PK_RELAXED))) { act ("You are not allowed to do this unless you sign the book of blood.", A_ALWAYS,self,null,null,TO_CHAR); quit; }
if (not(isset (targ.pcflags, PC_PK_RELAXED))) { act ("You are not allowed to do this unless $2e signs the book of blood.", A_ALWAYS,self,targ,null,TO_CHAR); quit; } }
:kick: /* Penalty for wielding a weapon while kicking! */ if (equipment(self, WEAR_WIELD)) bonus := -25; else bonus := +25; if (self.endurance < 2) act("You are too exhausted to attempt that.", A_ALWAYS, self, null, null, TO_CHAR); else self.endurance := self.endurance - 2; provoked_attack (targ, self); bonus := meleeattack(self, targ, (bonus+self.level), WPN_KICK); quit; } dilend
---~---~---~---~---~---~---~---~---
mid()
Function: string mid ( o : string, s : integer, e : integer );
o the original string to be parsed s The starting point of the string to be parsed out e the ending point of the string to be parsed out return the portion of the string defined by the 's' and 'e' values
This function parses the string passed to it and returns the portion of the string defined by the start value and the end value that is also passed to the function. Example: "rock" := mid ("sprocket",3,6);
---~---~---~---~---~---~---~---~---
moneystring()
string moneystring(amt : integer, verbose : integer) amt : The amount of money verbose: True if an expanded string (copper pieces) or false if abbreviated money types (cp). result : The moneystring for the given currency.
---~---~---~---~---~---~---~---~---
equipment()
unitptr equipment ( u : unitptr , i : integer ) u : The character to search. i : What equipment to find, any of the WEAR_XXX macros. result: Returns the unit on 'u' which is equipped on position 'i'. See WEAR_* in values.h and/or vme.h
tolower()
Function: string tolower ( s : string ); s String to lower case return the string passed in lower cased
This function returns a copy of the string passed in but with out capitals.
Example: "hello!" := tolower("HELLO!");
toupper()
Function: string toupper ( s : string );
s String to lower case return the string passed in lower cased
This function returns a copy of the string passed in with all characters changed to be capitalized. Example: "HELLO!" := toupper ("hello!");
---~---~---~---~---~---~---~---~---
visible()
integer visible(u1 : unitptr, u2 : unitptr) u1: The character who is looking at u2 u2: The unit which the character u1 is trying to see. return: TRUE if u1 can see u2, FALSE otherwise. Example: if (visible(self, victim)) ...
---~---~---~---~---~---~---~---~---
opponent()
integer opponent(u1 : unitptr, u2 : unitptr) u1, u2: Two characters return: TRUE if u1 is in combat with u2, FALSE otherwise. Example: if (opponent(self, victim)) ...
When in a combat, you are usually only melee-attacking one opponent, although you may have many other opponents. This function lets you check if you are directly / indirectly an opponent to another unit.
---~---~---~---~---~---~---~---~---
purse()
integer purse(u : unitptr, coinage : integer) u : The unit to check coinage: The money type (e.g. gold, silver), one of IRON_PIECE, etc. Returns: The number of such units found. Example: if (purse(self, PLATINUM_PIECE) > 10) exec("say I am loaded with platinum!", self);
---~---~---~---~---~---~---~---~---
atoi()
integer atoi ( s : string ) s : A string with a number. return: The number in the string. Example: i := atoi("42");
check_password()
Function: integer check_password( u : unitptr, s : string ) ;
u the unit that you want to check the password of s the password you are using to check Return Returns an integer TRUE if pcname is the units password FALSE if not
This function checks the string against the units password and returns TRUE if they match. Example: ---~---~---~---~---~---~---~---~---
if (not check_password(pc,arg)) { sendtext (arg+" is not "+pc.name"'s password.",self); quit; }
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
command()
integer command ( cmd : string or integer ) cmd : A string of the full typed command, e.g. "push" or "say". Alternatively you can specify one of the macros defined in values.h and/or vme.h, e.g. CMD_SAY return: Whether the command specified by the activator is the one of the argument.
It is noteworthy, that unlike simple compares like this;
if ("spook" in cmdstr) { ... ... } or if (cmdstr == "spook") { ... ... }
where the first will activate even if the cmdstr is "nospook", and the second only if cmdstr equals the word "spook" to the letter, the following construct will activate as long as the contents of cmdstr doesn't conflict with cmd;
if (command("spook")) { ... ... }
ie, it will receive the same kind of treatment as a 'regular' command. That means that you provide ease of use to the user (allowing shorthand notation), while securing that you're doing what the user wants. CAVEAT Builder: If you use a string argument as cmd, be sure that there are no white-space in it, ie, that the argument does only consist of letters.
Example: command("spook");
is a valid string, while this construct;
command("spook him");
is NOT valid. The reason of that is that cmdstr only contains the FIRST word of the input from the player, and thus the latter construct could never evaluate to true. This should be evident taking the above information into account, as "spook him" could never equal "spook" (which would indeed be the text in cmdstr if the player entered the string "spook him".)
delstr()
Function: integer delstr( filename : string ) ;
filename The name of the String file to be deleted Return Returns an integer TRUE if deleted FALSE if not
The delstr is used to delete files that are used with the 'loadstr' and 'savestr' functions. The delstr function will only delete files that each individual Zone has access to which is set up in the Zonelist file in the VME etc directory. Example: ---~---~---~---~---~---~---~---~---
dilbegin news|del ("arg : string /*filename to be deleted); var ret:integer;/*to hold the return value if deleted or not*/ code { ret:= delstr("news.txt"); if (!ret) { log ("File not deleted."); quit; }
sendtext ("News file deleted[&]n",self); quit;/*dil delete routine done } dilend
---~---~---~---~---~---~---~---~---
See Also Load String file and Save String file
delunit()
Function: integer delunit( filename : string ) ;
filename The name of the Unit file to be deleted. Return Returns an integer TRUE if deleted FALSE if not delunit is used to delete files that are used with the 'Restore' and 'store' functions.
Example: ---~---~---~---~---~---~---~---~---
dilbegin chest_del ("arg : string /*filename to be deleted*/); var ret:integer;/*to hold the return value if deleted or not*/ code { ret:= delstr("chest.file"); if (!ret) { log ("File not deleted."); quit; }
sendtext("Chest file deleted[&]n",self); quit;/*dil delete routine done } dilend
---~---~---~---~---~---~---~---~---
See Also Restore a Unit from a Unit file and Store Units to a Unit file.
---~---~---~---~---~---~---~---~---
dildestroy()
integer dildestroy( s : string, u : unitptr ) s : name of dil template to delete. u : unit to remove program from. return: Whether a program using a template with same name as in 's' attached to unit 'u' was deleted.
---~---~---~---~---~---~---~---~---
dilfind()
integer dilfind( s : string, u : unitptr ) s : name of dil template to find. u : unit to find program in. return: Whether a program using a template with same name as in 's' attached to unit 'u' was found.
---~---~---~---~---~---~---~---~---
itoa()
string itoa ( i : integer ) i : A number. return: A string with the number. Example: s := itoa(42);
---~---~---~---~---~---~---~---~---
isaff()
integer isaff ( u : unitptr , i : integer ) u : A unit to be examined. i : An id of an affect, see ID_* in values.h and/or vme.h return: TRUE, if unit 'u' is affected by affect id 'i'
islight()
Function: integer islight ( u : unitptr )
u Unit that you are checking returns TRUE' if item is a light, 'FALSE' if it is notway to small', 'to small', 'way to large', 'to large', or null if fits
Simply checks the item to see if it is a light.
isplayer()
Function: integer isplayer( pcname : string ) ;
pcname the name of the player being checked Return Returns an integer TRUE if pcname is a player FALSE if not
This function is used to find out if a string you pass to it is a player or not. This can be used and is used to find out if a player is truly a player that an Administrator is deleting with out having that player on line. Example: ---~---~---~---~---~---~---~---~---
if (not isplayer(arg)) { sendtext (arg+" is not a character.&n",self); quit; }
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
isset()
integer isset ( i : integer , bit : integer ) i : An integer to examine. bit : A set of bits to match. return: TRUE, if bits in 'bit' is set in 'i'. Example: if (isset(self.manipulate, MANIPULATE_TAKE)) ...
---~---~---~---~---~---~---~---~---
paycheck()
integer paycheck( u1 : unitptr, u2:unitptr) u1 : unit to check against u2 : player to check access for return: TRUE if the player u2 has pay access to the location in which the unit u1 is located. FALSE if the player does not have access. Using non-players as u2 will return TRUE. The function checks if the player has pay-access (if needed) to the zone in which u1 is located.
---~---~---~---~---~---~---~---~---
findunit()
unitptr findunit ( u : unitptr , s : string , i : integer , l : unitptr ) u : The unit the local environment is relative to. s : A string with name of the unit to find. i : The environment, where to look for it, see FIND_UNIT_* in values.h and/or vme.h. l : An optional list of units to search. return: If the unit is found, the function returns that unit. Returns null if nothing found.
The first argument is typically the char that's looking for something, i.e. if Mary needs a spoon to stir the pot, she'll be the first argument.
The second argument is what you're looking for, represented by a string. In the above mentioned example, that'd be "spoon".
For the second or third argument, you have a choice, as you'll only need to use one of them, and let the other be 0 or null. For instance, if you have a pointer to Mary's kitchen utensil pot, you can use the line:
findunit(mary, "spoon", 0, pot);
Or you can just let her look around for it with:
findunit(mary, "spoon", FIND_UNIT_INVEN or FIND_UNIT_SURRO, null);
You can use all the FIND_UNIT_ values defined in values.h and/or vme.h, if you want to look for something for example within the zone (FIND_UNIT_ZONE), the entire world (FIND_UNIT_WORLD) (you rarely need to do that, it's mainly for tell etc.), or just the inventory or equipment of the char in question (FIND_UNIT_INVEN and FIND_UNIT_EQUIP). Finally, as in the example above, you can look in the room of the char (FIND_UNIT_SURRO).
Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will be ignored.
The flags for findunit, intuitively:
FIND_UNIT_EQUIP: The objects you will see with `equipment' Assumes first argument to findunit is a char.
FIND_UNIT_INVEN: The objects you will see with `inventory' or `look in bag'
FIND_UNIT_SURRO: The objects you can see, and get with `get', or the characters you can `poke' :-)
FIND_UNIT_ZONE: As FIND_UNIT_WORLD, only more local.
FIND_UNIT_WORLD: Any object in the entire world. Does NOT start looking close to the object of findunit's first argument, but rather somewhat randomly.
On top of these, the following (new) values are defined:
FIND_UNIT_IN_ME: Anything inside of the object of the first argument.
FIND_UNIT_HERE: Anything `here', i.e. in object or around it (same as IN_ME + SURRO)
FIND_UNIT_GLOBAL: ANYTHING, starting close to object and working out.
---~---~---~---~---~---~---~---~---
findrndunit()
unitptr findrndunit( u : unitptr, sv : integer, uf : integer) Returns: A pointer to a random unit, or null u : The unit pointer which the search is relative to. sv : The search-location, a value (not bit vector) of FIND_UNIT_XXX uf : Bit vector. The unit flags which can match of UNIT_ST_XXX
Example: u := findrndunit(self, FIND_UNIT_ZONE, UNIT_ST_PC|UNIT_ST_NPC);
This routine returns a random unit. Notice how the 'uf' lets you specify exactly what unit types to look for. The 'sv' is not a bit vector, although FIND_UNIT_XXX is usually used as such. If you need to search multiple environments, then call the routine once for each.
Using FIND_UNIT_PAY or FIND_UNIT_NOPAY in this function will pick a random player which in addition to being in the search environment also is registered as valid payer (or not). Asking for a room would yield a random room registered to be accessible for paying players only (or not). Asking for objects would return no unit (null).
filesize()
Function: integer filesize ( filename :string);
file The file name you want to check return a file size in bites 0 if no file
This function does exactly what it says it does it checks a files size.
Example DIL: ---~---~---~---~---~---~---~---~---
dilbegin notebook (); code { ns := filesize (self.name+"notebook"); if ( ns >500000) { sendtext ("Your notebook is full.&n",self); quit; } else if ( ns > 250000) { sendtext ("Your notebook is more than half full.&n",self); quit; } else if (ns >125000) { sendtext ("Your Notebook is only 1/4 full.&n",self); quit; } else if (ns >0) { sendtext ("Your notebook is less than 1/4 full.&n",self); quit; } else { sendtext ("You don't have anything in your Notebook.&n",self); quit; }
} dilend
---~---~---~---~---~---~---~---~---
The previous DIL example shows how you could use the 'filesize' instruction to check the size of a player stored notebook.
---~---~---~---~---~---~---~---~---
findroom()
unitptr findroom ( s : string ) s : Symbolic name of room. return: A pointer to the room, or null Example: findroom("inn@udgaard")
---~---~---~---~---~---~---~---~---
findsymbolic()
unitptr findsymbolic ( s : string ) s : Symbolic name of the NPC or Object to find. return: A pointer to an instance of the unit, or null. Example: findsymbolic("bread@midgaard")
This routine supplements findroom and findunit. It comes in handy,if it is important to get a correct reference to a NPC in the world. If for example, Mary needs to send a message to John the Lumberjack, then she should NOT use the findunit() since it may locate a different John - even a player! If she instead locates him using findsymbolic("john@haon_dor") she will be certain that it is in fact her husband, and not the player John Dow from Norway. It will NOT locate rooms, for the only reason that findroom is a lot more efficient.
unitptr findsymbolic ( u : unitptr, s : string, i : integer ) u : Search is relative to this unit. s : Symbolic name of the NPC or Object to find. i : FIND_UNIT_XXX bit vector of places to search. return: A pointer to an instance of the unit, or null. Example: findsymbolic(self, "bread@midgaard", FIND_UNIT_INVEN)
This routine supplements findroom, findunit and findsymbolic(#). It comes in handy, if it is important to get a correct reference to a unit somewhere relative to 'u'. If for example, Mary needs to check if she has her own cooking pot, then she should NOT use the findunit since it may locate a different pot, not belonging to Haon-Dor but to some other zone. If she instead locates it using findsymbolic(self, "pot@haon_dor", FIND_UNIT_IN_ME) she would be certain that it is in fact her own cooking pot that she is carrying around, and not some other pot from a Joe Blow's zone.
---~---~---~---~---~---~---~---~---
dilbegin zonelog (s:string); code { flog (self.zonidx+".log",s,"a"); return; } dilend
---~---~---~---~---~---~---~---~---
The previous DIL function will work in any zone to log to a file with that zones name each zone could use it to keep zone logs separate.
---~---~---~---~---~---~---~---~---
getword()
string getword ( var s : string ) s : A string with zero or more words separated by space. return: The first word of the string.
NB: The argument string has the returned word removed.
---~---~---~---~---~---~---~---~---
getwords()
stringlist getwords ( var s : string ) s : A string with zero or more words separated by space. return: A stringlist where each string was a word in 's'.
---~---~---~---~---~---~---~---~---
ghead()
unitptr ghead ( )
return the first unit in the global list which will be the last char to have logged on.
---~---~---~---~---~---~---~---~---
split()
stringlist split ( var s : string, var t : string) s : A string with zero or more words separated by var t. return: A stringlist where each string was a word in 's' separated by string 't'.
You can use '&x' to split a string by line. This is very usefull when reading in files with 'loadstr'.
left()
Function: string left ( o : string, l : integer );
o the original string to be parsed l The amount of characters to parse out return the left portion of the string with length l
This function parses the string passed to it and returns the number of characters defined in its second argument.
Example: "short" := left ("shorten me",5); Example: ---~---~---~---~---~---~---~---~---
dilbegin aware describe (arg:string); var side:string; oneword:stringlist; location:string; ln:integer; args:stringlist; temp:string; i:integer; x:extraptr; code { if (self.type!=UNIT_ST_PC) quit; if (self.position <POSITION_SLEEPING) { act ("Recover first and then you can describe your body parts.", A_ALWAYS,self,null,null,TO_CHAR); quit; }
args:=getwords(arg); ln:=length(args); if ((ln<1) or (ln>2)) { sendtext ("No such location to describe.",self); quit; } else if (ln>1) goto two_word;
:one_word:
if ((arg==left("help",length(arg))) or (arg=="")) goto hlp_dscr;
oneword := {"arms","butt","ears","eyes","face","feet", "general","hair","hands","head","legs", "mouth","neck","nose","nostrils","teeth", "toes","tongue"};
i := 0; ln := length(args.[0]); temp:="ERROR"; while (i<18) { if (args.[0]==left(oneword.[i],ln)) { temp := oneword.[i]; break; } i := i+1; }
if (temp=="ERROR") { sendtext ("No such location to describe.",self); quit; }
goto describe;
:two_word:
oneword := {"arm","leg","foot","hand","eye","ear"}; temp := "ERROR"; ln := length(args.[0]); if (args.[0] == left("left",ln)) side:="left"; else if (args.[0] == left("right",ln)) side:="right"; else { sendtext ("No such location to describe.",self); quit; }
i := 0; while (i<6) { if (args.[1]==left(oneword.[i],ln)) { temp := oneword.[i]; break; } i := i+1; }
if (temp=="ERROR") { sendtext ("No such location to describe.",self); quit; }
temp := side+" "+temp;
:describe: if (temp=="General") location := ""; else location := temp;
x := location in self.extra; if (x!=null) if (location=="") sendtext("your Current description for your body is: &n"+x.descr+"&n",self); else sendtext("your Current description for your "+location+"is: &n"+x.descr+"&n",self); if (location=="") sendtext ("Enter a text you would like others to see when they look at your body.&n",self); else sendtext ("Enter a text you would like others to see when they look at your "+location+".&n",self);
beginedit (self); wait(SFB_EDIT,self==activator) ; temp := textformat(argument); oneword:={""}; subextra(self.extra,location); addstring (oneword, location); addextra (self.extra,oneword,temp); sendtext ("Description added.&n",self); quit;
:hlp_dscr:
sendtext ("&nCorrect usage of 'describe':&n&n",self); sendtext ("describe <position>&n&n",self); sendtext("<position> being one of the following:&n&n",self); sendtext( "arms butt ears eyes&n"+ "face feet General hair&n"+ "hands head left arm left leg&n"+ "left foot left hand left eye left ear&n"+ "legs mouth neck nose&n"+ "nostrils right arm right leg right foot&n"+ "right hand right eye right ear teeth&n"+ "toes tongue&n&n",self); sendtext ("Example: &n&n",self); sendtext ("describe left leg&n",self); quit; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
length()
integer length ( a : string or stringlist ) a : a string or stringlist to examine. return: The length of the string in characters, or the number of strings in a list.
---~---~---~---~---~---~---~---~---
load()
unitptr load ( s : string ) s : Symbolic name of unit. return: A pointer to the unit, or null Example: load("garlic@midgaard") The loaded unit is automatically placed inside the object which loaded it. Use for example the link command to move it into other units.
loadstr()
Function: integer loadstr( filename : string , buff : string );
filename The name of the string file to be loaded buff The string that you wish to read the file contents into Return FILE_LOADED, FILE_NOT_FOUND, FILE_OUT_OF_MEMORY,or FILE_TO_LARGE
Loadstr is used to load strings from disk that were saved either by savestr or any text editor. The 'loadstr' is perfect for operations such as on-line edited newspaper, a lottery where the tickets are sold to players, creating smarter NPC's that can remember through reboots who they are hunting, Dil based teachers, message boards, mail system, news command., zone or room based help, competition boards, and much much more. Disk access is always slow. attempt to keep file sizes to a minimum for quick loading. Otherwise you might cause serious delays on the server. Example: ---~---~---~---~---~---~---~---~---
dilbegin news_load (); var ret:integer;/*to hold the return value if loaded or not*/ buff:string;/*to hold the loaded string*/ code { ret:= loadstr("news.txt",buff); if (!ret) { log ("File not read."); quit; }
sendtext(buff+"[&]n",self); quit;/*dil load routine done destroy self.*/ } dilend
---~---~---~---~---~---~---~---~---
See Also Delete a String file and Save String file
---~---~---~---~---~---~---~---~---
openroll()
integer openroll( dice : integer , end : integer ) dice : The size of the dice being rolled. end : The margin for the open-ended roll. return: A random integer in approximately +/- 2^31 in worst case. Example: i := openroll(100,5); The "100" roll continues on values 96 - 100 and on values 1 - 5.
---~---~---~---~---~---~---~---~---
pathto()
integer pathto( from : unitptr, to : unitptr ) from : The unit which the path is taken from to : The unit which the path is taken to returns: DIR_XXX from values.h and/or vme.h. Example: i := pathto(self, findroom("inn@midgaard"));
---~---~---~---~---~---~---~---~---
pagestring()
pathto(buff : string, u : unitptr ) buff : The string that is to be paged to the player. u : The unitptr the buff is to be paged for. returns: nothing example: pagestring (buff,self); would format the buff string to the player so the buff text doesn't scroll off the screen until after the player presses enter.
right()
Function: string right ( o : string, r : integer );
o the original string to be parsed r The amount of characters to parse out return the right portion of the string with length r
This function parses the string passed to it and returns the number of characters from the right defined in its second argument. Example: "Easy" := right ("This is Easy",4);
---~---~---~---~---~---~---~---~---
rnd()
integer rnd ( i1 : integer , i2 : integer ) i1 : Start of range. i2 : End of range. return: A random integer in an interval from 'i1' to 'i2'. Example: i := rnd(1,10);
Built-In Procedures
Built-In Procedures:
DIL features some built-in procedures that allows you increased control over in-game data structures and event handling. Once such procedure (used above)is 'exec()'. The inline procedures are used as any other procedure by typing its name, followed by a list of argument expression enclosed in parentheses. The return types of the expressions used for built-in procedure calls are checked by the compiler.
DIL also lets you call templates defined in the current or other zones. The naming of templates follows the normal naming convention for zone, using the 'name@zone' as a symbolic name for a procedure. Before being able to use external procedures, you must define their name and type in a separate 'external' section in the template. The declaration in the 'external' section should match the original declaration of the referenced program. You can define the number and type of arguments the template take, by listing them inside the declaration parenthesis (as well as in the original declaration of that template) (see example below)
Example:
dilbegin bar(s:string); code { exec("say "+s,self); return; } dilend
dilbegin foo(); external someproc@hades1(); bar(s:string); code { someproc@hades1(); bar("Hello "+activator.name); pause; } dilend
When the procedure is called, the argument expressions are calculated, and passed to the template. Built-in procedures, their arguments and function are listed later.
The following are definitions and documentation for the built-in procedures in DIL. The definitions are not definitions 'as such', but serve to distinguish arguments in the documentation below.
---~---~---~---~---~---~---~---~---
follow()
follow( f : unitptr, m : unitptr ) f : The character to follow m : The character to be followed
Unconditionally makes 'f' follow 'm', even if 'f' is mortally wounded, sleeping, fighting or whatever.
flog()
Function: flog (filename : string, s : string, wa : string );
filename The Filename of the file to appear in the log directory. s The string to be logged. wa Write or Append
The 'flog' function allows you to split up your logs in the log directory so that you don't end up with everything in the main vme.log. Note:The append/write argument must be in lower case and can only be a 'w' or a 'a' surrounded by '"'. If the argument is a 'w' it will over write any log file by that name. If the argument is 'a' it will append to the file by that name. Example:
---~---~---~---~---~---~---~---~---
dilbegin zonelog (s:string); code { flog (self.zonidx+".log",s,"a"); return; } dilend
---~---~---~---~---~---~---~---~---
The previous DIL function will work in any zone to log to a file with that zones name each zone could use it to keep zone logs separate.
---~---~---~---~---~---~---~---~---
logcrime()
logcrime( c : unitptr, v : unitptr, t : integer ) c : The criminal (main suspect) v : The victim t : The crime type (CRIME_XXX)
Registers a crime committed against 'v' by 'c'. Use the CRIME_XXX values from values.h and/or vme.h as the 't' argument. The logcrime routine automatically registers group members of the criminal, etc. In stuff like steal, remember to make the criminal visible if he fails his attempts.
---~---~---~---~---~---~---~---~---
acc_modify()
acc_modify( u : unitptr, i : integer ) u : A player i : An amount in 1/100s, for example 100 would equal $1.00, and -100 would equal -$1.00.
Access only allowed with 'root' access and all transactions are registered in the specially encrypted account log file. Use with great caution, and always test thoroughly before using. Use without prior permission may cause deletion of god / zone.
strdir()
Function: stringlist strdir( match : string ) ;
match The wild card file you want to match or '*' for all. return a Stringlist with all the filenames that match the 'match' argument.
The 'match' argument uses the same wild cards as the Linux 'ls' command so the following will work.
* Match any character or group of characters ? Match one of any character [...] Match one of a set of characters
Example: ---~---~---~---~---~---~---~---~---
"corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... "corpse?" matches corpse1 corpses corpse5 ... "[abc]*" matches ability about cost back ... "[a-z]*" about zoo man father ... "start[nm]end" matches startnend startmend
---~---~---~---~---~---~---~---~---
Example DIL: ---~---~---~---~---~---~---~---~---
dilbegin wanted (); var wantedlist:stringlist; templist:stringlist; i:integer; ln:integer; code {
wantedlist := strdir ("dead*");
i := 0; ln := length (wantedlist);
while (i < ln ) { templist := split (wantedlist.[i],"."); sendtext (templist.[1]+" wanted dead!&n",self); i:=i+1; }
quit; } dilend
---~---~---~---~---~---~---~---~---
The previous DIL would be an example of a command to check the wanted dead players on the VME if you saved the files with the first word being 'dead' and separated it with a '.' and the players name. For example if 'whistler' was wanted dead the file name would be 'dead.whistler'
set_password()
Function: set_password( u : unitptr, s : string ) ;
u the unit that you want to set the password of s the password you are using to set
This function sets a unit password it only works on Players characters of corse. Example: ---~---~---~---~---~---~---~---~---
dilbegin aware do_password (arg:string); var prmt:string; firstpwd:string;
i:integer; tlist:stringlist;
code {
if(self.type != UNIT_ST_PC) quit; arg:=""; prmt:=self.prompt; self.prompt:="Enter new password: "; wait (SFB_CMD,self==activator); block; tlist:=getwords (excmdstr); if (length(tlist)>1){ sendtext ("Password must be only one word. Try again.&n",self); self.prompt:=prmt; quit; } if (length(excmdstr)<5){ sendtext ("Password to short. Password must be 5 characters or longer.\ Try again.&n",self); self.prompt:=prmt; quit; }
if (length(excmdstr)>16){ sendtext ("Password to long. Try again.&n",self); self.prompt:=prmt; quit; }
firstpwd:=excmdstr; self.prompt:="Enter password again: ";
wait (SFB_CMD,self==activator); block; if (excmdstr!=firstpwd){ sendtext ("Passwords do not match try again.&n",self); self.prompt:=prmt; quit; } set_password(self,excmdstr); sendtext("Changed your Password to '"+excmdstr+"' Please write it down!&n",self); self.prompt:=prmt;
quit; } dilend
---~---~---~---~---~---~---~---~---
store()
Function: store( u : unitptr , filename : string , container : integer );
u The Unit that has the contents to be stored or is to be stored filename The name of the file you want to store the Units to container Do you want to save the container 'TRUE' for yes, 'False' for no
Store saves a copy of a unit or units. If the container value is 'TRUE' everything inside including the container itself will be saved. If the container argument is 'FALSE' only the contents of the object will be saved. You will want to use the 'TRUE' value when saving something like a Clan chest that has items inside to store and has extras on the chest that you also wish to keep. The 'FALSE' value for container would be good for temporary storage of PC inventory or for storing room contents.
The 'store' and 'restore' are perfect for operations such as mud mailing objects from player to player, storage devices for players that will keep inventory through a reboot. Even the ability to save a players inventory while they fight in an arena and restore it to them undamaged when finished. Finally it could be used to save a donation room through reboots since it can be used on a room to store the contents of a room any NPC or objects in the room would be saved through reboot.
Disk access is always slow. If you use store on a continues basis, it is essential that you do so ONLY if it is needed and even then, only at amply spaced intervals. Otherwise you might cause serious delays on the server. Remember that items saved in player's inventories are automatically saved in their instance. Example 1: ---~---~---~---~---~---~---~---~---
dilbegin save_contents (); code {
:start: wait (SFB_CMD,command ("store")); wait for the store command*/ block; store("chest."+self.zoneidx,self,FALSE);/*store everything inside self.*/ goto start; } dilend
---~---~---~---~---~---~---~---~---
Example 2:
dilbegin save_container_n_contents (); code {
:start: wait (SFB_CMD,command ("store")); wait for the store command*/ block; store("chest."+self.zoneidx,self,TRUE);/*store everything inside self and self.*/ goto start; } dilend
---~---~---~---~---~---~---~---~---
See Also Store a Unit to a Unit file and Delete a Unit file.
---~---~---~---~---~---~---~---~---
position_update()
position_update ( u : unitptr ) u : A pointer to a player or a monster. The character will be updated and perhaps killed, incapacitated, mortally wounded, revived, etc. depending on current hitpoints. Useful when tampering with the 'hp' field. Example:
pc.hp := pc.hp - 100; position_update(pc);
send_done()
Function: send_done( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);
c the command string that is sending the message a the unitptr (activator) that activated the message m the unitptr (medium) that the Dil is acting through t the unitptr (target) the Dil is acting on p the power of the message arg the argument sent with the message o the unitptr (other) you also want the message to go to
This sends the 'SFB_DONE' message to any dils that are waiting for it in the surrounding area and to the other pointer if not null. The following is just one example you can find many more in commands.zon
Example: ---~---~---~---~---~---~---~---~---
dilbegin do_read (arg:string); var brdname:string; i:integer; u:unitptr; x:extraptr; ln:integer; temp:string; templist:stringlist; buff:string; f_name:string; act_str:string; code { i:=atoi (arg); if (i<0) { exec ("look "+arg,self); goto read_quit; }
if (itoa (i)!=arg) { exec ("look "+arg,self); goto read_quit; }
u:=self.outside.inside; while (u!=null) { if ((u.type==UNIT_ST_OBJ) and (u.objecttype==ITEM_BOARD)) break; u:=u.next; }
if (u==null) { act ("You do not see that here.",A_ALWAYS,self,null,null,TO_CHAR); quit; }
if (u.extra.["$BOARD_L_RES"].descr!="") { act_str:=u.extra.["$BOARD_L_RES"].descr(self,u); if (act_str!="") { act(act_str, A_ALWAYS,self,null,null,TO_CHAR); quit; } }
brdname:=u.names.[length (u.names)-1]; i:=loadstr (brdname+".idx",temp); if (i<=0) { act ("But the board is empty!", A_ALWAYS,self,null,null,TO_CHAR); goto read_quit; }
templist:=split(temp,"&x"); ln:=length (templist); x:="$BOARD_MAX" in self.extra; if ((atoi(arg)>atoi(x.descr)) or (atoi(arg)>ln)) { act("That message exists only within the boundaries of your mind.", A_ALWAYS,self,null,null,TO_CHAR); goto read_quit; }
i:=atoi(arg); temp:=templist.[i-1]; f_name:=getword(temp); i:=loadstr (brdname+"."+f_name,buff); if (i==0) { sendtext("You have to let the poster finish the post before reading it.",self); quit; } if (i<1) { log("05: Error when loading board info."); act ("This board is not working report to an Administrator", A_ALWAYS,self,null,null,TO_CHAR); quit; }
templist:=split(f_name,"."); if (length(templist)<2) act ("Message "+arg+": "+temp, A_ALWAYS,self,null,null,TO_CHAR); else act ("Message "+arg+": Re: "+temp, A_ALWAYS,self,null,null,TO_CHAR);
pagestring(buff,self);
:read_quit: send_done("read",self,null,u,0,arg,null); quit; } dilend
---~---~---~---~---~---~---~---~---
send_pre()
Function:send_pre( c : string, a :unitptr, m : unitptr, t :unitptr, p : integer, arg : string, o : unitptr);
c the command string that is sending the message a the unitptr (activator) that activated the message m the unitptr (medium) that the Dil is acting through t the unitptr (target) the Dil is acting on p the power of the message arg the argument sent with the message o the unitptr (other) you also want the message to go to
New Function send_pre() takes same arguments as send_done but returns either SFR_SHARE or SFR_BLOCK. If the command is blocked by another special or dil, then SFB_BLOCK will be returned, and you should quit your dil. Example: ---~---~---~---~---~---~---~---~---
dilbegin cmdtst(arg : string); var i : integer; code { i:=send_pre("cmdtest",self,null,null,0,argument,null);
if (i == SFR_BLOCK) quit;
sendtext ("No one blocked me!&n",self); quit; } dilend
dilbegin pretest(); code { :loop: wait(SFB_PRE, command("cmdtest")); block; act("hahahaha I blocked your cmdtest command", A_SOMEONE, activator, medium, null, TO_ALL); goto loop; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
set()
set ( var i : integer , bit : integer ) i : Integer variable to alter. bit : Bits to set in integer variable. result: Sets bits in 'i'
---~---~---~---~---~---~---~---~---
unset()
unset ( var i : integer , bit : integer ) i : Integer variable to alter. bit : Bits to unset in integer variable. result: unset bits in 'i'.
addcolor()
Function: addcolor (ch : unitptr, ks : string, cstr : string ) ;
ch character you are adding the color to ks key string for the color cstr color string
This function allows your Dils to create and add their own personal colors to a players color list. That way you can actually make an act in a color that the player chooses or you yourself choose. Function: addcolor(pc, "clan_who","&c+w&bn");
delcolor()
Function: delcolor (ch : unitptr, ks : string) ;
ch character you are deleting the color from ks key string for the color
This function is used to delete any colors from a players personal color list. Function: delcolor(pc, "clan_who");
getcolor()
Function: string getcolor (ch : unitptr, ks : string) ;
ch character you are deleting the color from ks key string for the color returns returns the color in a string
This function returns what color a player has for a key in the players list. Function: string := getcolor(pc, "clan_who");
changecolor()
Function: changecolor (ch : unitptr, ks : string, cstr : string ) ;
ch character you are changing the color on ks key string for the color cstr color string
This will change a color in a players personal list. Function: changecolor(pc, "clan_who","&c+w&bn");
gamestate()
Function: gamestate( u : unitptr, gs : integer ); Change the gamestate of a unitptr, uses the GS_ defines from the vme.h. This is used on the log on menu of the VME 2.0 release. Which is shown here as an example but it can also be used in a command. When used it removes the char from playing so be aware that players could use this to hide if you run a player killing style mud. Example: ---~---~---~---~---~---~---~---~---
dilbegin informer(); var tgt : unitptr; code { heartbeat := PULSE_SEC;
tgt := ghead();
while(tgt.type == UNIT_ST_PC) {
if((isset(tgt.pcflags,PC_INFORM)) and (tgt != self)) { if(visible(tgt,self)) { if(self.outside == tgt.outside) sendtext(self.name+" has arrived.&n", tgt); else sendtext(self.name+" has entered the world.&n", tgt); } }
tgt := tgt.gnext; }
return; } dilend
dilbegin aware on_connect(); external informer(); login_modify(tgt : unitptr);
var wizlvl : integer; i:integer; err : integer; motd : string; welcome : string; goodbye : string; code { heartbeat := PULSE_SEC;
if(dilfind("do_quit@commands",self)) i := dildestroy("do_quit@commands", self);
err := loadstr("motd",motd);
if(err > 0) { motd := textformat(motd); sendtext(motd+"&n&n", self);
}
err := loadstr("welcome",welcome); if(welcome) welcome := textformat(welcome);
if (self.level < 200) {
login_modify(self); dilcopy ("clan_delete@clans",self); dilcopy ("clan_clear@clans",self);
if(err > 0) sendtext("&n"+welcome+"&n&n", self); informer(); exec("look", self); quit; } gamestate(self, GS_MENU);
:wiz_menu: sendtext("Welcome to Valhalla&n&n", self); sendtext("1) Enter Valhalla&n", self); sendtext("W) Change Wizinv level&n [&c+g"+itoa(self.minv)+"&[default]]&n",self); sendtext("0) Exit Valhalla&n&n", self); sendtext("Make your choice: ", self); wait(SFB_CMD, TRUE);
if (command("1") ) { gamestate(self, GS_PLAY); if(err > 0) sendtext("&n"+welcome+"&n&n", self); informer(); exec("look", self); quit; } else if (command("0") ) { err := loadstr("goodbye",goodbye); if(err > 0) { goodbye := textformat(goodbye); sendtext(goodbye, self); } destroy(self); quit; } else if (command("w") ) { sendtext("Enter new WizInv Level: ", self); wait(SFB_CMD, TRUE); wizlvl := atoi(cmdstr); if (wizlvl > self.level) wizlvl := self.level; self.minv := wizlvl; } else { sendtext("Invalid Selection&n&n", self); goto wiz_menu; }
} dilend
---~---~---~---~---~---~---~---~---
Look in vme.h for the possible values you can send to the menu function.
---~---~---~---~---~---~---~---~---
addextra()
addextra ( var e : extraptr, l : stringlist , s : string ) e : Extra description list to add element to. l : Stringlist for the .names field. s : String for the .descr field. result: Adds an extra description to a list of extra descriptions.
CAVEAT builder: You cannot use an extraptr variable as the e argument, but you may continue to use the following form:
... ... addextra (self.quests, "Bozo's Quest"); ... ...
---~---~---~---~---~---~---~---~---
addstring()
addstring ( var l : stringlist, s : string ) l : Stringlist to add string to. s : String to add. result : Adds a string 's' to a stringlist 'l'.
---~---~---~---~---~---~---~---~---
subextra()
subextra ( var e : extraptr, s : string ) e : Extra description list to remove element from. s : String matching .names field in element result: Removes first extra description from list with matching name.
<emp>CAVEAT</EMP> builder: You cannot use an extraptr variable as the e argument, but you may continue to use the following form:
... ... subextra (self.quests, "Bozo's Quest"); ... ...
---~---~---~---~---~---~---~---~---
substring()
substring ( var l : stringlist, s : string ) l : Stringlist to remove string from. s : String to remove result: Removes string 's' from stringlist 'l'.
stop_fighting()
Function: stop_fighting( ch: unitptr, vict : unitptr ) ;
ch unitptr - person you are stoping the fighting for vict unitptr - person you are removing from the fighting or null for everyone
This function can be used to cancel combat in a room or with two people. The following example copied to a player will stop any fight the player is in. Example: ---~---~---~---~---~---~---~---~---
dilbegin stop_combat(); code { stop_fighting(self,null); quit; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
subaff()
subaff ( u : unitptr, i : integer ) u : Unit remove affect from. i : Affect id to remove, see ID_* in values.h and/or vme.h result: Removes first affect at 'u' with matching id 'i'.
---~---~---~---~---~---~---~---~---
addaff()
addaff ( u : unitptr, id : integer, tif_first : integer, tif_tick : integer, tif_last : integer, apf : integer, )XXX u : Unit to add affect to. id : Affect id to add, see ID_* in values.h and/or vme.h result: Adds affect 'id' at 'u' with first, tick, and last TIF_XXX's
destroy()
Function: destroy ( u : unitptr );
u :Unit to remove from game
The destroy function works in two ways depending on the Unit being acted on. If the Unit being acted on is a PC the player is saved and ejected from the game. If the Unit being acted on is a NPC, or an Object. the purge function destroys the Unit. Currently destroy will not destroy rooms. This is different from the old destroy function in that it removes the player out of the game instead of leaving the player in the menu. Example ---~---~---~---~---~---~---~---~---
dilbegin purge_all_pc(); var u:unitptr/*Unit used to purge each player*/ n:unitptr;/*used to keep track of next player*/ code { u:=ghead();/*get first pc in game list*/ n:=u;
while (n.type==UNIT_ST_PC)/*while unit is a pc*/ { n:=u.gnext; destroy(u); }
quit;/*done whiping out the players*/ } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
walkto()
walkto ( u : unitptr ) u : Room to walk to. result: Makes unit (self) walk to room, taking a 'step' at each 'tick'.
Example:
walkto(findroom("inn@udgaard"));
---~---~---~---~---~---~---~---~---
link()
link ( u : unitptr, t : unitptr ) u : Unit to link. t : Unit to link into. result: Link a unit into another unit hierarchy. (Automatically unequipps if equipped).
weapon_name()
Function: string weapon_name( i : integer ) ;
i Weapon to get the name of ass defined in 'values.h' and 'weapons.def' returns The name of the weapon that corresponds with the integer value
example: ---~---~---~---~---~---~---~---~---
myweap:=weapon_name(5);
---~---~---~---~---~---~---~---~---
weapon_info()
Function: intlist weapon_info( i : integer ) ;
i Weapon to get the info of ass defined in 'values.h' and 'weapons.def' returns Intlist containing 4 values:
0 Number of hands 1 weapon speed 2 weapon type 3 shield block value
This function gives you access to the values in the weapons.def file. With this things like 'wear' equipment' and 'look' are much easier to write in Dil. Example ---~---~---~---~---~---~---~---~---
dilcopy id_weap (arg:string); var i:integer; il:intlist; code { il:=weapon_info(atoi(arg));
if (il!=null) { sendtext ("Number of hands: "+itoa(il.[0])+"&n"; sendtext ("Speed: " +itoa(il.[1])+"&n",self); sendtext ("Type: "+itoa(il.[0])+"&n",self); sendtext ("Shield value: "+itoa(il.[0])+"&n",self); } else { sendtext ("No such weapon.&n",self); }
quit; } dilend
---~---~---~---~---~---~---~---~---
skill_name()
Function: string skill_name( i : integer ) ;
i Skill to get the name of ass defined in 'values.h' and 'commands.def' returns The name of the skill that corresponds with the integer value
example: ---~---~---~---~---~---~---~---~---
myski:=skill_name(5);
---~---~---~---~---~---~---~---~---
reboot
Function: reboot ; This function works like a quit command. Anything after the reboot function in a Dil will not be executed the mud will reboot instantly. The zone must have root privileges in the zonelist in order to use this function. Simple reboot command ---~---~---~---~---~---~---~---~---
dilbegin cmd_reboot (arg:string); code { sendtext ("Rebooting the mud.&n",self); reboot; } dilend
---~---~---~---~---~---~---~---~---
killedit
Function: killedit ; This function is used to kill the editor on a PC if it needs to stop editing before the PC is done editing. An example of when this is needed is when a player is killed while editing or is transfered away from a place where he was editing. You can let them finish but it may be wierd for a person to finish posting in one room while in another. Example ---~---~---~---~---~---~---~---~---
dilbegin editextra (arg:string); code { interrupt (SFB_DEAD,self==activator,int_quit); beginedit (self); wait(SFB_EDIT,self==activator) ; temp := textformat(argument); addextra (self.outside.extra ,{"graphitee"},temp); quit; :int_quit: killedit; quit; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
experience()
experience ( i : integer, u : unitptr ) i : A integer number of experience to gain or loose. u : The player to receive the experience. result: The integer amount of experience is added to the players total amount of experience (thus causing more or less experience). USE WITH CARE! SUGGEST THAT YOU ONLY USE INTEGER CONSTANTS AS THE EXPRESSION TO AVOID ERRORS.
---~---~---~---~---~---~---~---~---
act()
The purpose of act is to send a message to a number of players present in a room. The room is defined as the room containing the afore mentioned character (provided he himself is in the room, i.e. not in a closed container.)
---~---~---~---~---~---~---~---~---
Syntax:
act(message, visibility, char, medium, victim, to_whom);
message - is a string that will be shown to other mobiles when the act is executed. To refer to the following arguments use the formatters listed below. visibility - is an integer that defines what happens if the mobile that is about to receive the message can't see the activator. A_SOMEONE If the receiver cannot see char, replace any reference to char with someone. A_HIDEINV If the receiver cannot see char, don't send the message at all. Use this when missing vision should eliminate the perception of the action the message represent. One instance where it is used is in smile. You would need a ridiculously sensitive ear to hear, let alone percept that someone's smiling if you can't see them. Do not use it if 'sound' is inherent in the message. A_ALWAYS Works exactly like A_SOMEONE, except that the receiver will see the message even when sleeping. char - is a unitptr, and the most important argument in the act. If this is not valid the act will never show, leaving mobiles without the message. medium - is a unit pointer, an integer or a string. Use this at your leisure. victim - is a unit pointer, an integer or a string. Certain flags in the next argument rely on the validity of victim. to_whom - is an integer that defines who gets the message. TO_ROOM Sends the message to the entire room, excluding 'char'. TO_VICT Sends to 'victim' only. 'victim' must be valid, naturally. TO_NOTVICT Sends the message to the entire room, excluding 'char' and 'victim'. Perfect for bystanders in a melee. TO_CHAR Sends the message to 'char' and no one else. TO_ALL Sends the message to everybody in the room. TO_REST This is a bit different from the rest. In sends the message to all other units in the local environment, excluding those inside 'char'.
---~---~---~---~---~---~---~---~---
Act Formatters
Just as the description formatters, act has its own set of formatters that enable you to create generic messages that will be interpreted at run-time, lessening the load on you.
The format string is a normal message, containing some special characters:
'$$' will be sent to the receiver as a single `$'
'$', followed by a number and an extra character. The numbers:
'1' means this formatter refers to the 'char' argument. '2' means this formatter refers to the 'medium' argument. '3' means this formatter refers to the 'victim' argument.
The characters
'N' the formatter will be replaced with the name of the unit, or (depending on the visibility) 'something' or 'someone'. 'a' 'a' or 'an' depending on the name of the unit referred by the number. 'e' 'it', 'he' or 'she' depending on the gender of the unit referred by the number. 'm' 'it', 'him' or 'her' depending on the gender of the unit referred by the number. 'n' the formatter will be replaced with the title of the unit, or (depending on the visibility) 'something' or 'someone'. 'p' 'fighting', 'standing', 'sleeping', etc., depending on the positionof the unit referred by the number. 's' 'its', 'his' or 'her' depending on the gender of the unit referred by the number. 't' the string in the argument referred by the number.
Example:
act("You step over $2n.", A_SOMEONE, self, litter, null, TO_CHAR); act("$1n steps over $2n.", A_SOMEONE, self, litter, null, TO_REST);
See Also: DIL Act() for Dummies
---~---~---~---~---~---~---~---~---
exec()
exec ( s : string , u : unitptr ) s : Command and arguments to perform. u : Unit to perform command. result: Unit (PC/NPC) executes command. The argument is treated just as if a normal PC entered a command at the command prompt in the game. It is not directly possible to detect whether the command was a success or fail. For example, you might force a PC to "get key". If there is no 'key' available, the PC will get notified the normal way. Plenty of examples are given above.
---~---~---~---~---~---~---~---~---
wait()
wait ( i : integer , dilexp ) i : Message class to accept, see SFB_* in values.h and/or vme.h dilexp : Expression that has to be TRUE or not null to accept message. result: Waits for a command, matching the flagset, and satisfies the expression. When using the 'wait()' command, the first argument is an integer, that tells what classes of messages to wait for. Each message class is represented by a bit named as described in the chapter on messages. Example:
wait (SFB_TICK|SFB_MSG, TRUE) /* Will accept a message, either from another DIL program or a timer message. As the second argument is always TRUE, any such message will reactivate the DIL program. */
Example:
wait (SFB_CMD, command("transmutate")) /* waits for an command entered named 'transmutate'. Activates the DIL program, that then can block the command, or let it pass (and then let the game produce the normal error message for unknown commands). */
savestr()
Function: integer savestr( filename : string , buff : string , wa :string);
filename The name of the String file to save the String to buff The String you wish to save into the file wa Write or append Return FILE_SAVED, FILE_NOT_SAVED, FILE_NOT_CREATED, or FILE_ILEGAL_OPP
Savestr is used to save strings to disk to be loaded later by the 'load' function. The 'savestr' and 'Loadstr' is perfect for operations such as on-line edited newspaper, a lottery where the tickets are sold to players, creating smarter NPC's that can remember through reboots who they are hunting, Dil based teachers, message boards, mail system, news command., zone or room based help, competition boards, and much much more. Note:The append/write argument must be in lower case and can only be a 'w' or a 'a' surrounded by '"'. If the argument is a 'w' it will over write any string file by that name. If the argument is 'a' it will append to the file by that name. Disk access is always slow. If you use loadstr on a continuous basis always attempt to keep file sizes to a minimum for quick loading. Otherwise you might cause serious delays on the server. Example: ---~---~---~---~---~---~---~---~---
dilbegin news_save (arg:string /*for saving*/); var ret:integer;/*to hold the return value if saved or not*/ code { ret:= savestr("news.txt",arg,"w"); if (!ret) { log ("File not wrote"); quit; }
sendtext("New news file wrote.[&]n",self); quit;/*dil save routine done destroy self.*/ } dilend
---~---~---~---~---~---~---~---~---
See Also Delete a String file and Load a String file
remove()
Function: remove( sl : stringlist, i : integer ) ;
sl the stringlist you are removing from i the index you want to remove
This function allows you to remove a string from a stringlist with out leaving a blank spot in the stringlist. Example: remove (sl, i);
reset_level()
Function: reset_level( u : unitptr ) ;
u player your resetting
This function simply resets a players level. Can be used in functions like reroll where you set the players back to the way he first logged on. Example: reset_level (u); See Also reset a players virtual level and reset a players race information
reset_vlevel()
Function: reset_vlevel( u : unitptr ) ;
u player your resetting
This function simply resets a players virtual level. Can be used in functions like reroll where you set the players back to the way he first logged on. Example: reset_vlevel (u); See Also reset a players level and reset a players race information
reset_race()
Function: reset_race( u : unitptr ) ;
u player your resetting
Reset a characters race, weight, height, age, lifespan, and costs for training. As if you first log on the character. Great for reroll along with 'reset_level' and 'reset_vlevel'. Example: reset_race (u); See Also reset a players level and reset a players virtual level
---~---~---~---~---~---~---~---~---
secure()
secure ( u : unitptr , label ) u : Unit to secure. label : Label to jump to, on removal. result: Secures a unitptr, so that the program will go to 'label' if unit leaves local environment. If this happens, during a call to another function/procedure, it will continue at that label when the function/procedure returns. If you perform some kind of call to a template, the removing of a unit from the local environment will not have affect. until the return from that function, as the program execution will continue at the designated label after a call. Should several secured units leave local environment, the last such event will determine the point of execution upon return.
unitdir()
Function: stringlist unitdir( match : string ) ;
match The wild card file you want to match or '*' for all. return a Stringlist with all the filenames that match the 'match' argument.
The 'match' argument uses the same wild cards as the Linux 'ls' command so the following will work.
* Match any character or group of characters ? Match one of any character [...] Match one of a set of characters
Example: ---~---~---~---~---~---~---~---~---
"corpse*" matches: corpse.10938 corpse.whistler corpseofwhistler ... "corpse?" matches corpse1 corpses corpse5 ... "[abc]*" matches ability about cost back ... "[a-z]*" about zoo man father ... "start[nm]end" matches startnend startmend
---~---~---~---~---~---~---~---~---
Example DIL: ---~---~---~---~---~---~---~---~---
dilbegin aware reload_corpse(); var corpselist:stringlist; u:unitptr; ln:integer; i:integer; x:extraptr; code { corpselist:=unitdir("corpse*"); ln:=length(corpselist); i:=0; while (i<ln) { u:=restore(corpselist.[i],null); x:=CORPSE_EXTRA in u.extra; if (u!=null) if (x!=null) link (u,findroom(x.descr)); else link (u,findroom("temple@udgaard")); i:=i+1; }
quit; } dilend
---~---~---~---~---~---~---~---~---
The previous DIL example is the DIL used in restoring corpses to the game in case of a crash. For more information you can see how the death DIL'S work by reading through the file death.zon in the vme2.0/zone. directory.
---~---~---~---~---~---~---~---~---
unsecure()
unsecure ( u : unitptr ) u : Secured unit. result: Drop secure on a given unit.
---~---~---~---~---~---~---~---~---
block
block result: Blocks any command issued by a player or mobile. Blocking a command prevents the command from being parsed by the interpreter. This is ideal if you need to make a routine which intercepts a command, reacts on it in a special way, and does not need the standard way of reacting.
---~---~---~---~---~---~---~---~---
priority
priority result: Set until nopriority command. When set, no special routines "below" the current DIL program will be executed. This is used to make other special routines idle. See haon-dor.zon for an example.
---~---~---~---~---~---~---~---~---
nopriority
nopriority result: Cancels the priority procedure.
---~---~---~---~---~---~---~---~---
addequip()
addequip ( u : unitptr , i : integer ) u : Unit to equip. i : Where to equip unit. result: Equips unit, presumed to be in inventory PC/NPC at given position. See WEAR_* in values.h and/or vme.h
---~---~---~---~---~---~---~---~---
unequip()
unequip ( u : unitptr ) u : Unit to unequip. result: Unequipes unit presumed to be in equipment of PC/NPC.
delete_player()
Function: delete_player( s : string ) ;
s the player name you want to delete
This function deletes a player but it doesn't check to see if it was deleted or if it even existed you will have to do that with 'isplayer'. Example: ---~---~---~---~---~---~---~---~---
dilbegin aware do_delete (arg:string); var temp:string; err:integer; code {
if(self.type != UNIT_ST_PC) quit;
if (self.level>200) goto admin_delete;
:char_delete: if (arg!="self forever") { sendtext ("To delete your char type: 'delete self forever'&n",self); quit; }
err:=loadstr("delete.txt",temp);
if (err<1) goto no_insure;
sendtext (temp,self);
sendtext ("If your sure you still want to delete your character, 'say delete me'&n",self); sendtext ("Doing anything else will abort the deletion.&n",self);
wait (SFB_CMD, self==activator); if (command ("say"))
if (argument=="delete me") if (self.extra.[CLAN_RANK]!=null) exec ("cdefect",self); delete_player(self.name);
sendtext("Deletion aborted&n",self);
quit;
:no_insure: if (self.extra.[CLAN_RANK]!=null) exec ("cdefect",self); delete_player(self.name);
quit; :admin_delete: if (arg=="self forever") goto char_delete; if (arg==""){ sendtext("You must supply a characters name to delete one.&n",self); quit; }
if (arg==self.name){ sendtext ("To delete self you need to type 'delete self forever'&n",self); quit; }
if (not isplayer(arg)) { sendtext (arg+" is not a character.&n",self); quit; } dilcopy ("god_delete@clans("+arg+")",self);
sendtext (arg+" has been deleted.&n",self); quit; } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
dilcopy()
dilcopy( s : string, u : unitptr ) s : Name template to attach to unit. u : Unit to attach a dil program to. result: Attaches a DIL program to a unit 'u', which uses a template named by 's'.
---~---~---~---~---~---~---~---~---
sendtext()
sendtext( s : string, u : unitptr ) s : text to send u : Unit to send the text to result: Sends the string 's' to 'u'. Useful only for nanny stuff, because no new line appended.
---~---~---~---~---~---~---~---~---
change_speed()
change_speed( u : unitptr, i : integer ) u : the unit on which you wish to alter the current combat speed. i : the amount to add to the speed.
Beware, this is not the 'speed' as in the speed field, rather this is the speed which is calculated during combat. It is used for spells like 'stun' which effectively puts the character out of combat for one round. Such a spell would be implemented like:
change_speed(u, 12)
and would only cause any effect if 'u' was fighting already (if not, use setfighting).
---~---~---~---~---~---~---~---~---
transfermoney()
integer transfermoney( f : unitptr, t : unitptr, amount : integer) f : The char the money is taken from t : The char the money is given to amount : How much money. Returns: TRUE is money was transferred, FALSE if could not afford.
If 'f' is null and 't' isn't, then money is created and given to 't'. If 'f' isn't null but 't' is, then money is removed from 'f'.
---~---~---~---~---~---~---~---~---
set_fighting()
set_fighting( u : unitptr, t : unitptr ) u : the unit on which attacks. t : the unit being attacked.
This is used to set two characters fighting. If the attacker is fighting already, the target will simply be inserted into the opponent list and perhaps killed a little later.
---~---~---~---~---~---~---~---~---
setweight()
setweight( u : unitptr, i : integer ) u : the unit on which you wish to alter the weight. i : the new weight
This is needed on for example drink-containers. I.e. if you wish to remove or add some liquid, you must also adjust the weight of the container, or you will mess up things.
---~---~---~---~---~---~---~---~---
setbright()
setbright( u : unitptr, i : integer ) u : the unit on which you want to change the brightness. i : the new brightness
When you want to increase / decrease the amount of light shed by a unit, use this function. Units with "bright" light up rooms so that people can see.
---~---~---~---~---~---~---~---~---
log()
log( s : string ) s : Text to put in the log. result: Puts text in the log for debugging purposes.
---~---~---~---~---~---~---~---~---
send()
send ( s : string ) s : Message to send. result: Send a message to all DIL programs in current local environment, matching the message class SFB_MSG. The message is not received by those DIL programs in the local environment that is not set up to wait for that message class.
---~---~---~---~---~---~---~---~---
sendto()
sendto ( s : string , u : unitptr ) s : Message to send. u : Unit to send it to. result: The message is passed to all DIL programs in unit, matching the message class SFB_MSG. The message is not received by those DIL programs in the local environment that is not set up to wait for that message class.
---~---~---~---~---~---~---~---~---
sendtoall()
sendtoall( m : string, s : string ) m : Message to send. s : Name idx to send message to. result: Send a message to all units matching a given database name.
Example:
sendtoall ( "some message", "rabbit@haon-dor");
The message "some message" is sent to all units in the world matching the data base name "rabbit@haon-dor". Like 'send()' and 'sendto()', the message received matches the SFB_MSG message class.
---~---~---~---~---~---~---~---~---
sendtoalldil()
sendtoalldil( m : string, s : string ) m : Message to send. s : Name idx to a DIL program to send message to. result: Send a message to all DIL programs matching a given database name.
Example:
sendtoalldil ( "some message", "intercomm@cemetery");
The message "some message" is sent to all DIL program in the world matching the data base name "intercomm@cemetery". Like 'send()' and 'sendto()', the message received matches the SFB_MSG message class.
---~---~---~---~---~---~---~---~---
cast_spell()
cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr )
WILL EVENTUALLY BE OBSOLETE AND REPLACED BY THE CAST_SPELL BELOW.
i : Spell index to cast. See SPL_* in values.h and/or vme.h. caster : The caster of the spell. medium : The medium, with which the spell is cast, might be caster. target : The target of the spell.
Use this to cast spells without performing all the usual mana stuff, etc. Very useful with for example rings / items possessing magical abilities.
integer cast_spell( i : integer, caster : unitptr, medium : unitptr, target : unitptr, effect : string ) i : Spell index to cast. See SPL_* in values.h and/or vme.h. caster : The caster of the spell. medium : The medium, with which the spell is cast, might be caster. target : The target of the spell. effect : A symbolic DIL program which takes no arguments. This will cause all effects to be suppressed and leave this to the program specified. A string of "" will cause the ordinary messages to appear. returns: The result of the spell.
Use this to cast spells without performing all the usual mana stuff, etc. Very useful with for example rings / items possessing magical abilities. Please note that in the two programs below the variable 'hm' represents the number of hitpoints that will be deducted from the target.
Example:
%dil
dilbegin myeffect(medi : unitptr, targ : unitptr, hm : integer); code { act("The caster is $1N medium is $2N and target is $3N", A_ALWAYS, self, medi, targ, TO_ALL); act("The spell result is $2d", A_ALWAYS, self, hm, null, TO_ALL); quit; } dilend
.....
%...
dilbegin test(); var n : integer; code { wait(SFB_DONE, command("beg")); n := cast_spell(SPL_FIREBALL_1, self, self, activator, "myeffect@wiz"); exec("say Result of spell was "+itoa(n), self); } dilend
---~---~---~---~---~---~---~---~---
attack_spell()
integer attack_spell( n : integer, caster : unitptr, medium : unitptr, target : unitptr, bonus : integer) Returns : The amount of damage given. n : The spell index of the offensive spell (SPL_XXX) caster : The caster of the spell. medium : The medium, with which the spell is cast, might be caster. target : The target of the spell. bonus : Possible (+) advantage or (-) penalty.
This is low-level internal spell stuff used to develop new spells. Do not use unless you know what you are doing and have been allowed to do so by your Admin.
insert()
Function: insert( sl : <stringlist or intlist>, i : integer, s : string ) ;
sl the stringlist or intlist you are inserting to i the index where you want to insert the string s the string you want to insert
This function allows you to insert a string in a stringlist or intlist with out re-writing the entire stringlist or intlist to do it. The following Dil will add a string in order to a stringlist. Example: ---~---~---~---~---~---~---~---~---
dilbegin stringlist add_in_order (sl:stringlist,s:string); var i:integer; ln:integer; code { if (length(sl)==0) { addstring (sl,s); return (sl); }
ln:=length(s); i:=0; while (i<ln) { if (length(sl.[i]) <=ln) { insert (sl,i,s); return(sl); } i:=i+1; }
addstring (sl,s); return (sl); } dilend
---~---~---~---~---~---~---~---~---
---~---~---~---~---~---~---~---~---
interrupt()
integer interrupt( flags : integer, dilexp, label )
Set up interrupt matching message classes matching "flags", for example "SFB_COM" or "SFB_COM | SFB_MSG".
When the program is activated on either of the specified conditions the 'dilexp' is evaluated. If true, then execution continues at 'label', otherwise the next interrupt is checked (if any).
Interrupts are saved (restored), when 'recall' is set. Returns an integer which is used for clear() to clear an interrupt.
Example:
The following program shows, that the owner (self) of the program keeps snoring while sleeping. The on_activation ensures that the program is only activated when the owner is sleeping. However, since the interrupt precede the on_activation, these may still be intercepted before the on_activation. The on_activation is just another type of interrupt that reacts on all flags (without actually setting them so that the program is activated).
When the program receives the message "relief" the snoring stops briefly. As used, "relief" may only be set once.
When the program receives the message "cured", the snoring stops completely (i.e. the program quits itself).
dilbegin var i : integer; code { /* Notice that the sequence in which the interrupts (and the on_activation) are executed, is quite important: You can be cured at *any* time. The program will skip if you are not sleeping. If you are sleeping you can be relieved. */ interrupt(SFB_MSG, argument == "cured", the_end); on_activation(self.position != POSITION_SLEEPING, skip); i1 := interrupt(SFB_MSG, argument == "relief", relief); :loop: exec("snore", self); pause; goto loop; :relief: /* Suppose you can only be relieved once, then we must clear interrupt */ clear(i1); pause; pause; goto loop; :the_end: /* Person is cured... */ quit; } dilend
---~---~---~---~---~---~---~---~---
clear()
clear( i : integer )
Clears the interrupt number "i". If i is invalid, this will either clear an wrong interrupt or do nothing.
---~---~---~---~---~---~---~---~---
on_activation()
integer on_activation ( dilexp , label ) dilexp : A boolean DIL expression. label : Label to jump to - OR the reserved keyword SKIP. returns : The index to the interrupt handing the on_activation.
result: Sets up an interrupt that is executed before every activation of the DIL program. This is for example useful to catch situations where your NPC has fallen asleep or is injured. If 'dilexp' evaluates to TRUE then the program jumps to 'label'. If 'label' is 'skip' then the program is simply not activated. When the on_activation evaluates to true, and jumps to a label other than skip, the condition is automatically cleared. If the dilexp evaluates to false, or if the label is skip, the activation remains active. Use the clear() to remove the on_activation.
Example: on_activation(self.position <= POSITION_SLEEPING, skip); or on_activation(self.position > POSITION_SLEEPING, let_me_sleep);
---~---~---~---~---~---~---~---~---
Ending Notes
How 'Done' messages (SFB_DONE) are treated. Note that not all commands are implemented, if you are missing one, let Papi know and it will be created. See commands.txt for details.
This page last updated 03-27-2001, Ken Perry "Whistler"