Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

mob_prog.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <ctype.h>
#include "merc.h"
#include "tables.h"
#include "lookup.h"

Include dependency graph for mob_prog.c:

Go to the source code of this file.

Defines

#define BEGIN_BLOCK   0
#define CHK_ACT   (26)
#define CHK_AFFECTED   (25)
#define CHK_ALIGN   (44)
#define CHK_CARRIES   (29)
#define CHK_CLAN   (35)
#define CHK_CLASS   (37)
#define CHK_CLONES   (8)
#define CHK_EXISTS   (24)
#define CHK_GRPSIZE   (51)
#define CHK_HAS   (31)
#define CHK_HASTARGET   (22)
#define CHK_HOUR   (10)
#define CHK_HPCNT   (40)
#define CHK_IMM   (28)
#define CHK_ISACTIVE   (19)
#define CHK_ISCHARM   (17)
#define CHK_ISDELAY   (20)
#define CHK_ISEVIL   (14)
#define CHK_ISFOLLOW   (18)
#define CHK_ISGOOD   (13)
#define CHK_ISIMMORT   (16)
#define CHK_ISNEUTRAL   (15)
#define CHK_ISNPC   (12)
#define CHK_ISPC   (11)
#define CHK_ISTARGET   (23)
#define CHK_ISVISIBLE   (21)
#define CHK_LEVEL   (43)
#define CHK_MOBEXISTS   (3)
#define CHK_MOBHERE   (1)
#define CHK_MOBS   (7)
#define CHK_MONEY   (45)
#define CHK_NAME   (33)
#define CHK_OBJEXISTS   (4)
#define CHK_OBJHERE   (2)
#define CHK_OBJTYPE   (38)
#define CHK_OBJVAL0   (46)
#define CHK_OBJVAL1   (47)
#define CHK_OBJVAL2   (48)
#define CHK_OBJVAL3   (49)
#define CHK_OBJVAL4   (50)
#define CHK_OFF   (27)
#define CHK_ORDER   (9)
#define CHK_PEOPLE   (5)
#define CHK_PLAYERS   (6)
#define CHK_POS   (34)
#define CHK_RACE   (36)
#define CHK_RAND   (0)
#define CHK_ROOM   (41)
#define CHK_SEX   (42)
#define CHK_USES   (32)
#define CHK_VNUM   (39)
#define CHK_WEARS   (30)
#define END_BLOCK   -2
#define EVAL_EQ   0
#define EVAL_GE   1
#define EVAL_GT   3
#define EVAL_LE   2
#define EVAL_LT   4
#define EVAL_NE   5
#define IN_BLOCK   -1
#define MAX_CALL_LEVEL   10
#define MAX_NESTED_LEVEL   12

Functions

int cmd_eval (int vnum, char *line, int check, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, CHAR_DATA *rch)
int count_people_room (CHAR_DATA *mob, int iFlag)
void expand_arg (char *buf, const char *format, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, CHAR_DATA *rch)
int flag_lookup (const char *word, const struct flag_type *flag_table)
bool get_mob_vnum_room (CHAR_DATA *ch, int vnum)
bool get_obj_vnum_room (CHAR_DATA *ch, int vnum)
int get_order (CHAR_DATA *ch)
CHAR_DATAget_random_char (CHAR_DATA *mob)
bool has_item (CHAR_DATA *ch, int vnum, sh_int item_type, bool fWear)
int keyword_lookup (const char **table, char *keyword)
void mp_act_trigger (char *argument, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, int type)
void mp_bribe_trigger (CHAR_DATA *mob, CHAR_DATA *ch, int amount)
bool mp_exit_trigger (CHAR_DATA *ch, int dir)
void mp_give_trigger (CHAR_DATA *mob, CHAR_DATA *ch, OBJ_DATA *obj)
void mp_greet_trigger (CHAR_DATA *ch)
void mp_hprct_trigger (CHAR_DATA *mob, CHAR_DATA *ch)
bool mp_percent_trigger (CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, int type)
int num_eval (int lval, int oper, int rval)
void program_flow (int pvnum, char *source, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2)

