/*
....[@@@..[@@@..............[@.................. 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
------------------------------------------------------------------------------
object.h
*/
#ifndef _OBJECT_H
#define _OBJECT_H
#include "thing.h"
#include "streamable.h"
#include "action.h"
#include "mudobj.h"
#include "trigs.h"
extern const bitType obj_type_list[];
extern const bitType obj_bit_list[];
extern const bitType wear_bit_list[];
const int OBJ_UNUSED = 0;
const int OBJ_INVISIBLE = 1; // obsolete, use invis member of class Thing
const int OBJ_HIDDEN = 2;
const int OBJ_NOTAKE = 3;
const int OBJ_NODROP = 4;
const int OBJ_EDIBLE = 5;
const int OBJ_NOSAVE = 6;
const int OBJ_GOOD = 7;
const int OBJ_EVIL = 8;
const int OBJ_ANTIGOOD = 9;
const int OBJ_ANTIEVIL = 10;
const int OBJ_ANTINEUTRAL = 11;
const int OBJ_MAGIC = 12;
const int OBJ_GLOW = 13;
const int OBJ_SANCTUARY = 14;
const int OBJ_POISONED = 15;
const int ITEM_UNUSED = 0;
const int ITEM_TRASH = VMT_OBJ_TRASH;
const int ITEM_JEWEL = VMT_OBJ_JEWEL;
const int ITEM_GOLD = VMT_OBJ_GOLD;
const int ITEM_CONTAINER = VMT_OBJ_CONTAINER;
const int ITEM_LIQUID_CONTAINER = VMT_OBJ_LIQUID_CONTAINER;
const int ITEM_ARMOR = VMT_OBJ_ARMOR;
const int ITEM_CLOTH = VMT_OBJ_CLOTH;
const int ITEM_WEAPON = VMT_OBJ_WEAPON;
const int ITEM_CORPSE = VMT_OBJ_CORPSE;
const int ITEM_ENERGY = VMT_OBJ_ENERGY;
const int ITEM_COMPASS = VMT_OBJ_COMPASS;
//const int ITEM_MIN_MAGIC = VMT_OBJ_; //--
const int ITEM_WAND = VMT_OBJ_WAND;
const int ITEM_STAFF = VMT_OBJ_STAFF;
const int ITEM_ORB = VMT_OBJ_ORB;
const int ITEM_SCROLL = VMT_OBJ_SCROLL;
const int ITEM_POTION = VMT_OBJ_POTION;
const int ITEM_FOOD = VMT_OBJ_FOOD;
const int ITEM_KEY = VMT_OBJ_KEY;
//const int ITEM_MAX_MAGIC = VMT_OBJ_; //--
const int WEAR_NONE = 0;
const int WEAR_HEAD = 1;
const int WEAR_FACE = 2;
const int WEAR_NECK = 3;
const int WEAR_BACK = 4;
const int WEAR_BODY = 5;
const int WEAR_ARMS = 6;
const int WEAR_WRIST = 7;
const int WEAR_HANDS = 8;
const int WEAR_HOLD = 9;
const int WEAR_FINGER = 10;
const int WEAR_WAIST = 11;
const int WEAR_LEGS = 12;
const int WEAR_FEET = 13;
const int WEAR_SHIELD = 14;
const int WEAR_WIELD = 15;
// Wear positions - bitnums correspond to array positions in eq_list[]
const int EQ_UNDEFINED = 0;
const int EQ_MIN = 1;
const int EQ_HEAD = 1;
const int EQ_FACE = 2;
const int EQ_NECK_1 = 3;
const int EQ_NECK_2 = 4;
const int EQ_BACK = 5;
const int EQ_BODY = 6;
const int EQ_ARMS = 7;
const int EQ_WRIST_L = 8;
const int EQ_WRIST_R = 9;
const int EQ_HANDS = 10;
const int EQ_HOLD_L = 11;
const int EQ_HOLD_R = 12;
const int EQ_FINGER_L = 13;
const int EQ_FINGER_R = 14;
const int EQ_WAIST = 15;
const int EQ_LEGS = 16;
const int EQ_FEET = 17;
const int EQ_SHIELD_L = 18;
const int EQ_SHIELD_R = 19;
const int EQ_WIELD_L = 20;
const int EQ_WIELD_R = 21;
const int EQ_MAX = 21;
const int POISON_LIGHT = 5;
const int POISON_MEDIUM = 10;
const int POISON_SERIOUS = 15;
const int POISON_LETHAL = 20;
const int POISON_LETHAL_TOUCH = 25;
const int MAX_WEAR_BIT_FIELDS = 1;
const int MAX_OBJ_BIT_FIELDS = 1;
struct SpellType;
class Spell;
class Modifier;
class Affect;
class Object;
class Char;
class Object : public Thing, public virtual Streamable
{
private:
static int total_count;
protected:
//Index index;
unsigned long wear_bits [ MAX_WEAR_BIT_FIELDS ];
unsigned long obj_bits [ MAX_OBJ_BIT_FIELDS ];
int condition;
int material;
short wear_pos;
long cost;
Object *in_obj;
Char *in_char;
Repop *repop;
public:
LList<Spell> spell_list; // Spell(s) the object may cast.
LList<Modifier> mod_list; // Magical mods that affect wearer
LList<Object> inv;
Object()
: wear_pos( 0 ), cost( 0 ),
in_obj( 0 ), in_char( 0 ), repop( 0 )
{
total_count++;
memset( (void *)wear_bits, 0, sizeof( wear_bits[0] ) * MAX_WEAR_BIT_FIELDS );
memset( (void *)obj_bits, 0, sizeof( obj_bits[0] ) * MAX_OBJ_BIT_FIELDS );
}
// Copy constructor - don't use directly
// use Object::clone
Object( const Object &x )
: Thing( (Thing&)x ), wear_pos( 0 ),
cost( x.cost ), in_obj( 0 ), in_char( 0 ), repop( 0 ),
spell_list( x.spell_list ), mod_list( x.mod_list )
{
total_count++;
memcpy( (void *)wear_bits, (void * )x.wear_bits,
sizeof( wear_bits[0] ) * MAX_WEAR_BIT_FIELDS );
memcpy( (void *)obj_bits, (void *)x.obj_bits,
sizeof( obj_bits[0] ) * MAX_OBJ_BIT_FIELDS );
}
virtual ~Object();
virtual vmtype getVMType() { return VMT_OBJECT; }
static Object * createObject( int type );
virtual Object * clone() const { return new Object(*this); }
virtual Object * asObj() { return this; }
virtual void extract();
int readFrom( StaticInput &in );
int writeTo( Output & ) const;
virtual int readFromTypeSpecific(StaticInput & ) {return 0; }
virtual int writeToTypeSpecific( Output & ) const {return 0;}
void setObjBit( const String & );
void clrObjBit( const String & );
void toggleObjBit( const String & );
bool objBitSet( int x ) const { return IS_SET( obj_bits, x ); }
void toggleWearBit( int bit );
void toggleWearBit( const String & );
void setWearBit( const String & );
void clrWearBit( const String & );
bool wearBitSet( int x ) const { return IS_SET( wear_bits, x ); }
void out( const char * ) {}
void out( const String & ) {}
void setRepop( Repop * x ) { repop = x; }
Repop * getRepop() { return repop; }
void toWorld();
void fromWorld();
void toChar( Char * );
void fromChar();
void toRoom( Room * );
void fromRoom();
void toObj( Object * );
void fromObj();
Char *inChar() { return in_char; }
Char *carriedBy() { return in_char; }
Object *inObj() { return in_obj; }
void addAffect( Affect * ) {}
void rmAffect( int ) {}
Affect * getAffect( int ) { return 0; }
virtual const char *typeName() const {return "genericObject";}
bool isWearable() const;
int wearPos() const { return wear_pos; }
bool worn() const { return (bool)wear_pos; }
void setWearPos( int pos );
void setCost( int x ) { cost = x; }
int getCost() { return cost; }
virtual bool isGold() const { return false; }
virtual bool isWeapon() const { return false; }
virtual bool isContainer() const { return false; }
virtual bool isLiquidContainer() const { return false; }
virtual bool isArmor() const { return false; }
virtual bool isClothing() const { return false; }
virtual bool isFood() const { return false; }
virtual bool isCorpse() const { return false; }
virtual bool isJewel() const { return false; }
virtual bool isScroll() const { return false; }
virtual bool isPotion() const { return false; }
virtual bool isWand() const { return false; }
virtual bool isStaff() const { return false; }
virtual bool isOrb() const { return false; }
virtual bool isKey() const { return false; }
virtual bool isCompass() const { return false; }
virtual bool isType( int type )
{ return (type == ITEM_UNUSED) ? true : false; }
// Interface for ObjectEditor
virtual void reportVals( String & str ) const;
virtual char * setVals( const String & str );
void describeItself( String &);
Spell * getSpell1(); // Just for utility
Spell * getSpell2();
Spell * getSpell3();
Spell * getSpell4();
void cast( MudObject * );
// inventory methods
void addObjInv( Object * );
inline Object * getObjInv( const char * str)
{ return getObjInv( String(str) ); }
Object * getObjInv( const String & );
Object * getObjInv( countedThing &);
Object * getObjInv( int );
void rmObjInv( Object * );
bool isObject( void ) const { return true; }
static int getTotalCount() { return total_count; }
// Triggers part
bool TgCreated( Room *where, Repop * by );
bool TgUpdate();
bool TgTimerOut();
bool TgPicked( Char *caller, Room * from );
bool TgDropped( Char *caller, Room * to );
bool TgGiven( Char *from, Char * to );
bool TgWorn( Char * caller );
bool TgRemoved( Char * caller );
bool TgUsed(Char * caller, MudObject * target); // or Thing *
bool TgLookedAt( Char * caller );
bool TgItemPutInto( Char * caller, Object * what );
bool TgItemGetFrom( Char * caller, Object * what );
};
extern const bitType obj_bits[];
extern LList<Object> objects;
inline void Object::fromWorld()
{ objects.remove( this ); }
inline void Object::toWorld()
{ objects.add( this ); }
inline int lookupObjType( const char * x )
{ return lookupBit( obj_type_list, x ); }
inline const char * lookupObjTypeName( int x )
{ return lookupBitName( obj_type_list, x ); }
inline int getObjBit( const String & x )
{ return lookupBit( obj_bit_list, x ); }
inline const char * getObjBitName( int x )
{ return lookupBitName( obj_bit_list, x ); }
inline int getWearBit( const String & x )
{ return lookupBit( wear_bit_list, x ); }
inline const char * getWearBitName( int x )
{ return lookupBitName( wear_bit_list, x ); }
// Derived classes
/*
class ObjTemplate : public Object
{
protected:
int values;
public:
ObjTemplate()
: values(0)
{}
ObjTemplate( const ObjTemplate & x)
: Object(x), values(x.values)
{}
virtual ~ObjTemplate() {}
virtual Object * clone() const { return new ObjTemplate(*this); }
virtual vmtype getVMType() { return VMT_OBJ_TEMPLATE; }
virtual int readFromTypeSpecific( StaticInput & in );
virtual int writeToTypeSpecific( Output & out ) const;
virtual void reportVals( String & str ) const;
virtual char * setVals( const String & str );
virtual bool isTemplate() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_TEMPLATE); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_TEMPLATE ) ? true : Object::isType(type); }
int getValues() { return values; }
void setValues(int x) { values = x; }
};
*/
class ObjWeapon : public Object
{
protected:
int dam_type;
int min_dam;
int max_dam;
public:
ObjWeapon()
: dam_type(0), min_dam(0), max_dam(0)
{ }
ObjWeapon( const ObjWeapon & x )
: Object( x ), dam_type(x.dam_type), min_dam(x.min_dam),
max_dam(x.max_dam)
{ }
virtual ~ObjWeapon() {}
virtual Object * clone() const { return new ObjWeapon(*this); }
virtual vmtype getVMType() { return VMT_OBJ_WEAPON; }
virtual void reportVals( String & str ) const;
virtual char * setVals( const String & str );
virtual int readFromTypeSpecific( StaticInput & in );
virtual int writeToTypeSpecific( Output & out ) const;
virtual bool isWeapon() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_WEAPON); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_WEAPON ) ? true : Object::isType(type); }
int getDamType() const { return dam_type; }
void setDamType( int x ) { dam_type = x; }
int getMinDam() const { return min_dam; }
int getMaxDam() const { return max_dam; }
};
class ObjFood : public Object
{
protected:
int food_worth;
public:
ObjFood()
: food_worth(0)
{}
ObjFood( const ObjFood & x)
: Object(x), food_worth(x.food_worth)
{}
virtual ~ObjFood() {}
virtual Object * clone() const { return new ObjFood(*this); }
virtual vmtype getVMType() { return VMT_OBJ_FOOD; }
virtual int readFromTypeSpecific( StaticInput & in );
virtual int writeToTypeSpecific( Output & out ) const;
virtual void reportVals( String & str ) const;
virtual char * setVals( const String & str );
virtual bool isFood() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_FOOD); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_FOOD ) ? true : Object::isType(type); }
int getFoodWorth() { return food_worth; }
void setFoodWorth(int x) { food_worth = x; }
};
class ObjLiquidContainer : public Object
{
protected:
int amount;
public:
ObjLiquidContainer()
: amount(0)
{}
ObjLiquidContainer( const ObjLiquidContainer & x)
: Object(x), amount(x.amount)
{}
virtual ~ObjLiquidContainer() {}
virtual Object * clone() const { return new ObjLiquidContainer(*this); }
virtual vmtype getVMType() { return VMT_OBJ_LIQUID_CONTAINER; }
virtual int readFromTypeSpecific( StaticInput & in );
virtual int writeToTypeSpecific( Output & out ) const;
virtual void reportVals( String & str ) const;
virtual char * setVals( const String & str );
virtual bool isLiquidContainer() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_LIQUID_CONTAINER); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_LIQUID_CONTAINER ) ? true : Object::isType(type); }
int getAmount() { return amount; }
void setAmount(int x) { amount = x; }
};
class ObjCorpse : public Object
{
protected:
int values;
public:
ObjCorpse()
: values(0)
{}
ObjCorpse( const ObjCorpse & x)
: Object(x), values(x.values)
{}
virtual ~ObjCorpse() {}
virtual Object * clone() const { return new ObjCorpse(*this); }
virtual vmtype getVMType() { return VMT_OBJ_CORPSE; }
virtual int readFromTypeSpecific( StaticInput & ) {return 0;}
virtual int writeToTypeSpecific( Output & ) const {return 0;}
virtual bool isCorpse() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_CORPSE); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_CORPSE ) ? true : Object::isType(type); }
int getValues() { return values; }
void setValues(int x) { values = x; }
};
class ObjGold : public Object
{
protected:
int values;
public:
ObjGold()
: values(0)
{}
ObjGold( const ObjGold & x)
: Object(x), values(x.values)
{}
virtual ~ObjGold() {}
virtual Object * clone() const { return new ObjGold(*this); }
virtual vmtype getVMType() { return VMT_OBJ_GOLD; }
virtual int readFromTypeSpecific( StaticInput & ) {return 0;}
virtual int writeToTypeSpecific( Output & ) const {return 0;}
virtual bool isGold() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_GOLD); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_GOLD ) ? true : Object::isType(type); }
int getValues() { return values; }
void setValues(int x) { values = x; }
};
class ObjArmor : public Object
{
protected:
int values;
public:
ObjArmor()
: values(0)
{}
ObjArmor( const ObjArmor & x)
: Object(x), values(x.values)
{}
virtual ~ObjArmor() {}
virtual Object * clone() const { return new ObjArmor(*this); }
virtual vmtype getVMType() { return VMT_OBJ_ARMOR; }
virtual int readFromTypeSpecific( StaticInput & ) {return 0;}
virtual int writeToTypeSpecific( Output & ) const {return 0;}
virtual bool isArmor() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_ARMOR); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_ARMOR ) ? true : Object::isType(type); }
int getValues() { return values; }
void setValues(int x) { values = x; }
};
class ObjContainer : public Object
{
protected:
int values;
public:
ObjContainer()
: values(0)
{}
ObjContainer( const ObjContainer & x)
: Object(x), values(x.values)
{}
virtual ~ObjContainer() {}
virtual Object * clone() const { return new ObjContainer(*this); }
virtual vmtype getVMType() { return VMT_OBJ_CONTAINER; }
virtual int readFromTypeSpecific( StaticInput & ) {return 0;}
virtual int writeToTypeSpecific( Output & ) const {return 0;}
virtual bool isContainer() const { return true; }
virtual const char *typeName() const
{ return lookupObjTypeName(VMT_OBJ_CONTAINER); }
virtual bool isType( int type )
{ return (type == VMT_OBJ_CONTAINER ) ? true : Object::isType(type); }
int getValues() { return values; }
void setValues(int x) { values = x; }
};
#endif