/*
....[@@@..[@@@..............[@.................. 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
------------------------------------------------------------------------------
affect.h
*/
#ifndef _AFFECT_H
#define _AFFECT_H
#include "llist.h"
#include "io.h"
#include "streamable.h"
#include "bit.h"
#include "spell.h"
extern const bitType affect_type_list[];
extern const bitType mod_type_list[];
inline int lookupAffectType( const char * x )
{ return lookupBit( affect_type_list, x ); }
inline const char * lookupAffectName( int x )
{ return lookupBitName( affect_type_list, x ); }
inline int lookupModType( const char * x )
{ return lookupBit( mod_type_list, x ); }
inline const char * lookupModName( int x )
{ return lookupBitName( mod_type_list, x ); }
const int AFF_INVIS = 1;
const int AFF_BLIND = 2;
const int AFF_SANCTUARY = 3;
const int AFF_SLEEP = 4;
const int AFF_CHARM = 5;
const int AFF_POISON = 6;
const int AFF_CURSE = 7;
const int AFF_GIANT = 8;
const int AFF_DET_INVIS = 9;
const int AFF_DET_HIDDEN = 10;
const int AFF_DET_MAGIC = 11;
const int MOD_STR = 1;
const int MOD_DEX = 2;
const int MOD_INT = 3;
const int MOD_WIS = 4;
const int MOD_CON = 5;
const int MOD_SPEED = 6;
const int MOD_HP = 7;
const int MOD_MANA = 8;
const int MOD_ENERGY = 9;
const int MOD_AGE = 10;
const int MOD_WEIGHT = 11;
const int MOD_ALIGN = 12;
const int MOD_ARMOR = 13;
const int MOD_DAMROLL = 14;
const int MOD_HITROLL = 15;
// Stat modifiers that aren't specifically finite in duration or
// resulting from a spell affect. Magic items that take affect when
// worn will apply Modifiers to the char which are negated when
// removed. There is no actual list data stucture -on- the char to
// hold Mods, rather the list of mods on an item is applied and negated
// when worn/removed
class Modifier
{
private:
int type; // What does it modify? (str,int,hp)
int amt; // By how much does it mod?
public:
Modifier()
: type( 0 ), amt( 0 )
{
}
Modifier( int t, int a )
: type( t ), amt( a )
{
}
int getType() const { return type; }
int getAmt() const { return amt; }
const char * getName() { return lookupModName( type ); }
};
class Spell;
class Affect : public Streamable, public virtual VMObject
{
private:
static int total_count;
const SpellType * spell;
int type; // const int affect types
int duration; // How long it lasts, in hours.
int level; // strength or level
public:
LList< Modifier > mod_list; // List of attribute mods
Affect()
: spell(0), type(0), duration(0), level(0)
{
total_count++;
}
// The preferred way to create affects
// Example:
//
// SPELL( spell_giant_form )
// {
// if( victim->isAffected( AFF_GIANT )
// return;
//
// Affect *paf = new Affect( spell, AFF_GIANT, 10, level );
//
// paf->addMod( MOD_STR, 2 );
// paf->addMod( MOD_DEX, -1 );
// paf->addMod( MOD_HP, 100 );
//
// victim->addAffect( paf );
// }
Affect( const SpellType *sp, int t, int d, int l )
: spell( sp ), type( t ), duration( d ), level( l )
{
total_count++;
}
~Affect() { total_count--; }
virtual vmtype getVMType() { return VMT_AFFECT; }
int writeTo( Output & ) const;
int readFrom( StaticInput & );
// Not implemented, shuts up Solaris Pro C++
int writeTo( const String & ) const { return -1; }
int readFrom( const String & ) { return -1; }
int pulse() { return --duration; }
void addMod( int, int );
void setType( int x ) { type = x; }
int getType() { return type; }
void setTimer( int x ) { duration = x; }
int getTimer() { return duration; }
const SpellType * getSpellType() { return spell; }
void setSpellType( const SpellType * x ) { spell = x; }
int getLevel() const { return level; }
void setLevel( int x ) { level = x; }
static int getTotalCount() { return total_count; }
};
inline void Affect::addMod( int t, int a )
{
Modifier *pmod = new Modifier( t, a );
mod_list.add( pmod );
}
#endif