ackfuss-4.4.0/board/
ackfuss-4.4.0/help/e/
ackfuss-4.4.0/help/f/
ackfuss-4.4.0/help/h/
ackfuss-4.4.0/help/l/
ackfuss-4.4.0/help/n/
ackfuss-4.4.0/help/q/
ackfuss-4.4.0/help/s/
ackfuss-4.4.0/help/u/
ackfuss-4.4.0/help/v/
ackfuss-4.4.0/help/y/
ackfuss-4.4.0/help/z/
ackfuss-4.4.0/player/c/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *       _/          _/_/_/     _/    _/     _/    ACK! MUD is modified    *
 *      _/_/        _/          _/  _/       _/    Merc2.0/2.1/2.2 code    *
 *     _/  _/      _/           _/_/         _/    (c)Stephen Zepp 1998    *
 *    _/_/_/_/      _/          _/  _/             Version #: 4.3          *
 *   _/      _/      _/_/_/     _/    _/     _/                            *
 *                                                                         *
 *                        http://ackmud.nuc.net/                           *
 *                        zenithar@ackmud.nuc.net                          *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 * _/_/_/_/  _/    _/  _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 *
 * _/        _/    _/  _/       _/       copyright Matt Goff (Kline) 2008  *
 * _/_/      _/    _/  _/_/_/_/ _/_/_/_/                                   *
 * _/        _/    _/        _/       _/ Support for this code is provided *
 * _/        _/_/_/_/  _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!*
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "globals.h"

#ifndef DEC_ACT_INFO_H
#include "h/act_info.h"
#endif

#ifndef DEC_COMM_H
#include "h/comm.h"
#endif

#ifndef DEC_DB_H
#include "h/db.h"
#endif

#ifndef DEC_FIGHT_H
#include "h/fight.h"
#endif

#ifndef DEC_HANDLER_H
#include "h/handler.h"
#endif

#define DEC_TRIGGER( fun )		TRIGGER_FUN  fun

typedef void TRIGGER_FUN args( ( CHAR_DATA * ch, OBJ_DATA * obj ) );

struct trigger_type
{
   char *name;
   bool always_extract;
   TRIGGER_FUN *func;
};

DEC_TRIGGER( trig_transfer );
DEC_TRIGGER( trig_restore );
DEC_TRIGGER( trig_slay );
DEC_TRIGGER( trig_transform );

const struct trigger_type trigger_table[] = {
   {"Transfer", FALSE, trig_transfer},
   {"Restore", TRUE, trig_restore},
   {"Slay", FALSE, trig_slay},
   {"Transform", TRUE, trig_transform},
   {NULL, FALSE, NULL,}
};

void trigger_show( CHAR_DATA * ch )
{
   char buf[MAX_STRING_LENGTH];

   snprintf( buf, MSL, "Trigger objects information:\r\n" );

   strncat( buf, "v1  Name           v2		    v3\r\n", MSL );
   strncat( buf, "--  ----        ---------       ---------\r\n", MSL );
   strncat( buf, " 1  Transport   Room vnum          N/A\r\n", MSL );
   strncat( buf, " 2  Restore	    N/A		    N/A\r\n", MSL );
   strncat( buf, " 3  Slay	    N/A	            N/A\r\n", MSL );
   strncat( buf, " 4  Transform   Mob Vnum	    N/A\r\n", MSL );
   strncat( buf, "v0 determines what action causes the trigger:\r\n", MSL );
   strncat( buf, "blah blah blah", MSL );
   send_to_char( buf, ch );
   return;
}


void trigger_handler( CHAR_DATA * ch, OBJ_DATA * obj, int trigger )
{
   int a;

   if( ( obj->item_type != ITEM_TRIGGER ) || ( obj->value[0] != trigger ) )
      return;

   /*
    * Find trigger in table and call function 
    */
   for( a = 0; trigger_table[a].name != NULL; a++ )
      if( a == obj->value[1] )
      {
         ( *trigger_table[a].func ) ( ch, obj );
         if(  IS_OBJ_STAT(obj,ITEM_EXTRA_TRIG_DESTROY) || trigger_table[a].always_extract )
         {
            extract_obj( obj );
         }
         return;
      }

   bug( "Trigger_handler: trigger number %d not found.", trigger );
   return;
}

void trig_transfer( CHAR_DATA * ch, OBJ_DATA * obj )
{
   ROOM_INDEX_DATA *location;

   if( ( location = get_room_index( obj->value[2] ) ) == NULL )
   {
      bug( "Trig_transfer: Obj has invalid v2.", 0 );
      return;
   }

   if( obj->short_descr != NULL && strlen(obj->short_descr) > 0 )
   {
    act( "$p glows brightly!", ch, obj, NULL, TO_CHAR );
    act( "$p glows brightly!", ch, obj, NULL, TO_ROOM );
   }
   if( ch->position == POS_FIGHTING )
      stop_fighting( ch, TRUE );

   act( "$n vanishes suddenly!", ch, NULL, NULL, TO_ROOM );
   send_to_char( "You vanish suddenly!\r\n", ch );
   char_from_room( ch );
   char_to_room( ch, location );
   do_look( ch, "auto" );
   act( "$n suddenly appears before you!", ch, NULL, NULL, TO_ROOM );
   return;
}

void trig_restore( CHAR_DATA * ch, OBJ_DATA * obj )
{
   act( "A beam of white light from $p sweeps over $n!", ch, obj, NULL, TO_ROOM );
   act( "A beam of white light from $p sweeps over you!", ch, obj, NULL, TO_ROOM );
   ch->hit = ch->max_hit;
   ch->mana = ch->max_mana;
   ch->move = ch->max_move;
   send_to_char( "You feel very healthy!\r\n", ch );
   return;
}

void trig_slay( CHAR_DATA * ch, OBJ_DATA * obj )
{
   act( "A beam of black light from $p obliterates $n!!", ch, obj, NULL, TO_ROOM );
   act( "A beam of black light from $p obliterates you!", ch, obj, NULL, TO_CHAR );
   raw_kill( ch, "" );
   return;
}

void trig_transform( CHAR_DATA * ch, OBJ_DATA * obj )
{
   MOB_INDEX_DATA *mob;
   CHAR_DATA *cnew;

   if( ( mob = get_mob_index( obj->value[2] ) ) == NULL )
   {
      bugf( "Trig_transform: invalid value[2] (%d) for object vnum %d", obj->value[2], obj->pIndexData->vnum );
      return;
   }

   act( "$p starts glowing brightly!", ch, obj, NULL, TO_ROOM );
   act( "$p starts glowing brightly!", ch, obj, NULL, TO_CHAR );

   if( obj->carried_by != NULL )
   {
      act( "$n drops $p in shock and steps back.", ch, obj, NULL, TO_ROOM );
      act( "You drop $p in shock and step back.", ch, obj, NULL, TO_CHAR );
   }

   cnew = create_mobile( mob );
   char_to_room( cnew, ch->in_room );

   act( "$p slowly turns into $n!!!", cnew, obj, NULL, TO_ROOM );
   return;
}