// $Id: object.h,v 1.15.2.8 2000/05/03 01:32:09 justin Exp $
// $Revision: 1.15.2.8 $ $Author: justin $ $Date: 2000/05/03 01:32:09 $
//
//ScryMUD Server Code
//Copyright (C) 1998 Ben Greear
//
//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 2
//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, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// To contact the Author, Ben Greear: greear@cyberhighway.net, (preferred)
// greearb@agcs.com
//
///************************ object.h ********************************///
#ifndef GRRMUD_OBJECT_INCLUDE_H
#define GRRMUD_OBJECT_INCLUDE_H
#include "const.h"
#include <bitfield.h>
#include <string2.h>
#include "classes.h"
#include "critter.h"
class object;
extern String* long_name_of_obj(object& obj, int see_bit); //misc.h
extern const String* single_obj_name(object& obj, int see_bit); //misc2.h
enum ComponentEnum {
CONSTRUCTION = 0,
CONCOCTION = 1
};//ComponentEnum
///******************** obj construct data **********************///
class obj_construct_data {
protected:
static int _cnt;
public:
int target_object; //obj_num of object it is component of
/* companion components */
int item1;
int item2;
int item3;
int item4;
int item5;
obj_construct_data();
obj_construct_data(const obj_construct_data& source); //copy constuctr
~obj_construct_data() { _cnt--; }
//void Clear();
void Read(ifstream& da_file);
void Write(ofstream& da_file) const;
static int getInstanceCount() { return _cnt; }
}; //obj_construct_data
///********************** obj spec data *****************///
class obj_spec_data {
protected:
static int _cnt;
public:
bitfield obj_spec_data_flags; // 0 consume_teleport,
// 1 has_construct_data, 2 has_skin, 3 consume_poison,
// 4 NULL, 5 NULL, 6 NULL,
// 7 NULL, 8 NULL, 9 NULL,
// 10 casts_spells
//
obj_construct_data* construct_data;
object* skin_ptr;
critter* w_eye_owner;
List<stat_spell_cell*> casts_these_spells;
obj_spec_data();
obj_spec_data(const obj_spec_data& source); //copy constructor
~obj_spec_data();
obj_spec_data& operator=(const obj_spec_data& source);
void Clear();
void Read(ifstream& da_file);
void Write(ofstream& da_file) const;
static int getInstanceCount() { return _cnt; }
};//obj_spec_data
///********************** bag struct ***********************************///
class bag_struct {
protected:
static int _cnt;
public:
bitfield bag_flags; // 0 NULL
// 1 NULL, 2 is_closed, 3 is_locked, 4 is_pickable,
// 5 is_mag_lockable, 6 is_mag_locked
// 7 is_destructable
// {bash, fireball may open it till reset}
// 8 is_corpse, 9 !close, 10 player_owned, 17 consume_key
int key_num; //0 if no key needed
short max_weight;
short percentage_weight; //1 to 100, ie 50 bag makes objs half as heavy
short time_till_disolve; //for corpse, in ticks, -1 if not disolving
bag_struct(const bag_struct& source); //copy constructor
bag_struct(); //default constructor
~bag_struct() { _cnt--; }
void Read(ifstream& da_file);
void Write(ofstream& da_file) const;
void open() { bag_flags.turn_off(2); }
void close() { bag_flags.turn_on(2); }
void lock() { bag_flags.turn_on(3); }
void unlock() { bag_flags.turn_off(3); }
int consumesKey() const { return bag_flags.get(17); }
int isOpen() const { return !bag_flags.get(2); }
int isLocked() const { return bag_flags.get(3); }
int isPlayerOwned() const { return bag_flags.get(10); }
static int getInstanceCount() { return _cnt; }
}; // bag_class
///********************* object ******************************///
class object {
private:
static int _cnt;
protected:
int pause;
int in_room;
ObjectScript* cur_script; /* currently executing script */
List<ObjectScript*> pending_scripts; /* queue holds scripts to be run */
List<ObjectScript*> obj_proc_scripts; /* Scripts this object has. */
public:
List<String*> names;
String short_desc;
String in_room_desc;
String long_desc;
bitfield obj_flags;
// 0 no_rest, 1 !evil, 2 !neutral, 3 !good,
// 4 !donate, 5 !drop, 6 !remove, 7 !mortal, 8 !imm,
// 9 !demi, 10 in_use, 11 !warrior, 12 !sage,
// 13 !wizard, 14 !ranger, 15 !thief, 16 !alchemist,
// 17 !cleric, 18 !bard, 19 !mob, 20 !pc
// 21 not worn, 22 head, 23 neck, 24 neck, 25 around body, 26 arms,
// 27 wrist1, 28 wrist2, 29 hands, 30 wielded, 31 held, 32 light,
// 33 body, 34 belt, 35 legs, 36 feet, 37 finger1,
// 38 finger2, 39 shield
// 40 not a weapon, 41 slash, 42 smash, 43 pierce,44 whip,
// 45 needs_ammo, 46 dart_thrower, 47 bow, 48 dart, 49 arrow
// 50 junk, 51 wand, 52 potion, 53 scroll, 54 container,
// 55 coins, 56 armor, 57 weapon, 58 light_source,
// 59 canteen, 60 liquid, 61 food, 62 boat, 63 has_spec_proc_data,
// 64 toolbox, 65 cauldron, 66 pen, 67 construct_component
// 68 concoct_component, 69 parchment, 70 needs_resetting
// 71 !complete, 72 herb, 73 vend_machine, 74 bulletin_board
// 75 is_butcherable, 76 has_obj_script
short extras[OBJ_MAX_EXTRAS + 1];
// 0 charges, light_count, 1 rechargeable, (wands), 2 %load,
// 3 cur_in_game, 4 max_in_game,
// 5 weight, 6 dice_sides, 7 dice_count, 8 level
int cur_stats[OBJ_CUR_STATS + 1];
// 0 vis_bit;
// 1 price;
// 2 item_num;
// 3 in_zone //as in olc purposes, its origin
List<object*> *in_list; /* the list the object is in, for disolving
NULL if not in someone's inv, a rooms inv,
or another object's inv
ALWAYS NULL when not a SOBJ */
bag_struct* bag; //NULL if not a bag
List<stat_spell_cell*> affected_by;
List<object*> inv; //empty if not a bag
List<stat_spell_cell*> stat_affects;
obj_spec_data* obj_proc;
object (object& source); //copy constructor
object(); //default constructor
~object(); //destructor
object& operator= (object& source);
void Clear();
void dbRead(long obj_num, long sobj_num, short read_all);
void fileRead(ifstream& da_file, short read_all);
void Write(ofstream& da_file);
int isMagic();
object* loseInv(object* obj);
void gainInv(object* obj);
int getIdNum();
int getKeyNum();
int getLevel() const { return extras[8]; }
int getMaxWeight() const;
int getCurWeight() const;
int getEmptyWeight() const { return extras[5]; }
void setEmptyWeight(int wt) { extras[5] = wt; }
void lock();
void unlock();
void open();
int consumesKey();
int doJunk();
int doMload(int i_th);
int doGoToRoom(int dest_room, const char* from_dir, door* by_door,
int cur_room, int sanity);
int getZoneNum() const;
const String* getShortName() { return getName(); }
const String* getShortName(int c_bit) { return getName(c_bit); }
const String* getName() { return getName(~0); };
const String* getName(int c_bit) { return single_obj_name(*this, c_bit); }
const String* getLongName() { return getLongName(~0); }
const String* getLongName(int c_bit) { return long_name_of_obj(*this, c_bit); }
const String* getLongName(critter& pc);
int getDefaultPrice() { return cur_stats[1]; }
int getPause() const { return pause; }
void setPause(int i) { pause = i; }
void decrementPause() { if (pause > 0) pause--; }
void makeComponent(int targ, int comp1, int comp2, int comp3, int comp4,
int comp5, ComponentEnum con_type);
int isNamed(const String& name) const;
int isLocked() const;
int isMagLocked() const;
int isClosed() const;
int isPlayerOwned() const;
int isPotion() const;
int isFood() const ;
int isInUse() const ;
int isNotComplete() const ;
int isLightSource() const;
int isLit() const;
int isBulletinBoard() const;
int isScroll() const;
int isCoins() const { return OBJ_FLAGS.get(55); }
int isNoDonate() const { return OBJ_FLAGS.get(4); }
int isHerb() const;
int isPaused() const { return pause > 0; }
int isModified() const { return (in_list && 1); } //ie is it a SOBJ
int hasScript() const { return obj_flags.get(76); }
int isLiquid() const;
int isCanteen() const;
void setComplete();
void setIncomplete();
void setIdNum(int i);
void setButcherable(int val);
// These return the current value after the operation
int setCurInGame(int i);
int getCurInGame();
int decrementCurInGame();
int incrementCurInGame();
int getMaxInGame();
int getDiceCnt() const { return extras[6]; }
int getDiceSides() const { return extras[7]; }
static int getInstanceCount() { return _cnt; }
int getObjCountByNumber(int onum, int sanity);
void setCurRoomNum(int i, int sanity);
int getCurRoomNum() const { return in_room; }
int getSacPoints(List<object*>& tmp_list, int sanity);
int calcSacPoints(); //non-recursive
const ScriptCmd* getNextScriptCmd() { return cur_script->getNextCommand(); }
void finishedObjProc();
int isInProcNow() { return (cur_script && (cur_script->isInProgress())); }
void addProcScript(const String& txt, ObjectScript* script_data);
void doScriptJump(int abs_offset);
void listScripts(critter& pc);
ObjectScript* getScriptAt(int idx) { return obj_proc_scripts.elementAt(idx); }
void removeScript(String& trigger, int i_th, critter& pc);
int insertNewScript(ObjectScript* script);
int processInput(String& input, room& rm, int& was_deleted); /* for object scripts */
/* Found in obj_cmds.cc */
/** Move all in room out some door. Does no checks, just puts em
* through the door, even if it's closed??!!
*/
int move_all(int i_th, const String* dir, room& rm);
int omove_all(int i_th, const String* dir, room& rm);
/** Move all in room out some door. Does no checks, just puts em
* through the door, even if it's closed!!??
*/
int move(int i_th, const String* pc, int j_th, const String* dir, room& rm);
int omove(int i_th, const String* obj, int j_th, const String* dir, room& rm);
/** Echo message into the room in this direction */
int neighbor_echo(int i_th, const String* dir, const String& buf, room& rm);
int tell(int i, const String* name, String& msg, room& rm);
int do_tell(const char* msg, critter& targ); /* room tells targ */
int com_recho(const String* msg, room& rm);
int com_zecho(const String* msg, room& rm);
int wizchat(const char* message, room& rm);
int obj_pause(int ticks);
void checkForProc(String& cmd, String& arg1, critter& actor,
int targ, room& cur_room, int sanity = 0);
}; // class object
#endif