#ifndef OBJECT_H
#define OBJECT_H
#include "port.h"
#define O_USER 0x00ff /* flags useable by the mudlib */
#define O_CLONE 0x0100
#define O_SWAPPED 0x0200
#define O_RESET_NONE 0x0400
#define O_RESET_CUSTOM 0x0800
#define O_WILL_CLEAN_UP 0x1000 /* clean_up will be called next time */
#define O_PROG_SWAPPED(ob) ((p_int)(ob)->program & 1)
#define O_VAR_SWAPPED(ob) ((p_int)(ob)->variable & 1)
#define O_SWAP_NUM(ob) \
(O_PROG_SWAPPED(ob) ? (p_int)(ob)->prog & ~1 : (ob)->prog->swap_num)
#define MAX_INHERIT_DEPTH 60
union object_xu {
struct uid *uid;
struct object_x *x;
uint8 *p;
uint16 *p16;
};
struct object {
uint8 type, ref;
uint16 flags;
union {
char **hash;
union svalue destructed;
} next;
union svalue dirname; /* string or program */
union svalue basename; /* string or number (zero for blueprint) */
union object_xu x;
struct program *program;
union svalue *variable;
uint16 last_touched; /* maximum TIME_TO_SWAP is thus 18:12:15 if
* ASYNC_GRANULARITY is 1
*/
union {
uint16 last;
int16 next;
} reset;
};
/* T_INTERNAL, IT_X_OBJ | O_X* flags, major ref */
struct object_x {
struct uid *uid;
struct interactive *user;
union svalue /* object */ shadowed_by, shadowing;
};
#define O_HAS_X(ob) ((ob)->x.p[-sizeof(p_int)+1] != IT_X_UID)
#define O_REF(ob) ((ob)->x.p16[-1])
#define OX_VALID(x) (((uint8 *)(x))[-sizeof(p_int)+1] != IT_X_UID)
#define OX_REF(x) (((uint16 *)(x))[-1])
/* O_REF starts with 1, so that !--O_REF when it is exhausted */
#define O_X_INTERACTIVE 1
#define O_X_SHADOWED 2
#define O_X_FLAGS(ob) ((ob).x.p[-sizeof(p_int)+1])
#define OP_X_FLAGS(ob) ((ob)->x.p[-sizeof(p_int)+1])
#define OX_FLAGS(x) (((uint8 *)(x))[-sizeof(p_int)+1])
#define O_IS_INTERACTIVE(ob) (O_X_FLAGS(ob) & O_X_INTERACTIVE)
#define ALLOC_OBJECT() ALLOC_TTS(T_OBJECT, 1, 0, sizeof(struct object));
extern int32 async_current_time;
extern p_int async_load;
extern int time_to_swap, time_to_swap_variables;
extern struct object nil_object;
extern struct replace_ob *obj_list_replace;
extern p_int num_objects;
extern void object_async(void);
struct frame;
extern svalue *clone_object(svalue, struct frame *);
extern struct object_x *alloc_object_x(svalue);
#endif /* OBJECT_H */