예제 #1
0
파일: traps.c 프로젝트: blanciq/bq-killer
/* 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;
}
예제 #2
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 );
}
예제 #3
0
파일: traps.c 프로젝트: blanciq/bq-killer
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;
}
예제 #4
0
파일: traps.c 프로젝트: blanciq/bq-killer
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;
}
예제 #5
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 );
}
예제 #6
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 ;
}
예제 #7
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 );
}
예제 #8
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 );
}
예제 #9
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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 ;
}
예제 #10
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
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;
}
예제 #11
0
파일: room_trig.c 프로젝트: Tener/KillerMUD
/* 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 );
}