From https://github.com/phobos2077/sfall/blob/master/sfall/FalloutEngine/Enums.h
enum Animation : long { ANIM_stand = 0, ANIM_walk = 1, ANIM_jump_begin = 2, ANIM_jump_end = 3, ANIM_climb_ladder = 4, ANIM_falling = 5, ANIM_up_stairs_right = 6, ANIM_up_stairs_left = 7, ANIM_down_stairs_right = 8, ANIM_down_stairs_left = 9, ANIM_magic_hands_ground = 10, ANIM_magic_hands_middle = 11, ANIM_magic_hands_up = 12, ANIM_dodge_anim = 13, ANIM_hit_from_front = 14, ANIM_hit_from_back = 15, ANIM_throw_punch = 16, ANIM_kick_leg = 17, ANIM_throw_anim = 18, ANIM_running = 19, ANIM_fall_back = 20, ANIM_fall_front = 21, ANIM_bad_landing = 22, ANIM_big_hole = 23, ANIM_charred_body = 24, ANIM_chunks_of_flesh = 25, ANIM_dancing_autofire = 26, ANIM_electrify = 27, ANIM_sliced_in_half = 28, ANIM_burned_to_nothing = 29, ANIM_electrified_to_nothing = 30, ANIM_exploded_to_nothing = 31, ANIM_melted_to_nothing = 32, ANIM_fire_dance = 33, ANIM_fall_back_blood = 34, ANIM_fall_front_blood = 35, ANIM_prone_to_standing = 36, ANIM_back_to_standing = 37, ANIM_take_out = 38, ANIM_put_away = 39, ANIM_parry_anim = 40, ANIM_thrust_anim = 41, ANIM_swing_anim = 42, ANIM_point = 43, ANIM_unpoint = 44, ANIM_fire_single = 45, ANIM_fire_burst = 46, ANIM_fire_continuous = 47, ANIM_fall_back_sf = 48, ANIM_fall_front_sf = 49, ANIM_bad_landing_sf = 50, ANIM_big_hole_sf = 51, ANIM_charred_body_sf = 52, ANIM_chunks_of_flesh_sf = 53, ANIM_dancing_autofire_sf = 54, ANIM_electrify_sf = 55, ANIM_sliced_in_half_sf = 56, ANIM_burned_to_nothing_sf = 57, ANIM_electrified_to_nothing_sf = 58, ANIM_exploded_to_nothing_sf = 59, ANIM_melted_to_nothing_sf = 60, ANIM_fire_dance_sf = 61, ANIM_fall_back_blood_sf = 62, ANIM_fall_front_blood_sf = 63, ANIM_called_shot_pic = 64, }; enum DamageFlag : long { DAM_KNOCKED_OUT = 0x1, DAM_KNOCKED_DOWN = 0x2, DAM_CRIP_LEG_LEFT = 0x4, DAM_CRIP_LEG_RIGHT = 0x8, 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, }; enum DamageType { DMG_normal = 0, DMG_laser = 1, DMG_fire = 2, DMG_plasma = 3, DMG_electrical = 4, DMG_emp = 5, DMG_explosion = 6, DMG_BYPASS_ARMOR = 256, DMG_NOANIMATE = 512, }; enum Gender { GENDER_MALE = 0, GENDER_FEMALE = 1, }; // Some global variables referenced by engine enum GlobalVar : long { GVAR_PLAYER_REPUTATION = 0, GVAR_ENEMY_ARROYO = 7, GVAR_PLAYER_GOT_CAR = 18, GVAR_NUKA_COLA_ADDICT = 21, GVAR_BUFF_OUT_ADDICT = 22, GVAR_MENTATS_ADDICT = 23, GVAR_PSYCHO_ADDICT = 24, GVAR_RADAWAY_ADDICT = 25, GVAR_ALCOHOL_ADDICT = 26, GVAR_LOAD_MAP_INDEX = 27, GVAR_TOWN_REP_ARROYO = 47, GVAR_ADDICT_TRAGIC = 295, GVAR_ADDICT_JET = 296, GVAR_CAR_BLOWER = 439, GVAR_CAR_UPGRADE_FUEL_CELL_REGULATOR = 453, GVAR_NEW_RENO_CAR_UPGRADE = 455, GVAR_NEW_RENO_SUPER_CAR = 456, GVAR_MODOC_SHITTY_DEATH = 491, GVAR_FALLOUT_2 = 494, }; // Physical material type, used for items and tiles. enum class Material : long { Glass = 0x0, Metal = 0x1, Plastic = 0x2, Wood = 0x3, Dirt = 0x4, Stone = 0x5, Cement = 0x6, Leather = 0x7 }; namespace ObjectFlag { enum ObjectFlag : DWORD { Mouse_3d = 0x1, WalkThru = 0x4, Flat = 0x8, NoBlock = 0x10, Lighting = 0x20, Temp = 0x400, MultiHex = 0x800, NoHighlight = 0x1000, Used = 0x2000, TransRed = 0x4000, TransNone = 0x8000, TransWall = 0x10000, TransGlass = 0x20000, TransSteam = 0x40000, TransEnergy = 0x80000, Left_Hand = 0x1000000, Right_Hand = 0x2000000, Worn = 0x4000000, HiddenItem = 0x8000000, WallTransEnd = 0x10000000, LightThru = 0x20000000, Seen = 0x40000000, ShootThru = 0x80000000, }; } enum ObjType : char { OBJ_TYPE_ITEM = 0, OBJ_TYPE_CRITTER = 1, OBJ_TYPE_SCENERY = 2, OBJ_TYPE_WALL = 3, OBJ_TYPE_TILE = 4, OBJ_TYPE_MISC = 5, OBJ_TYPE_SPATIAL = 6 }; enum ArtType : char { OBJ_TYPE_INTRFACE = 6, OBJ_TYPE_INVEN = 7, OBJ_TYPE_HEAD = 8, OBJ_TYPE_BACKGROUND = 9, OBJ_TYPE_SKILLDEX = 10 }; // Some FO2 PIDs possibly used by engine enum ProtoId : long { PID_ROCK = 19, PID_SMALL_ENERGY_CELL = 38, PID_MICRO_FUSION_CELL = 39, PID_STIMPAK = 40, PID_BOTTLE_CAPS = 41, PID_FIRST_AID_KIT = 47, PID_RADAWAY = 48, PID_ANTIDOTE = 49, PID_DYNAMITE = 51, PID_GEIGER_COUNTER = 52, PID_MENTATS = 53, PID_STEALTH_BOY = 54, PID_WATER_CHIP = 55, PID_HOLODISK = 58, PID_MOTION_SENSOR = 59, PID_MUTATED_FRUIT = 71, PID_BIG_BOOK_OF_SCIENCE = 73, PID_DEANS_ELECTRONICS = 76, PID_FLARE = 79, PID_FIRST_AID_BOOK = 80, PID_PLASTIC_EXPLOSIVES = 85, PID_SCOUT_HANDBOOK = 86, PID_BUFFOUT = 87, PID_DOCTORS_BAG = 91, PID_PUMP_PARTS = 98, PID_GUNS_AND_BULLETS = 102, PID_NUKA_COLA = 106, PID_RAD_X = 109, PID_PSYCHO = 110, PID_BEER = 124, PID_BOOZE = 125, PID_SUPER_STIMPAK = 144, PID_ACTIVE_FLARE = 205, PID_ACTIVE_DYNAMITE = 206, PID_ACTIVE_GEIGER_COUNTER = 207, PID_ACTIVE_MOTION_SENSOR = 208, PID_ACTIVE_PLASTIC_EXPLOSIVE = 209, PID_ACTIVE_STEALTH_BOY = 210, PID_TECHNICAL_MANUAL = 228, PID_CHEMISTRY_MANUAL = 237, PID_JET = 259, PID_JET_ANTIDOTE = 260, PID_DECK_OF_TRAGIC_CARDS = 306, PID_GECK = 366, PID_CAR_TRUNK = 455, PID_JESSE_CONTAINER = 467, PID_Player = 16777216, PID_DRIVABLE_CAR = 33555441 }; //XXXXXXXXXXXXXXXXXXXXX //XX Critter defines XX //XXXXXXXXXXXXXXXXXXXXX // Trait defines // #define TRAIT_PERK (0) #define TRAIT_OBJECT (1) #define TRAIT_TRAIT (2) enum Perk : long { PERK_bonus_awareness = 0, PERK_bonus_hth_attacks = 1, PERK_bonus_hth_damage = 2, PERK_bonus_move = 3, PERK_bonus_ranged_damage = 4, PERK_bonus_rate_of_fire = 5, PERK_earlier_sequence = 6, PERK_faster_healing = 7, PERK_more_criticals = 8, PERK_night_vision = 9, PERK_presence = 10, PERK_rad_resistance = 11, PERK_toughness = 12, PERK_strong_back = 13, PERK_sharpshooter = 14, PERK_silent_running = 15, PERK_survivalist = 16, PERK_master_trader = 17, PERK_educated = 18, PERK_healer = 19, PERK_fortune_finder = 20, PERK_better_criticals = 21, PERK_empathy = 22, PERK_slayer = 23, PERK_sniper = 24, PERK_silent_death = 25, PERK_action_boy = 26, PERK_mental_block = 27, PERK_lifegiver = 28, PERK_dodger = 29, PERK_snakeater = 30, PERK_mr_fixit = 31, PERK_medic = 32, PERK_master_thief = 33, PERK_speaker = 34, PERK_heave_ho = 35, PERK_friendly_foe = 36, PERK_pickpocket = 37, PERK_ghost = 38, PERK_cult_of_personality = 39, PERK_scrounger = 40, PERK_explorer = 41, PERK_flower_child = 42, PERK_pathfinder = 43, PERK_animal_friend = 44, PERK_scout = 45, PERK_mysterious_stranger = 46, PERK_ranger = 47, PERK_quick_pockets = 48, PERK_smooth_talker = 49, PERK_swift_learner = 50, PERK_tag = 51, PERK_mutate = 52, PERK_add_nuka = 53, PERK_add_buffout = 54, PERK_add_mentats = 55, PERK_add_psycho = 56, PERK_add_radaway = 57, PERK_weapon_long_range = 58, PERK_weapon_accurate = 59, PERK_weapon_penetrate = 60, PERK_weapon_knockback = 61, PERK_armor_powered = 62, PERK_armor_combat = 63, PERK_weapon_scope_range = 64, PERK_weapon_fast_reload = 65, PERK_weapon_night_sight = 66, PERK_weapon_flameboy = 67, PERK_armor_advanced_1 = 68, PERK_armor_advanced_2 = 69, PERK_add_jet = 70, PERK_add_tragic = 71, PERK_armor_charisma = 72, PERK_gecko_skinning_perk = 73, PERK_dermal_armor_perk = 74, PERK_dermal_enhancement_perk = 75, PERK_phoenix_armor_perk = 76, PERK_phoenix_enhancement_perk = 77, PERK_vault_city_inoculations_perk = 78, PERK_adrenaline_rush_perk = 79, PERK_cautious_nature_perk = 80, PERK_comprehension_perk = 81, PERK_demolition_expert_perk = 82, PERK_gambler_perk = 83, PERK_gain_strength_perk = 84, PERK_gain_perception_perk = 85, PERK_gain_endurance_perk = 86, PERK_gain_charisma_perk = 87, PERK_gain_intelligence_perk = 88, PERK_gain_agility_perk = 89, PERK_gain_luck_perk = 90, PERK_harmless_perk = 91, PERK_here_and_now_perk = 92, PERK_hth_evade_perk = 93, PERK_kama_sutra_perk = 94, PERK_karma_beacon_perk = 95, PERK_light_step_perk = 96, PERK_living_anatomy_perk = 97, PERK_magnetic_personality_perk = 98, PERK_negotiator_perk = 99, PERK_pack_rat_perk = 100, PERK_pyromaniac_perk = 101, PERK_quick_recovery_perk = 102, PERK_salesman_perk = 103, PERK_stonewall_perk = 104, PERK_thief_perk = 105, PERK_weapon_handling_perk = 106, PERK_vault_city_training_perk = 107, PERK_alcohol_hp_bonus1_perk = 108, PERK_alcohol_hp_bonus2_perk = 109, PERK_alcohol_hp_neg1_perk = 110, PERK_alcohol_hp_neg2_perk = 111, PERK_autodoc_hp_bonus1_perk = 112, PERK_autodoc_hp_bonus2_perk = 113, PERK_autodoc_hp_neg1_perk = 114, PERK_autodoc_hp_neg2_perk = 115, PERK_expert_excrement_expediter_perk = 116, PERK_weapon_knockout_perk = 117, PERK_jinxed_perk = 118, PERK_count = 119 }; enum Trait : long { TRAIT_fast_metabolism = 0, TRAIT_bruiser = 1, TRAIT_small_frame = 2, TRAIT_one_hander = 3, TRAIT_finesse = 4, TRAIT_kamikaze = 5, TRAIT_heavy_handed = 6, TRAIT_fast_shot = 7, TRAIT_bloody_mess = 8, TRAIT_jinxed = 9, TRAIT_good_natured = 10, TRAIT_drug_addict = 11, TRAIT_drug_resistant = 12, TRAIT_sex_appeal = 13, TRAIT_skilled = 14, TRAIT_gifted = 15, TRAIT_count = 16, }; enum class ScenerySubType : long { DOOR = 0, STAIRS = 1, ELEVATOR = 2, LADDER_BOTTOM = 3, LADDER_TOP = 4, GENERIC = 5 }; enum ScriptTypes { SCRIPT_SYSTEM = 0, SCRIPT_SPATIAL = 1, SCRIPT_TIME = 2, SCRIPT_ITEM = 3, SCRIPT_CRITTER = 4, }; // proto.h: stats // enum Stat : long { STAT_st = 0, STAT_pe = 1, STAT_en = 2, STAT_ch = 3, STAT_iq = 4, STAT_ag = 5, STAT_lu = 6, /// strength, perception, endurance, charisma, intelligence, agility, /// luck, // luck MUST be the last basic stat // derived stats STAT_max_hit_points = 7, STAT_max_move_points = 8, STAT_ac = 9, STAT_unused = 10, STAT_melee_dmg = 11, STAT_carry_amt = 12, STAT_sequence = 13, STAT_heal_rate = 14, STAT_crit_chance = 15, STAT_better_crit = 16, STAT_dmg_thresh = 17, STAT_dmg_thresh_laser = 18, STAT_dmg_thresh_fire = 19, STAT_dmg_thresh_plasma = 20, STAT_dmg_thresh_electrical = 21, STAT_dmg_thresh_emp = 22, STAT_dmg_thresh_explosion = 23, STAT_dmg_resist = 24, STAT_dmg_resist_laser = 25, STAT_dmg_resist_fire = 26, STAT_dmg_resist_plasma = 27, STAT_dmg_resist_electrical = 28, STAT_dmg_resist_emp = 29, STAT_dmg_resist_explosion = 30, STAT_rad_resist = 31, STAT_poison_resist = 32, // poison_resist MUST be the last derived stat // nonderived stats STAT_age = 33, STAT_gender = 34, // gender MUST be the last nonderived stat STAT_current_hp = 35, STAT_current_poison = 36, STAT_current_rad = 37, STAT_real_max_stat = 38 }; namespace ScriptProc { enum ScriptProc : long { no_p_proc = 0, start = 1, spatial_p_proc = 2, description_p_proc = 3, pickup_p_proc = 4, drop_p_proc = 5, use_p_proc = 6, use_obj_on_p_proc = 7, use_skill_on_p_proc = 8, none_x_bad = 9, none_x_bad2 = 10, talk_p_proc = 11, critter_p_proc = 12, combat_p_proc = 13, damage_p_proc = 14, map_enter_p_proc = 15, map_exit_p_proc = 16, create_p_proc = 17, destroy_p_proc = 18, none_x_bad3 = 19, none_x_bad4 = 20, look_at_p_proc = 21, timed_event_p_proc = 22, map_update_p_proc = 23, push_p_proc = 24, is_dropping_p_proc = 25, combat_is_starting_p_proc = 26, combat_is_over_p_proc = 27, count = 28 }; } #define STAT_max_derived STAT_poison_resist #define STAT_max_stat STAT_current_hp // Script data types #define VAR_TYPE_INT (0xC001) #define VAR_TYPE_FLOAT (0xA001) #define VAR_TYPE_STR (0x9801) #define VAR_TYPE_STR2 (0x9001) // extra stat-like values that are treated specially enum PCStat : long { PCSTAT_unspent_skill_points = 0, PCSTAT_level = 1, PCSTAT_experience = 2, PCSTAT_reputation = 3, PCSTAT_karma = 4, PCSTAT_max_pc_stat = 5, }; enum Skill : long { SKILL_SMALL_GUNS = 0, SKILL_BIG_GUNS = 1, SKILL_ENERGY_WEAPONS = 2, SKILL_UNARMED_COMBAT = 3, SKILL_MELEE = 4, SKILL_THROWING = 5, SKILL_FIRST_AID = 6, SKILL_DOCTOR = 7, SKILL_SNEAK = 8, SKILL_LOCKPICK = 9, SKILL_STEAL = 10, SKILL_TRAPS = 11, SKILL_SCIENCE = 12, SKILL_REPAIR = 13, SKILL_CONVERSANT = 14, SKILL_BARTER = 15, SKILL_GAMBLING = 16, SKILL_OUTDOORSMAN = 17, SKILL_count = 18 }; //XXXXXXXXXXXXXXXXXXXX //XX Object defines XX //XXXXXXXXXXXXXXXXXXXX enum ItemType : long { item_type_armor = 0, item_type_container = 1, item_type_drug = 2, item_type_weapon = 3, item_type_ammo = 4, item_type_misc_item = 5, item_type_key = 6, }; // Inventory Equates enum InvenType : long { INVEN_TYPE_WORN = 0, INVEN_TYPE_RIGHT_HAND = 1, INVEN_TYPE_LEFT_HAND = 2, }; enum AttackType : long { ATKTYPE_LWEAPON_PRIMARY = 0, ATKTYPE_LWEAPON_SECONDARY = 1, ATKTYPE_RWEAPON_PRIMARY = 2, ATKTYPE_RWEAPON_SECONDARY = 3, ATKTYPE_PUNCH = 4, ATKTYPE_KICK = 5, ATKTYPE_LWEAPON_RELOAD = 6, ATKTYPE_RWEAPON_RELOAD = 7, ATKTYPE_STRONGPUNCH = 8, ATKTYPE_HAMMERPUNCH = 9, ATKTYPE_HAYMAKER = 10, ATKTYPE_JAB = 11, ATKTYPE_PALMSTRIKE = 12, ATKTYPE_PIERCINGSTRIKE = 13, ATKTYPE_STRONGKICK = 14, ATKTYPE_SNAPKICK = 15, ATKTYPE_POWERKICK = 16, ATKTYPE_HIPKICK = 17, ATKTYPE_HOOKKICK = 18, ATKTYPE_PIERCINGKICK = 19 }; enum AttackSubType : long { NONE = 0, UNARMED = 1, MELEE = 2, THROWING = 3, GUNS = 4 }; enum BodyType : long { Biped = 0, Quadruped = 1, Robotic = 2 }; #define PLAYER_ID (18000) #define OBJFLAG_CAN_WEAR_ITEMS (0xF000000) #define OBJFLAG_HELD_IN_RIGHT (0x10000) #define OBJFLAG_HELD_IN_LEFT (0x20000) #define OBJFLAG_WORN (0x40000) #define CRITTER_BROKEN_RARM (0x10) #define CRITTER_BROKEN_LARM (0x20) #define CRITTER_EYEDAMAGE (0x40) #define WEAPON_TWO_HANDED (0x200) #define AUTOMAP_MAX (160) enum TicksTime : unsigned long { ONE_GAME_YEAR = 315360000 }; enum ActiveSlot : unsigned long { Left = 0, Right = 1 }; enum RollResult { ROLL_CRITICAL_FAILURE = 0x0, ROLL_FAILURE = 0x1, ROLL_SUCCESS = 0x2, ROLL_CRITICAL_SUCCESS = 0x3, }; namespace Fields { enum CommonObj : long { id = 0x00, tile = 0x04, x = 0x08, y = 0x0C, sx = 0x10, sy = 0x14, frm = 0x18, rotation = 0x1C, artFid = 0x20, flags = 0x24, elevation = 0x28, inventory = 0x2C, protoId = 0x64, cid = 0x68, lightDistance = 0x6C, lightIntensity = 0x70, outline = 0x74, scriptId = 0x78, owner = 0x7C, scriptIndex = 0x80, }; enum CritterObj : long { reaction = 0x38, combatState = 0x3C, movePoints = 0x40, damageFlags = 0x44, damageLastTurn = 0x48, aiPacket = 0x4C, teamNum = 0x50, whoHitMe = 0x54, health = 0x58, rads = 0x5C, poison = 0x60, }; enum ItemObj : long { updatedFlags = 0x38, charges = 0x3C, ammoPid = 0x40, }; } namespace WinFlags { enum WinButtonFlags : long { OwnerFlag = 0x1, UnknownFlag2 = 0x2, MoveOnTop = 0x4, Hidden = 0x8, Exclusive = 0x10, Transparent = 0x20, UnknownFlag40 = 0x40, UnknownFlag80 = 0x80, scriptWindow = 0x100, itsButton = 0x10000, }; } enum QueueType : long { drug_effect_event = 0, // critter use drug knockout_event = 1, // critter addict_event = 2, // critter script_timer_event = 3, // any object game_time_event = 4, // no object poison_event = 5, // dude radiation_event = 6, // dude flare_time_event = 7, // item explode_event = 8, // item item_trickle_event = 9, sneak_event = 10, // dude explode_fail_event = 11, // item map_update_event = 12, gsound_sfx_event = 13 // no object };
From https://github.com/phobos2077/sfall/blob/master/sfall/FalloutEngine/Structs.h
struct GameObject; struct Program; struct ScriptInstance; #pragma pack(1) struct Art { long flags; char path[16]; char* names; long d18; long total; }; #pragma pack(1) struct AnimationSet { long currentAnim; long counter; long animCounter; long flags; struct Animation { long number; long source; long target; long data1; long elevation; long animCode; long delay; long(__fastcall *callFunc)(DWORD, DWORD); long(__fastcall *callFunc3)(DWORD, DWORD); long flags; long data2; long frmPtr; } animations[55]; }; static_assert(sizeof(AnimationSet) == 2656, "Incorrect AnimationSet definition."); // Bounding rectangle, used by tile_refresh_rect and related functions. #pragma pack(1) struct BoundRect { long x; long y; long offx; long offy; }; // Game objects (items, critters, etc.), including those stored in inventories. #pragma pack(1) struct GameObject { long id; long tile; long x; long y; long sx; long sy; long frm; long rotation; long artFid; long flags; long elevation; long invenSize; long invenMax; struct InvenItem { GameObject *object; long count; } *invenTable; union { struct { char updatedFlags[4]; // for weapons - ammo in magazine, for ammo - amount of ammo in last ammo pack long charges; // current type of ammo loaded in magazine long ammoPid; char gap_44[32]; } item; struct { long reaction; // 1 - combat, 2 - enemies out of sight, 4 - running away long combatState; // aka action points long movePoints; long damageFlags; long damageLastTurn; long aiPacket; long teamNum; long whoHitMe; long health; long rads; long poison; } critter; }; DWORD protoId; long cid; long lightDistance; long lightIntensity; DWORD outline; long scriptId; GameObject* owner; long scriptIndex; inline char Type() { return (protoId >> 24); } inline char TypeFid() { return ((artFid >> 24) & 0x0F); } }; // Results of compute_attack_() function. #pragma pack(1) struct ComputeAttackResult { GameObject* attacker; long hitMode; GameObject* weapon; long field_C; long attackerDamage; long attackerFlags; long numRounds; long message; GameObject* target; long targetTile; long bodyPart; long targetDamage; long targetFlags; long knockbackValue; GameObject* mainTarget; long numExtras; GameObject* extraTarget[6]; long extraBodyPart[6]; long extraDamage[6]; long extraFlags[6]; long extraKnockbackValue[6]; }; // Script instance attached to an object or tile (spatial script). #pragma pack(1) struct ScriptInstance { long id; long next; // first 3 bits - elevation, rest - tile number long elevationAndTile; long spatialRadius; long flags; long scriptIdx; Program *program; long selfObjectId; long localVarOffset; long numLocalVars; long returnValue; long action; long fixedParam; GameObject *selfObject; GameObject *sourceObject; GameObject *targetObject; long actionNum; long scriptOverrides; char gap_48[4]; long howMuch; char gap_50[4]; long procedureTable[28]; }; // Script run-time data #pragma pack(1) struct Program { const char* fileName; long *codeStackPtr; char gap_8[8]; long *codePtr; long field_14; char gap_18[4]; long *dStackPtr; long *aStackPtr; long *dStackOffs; long *aStackOffs; char gap_2C[4]; long *stringRefPtr; char gap_34[4]; long *procTablePtr; }; #pragma pack(1) struct ItemButtonItem { GameObject* item; union { long flags; struct { char cantUse; char itsWeapon; short unkFlag; }; }; long primaryAttack; long secondaryAttack; long mode; long fid; }; // When gained, the perk increases Stat by StatMod, which may be negative. All other perk effects come from being // specifically checked for by scripts or the engine. If a primary stat requirement is negative, that stat must be // below the value specified (e.g., -7 indicates a stat must be less than 7). Operator is only non-zero when there // are two skill requirements. If set to 1, only one of those requirements must be met; if set to 2, both must be met. #pragma pack(1) struct PerkInfo { const char* name; const char* description; long image; long ranks; long levelMin; long stat; long statMod; long skill1; long skill1Min; long skillOperator; long skill2; long skill2Min; long strengthMin; long perceptionMin; long enduranceMin; long charismaMin; long intelligenceMin; long agilityMin; long luckMin; }; #pragma pack(1) struct DbFile { long fileType; void* handle; }; #pragma pack(1) struct ElevatorExit { long id; long elevation; long tile; }; #pragma pack(1) struct ElevatorFrms { DWORD main; DWORD buttons; }; #pragma pack(1) struct FrmFile { long id; //0x00 short fps; //0x04 short actionFrame; //0x06 short frames; //0x08 short xshift[6]; //0x0a short yshift[6]; //0x16 long oriFrameOffset[6]; //0x22 long frameAreaSize; //0x3a short width; //0x3e short height; //0x40 long frameSize; //0x42 short xoffset; //0x46 short yoffset; //0x48 BYTE pixels[80 * 36]; //0x4a }; //structures for holding frms loaded with fallout2 functions #pragma pack(1) typedef class FrmFrameData { // sizeof 12 + 1 byte public: WORD width; WORD height; DWORD size; // width * height WORD x; WORD y; BYTE data[1]; // begin frame data } FrmFrameData; #pragma pack(2) typedef class FrmHeaderData { // sizeof 62 public: DWORD version; // version num WORD fps; // frames per sec WORD actionFrame; WORD numFrames; // number of frames per direction WORD xCentreShift[6]; // shift in the X direction, of frames with orientations [0-5] WORD yCentreShift[6]; // shift in the Y direction, of frames with orientations [0-5] DWORD oriOffset[6]; // offset of first frame for direction [0-5] from begining of frame area DWORD frameAreaSize; // size of all frames area } FrmHeaderData; // structures for loading unlisted frms #pragma pack(1) struct UnlistedFrm { DWORD version; WORD FPS; WORD actionFrame; WORD numFrames; WORD xCentreShift[6]; WORD yCentreShift[6]; DWORD oriOffset[6]; DWORD frameAreaSize; struct Frame { WORD width; WORD height; DWORD size; WORD x; WORD y; BYTE *indexBuff; Frame() { width = 0; height = 0; size = 0; x = 0; y = 0; indexBuff = nullptr; } ~Frame() { if (indexBuff != nullptr) delete[] indexBuff; } } *frames; UnlistedFrm() { version = 0; FPS = 0; actionFrame = 0; numFrames = 0; for (int i = 0; i < 6; i++) { xCentreShift[i] = 0; yCentreShift[i] = 0; oriOffset[i] = 0; } frameAreaSize = 0; frames = nullptr; } ~UnlistedFrm() { if (frames != nullptr) delete[] frames; } }; #pragma pack(1) struct MessageNode { long number; long flags; char* audio; char* message; MessageNode() { number = 0; flags = 0; audio = nullptr; message = nullptr; } }; //for holding msg array #pragma pack(1) typedef struct MessageList { long numMsgs; MessageNode *nodes; MessageList() { nodes = nullptr; numMsgs = 0; } } MessageList; #pragma pack(1) struct CritInfo { union { struct { // This is divided by 2, so a value of 3 does 1.5x damage, and 8 does 4x damage. long damageMult; // This is a flag bit field (DAM_*) controlling what effects the critical causes. long effectFlags; // This makes a check against a (SPECIAL) stat. Values of 2 (endurance), 5 (agility), and 6 (luck) are used, but other stats will probably work as well. A value of -1 indicates that no check is to be made. long statCheck; // Affects the outcome of the stat check, if one is made. Positive values make it easier to pass the check, and negative ones make it harder. long statMod; // Another bit field, using the same values as EffectFlags. If the stat check is failed, these are applied in addition to the earlier ones. long failureEffect; // The message to show when this critical occurs, taken from combat.msg . long message; // Shown instead of Message if the stat check is failed. long failMessage; }; long values[7]; }; }; #pragma pack(1) struct SkillInfo { const char* name; const char* description; long attr; long image; long base; long statMulti; long statA; long statB; long skillPointMulti; // Default experience for using the skill: 25 for Lockpick, Steal, Traps, and First Aid, 50 for Doctor, and 100 for Outdoorsman. long experience; // 1 for Lockpick, Steal, Traps; 0 otherwise long f; }; #pragma pack(1) struct StatInfo { const char* dame; const char* description; long image; long minValue; long maxValue; long defaultValue; }; #pragma pack(1) struct TraitInfo { const char* name; const char* description; long image; }; //fallout2 path node structure #pragma pack(1) struct PathNode { char* path; void* pDat; long isDat; PathNode* next; }; #pragma pack(1) struct PremadeChar { char path[20]; DWORD fid; char unknown[20]; }; // In-memory PROTO structure, not the same as PRO file format. #pragma pack(1) struct Proto { struct Tile { long scriptId; Material material; }; struct Item { struct Weapon { long animationCode; long minDamage; long maxDamage; long damageType; long maxRange[2]; long projectilePid; long minStrength; long movePointCost[2]; long critFailTable; long perk; long burstRounds; long caliber; long ammoPid; long maxAmmo; // shot sound ID long soundId; long gap_68; }; struct Ammo { long caliber; long packSize; long acAdjust; long drAdjust; long damageMult; long damageDiv; char gap_3c[48]; }; struct Armor { long armorClass; // for each DamageType long damageResistance[7]; // for each DamageType long damageThreshold[7]; long perk; long maleFrameNum; long femaleFrameNum; }; struct Container { // container size capacity (not weight) long maxSize; // 1 - has use animation, 0 - no animation long openFlags; }; struct Drug { long stats[3]; long immediateEffect[3]; struct DelayedEffect { // delay for the effect long duration; // effect amount for each stat long effect[3]; } delayed[2]; long addictionRate; long addictionEffect; long addictionOnset; char gap_68[4]; }; struct Misc { long powerPid; long powerType; long maxCharges; }; struct Key { long keyCode; }; long flags; long flagsExt; // 0x0Y00XXXX: Y - script type (0=s_system, 1=s_spatial, 2=s_time, 3=s_item, 4=s_critter); XXXX - number in scripts.lst. -1 means no script. long scriptId; ItemType type; union { Weapon weapon; Ammo ammo; Armor armor; Container container; Drug drug; Misc misc; Key key; }; Material material; // should be at 0x6C long size; long weight; long cost; long inventoryFid; BYTE soundId; }; struct Critter { struct Stats { long strength; long perception; long endurance; long charisma; long intelligence; long agility; long luck; long health; // max move points (action points) long movePoints; long armorClass; // not used by engine long unarmedDamage; long meleeDamage; long carryWeight; long sequence; long healingRate; long criticalChance; long betterCriticals; // for each DamageType long damageThreshold[7]; // for each DamageType long damageResistance[7]; long radiationResistance; long poisonResistance; long age; long gender; }; long flags; long flagsExt; long scriptId; long critterFlags; Stats base; Stats bonus; long skills[SKILL_count]; long bodyType; long experience; long killType; long damageType; long headFid; long aiPacket; long teamNum; }; struct Scenery { struct Door { long openFlags; long keyCode; }; struct Stairs { long elevationAndTile; long mapId; }; struct Elevator { long id; long level; }; long flags; long flagsExt; long scriptId; ScenerySubType type; union { Door door; Stairs stairs; Elevator elevator; }; Material material; char gap_30[4]; BYTE soundId; }; struct Wall { long flags; long flagsExt; long scriptId; Material material; }; struct Misc { long flags; long flagsExt; }; long pid; long messageNum; long fid; // range 0-8 in hexes long lightDistance; // range 0 - 65536 long lightIntensity; union { Tile tile; Item item; Critter critter; Scenery scenery; Wall wall; Misc misc; }; }; static_assert(offsetof(Proto, item) + offsetof(Proto::Item, material) == 0x6C, "Incorrect Proto definition."); #pragma pack(1) struct ScriptListInfoItem { char fileName[16]; long numLocalVars; }; //for holding window info #pragma pack(1) struct Window { long ref; long flags; RECT wRect; long width; long height; long clearColour; long unknown2; long unknown3; BYTE *surface; // bytes frame data ref to palette long buttonListP; long unknown5;//buttonptr? long unknown6; long unknown7; long drawFuncP; }; #pragma pack(1) struct LSData { char signature[24]; short majorVer; short minorVer; char charR; char playerName[32]; char comment[30]; char unused1; short realMonth; short realDay; short realYear; short unused2; long realTime; short gameMonth; short gameDay; short gameYear; short unused3; long gameTime; short mapElev; short mapNumber; char mapName[16]; }; #pragma pack(1) struct AIcap { long name; long packet_num; long max_dist; long min_to_hit; long min_hp; long aggression; long hurt_too_much; long secondary_freq; long called_freq; long font; long color; long outline_color; long chance; long combat_message_data[24]; long area_attack_mode; long run_away_mode; long best_weapon; long distance; long attack_who; long chem_use; long chem_primary_desire; long chem_primary_desire1; long chem_primary_desire2; long disposition; long body_type; long general_type; }; #pragma pack(1) struct Queue { DWORD time; long type; GameObject* object; long data; Queue* next; }; struct QueueDrug { DWORD pid; fo::Stat stat0; fo::Stat stat1; fo::Stat stat2; long amount0; long amount1; long amount2; }; struct QueueAddict { long init; // 1 = perk is not active yet DWORD drugPid; fo::Perk perkId; // effect of addiction }; #pragma pack(1) struct DrugInfoList { DWORD itemPid; long addictGvar; long numEffects; }; }