/*
....[@@@..[@@@..............[@.................. 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
------------------------------------------------------------------------------
room.h
*/
#ifndef _ROOM_H
#define _ROOM_H
#include "io.h"
#include "string.h"
#include "llist.h"
#include "vector.h"
#include "nameable.h"
#include "streamable.h"
#include "exit.h"
#include "mudobj.h"
#include "thing.h"
#include "trigs.h"
class Area;
class Repop;
class Description;
class Object;
class Char;
class PC;
class NPC;
// Do not change these values unless you are changing the navigation
// and movement code. The orientation value depends on 0-3 in many
// instances being n,e,s,w
const int DIR_UNDEFINED = -1;
const int DIR_NORTH = 0;
const int DIR_EAST = 1;
const int DIR_SOUTH = 2;
const int DIR_WEST = 3;
const int DIR_UP = 4;
const int DIR_DOWN = 5;
const int MAX_DIR = 6;
// Unused
const int DIR_NORTH_EAST = 6;
const int DIR_NORTH_WEST = 7;
const int DIR_SOUTH_EAST = 8;
const int DIR_SOUTH_WEST = 9;
const int SECTOR_NONE = 0; // undefined
const int SECTOR_GROUND = 1; // need good pair of Nikes
const int SECTOR_AIR = 2; // flying
const int SECTOR_WATER = 3; // need boat
const int SECTOR_UNDERWATER = 4; // need breathe-water ability
const int ROOM_DARK = 1;
const int ROOM_SAFE = 2;
const int ROOM_NOSUMMON = 3;
const int ROOM_NOLEAVE = 4;
const int ROOM_DEATHTRAP = 5;
const int ROOM_DRAIN = 6;
const int ROOM_FASTHP = 7;
const int ROOM_FASTMANA = 8;
const int ROOM_NOHP = 9;
const int ROOM_NOMANA = 10;
const int ROOM_SHIELD = 11;
const int ROOM_INDOORS = 12;
const int MAX_ROOM_BIT_FIELDS = 1;
class Room : virtual public Nameable, public Streamable, public MudObject
{
private:
static int total_count;
protected:
Area * area;
String key; // Index key
Vector vec;
String desc; // Detailed room desc
Exit * exits[ MAX_DIR ];
unsigned long room_bits[ MAX_ROOM_BIT_FIELDS ];
int sector; // ground, air, water, underwater
int terrain; // ease of movement
int temp; // temperature - function of environ and inside heat sources
public:
LList<Repop> repops;
LList<Description> ed;
LList<Object> inv;
LList<Char> chars;
Room()
: area(0), sector(SECTOR_GROUND), terrain(3)
{
total_count++;
memset( exits, 0, sizeof( exits[0] ) * MAX_DIR );
memset( room_bits, 0, sizeof( room_bits[0] ) * MAX_ROOM_BIT_FIELDS );
}
Room( Area *x )
: area(x), sector(SECTOR_GROUND), terrain(3)
{
total_count++;
memset( exits, 0, sizeof( exits[0] ) * MAX_DIR );
memset( room_bits, 0, sizeof( room_bits[0] ) * MAX_ROOM_BIT_FIELDS );
}
Room( Area *x, const String & y )
: area(x), key(y), sector(SECTOR_GROUND), terrain(3)
{
total_count++;
memset( exits, 0, sizeof( exits[0] ) * MAX_DIR );
memset( room_bits, 0, sizeof( room_bits[0] ) * MAX_ROOM_BIT_FIELDS );
}
~Room();
virtual vmtype getVMType() { return VMT_ROOM; }
void setKey( const String & x ) { key = x; }
const String & getScope() const;
const String getKey() const { return key; }
bool roomBitIsSet( int x ) { return IS_SET( room_bits, x ); }
void clrRoomBit( int x ) { CLR_BIT( room_bits, x ); }
void setRoomBit( int x ) { SET_BIT( room_bits, x ); }
void toggleRoomBit( int x ) { TOGGLE_BIT( room_bits, x ); }
void pulse();
int writeTo( Output & ) const;
int readFrom( StaticInput & );
void hardLink();
void addRepop( Repop * );
void addRepop( int, Repop * );
Repop * rmRepop( int );
Repop * rmRepop();
void repop();
Area *getArea() { return area; }
void addObjInv( Object * );
void rmObjInv( Object * );
void addCharInv( Char * );
void rmCharInv( Char * );
bool getSector() { return sector; }
void setSector( int x ) { sector = x; }
bool getTerrain() { return terrain; }
void setTerrain( int x ) { terrain = x; }
bool isIndoors() { return IS_SET( room_bits, ROOM_INDOORS ); }
void out( const char * );
void out( const String & x ) { out( x.chars() ); }
void outAllChar( const String & x ) { out( x.chars() ); }
void outAllChar( const char * x ) { out( x ); }
void interp( const String &, Char *, Char *, Object *, Object * );
void outAllExcept( const String &, Thing *, Thing * );
void outAllCharExcept( const char *, Char *, Char * );
void outAllCharExcept( const String &, Char *, Char * );
const String & getDesc() { return desc; }
void setDesc( const String & x) { desc = x; }
const String & getExtraDesc( const String & x ) { return getExtraDesc( x.chars() ); }
const String & getExtraDesc( const char * );
void addExtraDesc( Description * d ) { ed.addTop( d ); }
Exit * getExit( int );
Room *toRoom( int );
void addExit( Exit *, int );
void deleteExit( int );
Char *getChar( const String & ); // player or mob
Char *getChar( countedThing & ); // player or mob
PC *getPC( const String & ); // player
NPC *getNPC( const String & ); // mob
Object *getObj( const String & );
Object *getObj( countedThing & );
bool isRoom( void ) const { return true; }
virtual Room * asRoom() { return this; }
void describeItself( String & );
static int getTotalCount() { return total_count; }
friend class RoomEditor;
//Triggers part
bool TgUpdate();
bool TgDroppedItem( Char * caller, Object * what );
bool TgPickedItem( Char * caller, Object * what );
bool TgStrangeCmd( Char * caller, const String & cmd, const String & args);
bool TgSaidIn( Char * caller, const char * what );
bool TgSaidIn( Char * caller, const String & what );
bool TgEntered( Char * caller, Room * from );
bool TgLeft( Char * caller, Room * to ); // exit to ?
bool TgSocialedIn( Char * caller,Char * target, const Social * social );
};
extern const bitType sector_list[];
extern const bitType room_bit_list[];
inline Repop * Room::rmRepop()
{ return repops.remove(); }
inline void Room::outAllCharExcept( const String & x, Char * y, Char * z )
{ outAllCharExcept( x.chars(), y, z ); }
inline int lookupRoomBit( const String & x )
{ return lookupBit( room_bit_list, x ); }
inline const char * lookupRoomBitName( int x )
{ return lookupBitName( room_bit_list, x ); }
inline const char * lookupSectorName( int x )
{ return lookupBitName( sector_list, x ); }
inline int lookupSector( const String & x )
{ return lookupBit( sector_list, x ); }
#endif