Making Mobile Programs



  MANUAL FOR MOBPROGS ON ANSALON and ROM 2.4 FROM
  

Ansalon

http://www.ansalonmud.com http://ansalon.wolfpaw.net telnet://ansalonmud.com:8679 telnet://ansalon.wolfpaw.net:8679 telnet://204.209.44.23:8679 Version 2.3.4 September 28 2008 The object of this document is to help you avoid some of the pitfalls that many beginning mprog'ers make, myself heavily included. It exists to be a definitive guide to making mobile programs. - Skol
MAIN SECTIONS:
TriggersValid Trigger Types
VariablesValid Variables
If_ChecksValid If_Checks with Examples
Mob CommandsValid MOB Commands
Attaching ProgramsHow to attach mprog, set trigger, chance etc.
Loading MobsRisks of loading mobiles
MiscellaneousSome last hints and warnings.
CreditsWho built who

How to Begin

MPEDIT CREATE 1234 - makes a new mprog Example: You are working in your new area which has vnum range 1000 - 1100. MPEDIT CREATE 1001
VALID TRIGGER TYPES
TriggerArgument (what must happen to activate trigger)
actWORDLIST or P WORD_PHRASE to match from act() to mobile
bribeINTEGER amount of minimum gold amount given to mobile
entryPERCENT chance to check when mobile moves to a new room
giveFULL OBJECT NAME or ALL to match when obj given to mobile
greetPERCENT chance to check if visible char enters mobile's room
grallPERCENT chance to check when any char enters mobile's room
fightPERCENT chance to check at fight_pulse if mobile is fighting
hpcntPERCENT lower than mobiles hit/max_hit if mobile is fighting
deathPERCENT chance to check after mobile has been slain
randomPERCENT chance to check whenever a PC is in the mobiles zone
speechWORDLIST or P WORD_PHRASE to match in dialogue to mobile
killPERCENT chance to check when a PC is killed
delayINTERGER amount of ticks before activating mprog
exitPERCENT chance to check if visible char exits mobile's room
exallPERCENT change to check when any char exits mobiles room

Trigger & Explanations

ACT Keyword : 'act' Argument: string The argument is a phrase, a text string. The trigger is activated whenever the phrase is contained in the act() message. NOTE: Most general trigger. Applies to almost every event which happens in the mud. Anytime the function act() is called with a message to be delivered TO_CHAR,TO_VICT,TO_ROOM,etc. the act can be triggered. Basically this will trigger on almost everything you'll ever want. Output of "say", "shout" and "emote" do not trigger this event. IE: 'addmprog 1234 act "looks at you" 100' SPEECH Keyword : 'speech' Argument: (word) or "(string)" NOTE: This is only triggered when the phrase is contained in a message which has been said by a PC in the same room as the mob. The PC restriction is not necessary, but makes infinite loops between two talking mobiles impossible. It also makes it impossible for two NPC's to stand and discuss the weather however. IE: 'addmprog 1234 speech "Hello there" 100' (then mprog has a speech or action etc, happens 100% of the time when someone says 'hello there') RANDOM Keyword : 'random' Argument: number (percentage to trigger) NOTE: This trigger is checked at each PULSE_MOBILE and if the argument is greater than a percentage roll the trigger is activated. This will happen even if there is no PC in the room with the mob, but there must be players in the same area. It is useful to give mobiles a bit of a personality. For instance a janitor who stops to spit tobacco, or complain about the hours, or wonder why there are no woman janitors on muds, or a fido which barks or growls or pees on the curb is much more alive than one which just sits there scavenging. Note that this trigger is checked only when there are players in the area. If you want this event to be triggered always, you must set the ACT UPDATE_ALWAYS flag of the mobile. **** JUST A WARNING TO THE WISE ON RANDOM AND UPDATE_ALWAYS **** On further testing, using it on an update_always mob causes "MAX CALL EXCEEDED" errors profusely. Let's just say the error log was 4.3 megs for ONE day. If you do decide to use random on an UPDATE_ALWAYS mob, set the random to something like 1-3% and DON'T make too many of these mobs (like 1 or 2), then hold your britches and wait for mprogs to crash your mud. Generally speaking, I've seen no need for UPDATE_ALWAYS/Random mprog to be combined, most reasons to update without a player present, can be handled by act or specs. GREET Keyword : 'greet' Argument: number (percentage to trigger) NOTE: Whenever someone enters the room with the mobile, and the mobile saw the person enter, this is checked. Good for shopkeepers who want to welcome customers, or for pseudo-aggressive mobiles which need to discriminate on who they attack. Greet trigger activates only when the mobile is not busy (fighting, sitting, sleeping etc.). If you want to be sure to catch all players, use grall. (note: will only greet if the mob can 'see' the pc.) GRALL Keyword : 'grall' Argument: number (percentage to trigger) NOTE: Like greet, but it can be triggered even if the mobile didn't see the arrival (i.e. sneak, invis, etc) or is busy. Most useful for faking teleport rooms or for impassable guardians. IE 'addmprog 1234 grall 75', mprog triggers 75% of the time when pc enters. ENTRY Keyword : 'entry' Argument: number (percentage to trigger) NOTE: The opposite of greet trigger. Whenever the mobile itself enters a new room, this can be triggered. Useful for looking around, or waving or other things that real PCs do when they arrive at a crowded room. IMPORTANT: In an entry program, the mobile can only refer to a random pc ($r in if checks) -- there's no way to know how many PCs exist in the room the mobile enters! Also, you must check visibility of the target in your program. EXIT/EXIT ALL Keyword : 'exit' Argument: number (0:north, 1:east, 2:south 3:west 4:up 5:down) NOTE: The opposite of entry trigger. This is activated when PC tries to leave a room through an exit indicated by the argument, and the mobile sees the person leave. Useful for having a single guardian to watch several exits. An exit trigger works better than an entry trigger, since you can refer to a specific PC instead of a random PC. IMPORTANT: If this event is triggered, the victim will not move through the exit. If necessary, you must move the character yourself in your program (see MOB TRANSFER/MOB GTRANSFER). Also, this event is not triggered when a character flees from combat or the mobile is not in its default position. IE 'addmprog 1234 EXIT 0 100' always activates the mprog when a pc tries to exit to the north of the mob (if pc is able to be seen by mob) Keyword : 'exall' Argument: number (0:north, 1:east, 2:south 3:west 4:up 5:down) NOTE: The same as exit trigger, but it can be triggered even if the mobile cannot see the person trying to leave the room or if the mobile is busy. GIVE Keyword : 'give' Argument: string or object vnum NOTE: The argument is either the a string containing words to be matched against the keywords of the object, or the word "all"; e.g. argument "long sword" will match to objects "long bow" and "small sword". Alternatively, the argument can be the virtual number of a single object. This is triggered whenever something is given to the mobile. Often used for quests. Since the first successful trigger is the only one of this type which is processed, having an "all" argument in the script at the end of the MOB program list is essentially a default response. IE 'addmprog 1234 give food' triggers whenever someone gives the mob something with keyname or type food. BRIBE Keyword : 'bribe' Argument: number (The argument is any positive integer number.) NOTE: This trigger is activated whenever money is given to the mobile. If the amount given exceeds the number, then process the commands. Note again, that an argument of '1' would act as a default response. Also note that if the script is not triggered (because of too little money having been given), the mobile still keeps the money, unless you make an if_check for money $i combined with a money purging or mob replacement upon trigger. (Gets tricky, don't ask ;p) ROM 2.4 NOTE: Since ROM 2.4 has two different types of currency (gold and silver [gold and steel in Ansalon] coins), for bribe trigger the amount to be given is converted to steel coins with the rate of 1 steel = 100 gold. Thus, the number in the argument should be the expected amount in gold coins. KILL Keyword : 'kill' Argument: number (percentage to trigger) NOTE: This trigger is checked whenever a PC attacks the mobile. The check occurs only ONCE, in the beginning of combat. Useful for summoning assistance etc. (See MOB LOAD). FIGHT Keyword : 'fight' Argument: number (percentage to trigger) NOTE: Useful for giving mobiles combat attitude. It is checked every PULSE_VIOLENCE when the mobile is fighting. Can be used to cast spells (see MOB CAST), curse at the opponent, or whatever. Only the first successful one will be processed to save time. Also, this means that the mobile wont get lucky and 1. curse, cast a fireball and 2. spit on the player, cast another fireball in the same pulse. HIT POINT PERCENTAGE Keyword : 'hpcnt' Argument: number (percentage of hp to trigger) NOTE: Is activated at each PULSE_VIOLENCE when the mobile is fighting. It checks to see if the hitpoints of the mobile are below the given percentage. Multiple hpcnt triggers should be listed in increasing order of percent since a 40% will always be activated before a 20% and, only the first successful trigger is performed. (See also MOB FLEE). IE 'addmprog 1234 hpcnt 20' has the mob activate mprog at 20% or less of hp. DEATH Keyword : 'death' Argument: number (percentage to trigger) NOTE: When the mobile dies, if the random percentage is less than the argument the mobile performs the MOB PROGRAM commands rather than the usual death_cry() sequence. This is done before the corpse is made, so the commands can be considered the mobiles last gasp. It could perhaps destroy the items it was holding (see MOB REMOVE and MOB JUNK), or create some (see MOB OLOAD), or cast a spell (see MOB CAST) on the killer and the room, or even goto a new location (see MOB GOTO) and die there (with a text message, the corpse would seem to vanish) The position of the mobile is set to STANDING, and so it can do all the normal commands, without worrying about being DEAD. However, even if the mobile restores itself to full hit points, it will still die. This is not a way to immortal mobiles. However, the last thing this mobile does could be to goto some vacant room, load a fresh version of itself, drop all its items, force the new mobile to get all the items and wear them, send the new mobile back to the character who killed it and force the new mobile to attack that character. Along with a text message which said the mobile restored itself, this might be a convincing effect. (Note that your kitten could turn into a dragon this way too). DELAY Keyword : 'delay' Argument: number NOTE: This trigger activates when the delay of a mobile (set with the MOB DELAY command) expires. This trigger can be used to create staged mobile behavior, for example, a guardian could see a player entering a room, give a warning and activate a delay. If the player is still present when the delay expires, the guard would attack the player. (See also MOB REMEMBER). A mobile can have several delay triggers, but every time the delay timer expires, all the triggers are checked and the first successful one executed. Commands within Mpedit Explanation show [Enter] - shows current MOB program being edited code - Enters code editor
CODE EDITOR
.r 'old' 'new'- replace a substring
(requires '', "")
.r OLD NEW- Swap a word for a new one
.h- get help (this info)
.s- show string so far
.f- Format (word wrap) string
.c- clear string so far
.ld #- delete line number #
.li # (str)- insert (str) at line #
.lr # (str)- replace line # with (str)
@- end string
done- exits editor
(make sure you exit the code editor with '@' first)

