class Visible_Data
{
public:
int number;
int selected;
int shown;
Visible_Data( ) {
number = 1;
selected = 1;
shown = 1;
}
virtual ~Visible_Data( ) {
}
/* TYPE CASTING */
friend char_data* character( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) >= CHAR_DATA
? (char_data*) visible : NULL );
}
friend player_data* player( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) >= PLAYER_DATA
? (player_data*) visible : NULL );
}
friend mob_data* mob( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) == MOB_DATA
? (mob_data*) visible : NULL );
}
friend wizard_data* wizard( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) == WIZARD_DATA
? (wizard_data*) visible : NULL );
}
friend obj_data* object( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) == OBJ_DATA
? (obj_data*) visible : NULL );
}
friend room_data* Room( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) == ROOM_DATA
? (room_data*) visible : NULL );
}
friend exit_data* exit( Visible_Data* visible ) {
return( visible != NULL && visible->Type( ) == EXIT_DATA
? (exit_data*) visible : NULL );
}
/* BASE */
virtual int Type ( ) = 0;
/* NAME */
virtual const char* Name ( char_data* = NULL, int = 1, bool = FALSE );
virtual const char* Keywords ( char_data* );
virtual bool Seen ( char_data* );
virtual void Look_At ( char_data* );
};
class Thing_Data : public Visible_Data
{
public:
content_array contents;
event_array events;
int temp;
int position;
content_array* array;
int valid;
Thing_Data( ) : contents( this ) {
valid = 0;
number = 1;
selected = 1;
shown = 1;
array = NULL;
position = -1;
}
virtual ~Thing_Data( ) {
valid = -2;
}
/* BASE */
virtual void Extract ( ) { };
/* NAME */
virtual const char* Seen_Name ( char_data*, int = 1, bool = FALSE );
virtual const char* Long_Name ( char_data*, int = 1 );
virtual const char* Show ( char_data*, int = 1 );
virtual const char* Location ( content_array* = NULL );
/* PROPERTIES */
virtual bool Is_Valid ( ) { return valid > 0; }
virtual bool In_Game ( ) { return TRUE; }
virtual int Number ( int = -1 );
virtual int Light ( int = -1 );
virtual int Weight ( int = -1 );
virtual int Empty_Weight ( int = -1 );
virtual int Capacity ( );
virtual int Empty_Capacity ( );
virtual void To ( content_array* );
virtual void To ( thing_data* );
virtual thing_data* From ( int = 1 );
};
extern Array<Thing_Data*> extracted;
/*
* BASIC FUNCTIONS
*/
void extract ( thing_array& );
void consolidate ( thing_array& );
void consolidate ( obj_data* );
void select ( thing_array& );
void select ( thing_array&, char_data* );
const char* list_name ( char_data*, thing_array*, bool = TRUE );
void remove_weight ( thing_data*, int );
bool none_shown ( thing_array& );
thing_data* one_shown ( thing_array& );
/*
* FINDING THINGS
*/
#define va visible_array
#define vd visible_data
#define ta thing_array
#define td thing_data
#define cd char_data
#define od obj_data
#define pd player_data
vd* one_visible ( cd*, char*, char*, va*, va*,
va* = NULL, va* = NULL, va* = NULL );
va* several_visible ( cd*, char*, char*, va*, va*, va* = NULL, va* = NULL );
td* one_thing ( cd*, char*, char*, ta*, ta* = NULL, ta* = NULL );
ta* several_things ( cd*, char*, char*, ta*, ta* = NULL, ta* = NULL );
cd* one_character ( cd*, char*, char*, ta*, ta* = NULL, ta* = NULL );
cd* one_character_ooc ( cd*, char*, char* );
pd* one_player ( cd*, char*, char*, ta*, ta* = NULL, ta* = NULL );
od* one_object ( cd*, char*, char*, ta*, ta* = NULL, ta* = NULL );
#undef va
#undef vd
#undef ta
#undef td
#undef cd
#undef od
#undef pd
/*
* PROPERTIES
*/
inline const char* location( content_array* array )
{
if( array == NULL || array->where == NULL )
return "Nowhere?";
return array->where->Location( array );
}
inline char_data* carried_by( thing_data* thing )
{
for( ; thing->array != NULL; ) {
thing = thing->array->where;
if( character( thing ) != NULL )
return (char_data*) thing;
}
return NULL;
}