Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
0
/*
 * 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);
}
Exemplo n.º 3
0
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 );
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
		  }
	      }
	  }
      }
}
Exemplo n.º 6
0
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;
	}
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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 );
}
Exemplo n.º 10
0
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 ;
}
Exemplo n.º 11
0
/*
 * 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 );
}
Exemplo n.º 12
0
/*
 * 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;
}
Exemplo n.º 13
0
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 );
}
Exemplo n.º 14
0
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 );
}
Exemplo n.º 15
0
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 ;
}
Exemplo n.º 16
0
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;
}
Exemplo n.º 17
0
/* 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 );
}
Exemplo n.º 18
0
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;
}