VARIABLES

NOTE: To make things come alive, variables are needed. These are represented in the MOBprograms by using a dollar sign convention as in the socials. When the mud command is processed, these variables are expanded into the values shown below. Usually, it is best to use the short descriptions of mobiles and the names of players when speaking them, but if you are performing an action to someone almost always you want the name. The title field for players is an extra that probably wont often be used.
VARIABLEMOBILEACTORVICTIMRANDOMOBJECT2ND_OBJECT
name$i$n$t$r$o$p
shrt_desc/title$I$N$T$R$O$P
he/she/it$j$e$E$J----
him/her/it$l$m$M$L----
his/hers/its$k$s$S$K----
a/an--------$a$A
VARIABLEExplanation
$i- the first of the names of the mobile itself.
$I- the short description of the mobile itself.
$n- the name of whomever caused the trigger to happen.
$N- the name and title of whomever caused the trigger to happen.
$t- the name of a secondary character target (i.e A smiles at B)
$T- the short description, or name and title of target (NPC vs PC)
$r- the name of a random PC in the room with the mobile
$R- the short description, or name and title of the random PC
$q- the name of the MOB PROGRAM target (see MOB REMEMBER)
$Q- the short description of the MOB PROGRAM target
$j- he,she,it based on sex of $i.
$e- he,she,it based on sex of $n.
$E- he,she,it based on sex of $t.
$J- he,she,it based on sex of $r.
$k- him,her,it based on sex of $i.
$m- him,her,it based on sex of $n.
$M- him,her,it based on sex of $t.
$K- him,her,it based on sex of $r.
$l- his,hers,its based on sex of $i.
$s- his,hers,its based on sex of $n.
$S- his,hers,its based on sex of $t.
$L- his,hers,its based on sex of $r.
$o- the first of the names of the primary object (i.e A drops B)
$O- the short description of the primary object
$p- the first of the names of the secondary object (i.e A puts B in C)
$P- the short description of the secondary object
NOTE: Also, in if_checks, the accepted variables are the basic ones (i,n,t,r,o,p,q). If a variable is referenced that doesn't exist, then the value is simply left blank or replaced with "someone"/"something" in output (i.e referring to $o when the trigger is: A kisses B) If variable $q has not been defined, it is automatically set to the last player that has triggered the program being executed (i.e. variable $n). Once $q has been defined, it can be modified with MOB REMEMBER and MOB FORGET commands in a program. Variable $q lets the mobile "remember" a player across different programs, which can be useful. Note that $q is set automatically only the FIRST TIME the mobile executes a program, every time thereafter it must be set with MOB REMEMBER. The only problem with the variables is that the secondary object and the secondary target are passed by act() in the same location. This means that if you reference $t in an A puts B in C situation, the result will probably be a happy mud crash or some weird side effect, especially if $t is used in an if_check (i.e. if isnpc $t in the above situation) The basic fix for this is to change everyone who calls the act() procedure to specify a secondary object and a secondary character. But that is a fairly comprehensive trivial twiddle, so we left it the way it is so that, you aren't forced to make all those twiddles to use the MOBprograms. IF_CHECK quick list
VariableArgumentMeaning
statusif status $1 3- is the PC's status == 3
pc_strif pc_str $n >= 14- is the PC's strength >= 14
pc_intif pc_int $n <= 14- is the PC's intelligence <= 14
pc_wisif pc_wis $n == 14- is the PC's wisdom 14
pc_dexif pc_dex $n > 14- is the PC's dexterity > 14
pc_conif pc_con $n < 14- is the PC's constitution < 14
pc_permstrif pc_permstr $n >= 14- is the PC's PERM strength >= 14
pc_permintif pc_permint $n <= 14- is the PC's PERM intelligence <= 14
pc_permwisif pc_permwis $n == 14- is the PC's PERM wisdom 14
pc_permdexif pc_permdex $n > 14- is the PC's PERM dexterity > 14
pc_permconif pc_permcon $n < 14- is the PC's PERM constitution < 14
pc_hoursif pc_hours $n >= 10- if the PC has 10 or more hours played
pc_weightif pc_weight $n < 250- PC Weight Check, standard operators
pc_clanlevelif pc_clanlevel >= 8- Is PC's clan level over 8?
pc_bcopperif pc_bcopper $n < 250- PC Bank Copper check
pc_bgoldif pc_bgold $n > 250- PC Bank Gold check
pc_bsilverif pc_bsilver $n < 250- PC Bank Silver check
pc_bsteelif pc_bsteel $n > 250- PC Bank Steel check
pc_bplatinumif pc_bplatinum $n < 2- PC Bank Platinum check
pc_subclanif pc_subclan1 $n subclan1- Is PC in subclan1? (see subclan list in helpfile)
pc_subclan2if pc_subclan2 $n subclan2- Is PC in subclan2? (see subclan list in helpfile)
pc_ispkif pc_ispk $n- Is $n (PC's only) a player killer?
randif rand 30- if random number < 30
Subclans:
dagreenif dagreen $n- Dragonarmy and in Green (main or second)
daredif dared $n- Dragonarmy and in Red (main or second)
dablackif dablack $n- Dragonarmy and in Black (main or second)
dablueif dablue $n- Dragonarmy and in Blue (main or second)
dawhiteif dawhite $n- Dragonarmy and in White (main or second)
orlougeif orlouge $n- Mariner AND Orlouge (main or subclans)
bilsonif bilson $n- Mariner and in Bilson (main or second)
clwhiteif clwhite $n- Conclave AND White (main or subclans)
clblackif clblack $n- Conclave AND Black (main or subclans)
clredif clred $n- Conclave AND Red (main or subclans)
hodarkif hodark $n- Holy Order AND Dark (main or sub)
hobalif hobal $n- Holy Order AND Balance (main or sub)
holightif holight $n- Holy Order AND Light (main or sub)
roseif rose $n- Solamnic Rose
crownif crown $n- Solamnic Crown
swordif sword $n- Solamnic Sword
isnpcif isnpc $n- is $n a mobile
ispcif ispc $n- is $n a pc
isgoodif isgood $n- is $n good
isevilif isevil $n- is $n evil
isneutralif isneutral $n- is $n neutral
isimmortif isimmort $n- is $n immortal
ischarmif ischarm $n- is $n charmed
isfollowif isfollow $n- is $n following, or being escorted
mobhereif mobhere fido
if mobhere 1233
- is there a mob name 'fido' here
- is there mob vnum 1233 here
objhereif objhere bottle
if objhere 1233
- is there a object named 'bottle' here
- is there obj vnum 1233 here
peopleif people > 2- is there over 2 character in room
playersif players > 1- does room contain > 1 PCs
mobsif mobs > 2- does room contain > 2 mobiles
mobexistsif mobexists fido- is there a fido somewhere
objexistsif objexists sword- is there a sword somewhere
clonesif clones > 3- are there > 3 mobs of same vnum here
orderif order == 0- is mob the first in room
hourif hour >= 8- is the time after or equal to 8 o'clock
isactiveif isactive $n- is $n's position != SLEEPING
posif pos $n standing- is $n standing
languageif language $n human- is $n's language human?
isdelayif isdelay $i- does $i have mobprog pending
isvisibleif isvisible $n- can mob see $n
hastargetif hastarget $i- does $i have a valid target
istargetif istarget $n- is $n mob's target
existsif exists $q- does $n exist somewhere
affectedif affected $n blind- is $n affected by blind
actif act $i sentinel- is $i flagged sentinel
offif off $i berserk- is $i flagged berserk
immif imm $i fire- is $i immune to fire
carriesif carries $n sword
if carries $n 1233
- does $n have a 'sword'
- does $n have obj vnum 1233
wearsif wears $n lantern
if wears $n 1233
- is $n wearing a 'lantern'
- is $n wearing obj vnum 1233
hasif has $n weapon- does $n have obj of type weapon
usesif uses $n armor- is $n wearing obj of type armor
nameif name $n puff- is $n's name 'puff'
clanif clan $n 'whatever'- does $n belong to clan 'whatever'
raceif race $n dragon- is $n of 'dragon' race
classif class $n thief- is $n a thief (mage, cleric, warrior etc)
objtypeif objtype $p scroll- is $p a scroll
vnumif vnum $i == 1233- virtual number check
hpcntif hpcnt $i > 30- if hit points are below 30%
roomif room $i == 1233- room virtual number
sexif sex $i == 0- sex check
levelif level $n < 5- level check
alignif align $n < -1000- alignment check
moneyif money $n- does $n have X money?
objval0if objval0 > 1000- object value[] checks 0..4
objval1if objval1 >= 3
objval2if objval2 != 6
objval3if objval3 > 5
objval4if objval4 < 124
grpsizeif grpsize $n > 6- group size check
Nesting IF_CHECKs Nesting IF_CHECKs within Programs: -==================================- Note: Every IF requires a ENDIF, like in regular programming you must close every brace.
IF  firstcheck goes here
  IF  secondcheck here (this only happens if firstcheck succeeds)
    IF thirdcheck here (this only happens if firstcheck AND secondcheck succeed)
      DO something if  all of the checks pass
    ELSE
      Here, we do something if first, and second pass, but not third
    ENDIF // close the if thirdcheck
  ELSE // second check failed, but first passed right?
    Do something if just the second check passed, or just endif
  ENDIF // end of secondcheck
ELSE // Ok, firstcheck didn't pass, so we didn't even check the other two
  insert assloads of other checks or just say 'hey didn't work
ENDIF // End of the entire statement
You CAN add other ifchecks right after, but they will always fire unless you put an END (not endif) after some successful check above.
IF_CHECK Full list with Examples & Syntax STATUS if_check: (Ansalon via Tyche) MOB STATUS [int] STATUS lets you check mobiles different states, this is simply an integar you attach to them, and can check on them. -=====- Syntax: if STATUS $i == 0 say My status is 0, going to 1 MOB STATUS 1 end endif if STATUS $i == 1 say My STATUS is 1, going to 2 MOB STATUS 2 end endif if STATUS $i == 2 say My STATUS is 2, going to 0 MOB STATUS 0 end endif end PC_STR if_check: (Ansalon: not stock mprog code) This check is a value comparison. Is the Strength of the player >=< the argument. -=====- Syntax: if PC_STR $n >= 18 say You are quite buff $N! else say Better hit the weights $N. endif PC_INT if_check: Current Stats Check PC_WIS if_check: PC_DEX if_check: PC_CON if_check: PC_STR if_check: This check is a value comparison. Is the Strength of the player >=< the argument. -=====- Syntax: if PC_PERMSTR $n >= 18 say You are naturally very strong $N! else say Better hit the weights $N. endif PC_PERMINT if_check: PERMANENT Stats Check PC_PERMWIS if_check: PC_PERMDEX if_check: PC_PERMCON if_check: PC_HOURS if_check: This check is a value comparison. Is the Hours played of the player >=< the argument. -=====- Syntax: if PC_HOURS $n >= 200 say Holy crap $N! You've been playing for ages. else say Play a while $N, you might like the place. endif PC_BCOPPER if_check: How much of that coin in the bank? PC_BGOLD if_check: PC_BSILVER if_check: PC_BSTEEL if_check: PC_BPLAT if_check: Syntax: if PC_BGOLD $n >= 200 say Holy crap $N! You have over 200 gold in the bank! else say You don't have very much money in the bank $N. endif PC_WEIGHT if_check: This check is a value comparison. Is the Weight check of the player >=< the argument. -=====- Syntax: if PC_WEIGHT $n >= 600 say Holy crap $N, you weigh over 600 pounds! else say You aren't too heavy yet $N. endif PC_CLANLEVEL if_check: This check is a value comparison. Is the clanlevel check of the player >=< the argument. -=====- Syntax: if PC_CLANLEVEL $n >= 8 say You are a recruiter $N. else say You better go talk to the boss $N. endif PC_Subclan if_check: This check looks to see which subclan a player is in, only on PC's. Solamnic: Crown = subclan1 = 1 Sword = subclan1 = 2 Rose = subclan1 = 3 Conclave: White = subclan1 = 1 Red = subclan1 = 2 Black = subclan1 = 3 Dragonarmy GREEN = subclan1 = 1 WHITE = subclan1 = 2 BLACK = subclan1 = 3 BLUE = subclan1 = 4 RED = subclan1 = 5 Holy Order: Light = subclan1 = 1 Balance = subclan1 = 2 Dark = subclan1 = 3 Mariner: Orlouge = subclan1 = 1 Bilson = subclan1 = 2 Wildrunner: Windrider = subclan1 = 1 Rogue: No subclans Use subclan1 for primary clan, subclan2 for secondary. -=====- Syntax: (Hint: Check main clan first> if clan $n Solamnic if pc_subclan1 $n 3 or pc_subclan2 $n 3 room echoat $n You are welcomed into the room, as an unseen servant prepares a chair. room echoaround $n $n is welcomed into the room, as an unseen servant prepares a chair. else room echo Only Rose Knights are permitted in here. endif else room echo Only Solamnics are allowed within. endif NOTE: You can use either subclan1 or the subclan name for the argument. PC_ISPK if_check: This check is simple, is the player a player killer? -=====- Syntax: if pc_ispk $n say You are a player killer!!! cringe $n else say Hmm, scared of a little battle $n? endif RAND if_check: This check is a value comparison. Is the a random number >= the argument. -=====- Syntax: if RAND 30 say Hey, I got 30 or under in my roll! else say I rolled over 30. endif Specific SUBCLAN if_check: This check is simple, Is the victim a in a certain subclan? This checks clan AND subclan, so dared is dragonarmy AND in red subclan. -=====- Syntax: if dagreen $n say You are Dragonarmy Green! endif if dared $n say You are Dragonarmy Red! endif if dablack $n say You are Dragonarmy Black! endif if dablue $n say You are Dragonarmy Blue! endif if dawhite $n say You are Dragonarmy White! endif if orlouge $n say You are Mariner Orlouge! endif if bilson $n say You are Mariner Bilson! endif if clwhite $n say You are Conclave White! endif if clblack $n say You are Conclave Black! endif if clred $n say You are Conclave Red! endif if hodark $n say You are Holy Order Dark! endif if hobal $n say You are Holy Order Balance! endif if holight $n say You are Holy Order Light! endif if rose $n say You are Solamnic Rose! endif if crown $n say You are Solamnic Crown! endif if sword $n say You are Solamnic Sword! endif ISNPC if_check: This check is simple, Is the victim a mob? -=====- Syntax: if ISNPC $n say Hey, you're a mob, go away. else say You're a player! endif ISPC if_check: This check is simple, Is the victim a player character? -=====- Syntax: if ISPC $n say You're a player! else say Hey, you're a mob, go away. endif ISGOOD if_check: This check is a value comparison, Is the victim good? (alignment number check) -=====- Syntax: if ISGOOD $n say You're a goody two-shoes, You're a goody two-shoes. emote dances around emote pokes you in the eye. else say You aren't a goody goody. sniff endif ISEVIL if_check: This check is a value comparison, Is the victim evil? (alignment number check) -=====- Syntax: if ISEVIL $n say You are Soooooo Evil $N!! cower $n else say You aren't bad at all $N. smile endif ISNEUTRAL if_check: This check is a value comparison, Is the victim neutral? (alignment number check) -=====- Syntax: if ISNEUTRAL $n say You are quite neutral $N. else say You must be good or evil $N. emote looks at you with a suspicious sidelong glance. endif ISIMMORT if_check: This check is a value comparison, Is the victim's level above hero? (102+) -=====- Syntax: if ISIMMORT $n say Hello there your godliness $N. else say You are a mortal! say You will DIE $N!!! mob kill $n endif NOTE: Very useful if you have a GRALL program and don't want immortals to have it trigger. Or have a program to damage players, leaves imms alone. ISCHARM if_check: This check is simple, Is the victim charmed? -=====- Syntax: if ISCHARMED $n say Not thinking for yourself lately I see, who's your master $N? else say You have much free will $N. endif ISFOLLOW if_check: This check is simple, Is the victim following someone here? -=====- Syntax: if ISFOLLOW $n nod $n say You may pass, but don't come here unescorted $N. else say You don't belong here $N!! mob transfer $N pole endif NOTE: This is useful for clans (escort), for prisons etc. MOBHERE if_check: This check is simple, Is a certain mob here? -=====- Syntax: if MOBHERE tarantula mob force tarantula mob kill $n else say Damn, if my spider was here, you'd be toast $N. endif NOTE: You can interchange the name with a vnum to be more specific. OBJHERE if_check: This check is simple, Is a certain object here? -=====- Syntax: if OJBHERE table sit table else say Damn, did you take my table $R. endif NOTE: You can interchange the name with a vnum to be more specific. PEOPLE if_check: This check is a value comparison, are there argument PC's + NPC's here? -=====- Syntax: if PEOPLE >= 5 say Wow, we're getting full in here. else say The place seems pretty deserted doesn't it $N? endif NOTE: You can be more specific with MOBS or PLAYERS checks, to determine numbers of PC's or NPC's. PLAYERS if_check: This check is a value comparison, are there argument players here? -=====- Syntax: if PLAYERS >= 2 say Quite a few players here. else say You're the only player here $N. endif MOBS if_check: This check is a value comparison, are there argument mobs here? -=====- Syntax: if MOBS >= 2 say Quite a few mobs here $N. say Why don't you kill some? else say Not very many mobs here $N. endif MOBEXISTS if_check: This check is simple, is there a mob called/number argument in existance? -=====- Syntax: if MOBEXISTS Julia say You should go talk to Julia $N. else say Julia must not be around $N. endif OBJEXISTS if_check: This check is simple, is there an object called/number argument in existance? -=====- Syntax: if OBJEXISTS whitegold say Sorry $N, you can't have one, someone already has a White Gold Ring. else say Oh sure, take my nice ring $N. mob oload 1342134 0 none give ring $n. endif CLONES if_check: This check is a value comparison, are there argument of the same mob here? -=====- Syntax: if clones >= 4 say More than four! else if clones == 3 say Exactly three, plus me! else if clones == 2 say Exactly two, plus me! else if clones == 1 say Just one clone of me! else if clones == 0 say Not just me! else say Just me! endif endif endif endif endif NOTE: Clone can be used with the usual operators > < >= <= ==. It checks for clones of itself, so if clones == 1, means there is ONE mob JUST like it in the room, it's clone. If clones can be used to check IN ROOM only. It's useful for a guard loading more guards, but only if there are only say less than 8 in the room. ORDER if_check: This check is a value comparison, is victim the argument in line? -=====- Syntax: if ORDER $n >= 2 say Why don't you ask your master $N? else say Ahh, you are the boss $N. endif NOTE: This one is useful for letting the mob only listen to the first person to come into the room, or to attack the person if they are second etc. HOUR if_check: This check is a value comparison, does the time >=< the argument? -=====- Syntax: if HOUR >= 8 say Wow, it's past eight already. else say Sorry, I don't do squat until 8 am $N. endif NOTE: This check can be used to have the mob do certain things at certain times, like closeup shop, sell certain items at certain times (via mob oload etc). All sorts of uses. ISACTIVE if_check: This check is simple, is victim NOT sleeping? -=====- Syntax: if ISACTIVE $i say Hey, I'm awake already. else rest stand emote looks around with bleary eyes. endif NOTE: This check can be used to have the mob do certain things based on its position, like wake if it's sleeping, or not attack if it has a grall etc. LANGUAGE if_check: This check is a value check, is victim's language the same as the argument? -=====- Syntax: if language $i goblin say I'm speaking goblin, you fool you can't understand me. else say I'm uh, not speaking goblin! endif NOTE: A good way to use this particular one is to check the target, then say something else, this simulates subterfuge. Or have the target ONLY accept the command in the language it wants! IE: If language $n silvanesti say My greetings $n, that is the correct password. MOB TRANS $n 1234 else language silvantesti say I only speak Silvanesti you uncouth heathen. endif POS if_check: This check is a value check, is victim in the position argument? -=====- Syntax: if POS $i fighting say Hey, I'm kind of busy here $N, please come back later. else say Hey, I'm not fighting, wanna brawl $N? endif NOTE: This check can be used to have the mob do certain things based on its position, or check others, like 'if pos $N fighting' say Calm down $N! etc. Or if position $r sleeping, wake $r, say No sleeping $R!! ISDELAY if_check: This check is simple, does <actor> have a delay? -=====- Syntax: if ISDELAY $i say Sorry $N, I'm busy already. else mob remember $n mob delay 20 endif NOTE: This check is very useful for having mobs act out things via delay. It keeps them from changing the delay, or starting it over before they finish the first one. Also, other mobs can see if a certain mob is busy etc. ISVISIBLE if_check: This check is simple, is victim able to be seen by the mob? -=====- Syntax: if ISVISIBLE $n say I can seeeee you! else say Hey, who's there? endif NOTE: Useful for having mobs not try to do something with someone they can't see. HASTARGET if_check: This check is simple, does <actor> have a target? ($q) -=====- Syntax: if HASTARGET $i say Hey, have you seen $Q $N? else say Hey, I'll remember you $N! mob remember $n endif NOTE: This one is great for mobs checking first to see if they are already after someone etc. ISTARGET if_check: This check is simple, is victim the target of $i? -=====- Syntax: if ISTARGET $n say Hey, just the man I've been looking for $Q! mob kill $Q mob forget else say You're not who I'm looking for $N, I'm after $Q. endif NOTE: This one works with HASTARGET well to determine who the mob is after etc. EXISTS if_check: This check is simple, does $q exist? -=====- Syntax: if EXISTS $q mob at $q mob echoat $q Time to come home $Q. mob at $q mob echoaround $q $I comes to take $Q home for dinner. mob at $q mob transfer $q 12151 else say My victim has left the game. mob forget. endif NOTE: Useful for having mobs not error when looking for a target that has quit the game. You can also use it with a name of obj/mob etc. AFFECTED if_check: This check is a value check, is victim affected by argument? -=====- Syntax: if AFFECTED $n fly mob echo You float across the water. else mob echo You begin to drown in the pool! mob damage $n 100 200 lethal endif NOTE: Can also be used to have the mob see if it is affected by spells etc. IE. if AFFECTED $i haste break else eat pill endif ACT if_check: This check is a check against the victim for how they act. -=====- Syntax: if ACT $i warrior flex say I'm a tough warrior. mob kill $n else say I'm much to wimpy to fight you $N. endif NOTE: This is useful if you are using the same mprog on a few mobs and want them to react differently depending on how thier 'act's are set. OFF if_check: This check is a check against the victim for what offensive behaviors are set for them. -=====- Syntax: if OFF $i dirtkick emote looks at the ground. dirt $n else say You know, I'd kick dirt on you if I could. grumble endif NOTE: This is useful if you are using the same mprog on a few mobs and want them to react differently while fighting depending on how thier 'OFF's are set. IMM if_check: This check is a check against the victim what Immunities they have. -=====- Syntax: if IMM $n magic say Damnit, my magic can't harm you $N. emote slashes at you with a dagger instead. else say Ha ha! mob cast fireball $n endif NOTE: This works well for mobs fighting to not make the mistake of trying damage mobs/pc's with things those mobs/PC's are immune to. IE, IMM cold so the mob loads a different weapon that isn't flagged cold, etc. CARRIES if_check: This check looks to see if the victim carries or wears the argument (vnum or name) -=====- Syntax: if CARRIES $n sword say That's a nice sword you have there $N. else say You should go buy a sword. endif NOTE: This check only checks to see if they are equiped with or have the item in thier inventory. If it's inside a container, it will not trigger (will do the else statement). WEARS if_check: This check looks to see if the victim wears(has equipped) the argument (vnum or name) -=====- Syntax: if WEARS $n holy symbol bow $n say Welcome to our humble sanctuary $N. else say You shouldn't be here $N. mob force $N south endif NOTE: This check only checks to see if they are equiped the item. If it's inside a container, or just in inventory, it will not trigger (will do the else statement). HAS if_check: This check looks to see if the victim carries,wears, or has the argument (vnum or name) -=====- Syntax: if HAS $n dagger if WEARS $n dagger say That dagger looks real sharp $N. else say Your dagger would be better used in your hand $N. mob force $n wear dagger endif else say You should go buy a dagger $N. endif NOTE: This check checks to see if they are equiped with, have the item in thier inventory, or inside a container. Just flat out, do they 'have' one? USES if_check: This check looks to see if the victim is wearing the TYPE of argument. -=====- Syntax: if USES $n light say Not so dark is it $N? else say Nyyaaa, it's dark and you can't see me! endif NOTE: This check checks to see if they are EQUIPPED with a certain TYPE of object. Rather than the name or vnum of it, it looks for object type. NAME if_check: This check checks the name of an object/victim. -=====- Syntax: if NAME $o pie say Yum, what a tasty pie! eat pie else say Hey, this is an $O, I wanted a pie! endif NOTE: This check looks at the name of a victim or object, useful for personal rooms with a NAME check to make sure it's the right person going in. Or an exact object they are looking for etc. CLAN if_check: This check checks the CLAN of the victim. -=====- Syntax: if CLAN $n kot salute $n say Welcome home $N. else say Hey, you aren't a Knight of Takhisis!! scream mob kill $n endif NOTE: This check looks at the clan affiliation of the victim. RACE if_check: This check checks the RACE of the victim. -=====- Syntax: if RACE $n gnome grumble say Wherehaveyoubeen$N? else say You aren't a gnome, want to see the flinger? endif NOTE: This check looks at the race of the victim. CLASS if_check: This check is simple. Is the player class of $N = the argument. -=====- Syntax: if CLASS $n thief say You are a thief, come on in and take my stuff! else say Whew, you aren't a thief, you had me worried $N. endif NOTE: Useful for training halls etc. OBJTYPE if_check: This check checks the type of object of the victim. -=====- Syntax: if OBJTYPE $o food say Thanks, I was very hungry! eat $o say Mmmm, that $O was delicious $N! else say This isn't food! drop $o emote hops around rubbing $k tummy. endif VNUM if_check: This check checks the virtual number of the victim. -=====- Syntax: if VNUM $i 12345 say I am a strong guard. flex else say I am a ninny squire! say I wish I was a guard. endif NOTE: This is useful if you wish to make a complex mprog for a few mobs, then have it so the mob's own vnum determines what it does based on the prog. HPCNT if_check: This check checks the type of hit point percentage of the victim. -=====- Syntax: if HPCNT $i >= 30 say Damn $N, you're kicking my ass! else say I'm not quite dead! endif NOTE: Useful for making mobs flee, or bring in reinforcements. Combine with a if POS $n/$i fighting, for an effective program. ROOM if_check: This check checks the virtual number of the room the victim is in. -=====- Syntax: if ROOM $i == 12345 say I am standing in the East Wing. push $n west else if ROOM $i == 12346 say I am standing in the West Wing. push $n east else say I'm not in my room. sniff endif endif NOTE: This is useful if you wish to make a complex mprog for a few rooms, then have it so the mob's room determines what it does based on the prog. SEX if_check: This check checks the sex of the victim. -=====- Syntax: (1 is male, 2 is female, 0 is 'IT') if SEX $n == 1 say Hey there big boy. else if SEX $n == 2 say Hey there hot mamma. else say Oh my god! say You're an IT!!!! endif endif NOTE: Sex check, works well for different actions based upon sex of the PC. LEVEL if_check: This check checks the level or level range of the victim. -=====- Syntax: if LEVEL $n >= 5 say You're sure getting up there in levels $N. else say You need to go level $N! endif ALIGN if_check: This is a value comparison. The program checks the alignment number of the victim. -=====- Syntax: if ALIGN $n >= 0 say You aren't so bad. else say You aren't so good. endif NOTE: This check is more specific than the ISGOOD/EVIL/NEUTRAL check, allowing you to select exact numbers other than -333 0 and 333. MONEY if_check: This is a value comparison. The program checks the combined money of the victim. -=====- Syntax: if MONEY $i >= 300 say I'm pretty rich else say Dang, I dont have much money. emote Opens a safe. mob oload 12314 0 room get coins say Now I'm rich! endif NOTE: This check can be used to see if players have enough cash to pay for something, before they attempt it. Or give the mobs more cash etc. OBJVAL0-4 if_check: This is a value comparison. The program checks the value of the object. -=====- Syntax: if OBJTYPE $o food if OBJVAL3 $o > 0 say Are you trying to poison me? mob kill $n else say Thanks $n, I was famished! eat $o endif else say I really could use some food. give $o $n endif GRPSIZE if_check: This is a value comparison. The program checks the group size of the victim. -=====- Syntax: if GRPSIZE $n >= 7 say Hello there your lordship. else say Hehe, you don't look so tough. mob kill $n endif NOTE: This check can be used to have the mob estimate a group size, either it's own group (and load more mobs), or the victims group, and fight (or not fight, or load more mobs ;p).

Operators

Most of the basic numeric operators are legal and perform the same function as in C. Operators:
==is equal to
!=is NOT equal to
>is greater than
< is less than
>=is greater than or equal to
<=is less than or equal to
If_Checks In Control Flow (Summary) The provided list of if_checks and their arguments are below. They should all be fairly obvious in what they do, but some of the more obtuse deserve a slight explanation. Any '==' operator can be replaced with any of the available ones described above. The argument $* refers to any of the variables which make sense for that if_check (i.e. for an if_check which is referencing a person the only valid variables would be $i, $n, $t, $r or $q) A value type of string is a sequence of characters. It does not need to be included in quotes or anything like that (i.e. if name $n fido ) There are five types of if checks: Type 1: Keyword/value Explanation rand num - Is random percentage less than or equal to num mobhere vnum - Is a NPC with this vnum in the room mobhere name - Is a NPC with this name in the room objhere vnum - Is an object with this vnum in the room objhere name - Is an object with this name in the room mobexists name - Does NPC 'name' exist somewhere in the world objexists name - Does object 'name' exist somewhere in the world Type 2: Keyword/compare/value Explanation people == integer - Is the number of people in the room equal to integer players == integer - Is the number of PCs in the room equal to integer mobs == integer - Is the number of NPCs in the room equal to integer clones == integer - Is the number of NPCs in the room with the same vnum as the NPC who activated the program equal to integer order == integer - Is the order (of several similar NPCs) of the NPC who activated the trigger equal to integer hour == integer - Is the hour (game time) equal to integer Type 3: Keyword/actor Explanation isnpc $* - Is $* an NPC ispc $* - Is $* a PC isgood $* - Does $* have a good alignment isneutral $* - Does $* have a neutral alignment isevil $* - Does $* have an evil alignment isimmort $* - Is $* an immortal (level of $* > LEVEL_HERO) ischarm $* - Is $* affected by charm isfollow $* - Is $* a follower with their master in the room isactive $* - Is $*'s position > POS_SLEEPING isdelay $* - Does $* have a delayed MOB PROGRAM pending isvisible $* - Is $* visible to NPC who activated the program hastarget $* - Does $* have a MOB PROGRAM target in the room istarget $* - Is $* the target of NPC who activated the program Type 4: Keyword/actor/value Explanation affected $* 'affect' - Is $* affected by 'affect' act $* 'act' - Is $*'s ACT bit 'act' set off $* 'off' - Is $*'s OFF bit 'off' set imm $* 'imm' - Is $*'s IMM bit 'imm' set carries $* 'name' - Is $* carrying object 'name' wears $* 'name' - Is $* wearing object 'name' has $* 'type' - Does $* have object of item_type 'type' uses $* 'type' - Is $* wearing object of item_type 'type' name $* 'name' - Is $*'s name 'name' pos $* 'position' - Is $*'s position 'position' (sleeping etc.) clan $* 'name' - Does $* belong to clan 'name' race $* 'name' - Is $* of race 'name' class $* 'name' - Is $*'s class 'name' objtype $* 'type' - Is $*'s item_type 'type' Type 5: Keyword, actor, comparison and value vnum $* == integer - Is $*'s virtual number equal to integer hpcnt $* == integer - Is $*'s hitpoint percentage equal to integer room $* == integer - Is vnum of the room $* is in equal to integer sex $* == integer - Is $*'s sex equal to integer level $* == integer - Is $*'s level equal to integer align $* == integer - Is $*'s alignment equal to integer money $* == integer - Does $* have money (in gold) equal to integer objval# $* == integer - Is $*->value[#] equal to integer (# from 0-4) NOTE: The original MERC 2.2 MOBprograms used parenthesis '(' and ')' around variables. In this version, they are NOT allowed. Also, parameters MUST BE separated with spaces (Correct syntax is: if level $n < 10).

Mob Command List

Each MOBcommand must be preceeded by "MOB" For Example: MOB ECHOAT $n [string] MOB Command argument_list Explanation MLOAD (mobile) - Lets the mobile load another mobile. OLOAD (obj vnum) (level) (location) - Lets the mobile load an object 2ND ARGUMENT # - the level to load the object at Use 0 if you wish to continue building. 3RD ARGUMENT None - inventory R - in room (can also use Room) W - on mob (must be hold/wearable) KILL (victim) - Lets the mobile kill any player or mobile without murder ASSIST (victim) - Lets the mobile assist another mob or player MPDUMP 1234 - Displays the source code of a given MOB PROGRAM ECHO (text_string) - Prints the message to the room at large ECHOAT (victim) [string] - Prints the message to only the victim ECHOAROUND (victim) [string] - Prints the message to everyone in the room other VECHO (room vnum> [string] - Echo a string at a specific room MVECHO (vnum vnum> [string] - Echo a string at a specific RANGE of rooms GECHO (text_string) - Prints the argument to all active players ZECHO (text_string) - Prints the argument to all players in the same area as the mob ASOUND (text_string) - Prints the argument to all the rooms around the mobile than the mob and victim PURGE (target) - Lets the mobile purge all objects and other npcs in the room, or purge a specified object or mob in the room. The mobile can purge itself, but it must be the last command. GOTO (dest) - Lets the mobile goto any location it wishes that is not private. AT (location) [commands] - Lets the mobile do a command at another location. TRANSFER (target|'all') [location]- Lets the mobile transfer people. The 'all' argument transfers everyone in the current room to the specified location (room vnum or mobile name) SLIP (target|'all') [location]- Lets the mobile slip people. The 'all' argument transfers everyone in the current room to the specified location (room vnum or mobile name) NOTE: This is a transfer, but there is no 'look' so the PC won't know it happened. GRTRANSFER (victim) [location] - Lets the mobile transfer all chars in same group as the victim. OTRANSFER (item name) [location] - Lets the mobile to transfer an object. The object must be in the same room with the mobile. REMOVE (victim) [object vnum|'all']- Lets the mobile to strip an object or all objects from the victim. Useful for removing e.g. quest objects from a character. JUNK (object) - Lets the mobile destroy an object in its inventory - it can also destroy a worn object and it can destroy items using all.xxxxx or just plain all of them FORCE (victim) [commands] - Lets the mobile force someone to do something. Must be mortal level and the all argument only affects those in the room with the mobile. GFORCE (victim) [commands] - Lets the mobile force a group something. Must be mortal level. VFORCE 1234 [commands] - Forces all mobiles of certain vnum to do something CAST (spell) [target] - Lets the mobile cast spells -- Beware: this does only crude checking on the target validity and does not account for mana etc., so you should do all the necessary checking in your mob program before issuing this cmd! DAMAGE (victim) [min] [max] (kill)- Lets mob cause unconditional damage to someone. Nasty, use with caution. Also, this is silent, you must show your own damage message... If kill parameter is omitted, this command is "safe" and will not kill the victim. REMEMBER (victim) - Lets the mobile to remember a target. The target can be referred to with $q and $Q codes in MOBprograms. See also "mob forget". FORGET (victim) - Reverse of "mob remember". DELAY (pulses) - Sets a delay for MOB PROGRAM execution. When the delay time expires, the mobile is checked for a Mob program with DELAY trigger, and if one is found, it is executed. Delay is counted in PULSE_MOBILE CANCEL - Reverse of "mob delay", deactivates the timer. CALL [vnum] [victim|'null'] [object1|'null'] [object2|'null'] - Lets the mobile to call another MOB PROGRAM withing a MOB PROGRAM. This is a crude way to implement subroutines/ functions. Beware of nested loops and unwanted triggerings... Stack usage might be a problem. Characters and objects referred to must be in the same room with the mobile. FLEE - Forces the mobile to flee. STATUS - An integar the mob can set/change on itself. PORTALTO (vnum to) (portal used)- This command let's a mob create a portal between the room it's in, and the room you specify (if you specify a portal then it uses THAT one, so you can use a specific gangplank, door etc). GOTORESET No argument used, this will take the mob back to the room that it loaded in, it's reset room. MOBcommands are special commands that allow mobiles to perform immortal-like actions within a MOB PROGRAM (transferring players or loading items, for example). Most MOBcommands them are wiz commands which have been changed to allow for mobiles to perform the commands. In this version of MOBprograms, players have been prevented from using these commands by adding a separate interpreter for MOBcommands. This also speeds up (in most cases) MOB PROGRAM execution when MOBcommands are used. All MOBcommands are preceded with the word 'MOB' on the command line. MOB STATUS [int] NOTE: STATUS lets you put mobiles in different states, this is simply an integar you attach to them, and can check on them. Syntax Example: if STATUS $i == 0 say My status is 0, going to 1 MOB STATUS 1 end endif if STATUS $i == 1 say My STATUS is 1, going to 2 MOB STATUS 2 end endif if STATUS $i == 2 say My STATUS is 2, going to 0 MOB STATUS 0 end endif end Note: (the 'end' in each check, good thing, or the mob will keep going) This command can make the mob MUCH more intelligent to react with. Many thanks to Tyche. MOB ASOUND [string] MOB ZECHO [string] MOB GECHO [string] NOTE: ASOUND prints the text string to the rooms around the mobile in the same manner as a death cry. This is really useful for powerful aggressives and is also nice for wandering minstrels or mobiles like that in concept. (Or certain gnomish contraptions ;0) ZECHO prints the string to all players in the same area with the mobile. Short for Zone Echo. GECHO prints the string to all players in the game. Short for Global Echo. MOB ECHO [string] MOB ECHOAT [victim] [string] MOB ECHOAROUND [victim] [string] Note: ECHO displays the string to everyone in the room. ECHOAT displays the string to the victim only. ECHOAROUND displays the string to everyone except the victim. The three options let you tailor the message to goto victims or to do things sneaky like having a merchant do: mob at guard mob echoat guard rescue_please This coupled with a guard act trigger on rescue_please to: mob goto $n mob echo $I has arrived. It is an affective way of quickly bringing guards to the scene of an attack. (Note that the merchant has to be the only one of its kind in the game or have a unique name, otherwise the guard might go to different mobile...). MOB MLOAD [vnum] MOB OLOAD [vnum] {'room'|'wear'} (without second argument, loads in inventory) Note: MLOAD creates a mobile and places it in the same room with the mobile. OLOAD loads the object into the inventory of the mobile. Even if the item is non-takable, the mobile will receive it in the inventory. This lets a mobile distribute a quest item or load a key or something. The optional 3rd parameter can be specified; 'room' means to load the object to the room, 'wear' means to force the mobile to wear the object loaded (useful for equipping mobiles on the fly). MOB KILL [victim] Note: Lets a mobile kill a player without having to murder. Many MOBprograms end up with mob kill $n commands floating around. It works on both mobiles and players. MOB FLEE Note: Causes a mobile to unconditionally flee from combat. Can be used for example with the hit point percentage trigger to simulate "wimpy" behavior. MOB REMOVE [victim] [vnum|'all'] Note: Lets the mobile to strip an object of given vnum from the victim. Objects removed are destroyed. If the vnum is replaced with "all", the whole inventory of the victim is destroyed. This command is probably most useful for extracting quest items from a player after a quest has been completed. MOB JUNK [object] Note: Destroys the object referred to in the mobile's inventory. It prints no message to the world and you can do things like junk all.bread or junk all. This is nice for having janitor mobiles clean out their inventory if they are carrying too much (have a MOB PROGRAM trigger on the 'full inventory') MOB PURGE [argument] Note: Destroys the argument from the room of the mobile. Without an argument the result is the cleansing of all NPC's and items from the room with the exception of the mobile itself. However, mppurge $i will indeed purge the mobile, but it MUST be the last command the mobile tries to do, otherwise the mud cant reference the acting mobile trying to do the commands and bad things happen. MOB AT [location] [command] Note: Performs the command at the designated location. Very useful for doing magic slight of hand tricks that leave players dumbfounded.. such as metamorphing mobiles, or guard summoning, or corpse vanishing. MOB GOTO [location] Note: Moves the mobile to the room or mobile or object requested. It makes no message of its departure or of its entrance, so these must be supplied with echo commands if they are desired. MOB TRANSFER [victim/'all'] [location] MOB GTRANSFER [victim] [location] MOB OTRANSFER [object] [location] Note: Sends the victim to the destination or to the room of the mobile as a default. if the victim is "all" then all the characters in the room of the mobile are transferred to the destination. Good for starting quests or things like that. There is no message given to the player that it has been transferred and the player doesn't do a look at the new room unless the mob forces them to. Gtransfer works like transfer, except that the group the victim belongs to is transferred with the victim. Otransfer transfers an object in the room. MOB FORCE [victim/'all'] [command] MOB GFORCE [victim] [command] MOB VFORCE [vnum] [command] ***** Didn't seem to work on Ansalon Note: Forces the victim to do the designated command. The victim is not told that they are forced, they just do the command so usually some MOB ECHO message is nice. You can force players to remove belongings and give them to you, etc. The player sees the normal command messages (such as removing the item and giving it away in the above example) Again, if the victim is "all" then everyone in the mobiles room does the command. Gforce works like force except that it affects the group the victim belongs to. Vforce affects all mobiles with given vnum in the game world. This is useful for, for example, purging certain type of NPCs from the game (by forcing them to purge themselves). MOB CAST [spell] [victim] Note: Lets the mobile to cast spells. Beware, this does only crude validity checking and does not use up any mana. All spells are available regardless of the race or other abilities of the mobile. Casting the spell occurs silently, but spell effects are displayed normally. MOB DAMAGE [victim/'all'] [min] [max] {lethal} Note: Causes unconditional damage to the victim. Specifying "all" as victim causes damage to all characters in the room except the mobile. Min and max parameters define the minimum and maximum amounts of damage caused. By default, the damage is non-lethal, but by supplying the optional 'lethal' parameter, the damage can kill the victim. This command is silent, you must echo all messages yourself in the program. Useful for implementing special attacks for mobiles. MOB DELAY MOB CANCEL Note: MOB DELAY sets the time in PULSE_MOBILE after which the mobile's delay trigger is activated. If the mobile has a program defined for delay trigger, the program is executed when the timer expires. MOB CANCEL resets the delay timer. MOB REMEMBER [victim] MOB FORGET Note: This command enables the mobile to remember a player for future reference in a MOB PROGRAM. The player can subsequently be referred as '$q' in programs activated by the mobile. MOB FORGET clears the target. Note that if the first time the mobile runs a program, $q is automatically set to the player who triggered the event. Most commonly this command is used in delayed programs, where the mobile has to remember the player who triggered the original event, for example to continue conversation. MOB CALL [vnum] {victim} {target1} {target2} Note: This command lets you call MOBprograms from within a running one, i.e. to call a MOB PROGRAM subroutine. The first parameter is the vnum of the program to execute, the second is the victim's name (for example $n), and the third and fourth are optional object names. All other parameters except vnum can be replaced with word 'null' indicating ignored parameter. MOBprograms can be called recursively, but as a safety measure, parser allows only 5 recursions (unless altered). MOB PORTALTO [vnum][portal vnum] Note: This command lets mobs link areas with portals, if you don't specify a portal (or use #25) it will vape in 10 ticks. Example: We have a new gangplank portal named gangplank trsgp (Pick a UNIQUE name if you want the mob to be able to find/purge old ones)
  if objexists trsgp
    mob at trsgp mob purge trsgp
   endif
   if objexists trsgp
     mob at trsgp mob purge trsgp
   endif
   say Thanks, we're just arriving at the docks of Caergoth now!
   mob portalto 16200 13610
   mob echo A sailor pushes a gangplank off the stern onto the docks at Caergoth.
   mob vecho 16200 A sailor ties off the Percheron and pushes a gangplank to the dock.
   mob junk ticket
   
Adding the Mobprog to the MOB Commands within Medit (while editing a mob, AFTER mprog created) addmprog [vnum] [trigger] [phrase] Example: (with a mob being edited)(medit) addmprog 13456 greet 80 - This adds mprog 13456 to the mobile, which greets pc's when they enter 80% of the time. delmprog 0 (or 1,2,3 etc) - removes an mprog from a mob. NOTE: [vnum] The vnum of the mob program (mpedit) [trigger] List of valid triggers and explanations above [phrase] A single word, or a phrase within quotes (example: "looks at you" or "yes" etc) Or a percentile (ie '80' happens 80% of the time)

Loading Mobiles and Objects

No doubt you want to load objects and mobiles in your MOBprograms with "mob oload" and "mob mload". There are two problems connected to this. One is that mloaded mobiles will appear without equipment and the other is that it is difficult to keep track of the number of created mobiles and objects. If you want to mobiles to appear in your area as a result of the players' action, create a "storage room". Define resets for the mobiles as usual (equipment etc.) and place them in the storage room. When you need to use the mobiles, just "mob transfer" them to the location you want. This is better than creating mobiles on the fly, since you don't have to worry about creating too many mobiles or equipping them, area resets take care of all that. If you have a MOB PROGRAM that creates new mobiles, you might want to make the mobiles "self-destructing". This is easiest to do with a random trigger that checks if the mobile is doing anything useful and possibly does 'mob purge $i'. Another possibility is to use a "purgemaster". Create a storage room with a single mobile. Attach a random trigger that does 'mob purge' to that mobile. Now, when you need to get rid of anything, just 'mob transfer' the mobile or item to purgemaster, and it will be destroyed sometime later.

Miscellaneous Information

There is really no limit to the number of MOBprograms a given mobile can have. However, the length of a single command block is limited by the value of MAX_STRING_LENGTH. In my version it was around 4k, so that is probably about 100 lines. The indentation spaces shown in the example above are NOT required, but do make it easier to read (and debug). HOWEVER, all spaces and indentations are loaded into memory as a part of the program, so you're using up memory. Memory usage can also be reduced by using subroutines (see MOB CALL). It IS possible to accidentally make mobiles which can trigger in loops. Infinite loops have been prevented, but in case of a loop, the mobile behavior is undefined. An example of a looping action would be using a RANDOM mprog with an UPDATE_ALWAYS mob, this doesn't actually loop, but may cause this error: [*****] BUG: MOBprogs: MAX_CALL_LEVEL exceeded, vnum # (note: vnum refers to calling mob's vnum NOT mprog vnum) this is when too many mprogs are being called simultaneously, and the rom can't deal with them, happens with UPDATE_ALWAYS and RANDOM trigger combinations, especially when there are 20 of the mob, each with 3 random mprogs each, you do the math. The list of variables and triggers and if_checks will grow continuously as mud creators demand the ability to do certain things. If you have a request or if you have a new one, I don't mind hearing about them, and if you find bugs, I shall gladly attempt to squash them for you. As additions or fixes are made, the code will occasionally be redistributed. However, if you want a current version, please feel free to ask. When the code is redistributed, a file containing the change history from the original release will be provided (when possible) to allow you to patch in the changes with low grief. - Note: Who do we call again? If someone knows, please let the immortal staff know.

CREDITS

The reason this code was written was to enhance the playing experience at ThePrincedom (a Merc 2.0 based world scheduled to open in October 1993) The original idea for this type of MOB PROGRAM came from playing on: WORLDS of CARNAGE, a DIKU MUD implemented by Robbie Roberts and Aaron Buhr. Aaron (known as Dimwit Flathead the First) was the original author from what I have been told, and I hope he will not be totally offended and angered by my coding and sharing a mimicked version with the world. This version is probably not as good as the original and I do feel remorse for publishing the idea. However, since Carnage has been down for months without a word of information regarding its return, I am glad to let one of the best features live on in future generations of MUDs. There are no objections to this code being shared, since, aside from a nuclear destruction of all the Temples of Midgaard (excepting the original one!!), bland mobiles are the greatest bane of Dikumuds today. It would be nice to get a message saying you are using the code just for our references. We shant answer questions from anyone until told where they are using the code. *grin* Since this code is not copyrighted, you of course dont have to do anything we say, but it would be nice of you to put the mobprog help screen into your database. and have mobinfo show up somewhere on a more visible help screen (possibly tagged onto the bottom of credits as a see also...) I acknowledge all the work done by the original Diku authors as well as those at Merc Industries and appreciate their willingness to share code. Also, quick thanks to Wraith for doing a little beta-installation testing. N'Atas-Ha June, 1993 natasha@gs118.sp.cs.cmu.edu In addition to this DOC file credit section, I'd like to add a thank you to Yaz, Mahatma, Zelda, and the rest of the 4th Realm crew for extensively testing MOB PROGRAM 2.1 for me. You may see MOBPrograms in action as well as their own "flavor" of mud at marble.bu.edu 4000. Kahn Oct 28th, 1993 MERC Industries

MORE CREDITS

This text was compiled from several mob prog/mpedit texts in order to give you a more complete guide to mob progs in Ansalon (Rom 2.4 based in 1996) The previous credits/copyrights are for the 'extended' or 'more info' parts which I added to the existing document to further explain functions/syntax etc. Other notes and examples added from my trials in CRASHING MUD! As I rewrite code and write better explanations of how to use the different aspects of mobprogs, they are updated here. Zivilyn aka Skol December 10th, 2001 - Jul 11th, 2008 Ansalon This document was created for use with Ansalon, ROM 2.4 and OLC on... http://www.ansalonmud.com http://ansalon.wolfpaw.net telnet://ansalonmud.com:8679 telnet://ansalon.wolfpaw.net:8679 telnet://204.209.44.23:8679 Version 2.3.3 July 16, 2008 PS. If you run into questions/scenario's not handled here, feel free to talk with me about them. If they are something that needs to be added or discussed, I'll be happy to do so. - Skol. http://www.copyright.gov/title17/92chap5.html#506 "d) Fraudulent Removal of Copyright Notice. - Any person who, with fraudulent intent, removes or alters any notice of copyright appearing on a copy of a copyrighted work shall be fined not more than $2,500." Meaning? You can feel free to use and modify these documents, but if you remove the copyright and/or credit statements, you're in violation of federal law. This means any derivative work must bear these. Most would never need to be told this, but apparently some live by different rules. Of course their versions tend to crash and burn... RIP.