/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * Based on the original sources * Faery Tale II -- The Halls of the Dead * (c) 1993-1996 The Wyrmkeep Entertainment Co. */ #ifndef SAGA2_OBJPROTO_H #define SAGA2_OBJPROTO_H #include "saga2/idtypes.h" #include "saga2/sprite.h" #include "saga2/spells.h" #include "saga2/effects.h" #include "saga2/tcoords.h" namespace Saga2 { class Actor; class gameObject; /* ===================================================================== * Exports * ===================================================================== */ extern const int16 objectCount; // Number of elements in the object list extern int16 worldCount; // Number of elements in the world list #define Permanent ((uint8)255) /* ===================================================================== * Object ID's * ===================================================================== */ // Various inline tests for object type inline bool isObject(ObjectID id) { return (id < objectCount); } inline bool isActor(ObjectID id) { return (id >= ActorBaseID && id < ActorBaseID + kActorCount); } inline bool isWorld(ObjectID id) { return (id >= WorldBaseID && id < WorldBaseID + worldCount); } inline bool isActorOrWorld(ObjectID id) { return (id >= ActorBaseID); } // Same as above but use object addresses instead of ID's class GameObject; class IntangibleContainerWindow; class ContainerWindow; class ActiveItem; class ObjectTarget; class Sector; class TimerList; class Timer; struct GameEvent; struct SenseInfo; class SensorList; class Sensor; struct ObjectSoundFXs; bool isObject(GameObject *); bool isActor(GameObject *); bool isWorld(GameObject *); /* ===================================================================== * Location: Describes location of object within world or container * ===================================================================== */ struct StaticLocation { StaticTilePoint tile; ObjectID context; void set(TilePoint t, ObjectID con) { tile.set(t.u, t.v, t.z); context = con; } }; class Location : public TilePoint { public: // context = the ObjectID of containing context // (either a container or a world). ObjectID _context; /* // Member functions to translate world coords into // screen coords. void screenPos( Point16 &screenCoords ); int16 screenDepth( void ); // returns true if it is within the view area of the current // map. bool visible( void ); */ // assign a position to a location without changing context Location &operator=(TilePoint pos) { u = pos.u; v = pos.v; z = pos.z; return *this; } Location() : _context(0) {} Location(int16 nu, int16 nv, int16 nz, ObjectID con) { u = nu; v = nv; z = nz; _context = con; } Location(TilePoint p, ObjectID con = 0) { u = p.u; v = p.v; z = p.z; _context = con; } Location(StaticLocation l) { u = l.tile.u; v = l.tile.v; z = l.tile.z; _context = l.context; } }; /* ===================================================================== * 8-way facing directions * ===================================================================== */ inline bool isFlipped(Direction d) { return (d > kDirDown); } /* ===================================================================== * ProtoObj: Base class for all object prototypes. * ===================================================================== */ struct scriptCallFrame; // Since we want to be able to load prototypes from disk, but // still use virtual functions, we are going to divide the // prototype structure into two parts, one which has the data // and then a subclass which has all the functions. struct ResourceObjectPrototype { // General behavior properties int16 classType; // which C++ class to use. uint16 script; // script to handle all objs of this type // Appearance propertie int16 nameIndex; // type name of object uint16 iconSprite, // sprite # in inventory groundSprite; // sprite # when on ground uint8 colorMap[4]; // indirect color map // Physical properties uint8 mass, // how heavy it is bulk, // how bulky it is crossSection, // cross section width, height, // height it extends above terrain toughness, // how easily broken, breakType; // what it breaks into // Container properties uint16 maxCapacity; // total space available uint8 lockType; // type of key that opens uint8 acceptableItems; // type of items that fit within // Combat Properties (offensive) uint8 weaponDamage, weaponFireRate, maximumRange, missileType; // Combat Properties (defensive) uint8 whereWearable; int8 damageAbsorbtion, damageDivider, defenseBonus; // Magical / Energy properties uint8 maxCharges, // max number of charges, or 0=infinity chargeType; // charge type that can be used // Packed flags int16 flags; // Flag definitions enum protoFlags { kObjPropMergeable = (1 << 0), // merge with similar objects kObjPropRound = (1 << 1), // rolls easily down stairs kObjPropFlammable = (1 << 2), // object can burn kObjPropWeapon = (1 << 3), // can be wielded as weapon kObjPropThrownWpn = (1 << 4), // it's a throwable weapon kObjPropMissileWpn = (1 << 5), // it's a missile weapon kObjPropCharges = (1 << 6), // it's a missile weapon kObjPropEdible = (1 << 7), // can be eaten kObjPropFlipped = (1 << 8), // flipped left/right on ground kObjPropVisOpen = (1 << 9), // Object has separate "visible" sprite kObjPropHidden = (1 << 10), // "How not to be seen". kObjPropGhosted = (1 << 11), // Object permanently ghosted kObjPropHardSurface = (1 << 12), // Object makes hard sound when struck kObjPropNoSurface = (1 << 13) // Object makes no sound when struck (may grunt however) }; int16 price; // object's price union { int16 heldSpriteBase; // sprite # when in hand int16 appearanceType; // container appearance type int16 ideaType; // idea stimulus type }; int16 resistance; // resistance bits (see EFFECTS.H) int16 immunity; // immunity bits (see EFFECTS.H) uint8 soundFXClass; // index into sound effects table uint8 reserved[7]; ResourceObjectPrototype() { classType = 0; script = 0; nameIndex = 0; iconSprite = 0; groundSprite = 0; for (int i = 0; i < 4; ++i) colorMap[i] = 0; mass = bulk = crossSection = height = toughness = breakType = 0; maxCapacity = 0; lockType = 0; acceptableItems = 0; weaponDamage = weaponFireRate = maximumRange = missileType = 0; whereWearable = 0; damageAbsorbtion = damageDivider = defenseBonus = 0; maxCharges = chargeType = 0; flags = 0; price = 0; heldSpriteBase = 0; resistance = 0; immunity = 0; soundFXClass = 0; for (int i = 0; i < 7; ++i) reserved[i] = 0; } // Copy constructor ResourceObjectPrototype(ResourceObjectPrototype &proto) { classType = proto.classType; script = proto.script; nameIndex = proto.nameIndex; iconSprite = proto.iconSprite; groundSprite = proto.groundSprite; for (int i = 0; i < 4; ++i) colorMap[i] = proto.colorMap[i]; mass = proto.mass; bulk = proto.bulk; crossSection = proto.crossSection; height = proto.height; toughness = proto.toughness; breakType = proto.breakType; maxCapacity = proto.maxCapacity; lockType = proto.lockType; acceptableItems = proto.acceptableItems; weaponDamage = proto.weaponDamage; weaponFireRate = proto.weaponFireRate; maximumRange = proto.maximumRange; missileType = proto.missileType; whereWearable = proto.whereWearable; damageAbsorbtion = proto.damageAbsorbtion; damageDivider = proto.damageDivider; defenseBonus = proto.defenseBonus; maxCharges = proto.maxCharges; chargeType = proto.chargeType; flags = proto.flags; price = proto.price; heldSpriteBase = proto.heldSpriteBase; resistance = proto.resistance; immunity = proto.immunity; soundFXClass = proto.soundFXClass; for (int i = 0; i < 7; ++i) reserved[i] = proto.reserved[i]; } void load(Common::SeekableReadStream *stream) { classType = stream->readSint16LE(); script = stream->readUint16LE(); nameIndex = stream->readSint16LE(); iconSprite = stream->readUint16LE(); groundSprite = stream->readUint16LE(); for (int i = 0; i < 4; ++i) colorMap[i] = stream->readByte(); mass = stream->readByte(); bulk = stream->readByte(); crossSection = stream->readByte(); height = stream->readByte(); toughness = stream->readByte(); breakType = stream->readByte(); maxCapacity = stream->readUint16LE(); lockType = stream->readByte(); acceptableItems = stream->readByte(); weaponDamage = stream->readByte(); weaponFireRate = stream->readByte(); maximumRange = stream->readByte(); missileType = stream->readByte(); whereWearable = stream->readByte(); damageAbsorbtion = stream->readSByte(); damageDivider = stream->readSByte(); defenseBonus = stream->readSByte(); maxCharges = stream->readByte(); chargeType = stream->readByte(); flags = stream->readSint16LE(); price = stream->readSint16LE(); heldSpriteBase = stream->readSint16LE(); // union resistance = stream->readSint16LE(); immunity = stream->readSint16LE(); soundFXClass = stream->readByte(); for (int i = 0; i < 7; ++i) reserved[i] = stream->readByte(); } }; class ProtoObj : public ResourceObjectPrototype { static uint8 *_nextAvailObj; // container defines // getable through virtual functions // at appropriate subclasses private: enum { kViewableRows = 6, kViewableCols = 4, kMaxRows = 8, kMaxCols = 4 }; public: enum containmentType { kIsTangible = (1 << 0), kIsContainer = (1 << 1), kIsBottle = (1 << 2), kIsFood = (1 << 3), kIsWearable = (1 << 4), kIsWeapon = (1 << 5), kIsArmor = (1 << 6), kIsDocument = (1 << 7), kIsIntangible = (1 << 8), kIsConcept = (1 << 9), kIsPsych = (1 << 10), kIsSpell = (1 << 11), kIsSkill = (1 << 12), kIsEnchantment = (1 << 13), kIsTargetable = (1 << 14) }; // kludge: define earlier, incorrectly spelled names to correct spelling // REM: Later, do a global search and replace... #define isTangable kIsTangible #define isIntangable kIsIntangible enum spriteTypes { kObjOnGround = 0, kObjInContainerView, kObjAsMousePtr }; // Member functions // A constructor which takes the data loaded from the file // and loads it into the various fields... ProtoObj(ResourceObjectPrototype &proto) : ResourceObjectPrototype(proto) {} virtual ~ProtoObj() {} // returns the containment type flags for this object virtual uint16 containmentSet(); // returns true if this object can contain another object virtual bool canContain(ObjectID dObj, ObjectID item); // Determine if this object can contain another object at a specified // slot virtual bool canContainAt( ObjectID dObj, ObjectID item, const TilePoint &where); // Determine if this type of object is two handed virtual bool isTwoHanded(ObjectID actor); // Determine if this type of object is a missile virtual bool isMissile(); virtual ObjectID placeObject(); // call the object's script bool invokeScript(scriptCallFrame &); // Handle object script in a standard fashion int16 stdActionScript(int method, ObjectID dObj, ObjectID enactor, ObjectID indirectObj); int16 stdActionScript(int method, ObjectID dObj, ObjectID enactor, ObjectID indirectObj, int16 value); // generic actions // Use this object bool use(ObjectID dObj, ObjectID enactor); virtual bool setUseCursor(ObjectID dObj); virtual bool useAction(ObjectID dObj, ObjectID enactor); // Use this object on another object bool useOn(ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID item); // Use this object on a tile activity instance bool useOn(ObjectID dObj, ObjectID enactor, ActiveItem *item); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ActiveItem *item); // Use the object on a location bool useOn(ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, const Location &loc); // open this object bool open(ObjectID dObj, ObjectID enactor); virtual bool canOpen(ObjectID dObj, ObjectID enactor); virtual bool openAction(ObjectID dObj, ObjectID enactor); // close this object bool close(ObjectID dObj, ObjectID enactor); virtual bool closeAction(ObjectID dObj, ObjectID enactor); // take this object bool take(ObjectID dObj, ObjectID enactor, int16 num = 1); virtual bool takeAction(ObjectID dObj, ObjectID enactor); virtual bool takeAction(ObjectID dObj, ObjectID enactor, int16 num = 1); // drop this object bool drop(ObjectID dObj, ObjectID enactor, const Location &loc, int16 num = 1); virtual bool canDropAt( ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool dropAction( ObjectID dObj, ObjectID enactor, const Location &loc, int16 num = 1); // drop this object onto another object and handle the result. bool dropOn(ObjectID dObj, ObjectID enactor, ObjectID target, int16 num = 1); virtual bool dropOnAction( ObjectID dObj, ObjectID enactor, ObjectID target, int count); // drop this object onto a TAG bool dropOn( ObjectID dObj, ObjectID enactor, ActiveItem *target, const Location &loc, int16 num = 1); virtual bool dropOnAction( ObjectID dObj, ObjectID enactor, ActiveItem *target, const Location &loc, int16 num = 1); // Strike another object with this object bool strike(ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool strikeAction( ObjectID dObj, ObjectID enactor, ObjectID item); // Damage another object with this object bool damage(ObjectID dObj, ObjectID enactor, ObjectID target); virtual bool damageAction( ObjectID dObj, ObjectID enactor, ObjectID target); // Eat this object bool eat(ObjectID dObj, ObjectID enactor); virtual bool eatAction(ObjectID dObj, ObjectID enactor); // Insert this object into another object bool insert(ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool insertAction(ObjectID dObj, ObjectID enactor, ObjectID item); // Remove this object from another object bool remove(ObjectID dObj, ObjectID enactor); virtual bool removeAction(ObjectID dObj, ObjectID enactor); // Drop another object onto this one. bool acceptDrop(ObjectID dObj, ObjectID enactor, ObjectID droppedObj, int count); virtual bool acceptDropAction( ObjectID dObj, ObjectID enactor, ObjectID droppedObj, int count); // Cause damage to this object directly bool acceptDamage( ObjectID dObj, ObjectID enactor, int8 absDamage, effectDamageTypes dType = kDamageOther, int8 dice = 0, uint8 sides = 1, int8 perDieMod = 0); virtual bool acceptDamageAction( ObjectID dObj, ObjectID enactor, int8 absDamage, effectDamageTypes dType, int8 dice, uint8 sides, int8 perDieMod); bool acceptHealing( ObjectID dObj, ObjectID enactor, int8 absHealing, int8 dice = 0, uint8 sides = 1, int8 perDieMod = 0); virtual bool acceptHealingAction( ObjectID dObj, ObjectID enactor, int8 healing); // Accept strike from another object (allows this object to cause // damage to the striking object). bool acceptStrike( ObjectID dObj, ObjectID enactor, ObjectID strikingObj, uint8 skillIndex); virtual bool acceptStrikeAction( ObjectID dObj, ObjectID enactor, ObjectID strikingObj, uint8 skillIndex); // Unlock or lock this object with a key. bool acceptLockToggle(ObjectID dObj, ObjectID enactor, uint8 keyCode); virtual bool canToggleLock( ObjectID dObj, ObjectID enactor, uint8 keyCode); virtual bool acceptLockToggleAction(ObjectID dObj, ObjectID enactor, uint8 keyCode); // Mix this object with another. bool acceptMix(ObjectID dObj, ObjectID enactor, ObjectID mixObj); virtual bool acceptMixAction( ObjectID dObj, ObjectID enactor, ObjectID mixObj); // Insert another object into this object. bool acceptInsertion( ObjectID dObj, ObjectID enactor, ObjectID item, int16 count); virtual bool acceptInsertionAction( ObjectID dObj, ObjectID enactor, ObjectID item, int16 count); // Insert another object into this object at a specified slot bool acceptInsertionAt( ObjectID dObj, ObjectID enactor, ObjectID item, const TilePoint &where, int16 num = 1); virtual bool acceptInsertionAtAction( ObjectID dObj, ObjectID enactor, ObjectID item, const TilePoint &where, int16 num = 1); // Creates a color translation table for this object virtual void getColorTranslation(ColorTable map); // return the sprite data of amount 'count' virtual ObjectSpriteInfo getSprite(GameObject *obj, spriteTypes spr, int16 count = -1); // return the address of the sprite when held in hand virtual Sprite *getOrientedSprite(GameObject *obj, int16 offset); // Initiate an attack using this type of object virtual void initiateAttack(ObjectID attacker, ObjectID target); // Initiate a defense using this type of object virtual void initiateDefense( ObjectID defensiveObj, ObjectID defender, ObjectID attacker); // Get a projectile from the missile weapon virtual GameObject *getProjectile(ObjectID weapon, ObjectID enactor); // Get a spell from a magic weapon virtual GameObject *getSpell(ObjectID obj); // Determine if this type of object can block an attack virtual bool canBlock(); // Return a mask of bits indicating the directions relative to the // wielders facing in which this object can defend virtual uint8 defenseDirMask(); // Compute how much damage this defensive object will absorb virtual uint8 adjustDamage(uint8 damage); // Return the fight stance approriate to this weapon virtual int16 fightStanceAction(ObjectID actor); // Given an object sound effect record, which sound should be made // when this object is damaged virtual uint8 getDamageSound(const ObjectSoundFXs &soundFXs); // Do the background processing, if needed, for this object. // This will be called approximately once every 10 seconds // (or whatever the background refresh period is). virtual void doBackgroundUpdate(GameObject *obj); virtual bool resists(effectResistTypes r) { return resistance & (1 << r); } virtual bool isImmuneTo(effectImmuneTypes r) { return immunity & (1 << r); } virtual bool makeSavingThrow() { return false; } // Returns true if object in continuous use. virtual bool isObjectBeingUsed(GameObject *obj); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); // Get the value of the user's skill which applies to this // object virtual uint8 getSkillValue(ObjectID enactor); // Cause the user's associated skill to grow virtual void applySkillGrowth(ObjectID enactor, uint8 points = 1); // this is to determine size of containers public: virtual uint16 getViewableRows() { return kViewableRows; } virtual uint16 getViewableCols() { return kViewableCols; } virtual uint16 getMaxRows() { return kMaxRows; } virtual uint16 getMaxCols() { return kMaxCols; } // this returns the type of charge an item can have int16 getChargeType() { return chargeType; } virtual bool canFitBulkwise(GameObject *container, GameObject *obj); virtual bool canFitMasswise(GameObject *container, GameObject *obj); virtual uint16 massCapacity(GameObject *container); virtual uint16 bulkCapacity(GameObject *container); }; /* ======================================================================== * InventoryProto: base class for all tangible object prototypes * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto class InventoryProto : public ProtoObj { public: InventoryProto(ResourceObjectPrototype &proto) : ProtoObj(proto) {} virtual ~InventoryProto() {} virtual uint16 containmentSet(); virtual bool takeAction(ObjectID dObj, ObjectID enactor, int16 num = 1); virtual bool canDropAt( ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool dropAction( ObjectID dObj, ObjectID enactor, const Location &loc, int16 num = 1); virtual bool dropOnAction( ObjectID dObj, ObjectID enactor, ActiveItem *target, const Location &loc, int16 num = 1); virtual bool acceptDropAction( ObjectID dObj, ObjectID enactor, ObjectID droppedObj, int count); virtual bool acceptStrikeAction( ObjectID dObj, ObjectID enactor, ObjectID strikingObj, uint8 skillIndex); }; /* ======================================================================== * PhysicalContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, PhysicalContainerProto // Prototype class for physical object container class PhysicalContainerProto : public InventoryProto { private: enum { kViewableRows = 4, kViewableCols = 4, kMaxRows = 8, kMaxCols = 4 }; public: PhysicalContainerProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~PhysicalContainerProto() {} virtual uint16 containmentSet(); virtual bool canContain(ObjectID dObj, ObjectID item); virtual bool canContainAt( ObjectID dObj, ObjectID item, const TilePoint &where); // Call open() if closed, or call close() if open. virtual bool useAction(ObjectID dObj, ObjectID enactor); // Open this object virtual bool canOpen(ObjectID dObj, ObjectID enactor); virtual bool openAction(ObjectID dObj, ObjectID enactor); // Close this object virtual bool closeAction(ObjectID dObj, ObjectID enactor); // Unlock or lock object if keyCode == lockType virtual bool canToggleLock( ObjectID dObj, ObjectID enactor, uint8 keyCode); virtual bool acceptLockToggleAction(ObjectID dObj, ObjectID enactor, uint8 keyCode); // Insert another object into this object bool acceptInsertionAction( ObjectID dObj, ObjectID enactor, ObjectID item, int16 num); // Insert another object into this object at the specified slot virtual bool acceptInsertionAtAction( ObjectID dObj, ObjectID enactor, ObjectID item, const TilePoint &where, int16 num = 1); public: virtual uint16 getViewableRows() { return kViewableRows; } virtual uint16 getViewableCols() { return kViewableCols; } virtual uint16 getMaxRows() { return kMaxRows; } virtual uint16 getMaxCols() { return kMaxCols; } virtual bool canFitBulkwise(GameObject *container, GameObject *obj); virtual bool canFitMasswise(GameObject *container, GameObject *obj); virtual uint16 massCapacity(GameObject *container); virtual uint16 bulkCapacity(GameObject *container); }; /* ======================================================================== * KeyProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, KeyProto // Prototype class for key objects class KeyProto : public InventoryProto { public: KeyProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~KeyProto() {} // Set up targeting cursor virtual bool setUseCursor(ObjectID dObj); // Use key on lockable container virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID withObj); // Use key on active terrain virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ActiveItem *withTAI); }; /* ======================================================================== * BottleProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, BottleProto class BottleProto : public InventoryProto { public: BottleProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~BottleProto() {} virtual uint16 containmentSet(); // Drink From Bottle virtual bool useAction(ObjectID dObj, ObjectID enactor); }; /* ======================================================================== * FoodProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, FoodProto class FoodProto : public InventoryProto { public: FoodProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~FoodProto() {} virtual uint16 containmentSet(); // Eat it virtual bool useAction(ObjectID dObj, ObjectID enactor); }; /* ======================================================================== * WearableProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WearbleProto class WearableProto : public InventoryProto { public: WearableProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~WearableProto() {} virtual uint16 containmentSet(); }; /* ======================================================================== * WeaponProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto class WeaponProto : public InventoryProto { protected: enum { kInRangeRatingBonus = 4 }; public: WeaponProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~WeaponProto() {} virtual uint16 containmentSet(); // return the address of the sprite when held in hand virtual Sprite *getOrientedSprite(GameObject *obj, int16 offset); weaponID getWeaponID(); // Returns true if object in continuous use. bool isObjectBeingUsed(GameObject *obj); // Rate this weapon's goodness for a specified attack situation virtual uint8 weaponRating( ObjectID weaponID, ObjectID wielderID, ObjectID targetID) = 0; }; /* ======================================================================== * MeleeWeaponProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, MeleeWeaponProto class MeleeWeaponProto : public WeaponProto { public: MeleeWeaponProto(ResourceObjectPrototype &proto) : WeaponProto(proto) {} virtual ~MeleeWeaponProto() {} virtual bool useAction(ObjectID dObj, ObjectID enactor); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool strikeAction( ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool damageAction( ObjectID dObj, ObjectID enactor, ObjectID target); virtual bool acceptDamageAction( ObjectID dObj, ObjectID enactor, int8 absDamage, effectDamageTypes dType, int8 dice, uint8 sides, int8 perDieMod); // Determine if this type of weapon must be wielded with two hands // for the specified actor virtual bool isTwoHanded(ObjectID actor); // Initiate a melee weapon attack motion virtual void initiateAttack(ObjectID attacker, ObjectID target); // Initiate a melee weapon parry motion virtual void initiateDefense( ObjectID defensiveObj, ObjectID defender, ObjectID attacker); // Melee weapons can block attacks virtual bool canBlock(); // Return a mask of bits indicating the directions relative to the // wielders facing in which this object can defend virtual uint8 defenseDirMask(); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); // Rate this weapon's goodness for a specified attack situation virtual uint8 weaponRating( ObjectID weaponID, ObjectID wielderID, ObjectID targetID); // Return the fight stance approriate to this weapon virtual int16 fightStanceAction(ObjectID actor); // Given an object sound effect record, which sound should be made // when this object is damaged virtual uint8 getDamageSound(const ObjectSoundFXs &soundFXs); }; /* ======================================================================== * BludgeoningWeaponProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, MeleeWeaponProto, // BludgeoningWeaponProto class BludgeoningWeaponProto : public MeleeWeaponProto { public: BludgeoningWeaponProto(ResourceObjectPrototype &proto) : MeleeWeaponProto(proto) {} virtual ~BludgeoningWeaponProto() {} // Get the value of the wielder's skill which applies to this // weapon virtual uint8 getSkillValue(ObjectID enactor); // Cause the user's associated skill to grow virtual void applySkillGrowth(ObjectID enactor, uint8 points = 1); }; /* ======================================================================== * SlashingWeaponProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, MeleeWeaponProto, // SlashingWeaponProto class SlashingWeaponProto : public MeleeWeaponProto { public: SlashingWeaponProto(ResourceObjectPrototype &proto) : MeleeWeaponProto(proto) {} virtual ~SlashingWeaponProto() {} // Get the value of the wielder's skill which applies to this // weapon virtual uint8 getSkillValue(ObjectID enactor); // Cause the user's associated skill to grow virtual void applySkillGrowth(ObjectID enactor, uint8 points = 1); }; /* ======================================================================== * BowProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, BowProto class BowProto : public WeaponProto { public: BowProto(ResourceObjectPrototype &proto) : WeaponProto(proto) {} virtual ~BowProto() {} virtual bool useAction(ObjectID dObj, ObjectID enactor); // Bows are two handed virtual bool isTwoHanded(ObjectID actor); // Initiate a bow firing motion virtual void initiateAttack(ObjectID attacker, ObjectID target); // Grab and arrow from the actor's inventory virtual GameObject *getProjectile(ObjectID weapon, ObjectID enactor); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); // Rate this weapon's goodness for a specified attack situation virtual uint8 weaponRating( ObjectID weaponID, ObjectID wielderID, ObjectID targetID); // Return the fight stance approriate to this weapon virtual int16 fightStanceAction(ObjectID actor); }; /* ======================================================================== * WeaponWandProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, WeaponWandProto class WeaponWandProto : public WeaponProto { public: WeaponWandProto(ResourceObjectPrototype &proto) : WeaponProto(proto) {} virtual ~WeaponWandProto() {} virtual bool useAction(ObjectID dObj, ObjectID enactor); // Wands are two handed virtual bool isTwoHanded(ObjectID actor); // Initiate a bow firing motion virtual void initiateAttack(ObjectID attacker, ObjectID target); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); // Rate this weapon's goodness for a specified attack situation virtual uint8 weaponRating( ObjectID weaponID, ObjectID wielderID, ObjectID targetID); // Return the fight stance approriate to this weapon virtual int16 fightStanceAction(ObjectID actor); }; /* ======================================================================== * ProjectileProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, ProjectileProto class ProjectileProto : public WeaponProto { public: ProjectileProto(ResourceObjectPrototype &proto) : WeaponProto(proto) {} virtual ~ProjectileProto() {} // return the address of the sprite when held in hand virtual Sprite *getOrientedSprite(GameObject *obj, int16 offset); // Returns true if object in continuous use. bool isObjectBeingUsed(GameObject *obj); // Projectiles are missiles virtual bool isMissile(); // Rate this weapon's goodness for a specified attack situation virtual uint8 weaponRating( ObjectID weaponID, ObjectID wielderID, ObjectID targetID); }; /* ======================================================================== * ArrowProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, WeaponProto, ProjectileProto, ArrowProto class ArrowProto : public ProjectileProto { public: ArrowProto(ResourceObjectPrototype &proto) : ProjectileProto(proto) {} virtual ~ArrowProto() {} virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool strikeAction( ObjectID dObj, ObjectID enactor, ObjectID item); virtual bool damageAction( ObjectID dObj, ObjectID enactor, ObjectID target); // Cause the user's associated skill to grow virtual void applySkillGrowth(ObjectID enactor, uint8 points = 1); }; /* ======================================================================== * ArmorProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, ArmorProto class ArmorProto : public InventoryProto { public: ArmorProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~ArmorProto() {} virtual uint16 containmentSet(); virtual bool useAction(ObjectID dObj, ObjectID enactor); // Compute how much damage this defensive object will absorb virtual uint8 adjustDamage(uint8 damage); // Returns true if object in continuous use. bool isObjectBeingUsed(GameObject *obj); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); }; /* ======================================================================== * ShieldProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, ShieldProto class ShieldProto : public InventoryProto { public: ShieldProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~ShieldProto() {} virtual uint16 containmentSet(); virtual bool useAction(ObjectID dObj, ObjectID enactor); virtual bool acceptDamageAction( ObjectID dObj, ObjectID enactor, int8 absDamage, effectDamageTypes dType, int8 dice, uint8 sides, int8 perDieMod); // return the address of the sprite when held in hand virtual Sprite *getOrientedSprite(GameObject *obj, int16 offset); virtual void initiateDefense( ObjectID defensiveObj, ObjectID defender, ObjectID attacker); virtual bool canBlock(); // Return a mask of bits indicating the directions relative to the // wielders facing in which this object can defend virtual uint8 defenseDirMask(); // Returns true if object in continuous use. bool isObjectBeingUsed(GameObject *obj); // Determine if the specified object's 'use' slot is available within // the specified actor virtual bool useSlotAvailable(GameObject *obj, Actor *a); // Get the value of the user's skill which applies to this // object virtual uint8 getSkillValue(ObjectID enactor); // Cause the user's associated skill to grow virtual void applySkillGrowth(ObjectID enactor, uint8 points = 1); // Given an object sound effect record, which sound should be made // when this object is damaged virtual uint8 getDamageSound(const ObjectSoundFXs &soundFXs); }; /* ======================================================================== * ToolProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, ToolProto class ToolProto : public InventoryProto { public: ToolProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~ToolProto() {} // Set up targeting cursor virtual bool setUseCursor(ObjectID dObj); // Use tool on object virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID withObj); }; /* ======================================================================== * DocumentProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, DocumentProto class DocumentProto : public InventoryProto { public: DocumentProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~DocumentProto() {} virtual uint16 containmentSet(); //BookDoc //ScrollDoc // virtual bool use( ObjectID dObj, ObjectID enactor ); // Close Floating Window Used For Both Book And Scroll // virtual bool close( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * BookProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, DocumentProto, BookProto class BookProto : public DocumentProto { public: BookProto(ResourceObjectPrototype &proto) : DocumentProto(proto) {} virtual ~BookProto() {} //Read It virtual bool useAction(ObjectID dObj, ObjectID enactor); }; /* ======================================================================== * ScrollProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, DocumentProto, ScrollProto class ScrollProto : public DocumentProto { public: ScrollProto(ResourceObjectPrototype &proto) : DocumentProto(proto) {} virtual ~ScrollProto() {} //Read It virtual bool useAction(ObjectID dObj, ObjectID enactor); }; /* ======================================================================== * AutoMapProto * ======================================================================== */ // hierarchy: // ProtoObj, InventoryProto, AutoMapProto class AutoMapProto : public InventoryProto { public: AutoMapProto(ResourceObjectPrototype &proto) : InventoryProto(proto) {} virtual ~AutoMapProto() {} //Shows Auto Map Display virtual bool openAction(ObjectID dObj, ObjectID enactor); }; /* ======================================================================== * IntagibleObjProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleObjProto class IntangibleObjProto : public ProtoObj { public: IntangibleObjProto(ResourceObjectPrototype &proto) : ProtoObj(proto) {} virtual ~IntangibleObjProto() {} virtual bool useAction(ObjectID dObj, ObjectID enactor); virtual bool takeAction(ObjectID dObj, ObjectID enactor, int16); virtual bool canDropAt( ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool dropAction( ObjectID dObj, ObjectID enactor, const Location &loc, int16); virtual bool acceptDropAction( ObjectID dObj, ObjectID enactor, ObjectID droppedObj, int count); virtual uint16 containmentSet(); virtual ObjectID placeObject(); // Creates a color translation table for this object virtual void getColorTranslation(ColorTable map); // return the sprite data virtual ObjectSpriteInfo getSprite(GameObject *obj, spriteTypes spr, int16); }; /* ======================================================================== * IdeaProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleObjProto, IdeaProto class IdeaProto : public IntangibleObjProto { public: IdeaProto(ResourceObjectPrototype &proto) : IntangibleObjProto(proto) {} virtual ~IdeaProto() {} //Talk To A Person uint16 containmentSet(); }; /* ======================================================================== * MemoryProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleObjProto, MemoryProto class MemoryProto : public IntangibleObjProto { public: MemoryProto(ResourceObjectPrototype &proto) : IntangibleObjProto(proto) {} virtual ~MemoryProto() {} //Get Info On Person Your Talking To uint16 containmentSet(); }; /* ======================================================================== * PsychProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleObjProto, PsychProto class PsychProto : public IntangibleObjProto { public: PsychProto(ResourceObjectPrototype &proto) : IntangibleObjProto(proto) {} virtual ~PsychProto() {} //Get Explanation Of Icon uint16 containmentSet(); }; /* ======================================================================== * SkillProto * ======================================================================== */ //typedef uint8 SpellID; // hierarchy: // ProtoObj, IntagibleObjProto, SkillProto class SkillProto : public IntangibleObjProto { public: SkillProto(ResourceObjectPrototype &proto) : IntangibleObjProto(proto) {} virtual ~SkillProto() {} //Perform A Skill or Cast a spell virtual bool useAction(ObjectID dObj, ObjectID enactor); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ObjectID withObj); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, ActiveItem *item); virtual bool useOnAction(ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool canDropAt( ObjectID dObj, ObjectID enactor, const Location &loc); virtual bool dropAction( ObjectID dObj, ObjectID enactor, const Location &loc, int16 num = 1); virtual bool dropOnAction( ObjectID dObj, ObjectID enactor, ObjectID target, int count); virtual bool dropOnAction( ObjectID dObj, ObjectID enactor, ActiveItem *target, const Location &loc, int16 num = 1); virtual bool implementAction(SpellID dObj, ObjectID enactor, ObjectID withObj); virtual bool implementAction(SpellID dObj, ObjectID enactor, ActiveItem *item); virtual bool implementAction(SpellID dObj, ObjectID enactor, Location &loc); uint16 containmentSet(); SpellID getSpellID() { return (SpellID) lockType; } }; /* ======================================================================== * IntangibleContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto class IntangibleContainerProto : public ProtoObj { public: IntangibleContainerProto(ResourceObjectPrototype &proto) : ProtoObj(proto) {} virtual ~IntangibleContainerProto() {} virtual bool canContain(ObjectID dObj, ObjectID item); virtual bool useAction(ObjectID dObj, ObjectID enactor); virtual bool canOpen(ObjectID dObj, ObjectID enactor); virtual bool openAction(ObjectID dObj, ObjectID enactor); virtual bool closeAction(ObjectID dObj, ObjectID enactor); // virtual bool acceptLockToggle( ObjectID dObj, ObjectID enactor, uint8 keyCode ); // virtual ContainerWindow *makeWindow( GameObject *Obj ); virtual uint16 containmentSet(); }; /* ======================================================================== * IdeaContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto, IdeaContainerProto class IdeaContainerProto : public IntangibleContainerProto { public: IdeaContainerProto(ResourceObjectPrototype &proto) : IntangibleContainerProto(proto) {} virtual ~IdeaContainerProto() {} //Holding Idea Objects // bool use( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * MemoryContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto, MemoryContainerProto class MemoryContainerProto : public IntangibleContainerProto { public: MemoryContainerProto(ResourceObjectPrototype &proto) : IntangibleContainerProto(proto) {} virtual ~MemoryContainerProto() {} //Holding Memories Of People You Met // bool use( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * PhychContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto, PsychContainerProto class PsychContainerProto : public IntangibleContainerProto { public: PsychContainerProto(ResourceObjectPrototype &proto) : IntangibleContainerProto(proto) {} virtual ~PsychContainerProto() {} //Holding Psychological Objects // bool use( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * SkillContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto, SkillContainerProto class SkillContainerProto : public IntangibleContainerProto { public: SkillContainerProto(ResourceObjectPrototype &proto) : IntangibleContainerProto(proto) {} virtual ~SkillContainerProto() {} //Holding Skills And Spells // bool use( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * MindContainerProto * ======================================================================== */ // hierarchy: // ProtoObj, IntangibleContainerProto, MindContainerProto class MindContainerProto : public IntangibleContainerProto { public: MindContainerProto(ResourceObjectPrototype &proto) : IntangibleContainerProto(proto) {} virtual ~MindContainerProto() {} //Contains Skill Psych Memory And Idea Containers // virtual bool use( ObjectID dObj, ObjectID enactor ); }; /* ======================================================================== * EnchantmentProto * ======================================================================== */ // hierarchy: // ProtoObj, EnchantmentProto class EnchantmentProto : public ProtoObj { public: EnchantmentProto(ResourceObjectPrototype &proto) : ProtoObj(proto) {} virtual ~EnchantmentProto() {} // Do the background processing, if needed, for this object. void doBackgroundUpdate(GameObject *obj); virtual uint16 containmentSet(); }; /* ======================================================================== * GeneratorProto * ======================================================================== */ // hierarchy: // ProtoObj, GeneratorProto class GeneratorProto : public ProtoObj { public: GeneratorProto(ResourceObjectPrototype &proto) : ProtoObj(proto) {} virtual ~GeneratorProto() {} //Base class for monster, encounter, and mission generators virtual uint16 containmentSet(); }; /* ======================================================================== * MonsterGeneratorProto * ======================================================================== */ // hierarchy: // ProtoObj, GeneratorProto, MonsterGeneratorProto class MonsterGeneratorProto : public GeneratorProto { public: MonsterGeneratorProto(ResourceObjectPrototype &proto) : GeneratorProto(proto) {} virtual ~MonsterGeneratorProto() {} //Monster generators // REM: We don't want to generate monsters as a background activity, since // we may want more rapid generation that once every 10 seconds, and we only // want to do it while active anyway. }; /* ======================================================================== * EncounterGeneratorProto * ======================================================================== */ // hierarchy: // ProtoObj, GeneratorProto, EncounterGeneratorProto class EncounterGeneratorProto : public GeneratorProto { public: EncounterGeneratorProto(ResourceObjectPrototype &proto) : GeneratorProto(proto) {} virtual ~EncounterGeneratorProto() {} //Encounter generator // Generate an encounter at approx. 10-second intervals void doBackgroundUpdate(GameObject *obj); }; /* ======================================================================== * MissionGeneratorProto * ======================================================================== */ // hierarchy: // ProtoObj, GeneratorProto, MissionGeneratorProto class MissionGeneratorProto : public GeneratorProto { public: MissionGeneratorProto(ResourceObjectPrototype &proto) : GeneratorProto(proto) {} virtual ~MissionGeneratorProto() {} // Check every 10 seconds to see if we want to generate a mission. void doBackgroundUpdate(GameObject *obj); }; /* Subclasses of "ProtoObj" which haven't been defined yet InventoryObjectPrototype // can be dropped on ground ContainerPrototype // holds a list of items BottlePrototype // holds 1 liquid FoodPrototype // edible WearablePrototype // armor and jewelry WeaponPrototype // does damage efficiently DocumentPrototype // expands to document window IntangableObjectPrototype // Ideas and Magic ConceptObjectPrototype // Basic Ideas (Food, Friend...) MemoryObjectPrototype // Memories of game events PsychObjectPrototype // I am ... (Brave, Humble...) SpellObjectPrototype // Spells to cast EnchantmentObjectPrototype // Enchants object that holds it IntangableContainerPrototype // Containers for Ideas and Magic ConceptContainerPrototype // Containers for Basic Ideas (Food, Friend...) MemoryContainerPrototype // Containers for Memories of game events PsychContainerPrototype // Containers for I am ... (Brave, Humble...) SpellContainerPrototype // Containers for Spells to cast // EnchantmentContainerPrototype // Enchants object that holds it ProjectilePrototype // a missile in flight ** ActorPrototype */ } // end of namespace Saga2 #endif