Variables

const char * fn_evals []
const char * fn_keyword []


Define Documentation

#define BEGIN_BLOCK   0
 

Definition at line 934 of file mob_prog.c.

Referenced by program_flow().

#define CHK_ACT   (26)
 

Definition at line 80 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_AFFECTED   (25)
 

Definition at line 79 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ALIGN   (44)
 

Definition at line 98 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_CARRIES   (29)
 

Definition at line 83 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_CLAN   (35)
 

Definition at line 89 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_CLASS   (37)
 

Definition at line 91 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_CLONES   (8)
 

Definition at line 62 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_EXISTS   (24)
 

Definition at line 78 of file mob_prog.c.

#define CHK_GRPSIZE   (51)
 

Definition at line 105 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_HAS   (31)
 

Definition at line 85 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_HASTARGET   (22)
 

Definition at line 76 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_HOUR   (10)
 

Definition at line 64 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_HPCNT   (40)
 

Definition at line 94 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_IMM   (28)
 

Definition at line 82 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISACTIVE   (19)
 

Definition at line 73 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISCHARM   (17)
 

Definition at line 71 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISDELAY   (20)
 

Definition at line 74 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISEVIL   (14)
 

Definition at line 68 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISFOLLOW   (18)
 

Definition at line 72 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISGOOD   (13)
 

Definition at line 67 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISIMMORT   (16)
 

Definition at line 70 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISNEUTRAL   (15)
 

Definition at line 69 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISNPC   (12)
 

Definition at line 66 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISPC   (11)
 

Definition at line 65 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISTARGET   (23)
 

Definition at line 77 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ISVISIBLE   (21)
 

Definition at line 75 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_LEVEL   (43)
 

Definition at line 97 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_MOBEXISTS   (3)
 

Definition at line 57 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_MOBHERE   (1)
 

Definition at line 55 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_MOBS   (7)
 

Definition at line 61 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_MONEY   (45)
 

Definition at line 99 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_NAME   (33)
 

Definition at line 87 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJEXISTS   (4)
 

Definition at line 58 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJHERE   (2)
 

Definition at line 56 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJTYPE   (38)
 

Definition at line 92 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJVAL0   (46)
 

Definition at line 100 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJVAL1   (47)
 

Definition at line 101 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJVAL2   (48)
 

Definition at line 102 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJVAL3   (49)
 

Definition at line 103 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OBJVAL4   (50)
 

Definition at line 104 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_OFF   (27)
 

Definition at line 81 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ORDER   (9)
 

Definition at line 63 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_PEOPLE   (5)
 

Definition at line 59 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_PLAYERS   (6)
 

Definition at line 60 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_POS   (34)
 

Definition at line 88 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_RACE   (36)
 

Definition at line 90 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_RAND   (0)
 

Definition at line 54 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_ROOM   (41)
 

Definition at line 95 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_SEX   (42)
 

Definition at line 96 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_USES   (32)
 

Definition at line 86 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_VNUM   (39)
 

Definition at line 93 of file mob_prog.c.

Referenced by cmd_eval().

#define CHK_WEARS   (30)
 

Definition at line 84 of file mob_prog.c.

Referenced by cmd_eval().

#define END_BLOCK   -2
 

Definition at line 936 of file mob_prog.c.

Referenced by program_flow().

#define EVAL_EQ   0
 

Definition at line 110 of file mob_prog.c.

Referenced by num_eval().

#define EVAL_GE   1
 

Definition at line 111 of file mob_prog.c.

Referenced by num_eval().

#define EVAL_GT   3
 

Definition at line 113 of file mob_prog.c.

Referenced by num_eval().

#define EVAL_LE   2
 

Definition at line 112 of file mob_prog.c.

Referenced by num_eval().

#define EVAL_LT   4
 

Definition at line 114 of file mob_prog.c.

