/* * Lets the mobile to call another MOBprogram withing a MOBprogram. * 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. * * Syntax: mob call [vnum] [victim|'null'] [object1|'null'] [object2|'null'] * */ void do_mpcall(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *vch; OBJ_DATA *obj1, *obj2; MPROG_CODE *prg; extern void program_flow(sh_int, char *, CHAR_DATA *, CHAR_DATA *, const void *, const void *); argument = one_argument(argument, arg); if (arg[0] == '\0') { bug("MpCall: missing arguments from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0); return; } if ((prg = get_mprog_index(atoi(arg))) == NULL) { bug("MpCall: invalid prog from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0); return; } vch = NULL; obj1 = obj2 = NULL; argument = one_argument(argument, arg); if (arg[0] != '\0') vch = get_char_room(ch, arg); argument = one_argument(argument, arg); if (arg[0] != '\0') obj1 = get_obj_here(ch, arg); argument = one_argument(argument, arg); if (arg[0] != '\0') obj2 = get_obj_here(ch, arg); program_flow(prg->vnum, prg->code, ch, vch, (void *) obj1, (void *) obj2); }
/* * Lets the mobile to transfer an object. The object must be in the same * room with the mobile. * * Syntax: mob otransfer [item name] [location] */ void do_mpotransfer(CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; ROOM_INDEX_DATA *location; char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); if (arg[0] == '\0') { bug("MpOTransfer - Missing argument from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0); return; } one_argument(argument, buf); if ((location = find_location(ch, buf)) == NULL) { bug("MpOTransfer - No such location from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0); return; } if ((obj = get_obj_here(ch, arg)) == NULL) return; if (obj->carried_by == NULL) obj_from_room(obj); else { if (obj->wear_loc != WEAR_NONE) unequip_char(ch, obj); obj_from_char(obj); } obj_to_room(obj, location); }
void do_mppurge(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; if (!IS_NPC(ch)) { send_to_char(C_DEFAULT, "Huh?\n\r", ch); return; } if (IS_SET(ch->act, ACT_PET) || IS_AFFECTED(ch, AFF_CHARM)) return; one_argument(argument, arg); if (arg[0] == '\0') { /* 'purge' */ CHAR_DATA *vnext; OBJ_DATA *obj_next; for (victim = ch->in_room->people; victim != NULL; victim = vnext) { vnext = victim->next_in_room; if (IS_NPC(victim) && victim != ch) extract_char(victim, TRUE); } for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; extract_obj(obj); } return; } if ((victim = get_char_room(ch, arg)) == NULL) { if ((obj = get_obj_here(ch, arg))) { extract_obj(obj); } else { sprintf(log_buf, "Mppurge - Bad argument: vnum %d name %s short %s.", ch->pIndexData->vnum, ch->name, ch->short_descr); bug(log_buf, -1); } return; } if (!IS_NPC(victim)) { sprintf(log_buf, "Mppurge - Purging a PC: vnum %d name %s short %s.", ch->pIndexData->vnum, ch->name, ch->short_descr); bug(log_buf, -1); return; } extract_char(victim, TRUE); return; }
/* * Lets the mobile purge all objects and other npcs in the room, * or purge a specified object or mob in the room. The mobile cannot * purge itself for safety reasons. * * syntax mob purge {target} */ void do_mppurge( CHAR_DATA *ch, char *argument ) { char arg[ MAX_INPUT_LENGTH ]; CHAR_DATA *victim; OBJ_DATA *obj; one_argument( argument, arg ); if ( arg[0] == '\0' ) { /* 'purge' */ CHAR_DATA *vnext; OBJ_DATA *obj_next; for ( victim = ch->in_room->people; victim != NULL; victim = vnext ) { vnext = victim->next_in_room; if ( IS_NPC( victim ) && victim != ch && !IS_SET(victim->act, ACT_NOPURGE) ) extract_char( victim, TRUE ); } for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next ) { obj_next = obj->next_content; if ( !IS_SET(obj->extra_flags, ITEM_NOPURGE) ) extract_obj( obj ); } return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { if ( ( obj = get_obj_here( ch, arg ) ) ) { extract_obj( obj ); } else { bug( "Mppurge - Bad argument from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0 ); } return; } if ( !IS_NPC( victim ) ) { bug( "Mppurge - Purging a PC from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0 ); return; } extract_char( victim, TRUE ); return; }
void do_mpcast( CHAR_DATA *ch, char *argument ) { CHAR_DATA *vch; OBJ_DATA *obj; void *victim = NULL; char spell[ MAX_INPUT_LENGTH ], target[ MAX_INPUT_LENGTH ]; int sn; argument = one_argument( argument, spell ); one_argument( argument, target ); if ( spell[0] == '\0' ) { bug( "MpCast - Bad syntax from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0 ); return; } if ( ( sn = skill_lookup( spell ) ) < 0 ) { bug( "MpCast - No such spell from vnum %d.", IS_NPC(ch) ? ch->pIndexData->vnum : 0 ); return; } vch = get_char_room( ch, target ); obj = get_obj_here( ch, target ); switch ( skill_table[sn].target ) { default: return; case TAR_IGNORE: break; case TAR_CHAR_OFFENSIVE: if ( vch == NULL || vch == ch ) return; victim = ( void * ) vch; break; case TAR_CHAR_DEFENSIVE: victim = vch == NULL ? ( void *) ch : (void *) vch; break; case TAR_CHAR_SELF: victim = ( void *) ch; break; case TAR_OBJ_CHAR_DEF: case TAR_OBJ_CHAR_OFF: case TAR_OBJ_INV: if ( obj == NULL ) return; victim = ( void * ) obj; } (*skill_table[sn].spell_fun)( sn, ch->level, ch, victim, skill_table[sn].target ); return; }
void do_shadowshift( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WIZARD)) { send_to_char("Huh?\n\r",ch); return; } if (IS_CLASS(ch, CLASS_WIZARD) && ch->pcdata->powers[WL_SKILLS] < 3) { send_to_char("You need Level 3 in Wizard Skills.\n\r",ch); return; } if ( arg[0] == '\0' ) { if (!IS_AFFECTED(ch, AFF_SHADOWPLANE)) { if (has_timer(ch)) return; send_to_char("You fade into the plane of shadows.\n\r",ch); act("The shadows flicker and swallow up $n.",ch,NULL,NULL,TO_ROOM); SET_BIT(ch->affected_by, AFF_SHADOWPLANE); do_look(ch,"auto"); return; } REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE); send_to_char("You fade back into the real world.\n\r",ch); act("The shadows flicker and $n fades into existance.",ch,NULL,NULL,TO_ROOM); do_look(ch,"auto"); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "What do you wish to toss into the shadow plane?\n\r", ch ); return; } if (IS_AFFECTED(ch, AFF_SHADOWPLANE)) send_to_char( "You toss it to the ground and it vanishes.\n\r", ch ); else send_to_char( "You toss it into a shadow and it vanishes.\n\r", ch ); return; }
void do_mpenable(CHAR_DATA* ch, char* argument) { char arg1[ MAX_INPUT_LENGTH ]; char arg2[ MAX_INPUT_LENGTH ]; OBJ_DATA* target; if ( !IS_NPC( ch ) ) { send_to_char(C_DEFAULT, "Huh?\n\r", ch ); return; } if ( IS_AFFECTED( ch, AFF_CHARM ) ) { return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || arg2[0]=='\0' ) { bug( "Mpenable - No argument: vnum %d.", ch->pIndexData->vnum ); return; } if ( !( target = get_obj_here( ch, arg1 ) ) ) { return; } else { TRAP_DATA* trap; for(trap = target->pIndexData->traps; trap; trap=trap->next_here) { trap->disarmed = 0; trap->disarm_dur = 0; } } return; }
void do_mposet( CHAR_DATA * ch, const char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; char outbuf[MAX_STRING_LENGTH]; int value, tmp; /* * A desc means switched.. too many loopholes if we allow that.. */ if ( !IS_NPC( ch ) || IS_AFFECTED( ch, AFF_CHARM ) || ch->desc ) { send_to_char( "Huh?\r\n", ch ); return; } smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); mudstrlcpy( arg3, argument, MAX_INPUT_LENGTH ); if ( !*arg1 ) { progbug( "MpOset: no args", ch ); return; } if ( ( obj = get_obj_here( ch, arg1 ) ) == NULL ) { progbug( "MpOset: no object", ch ); return; } if ( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) ) { progbug( "MpOset: can't set prototype items", ch ); return; } separate_obj( obj ); value = atoi( arg3 ); if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) ) { obj->value[0] = value; return; } if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) ) { obj->value[1] = value; return; } if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) ) { obj->value[2] = value; return; } if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) ) { obj->value[3] = value; return; } if ( !str_cmp( arg2, "value4" ) || !str_cmp( arg2, "v4" ) ) { obj->value[4] = value; return; } if ( !str_cmp( arg2, "value5" ) || !str_cmp( arg2, "v5" ) ) { obj->value[5] = value; return; } if ( !str_cmp( arg2, "type" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no type", ch ); return; } value = get_otype( argument ); if ( value < 1 ) { progbug( "MpOset: Invalid type", ch ); return; } obj->item_type = ( short ) value; return; } if ( !str_cmp( arg2, "flags" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no flags", ch ); return; } while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); value = get_oflag( arg3 ); if ( value < 0 || value >= MAX_BITS ) progbug( "MpOset: Invalid flag", ch ); else { if ( value == ITEM_PROTOTYPE ) progbug( "MpOset: can't set prototype flag", ch ); else xTOGGLE_BIT( obj->extra_flags, value ); } } return; } if ( !str_cmp( arg2, "wear" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no wear", ch ); return; } while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); value = get_wflag( arg3 ); if ( value < 0 || value > 31 ) progbug( "MpOset: Invalid wear", ch ); else TOGGLE_BIT( obj->wear_flags, 1 << value ); } return; } if ( !str_cmp( arg2, "level" ) ) { obj->level = value; return; } if ( !str_cmp( arg2, "weight" ) ) { obj->weight = value; return; } if ( !str_cmp( arg2, "cost" ) ) { obj->cost = value; return; } if ( !str_cmp( arg2, "timer" ) ) { obj->timer = value; return; } if ( !str_cmp( arg2, "name" ) ) { STRFREE( obj->name ); obj->name = STRALLOC( arg3 ); return; } if ( !str_cmp( arg2, "short" ) ) { STRFREE( obj->short_descr ); obj->short_descr = STRALLOC( arg3 ); if ( obj == supermob_obj ) { STRFREE( supermob->short_descr ); supermob->short_descr = QUICKLINK( obj->short_descr ); } /* * Feature added by Narn, Apr/96 * * If the item is not proto, add the word 'rename' to the keywords * * if it is not already there. */ if ( str_infix( "mprename", obj->name ) ) { snprintf( buf, MAX_STRING_LENGTH, "%s %s", obj->name, "mprename" ); STRFREE( obj->name ); obj->name = STRALLOC( buf ); } return; } if ( !str_cmp( arg2, "long" ) ) { STRFREE( obj->description ); mudstrlcpy( buf, arg3, MAX_STRING_LENGTH ); obj->description = STRALLOC( buf ); return; } if ( !str_cmp( arg2, "actiondesc" ) ) { if ( strstr( arg3, "%n" ) || strstr( arg3, "%d" ) || strstr( arg3, "%l" ) ) { progbug( "MpOset: Illegal actiondesc", ch ); return; } STRFREE( obj->action_desc ); obj->action_desc = STRALLOC( arg3 ); return; } if ( !str_cmp( arg2, "affect" ) ) { AFFECT_DATA *paf; short loc; int bitv; argument = one_argument( argument, arg2 ); if ( arg2[0] == '\0' || !argument || argument[0] == 0 ) { progbug( "MpOset: Bad affect syntax", ch ); send_to_char( "Usage: oset <object> affect <field> <value>\r\n", ch ); return; } loc = get_atype( arg2 ); if ( loc < 1 ) { progbug( "MpOset: Invalid affect field", ch ); return; } if ( loc >= APPLY_AFFECT && loc < APPLY_WEAPONSPELL ) { bitv = 0; while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); if ( loc == APPLY_AFFECT ) value = get_aflag( arg3 ); else value = get_risflag( arg3 ); if ( value < 0 || value > 31 ) progbug( "MpOset: bad affect flag", ch ); else SET_BIT( bitv, 1 << value ); } if ( !bitv ) return; value = bitv; } else { argument = one_argument( argument, arg3 ); value = atoi( arg3 ); } CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = loc; paf->modifier = value; xCLEAR_BITS( paf->bitvector ); paf->next = NULL; LINK( paf, obj->first_affect, obj->last_affect, next, prev ); ++top_affect; return; } if ( !str_cmp( arg2, "rmaffect" ) ) { AFFECT_DATA *paf; short loc, count; if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no rmaffect", ch ); return; } loc = atoi( argument ); if ( loc < 1 ) { progbug( "MpOset: Invalid rmaffect", ch ); return; } count = 0; for ( paf = obj->first_affect; paf; paf = paf->next ) { if ( ++count == loc ) { UNLINK( paf, obj->first_affect, obj->last_affect, next, prev ); DISPOSE( paf ); send_to_char( "Removed.\r\n", ch ); --top_affect; return; } } progbug( "MpOset: rmaffect not found", ch ); return; } /* * save some finger-leather */ if ( !str_cmp( arg2, "ris" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "r" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "i" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "s" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "ri" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "rs" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "is" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } /* * Make it easier to set special object values by name than number * -Thoric */ tmp = -1; switch ( obj->item_type ) { case ITEM_WEAPON: if ( !str_cmp( arg2, "weapontype" ) ) { unsigned int x; value = -1; for ( x = 0; x < sizeof( attack_table ) / sizeof( attack_table[0] ); x++ ) if ( !str_cmp( arg3, attack_table[x] ) ) value = x; if ( value < 0 ) { progbug( "MpOset: Invalid weapon type", ch ); return; } tmp = 3; break; } if ( !str_cmp( arg2, "condition" ) ) tmp = 0; break; case ITEM_ARMOR: if ( !str_cmp( arg2, "condition" ) ) tmp = 3; if ( !str_cmp( arg2, "ac" ) ) tmp = 1; break; case ITEM_SALVE: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "maxdoses" ) ) tmp = 1; if ( !str_cmp( arg2, "doses" ) ) tmp = 2; if ( !str_cmp( arg2, "delay" ) ) tmp = 3; if ( !str_cmp( arg2, "spell1" ) ) tmp = 4; if ( !str_cmp( arg2, "spell2" ) ) tmp = 5; if ( tmp >= 4 && tmp <= 5 ) value = skill_lookup( arg3 ); break; case ITEM_SCROLL: case ITEM_POTION: case ITEM_PILL: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "spell1" ) ) tmp = 1; if ( !str_cmp( arg2, "spell2" ) ) tmp = 2; if ( !str_cmp( arg2, "spell3" ) ) tmp = 3; if ( tmp >= 1 && tmp <= 3 ) value = skill_lookup( arg3 ); break; case ITEM_STAFF: case ITEM_WAND: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "spell" ) ) { tmp = 3; value = skill_lookup( arg3 ); } if ( !str_cmp( arg2, "maxcharges" ) ) tmp = 1; if ( !str_cmp( arg2, "charges" ) ) tmp = 2; break; case ITEM_CONTAINER: if ( !str_cmp( arg2, "capacity" ) ) tmp = 0; if ( !str_cmp( arg2, "cflags" ) ) tmp = 1; if ( !str_cmp( arg2, "key" ) ) tmp = 2; break; case ITEM_SWITCH: case ITEM_LEVER: case ITEM_PULLCHAIN: case ITEM_BUTTON: if ( !str_cmp( arg2, "tflags" ) ) { tmp = 0; value = get_trigflag( arg3 ); } break; } if ( tmp >= 0 && tmp <= 3 ) { obj->value[tmp] = value; return; } progbug( "MpOset: Invalid field", ch ); return; }
void do_note (CHAR_DATA * ch, char *argy) { char buf[STD_LENGTH * 17]; char buf1[STD_LENGTH * 17]; char arg[SML_LENGTH]; NOTE_DATA *pnote; int vnum; int board_here; /*Boards and board nums by Owen Emlen */ SINGLE_OBJECT *obj; int anum; DEFINE_COMMAND ("note", do_note, POSITION_DEAD, 0, LOG_NORMAL, "This command is used to post/read/remove notes.") if (IS_MOB (ch)) return; board_here = 0; obj = get_obj_here (ch, "board", SEARCH_ROOM_FIRST); if (obj == NULL) { board_here = 1; } else board_here = obj->pIndexData->value[9]; buf1[0] = '\0'; argy = one_argy (argy, arg); smash_tilde (argy); if (arg[0] == '\0') { do_note (ch, "read"); return; } if (!str_cmp (arg, "list")) { vnum = 0; sprintf(buf1,"\x1B[1;30m------------------------------------------------------------------------\x1B[37;0m\n\r"); sprintf(buf1+strlen(buf1),"\x1B[1;36m New ### Sender/From Subject\x1B[37;0m\n\r"); sprintf(buf1+strlen(buf1),"\x1B[1;30m------------------------------------------------------------------------\x1B[37;0m\n\r"); for (pnote = note_list; pnote != NULL; pnote = pnote->next) { if (is_note_to (ch, pnote) && (board_here == pnote->board_num || IS_IMMORTAL (ch))) { if (strlen(pnote->subject)>35) { pnote->subject[35]='\0'; } sprintf (buf, "%s \x1B[1;36m%3d\x1B[37;0m From \x1b[1;37m%-14s\x1B[37;0m '\x1B[1;36m%s\x1B[37;0m'\n\r", (pnote->date_stamp > ch->pcdata->last_note && str_cmp (pnote->sender, NAME (ch))) ? "\x1B[1;34m(New)\x1B[37;0m" : " ", vnum, pnote->sender, pnote->subject); strcat (buf1, buf); vnum++; } else vnum++; if (strlen (buf1) > (STD_LENGTH * 16)) { strcat (buf1, "\n\rTOO MANY NOTES.. WAIT UNTIL A GOD REMOVES SOME!\n\r"); break; } } page_to_char_limited (buf1, ch); return; } if (!str_cmp (arg, "read")) { bool fAll; if (!str_cmp (argy, "all")) { fAll = TRUE; anum = 0; } else if (argy[0] == '\0' || !str_prefix (argy, "next")) /* read next unread note */ { vnum = 0; for (pnote = note_list; pnote != NULL; pnote = pnote->next) { if (is_note_to (ch, pnote) && (board_here == pnote->board_num || IS_IMMORTAL (ch)) && str_cmp (NAME (ch), pnote->sender) && ch->pcdata->last_note < pnote->date_stamp) { sprintf (buf,"\x1B[1;30m---------------------------------------------------------------------------\x1B[37;0m\n\r"); sprintf (buf+strlen(buf), "[Note #\x1B[1;37m%d:%d\x1B[37;0m] From: \x1B[1;37m%s\x1B[37;0m To: \x1B[1;37m%s\x1B[37;0m\n\r", vnum, pnote->board_num, pnote->sender, pnote->to_list); if (strlen(pnote->subject)>35) { pnote->subject[35]='\0'; } sprintf (buf+strlen(buf),"%s. Subject: \x1B[1;36m%s\x1B[37;0m\n\r", pnote->date, pnote->subject); sprintf (buf+strlen(buf),"\x1B[1;30m---------------------------------------------------------------------------\x1B[37;0m\n\r"); strcat (buf1, buf); strcat (buf1, pnote->text); ch->pcdata->last_note = UMAX (ch->pcdata->last_note, pnote->date_stamp); page_to_char_limited (buf1, ch); return; } else vnum++; } send_to_char ("You have no unread notes.\n\r", ch); return; } else if (is_number (argy)) { fAll = FALSE; anum = atoi (argy); } else { send_to_char ("Note read which number?\n\r", ch); return; } vnum = 0; for (pnote = note_list; pnote != NULL; pnote = pnote->next) { if ((vnum++ == anum || fAll) && is_note_to (ch, pnote) && (board_here == pnote->board_num || IS_IMMORTAL (ch))) { sprintf (buf,"\x1B[1;30m---------------------------------------------------------------------------\x1B[37;0m\n\r"); sprintf (buf+strlen(buf), "[Note #\x1B[1;37m%d:%d\x1B[37;0m] From: \x1B[1;37m%s\x1B[37;0m To: \x1B[1;37m%s\x1B[37;0m\n\r", vnum - 1, pnote->board_num, pnote->sender, pnote->to_list); if (strlen(pnote->subject)>35) { pnote->subject[35]='\0'; } sprintf (buf+strlen(buf),"Dated %s. Subject: \x1B[1;36m%s\x1B[37;0m\n\r", pnote->date, pnote->subject); sprintf (buf+strlen(buf),"\x1B[1;30m---------------------------------------------------------------------------\x1B[37;0m\n\r"); strcat (buf1, buf); strcat (buf1, pnote->text); page_to_char_limited (buf1, ch); return; } } send_to_char ("No such note.\n\r", ch); return; } if (!str_cmp (arg, "write")) { if (LEVEL (ch) < IMM_LEVEL && board_here == 1) { send_to_char ("You can't write on the immortal notice board.\n\r", ch); return; } if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } check_ced (ch); note_attach (ch); string_append (ch, &ch->ced->pnote->text); return; } if (!str_cmp (arg, "fwrite")) { if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } if (LEVEL (ch) < IMM_LEVEL && board_here == 1) { send_to_char ("You can't write on the immortal notice board.\n\r", ch); return; } check_ced (ch); note_attach (ch); fullscreen_editor (ch, &ch->ced->pnote->text); return; } if (!str_cmp (arg, "+")) { check_ced (ch); note_attach (ch); strcpy (buf, ch->ced->pnote->text); if (strlen (buf) + strlen (argy) >= STD_LENGTH - 200) { send_to_char ("Note too long.\n\r", ch); return; } strcat (buf, argy); strcat (buf, "\n\r"); free_string (ch->ced->pnote->text); ch->ced->pnote->text = str_dup (buf); ch->ced->pnote->lines += 1; send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "-")) { int num, cnt; char new_buf[STD_LENGTH]; const char *str; check_ced (ch); if (ch->ced->pnote == NULL) { send_to_char ("You have to start a note first.\n\r", ch); return; } if (ch->ced->pnote->lines == 0) { send_to_char ("Nothing to delete.\n\r", ch); return; } new_buf[0] = '\0'; str = ch->ced->pnote->text; cnt = 1; for (num = 1; num <= ch->ced->pnote->lines; num++) { while (*str != '\r' && *str != '\0') { ++str; ++cnt; } } strncpy (new_buf, ch->ced->pnote->text, cnt); new_buf[cnt] = '\0'; free_string (ch->ced->pnote->text); ch->ced->pnote->text = str_dup (new_buf); ch->ced->pnote->lines -= 1; send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "subject")) { if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } check_ced (ch); note_attach (ch); free_string (ch->ced->pnote->subject); ch->ced->pnote->subject = str_dup (argy); send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "to")) { if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } check_ced (ch); note_attach (ch); free_string (ch->ced->pnote->to_list); ch->ced->pnote->to_list = str_dup (argy); send_to_char("\x1b[1;31mBe sure to put 'pkill' or 'flame' if this is a pkill flame note.\x1b[0;37m", ch); send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "clear")) { if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } check_ced (ch); if (ch->ced->pnote != NULL) { free_string (ch->ced->pnote->text); free_string (ch->ced->pnote->subject); free_string (ch->ced->pnote->to_list); free_string (ch->ced->pnote->date); free_string (ch->ced->pnote->sender); ch->ced->pnote->next = note_free; note_free = ch->ced->pnote; ch->ced->pnote = NULL; } send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "show")) { if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } check_ced (ch); if (ch->ced->pnote == NULL) { send_to_char ("You have no note in progress.\n\r", ch); return; } sprintf (buf, "%s: %s\n\rTo: %s\n\rLines: %d\n\r", ch->ced->pnote->sender, ch->ced->pnote->subject, ch->ced->pnote->to_list, ch->ced->pnote->lines ); strcat (buf1, buf); strcat (buf1, ch->ced->pnote->text); page_to_char_limited (buf1, ch); return; } if (!str_cmp (arg, "post") || !str_prefix (arg, "send")) { FILE *fp; char *strtime; check_ced (ch); if (ch->ced->pnote == NULL) { send_to_char ("You have no note in progress.\n\r", ch); return; } if (board_here == 1 && LEVEL (ch) < IMM_LEVEL) { send_to_char ("This board is reserved for immortals posting messages to mortals.\n\r", ch); send_to_char ("Please post on a public board if you wish to write a note.\n\r", ch); return; } if (!str_cmp (ch->ced->pnote->to_list, "")) { send_to_char ( "You need to provide a recipient (name, all, or immortal).\n\r", ch); return; } if (!str_cmp (ch->ced->pnote->subject, "")) { send_to_char ("You need to provide a subject.\n\r", ch); return; } if (IS_SET(ch->act, PLR_LAMER)) { send_to_char("You have lost your board writing privileges.\n\r", ch); send_to_char("Maybe if you grow up you will be allowed to start\n\r", ch); send_to_char("posting on the board again, however since you have\n\r", ch); send_to_char("consistently shown yourself to be lame this is not likely.\n\r", ch); return; } ch->pcdata->online_spot->notes_this_reboot++; if(ch->pcdata->online_spot->notes_this_reboot > 8) { send_to_char("You have already written too many notes this reboot.\n\r", ch); return; } ch->ced->pnote->next = NULL; strtime = ctime (¤t_time); strtime[strlen (strtime) - 1] = '\0'; ch->ced->pnote->board_num = board_here; ch->ced->pnote->date = str_dup (strtime); ch->ced->pnote->date_stamp = current_time; if (note_list == NULL) { note_list = ch->ced->pnote; } else { for (pnote = note_list; pnote->next != NULL; pnote = pnote->next) ; pnote->next = ch->ced->pnote; } pnote = ch->ced->pnote; ch->ced->pnote = NULL; #ifndef WINDOWS // fclose (fpReserve); #endif if ((fp = fopen (NOTE_FILE, "a")) == NULL) { perror (NOTE_FILE); } else { fprintf (fp, "Sender %s~\n", fix_string (pnote->sender)); fprintf (fp, "TBoard %d\n", pnote->board_num); fprintf (fp, "Date %s~\n", pnote->date); fprintf (fp, "Stamp %ld\n", pnote->date_stamp); fprintf (fp, "To %s~\n", fix_string (pnote->to_list)); fprintf (fp, "Subject %s~\n", fix_string (pnote->subject)); fprintf (fp, "Text\n%s~\n", pnote->text); fprintf (fp, "End\n\n"); fclose (fp); } #ifndef WINDOWS // fpReserve = fopen (NULL_FILE, "r"); #endif send_to_char ("Ok.\n\r", ch); return; } if (!str_cmp (arg, "remove")) { if (!is_number (argy)) { send_to_char ("Note remove which number?\n\r", ch); return; } anum = atoi (argy); vnum = 0; for (pnote = note_list; pnote != NULL; pnote = pnote->next) { if (vnum++ == anum && ( (is_note_to (ch, pnote) && !is_name ("all", pnote->to_list)) || LEVEL (ch) > 109)) { note_remove (ch, pnote); send_to_char ("Ok.\n\r", ch); return; } } send_to_char ("No such note.\n\r", ch); return; } send_to_char ("Huh? Type 'help note' for usage.\n\r", ch); return; }
void do_dip(CHAR_DATA * ch, char * argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; OBJ_DATA * dipped; OBJ_DATA * dipping; OBJ_DATA * parchment; EXTRA_DESCR_DATA * ed; EXTRA_DESCR_DATA * dipEd; bool fountain=FALSE; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if(arg1[0]=='\0') { send_to_char("Usage: dip <object to dip> <object to dip into>\n\r", ch); return; } // Lets make sure they have their object dipped = get_obj_carry(ch, arg1, ch); if(dipped==NULL) { send_to_char("You do not have the item you want to dip.\n\r", ch); return; } // If they don't type anything, check to see if there is a fountain in the room if(arg2[0]=='\0') { for(dipping=ch->in_room->contents;dipping!=NULL;dipping=dipping->next_content) { if(dipping->item_type==ITEM_FOUNTAIN) break; } if(dipping==NULL) { send_to_char("Dip into what?\n\r", ch ); return; } fountain=TRUE; } else { dipping = get_obj_here(ch, arg2); if(dipping==NULL) { send_to_char("You do not have the item you want to dip into.\n\r", ch); return; } if(dipping->item_type!=ITEM_POTION && dipping->item_type!=ITEM_DRINK_CON) { send_to_char("You can only dip things into liquids! Like a potion!", ch); return; } } // Ok now we have an item to dip and an item to dip into, lets see if its a special item ed = GetED(dipping, "*dip"); if(ed==NULL) { // That means the object being dipped into is not special, only thing this can do is // erase scrolls and make them blank parchments, wet parchments for 2 ticks if(dipped->item_type==ITEM_SCROLL) { dipEd = GetED(dipped, "*fade"); if(dipEd==NULL) { act("You dip $p into $P. The writing on $p fades slightly.", ch, dipped, dipping, TO_CHAR); act("$n dips $p into $P. The writing on $p fades slightly.", ch, dipped, dipping, TO_ROOM); dipEd = AddED(dipped, "*fade", "1"); if(fountain==FALSE) { // If its not a fountain, it uses the entire potion to erase the text act("$p dries up!", ch, dipped, dipping, TO_CHAR); act("$p dries up!", ch, dipped, dipping, TO_ROOM); extract_obj(dipping); } } else { act("You dip $p into $P. The writing completely fades away.", ch, dipped, dipping, TO_CHAR); act("$n dips $p into $P. The writing completely fades away.", ch, dipped, dipping, TO_ROOM); if(fountain==FALSE) { // If its not a fountain, it uses the entire potion to erase the text act("$P dries up!", ch, dipped, dipping, TO_CHAR); act("$P dries up!", ch, dipped, dipping, TO_ROOM); extract_obj(dipping); } extract_obj(dipped); parchment = create_object(get_obj_index(26), ch->level); obj_to_char(parchment, ch); } } else { act("You dip $p into $P. Nothing happens.", ch, dipped, dipping, TO_CHAR); act("$n dips $p into $P. Nothing happens.", ch, dipped, dipping, TO_ROOM); } } else { // Add in flags for this stuff later act("You dip $p into $P. Nothing happens.", ch, dipped, dipping, TO_CHAR); act("$n dips $p into $P. Nothing happens.", ch, dipped, dipping, TO_ROOM); } }
char *emote_processor( CHAR_DATA *ch, char *argument, bool fPemote, bool fSemote, CHAR_DATA *vch ) { static char buf[MAX_STRING_LENGTH]; CHAR_DATA *wch; OBJ_DATA *obj; bool fBegin = TRUE, fPoss = FALSE; char word[MAX_INPUT_LENGTH]; char *pin = argument; for ( pin = argument; *pin != '\0'; pin++ ) { if ( *pin == '@' ) { fBegin = FALSE; break; } } pin = argument; buf[0] = '\0'; /* If no @, copy emoter's short desc. */ if (fBegin) { // if (vch == ch) { // strcat(buf, (fPemote ? "your" : "you")); // } else { strcpy(buf, person(vch, ch)); if ( fPemote ) { if ( buf[strlen(buf)-1] == 's' ) strcat( buf, "'" ); else strcat( buf, "'s" ); // } // } } strcat( buf, " " ); } while ( *pin != '\0' ) { fPoss = FALSE; switch( *pin ) { default: one_emote_argument( pin, word ); strcat( buf, word ); pin = pin + (strlen( word ) - 1); break; case ' ': strcat( buf, " " ); break; case '@': if (vch == ch) { strcat(buf, (fPemote ? "your" : "you")); } else { strcat(buf, person(vch, ch)); if ( fPemote ) strcat( buf, (buf[strlen(buf)-1] == 's') ? "'" : "'s"); } break; case '%': fPoss = TRUE; case '~': one_emote_argument( &pin[1], word ); if ((obj = get_obj_here(ch, strip_punct(word))) != NULL) { if (can_see_obj(vch, obj)) { strcat( buf, obj->short_descr ); if ( fPoss ) { if ( word[strlen(word) - 1] == 's' ) strcat( buf, "'" ); else strcat( buf, "'s" ); } } else strcat( buf, (fPoss ? "something's" : "something")); } else if ((wch = get_char_room(ch, strip_punct(word))) != NULL) { if (fSemote) wch->leader = ch; if (vch == wch) { strcat(buf, (fPoss ? "your" : "you")); } else { strcat(buf, person(vch, wch)); if (fPoss) { if ( buf[strlen(buf)-1] == 's' ) strcat( buf, "'" ); else strcat( buf, "'s" ); } } } else { sprintf( buf, "%s is not here.\n\r", word ); send_to_char( buf, ch ); return NULL; } pin = pin + strlen( word ); fPoss = FALSE; break; /* %m him/her */ case '!': one_emote_argument( &pin[1], word); if ((obj = get_obj_here(ch, strip_punct(word))) != NULL) { strcat(buf, ((can_see_obj(vch, obj)) ? "it" : "something")); } else if ((wch = get_char_room(ch, strip_punct(word))) != NULL) { if (fSemote) wch->leader = ch; strcat(buf, ((vch == wch) ? "you" : him_her[wch->sex])); } else { sprintf( buf, "%s is not here.\n\r", word ); send_to_char( buf, ch ); return NULL; } pin = pin + strlen( word ); break; /* %s his/her */ case '^': one_emote_argument( &pin[1], word); if ((obj = get_obj_here(ch, strip_punct(word))) != NULL) { strcat(buf, ((can_see_obj(vch, obj)) ? "its" : "something's")); } else if ((wch = get_char_room(ch, strip_punct(word))) != NULL) { if (fSemote) wch->leader = ch; strcat(buf, ((vch == wch) ? "your" : his_her[wch->sex])); } else { sprintf( buf, "%s is not here.\n\r", word ); send_to_char( buf, ch ); return NULL; } pin = pin + strlen( word ); break; /* %s he/she */ case '#': one_emote_argument( &pin[1], word); if ((obj = get_obj_here(ch, strip_punct(word))) != NULL) { strcat(buf, ((can_see_obj(vch, obj)) ? "it" : "something")); } else if ((wch = get_char_room(ch, strip_punct(word))) != NULL) { if (fSemote) wch->leader = ch; strcat(buf, ((vch == wch) ? "you" : he_she[wch->sex])); } else { sprintf( buf, "%s is not here.\n\r", word ); send_to_char( buf, ch ); return NULL; } pin = pin + strlen( word ); break; } pin++; } strcat( strip_punct(buf), ".\n\r" ); buf[0] = UPPER( buf[0] ); return buf; }
/* --------------------------------------------------------------------- * CMD_EVAL * This monster evaluates an if/or/and statement * There are five kinds of statement: * 1) keyword and value (no $-code) if random 30 * 2) keyword, comparison and value if people > 2 * 3) keyword and actor if isnpc $n * 4) keyword, actor and value if carries $n sword * 5) keyword, actor, comparison and value if level $n >= 10 * *---------------------------------------------------------------------- */ int cmd_eval( sh_int vnum, char *line, int check, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, CHAR_DATA *rch ) { CHAR_DATA *lval_char = mob; CHAR_DATA *vch = (CHAR_DATA *) arg2; OBJ_DATA *obj1 = (OBJ_DATA *) arg1; OBJ_DATA *obj2 = (OBJ_DATA *) arg2; OBJ_DATA *lval_obj = NULL; char *original, buf[MAX_INPUT_LENGTH], code; int lval = 0, oper = 0, rval = -1; original = line; line = one_argument( line, buf ); if ( buf[0] == '\0' || mob == NULL ) return FALSE; /* * If this mobile has no target, let's assume our victim is the one */ if ( mob->mprog_target == NULL ) mob->mprog_target = ch; switch ( check ) { /* * Case 1: keyword and value */ case CHK_RAND: return( atoi( buf ) < number_percent() ); case CHK_MOBHERE: if ( is_number( buf ) ) return( get_mob_vnum_room( mob, atoi(buf) ) ); else return( (bool) (get_char_room( mob, buf) != NULL) ); case CHK_OBJHERE: if ( is_number( buf ) ) return( get_obj_vnum_room( mob, atoi(buf) ) ); else return( (bool) (get_obj_here( mob, buf) != NULL) ); case CHK_MOBEXISTS: return( (bool) (get_char_world( mob, buf) != NULL) ); case CHK_OBJEXISTS: return( (bool) (get_obj_world( mob, buf) != NULL) ); /* * Case 2 begins here: We sneakily use rval to indicate need * for numeric eval... */ case CHK_PEOPLE: rval = count_people_room( mob, 0 ); break; case CHK_PLAYERS: rval = count_people_room( mob, 1 ); break; case CHK_MOBS: rval = count_people_room( mob, 2 ); break; case CHK_CLONES: rval = count_people_room( mob, 3 ); break; case CHK_ORDER: rval = get_order( mob ); break; case CHK_HOUR: rval = time_info.hour; break; default:; } /* * Case 2 continued: evaluate expression */ if ( rval >= 0 ) { if ( (oper = keyword_lookup( fn_evals, buf )) < 0 ) { sprintf( buf, "Cmd_eval: prog %d syntax error(2) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } one_argument( line, buf ); lval = rval; rval = atoi( buf ); return( num_eval( lval, oper, rval ) ); } /* * Case 3,4,5: Grab actors from $* codes */ if ( buf[0] != '$' || buf[1] == '\0' ) { sprintf( buf, "Cmd_eval: prog %d syntax error(3) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } else code = buf[1]; switch( code ) { case 'i': lval_char = mob; break; case 'n': lval_char = ch; break; case 't': lval_char = vch; break; case 'r': lval_char = rch == NULL ? get_random_char( mob ) : rch ; break; case 'o': lval_obj = obj1; break; case 'p': lval_obj = obj2; break; case 'q': lval_char = mob->mprog_target; break; default: sprintf( buf, "Cmd_eval: prog %d syntax error(4) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } /* * From now on, we need an actor, so if none was found, bail out */ if ( lval_char == NULL && lval_obj == NULL ) return FALSE; /* * Case 3: Keyword, comparison and value */ switch( check ) { case CHK_ISPC: return( lval_char != NULL && !IS_NPC( lval_char ) ); case CHK_ISNPC: return( lval_char != NULL && IS_NPC( lval_char ) ); case CHK_ISGOOD: return( lval_char != NULL && IS_GOOD( lval_char ) ); case CHK_ISEVIL: return( lval_char != NULL && IS_EVIL( lval_char ) ); case CHK_ISNEUTRAL: return( lval_char != NULL && IS_NEUTRAL( lval_char ) ); case CHK_ISIMMORT: return( lval_char != NULL && IS_IMMORTAL( lval_char ) ); case CHK_ISCHARM: /* A relic from MERC 2.2 MOBprograms */ return( lval_char != NULL && IS_AFFECTED( lval_char, AFF_CHARM ) ); case CHK_ISFOLLOW: return( lval_char != NULL && lval_char->master != NULL && lval_char->master->in_room == lval_char->in_room ); case CHK_ISACTIVE: return( lval_char != NULL && lval_char->position > POS_SLEEPING ); case CHK_ISDELAY: return( lval_char != NULL && lval_char->mprog_delay > 0 ); case CHK_ISVISIBLE: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': return( lval_char != NULL && can_see( mob, lval_char ) ); case 'o': case 'p': return( lval_obj != NULL && can_see_obj( mob, lval_obj ) ); } case CHK_HASTARGET: return( lval_char != NULL && lval_char->mprog_target != NULL && lval_char->in_room == lval_char->mprog_target->in_room ); case CHK_ISTARGET: return( lval_char != NULL && mob->mprog_target == lval_char ); default:; } /* * Case 4: Keyword, actor and value */ line = one_argument( line, buf ); switch( check ) { case CHK_AFFECTED: return( lval_char != NULL && IS_SET(lval_char->affected_by, flag_lookup(buf, affect_flags)) ); case CHK_ACT: return( lval_char != NULL && IS_SET(lval_char->act, flag_lookup(buf, act_flags)) ); case CHK_IMM: return( lval_char != NULL && IS_SET(lval_char->imm_flags, flag_lookup(buf, imm_flags)) ); case CHK_OFF: return( lval_char != NULL && IS_SET(lval_char->off_flags, flag_lookup(buf, off_flags)) ); case CHK_CARRIES: if ( is_number( buf ) ) return( lval_char != NULL && has_item( lval_char, atoi(buf), -1, FALSE ) ); else return( lval_char != NULL && (get_obj_carry( lval_char, buf ) != NULL) ); case CHK_WEARS: if ( is_number( buf ) ) return( lval_char != NULL && has_item( lval_char, atoi(buf), -1, TRUE ) ); else return( lval_char != NULL && (get_obj_wear( lval_char, buf ) != NULL) ); case CHK_HAS: return( lval_char != NULL && has_item( lval_char, -1, item_lookup(buf), FALSE ) ); case CHK_USES: return( lval_char != NULL && has_item( lval_char, -1, item_lookup(buf), TRUE ) ); case CHK_NAME: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': return( lval_char != NULL && is_name( buf, lval_char->name ) ); case 'o': case 'p': return( lval_obj != NULL && is_name( buf, lval_obj->name ) ); } case CHK_POS: return( lval_char != NULL && lval_char->position == position_lookup( buf ) ); case CHK_CLAN: return( lval_char != NULL && lval_char->clan == clan_lookup( buf ) ); case CHK_RACE: return( lval_char != NULL && lval_char->race == race_lookup( buf ) ); case CHK_OBJTYPE: return( lval_obj != NULL && lval_obj->item_type == item_lookup( buf ) ); default:; } /* * Case 5: Keyword, actor, comparison and value */ if ( (oper = keyword_lookup( fn_evals, buf )) < 0 ) { sprintf( buf, "Cmd_eval: prog %d syntax error(5): '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } one_argument( line, buf ); rval = atoi( buf ); switch( check ) { case CHK_VNUM: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': if( lval_char != NULL && IS_NPC( lval_char ) ) lval = lval_char->pIndexData->vnum; break; case 'o': case 'p': if ( lval_obj != NULL ) lval = lval_obj->pIndexData->vnum; } break; case CHK_HPCNT: if ( lval_char != NULL ) lval = (lval_char->hit * 100)/(UMAX(1,lval_char->max_hit)); break; case CHK_ROOM: if ( lval_char != NULL && lval_char->in_room != NULL ) lval = lval_char->in_room->vnum; break; case CHK_SEX: if ( lval_char != NULL ) lval = lval_char->sex; break; case CHK_LEVEL: if ( lval_char != NULL ) lval = lval_char->level; break; case CHK_ALIGN: if ( lval_char != NULL ) lval = lval_char->alignment; break; case CHK_MONEY: /* Money is converted to silver... */ if ( lval_char != NULL ) lval = lval_char->gold + (lval_char->silver * 100); break; case CHK_OBJVAL0: if ( lval_obj != NULL ) lval = lval_obj->value[0]; break; case CHK_OBJVAL1: if ( lval_obj != NULL ) lval = lval_obj->value[1]; break; case CHK_OBJVAL2: if ( lval_obj != NULL ) lval = lval_obj->value[2]; break; case CHK_OBJVAL3: if ( lval_obj != NULL ) lval = lval_obj->value[3]; break; case CHK_OBJVAL4: if ( lval_obj != NULL ) lval = lval_obj->value[4]; break; case CHK_GRPSIZE: if( lval_char != NULL ) lval = count_people_room( lval_char, 4 ); break; default: return FALSE; } return( num_eval( lval, oper, rval ) ); }
void do_pick (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *gch; OBJ_DATA *obj; int door; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Pick what?\n\r", ch); return; } WAIT_STATE (ch, skill_table[gsn_pick_lock].beats); /* look for guards */ for (gch = ch->in_room->people; gch; gch = gch->next_in_room) { if (IS_NPC (gch) && IS_AWAKE (gch) && ch->level + 5 < gch->level) { act ("$N is standing too close to the lock.", ch, NULL, gch, TO_CHAR); return; } } if (!IS_NPC (ch) && number_percent () > get_skill (ch, gsn_pick_lock)) { send_to_char ("You failed.\n\r", ch); return; } if ((obj = get_obj_here (ch, arg)) != NULL) { /* portal stuff */ if (obj->item_type == ITEM_PORTAL) { if (!IS_SET (obj->value[1], EX_ISDOOR)) { send_to_char ("You can't do that.\n\r", ch); return; } if (!IS_SET (obj->value[1], EX_CLOSED)) { send_to_char ("It's not closed.\n\r", ch); return; } if (obj->value[4] < 0) { send_to_char ("It can't be unlocked.\n\r", ch); return; } if (IS_SET (obj->value[1], EX_PICKPROOF)) { send_to_char ("You failed.\n\r", ch); return; } REMOVE_BIT (obj->value[1], EX_LOCKED); act ("You pick the lock on $p.", ch, obj, NULL, TO_CHAR); act ("$n picks the lock on $p.", ch, obj, NULL, TO_ROOM); return; } /* 'pick object' */ if (obj->item_type != ITEM_CONTAINER) { send_to_char ("That's not a container.\n\r", ch); return; } if (!IS_SET (obj->value[1], CONT_CLOSED)) { send_to_char ("It's not closed.\n\r", ch); return; } if (obj->value[2] < 0) { send_to_char ("It can't be unlocked.\n\r", ch); return; } if (!IS_SET (obj->value[1], CONT_LOCKED)) { send_to_char ("It's already unlocked.\n\r", ch); return; } if (IS_SET (obj->value[1], CONT_PICKPROOF)) { send_to_char ("You failed.\n\r", ch); return; } REMOVE_BIT (obj->value[1], CONT_LOCKED); act ("You pick the lock on $p.", ch, obj, NULL, TO_CHAR); act ("$n picks the lock on $p.", ch, obj, NULL, TO_ROOM); return; } if ((door = find_door (ch, arg)) >= 0) { /* 'pick door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if (!IS_SET (pexit->exit_info, EX_CLOSED) && !IS_IMMORTAL (ch)) { send_to_char ("It's not closed.\n\r", ch); return; } if (pexit->key < 0 && !IS_IMMORTAL (ch)) { send_to_char ("It can't be picked.\n\r", ch); return; } if (!IS_SET (pexit->exit_info, EX_LOCKED)) { send_to_char ("It's already unlocked.\n\r", ch); return; } if (IS_SET (pexit->exit_info, EX_PICKPROOF) && !IS_IMMORTAL (ch)) { send_to_char ("You failed.\n\r", ch); return; } REMOVE_BIT (pexit->exit_info, EX_LOCKED); send_to_char ("*Click*\n\r", ch); act ("$n picks the $d.", ch, NULL, pexit->keyword, TO_ROOM); /* pick the other side */ if ((to_room = pexit->u1.to_room) != NULL && (pexit_rev = to_room->exit[rev_dir[door]]) != NULL && pexit_rev->u1.to_room == ch->in_room) { REMOVE_BIT (pexit_rev->exit_info, EX_LOCKED); } } return; }
void do_unlock (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Unlock what?\n\r", ch); return; } if ((obj = get_obj_here (ch, arg)) != NULL) { /* portal stuff */ if (obj->item_type == ITEM_PORTAL) { if (!IS_SET (obj->value[1], EX_ISDOOR)) { send_to_char ("You can't do that.\n\r", ch); return; } if (!IS_SET (obj->value[1], EX_CLOSED)) { send_to_char ("It's not closed.\n\r", ch); return; } if (obj->value[4] < 0) { send_to_char ("It can't be unlocked.\n\r", ch); return; } if (!has_key (ch, obj->value[4])) { send_to_char ("You lack the key.\n\r", ch); return; } if (!IS_SET (obj->value[1], EX_LOCKED)) { send_to_char ("It's already unlocked.\n\r", ch); return; } REMOVE_BIT (obj->value[1], EX_LOCKED); act ("You unlock $p.", ch, obj, NULL, TO_CHAR); act ("$n unlocks $p.", ch, obj, NULL, TO_ROOM); return; } /* 'unlock object' */ if (obj->item_type != ITEM_CONTAINER) { send_to_char ("That's not a container.\n\r", ch); return; } if (!IS_SET (obj->value[1], CONT_CLOSED)) { send_to_char ("It's not closed.\n\r", ch); return; } if (obj->value[2] < 0) { send_to_char ("It can't be unlocked.\n\r", ch); return; } if (!has_key (ch, obj->value[2])) { send_to_char ("You lack the key.\n\r", ch); return; } if (!IS_SET (obj->value[1], CONT_LOCKED)) { send_to_char ("It's already unlocked.\n\r", ch); return; } REMOVE_BIT (obj->value[1], CONT_LOCKED); act ("You unlock $p.", ch, obj, NULL, TO_CHAR); act ("$n unlocks $p.", ch, obj, NULL, TO_ROOM); return; } if ((door = find_door (ch, arg)) >= 0) { /* 'unlock door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if (!IS_SET (pexit->exit_info, EX_CLOSED)) { send_to_char ("It's not closed.\n\r", ch); return; } if (pexit->key < 0) { send_to_char ("It can't be unlocked.\n\r", ch); return; } if (!has_key (ch, pexit->key)) { send_to_char ("You lack the key.\n\r", ch); return; } if (!IS_SET (pexit->exit_info, EX_LOCKED)) { send_to_char ("It's already unlocked.\n\r", ch); return; } REMOVE_BIT (pexit->exit_info, EX_LOCKED); send_to_char ("*Click*\n\r", ch); act ("$n unlocks the $d.", ch, NULL, pexit->keyword, TO_ROOM); /* unlock the other side */ if ((to_room = pexit->u1.to_room) != NULL && (pexit_rev = to_room->exit[rev_dir[door]]) != NULL && pexit_rev->u1.to_room == ch->in_room) { REMOVE_BIT (pexit_rev->exit_info, EX_LOCKED); } } return; }
void do_close (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Close what?\n\r", ch); return; } if ((obj = get_obj_here (ch, arg)) != NULL) { /* portal stuff */ if (obj->item_type == ITEM_PORTAL) { if (!IS_SET (obj->value[1], EX_ISDOOR) || IS_SET (obj->value[1], EX_NOCLOSE)) { send_to_char ("You can't do that.\n\r", ch); return; } if (IS_SET (obj->value[1], EX_CLOSED)) { send_to_char ("It's already closed.\n\r", ch); return; } SET_BIT (obj->value[1], EX_CLOSED); act ("You close $p.", ch, obj, NULL, TO_CHAR); act ("$n closes $p.", ch, obj, NULL, TO_ROOM); return; } /* 'close object' */ if (obj->item_type != ITEM_CONTAINER) { send_to_char ("That's not a container.\n\r", ch); return; } if (IS_SET (obj->value[1], CONT_CLOSED)) { send_to_char ("It's already closed.\n\r", ch); return; } if (!IS_SET (obj->value[1], CONT_CLOSEABLE)) { send_to_char ("You can't do that.\n\r", ch); return; } SET_BIT (obj->value[1], CONT_CLOSED); act ("You close $p.", ch, obj, NULL, TO_CHAR); act ("$n closes $p.", ch, obj, NULL, TO_ROOM); return; } if ((door = find_door (ch, arg)) >= 0) { /* 'close door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if (IS_SET (pexit->exit_info, EX_CLOSED)) { send_to_char ("It's already closed.\n\r", ch); return; } SET_BIT (pexit->exit_info, EX_CLOSED); act ("$n closes the $d.", ch, NULL, pexit->keyword, TO_ROOM); send_to_char ("Ok.\n\r", ch); /* close the other side */ if ((to_room = pexit->u1.to_room) != NULL && (pexit_rev = to_room->exit[rev_dir[door]]) != 0 && pexit_rev->u1.to_room == ch->in_room) { CHAR_DATA *rch; SET_BIT (pexit_rev->exit_info, EX_CLOSED); for (rch = to_room->people; rch != NULL; rch = rch->next_in_room) act ("The $d closes.", rch, NULL, pexit_rev->keyword, TO_CHAR); } } return; }