/*
....[@@@..[@@@..............[@.................. 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.h
*/
#ifndef _ACTION_H
#define _ACTION_H
#include "io.h"
#include "streamable.h"
#include "nameable.h"
#include "vmobject.h"
class MudObject;
const int ACTION_NORMAL = 0; // A char command. This is for the
// doing ptr. An action with this type
// is something like a spell cast
const int ACTION_TRIGGER = 1; // something triggers the func
const int ACTION_COMMAND = 2; // a PC command triggers the func
const int ACTION_TICK = 3; // function called every "tick"
const int ACTION_MAX = 4;
// Trigger actions are usually permenant
const int TRIGGER_ENTER = 0;
const int TRIGGER_SAY = 1;
const int TRIGGER_LEAVE = 2;
const int TRIGGER_CAST = 3;
const int TRIGGER_FIGHT = 4;
const int TRIGGER_TIMER = 5;
const int TRIGGER_GROUP_ENTER = 6;
const int TRIGGER_GROUP_LEAVE = 7;
const int MAX_TRIGGER_BITS = 8;
typedef void ( *a_func )( MudObject *, MudObject *, void * );
class Action : public Streamable, public Nameable, public virtual VMObject
{
private:
static int total_count;
protected:
a_func da_func;
MudObject *target;
MudObject *owner;
//int t_type
//int a_type
int total_time;
int counter;
int type;
unsigned long trigger_bits[MAX_TRIGGER_BITS];
void *extra_data;
String tag; // possible tag for use with prompt.
// (eg. when casting a spell <CASTING>
// is added to prompt)
public:
Action( )
: da_func(0), target(0), owner(0), total_time(0),
counter(0), type(0), extra_data(0), tag("None")
{
total_count++;
memset( (void *)trigger_bits, 0,
sizeof( trigger_bits[0] ) * MAX_TRIGGER_BITS );
}
Action( MudObject * own, a_func func )
: da_func(func), target(0), owner(own),
total_time(0), counter(0), type(0), extra_data(0),
tag("None")
{
total_count++;
memset( (void *)trigger_bits, 0,
sizeof( trigger_bits[0] ) * MAX_TRIGGER_BITS );
}
Action( MudObject * own, MudObject * tar, a_func func )
: da_func(func), target(tar), owner(own),
total_time(0), counter(0), type(0), extra_data(0),
tag("None")
{
total_count++;
memset( (void *)trigger_bits, 0,
sizeof( trigger_bits[0] ) * MAX_TRIGGER_BITS );
}
~Action();
void extract() { fromWorld(); }
virtual vmtype getVMType() { return VMT_ACTION; }
virtual void callDaFunc( void ) { da_func( owner, target, NULL ); }
virtual void interrupt( void );
a_func getDaFunc( void ) const { return da_func; }
void setDaFunc( a_func func ) { da_func = func; }
void setTarget( MudObject *x ) { target = x; }
MudObject *getTarget( void ) const { return target; }
void setOwner( MudObject *x ) { owner = x; }
MudObject *getOwner( void ) const { return owner; }
void setTotalTime( int t );
int getTotalTime( void ) const { return total_time; }
void setType( int );
int getType( void ) const { return type; }
void setTag( const char * x ) { tag = x; }
void setTag( const String & x ) { tag = x; }
const String & getTag( void ) const { return tag; }
void resetCounter( void ) { counter = 0; }
virtual void update( void );
// This must be called on ANY action type
void toWorld( void );
void fromWorld( void );
// These two methods either set the doing ptr or add to
// the linked list depending on the owner and the action type
// Set type 0 to set action ptr
void toOwner( void );
void fromOwner( void );
void toTarget( void );
void fromTarget( void );
void attach( void );
void detach( void );
void setExtraData( void * x ) { extra_data = x; }
void *getExtraData( void ) const { return extra_data; }
int readFrom( StaticInput & ) { return -1; }
int writeTo( Output & ) const { return -1; }
static int getTotalCount() { return total_count; }
};
#endif