Referenced by num_eval().

#define EVAL_NE   5
 

Definition at line 115 of file mob_prog.c.

Referenced by num_eval().

#define IN_BLOCK   -1
 

Definition at line 935 of file mob_prog.c.

Referenced by program_flow().

#define MAX_CALL_LEVEL   10
 

Definition at line 937 of file mob_prog.c.

Referenced by program_flow().

#define MAX_NESTED_LEVEL   12
 

Definition at line 933 of file mob_prog.c.

Referenced by program_flow().


Function Documentation

int cmd_eval int  vnum,
char *  line,
int  check,
CHAR_DATA mob,
CHAR_DATA ch,
const void *  arg1,
const void *  arg2,
CHAR_DATA rch
 

Definition at line 356 of file mob_prog.c.

References char_data::act, act_flags, AFF_CHARM, affect_flags, char_data::affected_by, char_data::alignment, bug(), can_see(), can_see_obj(), CHK_ACT, CHK_AFFECTED, CHK_ALIGN, CHK_CARRIES, CHK_CLAN, CHK_CLASS, CHK_CLONES, CHK_GRPSIZE, CHK_HAS, CHK_HASTARGET, CHK_HOUR, CHK_HPCNT, CHK_IMM, CHK_ISACTIVE, CHK_ISCHARM, CHK_ISDELAY, CHK_ISEVIL, CHK_ISFOLLOW, CHK_ISGOOD, CHK_ISIMMORT, CHK_ISNEUTRAL, CHK_ISNPC, CHK_ISPC, CHK_ISTARGET, CHK_ISVISIBLE, CHK_LEVEL, CHK_MOBEXISTS, CHK_MOBHERE, CHK_MOBS, CHK_MONEY, CHK_NAME, CHK_OBJEXISTS, CHK_OBJHERE, CHK_OBJTYPE, CHK_OBJVAL0, CHK_OBJVAL1, CHK_OBJVAL2, CHK_OBJVAL3, CHK_OBJVAL4, CHK_OFF, CHK_ORDER, CHK_PEOPLE, CHK_PLAYERS, CHK_POS, CHK_RACE, CHK_RAND, CHK_ROOM, CHK_SEX, CHK_USES, CHK_VNUM, CHK_WEARS, clan_lookup(), class_lookup(), count_people_room(), FALSE, flag_lookup(), fn_evals, get_char_room(), get_char_world(), get_mob_vnum_room(), get_obj_carry(), get_obj_here(), get_obj_vnum_room(), get_obj_wear(), get_obj_world(), get_order(), get_random_char(), char_data::gold, has_item(), char_data::hit, time_info_data::hour, imm_flags, char_data::imm_flags, char_data::in_room, IS_AFFECTED, IS_EVIL, IS_GOOD, IS_IMMORTAL, is_name(), IS_NEUTRAL, IS_NPC, is_number(), IS_SET, item_lookup(), obj_data::item_type, keyword_lookup(), char_data::level, char_data::max_hit, MAX_INPUT_LENGTH, char_data::mprog_target, obj_data::name, num_eval(), number_percent(), off_flags, char_data::off_flags, one_argument(), original, obj_data::pIndexData, char_data::pIndexData, POS_SLEEPING, position_lookup(), race_lookup(), char_data::sex, char_data::silver, time_info, TRUE, UMAX, obj_data::value, room_index_data::vnum, obj_index_data::vnum, and mob_index_data::vnum.

Referenced by program_flow().

