/* odpala trapy na obiektach, jesli powinien */ bool obj_trap_handler( CHAR_DATA *ch, OBJ_DATA *obj, int type ) { TRAP_DATA * trap; char buf[ MAX_INPUT_LENGTH ]; if ( !ch || !ch->in_room || obj->trap <= 0 ) return FALSE; if ( ( trap = get_trap_index( obj->trap ) ) == NULL ) return FALSE; if ( !trap->active || !IS_SET( trap->type, type ) ) return FALSE; if ( !supermob ) init_supermob(); char_from_room ( supermob ); char_to_room( supermob, ch->in_room ); obj->trap = 0; sprintf( buf, "trap%d", trap->vnum ); create_rprog_env( buf, trap->triggered, ch->in_room, ch, obj, NULL, NULL, NULL ); program_flow(); release_supermob(); /* jednorazowo!!! */ return TRUE; }
/* * 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); }
bool rp_input_trigger( CHAR_DATA *ch, char * string ) { char buf[ MAX_STRING_LENGTH ]; PROG_LIST *prg; for ( prg = ch->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == &TRIG_INPUT ) { if ( prg->trig_phrase[ 0 ] == '@' ) { sprintf( buf, "%s\n", string ); if ( !regexp_match( prg->trig_phrase + 1, buf ) ) continue; } else if ( prg->trig_phrase[ 0 ] == '*' ) { if ( str_prefix( string, prg->trig_phrase + 1 ) ) continue; } else { if ( str_cmp( string, prg->trig_phrase ) ) continue; } rset_supermob( ch->in_room ); create_rprog_env( prg->name, prg->code, ch->in_room, ch, NULL, NULL, prg->trig_type, string ); program_flow(); release_supermob(); return ( TRUE ); } } return ( FALSE ); }
bool room_exit_trap_handler( CHAR_DATA *ch, EXIT_DATA *pexit, int type ) { TRAP_DATA * trap; char buf[ MAX_INPUT_LENGTH ]; if ( !ch || !ch->in_room || !pexit || pexit->trap <= 0 ) return FALSE; if ( ( trap = get_trap_index( pexit->trap ) ) == NULL ) return FALSE; if ( !trap->active || !IS_SET( trap->type, type ) || !IS_SET( pexit->exit_info, EX_TRAP ) ) return FALSE; if ( !supermob ) init_supermob(); char_from_room ( supermob ); char_to_room( supermob, ch->in_room ); REMOVE_BIT( pexit->exit_info, EX_TRAP ); sprintf( buf, "trap%d", trap->vnum ); create_rprog_env( buf, trap->triggered, ch->in_room, ch, NULL, NULL, NULL, NULL ); program_flow(); release_supermob(); return TRUE; }
void mp_give_trigger (CHAR_DATA * mob, CHAR_DATA * ch, OBJ_DATA * obj) { char buf[MAX_INPUT_LENGTH], *p; MPROG_LIST *prg; for (prg = mob->pIndexData->mprogs; prg; prg = prg->next) if (prg->trig_type == TRIG_GIVE) { p = prg->trig_phrase; /* * Vnum argument */ if (is_number (p)) { if (obj->pIndexData->vnum == atoi (p)) { program_flow (prg->vnum, prg->code, mob, ch, (void *) obj, NULL); return; } } /* * Object name argument, e.g. 'sword' */ else { while (*p) { p = one_argument (p, buf); if (is_name (buf, obj->name) || !str_cmp ("all", buf)) { program_flow (prg->vnum, prg->code, mob, ch, (void *) obj, NULL); return; } } } } }
void mp_hprct_trigger( CHAR_DATA *mob, CHAR_DATA *ch ) { MPROG_LIST *prg; for ( prg = mob->pIndexData->mprogs; prg != NULL; prg = prg->next ) if ( ( prg->trig_type == TRIG_HPCNT ) && ( (100 * mob->hit / mob->max_hit) < atoi( prg->trig_phrase ) ) ) { program_flow( prg->vnum, prg->code, mob, ch, NULL, NULL ); break; } }
bool mp_exit_trigger (CHAR_DATA * ch, int dir) { CHAR_DATA *mob; MPROG_LIST *prg; for (mob = ch->in_room->people; mob != NULL; mob = mob->next_in_room) { if (IS_NPC (mob) && (HAS_TRIGGER (mob, TRIG_EXIT) || HAS_TRIGGER (mob, TRIG_EXALL))) { for (prg = mob->pIndexData->mprogs; prg; prg = prg->next) { /* * Exit trigger works only if the mobile is not busy * (fighting etc.). If you want to be sure all players * are caught, use ExAll trigger */ if (prg->trig_type == TRIG_EXIT && dir == atoi (prg->trig_phrase) && mob->position == mob->pIndexData->default_pos && can_see (mob, ch)) { program_flow (prg->vnum, prg->code, mob, ch, NULL, NULL); return TRUE; } else if (prg->trig_type == TRIG_EXALL && dir == atoi (prg->trig_phrase)) { program_flow (prg->vnum, prg->code, mob, ch, NULL, NULL); return TRUE; } } } } return FALSE; }
bool room_trap_handler( CHAR_DATA *ch ) { TRAP_DATA * trap; int chance = 50; char buf[ MAX_INPUT_LENGTH ]; if ( IS_NPC( ch ) ) return FALSE; if ( !ch || !ch->in_room ) return FALSE; if ( ( trap = get_trap_index( ch->in_room->trap ) ) == NULL ) return FALSE; if ( !trap->active || !EXT_IS_SET( ch->in_room->room_flags, ROOM_TRAP ) ) return FALSE; chance += 5 * trap->level; switch ( ch->class ) { case CLASS_THIEF: chance -= 2*ch->level; chance -= UMAX( 0, get_curr_stat_deprecated( ch, STAT_DEX ) - 18 ) *5; break; default: chance -= ch->level;break; } chance = URANGE( 10, chance, 95 ); if ( number_percent() > chance ) return FALSE; if ( !supermob ) init_supermob(); char_from_room ( supermob ); char_to_room( supermob, ch->in_room ); EXT_REMOVE_BIT( ch->in_room->room_flags, ROOM_TRAP ); sprintf( buf, "trap%d", trap->vnum ); create_rprog_env( buf, trap->triggered, ch->in_room, ch, NULL, NULL, NULL, NULL ); program_flow(); release_supermob(); return TRUE; }
bool rp_locks_trigger( CHAR_DATA *ch, int exit, BITVECT_DATA *type ) { PROG_LIST * prg; for ( prg = ch->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type && exit == atoi( prg->trig_phrase ) ) { rset_supermob( ch->in_room ); create_rprog_env( prg->name, prg->code, ch->in_room, ch, NULL, NULL, prg->trig_type, prg->trig_phrase ); program_flow(); release_supermob(); return ( TRUE ); } } return ( FALSE ); }
void rp_act_trigger( char *argument, CHAR_DATA *ch, BITVECT_DATA *type ) { PROG_LIST * prg; for ( prg = ch->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type && !str_infix( prg->trig_phrase, argument ) ) { rset_supermob( ch->in_room ); create_rprog_env( prg->name, prg->code, ch->in_room, ch, NULL, NULL, prg->trig_type, prg->trig_phrase ); program_flow(); release_supermob(); break; } } return ; }
/* * A general purpose percentage trigger. Checks if a random percentage * number is less than trigger phrase */ bool mp_percent_trigger( CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, int type ) { MPROG_LIST *prg; for ( prg = mob->pIndexData->mprogs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type && number_percent() < atoi( prg->trig_phrase ) ) { program_flow( prg->vnum, prg->code, mob, ch, arg1, arg2 ); return ( TRUE ); } } return ( FALSE ); }
/* * A general purpose string trigger. Matches argument to a string trigger * phrase. */ void mp_act_trigger( char *argument, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, int type ) { MPROG_LIST *prg; for ( prg = mob->pIndexData->mprogs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type && strstr( argument, prg->trig_phrase ) != NULL ) { program_flow( prg->vnum, prg->code, mob, ch, arg1, arg2 ); break; } } return; }
bool rp_exit_trigger( CHAR_DATA *ch, int door ) { PROG_LIST * prg; for ( prg = ch->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == &TRIG_EXIT && door == atoi( prg->trig_phrase ) ) { rset_supermob( ch->in_room ); create_rprog_env( prg->name, prg->code, ch->in_room, ch, NULL, NULL, prg->trig_type, prg->trig_phrase ); program_flow(); release_supermob(); return ( TRUE ); } } return ( FALSE ); }
bool rp_percent_trigger( CHAR_DATA *mob, CHAR_DATA *ch, void *arg1, void *arg2, BITVECT_DATA *type ) { PROG_LIST * prg; if ( !mob ) return ( FALSE ); for ( prg = mob->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type && number_percent() <= atoi( prg->trig_phrase ) ) { create_rprog_env( prg->name, prg->code, mob->in_room, ch, arg1, arg2, prg->trig_type, prg->trig_phrase ); program_flow(); return ( TRUE ); } } return ( FALSE ); }
void rp_time_trigger( ROOM_INDEX_DATA *room, int time ) { PROG_LIST * prg; for ( prg = room->progs; prg; prg = prg->next ) { if ( prg->trig_type == &TRIG_TIME && time == atoi( prg->trig_phrase ) ) { rset_supermob( room ); create_rprog_env( prg->name, prg->code, room, NULL, NULL, NULL, prg->trig_type, prg->trig_phrase ); program_flow(); release_supermob(); break; } } return ; }
bool rp_precommand_trigger( ROOM_INDEX_DATA *room, CHAR_DATA *victim, OBJ_DATA *obj, DO_FUN * fun, char *fun_name, char *argument ) { PROG_LIST * prg; for ( prg = room->progs; prg; prg = prg->next ) { if ( prg->trig_type == &TRIG_PRECOMMAND && !str_cmp( prg->trig_phrase, fun_name ) ) { victim->precommand_fun = fun; free_string( victim->precommand_arg ); victim->precommand_arg = str_dup( argument ); victim->precommand_pending = FALSE; create_rprog_env( prg->name, prg->code, room, victim, ( void * ) obj, NULL, prg->trig_type, prg->trig_phrase ); release_supermob(); program_flow(); return TRUE; } } return FALSE; }
/* sit, rest, sleep + object ewentualny */ bool rp_pos_trigger( CHAR_DATA *ch, OBJ_DATA *obj, BITVECT_DATA *type ) { PROG_LIST * prg; for ( prg = ch->in_room->progs; prg != NULL; prg = prg->next ) { if ( prg->trig_type == type ) if ( ( is_number( prg->trig_phrase ) && obj != NULL && ( obj->pIndexData->vnum == atoi( prg->trig_phrase ) ) ) || !str_cmp( prg->trig_phrase, "none" ) ) { rset_supermob( ch->in_room ); create_rprog_env( prg->name, prg->code, ch->in_room, ch, obj, NULL, prg->trig_type, prg->trig_phrase ); program_flow(); release_supermob(); return ( TRUE ); } } return ( FALSE ); }
void mp_bribe_trigger( CHAR_DATA *mob, CHAR_DATA *ch, int amount ) { MPROG_LIST *prg; /* * Original MERC 2.2 MOBprograms used to create a money object * and give it to the mobile. WFT was that? Funcs in act_obj() * handle it just fine. */ for ( prg = mob->pIndexData->mprogs; prg; prg = prg->next ) { if ( prg->trig_type == TRIG_BRIBE && amount >= atoi( prg->trig_phrase ) ) { program_flow( prg->vnum, prg->code, mob, ch, NULL, NULL ); break; } } return; }