/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project. All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion) msmith@hom.net
MUD++ development mailing list mudpp@van.ml.org
------------------------------------------------------------------------------
action.cc
*/
#include "config.h"
#include "action.h"
#include "string.h"
#include "room.h"
#include "llist.h"
#include "repop.h"
#include "bit.h"
#include "combat.h"
#include "char.h"
#include "area.h"
#include "object.h"
#include "affect.h"
#include "pc.h"
#include "global.h"
// todo - need to add something to put action onto owner's llist
const bitType trigger_bit_list[] =
{
{0, 0 },
{"enter", TRIGGER_ENTER },
{"say", TRIGGER_SAY },
{"leave", TRIGGER_LEAVE },
{"cast" , TRIGGER_CAST },
{"fight", TRIGGER_FIGHT },
{"timer", TRIGGER_TIMER },
{"groupenter", TRIGGER_GROUP_ENTER },
{"groupleave", TRIGGER_GROUP_LEAVE },
{0, 0 }
};
int Action::total_count = 0;
/*
============
Action::~Action destructor
Action destructor - removes action from global list
============
*/
Action::~Action()
{
total_count--;
// Remove from global list
// already done in extract
// fromWorld();
}
/*
============
Action::update
Updates an action. Updates the action timer and calls the action func
if timer ends
============
*/
void Action::update( void )
{
PC * player;
if( owner && owner->isChar() && (( Char * )owner)->isPC() )
{
player = ( PC * ) owner;
// Players not playing should not have actions
if ( player->getState() < STATE_PLAYING )
{
interrupt();
return;
}
// Suspend action until player reconnects
// TEST this code! It may better to allow actions to
// finish even though player is not there (or editing).
// (eg. when a player drops link while fighting, and while
// casting a spell, it may be better to allow the spell to
// finish because when the player reconnects, the fight
// may be over!)
if ( !player->getSocket() )
return;
// Suspend action until player is done editing or reading
// mail. Test this too
if ( player->getState() > STATE_PLAYING )
return;
}
// if time is up, call the function
if ( counter++ >= total_time )
{
detach();
if ( da_func )
callDaFunc();
// We've done our duty so go bye-bye
this->fordelete();
}
}
/*
============
Action::setTotalTime
Sets the amount of time for the timer to wait
============
*/
void Action::setTotalTime( int t )
{
total_time = t;
}
/*
============
Action::interrupt
Interrupts this action. action is destroyed and removed from all lists
============
*/
void Action::interrupt( void )
{
detach();
this->extract();
this->fordelete();
}
/*
============
Action::setType
Sets the action's type (ACTION_????)
============
*/
void Action::setType( int t )
{
if ( type < ACTION_MAX && type > -1 )
type = t;
}
/*
============
Action::toWorld
Adds action to global list (must be called so it gets updated!)
============
*/
void Action::toWorld( void )
{
actions.addTop( this );
}
/*
============
Action::fromWorld
Removes action from the global list (called by destructor)
============
*/
void Action::fromWorld( void )
{
actions.remove( this );
}
/*
============
Action::toOwner
Attaches the action to either the owner's doing pointer or to its
linked list (triggers are attached to llist and regular commands, like cast,
are attached to the doing ptr)
============
*/
void Action::toOwner( void )
{
if ( owner )
{
if ( type == ACTION_NORMAL && owner->isChar() )
{
if ( ! (( Char * )owner)->doing )
(( Char * )owner)->doing = this;
else
Cout << "BUG: Action::toOwner - owner already has an action\n";
}
else
owner->o_list.addTop( this );
}
}
/*
============
Action::fromOwner
Remove action from the owner's list
============
*/
void Action::fromOwner()
{
if ( owner )
{
if ( type == ACTION_NORMAL && owner->isChar() )
if ( (( Char * )owner )->doing )
(( Char * )owner)->doing = 0;
else
Cout << "BUG: Action::fromOwner - owner has no action\n";
else
owner->o_list.remove( this );
}
}
/*
============
Action::toTarget
Attach action to the target's llist of target actions
============
*/
void Action::toTarget( void )
{
if ( target )
target->t_list.addTop( this );
}
/*
============
Action::fromTarget
Remove action from target's llist of target actions
============
*/
void Action::fromTarget( void )
{
if ( target )
target->t_list.remove( this );
}
/*
============
Action::attach
Attach action to both target and owner
============
*/
void Action::attach( void )
{
toOwner();
toTarget();
}
/*
============
Action::detach
Remove action from both target and owner
============
*/
void Action::detach( void )
{
fromOwner();
fromTarget();
}