00359 {
00360     CHAR_DATA *lval_char = mob;
00361     CHAR_DATA *vch = (CHAR_DATA *) arg2;
00362     OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
00363     OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
00364     OBJ_DATA *lval_obj = NULL;
00365 
00366     char *original, buf[MAX_INPUT_LENGTH], code;
00367     int lval = 0, oper = 0, rval = -1;
00368 
00369     original = line;
00370     line = one_argument (line, buf);
00371     if (buf[0] == '\0' || mob == NULL)
00372         return FALSE;
00373 
00374     /*
00375      * If this mobile has no target, let's assume our victim is the one
00376      */
00377     if (mob->mprog_target == NULL)
00378         mob->mprog_target = ch;
00379 
00380     switch (check)
00381     {
00382             /*
00383              * Case 1: keyword and value
00384              */
00385         case CHK_RAND:
00386             return (atoi (buf) < number_percent ());
00387         case CHK_MOBHERE:
00388             if (is_number (buf))
00389                 return (get_mob_vnum_room (mob, atoi (buf)));
00390             else
00391                 return ((bool) (get_char_room (mob, buf) != NULL));
00392         case CHK_OBJHERE:
00393             if (is_number (buf))
00394                 return (get_obj_vnum_room (mob, atoi (buf)));
00395             else
00396                 return ((bool) (get_obj_here (mob, buf) != NULL));
00397         case CHK_MOBEXISTS:
00398             return ((bool) (get_char_world (mob, buf) != NULL));
00399         case CHK_OBJEXISTS:
00400             return ((bool) (get_obj_world (mob, buf) != NULL));
00401             /*
00402              * Case 2 begins here: We sneakily use rval to indicate need
00403              *             for numeric eval...
00404              */
00405         case CHK_PEOPLE:
00406             rval = count_people_room (mob, 0);
00407             break;
00408         case CHK_PLAYERS:
00409             rval = count_people_room (mob, 1);
00410             break;
00411         case CHK_MOBS:
00412             rval = count_people_room (mob, 2);
00413             break;
00414         case CHK_CLONES:
00415             rval = count_people_room (mob, 3);
00416             break;
00417         case CHK_ORDER:
00418             rval = get_order (mob);
00419             break;
00420         case CHK_HOUR:
00421             rval = time_info.hour;
00422             break;
00423         default:;
00424     }
00425 
00426     /*
00427      * Case 2 continued: evaluate expression
00428      */
00429     if (rval >= 0)
00430     {
00431         if ((oper = keyword_lookup (fn_evals, buf)) < 0)
00432         {
00433             sprintf (buf, "Cmd_eval: prog %d syntax error(2) '%s'",
00434                      vnum, original);
00435             bug (buf, 0);
00436             return FALSE;
00437         }
00438         one_argument (line, buf);
00439         lval = rval;
00440         rval = atoi (buf);
00441         return (num_eval (lval, oper, rval));
00442     }
00443 
00444     /*
00445      * Case 3,4,5: Grab actors from $* codes
00446      */
00447     if (buf[0] != '$' || buf[1] == '\0')
00448     {
00449         sprintf (buf, "Cmd_eval: prog %d syntax error(3) '%s'",
00450                  vnum, original);
00451         bug (buf, 0);
00452         return FALSE;
00453     }
00454     else
00455         code = buf[1];
00456     switch (code)
00457     {
00458         case 'i':
00459             lval_char = mob;
00460             break;
00461         case 'n':
00462             lval_char = ch;
00463             break;
00464         case 't':
00465             lval_char = vch;
00466             break;
00467         case 'r':
00468             lval_char = rch == NULL ? get_random_char (mob) : rch;
00469             break;
00470         case 'o':
00471             lval_obj = obj1;
00472             break;
00473         case 'p':
00474             lval_obj = obj2;
00475             break;
00476         case 'q':
00477             lval_char = mob->mprog_target;
00478             break;
00479         default:
00480             sprintf (buf, "Cmd_eval: prog %d syntax error(4) '%s'",
00481                      vnum, original);
00482             bug (buf, 0);
00483             return FALSE;
00484     }
00485     /*
00486      * From now on, we need an actor, so if none was found, bail out
00487      */
00488     if (lval_char == NULL && lval_obj == NULL)
00489         return FALSE;
00490 
00491     /*
00492      * Case 3: Keyword, comparison and value
00493      */
00494     switch (check)
00495     {
00496         case CHK_ISPC:
00497             return (lval_char != NULL && !IS_NPC (lval_char));
00498         case CHK_ISNPC:
00499             return (lval_char != NULL && IS_NPC (lval_char));
00500         case CHK_ISGOOD:
00501             return (lval_char != NULL && IS_GOOD (lval_char));
00502         case CHK_ISEVIL:
00503             return (lval_char != NULL && IS_EVIL (lval_char));
00504         case CHK_ISNEUTRAL:
00505             return (lval_char != NULL && IS_NEUTRAL (lval_char));
00506         case CHK_ISIMMORT:
00507             return (lval_char != NULL && IS_IMMORTAL (lval_char));
00508         case CHK_ISCHARM:        /* A relic from MERC 2.2 MOBprograms */
00509             return (lval_char != NULL && IS_AFFECTED (lval_char, AFF_CHARM));
00510         case CHK_ISFOLLOW:
00511             return (lval_char != NULL && lval_char->master != NULL
00512                     && lval_char->master->in_room == lval_char->in_room);
00513         case CHK_ISACTIVE:
00514             return (lval_char != NULL && lval_char->position > POS_SLEEPING);
00515         case CHK_ISDELAY:
00516             return (lval_char != NULL && lval_char->mprog_delay > 0);
00517         case CHK_ISVISIBLE:
00518             switch (code)
00519             {
00520                 default:
00521                 case 'i':
00522                 case 'n':
00523                 case 't':
00524                 case 'r':
00525                 case 'q':
00526                     return (lval_char != NULL && can_see (mob, lval_char));
00527                 case 'o':
00528                 case 'p':
00529                     return (lval_obj != NULL && can_see_obj (mob, lval_obj));
00530             }
00531         case CHK_HASTARGET:
00532             return (lval_char != NULL && lval_char->mprog_target != NULL
00533                     && lval_char->in_room ==
00534                     lval_char->mprog_target->in_room);
00535         case CHK_ISTARGET:
00536             return (lval_char != NULL && mob->mprog_target == lval_char);
00537         default:;
00538     }
00539 
00540     /* 
00541      * Case 4: Keyword, actor and value
00542      */
00543     line = one_argument (line, buf);
00544     switch (check)
00545     {
00546         case CHK_AFFECTED:
00547             return (lval_char != NULL
00548                     && IS_SET (lval_char->affected_by,
00549                                flag_lookup (buf, affect_flags)));
00550         case CHK_ACT:
00551             return (lval_char != NULL
00552                     && IS_SET (lval_char->act, flag_lookup (buf, act_flags)));
00553         case CHK_IMM:
00554             return (lval_char != NULL
00555                     && IS_SET (lval_char->imm_flags,
00556                                flag_lookup (buf, imm_flags)));
00557         case CHK_OFF:
00558             return (lval_char != NULL
00559                     && IS_SET (lval_char->off_flags,
00560                                flag_lookup (buf, off_flags)));
00561         case CHK_CARRIES:
00562             if (is_number (buf))
00563                 return (lval_char != NULL
00564                         && has_item (lval_char, atoi (buf), -1, FALSE));
00565             else
00566                 return (lval_char != NULL
00567                         && (get_obj_carry (lval_char, buf, lval_char) !=
00568                             NULL));
00569         case CHK_WEARS:
00570             if (is_number (buf))
00571                 return (lval_char != NULL
00572                         && has_item (lval_char, atoi (buf), -1, TRUE));
00573             else
00574                 return (lval_char != NULL
00575                         && (get_obj_wear (lval_char, buf) != NULL));
00576         case CHK_HAS:
00577             return (lval_char != NULL
00578                     && has_item (lval_char, -1, item_lookup (buf), FALSE));
00579         case CHK_USES:
00580             return (lval_char != NULL
00581                     && has_item (lval_char, -1, item_lookup (buf), TRUE));
00582         case CHK_NAME:
00583             switch (code)
00584             {
00585                 default:
00586                 case 'i':
00587                 case 'n':
00588                 case 't':
00589                 case 'r':
00590                 case 'q':
00591                     return (lval_char != NULL
00592                             && is_name (buf, lval_char->name));
00593                 case 'o':
00594                 case 'p':
00595                     return (lval_obj != NULL
00596                             && is_name (buf, lval_obj->name));
00597             }
00598         case CHK_POS:
00599             return (lval_char != NULL
00600                     && lval_char->position == position_lookup (buf));
00601         case CHK_CLAN:
00602             return (lval_char != NULL
00603                     && lval_char->clan == clan_lookup (buf));
00604         case CHK_RACE:
00605             return (lval_char != NULL
00606                     && lval_char->race == race_lookup (buf));
00607         case CHK_CLASS:
00608             return (lval_char != NULL
00609                     && lval_char->class == class_lookup (buf));
00610         case CHK_OBJTYPE:
00611             return (lval_obj != NULL
00612                     && lval_obj->item_type == item_lookup (buf));
00613         default:;
00614     }
00615 
00616     /*
00617      * Case 5: Keyword, actor, comparison and value
00618      */
00619     if ((oper = keyword_lookup (fn_evals, buf)) < 0)
00620     {
00621         sprintf (buf, "Cmd_eval: prog %d syntax error(5): '%s'",
00622                  vnum, original);
00623         bug (buf, 0);
00624         return FALSE;
00625     }
00626     one_argument (line, buf);
00627     rval = atoi (buf);
00628 
00629     switch (check)
00630     {
00631         case CHK_VNUM:
00632             switch (code)
00633             {
00634                 default:
00635                 case 'i':
00636                 case 'n':
00637                 case 't':
00638                 case 'r':
00639                 case 'q':
00640                     if (lval_char != NULL && IS_NPC (lval_char))
00641                         lval = lval_char->pIndexData->vnum;
00642                     break;
00643                 case 'o':
00644                 case 'p':
00645                     if (lval_obj != NULL)
00646                         lval = lval_obj->pIndexData->vnum;
00647             }
00648             break;
00649         case CHK_HPCNT:
00650             if (lval_char != NULL)
00651                 lval =
00652                     (lval_char->hit * 100) / (UMAX (1, lval_char->max_hit));
00653             break;
00654         case CHK_ROOM:
00655             if (lval_char != NULL && lval_char->in_room != NULL)
00656                 lval = lval_char->in_room->vnum;
00657             break;
00658         case CHK_SEX:
00659             if (lval_char != NULL)
00660                 lval = lval_char->sex;
00661             break;
00662         case CHK_LEVEL:
00663             if (lval_char != NULL)
00664                 lval = lval_char->level;
00665             break;
00666         case CHK_ALIGN:
00667             if (lval_char != NULL)
00668                 lval = lval_char->alignment;
00669             break;
00670         case CHK_MONEY:        /* Money is converted to silver... */
00671             if (lval_char != NULL)
00672                 lval = lval_char->gold + (lval_char->silver * 100);
00673             break;
00674         case CHK_OBJVAL0:
00675             if (lval_obj != NULL)
00676                 lval = lval_obj->value[0];
00677             break;
00678         case CHK_OBJVAL1:
00679             if (lval_obj != NULL)
00680                 lval = lval_obj->value[1];
00681             break;
00682         case CHK_OBJVAL2:
00683             if (lval_obj != NULL)
00684                 lval = lval_obj->value[2];
00685             break;
00686         case CHK_OBJVAL3:
00687             if (lval_obj != NULL)
00688                 lval = lval_obj->value[3];
00689             break;
00690         case CHK_OBJVAL4:
00691             if (lval_obj != NULL)
00692                 lval = lval_obj->value[4];
00693             break;
00694         case CHK_GRPSIZE:
00695             if (lval_char != NULL)
00696                 lval = count_people_room (lval_char, 4);
00697             break;
00698         default:
00699             return FALSE;
00700     }
00701     return (num_eval (lval, oper, rval));
00702 }

