#ifndef OBJ_TYPES_H #define OBJ_TYPES_H namespace fallout { // Rotation typedef enum Rotation { ROTATION_NE, // 0 ROTATION_E, // 1 ROTATION_SE, // 2 ROTATION_SW, // 3 ROTATION_W, // 4 ROTATION_NW, // 5 ROTATION_COUNT, } Rotation; enum { OBJ_TYPE_ITEM, OBJ_TYPE_CRITTER, OBJ_TYPE_SCENERY, OBJ_TYPE_WALL, OBJ_TYPE_TILE, OBJ_TYPE_MISC, OBJ_TYPE_INTERFACE, OBJ_TYPE_INVENTORY, OBJ_TYPE_HEAD, OBJ_TYPE_BACKGROUND, OBJ_TYPE_SKILLDEX, OBJ_TYPE_COUNT, }; #define FID_TYPE(value) ((value)&0xF000000) >> 24 #define PID_TYPE(value) (value) >> 24 #define SID_TYPE(value) (value) >> 24 typedef enum OutlineType { OUTLINE_TYPE_HOSTILE = 1, OUTLINE_TYPE_2 = 2, OUTLINE_TYPE_4 = 4, OUTLINE_TYPE_FRIENDLY = 8, OUTLINE_TYPE_ITEM = 16, OUTLINE_TYPE_32 = 32, } OutlineType; typedef enum ObjectFlags { OBJECT_HIDDEN = 0x01, // Specifies that the object should not be saved to the savegame file. // // This flag is used in these situations: // - To prevent saving of system objects like dude (which has separate // saving routine), egg, mouse cursors, etc. // - To prevent saving of temporary objects (projectiles, explosion // effects, etc.). // - To prevent saving of objects which cannot be removed for some reason, // like objects trying to delete themselves from scripting engine (used // together with `OBJECT_HIDDEN` to prevent affecting game world). OBJECT_NO_SAVE = 0x04, OBJECT_FLAT = 0x08, OBJECT_NO_BLOCK = 0x10, OBJECT_LIGHTING = 0x20, // Specifies that the object should not be removed (freed) from the game // world for whatever reason. // // This flag is used to prevent freeing of system objects like dude, egg, // mouse cursors, etc. OBJECT_NO_REMOVE = 0x400, OBJECT_MULTIHEX = 0x800, OBJECT_NO_HIGHLIGHT = 0x1000, OBJECT_QUEUED = 0x2000, // set if there was/is any event for the object OBJECT_TRANS_RED = 0x4000, OBJECT_TRANS_NONE = 0x8000, OBJECT_TRANS_WALL = 0x10000, OBJECT_TRANS_GLASS = 0x20000, OBJECT_TRANS_STEAM = 0x40000, OBJECT_TRANS_ENERGY = 0x80000, OBJECT_IN_LEFT_HAND = 0x1000000, OBJECT_IN_RIGHT_HAND = 0x2000000, OBJECT_WORN = 0x4000000, OBJECT_WALL_TRANS_END = 0x10000000, OBJECT_LIGHT_THRU = 0x20000000, OBJECT_SEEN = 0x40000000, OBJECT_SHOOT_THRU = 0x80000000, OBJECT_IN_ANY_HAND = OBJECT_IN_LEFT_HAND | OBJECT_IN_RIGHT_HAND, OBJECT_EQUIPPED = OBJECT_IN_ANY_HAND | OBJECT_WORN, OBJECT_FLAG_0xFC000 = OBJECT_TRANS_ENERGY | OBJECT_TRANS_STEAM | OBJECT_TRANS_GLASS | OBJECT_TRANS_WALL | OBJECT_TRANS_NONE | OBJECT_TRANS_RED, OBJECT_OPEN_DOOR = OBJECT_SHOOT_THRU | OBJECT_LIGHT_THRU | OBJECT_NO_BLOCK, } ObjectFlags; typedef enum CritterFlags { CRITTER_BARTER = 0x02, CRITTER_NO_STEAL = 0x20, CRITTER_NO_DROP = 0x40, CRITTER_NO_LIMBS = 0x80, CRITTER_NO_AGE = 0x100, CRITTER_NO_HEAL = 0x200, CRITTER_INVULNERABLE = 0x400, CRITTER_FLAT = 0x800, CRITTER_SPECIAL_DEATH = 0x1000, CRITTER_LONG_LIMBS = 0x2000, CRITTER_NO_KNOCKBACK = 0x4000, } CritterFlags; #define CRITTER_RADIATED 0x02 #define OUTLINE_TYPE_MASK 0xFFFFFF #define OUTLINE_PALETTED 0x40000000 #define OUTLINE_DISABLED 0x80000000 // These two values are the same but stored in different fields. #define CONTAINER_FLAG_JAMMED 0x04000000 #define DOOR_FLAG_JAMMGED 0x04000000 #define CONTAINER_FLAG_LOCKED 0x02000000 #define DOOR_FLAG_LOCKED 0x02000000 typedef enum CritterManeuver { CRITTER_MANEUVER_NONE = 0, CRITTER_MANEUVER_ENGAGING = 0x01, CRITTER_MANEUVER_DISENGAGING = 0x02, CRITTER_MANUEVER_FLEEING = 0x04, } CritterManeuver; typedef enum Dam { DAM_KNOCKED_OUT = 0x01, DAM_KNOCKED_DOWN = 0x02, DAM_CRIP_LEG_LEFT = 0x04, DAM_CRIP_LEG_RIGHT = 0x08, DAM_CRIP_ARM_LEFT = 0x10, DAM_CRIP_ARM_RIGHT = 0x20, DAM_BLIND = 0x40, DAM_DEAD = 0x80, DAM_HIT = 0x100, DAM_CRITICAL = 0x200, DAM_ON_FIRE = 0x400, DAM_BYPASS = 0x800, DAM_EXPLODE = 0x1000, DAM_DESTROY = 0x2000, DAM_DROP = 0x4000, DAM_LOSE_TURN = 0x8000, DAM_HIT_SELF = 0x10000, DAM_LOSE_AMMO = 0x20000, DAM_DUD = 0x40000, DAM_HURT_SELF = 0x80000, DAM_RANDOM_HIT = 0x100000, DAM_CRIP_RANDOM = 0x200000, DAM_BACKWASH = 0x400000, DAM_PERFORM_REVERSE = 0x800000, DAM_CRIP_LEG_ANY = DAM_CRIP_LEG_LEFT | DAM_CRIP_LEG_RIGHT, DAM_CRIP_ARM_ANY = DAM_CRIP_ARM_LEFT | DAM_CRIP_ARM_RIGHT, DAM_CRIP = DAM_CRIP_LEG_ANY | DAM_CRIP_ARM_ANY | DAM_BLIND, } Dam; #define OBJ_LOCKED 0x02000000 #define OBJ_JAMMED 0x04000000 typedef struct Object Object; typedef struct InventoryItem { Object* item; int quantity; } InventoryItem; // Represents inventory of the object. typedef struct Inventory { int length; int capacity; InventoryItem* items; } Inventory; typedef struct WeaponObjectData { int ammoQuantity; // obj_pudg.pudweapon.cur_ammo_quantity int ammoTypePid; // obj_pudg.pudweapon.cur_ammo_type_pid } WeaponObjectData; typedef struct AmmoItemData { int quantity; // obj_pudg.pudammo.cur_ammo_quantity } AmmoItemData; typedef struct MiscItemData { int charges; // obj_pudg.pudmisc_item.curr_charges } MiscItemData; typedef struct KeyItemData { int keyCode; // obj_pudg.pudkey_item.cur_key_code } KeyItemData; typedef union ItemObjectData { WeaponObjectData weapon; AmmoItemData ammo; MiscItemData misc; KeyItemData key; } ItemObjectData; typedef struct CritterCombatData { int maneuver; // obj_pud.combat_data.maneuver int ap; // obj_pud.combat_data.curr_mp int results; // obj_pud.combat_data.results int damageLastTurn; // obj_pud.combat_data.damage_last_turn int aiPacket; // obj_pud.combat_data.ai_packet int team; // obj_pud.combat_data.team_num union { Object* whoHitMe; // obj_pud.combat_data.who_hit_me int whoHitMeCid; }; } CritterCombatData; typedef struct CritterObjectData { int field_0; // obj_pud.reaction_to_pc CritterCombatData combat; // obj_pud.combat_data int hp; // obj_pud.curr_hp int radiation; // obj_pud.curr_rad int poison; // obj_pud.curr_poison } CritterObjectData; typedef struct DoorSceneryData { int openFlags; // obj_pudg.pudportal.cur_open_flags } DoorSceneryData; typedef struct StairsSceneryData { int destinationMap; // obj_pudg.pudstairs.destMap int destinationBuiltTile; // obj_pudg.pudstairs.destBuiltTile } StairsSceneryData; typedef struct ElevatorSceneryData { int type; int level; } ElevatorSceneryData; typedef struct LadderSceneryData { int destinationMap; int destinationBuiltTile; } LadderSceneryData; typedef union SceneryObjectData { DoorSceneryData door; StairsSceneryData stairs; ElevatorSceneryData elevator; LadderSceneryData ladder; } SceneryObjectData; typedef struct MiscObjectData { int map; int tile; int elevation; int rotation; } MiscObjectData; typedef struct ObjectData { Inventory inventory; union { CritterObjectData critter; struct { int flags; union { ItemObjectData item; SceneryObjectData scenery; MiscObjectData misc; }; }; }; } ObjectData; typedef struct Object { int id; // obj_id int tile; // obj_tile_num int x; // obj_x int y; // obj_y int sx; // obj_sx int sy; // obj_sy int frame; // obj_cur_frm int rotation; // obj_cur_rot int fid; // obj_fid int flags; // obj_flags int elevation; // obj_elev union { int field_2C_array[14]; ObjectData data; }; int pid; // obj_pid int cid; // obj_cid int lightDistance; // obj_light_distance int lightIntensity; // obj_light_intensity int outline; // obj_outline int sid; // obj_sid Object* owner; int field_80; } Object; typedef struct ObjectListNode { Object* obj; struct ObjectListNode* next; } ObjectListNode; #define BUILT_TILE_TILE_MASK 0x3FFFFFF #define BUILT_TILE_ELEVATION_MASK 0xE0000000 #define BUILT_TILE_ELEVATION_SHIFT 29 #define BUILT_TILE_ROTATION_MASK 0x1C000000 #define BUILT_TILE_ROTATION_SHIFT 26 static inline int builtTileGetTile(int builtTile) { return builtTile & BUILT_TILE_TILE_MASK; } static inline int builtTileGetElevation(int builtTile) { return (builtTile & BUILT_TILE_ELEVATION_MASK) >> BUILT_TILE_ELEVATION_SHIFT; } static inline int builtTileGetRotation(int builtTile) { return (builtTile & BUILT_TILE_ROTATION_MASK) >> BUILT_TILE_ROTATION_SHIFT; } static inline int builtTileCreate(int tile, int elevation) { return tile | ((elevation << BUILT_TILE_ELEVATION_SHIFT) & BUILT_TILE_ELEVATION_MASK); } } // namespace fallout #endif /* OBJ_TYPES_H */