/* 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; }
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; }
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 ; }
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 ); }