Here is the call graph for this function:

int count_people_room CHAR_DATA mob,
int  iFlag
 

Definition at line 263 of file mob_prog.c.

References can_see(), char_data::in_room, IS_NPC, is_same_group(), char_data::next_in_room, and room_index_data::people.

Referenced by cmd_eval().

00264 {
00265     CHAR_DATA *vch;
00266     int count;
00267     for (count = 0, vch = mob->in_room->people; vch; vch = vch->next_in_room)
00268         if (mob != vch && (iFlag == 0 || (iFlag == 1 && !IS_NPC (vch))
00269                            || (iFlag == 2 && IS_NPC (vch))
00270                            || (iFlag == 3 && IS_NPC (mob) && IS_NPC (vch)
00271                                && mob->pIndexData->vnum ==
00272                                vch->pIndexData->vnum) || (iFlag == 4
00273                                                           &&
00274                                                           is_same_group (mob,
00275                                                                          vch)))
00276             && can_see (mob, vch))
00277             count++;
00278     return (count);
00279 }

Here is the call graph for this function:

void expand_arg char *  buf,
const char *  format,
CHAR_DATA mob,
CHAR_DATA ch,
const void *  arg1,
const void *  arg2,
CHAR_DATA rch
 

Definition at line 711 of file mob_prog.c.

