/*************************************************************************** * File: bit.c * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * * * * This code was written by Jason Dinkel and inspired by Russ Taylor, * * and has been used here for OLC - OLC would not be what it is without * * all the previous coders who released their source code. * * * ***************************************************************************/ /********************************************************** *************** S U N D E R M U D *** 2 . 0 ************** ********************************************************** * The unique portions of the SunderMud code as well as * * the integration efforts for code from other sources is * * based primarily on the efforts of: * * * * Lotherius <aelfwyne@operamail.com> (Alvin W. Brinson) * * and many others, see "help sundermud" in the mud. * **********************************************************/ /* * The code below uses a table lookup system that is based on suggestions * from Russ Taylor. There are many routines in handler.c that would benefit * with the use of tables. You may consider simplifying your code base by * implementing a system like below with such functions. -Jason Dinkel */ #include "everything.h" struct flag_stat_type { const struct flag_type *structure; bool stat; }; /***************************************************************************** Name: flag_stat_table Purpose: This table catagorizes the tables following the lookup functions below into stats and flags. Flags can be toggled but stats can only be assigned. Update this table when a new set of flags is installed. ****************************************************************************/ const struct flag_stat_type flag_stat_table[] = { /* { structure stat }, */ { area_flags, FALSE}, { sex_flags, TRUE}, { exit_flags, FALSE}, { door_resets, TRUE}, { room_flags, FALSE}, { sector_flags, TRUE}, { sector_name, TRUE}, { type_flags, TRUE}, { extra_flags, FALSE}, { wear_flags, FALSE}, { act_flags, FALSE}, { affect_flags, FALSE}, { detect_flags, FALSE}, { protect_flags, FALSE}, { apply_flags, TRUE}, { wear_loc_flags, TRUE}, { wear_loc_strings, TRUE}, { weapon_flags, TRUE}, { container_flags, FALSE}, { liquid_flags, TRUE}, { material_type, TRUE}, { form_flags, FALSE}, { part_flags, FALSE}, { ac_type, TRUE}, { size_flags, TRUE}, { position_flags, TRUE}, { off_flags, FALSE}, { imm_flags, FALSE}, { res_flags, FALSE}, { vuln_flags, FALSE}, { weapon_class, TRUE}, { weapon_type, FALSE}, { attack_type, TRUE}, { damage_type, TRUE}, { vflags_armor, FALSE}, {0, 0} }; /***************************************************************************** Name: is_stat( table ) Purpose: Returns TRUE if the table is a stat table and FALSE if flag. Called by: flag_value and flag_string. Note: This function is local and used only in bit.c. ****************************************************************************/ bool is_stat ( const struct flag_type *flag_table ) { int flag; for ( flag = 0; flag_stat_table[flag].structure; flag++ ) { if ( flag_stat_table[flag].structure == flag_table && flag_stat_table[flag].stat ) return TRUE; } return FALSE; } int position_lookup (const char *name) { int pos; for (pos = 0; position_flags[pos].name != NULL; pos++) { if (LOWER(name[0]) == LOWER(position_flags[pos].name[0]) && !str_prefix(name,position_flags[pos].name)) return pos; } return -1; } /* * This function is Russ Taylor's creation. Thanks Russ! * All code copyright (C) Russ Taylor, permission to use and/or distribute * has NOT been granted. Use only in this OLC package has been granted. */ /***************************************************************************** Name: flag_lookup( flag, table ) Purpose: Returns the value of a single, settable flag from the table. Called by: flag_value and flag_string. Note: This function is local and used only in bit.c. ****************************************************************************/ int flag_lookup ( const char *name, const struct flag_type *flag_table ) { int flag; for ( flag = 0; flag_table[flag].name[0] != '\0'; flag++ ) { if ( !str_cmp ( name, flag_table[flag].name ) && flag_table[flag].settable ) return flag_table[flag].bit; } return NO_FLAG; } /***************************************************************************** Name: flag_value( table, flag ) Purpose: Returns the value of the flags entered. Multi-flags accepted. Called by: olc.c and olc_act.c. ****************************************************************************/ int flag_value ( const struct flag_type *flag_table, char *argument ) { char word[MAX_INPUT_LENGTH]; int bit; int marked = 0; bool found = FALSE; if ( is_stat ( flag_table ) ) { /* one_argument( argument, word );*/ if ( ( bit = flag_lookup ( argument, flag_table ) ) != NO_FLAG ) return bit; else return NO_FLAG; } /* * Accept multiple flags. */ for ( ;; ) { argument = one_argument ( argument, word ); if ( word[0] == '\0' ) break; if ( ( bit = flag_lookup ( word, flag_table ) ) != NO_FLAG ) { SET_BIT ( marked, bit ); found = TRUE; } } if ( found ) return marked; else return NO_FLAG; } /***************************************************************************** Name: flag_string( table, flags/stat ) Purpose: Returns string with name(s) of the flags or stat entered. Called by: act_olc.c, olc.c, and olc_save.c. ****************************************************************************/ char *flag_string ( const struct flag_type *flag_table, int bits ) { static char buf[512]; int flag; buf[0] = '\0'; for ( flag = 0; flag_table[flag].name[0] != '\0'; flag++ ) { if ( !is_stat ( flag_table ) && IS_SET ( bits, flag_table[flag].bit ) ) { SLCAT ( buf, " " ); SLCAT ( buf, flag_table[flag].name ); } else if ( flag_table[flag].bit == bits ) { SLCAT ( buf, " " ); SLCAT ( buf, flag_table[flag].name ); break; } } return ( buf[0] != '\0' ) ? buf + 1 : "none"; } const struct flag_type area_flags[] = { {"none", AREA_NONE, FALSE}, {"changed", AREA_CHANGED, TRUE}, {"added", AREA_ADDED, TRUE}, {"loading", AREA_LOADING, FALSE}, {"", 0, 0} }; const struct flag_type sex_flags[] = { {"male", SEX_MALE, TRUE}, {"female", SEX_FEMALE, TRUE}, {"neutral", SEX_NEUTRAL, TRUE}, {"random", SEX_RANDOM, TRUE}, /* ROM */ {"none", SEX_NEUTRAL, TRUE}, {"", 0, 0} }; const struct flag_type exit_flags[] = { {"door", EX_ISDOOR, TRUE}, {"closed", EX_CLOSED, TRUE}, {"locked", EX_LOCKED, TRUE}, {"pickproof", EX_PICKPROOF, TRUE}, {"hidden", EX_HIDDEN, TRUE}, {"no_pass", EX_NO_PASS, TRUE}, {"", 0, 0} }; const struct flag_type door_resets[] = { {"open and unlocked", 0, TRUE}, {"closed and unlocked", 1, TRUE}, {"closed and locked", 2, TRUE}, {"", 0, 0} }; const struct flag_type room_flags[] = { {"dark", ROOM_DARK, TRUE}, {"no_mob", ROOM_NO_MOB, TRUE}, {"indoors", ROOM_INDOORS, TRUE}, {"private", ROOM_PRIVATE, TRUE}, {"safe", ROOM_SAFE, TRUE}, {"solitary", ROOM_SOLITARY, TRUE}, {"pet_shop", ROOM_PET_SHOP, TRUE}, {"no_recall", ROOM_NO_RECALL, TRUE}, {"imp_only", ROOM_IMP_ONLY, TRUE}, {"gods_only", ROOM_GODS_ONLY, TRUE}, {"heroes_only", ROOM_HEROES_ONLY, TRUE}, {"newbies_only", ROOM_NEWBIES_ONLY, TRUE}, {"law", ROOM_LAW, TRUE}, {"fastheal", ROOM_FASTHEAL, TRUE}, {"rent", ROOM_RENT, TRUE}, {"transit", ROOM_TRANSIT, TRUE}, {"pkill", ROOM_PKILL, TRUE}, {"notelepop", ROOM_NOTELEPOP, TRUE}, {"bank", ROOM_BANK, TRUE}, {"", 0, 0} }; const struct flag_type sector_name[] = /* this version used in move_char */ { {"indoors", SECT_INSIDE, TRUE}, {"city", SECT_CITY, TRUE}, {"fields", SECT_FIELD, TRUE}, {"forest", SECT_FOREST, TRUE}, {"hills", SECT_HILLS, TRUE}, {"mountains", SECT_MOUNTAIN, TRUE}, {"water", SECT_WATER_SWIM, TRUE}, {"ocean", SECT_WATER_NOSWIM, TRUE}, {"sky", SECT_AIR, TRUE}, {"desert", SECT_DESERT, TRUE}, {"underground", SECT_UNDERGROUND, TRUE}, {"fort", SECT_FORT, TRUE}, {"", 0, 0} }; const struct flag_type sector_flags[] = /* this version used in OLC */ { {"inside", SECT_INSIDE, TRUE}, {"city", SECT_CITY, TRUE}, {"field", SECT_FIELD, TRUE}, {"forest", SECT_FOREST, TRUE}, {"hills", SECT_HILLS, TRUE}, {"mountain", SECT_MOUNTAIN, TRUE}, {"swim", SECT_WATER_SWIM, TRUE}, {"noswim", SECT_WATER_NOSWIM, TRUE}, {"air", SECT_AIR, TRUE}, {"desert", SECT_DESERT, TRUE}, {"underground", SECT_UNDERGROUND, TRUE}, {"fort", SECT_FORT, TRUE}, {"", 0, 0} }; const struct flag_type type_flags[] = { {"light", ITEM_LIGHT, TRUE}, {"scroll", ITEM_SCROLL, TRUE}, {"wand", ITEM_WAND, TRUE}, {"staff", ITEM_STAFF, TRUE}, {"weapon", ITEM_WEAPON, TRUE}, {"treasure", ITEM_TREASURE, TRUE}, {"armor", ITEM_ARMOR, TRUE}, {"potion", ITEM_POTION, TRUE}, {"furniture", ITEM_FURNITURE, TRUE}, {"trash", ITEM_TRASH, TRUE}, {"container", ITEM_CONTAINER, TRUE}, {"drink container",ITEM_DRINK_CON, TRUE}, {"key", ITEM_KEY, TRUE}, {"food", ITEM_FOOD, TRUE}, {"money", ITEM_MONEY, TRUE}, {"boat", ITEM_BOAT, TRUE}, {"npc corpse", ITEM_CORPSE_NPC,TRUE}, {"pc corpse", ITEM_CORPSE_PC, FALSE}, {"fountain", ITEM_FOUNTAIN, TRUE}, {"pill", ITEM_PILL, TRUE}, {"clothing", ITEM_CLOTHING, TRUE}, {"protect", ITEM_PROTECT, TRUE}, {"map", ITEM_MAP, TRUE}, {"pride", ITEM_PRIDE, TRUE}, {"component", ITEM_COMPONENT, TRUE}, {"portal", ITEM_PORTAL, TRUE}, {"", 0, 0} }; const struct flag_type extra_flags[] = { {"glow", ITEM_GLOW, TRUE}, {"hum", ITEM_HUM, TRUE}, {"dark", ITEM_DARK, TRUE}, {"lock", ITEM_LOCK, TRUE}, {"evil", ITEM_EVIL, TRUE}, {"invis", ITEM_INVIS, TRUE}, {"magic", ITEM_MAGIC, TRUE}, {"nodrop", ITEM_NODROP, TRUE}, {"bless", ITEM_BLESS, TRUE}, {"anti-good", ITEM_ANTI_GOOD, TRUE}, {"anti-evil", ITEM_ANTI_EVIL, TRUE}, {"anti-neutral", ITEM_ANTI_NEUTRAL, TRUE}, {"noremove", ITEM_NOREMOVE, TRUE}, {"inventory", ITEM_INVENTORY, TRUE}, {"nopurge", ITEM_NOPURGE, TRUE}, {"no_sac", ITEM_NO_SAC, TRUE}, {"no_cond", ITEM_NO_COND, TRUE}, {"concealed", ITEM_CONCEALED, TRUE}, {"rot-death", ITEM_ROT_DEATH, TRUE}, {"vis-death", ITEM_VIS_DEATH, TRUE}, {"no_display", ITEM_NODISP, TRUE}, {"", 0, 0} }; const struct flag_type wear_flags[] = { {"take", ITEM_TAKE, TRUE}, {"finger", ITEM_WEAR_FINGER, TRUE}, {"neck", ITEM_WEAR_NECK, TRUE}, {"body", ITEM_WEAR_BODY, TRUE}, {"head", ITEM_WEAR_HEAD, TRUE}, {"legs", ITEM_WEAR_LEGS, TRUE}, {"feet", ITEM_WEAR_FEET, TRUE}, {"hands", ITEM_WEAR_HANDS, TRUE}, {"arms", ITEM_WEAR_ARMS, TRUE}, {"shield", ITEM_WEAR_SHIELD, TRUE}, {"about", ITEM_WEAR_ABOUT, TRUE}, {"waist", ITEM_WEAR_WAIST, TRUE}, {"wrist", ITEM_WEAR_WRIST, TRUE}, {"wield", ITEM_WIELD, TRUE}, {"hold", ITEM_HOLD, TRUE}, {"two-hands", ITEM_TWO_HANDS, TRUE}, {"pride", ITEM_WEAR_PRIDE, TRUE}, {"ears", ITEM_WEAR_EARS, TRUE}, {"face", ITEM_WEAR_FACE, TRUE}, {"float", ITEM_WEAR_FLOAT, TRUE}, {"", 0, 0} }; const struct flag_type act_flags[] = { {"npc", ACT_IS_NPC, FALSE}, {"sentinel", ACT_SENTINEL, TRUE}, {"scavenger", ACT_SCAVENGER, TRUE}, {"aggressive", ACT_AGGRESSIVE, TRUE}, {"stay-area", ACT_STAY_AREA, TRUE}, {"wimpy", ACT_WIMPY, TRUE}, {"pet", ACT_PET, TRUE}, {"follower", ACT_FOLLOWER, TRUE}, // Only true till I take it off the mobs that shouldn't have it. {"practice", ACT_PRACTICE, TRUE}, {"undead", ACT_UNDEAD, TRUE}, {"cleric", ACT_CLERIC, TRUE}, {"mage", ACT_MAGE, TRUE}, {"thief", ACT_THIEF, TRUE}, {"warrior", ACT_WARRIOR, TRUE}, {"soldier", ACT_SOLDIER, TRUE}, {"noalign", ACT_NOALIGN, TRUE}, {"nopurge", ACT_NOPURGE, TRUE}, {"healer", ACT_IS_HEALER, TRUE}, {"telepop", ACT_TELEPOP, TRUE}, {"update-always", ACT_UPDATE_ALWAYS, TRUE}, {"noquest", ACT_NOQUEST, TRUE}, {"norandom", ACT_NORANDOM, TRUE}, {"skillmaster", ACT_SKILLMASTER, TRUE}, {"", 0, 0} }; const struct flag_type affect_flags[] = { {"blind", AFF_BLIND, TRUE}, {"invisible", AFF_INVISIBLE, TRUE}, {"mind-meld", AFF_MELD, TRUE}, {"faerie-fire", AFF_FAERIE_FIRE, TRUE}, {"curse", AFF_CURSE, TRUE}, {"fear", AFF_FEAR, TRUE}, {"poison", AFF_POISON, TRUE}, {"sneak", AFF_SNEAK, TRUE}, {"hide", AFF_HIDE, TRUE}, {"sleep", AFF_SLEEP, TRUE}, {"charm", AFF_CHARM, TRUE}, {"flying", AFF_FLYING, TRUE}, {"pass-door", AFF_PASS_DOOR, TRUE}, {"haste", AFF_HASTE, TRUE}, {"calm", AFF_CALM, TRUE}, {"plague", AFF_PLAGUE, TRUE}, {"weaken", AFF_WEAKEN, TRUE}, {"berserk", AFF_BERSERK, TRUE}, {"swim", AFF_SWIM, TRUE}, {"regeneration", AFF_REGENERATION, TRUE}, {"", 0, 0 } }; const struct flag_type detect_flags[] = { { "shield", AFF_SHIELD, FALSE }, { "mute", AFF_MUTE, FALSE }, { "slow", AFF_SLOW, FALSE }, { "confused", AFF_CONFUSION, FALSE }, { "rally", AFF_RALLY, FALSE }, { "evil", DET_EVIL, TRUE }, { "invis", DET_INVIS, TRUE }, { "magic", DET_MAGIC, TRUE }, { "hidden", DET_HIDDEN, TRUE }, { "infrared", DET_INFRARED, TRUE }, { "dark-vision", DET_DARK_VISION,TRUE }, { "", 0, 0 } }; const struct flag_type protect_flags[] = { { "good", PROT_GOOD, TRUE }, { "evil", PROT_EVIL, TRUE }, { "sanctuary", PROT_SANCTUARY, TRUE }, { "absorb", PROT_ABSORB, TRUE }, { "phased", PROT_PHASED, TRUE }, { "", 0, 0 } }; /* * Used when adding an affect to tell where it goes. * See addaffect and delaffect in act_olc.c */ const struct flag_type apply_flags[] = { {"none", APPLY_NONE, TRUE}, {"strength", APPLY_STR, TRUE}, {"dexterity", APPLY_DEX, TRUE}, {"intelligence", APPLY_INT, TRUE}, {"wisdom", APPLY_WIS, TRUE}, {"constitution", APPLY_CON, TRUE}, {"sex", APPLY_SEX, TRUE}, {"class", APPLY_CLASS, TRUE}, {"level", APPLY_LEVEL, TRUE}, {"age", APPLY_AGE, TRUE}, {"height", APPLY_HEIGHT, TRUE}, {"weight", APPLY_WEIGHT, TRUE}, {"mana", APPLY_MANA, TRUE}, {"hp", APPLY_HIT, TRUE}, {"move", APPLY_MOVE, TRUE}, {"gold", APPLY_GOLD, TRUE}, {"experience", APPLY_EXP, TRUE}, {"ac", APPLY_AC, TRUE}, {"hitroll", APPLY_HITROLL, TRUE}, {"damroll", APPLY_DAMROLL, TRUE}, {"saving-para", APPLY_SAVING_PARA, TRUE}, {"saving-rod", APPLY_SAVING_ROD, TRUE}, {"saving-petri", APPLY_SAVING_PETRI, TRUE}, {"saving-breath", APPLY_SAVING_BREATH, TRUE}, {"saving-spell", APPLY_SAVING_SPELL, TRUE}, {"", 0, 0} }; /* * What is seen. */ const struct flag_type wear_loc_strings[] = { {"in the inventory", WEAR_NONE, TRUE}, {"as a light", WEAR_LIGHT, TRUE}, {"on the left finger", WEAR_FINGER_L, TRUE}, {"on the right finger", WEAR_FINGER_R, TRUE}, {"around the neck (1)", WEAR_NECK_1, TRUE}, {"around the neck (2)", WEAR_NECK_2, TRUE}, {"on the body", WEAR_BODY, TRUE}, {"over the head", WEAR_HEAD, TRUE}, {"on the legs", WEAR_LEGS, TRUE}, {"on the feet", WEAR_FEET, TRUE}, {"on the hands", WEAR_HANDS, TRUE}, {"on the arms", WEAR_ARMS, TRUE}, {"as a shield", WEAR_SHIELD, TRUE}, {"about the shoulders", WEAR_ABOUT, TRUE}, {"around the waist", WEAR_WAIST, TRUE}, {"on the left wrist", WEAR_WRIST_L, TRUE}, {"on the right wrist", WEAR_WRIST_R, TRUE}, {"wielded", WEAR_WIELD, TRUE}, {"with pride", WEAR_PRIDE, TRUE}, {"on the ears", WEAR_EARS, TRUE}, {"on the face", WEAR_FACE, TRUE}, {"floating nearby", WEAR_FLOAT, TRUE}, {"", 0} }; const struct flag_type wear_loc_flags[] = { {"none", WEAR_NONE, TRUE}, {"light", WEAR_LIGHT, TRUE}, {"lfinger", WEAR_FINGER_L, TRUE}, {"rfinger", WEAR_FINGER_R, TRUE}, {"neck1", WEAR_NECK_1, TRUE}, {"neck2", WEAR_NECK_2, TRUE}, {"body", WEAR_BODY, TRUE}, {"head", WEAR_HEAD, TRUE}, {"legs", WEAR_LEGS, TRUE}, {"feet", WEAR_FEET, TRUE}, {"hands", WEAR_HANDS, TRUE}, {"arms", WEAR_ARMS, TRUE}, {"shield", WEAR_SHIELD, TRUE}, {"about", WEAR_ABOUT, TRUE}, {"waist", WEAR_WAIST, TRUE}, {"lwrist", WEAR_WRIST_L, TRUE}, {"rwrist", WEAR_WRIST_R, TRUE}, {"wielded", WEAR_WIELD, TRUE}, {"hold", WEAR_HOLD, TRUE}, {"pride", WEAR_PRIDE, TRUE}, {"ears", WEAR_EARS, TRUE}, {"face", WEAR_FACE, TRUE}, {"float", WEAR_FLOAT, TRUE}, {"", 0, 0} }; const struct flag_type weapon_flags[] = { {"hit", 0, TRUE}, {"slice", 1, TRUE}, {"stab", 2, TRUE}, {"slash", 3, TRUE}, {"whip", 4, TRUE}, {"claw", 5, TRUE}, {"blast", 6, TRUE}, {"pound", 7, TRUE}, {"crush", 8, TRUE}, {"grep", 9, TRUE}, {"bite", 10, TRUE}, {"pierce", 11, TRUE}, {"suction", 12, TRUE}, {"beating", 13, TRUE}, {"digestion", 14, TRUE}, {"charge", 15, TRUE}, {"slap", 16, TRUE}, {"punch", 17, TRUE}, {"wrath", 18, TRUE}, {"magic", 19, TRUE}, {"divine-power", 20, TRUE}, {"cleave", 21, TRUE}, {"scratch", 22, TRUE}, {"peck-pierce", 23, TRUE}, {"peck-bash", 24, TRUE}, {"chop", 25, TRUE}, {"sting", 26, TRUE}, {"smash", 27, TRUE}, {"shocking-bite", 28, TRUE}, {"flaming-bite", 29, TRUE}, {"freezing-bite", 30, TRUE}, {"acidic-bite", 31, TRUE}, {"chomp", 32, TRUE}, {"", 0, TRUE} // Why is this true? Is there a reason? }; const struct flag_type container_flags[] = { {"closeable", 1, TRUE}, {"pickproof", 2, TRUE}, {"closed", 4, TRUE}, {"locked", 8, TRUE}, {"", 0, 0} }; const struct flag_type liquid_flags[] = { {"water", 0, TRUE}, {"beer", 1, TRUE}, {"wine", 2, TRUE}, {"ale", 3, TRUE}, {"dark-ale", 4, TRUE}, {"whisky", 5, TRUE}, {"lemonade", 6, TRUE}, {"firebreather", 7, TRUE}, {"local-specialty", 8, TRUE}, {"slime-mold-juice", 9, TRUE}, {"milk", 10, TRUE}, {"tea", 11, TRUE}, {"coffee", 12, TRUE}, {"blood", 13, TRUE}, {"salt-water", 14, TRUE}, {"cola", 15, TRUE}, {"", 0, 0} }; const struct flag_type form_flags[] = { {"edible", FORM_EDIBLE, TRUE}, {"poison", FORM_POISON, TRUE}, {"magical", FORM_MAGICAL, TRUE}, {"decay", FORM_INSTANT_DECAY, TRUE}, {"other", FORM_OTHER, TRUE}, {"animal", FORM_ANIMAL, TRUE}, {"sentient", FORM_SENTIENT, TRUE}, {"undead", FORM_UNDEAD, TRUE}, {"construct", FORM_CONSTRUCT, TRUE}, {"mist", FORM_MIST, TRUE}, {"intangible", FORM_INTANGIBLE, TRUE}, {"biped", FORM_BIPED, TRUE}, {"centaur", FORM_CENTAUR, TRUE}, {"insect", FORM_INSECT, TRUE}, {"spider", FORM_SPIDER, TRUE}, {"crustacean", FORM_CRUSTACEAN, TRUE}, {"worm", FORM_WORM, TRUE}, {"blob", FORM_BLOB, TRUE}, {"mammal", FORM_MAMMAL, TRUE}, {"bird", FORM_BIRD, TRUE}, {"reptile", FORM_REPTILE, TRUE}, {"snake", FORM_SNAKE, TRUE}, {"dragon", FORM_DRAGON, TRUE}, {"amphibian", FORM_AMPHIBIAN, TRUE}, {"fish", FORM_FISH, TRUE}, {"cold-blood", FORM_COLD_BLOOD, TRUE}, {"", 0, 0} }; const struct flag_type part_flags[] = { {"head", PART_HEAD, TRUE}, {"arms", PART_ARMS, TRUE}, {"legs", PART_LEGS, TRUE}, {"heart", PART_HEART, TRUE}, {"brains", PART_BRAINS, TRUE}, {"guts", PART_GUTS, TRUE}, {"hands", PART_HANDS, TRUE}, {"feet", PART_FEET, TRUE}, {"fingers", PART_FINGERS, TRUE}, {"ear", PART_EAR, TRUE}, {"eye", PART_EYE, TRUE}, {"long-tongue", PART_LONG_TONGUE, TRUE}, {"eyestalks", PART_EYESTALKS, TRUE}, {"tentacles", PART_TENTACLES, TRUE}, {"fins", PART_FINS, TRUE}, {"wings", PART_WINGS, TRUE}, {"tail", PART_TAIL, TRUE}, {"neck", PART_NECK, TRUE}, {"waist", PART_WAIST, TRUE}, {"wrist", PART_WRIST, TRUE}, {"claws", PART_CLAWS, TRUE}, {"fangs", PART_FANGS, TRUE}, {"horns", PART_HORNS, TRUE}, {"scales", PART_SCALES, TRUE}, {"tusks", PART_TUSKS, TRUE}, {"face", PART_FACE, TRUE}, {"", 0, 0} }; const struct flag_type ac_type[] = { {"pierce", AC_PIERCE, TRUE}, {"bash", AC_BASH, TRUE}, {"slash", AC_SLASH, TRUE}, {"exotic", AC_EXOTIC, TRUE}, {"", 0, 0} }; const struct flag_type size_flags[] = { {"tiny", SIZE_TINY, TRUE}, {"small", SIZE_SMALL, TRUE}, {"medium", SIZE_MEDIUM, TRUE}, {"large", SIZE_LARGE, TRUE}, {"huge", SIZE_HUGE, TRUE}, {"giant", SIZE_GIANT, TRUE}, {"", 0, 0}, }; const struct flag_type weapon_class[] = { {"exotic", 0, TRUE}, {"sword", 1, TRUE}, {"dagger", 2, TRUE}, {"spear", 3, TRUE}, {"mace", 4, TRUE}, {"axe", 5, TRUE}, {"flail", 6, TRUE}, {"whip", 7, TRUE}, {"polearm", 8, TRUE}, {"", 0, 0} }; const struct flag_type weapon_type[] = { {"flaming", WEAPON_FLAMING, TRUE}, {"frost", WEAPON_FROST, TRUE}, {"vampiric", WEAPON_VAMPIRIC, TRUE}, {"sharp", WEAPON_SHARP, TRUE}, {"vorpal", WEAPON_VORPAL, TRUE}, {"two-hands", WEAPON_TWO_HANDS, TRUE}, {"acid", WEAPON_ACID, TRUE}, {"lightning", WEAPON_LIGHTNING, TRUE}, {"poisoned", WEAPON_POISON, TRUE}, {"", 0, 0} }; const struct flag_type damage_type[] = { {"none", DAM_NONE, TRUE}, {"bash", DAM_BASH, TRUE}, {"pierce", DAM_PIERCE, TRUE}, {"slash", DAM_SLASH, TRUE}, {"fire", DAM_FIRE, TRUE}, {"cold", DAM_COLD, TRUE}, {"lightning", DAM_LIGHTNING, TRUE}, {"acid", DAM_ACID, TRUE}, {"poison", DAM_POISON, TRUE}, {"negative power", DAM_NEGATIVE, TRUE}, {"holy power", DAM_HOLY, TRUE}, {"energy", DAM_ENERGY, TRUE}, {"mental power", DAM_MENTAL, TRUE}, {"disease", DAM_DISEASE, TRUE}, {"drowning", DAM_DROWNING, TRUE}, {"light", DAM_LIGHT, TRUE}, {"other", DAM_OTHER, FALSE}, {"harm", DAM_HARM, TRUE}, {"bleeding", DAM_BLEEDING, TRUE}, {"", 0, 0} }; // Why is this duplicated? See weapon_flags .... const struct flag_type attack_type[] = { {"hit", 0, TRUE}, {"slice", 1, TRUE}, {"stab", 2, TRUE}, {"slash", 3, TRUE}, {"whip", 4, TRUE}, {"claw", 5, TRUE}, {"blast", 6, TRUE}, {"pound", 7, TRUE}, {"crush", 8, TRUE}, {"grep", 9, TRUE}, {"bite", 10, TRUE}, {"pierce", 11, TRUE}, {"suction", 12, TRUE}, {"beating", 13, TRUE}, {"digestion", 14, TRUE}, {"charge", 15, TRUE}, {"slap", 16, TRUE}, {"punch", 17, TRUE}, {"wrath", 18, TRUE}, {"magic", 19, TRUE}, {"divine power", 20, TRUE}, {"cleave", 21, TRUE}, {"scratch", 22, TRUE}, {"peck", 23, TRUE}, {"chop", 25, TRUE}, {"sting", 26, TRUE}, {"smash", 27, TRUE}, {"shocking bite", 28, TRUE}, {"flaming bite", 29, TRUE}, {"freezing bite", 30, TRUE}, {"acidic bite", 31, TRUE}, {"chomp", 32, TRUE}, {"", 0, 0} }; const struct flag_type off_flags[] = { {"area-attack", OFF_AREA_ATTACK, TRUE}, {"backstab", OFF_BACKSTAB, TRUE}, {"bash", OFF_BASH, TRUE}, {"berserk", OFF_BERSERK, TRUE}, {"disarm", OFF_DISARM, TRUE}, {"dodge", OFF_DODGE, TRUE}, {"fade", OFF_FADE, TRUE}, {"fast", OFF_FAST, TRUE}, {"kick", OFF_KICK, TRUE}, {"kick-dirt", OFF_KICK_DIRT, TRUE}, {"parry", OFF_PARRY, TRUE}, {"rescue", OFF_RESCUE, TRUE}, {"tail", OFF_TAIL, TRUE}, {"trip", OFF_TRIP, TRUE}, {"crush", OFF_CRUSH, TRUE}, {"assist-all", ASSIST_ALL, TRUE}, {"assist-align", ASSIST_ALIGN, TRUE}, {"assist-race", ASSIST_RACE, TRUE}, {"assist-player", ASSIST_PLAYERS, TRUE}, {"assist-guard", ASSIST_GUARD, TRUE}, {"assist-vnum", ASSIST_VNUM, TRUE}, {"racist", OFF_RACIST, TRUE}, {"", 0, 0} }; const struct flag_type imm_flags[] = { {"summon", IMM_SUMMON, TRUE}, {"charm", IMM_CHARM, TRUE}, {"magic", IMM_MAGIC, TRUE}, {"weapon", IMM_WEAPON, TRUE}, {"bash", IMM_BASH, TRUE}, {"pierce", IMM_PIERCE, TRUE}, {"slash", IMM_SLASH, TRUE}, {"fire", IMM_FIRE, TRUE}, {"cold", IMM_COLD, TRUE}, {"lightning", IMM_LIGHTNING, TRUE}, {"acid", IMM_ACID, TRUE}, {"poison", IMM_POISON, TRUE}, {"negative", IMM_NEGATIVE, TRUE}, {"holy", IMM_HOLY, TRUE}, {"energy", IMM_ENERGY, TRUE}, {"mental", IMM_MENTAL, TRUE}, {"disease", IMM_DISEASE, TRUE}, {"drowning", IMM_DROWNING, TRUE}, {"light", IMM_LIGHT, TRUE}, {"", 0, 0} }; const struct flag_type res_flags[] = { {"charm", RES_CHARM, TRUE}, {"magic", RES_MAGIC, TRUE}, {"weapon", RES_WEAPON, TRUE}, {"bash", RES_BASH, TRUE}, {"pierce", RES_PIERCE, TRUE}, {"slash", RES_SLASH, TRUE}, {"fire", RES_FIRE, TRUE}, {"cold", RES_COLD, TRUE}, {"lightning", RES_LIGHTNING, TRUE}, {"acid", RES_ACID, TRUE}, {"poison", RES_POISON, TRUE}, {"negative", RES_NEGATIVE, TRUE}, {"holy", RES_HOLY, TRUE}, {"energy", RES_ENERGY, TRUE}, {"mental", RES_MENTAL, TRUE}, {"disease", RES_DISEASE, TRUE}, {"drowning", RES_DROWNING, TRUE}, {"light", RES_LIGHT, TRUE}, {"", 0, 0} }; const struct flag_type vuln_flags[] = { {"magic", VULN_MAGIC, TRUE}, {"weapon", VULN_WEAPON, TRUE}, {"bash", VULN_BASH, TRUE}, {"pierce", VULN_PIERCE, TRUE}, {"slash", VULN_SLASH, TRUE}, {"fire", VULN_FIRE, TRUE}, {"cold", VULN_COLD, TRUE}, {"lightning", VULN_LIGHTNING, TRUE}, {"acid", VULN_ACID, TRUE}, {"poison", VULN_POISON, TRUE}, {"negative", VULN_NEGATIVE, TRUE}, {"holy", VULN_HOLY, TRUE}, {"energy", VULN_ENERGY, TRUE}, {"mental", VULN_MENTAL, TRUE}, {"disease", VULN_DISEASE, TRUE}, {"drowning", VULN_DROWNING, TRUE}, {"light", VULN_LIGHT, TRUE}, {"wood", VULN_WOOD, TRUE}, {"silver", VULN_SILVER, TRUE}, {"iron", VULN_IRON, TRUE}, {"mithril", VULN_MITHRIL, TRUE}, {"adamantite", VULN_ADAMANTITE, TRUE}, {"steel", VULN_STEEL, TRUE}, {"", 0, 0} }; const struct flag_type material_type[] = { {"none", 0, TRUE}, {"wood", MATERIAL_WOOD, TRUE}, {"iron", MATERIAL_IRON, TRUE}, {"silver", MATERIAL_SILVER, TRUE}, {"gold", MATERIAL_GOLD, TRUE}, {"adamantite", MATERIAL_ADAMANTITE, TRUE}, {"cloth", MATERIAL_CLOTH, TRUE}, {"glass", MATERIAL_GLASS, TRUE}, {"food", MATERIAL_FOOD, TRUE}, {"liquid", MATERIAL_LIQUID, TRUE}, {"mithril", MATERIAL_MITHRIL, TRUE}, {"steel", MATERIAL_STEEL, TRUE}, {"paper", MATERIAL_PAPER, TRUE}, {"meat", MATERIAL_MEAT, TRUE}, {"flesh", MATERIAL_FLESH, TRUE}, {"leather", MATERIAL_LEATHER, TRUE}, {"pill", MATERIAL_PILL, TRUE}, {"vellum", MATERIAL_VELLUM, TRUE}, {"bronze", MATERIAL_BRONZE, TRUE}, {"brass", MATERIAL_BRASS, TRUE}, {"stone", MATERIAL_STONE, TRUE}, {"bone", MATERIAL_BONE, TRUE}, {"unique", MATERIAL_UNIQUE, TRUE}, {"crystal", MATERIAL_CRYSTAL, TRUE}, {"diamond", MATERIAL_DIAMOND, TRUE}, {"ice", MATERIAL_ICE, TRUE}, {"rubber", MATERIAL_RUBBER, TRUE}, {"plasteel", MATERIAL_PLASTEEL, TRUE}, {"fur", MATERIAL_FUR, TRUE}, {"marble", MATERIAL_MARBLE, TRUE}, {"granite", MATERIAL_GRANITE, TRUE}, {"ivory", MATERIAL_IVORY, TRUE}, {"dirt", MATERIAL_DIRT, TRUE}, {"chalk", MATERIAL_CHALK, TRUE}, {"silk", MATERIAL_SILK, TRUE}, {"feathers", MATERIAL_FEATHER, TRUE}, {"copper", MATERIAL_COPPER, TRUE}, {"aluminum", MATERIAL_ALUMINUM, TRUE}, {"tin", MATERIAL_TIN, TRUE}, {"", 0, 0} }; const struct flag_type position_flags[] = { {"dead", POS_DEAD, FALSE}, {"mortal", POS_MORTAL, FALSE}, {"incap", POS_INCAP, FALSE}, {"stunned", POS_STUNNED, FALSE}, {"sleeping", POS_SLEEPING, TRUE}, {"resting", POS_RESTING, TRUE}, {"sitting", POS_SITTING, TRUE}, {"fighting", POS_FIGHTING, FALSE}, {"standing", POS_STANDING, TRUE}, {"", 0, 0} }; const struct flag_type mprog_flags[] = { { "act", TRIG_ACT, TRUE }, { "bribe", TRIG_BRIBE, TRUE }, { "death", TRIG_DEATH, TRUE }, { "entry", TRIG_ENTRY, TRUE }, { "fight", TRIG_FIGHT, TRUE }, { "give", TRIG_GIVE, TRUE }, { "greet", TRIG_GREET, TRUE }, { "grall", TRIG_GRALL, TRUE }, { "kill", TRIG_KILL, TRUE }, { "hpcnt", TRIG_HPCNT, TRUE }, { "random", TRIG_RANDOM, TRUE }, { "speech", TRIG_SPEECH, TRUE }, { "exit", TRIG_EXIT, TRUE }, { "exall", TRIG_EXALL, TRUE }, { "delay", TRIG_DELAY, TRUE }, { "surr", TRIG_SURR, TRUE }, { "", 0, TRUE } }; const struct flag_type oprog_flags[] = { { "act", TRIG_ACT, TRUE }, { "fight", TRIG_FIGHT, TRUE }, { "give", TRIG_GIVE, TRUE }, { "greet", TRIG_GRALL, TRUE }, { "random", TRIG_RANDOM, TRUE }, { "speech", TRIG_SPEECH, TRUE }, { "exall", TRIG_EXALL, TRUE }, { "delay", TRIG_DELAY, TRUE }, { "drop", TRIG_DROP, TRUE }, { "get", TRIG_GET, TRUE }, { "sit", TRIG_SIT, TRUE }, { "pull", TRIG_PULL, TRUE }, { "push", TRIG_PUSH, TRUE }, { "climb", TRIG_CLIMB, TRUE }, { "turn", TRIG_TURN, TRUE }, { "play", TRIG_PLAY, TRUE }, { "twist", TRIG_TWIST, TRUE }, { "lift", TRIG_LIFT, TRUE }, { "enter", TRIG_ENTER, TRUE }, { "wear", TRIG_WEAR, TRUE }, { "remove", TRIG_REMOVE, TRUE }, { "", 0, TRUE } }; const struct flag_type rprog_flags[] = { { "act", TRIG_ACT, TRUE }, { "fight", TRIG_FIGHT, TRUE }, { "drop", TRIG_DROP, TRUE }, { "greet", TRIG_GRALL, TRUE }, { "random", TRIG_RANDOM, TRUE }, { "speech", TRIG_SPEECH, TRUE }, { "exall", TRIG_EXALL, TRUE }, { "delay", TRIG_DELAY, TRUE }, { "dig", TRIG_DIG, TRUE }, { "", 0, TRUE } }; const struct flag_type vflags_armor[] = { { "bad_quality", ARMOR_BAD_QUALITY, TRUE }, { "low_quality", ARMOR_LOW_QUALITY, TRUE }, { "high_quality", ARMOR_HIGH_QUALITY, TRUE }, { "banded", ARMOR_BANDED, TRUE }, { "ring", ARMOR_RING, TRUE }, { "scale", ARMOR_SCALE, TRUE }, { "plate", ARMOR_PLATE, TRUE }, { "softened", ARMOR_SOFTENED, TRUE }, { "hardened", ARMOR_HARDENED, TRUE }, { "cast", ARMOR_CAST, TRUE }, { "forged", ARMOR_FORGED, TRUE }, { "tempered", ARMOR_TEMPERED, TRUE }, { "thickened", ARMOR_THICKENED, TRUE }, { "studded", ARMOR_STUDDED, TRUE }, { "", 0, TRUE } };