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;
};
}