References bug(), can_see(), can_see_obj(), capitalize(), get_random_char(), IS_NPC, MAX_INPUT_LENGTH, obj_data::name, char_data::name, one_argument(), char_data::sex, char_data::short_descr, obj_data::short_descr, and URANGE.

Referenced by program_flow().

00715 {
00716     static char *const he_she[] = { "it", "he", "she" };
00717     static char *const him_her[] = { "it", "him", "her" };
00718     static char *const his_her[] = { "its", "his", "her" };
00719     const char *someone = "someone";
00720     const char *something = "something";
00721     const char *someones = "someone's";
00722 
00723     char fname[MAX_INPUT_LENGTH];
00724     CHAR_DATA *vch = (CHAR_DATA *) arg2;
00725     OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
00726     OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
00727     const char *str;
00728     const char *i;
00729     char *point;
00730 
00731     /*
00732      * Discard null and zero-length messages.
00733      */
00734     if (format == NULL || format[0] == '\0')
00735         return;
00736 
00737     point = buf;
00738     str = format;
00739     while (*str != '\0')
00740     {
00741         if (*str != '$')
00742         {
00743             *point++ = *str++;
00744             continue;
00745         }
00746         ++str;
00747 
00748         switch (*str)
00749         {
00750             default:
00751                 bug ("Expand_arg: bad code %d.", *str);
00752                 i = " <@@@> ";
00753                 break;
00754             case 'i':
00755                 one_argument (mob->name, fname);
00756                 i = fname;
00757                 break;
00758             case 'I':
00759                 i = mob->short_descr;
00760                 break;
00761             case 'n':
00762                 i = someone;
00763                 if (ch != NULL && can_see (mob, ch))
00764                 {
00765                     one_argument (ch->name, fname);
00766                     i = capitalize (fname);
00767                 }
00768                 break;
00769             case 'N':
00770                 i = (ch != NULL && can_see (mob, ch))
00771                     ? (IS_NPC (ch) ? ch->short_descr : ch->name) : someone;
00772                 break;
00773             case 't':
00774                 i = someone;
00775                 if (vch != NULL && can_see (mob, vch))
00776                 {
00777                     one_argument (vch->name, fname);
00778                     i = capitalize (fname);
00779                 }
00780                 break;
00781             case 'T':
00782                 i = (vch != NULL && can_see (mob, vch))
00783                     ? (IS_NPC (vch) ? vch->short_descr : vch->name) : someone;
00784                 break;
00785             case 'r':
00786                 if (rch == NULL)
00787                     rch = get_random_char (mob);
00788                 i = someone;
00789                 if (rch != NULL && can_see (mob, rch))
00790                 {
00791                     one_argument (rch->name, fname);
00792                     i = capitalize (fname);
00793                 }
00794                 break;
00795             case 'R':
00796                 if (rch == NULL)
00797                     rch = get_random_char (mob);
00798                 i = (rch != NULL && can_see (mob, rch))
00799                     ? (IS_NPC (ch) ? ch->short_descr : ch->name) : someone;
00800                 break;
00801             case 'q':
00802                 i = someone;
00803                 if (mob->mprog_target != NULL
00804                     && can_see (mob, mob->mprog_target))
00805                 {
00806                     one_argument (mob->mprog_target->name, fname);
00807                     i = capitalize (fname);
00808                 }
00809                 break;
00810             case 'Q':
00811                 i = (mob->mprog_target != NULL
00812                      && can_see (mob,
00813                                  mob->
00814                                  mprog_target)) ? (IS_NPC (mob->mprog_target)
00815                                                    ? mob->
00816                                                    mprog_target->short_descr :
00817                                                    mob->mprog_target->name) :
00818                     someone;
00819                 break;
00820             case 'j':
00821                 i = he_she[URANGE (0, mob->sex, 2)];
00822                 break;
00823             case 'e':
00824                 i = (ch != NULL && can_see (mob, ch))
00825                     ? he_she[URANGE (0, ch->sex, 2)] : someone;
00826                 break;
00827             case 'E':
00828                 i = (vch != NULL && can_see (mob, vch))
00829                     ? he_she[URANGE (0, vch->sex, 2)] : someone;
00830                 break;
00831             case 'J':
00832                 i = (rch != NULL && can_see (mob, rch))
00833                     ? he_she[URANGE (0, rch->sex, 2)] : someone;
00834                 break;
00835             case 'X':
00836                 i = (mob->mprog_target != NULL
00837                      && can_see (mob, mob->mprog_target)) ? he_she[URANGE (0,
00838                                                                            mob->mprog_target->sex,
00839                                                                            2)]
00840                     : someone; break;
00841             case 'k':
00842                 i = him_her[URANGE (0, mob->sex, 2)];
00843                 break;
00844             case 'm':
00845                 i = (ch != NULL && can_see (mob, ch))
00846                     ? him_her[URANGE (0, ch->sex, 2)] : someone;
00847                 break;
00848             case 'M':
00849                 i = (vch != NULL && can_see (mob, vch))
00850                     ? him_her[URANGE (0, vch->sex, 2)] : someone;
00851                 break;
00852             case 'K':
00853                 if (rch == NULL)
00854                     rch = get_random_char (mob);
00855                 i = (rch != NULL && can_see (mob, rch))
00856                     ? him_her[URANGE (0, rch->sex, 2)] : someone;
00857                 break;
00858             case 'Y':
00859                 i = (mob->mprog_target != NULL
00860                      && can_see (mob, mob->mprog_target)) ? him_her[URANGE (0,
00861                                                                             mob->mprog_target->sex,
00862                                                                             2)]
00863                     : someone; break;
00864             case 'l':
00865                 i = his_her[URANGE (0, mob->sex, 2)];
00866                 break;
00867             case 's':
00868                 i = (ch != NULL && can_see (mob, ch))
00869                     ? his_her[URANGE (0, ch->sex, 2)] : someones;
00870                 break;
00871             case 'S':
00872                 i = (vch != NULL && can_see (mob, vch))
00873                     ? his_her[URANGE (0, vch->sex, 2)] : someones;
00874                 break;
00875             case 'L':
00876                 if (rch == NULL)
00877                     rch = get_random_char (mob);
00878                 i = (rch != NULL && can_see (mob, rch))
00879                     ? his_her[URANGE (0, rch->sex, 2)] : someones;
00880                 break;
00881             case 'Z':
00882                 i = (mob->mprog_target != NULL
00883                      && can_see (mob, mob->mprog_target)) ? his_her[URANGE (0,
00884