#ifndef PROTO_TYPES_H #define PROTO_TYPES_H namespace fallout { // Number of prototypes in prototype extent. #define PROTO_LIST_EXTENT_SIZE 16 // Max number of prototypes of one type to be stored in prototype cache lists. // Once this value is reached the top most proto extent is removed from the // cache list. // // See: // - [sub_4A2108] // - [sub_4A2040] #define PROTO_LIST_MAX_ENTRIES 512 #define WEAPON_TWO_HAND 0x00000200 enum { GENDER_MALE, GENDER_FEMALE, GENDER_COUNT, }; enum { ITEM_TYPE_ARMOR, ITEM_TYPE_CONTAINER, ITEM_TYPE_DRUG, ITEM_TYPE_WEAPON, ITEM_TYPE_AMMO, ITEM_TYPE_MISC, ITEM_TYPE_KEY, ITEM_TYPE_COUNT, }; enum { SCENERY_TYPE_DOOR, SCENERY_TYPE_STAIRS, SCENERY_TYPE_ELEVATOR, SCENERY_TYPE_LADDER_UP, SCENERY_TYPE_LADDER_DOWN, SCENERY_TYPE_GENERIC, SCENERY_TYPE_COUNT, }; enum { MATERIAL_TYPE_GLASS, MATERIAL_TYPE_METAL, MATERIAL_TYPE_PLASTIC, MATERIAL_TYPE_WOOD, MATERIAL_TYPE_DIRT, MATERIAL_TYPE_STONE, MATERIAL_TYPE_CEMENT, MATERIAL_TYPE_LEATHER, MATERIAL_TYPE_COUNT, }; enum { DAMAGE_TYPE_NORMAL, DAMAGE_TYPE_LASER, DAMAGE_TYPE_FIRE, DAMAGE_TYPE_PLASMA, DAMAGE_TYPE_ELECTRICAL, DAMAGE_TYPE_EMP, DAMAGE_TYPE_EXPLOSION, DAMAGE_TYPE_COUNT, }; enum { CALIBER_TYPE_NONE, CALIBER_TYPE_ROCKET, CALIBER_TYPE_FLAMETHROWER_FUEL, CALIBER_TYPE_C_ENERGY_CELL, CALIBER_TYPE_D_ENERGY_CELL, CALIBER_TYPE_223, CALIBER_TYPE_5_MM, CALIBER_TYPE_40_CAL, CALIBER_TYPE_10_MM, CALIBER_TYPE_44_CAL, CALIBER_TYPE_14_MM, CALIBER_TYPE_12_GAUGE, CALIBER_TYPE_9_MM, CALIBER_TYPE_BB, CALIBER_TYPE_45_CAL, CALIBER_TYPE_2_MM, CALIBER_TYPE_4_7_MM_CASELESS, CALIBER_TYPE_NH_NEEDLER, CALIBER_TYPE_7_62, CALIBER_TYPE_COUNT, }; enum { RACE_TYPE_CAUCASIAN, RACE_TYPE_AFRICAN, RACE_TYPE_COUNT, }; enum { BODY_TYPE_BIPED, BODY_TYPE_QUADRUPED, BODY_TYPE_ROBOTIC, BODY_TYPE_COUNT, }; enum { KILL_TYPE_MAN, KILL_TYPE_WOMAN, KILL_TYPE_CHILD, KILL_TYPE_SUPER_MUTANT, KILL_TYPE_GHOUL, KILL_TYPE_BRAHMIN, KILL_TYPE_RADSCORPION, KILL_TYPE_RAT, KILL_TYPE_FLOATER, KILL_TYPE_CENTAUR, KILL_TYPE_ROBOT, KILL_TYPE_DOG, KILL_TYPE_MANTIS, KILL_TYPE_DEATH_CLAW, KILL_TYPE_PLANT, KILL_TYPE_GECKO, KILL_TYPE_ALIEN, KILL_TYPE_GIANT_ANT, KILL_TYPE_BIG_BAD_BOSS, KILL_TYPE_COUNT, // Sfall has the option to treat kill type numbers as shorts, thus doubling // number of kill types it can deal with without breaking backwards // compatibility. SFALL_KILL_TYPE_COUNT = KILL_TYPE_COUNT * 2, }; enum { PROTO_ID_POWER_ARMOR = 3, PROTO_ID_SMALL_ENERGY_CELL = 38, PROTO_ID_MICRO_FUSION_CELL = 39, PROTO_ID_STIMPACK = 40, PROTO_ID_MONEY = 41, PROTO_ID_FIRST_AID_KIT = 47, PROTO_ID_RADAWAY = 48, PROTO_ID_DYNAMITE_I = 51, PROTO_ID_GEIGER_COUNTER_I = 52, PROTO_ID_MENTATS = 53, PROTO_ID_STEALTH_BOY_I = 54, PROTO_ID_MOTION_SENSOR = 59, PROTO_ID_BIG_BOOK_OF_SCIENCE = 73, PROTO_ID_DEANS_ELECTRONICS = 76, PROTO_ID_FLARE = 79, PROTO_ID_FIRST_AID_BOOK = 80, PROTO_ID_PLASTIC_EXPLOSIVES_I = 85, PROTO_ID_SCOUT_HANDBOOK = 86, PROTO_ID_BUFF_OUT = 87, PROTO_ID_DOCTORS_BAG = 91, PROTO_ID_GUNS_AND_BULLETS = 102, PROTO_ID_NUKA_COLA = 106, PROTO_ID_PSYCHO = 110, PROTO_ID_BEER = 124, PROTO_ID_BOOZE = 125, PROTO_ID_SUPER_STIMPACK = 144, PROTO_ID_MOLOTOV_COCKTAIL = 159, PROTO_ID_LIT_FLARE = 205, PROTO_ID_DYNAMITE_II = 206, // armed PROTO_ID_GEIGER_COUNTER_II = 207, PROTO_ID_PLASTIC_EXPLOSIVES_II = 209, // armed PROTO_ID_STEALTH_BOY_II = 210, PROTO_ID_HARDENED_POWER_ARMOR = 232, PROTO_ID_JET = 259, PROTO_ID_JET_ANTIDOTE = 260, PROTO_ID_HEALING_POWDER = 273, PROTO_ID_DECK_OF_TRAGIC_CARDS = 304, PROTO_ID_CATS_PAW_ISSUE_5 = 331, PROTO_ID_ADVANCED_POWER_ARMOR = 348, PROTO_ID_ADVANCED_POWER_ARMOR_MK_II = 349, PROTO_ID_SHIV = 383, PROTO_ID_SOLAR_SCORCHER = 390, PROTO_ID_SUPER_CATTLE_PROD = 399, PROTO_ID_MEGA_POWER_FIST = 407, PROTO_ID_FIELD_MEDIC_FIRST_AID_KIT = 408, PROTO_ID_PARAMEDICS_BAG = 409, PROTO_ID_RAMIREZ_BOX_CLOSED = 431, PROTO_ID_MIRRORED_SHADES = 433, PROTO_ID_RAIDERS_MAP = 444, PROTO_ID_CAR_TRUNK = 455, PROTO_ID_PIP_BOY_LINGUAL_ENHANCER = 499, PROTO_ID_PIP_BOY_MEDICAL_ENHANCER = 516, PROTO_ID_SURVEY_MAP = 523, }; #define PROTO_ID_0x1000098 0x1000098 #define PROTO_ID_0x10001E0 0x10001E0 #define PROTO_ID_0x2000031 0x2000031 #define PROTO_ID_0x2000158 0x2000158 #define PROTO_ID_CAR 0x20003F1 #define PROTO_ID_0x200050D 0x200050D #define PROTO_ID_0x2000099 0x2000099 #define PROTO_ID_0x20001A5 0x20001A5 #define PROTO_ID_0x20001D6 0x20001D6 #define PROTO_ID_0x20001EB 0x20001EB #define FID_0x20001F5 0x20001F5 #define FIRST_EXIT_GRID_PID 0x5000010 #define LAST_EXIT_GRID_PID 0x5000017 #define FIRST_RADIOACTIVE_GOO_PID 0x20003D9 #define LAST_RADIOACTIVE_GOO_PID 0x20003DC typedef enum ItemProtoFlags { ItemProtoFlags_0x08 = 0x08, ItemProtoFlags_0x10 = 0x10, ItemProtoFlags_0x1000 = 0x1000, ItemProtoFlags_0x8000 = 0x8000, ItemProtoFlags_0x20000000 = 0x20000000, ItemProtoFlags_0x80000000 = 0x80000000, } ItemProtoFlags; typedef enum ItemProtoExtendedFlags { ItemProtoExtendedFlags_BigGun = 0x0100, ItemProtoExtendedFlags_IsTwoHanded = 0x0200, ItemProtoExtendedFlags_0x0800 = 0x0800, ItemProtoExtendedFlags_0x1000 = 0x1000, ItemProtoExtendedFlags_0x2000 = 0x2000, ItemProtoExtendedFlags_0x8000 = 0x8000, // This flag is used on weapons to indicate that's an natural (integral) // part of it's owner, for example Claw, or Robot's Rocket Launcher. Items // with this flag on do count toward total weight and cannot be dropped. ITEM_HIDDEN = 0x08000000, } ItemProtoExtendedFlags; typedef struct { int armorClass; // d.ac int damageResistance[7]; // d.dam_resist int damageThreshold[7]; // d.dam_thresh int perk; // d.perk int maleFid; // d.male_fid int femaleFid; // d.female_fid } ProtoItemArmorData; typedef struct { int maxSize; // d.max_size int openFlags; // d.open_flags } ProtoItemContainerData; typedef struct { int stat[3]; // d.stat int amount[3]; // d.amount int duration1; // d.duration1 int amount1[3]; // d.amount1 int duration2; // d.duration2 int amount2[3]; // d.amount2 int addictionChance; // d.addiction_chance int withdrawalEffect; // d.withdrawal_effect int withdrawalOnset; // d.withdrawal_onset } ProtoItemDrugData; typedef struct { int animationCode; // d.animation_code int minDamage; // d.min_damage int maxDamage; // d.max_damage int damageType; // d.dt int maxRange1; // d.max_range1 int maxRange2; // d.max_range2 int projectilePid; // d.proj_pid int minStrength; // d.min_st int actionPointCost1; // d.mp_cost1 int actionPointCost2; // d.mp_cost2 int criticalFailureType; // d.crit_fail_table int perk; // d.perk int rounds; // d.rounds int caliber; // d.caliber int ammoTypePid; // d.ammo_type_pid int ammoCapacity; // d.max_ammo unsigned char soundCode; // d.sound_id } ProtoItemWeaponData; typedef struct { int caliber; // d.caliber int quantity; // d.quantity int armorClassModifier; // d.ac_adjust int damageResistanceModifier; // d.dr_adjust int damageMultiplier; // d.dam_mult int damageDivisor; // d.dam_div } ProtoItemAmmoData; typedef struct { int powerTypePid; // d.power_type_pid int powerType; // d.power_type int charges; // d.charges } ProtoItemMiscData; typedef struct { int keyCode; // d.key_code } ProtoItemKeyData; typedef struct ItemProtoData { union { struct { int field_0; int field_4; int field_8; // max charges int field_C; int field_10; int field_14; int field_18; } unknown; ProtoItemArmorData armor; ProtoItemContainerData container; ProtoItemDrugData drug; ProtoItemWeaponData weapon; ProtoItemAmmoData ammo; ProtoItemMiscData misc; ProtoItemKeyData key; }; } ItemProtoData; typedef struct ItemProto { int pid; // pid int messageId; // message_num int fid; // fid int lightDistance; // light_distance int lightIntensity; // light_intensity int flags; // flags int extendedFlags; // flags_ext int sid; // sid int type; // type ItemProtoData data; // d int material; // material int size; // size int weight; // weight int cost; // cost int inventoryFid; // inv_fid unsigned char field_80; } ItemProto; typedef struct CritterProtoData { int flags; // d.flags int baseStats[35]; // d.stat_base int bonusStats[35]; // d.stat_bonus int skills[18]; // d.stat_points int bodyType; // d.body int experience; int killType; // Looks like this is the "native" damage type when critter is unarmed. int damageType; } CritterProtoData; typedef struct CritterProto { int pid; // pid int messageId; // message_num int fid; // fid int lightDistance; // light_distance int lightIntensity; // light_intensity int flags; // flags int extendedFlags; // flags_ext int sid; // sid CritterProtoData data; // d int headFid; // head_fid int aiPacket; // ai_packet int team; // team_num } CritterProto; typedef struct { int openFlags; // d.open_flags int keyCode; // d.key_code } SceneryProtoDoorData; typedef struct { int field_0; // d.lower_tile int field_4; // d.upper_tile } SceneryProtoStairsData; typedef struct { int type; int level; } SceneryProtoElevatorData; typedef struct { int field_0; } SceneryProtoLadderData; typedef struct { int field_0; } SceneryProtoGenericData; typedef struct SceneryProtoData { union { SceneryProtoDoorData door; SceneryProtoStairsData stairs; SceneryProtoElevatorData elevator; SceneryProtoLadderData ladder; SceneryProtoGenericData generic; }; } SceneryProtoData; typedef struct SceneryProto { int pid; // id int messageId; // message_num int fid; // fid int lightDistance; // light_distance int lightIntensity; // light_intensity int flags; // flags int extendedFlags; // flags_ext int sid; // sid int type; // type SceneryProtoData data; int field_2C; // material int field_30; // unsigned char field_34; } SceneryProto; typedef struct WallProto { int pid; // id int messageId; // message_num int fid; // fid int lightDistance; // light_distance int lightIntensity; // light_intensity int flags; // flags int extendedFlags; // flags_ext int sid; // sid int material; // material } WallProto; typedef struct TileProto { int pid; // id int messageId; // message_num int fid; // fid int flags; // flags int extendedFlags; // flags_ext int sid; // sid int material; // material } TileProto; typedef struct MiscProto { int pid; // id int messageId; // message_num int fid; // fid int lightDistance; // light_distance int lightIntensity; // light_intensity int flags; // flags int extendedFlags; // flags_ext } MiscProto; typedef union Proto { struct { int pid; // pid int messageId; // message_num int fid; // fid // TODO: Move to NonTile props? int lightDistance; int lightIntensity; int flags; int extendedFlags; int sid; }; ItemProto item; CritterProto critter; SceneryProto scenery; WallProto wall; TileProto tile; MiscProto misc; } Proto; typedef struct ProtoListExtent { Proto* proto[PROTO_LIST_EXTENT_SIZE]; // Number of protos in the extent int length; struct ProtoListExtent* next; } ProtoListExtent; typedef struct ProtoList { ProtoListExtent* head; ProtoListExtent* tail; // Number of extents in the list. int length; // Number of lines in proto/{type}/{type}.lst. int max_entries_num; } ProtoList; } // namespace fallout #endif /* PROTO_TYPES_H */