module DFHack
class AbstractBuildingFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Unk0 ; NUME[:Unk0] = 0
    ENUM[1] = :Unk1 ; NUME[:Unk1] = 1
    ENUM[2] = :Unk2 ; NUME[:Unk2] = 2
    ENUM[3] = :Unk3 ; NUME[:Unk3] = 3
    ENUM[4] = :AllowVisitors ; NUME[:AllowVisitors] = 4
    ENUM[5] = :AllowResidents ; NUME[:AllowResidents] = 5
    ENUM[6] = :OnlyMembers ; NUME[:OnlyMembers] = 6
    ENUM[7] = :Unk7 ; NUME[:Unk7] = 7
end

class AbstractBuildingType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MEAD_HALL ; NUME[:MEAD_HALL] = 0
    ENUM[1] = :KEEP ; NUME[:KEEP] = 1
    ENUM[2] = :TEMPLE ; NUME[:TEMPLE] = 2
    ENUM[3] = :DARK_TOWER ; NUME[:DARK_TOWER] = 3
    ENUM[4] = :MARKET ; NUME[:MARKET] = 4
    ENUM[5] = :TOMB ; NUME[:TOMB] = 5
    ENUM[6] = :DUNGEON ; NUME[:DUNGEON] = 6
    ENUM[7] = :UNDERWORLD_SPIRE ; NUME[:UNDERWORLD_SPIRE] = 7
    ENUM[8] = :INN_TAVERN ; NUME[:INN_TAVERN] = 8
    ENUM[9] = :LIBRARY ; NUME[:LIBRARY] = 9
    ENUM[10] = :COUNTING_HOUSE ; NUME[:COUNTING_HOUSE] = 10
    ENUM[11] = :GUILDHALL ; NUME[:GUILDHALL] = 11
    ENUM[12] = :TOWER ; NUME[:TOWER] = 12
end

class ActivityEntryType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TrainingSession ; NUME[:TrainingSession] = 0
    ENUM[1] = :IndividualSkillDrill ; NUME[:IndividualSkillDrill] = 1
    ENUM[2] = :Conflict ; NUME[:Conflict] = 2
    ENUM[5] = :Conversation ; NUME[:Conversation] = 5
    ENUM[7] = :Prayer ; NUME[:Prayer] = 7
    ENUM[8] = :Socialize ; NUME[:Socialize] = 8
    ENUM[9] = :Research ; NUME[:Research] = 9
    ENUM[10] = :FillServiceOrder ; NUME[:FillServiceOrder] = 10
    ENUM[11] = :Read ; NUME[:Read] = 11
    ENUM[12] = :Play ; NUME[:Play] = 12
end

class ActivityEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TrainingSession ; NUME[:TrainingSession] = 0
    ENUM[1] = :CombatTraining ; NUME[:CombatTraining] = 1
    ENUM[2] = :SkillDemonstration ; NUME[:SkillDemonstration] = 2
    ENUM[3] = :IndividualSkillDrill ; NUME[:IndividualSkillDrill] = 3
    ENUM[4] = :Sparring ; NUME[:Sparring] = 4
    ENUM[5] = :RangedPractice ; NUME[:RangedPractice] = 5
    ENUM[6] = :Harassment ; NUME[:Harassment] = 6
    ENUM[7] = :Conversation ; NUME[:Conversation] = 7
    ENUM[8] = :Conflict ; NUME[:Conflict] = 8
    ENUM[9] = :Guard ; NUME[:Guard] = 9
    ENUM[10] = :Reunion ; NUME[:Reunion] = 10
    ENUM[11] = :Prayer ; NUME[:Prayer] = 11
    ENUM[12] = :Socialize ; NUME[:Socialize] = 12
    ENUM[13] = :Worship ; NUME[:Worship] = 13
    ENUM[14] = :Performance ; NUME[:Performance] = 14
    ENUM[15] = :Research ; NUME[:Research] = 15
    ENUM[16] = :PonderTopic ; NUME[:PonderTopic] = 16
    ENUM[17] = :DiscussTopic ; NUME[:DiscussTopic] = 17
    ENUM[18] = :Read ; NUME[:Read] = 18
    ENUM[19] = :FillServiceOrder ; NUME[:FillServiceOrder] = 19
    ENUM[20] = :Write ; NUME[:Write] = 20
    ENUM[21] = :CopyWrittenContent ; NUME[:CopyWrittenContent] = 21
    ENUM[22] = :TeachTopic ; NUME[:TeachTopic] = 22
    ENUM[23] = :Play ; NUME[:Play] = 23
    ENUM[24] = :MakeBelieve ; NUME[:MakeBelieve] = 24
    ENUM[25] = :PlayWithToy ; NUME[:PlayWithToy] = 25
    ENUM[26] = :Encounter ; NUME[:Encounter] = 26
    ENUM[27] = :StoreObject ; NUME[:StoreObject] = 27
end

class AdventurerAttributeLevel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :VeryLow ; NUME[:VeryLow] = 0
    ENUM[1] = :Low ; NUME[:Low] = 1
    ENUM[2] = :BelowAverage ; NUME[:BelowAverage] = 2
    ENUM[3] = :Average ; NUME[:Average] = 3
    ENUM[4] = :AboveAverage ; NUME[:AboveAverage] = 4
    ENUM[5] = :High ; NUME[:High] = 5
    ENUM[6] = :Superior ; NUME[:Superior] = 6
end

class AgreementDetailsType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :JoinParty ; NUME[:JoinParty] = 0
    ENUM[1] = :DemonicBinding ; NUME[:DemonicBinding] = 1
    ENUM[2] = :Residency ; NUME[:Residency] = 2
    ENUM[3] = :Citizenship ; NUME[:Citizenship] = 3
    ENUM[4] = :Parley ; NUME[:Parley] = 4
    ENUM[5] = :PositionCorruption ; NUME[:PositionCorruption] = 5
    ENUM[6] = :PlotStealArtifact ; NUME[:PlotStealArtifact] = 6
    ENUM[7] = :PromisePosition ; NUME[:PromisePosition] = 7
    ENUM[8] = :PlotAssassination ; NUME[:PlotAssassination] = 8
    ENUM[9] = :PlotAbduct ; NUME[:PlotAbduct] = 9
    ENUM[10] = :PlotSabotage ; NUME[:PlotSabotage] = 10
    ENUM[11] = :PlotConviction ; NUME[:PlotConviction] = 11
    ENUM[12] = :Location ; NUME[:Location] = 12
    ENUM[13] = :PlotInfiltrationCoup ; NUME[:PlotInfiltrationCoup] = 13
    ENUM[14] = :PlotFrameTreason ; NUME[:PlotFrameTreason] = 14
    ENUM[15] = :PlotInduceWar ; NUME[:PlotInduceWar] = 15
end

class AmmoFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HAS_EDGE_ATTACK ; NUME[:HAS_EDGE_ATTACK] = 0
end

class AnimalTrainingLevel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SemiWild ; NUME[:SemiWild] = 0
    ENUM[1] = :Trained ; NUME[:Trained] = 1
    ENUM[2] = :WellTrained ; NUME[:WellTrained] = 2
    ENUM[3] = :SkilfullyTrained ; NUME[:SkilfullyTrained] = 3
    ENUM[4] = :ExpertlyTrained ; NUME[:ExpertlyTrained] = 4
    ENUM[5] = :ExceptionallyTrained ; NUME[:ExceptionallyTrained] = 5
    ENUM[6] = :MasterfullyTrained ; NUME[:MasterfullyTrained] = 6
    ENUM[7] = :Domesticated ; NUME[:Domesticated] = 7
    ENUM[8] = :Unk8 ; NUME[:Unk8] = 8
    ENUM[9] = :WildUntamed ; NUME[:WildUntamed] = 9
end

class AnnouncementType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :REACHED_PEAK ; NUME[:REACHED_PEAK] = 0
    ENUM[1] = :ERA_CHANGE ; NUME[:ERA_CHANGE] = 1
    ENUM[2] = :FEATURE_DISCOVERY ; NUME[:FEATURE_DISCOVERY] = 2
    ENUM[3] = :STRUCK_DEEP_METAL ; NUME[:STRUCK_DEEP_METAL] = 3
    ENUM[4] = :STRUCK_MINERAL ; NUME[:STRUCK_MINERAL] = 4
    ENUM[5] = :STRUCK_ECONOMIC_MINERAL ; NUME[:STRUCK_ECONOMIC_MINERAL] = 5
    ENUM[6] = :COMBAT_TWIST_WEAPON ; NUME[:COMBAT_TWIST_WEAPON] = 6
    ENUM[7] = :COMBAT_LET_ITEM_DROP ; NUME[:COMBAT_LET_ITEM_DROP] = 7
    ENUM[8] = :COMBAT_START_CHARGE ; NUME[:COMBAT_START_CHARGE] = 8
    ENUM[9] = :COMBAT_SURPRISE_CHARGE ; NUME[:COMBAT_SURPRISE_CHARGE] = 9
    ENUM[10] = :COMBAT_JUMP_DODGE_PROJ ; NUME[:COMBAT_JUMP_DODGE_PROJ] = 10
    ENUM[11] = :COMBAT_JUMP_DODGE_STRIKE ; NUME[:COMBAT_JUMP_DODGE_STRIKE] = 11
    ENUM[12] = :COMBAT_DODGE ; NUME[:COMBAT_DODGE] = 12
    ENUM[13] = :COMBAT_COUNTERSTRIKE ; NUME[:COMBAT_COUNTERSTRIKE] = 13
    ENUM[14] = :COMBAT_BLOCK ; NUME[:COMBAT_BLOCK] = 14
    ENUM[15] = :COMBAT_PARRY ; NUME[:COMBAT_PARRY] = 15
    ENUM[16] = :COMBAT_CHARGE_COLLISION ; NUME[:COMBAT_CHARGE_COLLISION] = 16
    ENUM[17] = :COMBAT_CHARGE_DEFENDER_TUMBLES ; NUME[:COMBAT_CHARGE_DEFENDER_TUMBLES] = 17
    ENUM[18] = :COMBAT_CHARGE_DEFENDER_KNOCKED_OVER ; NUME[:COMBAT_CHARGE_DEFENDER_KNOCKED_OVER] = 18
    ENUM[19] = :COMBAT_CHARGE_ATTACKER_TUMBLES ; NUME[:COMBAT_CHARGE_ATTACKER_TUMBLES] = 19
    ENUM[20] = :COMBAT_CHARGE_ATTACKER_BOUNCE_BACK ; NUME[:COMBAT_CHARGE_ATTACKER_BOUNCE_BACK] = 20
    ENUM[21] = :COMBAT_CHARGE_TANGLE_TOGETHER ; NUME[:COMBAT_CHARGE_TANGLE_TOGETHER] = 21
    ENUM[22] = :COMBAT_CHARGE_TANGLE_TUMBLE ; NUME[:COMBAT_CHARGE_TANGLE_TUMBLE] = 22
    ENUM[23] = :COMBAT_CHARGE_RUSH_BY ; NUME[:COMBAT_CHARGE_RUSH_BY] = 23
    ENUM[24] = :COMBAT_CHARGE_MANAGE_STOP ; NUME[:COMBAT_CHARGE_MANAGE_STOP] = 24
    ENUM[25] = :COMBAT_CHARGE_OBSTACLE_SLAM ; NUME[:COMBAT_CHARGE_OBSTACLE_SLAM] = 25
    ENUM[26] = :COMBAT_WRESTLE_LOCK ; NUME[:COMBAT_WRESTLE_LOCK] = 26
    ENUM[27] = :COMBAT_WRESTLE_CHOKEHOLD ; NUME[:COMBAT_WRESTLE_CHOKEHOLD] = 27
    ENUM[28] = :COMBAT_WRESTLE_TAKEDOWN ; NUME[:COMBAT_WRESTLE_TAKEDOWN] = 28
    ENUM[29] = :COMBAT_WRESTLE_THROW ; NUME[:COMBAT_WRESTLE_THROW] = 29
    ENUM[30] = :COMBAT_WRESTLE_RELEASE_LOCK ; NUME[:COMBAT_WRESTLE_RELEASE_LOCK] = 30
    ENUM[31] = :COMBAT_WRESTLE_RELEASE_CHOKE ; NUME[:COMBAT_WRESTLE_RELEASE_CHOKE] = 31
    ENUM[32] = :COMBAT_WRESTLE_RELEASE_GRIP ; NUME[:COMBAT_WRESTLE_RELEASE_GRIP] = 32
    ENUM[33] = :COMBAT_WRESTLE_STRUGGLE ; NUME[:COMBAT_WRESTLE_STRUGGLE] = 33
    ENUM[34] = :COMBAT_WRESTLE_RELEASE_LATCH ; NUME[:COMBAT_WRESTLE_RELEASE_LATCH] = 34
    ENUM[35] = :COMBAT_WRESTLE_STRANGLE_KO ; NUME[:COMBAT_WRESTLE_STRANGLE_KO] = 35
    ENUM[36] = :COMBAT_WRESTLE_ADJUST_GRIP ; NUME[:COMBAT_WRESTLE_ADJUST_GRIP] = 36
    ENUM[37] = :COMBAT_GRAB_TEAR ; NUME[:COMBAT_GRAB_TEAR] = 37
    ENUM[38] = :COMBAT_STRIKE_DETAILS ; NUME[:COMBAT_STRIKE_DETAILS] = 38
    ENUM[39] = :COMBAT_STRIKE_DETAILS_2 ; NUME[:COMBAT_STRIKE_DETAILS_2] = 39
    ENUM[40] = :COMBAT_EVENT_ENRAGED ; NUME[:COMBAT_EVENT_ENRAGED] = 40
    ENUM[41] = :COMBAT_EVENT_STUCKIN ; NUME[:COMBAT_EVENT_STUCKIN] = 41
    ENUM[42] = :COMBAT_EVENT_LATCH_BP ; NUME[:COMBAT_EVENT_LATCH_BP] = 42
    ENUM[43] = :COMBAT_EVENT_LATCH_GENERAL ; NUME[:COMBAT_EVENT_LATCH_GENERAL] = 43
    ENUM[44] = :COMBAT_EVENT_PROPELLED_AWAY ; NUME[:COMBAT_EVENT_PROPELLED_AWAY] = 44
    ENUM[45] = :COMBAT_EVENT_KNOCKED_OUT ; NUME[:COMBAT_EVENT_KNOCKED_OUT] = 45
    ENUM[46] = :COMBAT_EVENT_STUNNED ; NUME[:COMBAT_EVENT_STUNNED] = 46
    ENUM[47] = :COMBAT_EVENT_WINDED ; NUME[:COMBAT_EVENT_WINDED] = 47
    ENUM[48] = :COMBAT_EVENT_NAUSEATED ; NUME[:COMBAT_EVENT_NAUSEATED] = 48
    ENUM[49] = :MIGRANT_ARRIVAL_NAMED ; NUME[:MIGRANT_ARRIVAL_NAMED] = 49
    ENUM[50] = :MIGRANT_ARRIVAL ; NUME[:MIGRANT_ARRIVAL] = 50
    ENUM[51] = :DIG_CANCEL_WARM ; NUME[:DIG_CANCEL_WARM] = 51
    ENUM[52] = :DIG_CANCEL_DAMP ; NUME[:DIG_CANCEL_DAMP] = 52
    ENUM[53] = :AMBUSH_DEFENDER ; NUME[:AMBUSH_DEFENDER] = 53
    ENUM[54] = :AMBUSH_RESIDENT ; NUME[:AMBUSH_RESIDENT] = 54
    ENUM[55] = :AMBUSH_THIEF ; NUME[:AMBUSH_THIEF] = 55
    ENUM[56] = :AMBUSH_THIEF_SUPPORT_SKULKING ; NUME[:AMBUSH_THIEF_SUPPORT_SKULKING] = 56
    ENUM[57] = :AMBUSH_THIEF_SUPPORT_NATURE ; NUME[:AMBUSH_THIEF_SUPPORT_NATURE] = 57
    ENUM[58] = :AMBUSH_THIEF_SUPPORT ; NUME[:AMBUSH_THIEF_SUPPORT] = 58
    ENUM[59] = :AMBUSH_MISCHIEVOUS ; NUME[:AMBUSH_MISCHIEVOUS] = 59
    ENUM[60] = :AMBUSH_SNATCHER ; NUME[:AMBUSH_SNATCHER] = 60
    ENUM[61] = :AMBUSH_SNATCHER_SUPPORT ; NUME[:AMBUSH_SNATCHER_SUPPORT] = 61
    ENUM[62] = :AMBUSH_AMBUSHER_NATURE ; NUME[:AMBUSH_AMBUSHER_NATURE] = 62
    ENUM[63] = :AMBUSH_AMBUSHER ; NUME[:AMBUSH_AMBUSHER] = 63
    ENUM[64] = :AMBUSH_INJURED ; NUME[:AMBUSH_INJURED] = 64
    ENUM[65] = :AMBUSH_OTHER ; NUME[:AMBUSH_OTHER] = 65
    ENUM[66] = :AMBUSH_INCAPACITATED ; NUME[:AMBUSH_INCAPACITATED] = 66
    ENUM[67] = :CARAVAN_ARRIVAL ; NUME[:CARAVAN_ARRIVAL] = 67
    ENUM[68] = :NOBLE_ARRIVAL ; NUME[:NOBLE_ARRIVAL] = 68
    ENUM[69] = :D_MIGRANTS_ARRIVAL ; NUME[:D_MIGRANTS_ARRIVAL] = 69
    ENUM[70] = :D_MIGRANT_ARRIVAL ; NUME[:D_MIGRANT_ARRIVAL] = 70
    ENUM[71] = :D_MIGRANT_ARRIVAL_DISCOURAGED ; NUME[:D_MIGRANT_ARRIVAL_DISCOURAGED] = 71
    ENUM[72] = :D_NO_MIGRANT_ARRIVAL ; NUME[:D_NO_MIGRANT_ARRIVAL] = 72
    ENUM[73] = :ANIMAL_TRAP_CATCH ; NUME[:ANIMAL_TRAP_CATCH] = 73
    ENUM[74] = :ANIMAL_TRAP_ROBBED ; NUME[:ANIMAL_TRAP_ROBBED] = 74
    ENUM[75] = :MISCHIEF_LEVER ; NUME[:MISCHIEF_LEVER] = 75
    ENUM[76] = :MISCHIEF_PLATE ; NUME[:MISCHIEF_PLATE] = 76
    ENUM[77] = :MISCHIEF_CAGE ; NUME[:MISCHIEF_CAGE] = 77
    ENUM[78] = :MISCHIEF_CHAIN ; NUME[:MISCHIEF_CHAIN] = 78
    ENUM[79] = :DIPLOMAT_ARRIVAL ; NUME[:DIPLOMAT_ARRIVAL] = 79
    ENUM[80] = :LIAISON_ARRIVAL ; NUME[:LIAISON_ARRIVAL] = 80
    ENUM[81] = :TRADE_DIPLOMAT_ARRIVAL ; NUME[:TRADE_DIPLOMAT_ARRIVAL] = 81
    ENUM[82] = :CAVE_COLLAPSE ; NUME[:CAVE_COLLAPSE] = 82
    ENUM[83] = :BIRTH_CITIZEN ; NUME[:BIRTH_CITIZEN] = 83
    ENUM[84] = :BIRTH_ANIMAL ; NUME[:BIRTH_ANIMAL] = 84
    ENUM[85] = :STRANGE_MOOD ; NUME[:STRANGE_MOOD] = 85
    ENUM[86] = :MADE_ARTIFACT ; NUME[:MADE_ARTIFACT] = 86
    ENUM[87] = :NAMED_ARTIFACT ; NUME[:NAMED_ARTIFACT] = 87
    ENUM[88] = :ITEM_ATTACHMENT ; NUME[:ITEM_ATTACHMENT] = 88
    ENUM[89] = :VERMIN_CAGE_ESCAPE ; NUME[:VERMIN_CAGE_ESCAPE] = 89
    ENUM[90] = :TRIGGER_WEB ; NUME[:TRIGGER_WEB] = 90
    ENUM[91] = :MOOD_BUILDING_CLAIMED ; NUME[:MOOD_BUILDING_CLAIMED] = 91
    ENUM[92] = :ARTIFACT_BEGUN ; NUME[:ARTIFACT_BEGUN] = 92
    ENUM[93] = :MEGABEAST_ARRIVAL ; NUME[:MEGABEAST_ARRIVAL] = 93
    ENUM[94] = :BERSERK_CITIZEN ; NUME[:BERSERK_CITIZEN] = 94
    ENUM[95] = :MAGMA_DEFACES_ENGRAVING ; NUME[:MAGMA_DEFACES_ENGRAVING] = 95
    ENUM[96] = :ENGRAVING_MELTS ; NUME[:ENGRAVING_MELTS] = 96
    ENUM[97] = :MASTERPIECE_ARCHITECTURE ; NUME[:MASTERPIECE_ARCHITECTURE] = 97
    ENUM[98] = :MASTERPIECE_CONSTRUCTION ; NUME[:MASTERPIECE_CONSTRUCTION] = 98
    ENUM[99] = :MASTER_ARCHITECTURE_LOST ; NUME[:MASTER_ARCHITECTURE_LOST] = 99
    ENUM[100] = :MASTER_CONSTRUCTION_LOST ; NUME[:MASTER_CONSTRUCTION_LOST] = 100
    ENUM[101] = :ADV_AWAKEN ; NUME[:ADV_AWAKEN] = 101
    ENUM[102] = :ADV_SLEEP_INTERRUPTED ; NUME[:ADV_SLEEP_INTERRUPTED] = 102
    ENUM[103] = :CANCEL_JOB ; NUME[:CANCEL_JOB] = 103
    ENUM[104] = :ADV_CREATURE_DEATH ; NUME[:ADV_CREATURE_DEATH] = 104
    ENUM[105] = :CITIZEN_DEATH ; NUME[:CITIZEN_DEATH] = 105
    ENUM[106] = :PET_DEATH ; NUME[:PET_DEATH] = 106
    ENUM[107] = :ENDGAME_EVENT_1 ; NUME[:ENDGAME_EVENT_1] = 107
    ENUM[108] = :ENDGAME_EVENT_2 ; NUME[:ENDGAME_EVENT_2] = 108
    ENUM[109] = :FALL_OVER ; NUME[:FALL_OVER] = 109
    ENUM[110] = :CAUGHT_IN_FLAMES ; NUME[:CAUGHT_IN_FLAMES] = 110
    ENUM[111] = :CAUGHT_IN_WEB ; NUME[:CAUGHT_IN_WEB] = 111
    ENUM[112] = :UNIT_PROJECTILE_SLAM_BLOW_APART ; NUME[:UNIT_PROJECTILE_SLAM_BLOW_APART] = 112
    ENUM[113] = :UNIT_PROJECTILE_SLAM ; NUME[:UNIT_PROJECTILE_SLAM] = 113
    ENUM[114] = :UNIT_PROJECTILE_SLAM_INTO_UNIT ; NUME[:UNIT_PROJECTILE_SLAM_INTO_UNIT] = 114
    ENUM[115] = :VOMIT ; NUME[:VOMIT] = 115
    ENUM[116] = :LOSE_HOLD_OF_ITEM ; NUME[:LOSE_HOLD_OF_ITEM] = 116
    ENUM[117] = :REGAIN_CONSCIOUSNESS ; NUME[:REGAIN_CONSCIOUSNESS] = 117
    ENUM[118] = :FREE_FROM_WEB ; NUME[:FREE_FROM_WEB] = 118
    ENUM[119] = :PARALYZED ; NUME[:PARALYZED] = 119
    ENUM[120] = :OVERCOME_PARALYSIS ; NUME[:OVERCOME_PARALYSIS] = 120
    ENUM[121] = :NOT_STUNNED ; NUME[:NOT_STUNNED] = 121
    ENUM[122] = :EXHAUSTION ; NUME[:EXHAUSTION] = 122
    ENUM[123] = :PAIN_KO ; NUME[:PAIN_KO] = 123
    ENUM[124] = :BREAK_GRIP ; NUME[:BREAK_GRIP] = 124
    ENUM[125] = :NO_BREAK_GRIP ; NUME[:NO_BREAK_GRIP] = 125
    ENUM[126] = :BLOCK_FIRE ; NUME[:BLOCK_FIRE] = 126
    ENUM[127] = :BREATHE_FIRE ; NUME[:BREATHE_FIRE] = 127
    ENUM[128] = :SHOOT_WEB ; NUME[:SHOOT_WEB] = 128
    ENUM[129] = :PULL_OUT_DROP ; NUME[:PULL_OUT_DROP] = 129
    ENUM[130] = :STAND_UP ; NUME[:STAND_UP] = 130
    ENUM[131] = :MARTIAL_TRANCE ; NUME[:MARTIAL_TRANCE] = 131
    ENUM[132] = :MAT_BREATH ; NUME[:MAT_BREATH] = 132
    ENUM[133] = :ADV_REACTION_PRODUCTS ; NUME[:ADV_REACTION_PRODUCTS] = 133
    ENUM[134] = :NIGHT_ATTACK_STARTS ; NUME[:NIGHT_ATTACK_STARTS] = 134
    ENUM[135] = :NIGHT_ATTACK_ENDS ; NUME[:NIGHT_ATTACK_ENDS] = 135
    ENUM[136] = :NIGHT_ATTACK_TRAVEL ; NUME[:NIGHT_ATTACK_TRAVEL] = 136
    ENUM[137] = :GHOST_ATTACK ; NUME[:GHOST_ATTACK] = 137
    ENUM[138] = :FLAME_HIT ; NUME[:FLAME_HIT] = 138
    ENUM[139] = :TRAVEL_SITE_DISCOVERY ; NUME[:TRAVEL_SITE_DISCOVERY] = 139
    ENUM[140] = :TRAVEL_SITE_BUMP ; NUME[:TRAVEL_SITE_BUMP] = 140
    ENUM[141] = :ADVENTURE_INTRO ; NUME[:ADVENTURE_INTRO] = 141
    ENUM[142] = :CREATURE_SOUND ; NUME[:CREATURE_SOUND] = 142
    ENUM[143] = :CREATURE_STEALS_OBJECT ; NUME[:CREATURE_STEALS_OBJECT] = 143
    ENUM[144] = :FOUND_TRAP ; NUME[:FOUND_TRAP] = 144
    ENUM[145] = :BODY_TRANSFORMATION ; NUME[:BODY_TRANSFORMATION] = 145
    ENUM[146] = :INTERACTION_ACTOR ; NUME[:INTERACTION_ACTOR] = 146
    ENUM[147] = :INTERACTION_TARGET ; NUME[:INTERACTION_TARGET] = 147
    ENUM[148] = :UNDEAD_ATTACK ; NUME[:UNDEAD_ATTACK] = 148
    ENUM[149] = :CITIZEN_MISSING ; NUME[:CITIZEN_MISSING] = 149
    ENUM[150] = :PET_MISSING ; NUME[:PET_MISSING] = 150
    ENUM[151] = :EMBRACE ; NUME[:EMBRACE] = 151
    ENUM[152] = :STRANGE_RAIN_SNOW ; NUME[:STRANGE_RAIN_SNOW] = 152
    ENUM[153] = :STRANGE_CLOUD ; NUME[:STRANGE_CLOUD] = 153
    ENUM[154] = :SIMPLE_ANIMAL_ACTION ; NUME[:SIMPLE_ANIMAL_ACTION] = 154
    ENUM[155] = :FLOUNDER_IN_LIQUID ; NUME[:FLOUNDER_IN_LIQUID] = 155
    ENUM[156] = :TRAINING_DOWN_TO_SEMI_WILD ; NUME[:TRAINING_DOWN_TO_SEMI_WILD] = 156
    ENUM[157] = :TRAINING_FULL_REVERSION ; NUME[:TRAINING_FULL_REVERSION] = 157
    ENUM[158] = :ANIMAL_TRAINING_KNOWLEDGE ; NUME[:ANIMAL_TRAINING_KNOWLEDGE] = 158
    ENUM[159] = :SKIP_ON_LIQUID ; NUME[:SKIP_ON_LIQUID] = 159
    ENUM[160] = :DODGE_FLYING_OBJECT ; NUME[:DODGE_FLYING_OBJECT] = 160
    ENUM[161] = :REGULAR_CONVERSATION ; NUME[:REGULAR_CONVERSATION] = 161
    ENUM[162] = :BANDIT_EMPTY_CONTAINER ; NUME[:BANDIT_EMPTY_CONTAINER] = 162
    ENUM[163] = :BANDIT_GRAB_ITEM ; NUME[:BANDIT_GRAB_ITEM] = 163
    ENUM[164] = :COMBAT_EVENT_ATTACK_INTERRUPTED ; NUME[:COMBAT_EVENT_ATTACK_INTERRUPTED] = 164
    ENUM[165] = :COMBAT_WRESTLE_CATCH_ATTACK ; NUME[:COMBAT_WRESTLE_CATCH_ATTACK] = 165
    ENUM[166] = :FAIL_TO_GRAB_SURFACE ; NUME[:FAIL_TO_GRAB_SURFACE] = 166
    ENUM[167] = :LOSE_HOLD_OF_SURFACE ; NUME[:LOSE_HOLD_OF_SURFACE] = 167
    ENUM[168] = :TRAVEL_COMPLAINT ; NUME[:TRAVEL_COMPLAINT] = 168
    ENUM[169] = :LOSE_EMOTION ; NUME[:LOSE_EMOTION] = 169
    ENUM[170] = :REORGANIZE_POSSESSIONS ; NUME[:REORGANIZE_POSSESSIONS] = 170
    ENUM[171] = :PUSH_ITEM ; NUME[:PUSH_ITEM] = 171
    ENUM[172] = :DRAW_ITEM ; NUME[:DRAW_ITEM] = 172
    ENUM[173] = :STRAP_ITEM ; NUME[:STRAP_ITEM] = 173
    ENUM[174] = :GAIN_SITE_CONTROL ; NUME[:GAIN_SITE_CONTROL] = 174
    ENUM[175] = :CONFLICT_CONVERSATION ; NUME[:CONFLICT_CONVERSATION] = 175
    ENUM[176] = :FORT_POSITION_SUCCESSION ; NUME[:FORT_POSITION_SUCCESSION] = 176
    ENUM[177] = :MECHANISM_SOUND ; NUME[:MECHANISM_SOUND] = 177
    ENUM[178] = :BIRTH_WILD_ANIMAL ; NUME[:BIRTH_WILD_ANIMAL] = 178
    ENUM[179] = :STRESSED_CITIZEN ; NUME[:STRESSED_CITIZEN] = 179
    ENUM[180] = :CITIZEN_LOST_TO_STRESS ; NUME[:CITIZEN_LOST_TO_STRESS] = 180
    ENUM[181] = :CITIZEN_TANTRUM ; NUME[:CITIZEN_TANTRUM] = 181
    ENUM[182] = :MOVED_OUT_OF_RANGE ; NUME[:MOVED_OUT_OF_RANGE] = 182
    ENUM[183] = :CANNOT_JUMP ; NUME[:CANNOT_JUMP] = 183
    ENUM[184] = :NO_TRACKS ; NUME[:NO_TRACKS] = 184
    ENUM[185] = :ALREADY_SEARCHED_AREA ; NUME[:ALREADY_SEARCHED_AREA] = 185
    ENUM[186] = :SEARCH_FOUND_SOMETHING ; NUME[:SEARCH_FOUND_SOMETHING] = 186
    ENUM[187] = :SEARCH_FOUND_NOTHING ; NUME[:SEARCH_FOUND_NOTHING] = 187
    ENUM[188] = :NOTHING_TO_INTERACT ; NUME[:NOTHING_TO_INTERACT] = 188
    ENUM[189] = :NOTHING_TO_EXAMINE ; NUME[:NOTHING_TO_EXAMINE] = 189
    ENUM[190] = :YOU_YIELDED ; NUME[:YOU_YIELDED] = 190
    ENUM[191] = :YOU_UNYIELDED ; NUME[:YOU_UNYIELDED] = 191
    ENUM[192] = :YOU_STRAP_ITEM ; NUME[:YOU_STRAP_ITEM] = 192
    ENUM[193] = :YOU_DRAW_ITEM ; NUME[:YOU_DRAW_ITEM] = 193
    ENUM[194] = :NO_GRASP_TO_DRAW_ITEM ; NUME[:NO_GRASP_TO_DRAW_ITEM] = 194
    ENUM[195] = :NO_ITEM_TO_STRAP ; NUME[:NO_ITEM_TO_STRAP] = 195
    ENUM[196] = :NO_INV_TO_REMOVE ; NUME[:NO_INV_TO_REMOVE] = 196
    ENUM[197] = :NO_INV_TO_WEAR ; NUME[:NO_INV_TO_WEAR] = 197
    ENUM[198] = :NO_INV_TO_EAT ; NUME[:NO_INV_TO_EAT] = 198
    ENUM[199] = :NO_INV_TO_CONTAIN ; NUME[:NO_INV_TO_CONTAIN] = 199
    ENUM[200] = :NO_INV_TO_DROP ; NUME[:NO_INV_TO_DROP] = 200
    ENUM[201] = :NOTHING_TO_PICK_UP ; NUME[:NOTHING_TO_PICK_UP] = 201
    ENUM[202] = :NO_INV_TO_THROW ; NUME[:NO_INV_TO_THROW] = 202
    ENUM[203] = :NO_INV_TO_FIRE ; NUME[:NO_INV_TO_FIRE] = 203
    ENUM[204] = :CURRENT_SMELL ; NUME[:CURRENT_SMELL] = 204
    ENUM[205] = :CURRENT_WEATHER ; NUME[:CURRENT_WEATHER] = 205
    ENUM[206] = :CURRENT_TEMPERATURE ; NUME[:CURRENT_TEMPERATURE] = 206
    ENUM[207] = :CURRENT_DATE ; NUME[:CURRENT_DATE] = 207
    ENUM[208] = :NO_GRASP_FOR_PICKUP ; NUME[:NO_GRASP_FOR_PICKUP] = 208
    ENUM[209] = :CANNOT_CHOP_TREE ; NUME[:CANNOT_CHOP_TREE] = 209
    ENUM[210] = :CANNOT_CLIMB ; NUME[:CANNOT_CLIMB] = 210
    ENUM[211] = :CANNOT_STAND ; NUME[:CANNOT_STAND] = 211
    ENUM[212] = :MUST_UNRETRACT_FIRST ; NUME[:MUST_UNRETRACT_FIRST] = 212
    ENUM[213] = :CANNOT_REST ; NUME[:CANNOT_REST] = 213
    ENUM[214] = :CANNOT_MAKE_CAMPFIRE ; NUME[:CANNOT_MAKE_CAMPFIRE] = 214
    ENUM[215] = :MADE_CAMPFIRE ; NUME[:MADE_CAMPFIRE] = 215
    ENUM[216] = :CANNOT_SET_FIRE ; NUME[:CANNOT_SET_FIRE] = 216
    ENUM[217] = :SET_FIRE ; NUME[:SET_FIRE] = 217
    ENUM[218] = :DAWN_BREAKS ; NUME[:DAWN_BREAKS] = 218
    ENUM[219] = :NOON ; NUME[:NOON] = 219
    ENUM[220] = :NIGHTFALL ; NUME[:NIGHTFALL] = 220
    ENUM[221] = :NO_INV_INTERACTION ; NUME[:NO_INV_INTERACTION] = 221
    ENUM[222] = :EMPTY_CONTAINER ; NUME[:EMPTY_CONTAINER] = 222
    ENUM[223] = :TAKE_OUT_OF_CONTAINER ; NUME[:TAKE_OUT_OF_CONTAINER] = 223
    ENUM[224] = :NO_CONTAINER_FOR_ITEM ; NUME[:NO_CONTAINER_FOR_ITEM] = 224
    ENUM[225] = :PUT_INTO_CONTAINER ; NUME[:PUT_INTO_CONTAINER] = 225
    ENUM[226] = :EAT_ITEM ; NUME[:EAT_ITEM] = 226
    ENUM[227] = :DRINK_ITEM ; NUME[:DRINK_ITEM] = 227
    ENUM[228] = :CONSUME_FAILURE ; NUME[:CONSUME_FAILURE] = 228
    ENUM[229] = :DROP_ITEM ; NUME[:DROP_ITEM] = 229
    ENUM[230] = :PICK_UP_ITEM ; NUME[:PICK_UP_ITEM] = 230
    ENUM[231] = :YOU_BUILDING_INTERACTION ; NUME[:YOU_BUILDING_INTERACTION] = 231
    ENUM[232] = :YOU_ITEM_INTERACTION ; NUME[:YOU_ITEM_INTERACTION] = 232
    ENUM[233] = :YOU_TEMPERATURE_EFFECTS ; NUME[:YOU_TEMPERATURE_EFFECTS] = 233
    ENUM[234] = :PROFESSION_CHANGES ; NUME[:PROFESSION_CHANGES] = 234
    ENUM[235] = :RECRUIT_PROMOTED ; NUME[:RECRUIT_PROMOTED] = 235
    ENUM[236] = :SOLDIER_BECOMES_MASTER ; NUME[:SOLDIER_BECOMES_MASTER] = 236
    ENUM[237] = :RESOLVE_SHARED_ITEMS ; NUME[:RESOLVE_SHARED_ITEMS] = 237
    ENUM[238] = :COUGH_BLOOD ; NUME[:COUGH_BLOOD] = 238
    ENUM[239] = :VOMIT_BLOOD ; NUME[:VOMIT_BLOOD] = 239
    ENUM[240] = :MERCHANTS_UNLOADING ; NUME[:MERCHANTS_UNLOADING] = 240
    ENUM[241] = :MERCHANTS_NEED_DEPOT ; NUME[:MERCHANTS_NEED_DEPOT] = 241
    ENUM[242] = :MERCHANT_WAGONS_BYPASSED ; NUME[:MERCHANT_WAGONS_BYPASSED] = 242
    ENUM[243] = :MERCHANTS_LEAVING_SOON ; NUME[:MERCHANTS_LEAVING_SOON] = 243
    ENUM[244] = :MERCHANTS_EMBARKED ; NUME[:MERCHANTS_EMBARKED] = 244
    ENUM[245] = :PET_LOSES_DEAD_OWNER ; NUME[:PET_LOSES_DEAD_OWNER] = 245
    ENUM[246] = :PET_ADOPTS_OWNER ; NUME[:PET_ADOPTS_OWNER] = 246
    ENUM[247] = :VERMIN_BITE ; NUME[:VERMIN_BITE] = 247
    ENUM[248] = :UNABLE_TO_COMPLETE_BUILDING ; NUME[:UNABLE_TO_COMPLETE_BUILDING] = 248
    ENUM[249] = :JOBS_REMOVED_FROM_UNPOWERED_BUILDING ; NUME[:JOBS_REMOVED_FROM_UNPOWERED_BUILDING] = 249
    ENUM[250] = :CITIZEN_SNATCHED ; NUME[:CITIZEN_SNATCHED] = 250
    ENUM[251] = :VERMIN_DISTURBED ; NUME[:VERMIN_DISTURBED] = 251
    ENUM[252] = :LAND_GAINS_STATUS ; NUME[:LAND_GAINS_STATUS] = 252
    ENUM[253] = :LAND_ELEVATED_STATUS ; NUME[:LAND_ELEVATED_STATUS] = 253
    ENUM[254] = :MASTERPIECE_CRAFTED ; NUME[:MASTERPIECE_CRAFTED] = 254
    ENUM[255] = :ARTWORK_DEFACED ; NUME[:ARTWORK_DEFACED] = 255
    ENUM[256] = :POWER_LEARNED ; NUME[:POWER_LEARNED] = 256
    ENUM[257] = :YOU_FEED_ON_SUCKEE ; NUME[:YOU_FEED_ON_SUCKEE] = 257
    ENUM[258] = :ANIMAL_TRAINED ; NUME[:ANIMAL_TRAINED] = 258
    ENUM[259] = :DYED_MASTERPIECE ; NUME[:DYED_MASTERPIECE] = 259
    ENUM[260] = :COOKED_MASTERPIECE ; NUME[:COOKED_MASTERPIECE] = 260
    ENUM[261] = :MANDATE_ENDS ; NUME[:MANDATE_ENDS] = 261
    ENUM[262] = :SLOWDOWN_ENDS ; NUME[:SLOWDOWN_ENDS] = 262
    ENUM[263] = :FAREWELL_HELPER ; NUME[:FAREWELL_HELPER] = 263
    ENUM[264] = :ELECTION_RESULTS ; NUME[:ELECTION_RESULTS] = 264
    ENUM[265] = :SITE_PRESENT ; NUME[:SITE_PRESENT] = 265
    ENUM[266] = :CONSTRUCTION_SUSPENDED ; NUME[:CONSTRUCTION_SUSPENDED] = 266
    ENUM[267] = :LINKAGE_SUSPENDED ; NUME[:LINKAGE_SUSPENDED] = 267
    ENUM[268] = :QUOTA_FILLED ; NUME[:QUOTA_FILLED] = 268
    ENUM[269] = :JOB_OVERWRITTEN ; NUME[:JOB_OVERWRITTEN] = 269
    ENUM[270] = :NOTHING_TO_CATCH_IN_WATER ; NUME[:NOTHING_TO_CATCH_IN_WATER] = 270
    ENUM[271] = :DEMAND_FORGOTTEN ; NUME[:DEMAND_FORGOTTEN] = 271
    ENUM[272] = :NEW_DEMAND ; NUME[:NEW_DEMAND] = 272
    ENUM[273] = :NEW_MANDATE ; NUME[:NEW_MANDATE] = 273
    ENUM[274] = :PRICES_ALTERED ; NUME[:PRICES_ALTERED] = 274
    ENUM[275] = :NAMED_RESIDENT_CREATURE ; NUME[:NAMED_RESIDENT_CREATURE] = 275
    ENUM[276] = :SOMEBODY_GROWS_UP ; NUME[:SOMEBODY_GROWS_UP] = 276
    ENUM[277] = :GUILD_REQUEST_TAKEN ; NUME[:GUILD_REQUEST_TAKEN] = 277
    ENUM[278] = :GUILD_WAGES_CHANGED ; NUME[:GUILD_WAGES_CHANGED] = 278
    ENUM[279] = :NEW_WORK_MANDATE ; NUME[:NEW_WORK_MANDATE] = 279
    ENUM[280] = :CITIZEN_BECOMES_SOLDIER ; NUME[:CITIZEN_BECOMES_SOLDIER] = 280
    ENUM[281] = :CITIZEN_BECOMES_NONSOLDIER ; NUME[:CITIZEN_BECOMES_NONSOLDIER] = 281
    ENUM[282] = :PARTY_ORGANIZED ; NUME[:PARTY_ORGANIZED] = 282
    ENUM[283] = :POSSESSED_TANTRUM ; NUME[:POSSESSED_TANTRUM] = 283
    ENUM[284] = :BUILDING_TOPPLED_BY_GHOST ; NUME[:BUILDING_TOPPLED_BY_GHOST] = 284
    ENUM[285] = :MASTERFUL_IMPROVEMENT ; NUME[:MASTERFUL_IMPROVEMENT] = 285
    ENUM[286] = :MASTERPIECE_ENGRAVING ; NUME[:MASTERPIECE_ENGRAVING] = 286
    ENUM[287] = :MARRIAGE ; NUME[:MARRIAGE] = 287
    ENUM[288] = :NO_MARRIAGE_CELEBRATION ; NUME[:NO_MARRIAGE_CELEBRATION] = 288
    ENUM[289] = :CURIOUS_GUZZLER ; NUME[:CURIOUS_GUZZLER] = 289
    ENUM[290] = :WEATHER_BECOMES_CLEAR ; NUME[:WEATHER_BECOMES_CLEAR] = 290
    ENUM[291] = :WEATHER_BECOMES_SNOW ; NUME[:WEATHER_BECOMES_SNOW] = 291
    ENUM[292] = :WEATHER_BECOMES_RAIN ; NUME[:WEATHER_BECOMES_RAIN] = 292
    ENUM[293] = :SEASON_WET ; NUME[:SEASON_WET] = 293
    ENUM[294] = :SEASON_DRY ; NUME[:SEASON_DRY] = 294
    ENUM[295] = :SEASON_SPRING ; NUME[:SEASON_SPRING] = 295
    ENUM[296] = :SEASON_SUMMER ; NUME[:SEASON_SUMMER] = 296
    ENUM[297] = :SEASON_AUTUMN ; NUME[:SEASON_AUTUMN] = 297
    ENUM[298] = :SEASON_WINTER ; NUME[:SEASON_WINTER] = 298
    ENUM[299] = :GUEST_ARRIVAL ; NUME[:GUEST_ARRIVAL] = 299
    ENUM[300] = :CANNOT_SPEAK ; NUME[:CANNOT_SPEAK] = 300
    ENUM[301] = :RESEARCH_BREAKTHROUGH ; NUME[:RESEARCH_BREAKTHROUGH] = 301
    ENUM[302] = :SERVICE_ORDER_DELIVERY ; NUME[:SERVICE_ORDER_DELIVERY] = 302
    ENUM[303] = :PERFORMANCE_START_FAILURE ; NUME[:PERFORMANCE_START_FAILURE] = 303
    ENUM[304] = :BEGIN_ACTIVITY ; NUME[:BEGIN_ACTIVITY] = 304
    ENUM[305] = :MIDDLE_OF_ACTIVITY ; NUME[:MIDDLE_OF_ACTIVITY] = 305
    ENUM[306] = :ACTIVITY_SECTION_CHANGE ; NUME[:ACTIVITY_SECTION_CHANGE] = 306
    ENUM[307] = :CONCLUDE_ACTIVITY ; NUME[:CONCLUDE_ACTIVITY] = 307
    ENUM[308] = :LEARNED_WRITTEN_CONTENT ; NUME[:LEARNED_WRITTEN_CONTENT] = 308
    ENUM[309] = :LEARNED_ART_FORM ; NUME[:LEARNED_ART_FORM] = 309
    ENUM[310] = :PERFORMER_UPDATE ; NUME[:PERFORMER_UPDATE] = 310
    ENUM[311] = :BUILDING_DESTROYED_OR_TOPPLED ; NUME[:BUILDING_DESTROYED_OR_TOPPLED] = 311
    ENUM[312] = :DEITY_CURSE ; NUME[:DEITY_CURSE] = 312
    ENUM[313] = :COMPOSITION_COMPLETE ; NUME[:COMPOSITION_COMPLETE] = 313
    ENUM[314] = :COMPOSITION_FAILED ; NUME[:COMPOSITION_FAILED] = 314
    ENUM[315] = :NEW_APPRENTICESHIP ; NUME[:NEW_APPRENTICESHIP] = 315
    ENUM[316] = :PETITION_IGNORED ; NUME[:PETITION_IGNORED] = 316
    ENUM[317] = :CHOP_TREE ; NUME[:CHOP_TREE] = 317
    ENUM[318] = :CANNOT_CONSTRUCT ; NUME[:CANNOT_CONSTRUCT] = 318
    ENUM[319] = :RUMOR_SPREAD ; NUME[:RUMOR_SPREAD] = 319
    ENUM[320] = :AMBUSH_HERO ; NUME[:AMBUSH_HERO] = 320
    ENUM[321] = :SERVICE_ORDER_RUMOR_RECEIVED ; NUME[:SERVICE_ORDER_RUMOR_RECEIVED] = 321
    ENUM[322] = :RETURNING_RUMOR_RECEIVED ; NUME[:RETURNING_RUMOR_RECEIVED] = 322
    ENUM[323] = :NEW_HOLDING ; NUME[:NEW_HOLDING] = 323
    ENUM[324] = :NEW_MARKET_LINK ; NUME[:NEW_MARKET_LINK] = 324
    ENUM[325] = :EMERGENCY_TACTICAL_CONTROL ; NUME[:EMERGENCY_TACTICAL_CONTROL] = 325
    ENUM[326] = :AGREEMENT_SATISFIED ; NUME[:AGREEMENT_SATISFIED] = 326
    ENUM[327] = :AGREEMENT_WARNING ; NUME[:AGREEMENT_WARNING] = 327
    ENUM[328] = :AGREEMENT_ABANDONED ; NUME[:AGREEMENT_ABANDONED] = 328
    ENUM[329] = :NEW_GUILD ; NUME[:NEW_GUILD] = 329
    ENUM[330] = :CRIME_WITNESS_HANDOFF ; NUME[:CRIME_WITNESS_HANDOFF] = 330
    ENUM[331] = :CRIME_WITNESS_STOLEN ; NUME[:CRIME_WITNESS_STOLEN] = 331
    ENUM[332] = :CRIME_WITNESS_ITEM_MOVED ; NUME[:CRIME_WITNESS_ITEM_MOVED] = 332
    ENUM[333] = :CRIME_WITNESS_ITEM_MISSING ; NUME[:CRIME_WITNESS_ITEM_MISSING] = 333
    ENUM[334] = :MOUNT ; NUME[:MOUNT] = 334
    ENUM[335] = :CANNOT_MOUNT ; NUME[:CANNOT_MOUNT] = 335
    ENUM[336] = :FAILED_MOUNT ; NUME[:FAILED_MOUNT] = 336
    ENUM[337] = :DISMOUNT ; NUME[:DISMOUNT] = 337
    ENUM[338] = :FAILED_DISMOUNT ; NUME[:FAILED_DISMOUNT] = 338
end

class AppearanceModifierGrowthInterval < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DAILY ; NUME[:DAILY] = 0
    ENUM[1] = :WEEKLY ; NUME[:WEEKLY] = 1
    ENUM[2] = :MONTHLY ; NUME[:MONTHLY] = 2
    ENUM[3] = :YEARLY ; NUME[:YEARLY] = 3
end

class AppearanceModifierType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HEIGHT ; NUME[:HEIGHT] = 0
    ENUM[1] = :BROADNESS ; NUME[:BROADNESS] = 1
    ENUM[2] = :LENGTH ; NUME[:LENGTH] = 2
    ENUM[3] = :CLOSE_SET ; NUME[:CLOSE_SET] = 3
    ENUM[4] = :DEEP_SET ; NUME[:DEEP_SET] = 4
    ENUM[5] = :HIGH_POSITION ; NUME[:HIGH_POSITION] = 5
    ENUM[6] = :LARGE_IRIS ; NUME[:LARGE_IRIS] = 6
    ENUM[7] = :WRINKLY ; NUME[:WRINKLY] = 7
    ENUM[8] = :CURLY ; NUME[:CURLY] = 8
    ENUM[9] = :CONVEX ; NUME[:CONVEX] = 9
    ENUM[10] = :DENSE ; NUME[:DENSE] = 10
    ENUM[11] = :THICKNESS ; NUME[:THICKNESS] = 11
    ENUM[12] = :UPTURNED ; NUME[:UPTURNED] = 12
    ENUM[13] = :SPLAYED_OUT ; NUME[:SPLAYED_OUT] = 13
    ENUM[14] = :HANGING_LOBES ; NUME[:HANGING_LOBES] = 14
    ENUM[15] = :GAPS ; NUME[:GAPS] = 15
    ENUM[16] = :HIGH_CHEEKBONES ; NUME[:HIGH_CHEEKBONES] = 16
    ENUM[17] = :BROAD_CHIN ; NUME[:BROAD_CHIN] = 17
    ENUM[18] = :JUTTING_CHIN ; NUME[:JUTTING_CHIN] = 18
    ENUM[19] = :SQUARE_CHIN ; NUME[:SQUARE_CHIN] = 19
    ENUM[20] = :ROUND_VS_NARROW ; NUME[:ROUND_VS_NARROW] = 20
    ENUM[21] = :GREASY ; NUME[:GREASY] = 21
    ENUM[22] = :DEEP_VOICE ; NUME[:DEEP_VOICE] = 22
    ENUM[23] = :RASPY_VOICE ; NUME[:RASPY_VOICE] = 23
end

class ArchitecturalElement < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :PavedOutdoorArea ; NUME[:PavedOutdoorArea] = 0
    ENUM[1] = :UnevenPillars ; NUME[:UnevenPillars] = 1
    ENUM[2] = :SquareOfPillars ; NUME[:SquareOfPillars] = 2
    ENUM[3] = :PillarsOnThePerimeter ; NUME[:PillarsOnThePerimeter] = 3
    ENUM[4] = :UpperFloors ; NUME[:UpperFloors] = 4
    ENUM[5] = :LowerFloors ; NUME[:LowerFloors] = 5
    ENUM[6] = :WaterPool ; NUME[:WaterPool] = 6
    ENUM[7] = :LavaPool ; NUME[:LavaPool] = 7
    ENUM[8] = :StagnantPool ; NUME[:StagnantPool] = 8
    ENUM[9] = :OpenStructure ; NUME[:OpenStructure] = 9
    ENUM[10] = :PavedIndoorAreas ; NUME[:PavedIndoorAreas] = 10
    ENUM[11] = :DetailedSurfaces ; NUME[:DetailedSurfaces] = 11
end

class ArmorFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :METAL_ARMOR_LEVELS ; NUME[:METAL_ARMOR_LEVELS] = 0
end

class ArmorGeneralFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SOFT ; NUME[:SOFT] = 0
    ENUM[1] = :HARD ; NUME[:HARD] = 1
    ENUM[2] = :METAL ; NUME[:METAL] = 2
    ENUM[3] = :BARRED ; NUME[:BARRED] = 3
    ENUM[4] = :SCALED ; NUME[:SCALED] = 4
    ENUM[5] = :LEATHER ; NUME[:LEATHER] = 5
    ENUM[6] = :SHAPED ; NUME[:SHAPED] = 6
    ENUM[7] = :CHAIN_METAL_TEXT ; NUME[:CHAIN_METAL_TEXT] = 7
    ENUM[8] = :STRUCTURAL_ELASTICITY_WOVEN_THREAD ; NUME[:STRUCTURAL_ELASTICITY_WOVEN_THREAD] = 8
    ENUM[9] = :STRUCTURAL_ELASTICITY_CHAIN_METAL ; NUME[:STRUCTURAL_ELASTICITY_CHAIN_METAL] = 9
    ENUM[10] = :STRUCTURAL_ELASTICITY_CHAIN_ALL ; NUME[:STRUCTURAL_ELASTICITY_CHAIN_ALL] = 10
end

class ArmyFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Player ; NUME[:Player] = 0
end

class ArtFacetType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :OWN_RACE ; NUME[:OWN_RACE] = 0
    ENUM[1] = :FANCIFUL ; NUME[:FANCIFUL] = 1
    ENUM[2] = :GOOD ; NUME[:GOOD] = 2
    ENUM[3] = :EVIL ; NUME[:EVIL] = 3
end

class ArtImageElementType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CREATURE ; NUME[:CREATURE] = 0
    ENUM[1] = :PLANT ; NUME[:PLANT] = 1
    ENUM[2] = :TREE ; NUME[:TREE] = 2
    ENUM[3] = :SHAPE ; NUME[:SHAPE] = 3
    ENUM[4] = :ITEM ; NUME[:ITEM] = 4
end

class ArtImagePropertyType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TransitiveVerb ; NUME[:TransitiveVerb] = 0
    ENUM[1] = :IntransitiveVerb ; NUME[:IntransitiveVerb] = 1
end

class ArtImagePropertyVerb < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Withering ; NUME[:Withering] = 0
    ENUM[1] = :SurroundedBy ; NUME[:SurroundedBy] = 1
    ENUM[2] = :Massacring ; NUME[:Massacring] = 2
    ENUM[3] = :Fighting ; NUME[:Fighting] = 3
    ENUM[4] = :Laboring ; NUME[:Laboring] = 4
    ENUM[5] = :Greeting ; NUME[:Greeting] = 5
    ENUM[6] = :Refusing ; NUME[:Refusing] = 6
    ENUM[7] = :Speaking ; NUME[:Speaking] = 7
    ENUM[8] = :Embracing ; NUME[:Embracing] = 8
    ENUM[9] = :StrikingDown ; NUME[:StrikingDown] = 9
    ENUM[10] = :MenacingPose ; NUME[:MenacingPose] = 10
    ENUM[11] = :Traveling ; NUME[:Traveling] = 11
    ENUM[12] = :Raising ; NUME[:Raising] = 12
    ENUM[13] = :Hiding ; NUME[:Hiding] = 13
    ENUM[14] = :LookingConfused ; NUME[:LookingConfused] = 14
    ENUM[15] = :LookingTerrified ; NUME[:LookingTerrified] = 15
    ENUM[16] = :Devouring ; NUME[:Devouring] = 16
    ENUM[17] = :Admiring ; NUME[:Admiring] = 17
    ENUM[18] = :Burning ; NUME[:Burning] = 18
    ENUM[19] = :Weeping ; NUME[:Weeping] = 19
    ENUM[20] = :LookingDejected ; NUME[:LookingDejected] = 20
    ENUM[21] = :Cringing ; NUME[:Cringing] = 21
    ENUM[22] = :Screaming ; NUME[:Screaming] = 22
    ENUM[23] = :SubmissiveGesture ; NUME[:SubmissiveGesture] = 23
    ENUM[24] = :FetalPosition ; NUME[:FetalPosition] = 24
    ENUM[25] = :SmearedIntoSpiral ; NUME[:SmearedIntoSpiral] = 25
    ENUM[26] = :Falling ; NUME[:Falling] = 26
    ENUM[27] = :Dead ; NUME[:Dead] = 27
    ENUM[28] = :Laughing ; NUME[:Laughing] = 28
    ENUM[29] = :LookingOffended ; NUME[:LookingOffended] = 29
    ENUM[30] = :BeingShot ; NUME[:BeingShot] = 30
    ENUM[31] = :PlaintiveGesture ; NUME[:PlaintiveGesture] = 31
    ENUM[32] = :Melting ; NUME[:Melting] = 32
    ENUM[33] = :Shooting ; NUME[:Shooting] = 33
    ENUM[34] = :Torturing ; NUME[:Torturing] = 34
    ENUM[35] = :CommittingDepravedAct ; NUME[:CommittingDepravedAct] = 35
    ENUM[36] = :Praying ; NUME[:Praying] = 36
    ENUM[37] = :Contemplating ; NUME[:Contemplating] = 37
    ENUM[38] = :Cooking ; NUME[:Cooking] = 38
    ENUM[39] = :Engraving ; NUME[:Engraving] = 39
    ENUM[40] = :Prostrating ; NUME[:Prostrating] = 40
    ENUM[41] = :Suffering ; NUME[:Suffering] = 41
    ENUM[42] = :BeingImpaled ; NUME[:BeingImpaled] = 42
    ENUM[43] = :BeingContorted ; NUME[:BeingContorted] = 43
    ENUM[44] = :BeingFlayed ; NUME[:BeingFlayed] = 44
    ENUM[45] = :HangingFrom ; NUME[:HangingFrom] = 45
    ENUM[46] = :BeingMutilated ; NUME[:BeingMutilated] = 46
    ENUM[47] = :TriumphantPose ; NUME[:TriumphantPose] = 47
end

class ArtifactClaimType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Symbol ; NUME[:Symbol] = 0
    ENUM[1] = :Heirloom ; NUME[:Heirloom] = 1
    ENUM[2] = :Treasure ; NUME[:Treasure] = 2
    ENUM[3] = :HolyRelic ; NUME[:HolyRelic] = 3
end

class AssumeIdentityMode < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SelectIdentity ; NUME[:SelectIdentity] = 0
    ENUM[1] = :CreateIdentity ; NUME[:CreateIdentity] = 1
    ENUM[2] = :SelectProfession ; NUME[:SelectProfession] = 2
    ENUM[3] = :SelectWorship ; NUME[:SelectWorship] = 3
    ENUM[4] = :SelectOrigin ; NUME[:SelectOrigin] = 4
end

class BarrackPreferenceCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Bed ; NUME[:Bed] = 0
    ENUM[1] = :Armorstand ; NUME[:Armorstand] = 1
    ENUM[2] = :Box ; NUME[:Box] = 2
    ENUM[3] = :Cabinet ; NUME[:Cabinet] = 3
end

class BeatType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Silent ; NUME[:Silent] = 0
    ENUM[1] = :AccentedBeat ; NUME[:AccentedBeat] = 1
    ENUM[2] = :Beat ; NUME[:Beat] = 2
    ENUM[3] = :PrimaryAccent ; NUME[:PrimaryAccent] = 3
    ENUM[4] = :SilentEarly ; NUME[:SilentEarly] = 4
    ENUM[5] = :AccentedBeatEarly ; NUME[:AccentedBeatEarly] = 5
    ENUM[6] = :BeatEarly ; NUME[:BeatEarly] = 6
    ENUM[7] = :AccentedEarly ; NUME[:AccentedEarly] = 7
    ENUM[8] = :SilentSyncopated ; NUME[:SilentSyncopated] = 8
    ENUM[9] = :AccentedBeatSyncopated ; NUME[:AccentedBeatSyncopated] = 9
    ENUM[10] = :BeatSyncopated ; NUME[:BeatSyncopated] = 10
    ENUM[11] = :AccentedSyncopated ; NUME[:AccentedSyncopated] = 11
end

class BiomeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MOUNTAIN ; NUME[:MOUNTAIN] = 0
    ENUM[1] = :GLACIER ; NUME[:GLACIER] = 1
    ENUM[2] = :TUNDRA ; NUME[:TUNDRA] = 2
    ENUM[3] = :SWAMP_TEMPERATE_FRESHWATER ; NUME[:SWAMP_TEMPERATE_FRESHWATER] = 3
    ENUM[4] = :SWAMP_TEMPERATE_SALTWATER ; NUME[:SWAMP_TEMPERATE_SALTWATER] = 4
    ENUM[5] = :MARSH_TEMPERATE_FRESHWATER ; NUME[:MARSH_TEMPERATE_FRESHWATER] = 5
    ENUM[6] = :MARSH_TEMPERATE_SALTWATER ; NUME[:MARSH_TEMPERATE_SALTWATER] = 6
    ENUM[7] = :SWAMP_TROPICAL_FRESHWATER ; NUME[:SWAMP_TROPICAL_FRESHWATER] = 7
    ENUM[8] = :SWAMP_TROPICAL_SALTWATER ; NUME[:SWAMP_TROPICAL_SALTWATER] = 8
    ENUM[9] = :SWAMP_MANGROVE ; NUME[:SWAMP_MANGROVE] = 9
    ENUM[10] = :MARSH_TROPICAL_FRESHWATER ; NUME[:MARSH_TROPICAL_FRESHWATER] = 10
    ENUM[11] = :MARSH_TROPICAL_SALTWATER ; NUME[:MARSH_TROPICAL_SALTWATER] = 11
    ENUM[12] = :FOREST_TAIGA ; NUME[:FOREST_TAIGA] = 12
    ENUM[13] = :FOREST_TEMPERATE_CONIFER ; NUME[:FOREST_TEMPERATE_CONIFER] = 13
    ENUM[14] = :FOREST_TEMPERATE_BROADLEAF ; NUME[:FOREST_TEMPERATE_BROADLEAF] = 14
    ENUM[15] = :FOREST_TROPICAL_CONIFER ; NUME[:FOREST_TROPICAL_CONIFER] = 15
    ENUM[16] = :FOREST_TROPICAL_DRY_BROADLEAF ; NUME[:FOREST_TROPICAL_DRY_BROADLEAF] = 16
    ENUM[17] = :FOREST_TROPICAL_MOIST_BROADLEAF ; NUME[:FOREST_TROPICAL_MOIST_BROADLEAF] = 17
    ENUM[18] = :GRASSLAND_TEMPERATE ; NUME[:GRASSLAND_TEMPERATE] = 18
    ENUM[19] = :SAVANNA_TEMPERATE ; NUME[:SAVANNA_TEMPERATE] = 19
    ENUM[20] = :SHRUBLAND_TEMPERATE ; NUME[:SHRUBLAND_TEMPERATE] = 20
    ENUM[21] = :GRASSLAND_TROPICAL ; NUME[:GRASSLAND_TROPICAL] = 21
    ENUM[22] = :SAVANNA_TROPICAL ; NUME[:SAVANNA_TROPICAL] = 22
    ENUM[23] = :SHRUBLAND_TROPICAL ; NUME[:SHRUBLAND_TROPICAL] = 23
    ENUM[24] = :DESERT_BADLAND ; NUME[:DESERT_BADLAND] = 24
    ENUM[25] = :DESERT_ROCK ; NUME[:DESERT_ROCK] = 25
    ENUM[26] = :DESERT_SAND ; NUME[:DESERT_SAND] = 26
    ENUM[27] = :OCEAN_TROPICAL ; NUME[:OCEAN_TROPICAL] = 27
    ENUM[28] = :OCEAN_TEMPERATE ; NUME[:OCEAN_TEMPERATE] = 28
    ENUM[29] = :OCEAN_ARCTIC ; NUME[:OCEAN_ARCTIC] = 29
    ENUM[30] = :POOL_TEMPERATE_FRESHWATER ; NUME[:POOL_TEMPERATE_FRESHWATER] = 30
    ENUM[31] = :POOL_TEMPERATE_BRACKISHWATER ; NUME[:POOL_TEMPERATE_BRACKISHWATER] = 31
    ENUM[32] = :POOL_TEMPERATE_SALTWATER ; NUME[:POOL_TEMPERATE_SALTWATER] = 32
    ENUM[33] = :POOL_TROPICAL_FRESHWATER ; NUME[:POOL_TROPICAL_FRESHWATER] = 33
    ENUM[34] = :POOL_TROPICAL_BRACKISHWATER ; NUME[:POOL_TROPICAL_BRACKISHWATER] = 34
    ENUM[35] = :POOL_TROPICAL_SALTWATER ; NUME[:POOL_TROPICAL_SALTWATER] = 35
    ENUM[36] = :LAKE_TEMPERATE_FRESHWATER ; NUME[:LAKE_TEMPERATE_FRESHWATER] = 36
    ENUM[37] = :LAKE_TEMPERATE_BRACKISHWATER ; NUME[:LAKE_TEMPERATE_BRACKISHWATER] = 37
    ENUM[38] = :LAKE_TEMPERATE_SALTWATER ; NUME[:LAKE_TEMPERATE_SALTWATER] = 38
    ENUM[39] = :LAKE_TROPICAL_FRESHWATER ; NUME[:LAKE_TROPICAL_FRESHWATER] = 39
    ENUM[40] = :LAKE_TROPICAL_BRACKISHWATER ; NUME[:LAKE_TROPICAL_BRACKISHWATER] = 40
    ENUM[41] = :LAKE_TROPICAL_SALTWATER ; NUME[:LAKE_TROPICAL_SALTWATER] = 41
    ENUM[42] = :RIVER_TEMPERATE_FRESHWATER ; NUME[:RIVER_TEMPERATE_FRESHWATER] = 42
    ENUM[43] = :RIVER_TEMPERATE_BRACKISHWATER ; NUME[:RIVER_TEMPERATE_BRACKISHWATER] = 43
    ENUM[44] = :RIVER_TEMPERATE_SALTWATER ; NUME[:RIVER_TEMPERATE_SALTWATER] = 44
    ENUM[45] = :RIVER_TROPICAL_FRESHWATER ; NUME[:RIVER_TROPICAL_FRESHWATER] = 45
    ENUM[46] = :RIVER_TROPICAL_BRACKISHWATER ; NUME[:RIVER_TROPICAL_BRACKISHWATER] = 46
    ENUM[47] = :RIVER_TROPICAL_SALTWATER ; NUME[:RIVER_TROPICAL_SALTWATER] = 47
    ENUM[48] = :SUBTERRANEAN_WATER ; NUME[:SUBTERRANEAN_WATER] = 48
    ENUM[49] = :SUBTERRANEAN_CHASM ; NUME[:SUBTERRANEAN_CHASM] = 49
    ENUM[50] = :SUBTERRANEAN_LAVA ; NUME[:SUBTERRANEAN_LAVA] = 50
end

class BlockSquareEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Mineral ; NUME[:Mineral] = 0
    ENUM[1] = :FrozenLiquid ; NUME[:FrozenLiquid] = 1
    ENUM[2] = :WorldConstruction ; NUME[:WorldConstruction] = 2
    ENUM[3] = :MaterialSpatter ; NUME[:MaterialSpatter] = 3
    ENUM[4] = :Grass ; NUME[:Grass] = 4
    ENUM[5] = :Spoor ; NUME[:Spoor] = 5
    ENUM[6] = :ItemSpatter ; NUME[:ItemSpatter] = 6
    ENUM[7] = :DesignationPriority ; NUME[:DesignationPriority] = 7
end

class BodyPartLayerFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CONNECTS ; NUME[:CONNECTS] = 0
end

class BodyPartRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HEAD ; NUME[:HEAD] = 0
    ENUM[1] = :UPPERBODY ; NUME[:UPPERBODY] = 1
    ENUM[2] = :LOWERBODY ; NUME[:LOWERBODY] = 2
    ENUM[3] = :SIGHT ; NUME[:SIGHT] = 3
    ENUM[4] = :EMBEDDED ; NUME[:EMBEDDED] = 4
    ENUM[5] = :INTERNAL ; NUME[:INTERNAL] = 5
    ENUM[6] = :CIRCULATION ; NUME[:CIRCULATION] = 6
    ENUM[7] = :SKELETON ; NUME[:SKELETON] = 7
    ENUM[8] = :LIMB ; NUME[:LIMB] = 8
    ENUM[9] = :GRASP ; NUME[:GRASP] = 9
    ENUM[10] = :STANCE ; NUME[:STANCE] = 10
    ENUM[11] = :GUTS ; NUME[:GUTS] = 11
    ENUM[12] = :BREATHE ; NUME[:BREATHE] = 12
    ENUM[13] = :SMALL ; NUME[:SMALL] = 13
    ENUM[14] = :THROAT ; NUME[:THROAT] = 14
    ENUM[15] = :JOINT ; NUME[:JOINT] = 15
    ENUM[16] = :THOUGHT ; NUME[:THOUGHT] = 16
    ENUM[17] = :NERVOUS ; NUME[:NERVOUS] = 17
    ENUM[18] = :RIGHT ; NUME[:RIGHT] = 18
    ENUM[19] = :LEFT ; NUME[:LEFT] = 19
    ENUM[20] = :HEAR ; NUME[:HEAR] = 20
    ENUM[21] = :SMELL ; NUME[:SMELL] = 21
    ENUM[22] = :FLIER ; NUME[:FLIER] = 22
    ENUM[23] = :DIGIT ; NUME[:DIGIT] = 23
    ENUM[24] = :MOUTH ; NUME[:MOUTH] = 24
    ENUM[25] = :APERTURE ; NUME[:APERTURE] = 25
    ENUM[26] = :SOCKET ; NUME[:SOCKET] = 26
    ENUM[27] = :TOTEMABLE ; NUME[:TOTEMABLE] = 27
    ENUM[30] = :UNDER_PRESSURE ; NUME[:UNDER_PRESSURE] = 30
    ENUM[32] = :VERMIN_BUTCHER_ITEM ; NUME[:VERMIN_BUTCHER_ITEM] = 32
    ENUM[33] = :CONNECTOR ; NUME[:CONNECTOR] = 33
    ENUM[38] = :GELDABLE ; NUME[:GELDABLE] = 38
end

class BodyPartTemplateContype < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :UPPERBODY ; NUME[:UPPERBODY] = 0
    ENUM[1] = :LOWERBODY ; NUME[:LOWERBODY] = 1
    ENUM[2] = :HEAD ; NUME[:HEAD] = 2
    ENUM[3] = :GRASP ; NUME[:GRASP] = 3
    ENUM[4] = :STANCE ; NUME[:STANCE] = 4
end

class BodyPartTemplateFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HEAD ; NUME[:HEAD] = 0
    ENUM[1] = :UPPERBODY ; NUME[:UPPERBODY] = 1
    ENUM[2] = :LOWERBODY ; NUME[:LOWERBODY] = 2
    ENUM[3] = :SIGHT ; NUME[:SIGHT] = 3
    ENUM[4] = :EMBEDDED ; NUME[:EMBEDDED] = 4
    ENUM[5] = :INTERNAL ; NUME[:INTERNAL] = 5
    ENUM[6] = :CIRCULATION ; NUME[:CIRCULATION] = 6
    ENUM[7] = :SKELETON ; NUME[:SKELETON] = 7
    ENUM[8] = :LIMB ; NUME[:LIMB] = 8
    ENUM[9] = :GRASP ; NUME[:GRASP] = 9
    ENUM[10] = :STANCE ; NUME[:STANCE] = 10
    ENUM[11] = :GUTS ; NUME[:GUTS] = 11
    ENUM[12] = :BREATHE ; NUME[:BREATHE] = 12
    ENUM[13] = :SMALL ; NUME[:SMALL] = 13
    ENUM[14] = :THROAT ; NUME[:THROAT] = 14
    ENUM[15] = :JOINT ; NUME[:JOINT] = 15
    ENUM[16] = :THOUGHT ; NUME[:THOUGHT] = 16
    ENUM[17] = :NERVOUS ; NUME[:NERVOUS] = 17
    ENUM[18] = :RIGHT ; NUME[:RIGHT] = 18
    ENUM[19] = :LEFT ; NUME[:LEFT] = 19
    ENUM[20] = :HEAR ; NUME[:HEAR] = 20
    ENUM[21] = :SMELL ; NUME[:SMELL] = 21
    ENUM[22] = :FLIER ; NUME[:FLIER] = 22
    ENUM[23] = :DIGIT ; NUME[:DIGIT] = 23
    ENUM[24] = :MOUTH ; NUME[:MOUTH] = 24
    ENUM[25] = :APERTURE ; NUME[:APERTURE] = 25
    ENUM[26] = :SOCKET ; NUME[:SOCKET] = 26
    ENUM[27] = :TOTEMABLE ; NUME[:TOTEMABLE] = 27
    ENUM[28] = :UNDER_PRESSURE ; NUME[:UNDER_PRESSURE] = 28
    ENUM[29] = :VERMIN_BUTCHER_ITEM ; NUME[:VERMIN_BUTCHER_ITEM] = 29
    ENUM[30] = :CONNECTOR ; NUME[:CONNECTOR] = 30
end

class BreathAttackType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TRAILING_DUST_FLOW ; NUME[:TRAILING_DUST_FLOW] = 0
    ENUM[1] = :TRAILING_VAPOR_FLOW ; NUME[:TRAILING_VAPOR_FLOW] = 1
    ENUM[2] = :TRAILING_GAS_FLOW ; NUME[:TRAILING_GAS_FLOW] = 2
    ENUM[3] = :SOLID_GLOB ; NUME[:SOLID_GLOB] = 3
    ENUM[4] = :LIQUID_GLOB ; NUME[:LIQUID_GLOB] = 4
    ENUM[5] = :UNDIRECTED_GAS ; NUME[:UNDIRECTED_GAS] = 5
    ENUM[6] = :UNDIRECTED_VAPOR ; NUME[:UNDIRECTED_VAPOR] = 6
    ENUM[7] = :UNDIRECTED_DUST ; NUME[:UNDIRECTED_DUST] = 7
    ENUM[8] = :WEB_SPRAY ; NUME[:WEB_SPRAY] = 8
    ENUM[9] = :DRAGONFIRE ; NUME[:DRAGONFIRE] = 9
    ENUM[10] = :FIREJET ; NUME[:FIREJET] = 10
    ENUM[11] = :FIREBALL ; NUME[:FIREBALL] = 11
    ENUM[12] = :WEATHER_CREEPING_GAS ; NUME[:WEATHER_CREEPING_GAS] = 12
    ENUM[13] = :WEATHER_CREEPING_VAPOR ; NUME[:WEATHER_CREEPING_VAPOR] = 13
    ENUM[14] = :WEATHER_CREEPING_DUST ; NUME[:WEATHER_CREEPING_DUST] = 14
    ENUM[15] = :WEATHER_FALLING_MATERIAL ; NUME[:WEATHER_FALLING_MATERIAL] = 15
    ENUM[16] = :SPATTER_POWDER ; NUME[:SPATTER_POWDER] = 16
    ENUM[17] = :SPATTER_LIQUID ; NUME[:SPATTER_LIQUID] = 17
    ENUM[18] = :UNDIRECTED_ITEM_CLOUD ; NUME[:UNDIRECTED_ITEM_CLOUD] = 18
    ENUM[19] = :TRAILING_ITEM_FLOW ; NUME[:TRAILING_ITEM_FLOW] = 19
    ENUM[20] = :SHARP_ROCK ; NUME[:SHARP_ROCK] = 20
    ENUM[21] = :OTHER ; NUME[:OTHER] = 21
end

class BuildReqChoiceType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :General ; NUME[:General] = 0
    ENUM[1] = :Specific ; NUME[:Specific] = 1
end

class BuildingExtentsType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :None ; NUME[:None] = 0
    ENUM[1] = :Stockpile ; NUME[:Stockpile] = 1
    ENUM[2] = :Wall ; NUME[:Wall] = 2
    ENUM[3] = :Interior ; NUME[:Interior] = 3
    ENUM[4] = :DistanceBoundary ; NUME[:DistanceBoundary] = 4
end

class BuildingType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Name = Hash.new
    Classname = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Chair ; NUME[:Chair] = 0 ; Classname[:Chair] = 'building_chairst'
    ENUM[1] = :Bed ; NUME[:Bed] = 1 ; Classname[:Bed] = 'building_bedst'
    ENUM[2] = :Table ; NUME[:Table] = 2 ; Classname[:Table] = 'building_tablest'
    ENUM[3] = :Coffin ; NUME[:Coffin] = 3 ; Classname[:Coffin] = 'building_coffinst'
    ENUM[4] = :FarmPlot ; NUME[:FarmPlot] = 4 ; Name[:FarmPlot] = 'Farm Plot' ; Classname[:FarmPlot] = 'building_farmplotst'
    ENUM[5] = :Furnace ; NUME[:Furnace] = 5 ; Classname[:Furnace] = 'building_furnacest'
    ENUM[6] = :TradeDepot ; NUME[:TradeDepot] = 6 ; Name[:TradeDepot] = 'Trade Depot' ; Classname[:TradeDepot] = 'building_tradedepotst'
    ENUM[7] = :Shop ; NUME[:Shop] = 7 ; Classname[:Shop] = 'building_shopst'
    ENUM[8] = :Door ; NUME[:Door] = 8 ; Classname[:Door] = 'building_doorst'
    ENUM[9] = :Floodgate ; NUME[:Floodgate] = 9 ; Classname[:Floodgate] = 'building_floodgatest'
    ENUM[10] = :Box ; NUME[:Box] = 10 ; Classname[:Box] = 'building_boxst'
    ENUM[11] = :Weaponrack ; NUME[:Weaponrack] = 11 ; Name[:Weaponrack] = 'Weapon Rack' ; Classname[:Weaponrack] = 'building_weaponrackst'
    ENUM[12] = :Armorstand ; NUME[:Armorstand] = 12 ; Name[:Armorstand] = 'Armor Stand' ; Classname[:Armorstand] = 'building_armorstandst'
    ENUM[13] = :Workshop ; NUME[:Workshop] = 13 ; Classname[:Workshop] = 'building_workshopst'
    ENUM[14] = :Cabinet ; NUME[:Cabinet] = 14 ; Classname[:Cabinet] = 'building_cabinetst'
    ENUM[15] = :Statue ; NUME[:Statue] = 15 ; Classname[:Statue] = 'building_statuest'
    ENUM[16] = :WindowGlass ; NUME[:WindowGlass] = 16 ; Name[:WindowGlass] = 'Glass Window' ; Classname[:WindowGlass] = 'building_window_glassst'
    ENUM[17] = :WindowGem ; NUME[:WindowGem] = 17 ; Name[:WindowGem] = 'Gem Window' ; Classname[:WindowGem] = 'building_window_gemst'
    ENUM[18] = :Well ; NUME[:Well] = 18 ; Classname[:Well] = 'building_wellst'
    ENUM[19] = :Bridge ; NUME[:Bridge] = 19 ; Classname[:Bridge] = 'building_bridgest'
    ENUM[20] = :RoadDirt ; NUME[:RoadDirt] = 20 ; Name[:RoadDirt] = 'Dirt Road' ; Classname[:RoadDirt] = 'building_road_dirtst'
    ENUM[21] = :RoadPaved ; NUME[:RoadPaved] = 21 ; Name[:RoadPaved] = 'Paved Road' ; Classname[:RoadPaved] = 'building_road_pavedst'
    ENUM[22] = :SiegeEngine ; NUME[:SiegeEngine] = 22 ; Name[:SiegeEngine] = 'Siege Engine' ; Classname[:SiegeEngine] = 'building_siegeenginest'
    ENUM[23] = :Trap ; NUME[:Trap] = 23 ; Classname[:Trap] = 'building_trapst'
    ENUM[24] = :AnimalTrap ; NUME[:AnimalTrap] = 24 ; Name[:AnimalTrap] = 'Animal Trap' ; Classname[:AnimalTrap] = 'building_animaltrapst'
    ENUM[25] = :Support ; NUME[:Support] = 25 ; Classname[:Support] = 'building_supportst'
    ENUM[26] = :ArcheryTarget ; NUME[:ArcheryTarget] = 26 ; Name[:ArcheryTarget] = 'Archery Target' ; Classname[:ArcheryTarget] = 'building_archerytargetst'
    ENUM[27] = :Chain ; NUME[:Chain] = 27 ; Classname[:Chain] = 'building_chainst'
    ENUM[28] = :Cage ; NUME[:Cage] = 28 ; Classname[:Cage] = 'building_cagest'
    ENUM[29] = :Stockpile ; NUME[:Stockpile] = 29 ; Classname[:Stockpile] = 'building_stockpilest'
    ENUM[30] = :Civzone ; NUME[:Civzone] = 30 ; Name[:Civzone] = 'Zone' ; Classname[:Civzone] = 'building_civzonest'
    ENUM[31] = :Weapon ; NUME[:Weapon] = 31 ; Classname[:Weapon] = 'building_weaponst'
    ENUM[32] = :Wagon ; NUME[:Wagon] = 32 ; Classname[:Wagon] = 'building_wagonst'
    ENUM[33] = :ScrewPump ; NUME[:ScrewPump] = 33 ; Name[:ScrewPump] = 'Screw Pump' ; Classname[:ScrewPump] = 'building_screw_pumpst'
    ENUM[34] = :Construction ; NUME[:Construction] = 34 ; Classname[:Construction] = 'building_constructionst'
    ENUM[35] = :Hatch ; NUME[:Hatch] = 35 ; Classname[:Hatch] = 'building_hatchst'
    ENUM[36] = :GrateWall ; NUME[:GrateWall] = 36 ; Name[:GrateWall] = 'Wall Grate' ; Classname[:GrateWall] = 'building_grate_wallst'
    ENUM[37] = :GrateFloor ; NUME[:GrateFloor] = 37 ; Name[:GrateFloor] = 'Floor Grate' ; Classname[:GrateFloor] = 'building_grate_floorst'
    ENUM[38] = :BarsVertical ; NUME[:BarsVertical] = 38 ; Name[:BarsVertical] = 'Vertical Bars' ; Classname[:BarsVertical] = 'building_bars_verticalst'
    ENUM[39] = :BarsFloor ; NUME[:BarsFloor] = 39 ; Name[:BarsFloor] = 'Floor Bars' ; Classname[:BarsFloor] = 'building_bars_floorst'
    ENUM[40] = :GearAssembly ; NUME[:GearAssembly] = 40 ; Name[:GearAssembly] = 'Gear Assembly' ; Classname[:GearAssembly] = 'building_gear_assemblyst'
    ENUM[41] = :AxleHorizontal ; NUME[:AxleHorizontal] = 41 ; Name[:AxleHorizontal] = 'Horizontal Axle' ; Classname[:AxleHorizontal] = 'building_axle_horizontalst'
    ENUM[42] = :AxleVertical ; NUME[:AxleVertical] = 42 ; Name[:AxleVertical] = 'Vertical Axle' ; Classname[:AxleVertical] = 'building_axle_verticalst'
    ENUM[43] = :WaterWheel ; NUME[:WaterWheel] = 43 ; Name[:WaterWheel] = 'Water Wheel' ; Classname[:WaterWheel] = 'building_water_wheelst'
    ENUM[44] = :Windmill ; NUME[:Windmill] = 44 ; Classname[:Windmill] = 'building_windmillst'
    ENUM[45] = :TractionBench ; NUME[:TractionBench] = 45 ; Name[:TractionBench] = 'Traction Bench' ; Classname[:TractionBench] = 'building_traction_benchst'
    ENUM[46] = :Slab ; NUME[:Slab] = 46 ; Classname[:Slab] = 'building_slabst'
    ENUM[47] = :Nest ; NUME[:Nest] = 47 ; Classname[:Nest] = 'building_nestst'
    ENUM[48] = :NestBox ; NUME[:NestBox] = 48 ; Name[:NestBox] = 'Nest Box' ; Classname[:NestBox] = 'building_nest_boxst'
    ENUM[49] = :Hive ; NUME[:Hive] = 49 ; Classname[:Hive] = 'building_hivest'
    ENUM[50] = :Rollers ; NUME[:Rollers] = 50 ; Classname[:Rollers] = 'building_rollersst'
    ENUM[51] = :Instrument ; NUME[:Instrument] = 51 ; Classname[:Instrument] = 'building_instrumentst'
    ENUM[52] = :Bookcase ; NUME[:Bookcase] = 52 ; Classname[:Bookcase] = 'building_bookcasest'
    ENUM[53] = :DisplayFurniture ; NUME[:DisplayFurniture] = 53 ; Name[:DisplayFurniture] = 'Display Furniture' ; Classname[:DisplayFurniture] = 'building_display_furniturest'
    ENUM[54] = :OfferingPlace ; NUME[:OfferingPlace] = 54 ; Name[:OfferingPlace] = 'Offering Place' ; Classname[:OfferingPlace] = 'building_offering_placest'
end

class BuildingsOtherId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Building = Hash.new(:NONE)
    GenericBuilding = Hash.new { |h, k| h[k] = [] }
    Workshop = Hash.new { |h, k| h[k] = [] }
    Furnace = Hash.new { |h, k| h[k] = [] }
    Civzone = Hash.new { |h, k| h[k] = [] }
    ENUM[-1] = :ANY ; NUME[:ANY] = -1
    ENUM[0] = :IN_PLAY ; NUME[:IN_PLAY] = 0
    ENUM[1] = :LOCATION_ASSIGNED ; NUME[:LOCATION_ASSIGNED] = 1 ; GenericBuilding[:LOCATION_ASSIGNED] << :Bed ; GenericBuilding[:LOCATION_ASSIGNED] << :Civzone
    ENUM[2] = :STOCKPILE ; NUME[:STOCKPILE] = 2 ; Building[:STOCKPILE] = :Stockpile
    ENUM[3] = :ANY_ZONE ; NUME[:ANY_ZONE] = 3 ; Building[:ANY_ZONE] = :Civzone
    ENUM[4] = :ACTIVITY_ZONE ; NUME[:ACTIVITY_ZONE] = 4 ; Building[:ACTIVITY_ZONE] = :Civzone ; Civzone[:ACTIVITY_ZONE] << :ActivityZone
    ENUM[5] = :ANY_ACTUAL ; NUME[:ANY_ACTUAL] = 5
    ENUM[6] = :ANY_MACHINE ; NUME[:ANY_MACHINE] = 6 ; GenericBuilding[:ANY_MACHINE] << :ScrewPump ; GenericBuilding[:ANY_MACHINE] << :GearAssembly ; GenericBuilding[:ANY_MACHINE] << :AxleHorizontal ; GenericBuilding[:ANY_MACHINE] << :AxleVertical ; GenericBuilding[:ANY_MACHINE] << :WaterWheel ; GenericBuilding[:ANY_MACHINE] << :Windmill ; GenericBuilding[:ANY_MACHINE] << :Workshop ; Workshop[:ANY_MACHINE] << :Millstone
    ENUM[7] = :ANY_HOSPITAL_STORAGE ; NUME[:ANY_HOSPITAL_STORAGE] = 7 ; GenericBuilding[:ANY_HOSPITAL_STORAGE] << :Box ; GenericBuilding[:ANY_HOSPITAL_STORAGE] << :Cabinet
    ENUM[8] = :ANY_STORAGE ; NUME[:ANY_STORAGE] = 8 ; GenericBuilding[:ANY_STORAGE] << :Box ; GenericBuilding[:ANY_STORAGE] << :Cabinet ; GenericBuilding[:ANY_STORAGE] << :Weaponrack ; GenericBuilding[:ANY_STORAGE] << :Armorstand
    ENUM[9] = :ANY_BARRACKS ; NUME[:ANY_BARRACKS] = 9 ; GenericBuilding[:ANY_BARRACKS] << :Bed ; GenericBuilding[:ANY_BARRACKS] << :Box ; GenericBuilding[:ANY_BARRACKS] << :Cabinet ; GenericBuilding[:ANY_BARRACKS] << :Weaponrack ; GenericBuilding[:ANY_BARRACKS] << :Armorstand
    ENUM[10] = :ANY_NOBLE_ROOM ; NUME[:ANY_NOBLE_ROOM] = 10 ; GenericBuilding[:ANY_NOBLE_ROOM] << :Chair ; GenericBuilding[:ANY_NOBLE_ROOM] << :Bed ; GenericBuilding[:ANY_NOBLE_ROOM] << :Table ; GenericBuilding[:ANY_NOBLE_ROOM] << :Coffin
    ENUM[11] = :ANY_HOSPITAL ; NUME[:ANY_HOSPITAL] = 11 ; GenericBuilding[:ANY_HOSPITAL] << :Bed ; GenericBuilding[:ANY_HOSPITAL] << :TractionBench
    ENUM[12] = :BOX ; NUME[:BOX] = 12 ; Building[:BOX] = :Box
    ENUM[13] = :CABINET ; NUME[:CABINET] = 13 ; Building[:CABINET] = :Cabinet
    ENUM[14] = :TRAP ; NUME[:TRAP] = 14 ; Building[:TRAP] = :Trap
    ENUM[15] = :DOOR ; NUME[:DOOR] = 15 ; Building[:DOOR] = :Door
    ENUM[16] = :FLOODGATE ; NUME[:FLOODGATE] = 16 ; Building[:FLOODGATE] = :Floodgate
    ENUM[17] = :HATCH ; NUME[:HATCH] = 17 ; Building[:HATCH] = :Hatch
    ENUM[18] = :GRATE_WALL ; NUME[:GRATE_WALL] = 18 ; Building[:GRATE_WALL] = :GrateWall
    ENUM[19] = :GRATE_FLOOR ; NUME[:GRATE_FLOOR] = 19 ; Building[:GRATE_FLOOR] = :GrateFloor
    ENUM[20] = :BARS_VERTICAL ; NUME[:BARS_VERTICAL] = 20 ; Building[:BARS_VERTICAL] = :BarsVertical
    ENUM[21] = :BARS_FLOOR ; NUME[:BARS_FLOOR] = 21 ; Building[:BARS_FLOOR] = :BarsFloor
    ENUM[22] = :WINDOW_ANY ; NUME[:WINDOW_ANY] = 22 ; GenericBuilding[:WINDOW_ANY] << :WindowGlass ; GenericBuilding[:WINDOW_ANY] << :WindowGem
    ENUM[23] = :WELL ; NUME[:WELL] = 23 ; Building[:WELL] = :Well
    ENUM[24] = :TABLE ; NUME[:TABLE] = 24 ; Building[:TABLE] = :Table
    ENUM[25] = :BRIDGE ; NUME[:BRIDGE] = 25 ; Building[:BRIDGE] = :Bridge
    ENUM[26] = :CHAIR ; NUME[:CHAIR] = 26 ; Building[:CHAIR] = :Chair
    ENUM[27] = :TRADE_DEPOT ; NUME[:TRADE_DEPOT] = 27 ; Building[:TRADE_DEPOT] = :TradeDepot
    ENUM[28] = :NEST ; NUME[:NEST] = 28 ; Building[:NEST] = :Nest
    ENUM[29] = :NEST_BOX ; NUME[:NEST_BOX] = 29 ; Building[:NEST_BOX] = :NestBox
    ENUM[30] = :BOOKCASE ; NUME[:BOOKCASE] = 30 ; Building[:BOOKCASE] = :Bookcase
    ENUM[31] = :DISPLAY_CASE ; NUME[:DISPLAY_CASE] = 31 ; Building[:DISPLAY_CASE] = :DisplayFurniture
    ENUM[32] = :HIVE ; NUME[:HIVE] = 32 ; Building[:HIVE] = :Hive
    ENUM[33] = :WAGON ; NUME[:WAGON] = 33 ; Building[:WAGON] = :Wagon
    ENUM[34] = :SHOP ; NUME[:SHOP] = 34 ; Building[:SHOP] = :Shop
    ENUM[35] = :BED ; NUME[:BED] = 35 ; Building[:BED] = :Bed
    ENUM[36] = :TRACTION_BENCH ; NUME[:TRACTION_BENCH] = 36 ; Building[:TRACTION_BENCH] = :TractionBench
    ENUM[37] = :ANY_ROAD ; NUME[:ANY_ROAD] = 37 ; GenericBuilding[:ANY_ROAD] << :RoadDirt ; GenericBuilding[:ANY_ROAD] << :RoadPaved
    ENUM[38] = :FARM_PLOT ; NUME[:FARM_PLOT] = 38 ; Building[:FARM_PLOT] = :FarmPlot
    ENUM[39] = :GEAR_ASSEMBLY ; NUME[:GEAR_ASSEMBLY] = 39 ; Building[:GEAR_ASSEMBLY] = :GearAssembly
    ENUM[40] = :ROLLERS ; NUME[:ROLLERS] = 40 ; Building[:ROLLERS] = :Rollers
    ENUM[41] = :AXLE_HORIZONTAL ; NUME[:AXLE_HORIZONTAL] = 41 ; Building[:AXLE_HORIZONTAL] = :AxleHorizontal
    ENUM[42] = :AXLE_VERTICAL ; NUME[:AXLE_VERTICAL] = 42 ; Building[:AXLE_VERTICAL] = :AxleVertical
    ENUM[43] = :SUPPORT ; NUME[:SUPPORT] = 43 ; Building[:SUPPORT] = :Support
    ENUM[44] = :ARCHERY_TARGET ; NUME[:ARCHERY_TARGET] = 44 ; Building[:ARCHERY_TARGET] = :ArcheryTarget
    ENUM[45] = :SCREW_PUMP ; NUME[:SCREW_PUMP] = 45 ; Building[:SCREW_PUMP] = :ScrewPump
    ENUM[46] = :WATER_WHEEL ; NUME[:WATER_WHEEL] = 46 ; Building[:WATER_WHEEL] = :WaterWheel
    ENUM[47] = :WINDMILL ; NUME[:WINDMILL] = 47 ; Building[:WINDMILL] = :Windmill
    ENUM[48] = :CHAIN ; NUME[:CHAIN] = 48 ; Building[:CHAIN] = :Chain
    ENUM[49] = :CAGE ; NUME[:CAGE] = 49 ; Building[:CAGE] = :Cage
    ENUM[50] = :STATUE ; NUME[:STATUE] = 50 ; Building[:STATUE] = :Statue
    ENUM[51] = :SLAB ; NUME[:SLAB] = 51 ; Building[:SLAB] = :Slab
    ENUM[52] = :COFFIN ; NUME[:COFFIN] = 52 ; Building[:COFFIN] = :Coffin
    ENUM[53] = :WEAPON_RACK ; NUME[:WEAPON_RACK] = 53 ; Building[:WEAPON_RACK] = :Weaponrack
    ENUM[54] = :ARMOR_STAND ; NUME[:ARMOR_STAND] = 54 ; Building[:ARMOR_STAND] = :Armorstand
    ENUM[55] = :FURNACE_ANY ; NUME[:FURNACE_ANY] = 55 ; Building[:FURNACE_ANY] = :Furnace
    ENUM[56] = :FURNACE_WOOD ; NUME[:FURNACE_WOOD] = 56 ; Building[:FURNACE_WOOD] = :Furnace ; Furnace[:FURNACE_WOOD] << :WoodFurnace
    ENUM[57] = :FURNACE_SMELTER_ANY ; NUME[:FURNACE_SMELTER_ANY] = 57 ; Building[:FURNACE_SMELTER_ANY] = :Furnace ; Furnace[:FURNACE_SMELTER_ANY] << :Smelter ; Furnace[:FURNACE_SMELTER_ANY] << :MagmaSmelter
    ENUM[58] = :FURNACE_SMELTER_MAGMA ; NUME[:FURNACE_SMELTER_MAGMA] = 58 ; Building[:FURNACE_SMELTER_MAGMA] = :Furnace ; Furnace[:FURNACE_SMELTER_MAGMA] << :MagmaSmelter
    ENUM[59] = :FURNACE_KILN_ANY ; NUME[:FURNACE_KILN_ANY] = 59 ; Building[:FURNACE_KILN_ANY] = :Furnace ; Furnace[:FURNACE_KILN_ANY] << :Kiln ; Furnace[:FURNACE_KILN_ANY] << :MagmaKiln
    ENUM[60] = :FURNACE_GLASS_ANY ; NUME[:FURNACE_GLASS_ANY] = 60 ; Building[:FURNACE_GLASS_ANY] = :Furnace ; Furnace[:FURNACE_GLASS_ANY] << :GlassFurnace ; Furnace[:FURNACE_GLASS_ANY] << :MagmaGlassFurnace
    ENUM[61] = :FURNACE_CUSTOM ; NUME[:FURNACE_CUSTOM] = 61 ; Building[:FURNACE_CUSTOM] = :Furnace ; Furnace[:FURNACE_CUSTOM] << :Custom
    ENUM[62] = :WORKSHOP_ANY ; NUME[:WORKSHOP_ANY] = 62 ; Building[:WORKSHOP_ANY] = :Workshop
    ENUM[63] = :WORKSHOP_BUTCHER ; NUME[:WORKSHOP_BUTCHER] = 63 ; Building[:WORKSHOP_BUTCHER] = :Workshop ; Workshop[:WORKSHOP_BUTCHER] << :Butchers
    ENUM[64] = :WORKSHOP_MASON ; NUME[:WORKSHOP_MASON] = 64 ; Building[:WORKSHOP_MASON] = :Workshop ; Workshop[:WORKSHOP_MASON] << :Masons
    ENUM[65] = :WORKSHOP_KENNEL ; NUME[:WORKSHOP_KENNEL] = 65 ; Building[:WORKSHOP_KENNEL] = :Workshop ; Workshop[:WORKSHOP_KENNEL] << :Kennels
    ENUM[66] = :WORKSHOP_FISHERY ; NUME[:WORKSHOP_FISHERY] = 66 ; Building[:WORKSHOP_FISHERY] = :Workshop ; Workshop[:WORKSHOP_FISHERY] << :Fishery
    ENUM[67] = :WORKSHOP_JEWELER ; NUME[:WORKSHOP_JEWELER] = 67 ; Building[:WORKSHOP_JEWELER] = :Workshop ; Workshop[:WORKSHOP_JEWELER] << :Jewelers
    ENUM[68] = :WORKSHOP_LOOM ; NUME[:WORKSHOP_LOOM] = 68 ; Building[:WORKSHOP_LOOM] = :Workshop ; Workshop[:WORKSHOP_LOOM] << :Loom
    ENUM[69] = :WORKSHOP_TANNER ; NUME[:WORKSHOP_TANNER] = 69 ; Building[:WORKSHOP_TANNER] = :Workshop ; Workshop[:WORKSHOP_TANNER] << :Tanners
    ENUM[70] = :WORKSHOP_DYER ; NUME[:WORKSHOP_DYER] = 70 ; Building[:WORKSHOP_DYER] = :Workshop ; Workshop[:WORKSHOP_DYER] << :Dyers
    ENUM[71] = :WORKSHOP_MILL_ANY ; NUME[:WORKSHOP_MILL_ANY] = 71 ; Building[:WORKSHOP_MILL_ANY] = :Workshop ; Workshop[:WORKSHOP_MILL_ANY] << :Quern ; Workshop[:WORKSHOP_MILL_ANY] << :Millstone
    ENUM[72] = :WORKSHOP_QUERN ; NUME[:WORKSHOP_QUERN] = 72 ; Building[:WORKSHOP_QUERN] = :Workshop ; Workshop[:WORKSHOP_QUERN] << :Quern
    ENUM[73] = :WORKSHOP_TOOL ; NUME[:WORKSHOP_TOOL] = 73 ; Building[:WORKSHOP_TOOL] = :Workshop ; Workshop[:WORKSHOP_TOOL] << :Tool
    ENUM[74] = :WORKSHOP_MILLSTONE ; NUME[:WORKSHOP_MILLSTONE] = 74 ; Building[:WORKSHOP_MILLSTONE] = :Workshop ; Workshop[:WORKSHOP_MILLSTONE] << :Millstone
    ENUM[75] = :WORKSHOP_KITCHEN ; NUME[:WORKSHOP_KITCHEN] = 75 ; Building[:WORKSHOP_KITCHEN] = :Workshop ; Workshop[:WORKSHOP_KITCHEN] << :Kitchen
    ENUM[76] = :WORKSHOP_STILL ; NUME[:WORKSHOP_STILL] = 76 ; Building[:WORKSHOP_STILL] = :Workshop ; Workshop[:WORKSHOP_STILL] << :Still
    ENUM[77] = :WORKSHOP_FARMER ; NUME[:WORKSHOP_FARMER] = 77 ; Building[:WORKSHOP_FARMER] = :Workshop ; Workshop[:WORKSHOP_FARMER] << :Farmers
    ENUM[78] = :WORKSHOP_ASHERY ; NUME[:WORKSHOP_ASHERY] = 78 ; Building[:WORKSHOP_ASHERY] = :Workshop ; Workshop[:WORKSHOP_ASHERY] << :Ashery
    ENUM[79] = :WORKSHOP_CARPENTER ; NUME[:WORKSHOP_CARPENTER] = 79 ; Building[:WORKSHOP_CARPENTER] = :Workshop ; Workshop[:WORKSHOP_CARPENTER] << :Carpenters
    ENUM[80] = :WORKSHOP_CRAFTSDWARF ; NUME[:WORKSHOP_CRAFTSDWARF] = 80 ; Building[:WORKSHOP_CRAFTSDWARF] = :Workshop ; Workshop[:WORKSHOP_CRAFTSDWARF] << :Craftsdwarfs
    ENUM[81] = :WORKSHOP_MECHANIC ; NUME[:WORKSHOP_MECHANIC] = 81 ; Building[:WORKSHOP_MECHANIC] = :Workshop ; Workshop[:WORKSHOP_MECHANIC] << :Mechanics
    ENUM[82] = :WORKSHOP_SIEGE ; NUME[:WORKSHOP_SIEGE] = 82 ; Building[:WORKSHOP_SIEGE] = :Workshop ; Workshop[:WORKSHOP_SIEGE] << :Siege
    ENUM[83] = :WORKSHOP_CLOTHIER ; NUME[:WORKSHOP_CLOTHIER] = 83 ; Building[:WORKSHOP_CLOTHIER] = :Workshop ; Workshop[:WORKSHOP_CLOTHIER] << :Clothiers
    ENUM[84] = :WORKSHOP_LEATHER ; NUME[:WORKSHOP_LEATHER] = 84 ; Building[:WORKSHOP_LEATHER] = :Workshop ; Workshop[:WORKSHOP_LEATHER] << :Leatherworks
    ENUM[85] = :WORKSHOP_BOWYER ; NUME[:WORKSHOP_BOWYER] = 85 ; Building[:WORKSHOP_BOWYER] = :Workshop ; Workshop[:WORKSHOP_BOWYER] << :Bowyers
    ENUM[86] = :WORKSHOP_MAGMA_FORGE ; NUME[:WORKSHOP_MAGMA_FORGE] = 86 ; Building[:WORKSHOP_MAGMA_FORGE] = :Workshop ; Workshop[:WORKSHOP_MAGMA_FORGE] << :MagmaForge
    ENUM[87] = :WORKSHOP_FORGE_ANY ; NUME[:WORKSHOP_FORGE_ANY] = 87 ; Building[:WORKSHOP_FORGE_ANY] = :Workshop ; Workshop[:WORKSHOP_FORGE_ANY] << :MetalsmithsForge ; Workshop[:WORKSHOP_FORGE_ANY] << :MagmaForge
    ENUM[88] = :WORKSHOP_CUSTOM ; NUME[:WORKSHOP_CUSTOM] = 88 ; Building[:WORKSHOP_CUSTOM] = :Workshop ; Workshop[:WORKSHOP_CUSTOM] << :Custom
    ENUM[89] = :WEAPON_UPRIGHT ; NUME[:WEAPON_UPRIGHT] = 89 ; Building[:WEAPON_UPRIGHT] = :Weapon
    ENUM[90] = :INSTRUMENT_STATIONARY ; NUME[:INSTRUMENT_STATIONARY] = 90 ; Building[:INSTRUMENT_STATIONARY] = :Instrument
    ENUM[91] = :OFFERING_PLACE ; NUME[:OFFERING_PLACE] = 91 ; Building[:OFFERING_PLACE] = :OfferingPlace
end

class BuiltinMats < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :INORGANIC ; NUME[:INORGANIC] = 0
    ENUM[1] = :AMBER ; NUME[:AMBER] = 1
    ENUM[2] = :CORAL ; NUME[:CORAL] = 2
    ENUM[3] = :GLASS_GREEN ; NUME[:GLASS_GREEN] = 3
    ENUM[4] = :GLASS_CLEAR ; NUME[:GLASS_CLEAR] = 4
    ENUM[5] = :GLASS_CRYSTAL ; NUME[:GLASS_CRYSTAL] = 5
    ENUM[6] = :WATER ; NUME[:WATER] = 6
    ENUM[7] = :COAL ; NUME[:COAL] = 7
    ENUM[8] = :POTASH ; NUME[:POTASH] = 8
    ENUM[9] = :ASH ; NUME[:ASH] = 9
    ENUM[10] = :PEARLASH ; NUME[:PEARLASH] = 10
    ENUM[11] = :LYE ; NUME[:LYE] = 11
    ENUM[12] = :MUD ; NUME[:MUD] = 12
    ENUM[13] = :VOMIT ; NUME[:VOMIT] = 13
    ENUM[14] = :SALT ; NUME[:SALT] = 14
    ENUM[15] = :FILTH_B ; NUME[:FILTH_B] = 15
    ENUM[16] = :FILTH_Y ; NUME[:FILTH_Y] = 16
    ENUM[17] = :UNKNOWN_SUBSTANCE ; NUME[:UNKNOWN_SUBSTANCE] = 17
    ENUM[18] = :GRIME ; NUME[:GRIME] = 18
end

class CasteRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CAN_BREATHE_WATER ; NUME[:CAN_BREATHE_WATER] = 0
    ENUM[1] = :CANNOT_BREATHE_AIR ; NUME[:CANNOT_BREATHE_AIR] = 1
    ENUM[2] = :LOCKPICKER ; NUME[:LOCKPICKER] = 2
    ENUM[3] = :MISCHIEVOUS ; NUME[:MISCHIEVOUS] = 3
    ENUM[4] = :PATTERNFLIER ; NUME[:PATTERNFLIER] = 4
    ENUM[5] = :CURIOUS_BEAST ; NUME[:CURIOUS_BEAST] = 5
    ENUM[6] = :CURIOUS_BEAST_ITEM ; NUME[:CURIOUS_BEAST_ITEM] = 6
    ENUM[7] = :CURIOUS_BEAST_GUZZLER ; NUME[:CURIOUS_BEAST_GUZZLER] = 7
    ENUM[8] = :FLEEQUICK ; NUME[:FLEEQUICK] = 8
    ENUM[9] = :AT_PEACE_WITH_WILDLIFE ; NUME[:AT_PEACE_WITH_WILDLIFE] = 9
    ENUM[10] = :CAN_SWIM ; NUME[:CAN_SWIM] = 10
    ENUM[11] = :OPPOSED_TO_LIFE ; NUME[:OPPOSED_TO_LIFE] = 11
    ENUM[12] = :CURIOUS_BEAST_EATER ; NUME[:CURIOUS_BEAST_EATER] = 12
    ENUM[13] = :NO_EAT ; NUME[:NO_EAT] = 13
    ENUM[14] = :NO_DRINK ; NUME[:NO_DRINK] = 14
    ENUM[15] = :NO_SLEEP ; NUME[:NO_SLEEP] = 15
    ENUM[16] = :COMMON_DOMESTIC ; NUME[:COMMON_DOMESTIC] = 16
    ENUM[17] = :WAGON_PULLER ; NUME[:WAGON_PULLER] = 17
    ENUM[18] = :PACK_ANIMAL ; NUME[:PACK_ANIMAL] = 18
    ENUM[19] = :FLIER ; NUME[:FLIER] = 19
    ENUM[20] = :LARGE_PREDATOR ; NUME[:LARGE_PREDATOR] = 20
    ENUM[21] = :MAGMA_VISION ; NUME[:MAGMA_VISION] = 21
    ENUM[22] = :FIREIMMUNE ; NUME[:FIREIMMUNE] = 22
    ENUM[23] = :FIREIMMUNE_SUPER ; NUME[:FIREIMMUNE_SUPER] = 23
    ENUM[24] = :WEBBER ; NUME[:WEBBER] = 24
    ENUM[25] = :WEBIMMUNE ; NUME[:WEBIMMUNE] = 25
    ENUM[26] = :FISHITEM ; NUME[:FISHITEM] = 26
    ENUM[27] = :IMMOBILE_LAND ; NUME[:IMMOBILE_LAND] = 27
    ENUM[28] = :IMMOLATE ; NUME[:IMMOLATE] = 28
    ENUM[29] = :MILKABLE ; NUME[:MILKABLE] = 29
    ENUM[30] = :NO_SPRING ; NUME[:NO_SPRING] = 30
    ENUM[31] = :NO_SUMMER ; NUME[:NO_SUMMER] = 31
    ENUM[32] = :NO_AUTUMN ; NUME[:NO_AUTUMN] = 32
    ENUM[33] = :NO_WINTER ; NUME[:NO_WINTER] = 33
    ENUM[34] = :BENIGN ; NUME[:BENIGN] = 34
    ENUM[35] = :VERMIN_NOROAM ; NUME[:VERMIN_NOROAM] = 35
    ENUM[36] = :VERMIN_NOTRAP ; NUME[:VERMIN_NOTRAP] = 36
    ENUM[37] = :VERMIN_NOFISH ; NUME[:VERMIN_NOFISH] = 37
    ENUM[38] = :HAS_NERVES ; NUME[:HAS_NERVES] = 38
    ENUM[39] = :NO_DIZZINESS ; NUME[:NO_DIZZINESS] = 39
    ENUM[40] = :NO_FEVERS ; NUME[:NO_FEVERS] = 40
    ENUM[41] = :NO_UNIT_TYPE_COLOR ; NUME[:NO_UNIT_TYPE_COLOR] = 41
    ENUM[42] = :NO_CONNECTIONS_FOR_MOVEMENT ; NUME[:NO_CONNECTIONS_FOR_MOVEMENT] = 42
    ENUM[43] = :SUPERNATURAL ; NUME[:SUPERNATURAL] = 43
    ENUM[44] = :AMBUSHPREDATOR ; NUME[:AMBUSHPREDATOR] = 44
    ENUM[45] = :GNAWER ; NUME[:GNAWER] = 45
    ENUM[46] = :NOT_BUTCHERABLE ; NUME[:NOT_BUTCHERABLE] = 46
    ENUM[47] = :COOKABLE_LIVE ; NUME[:COOKABLE_LIVE] = 47
    ENUM[48] = :HAS_SECRETION ; NUME[:HAS_SECRETION] = 48
    ENUM[49] = :IMMOBILE ; NUME[:IMMOBILE] = 49
    ENUM[50] = :MULTIPART_FULL_VISION ; NUME[:MULTIPART_FULL_VISION] = 50
    ENUM[51] = :MEANDERER ; NUME[:MEANDERER] = 51
    ENUM[52] = :THICKWEB ; NUME[:THICKWEB] = 52
    ENUM[53] = :TRAINABLE_HUNTING ; NUME[:TRAINABLE_HUNTING] = 53
    ENUM[54] = :PET ; NUME[:PET] = 54
    ENUM[55] = :PET_EXOTIC ; NUME[:PET_EXOTIC] = 55
    ENUM[56] = :HAS_ROTTABLE ; NUME[:HAS_ROTTABLE] = 56
    ENUM[57] = :CAN_SPEAK ; NUME[:CAN_SPEAK] = 57
    ENUM[58] = :CAN_LEARN ; NUME[:CAN_LEARN] = 58
    ENUM[59] = :UTTERANCES ; NUME[:UTTERANCES] = 59
    ENUM[60] = :BONECARN ; NUME[:BONECARN] = 60
    ENUM[61] = :CARNIVORE ; NUME[:CARNIVORE] = 61
    ENUM[62] = :AQUATIC_UNDERSWIM ; NUME[:AQUATIC_UNDERSWIM] = 62
    ENUM[63] = :NOEXERT ; NUME[:NOEXERT] = 63
    ENUM[64] = :NOPAIN ; NUME[:NOPAIN] = 64
    ENUM[65] = :EXTRAVISION ; NUME[:EXTRAVISION] = 65
    ENUM[66] = :NOBREATHE ; NUME[:NOBREATHE] = 66
    ENUM[67] = :NOSTUN ; NUME[:NOSTUN] = 67
    ENUM[68] = :NONAUSEA ; NUME[:NONAUSEA] = 68
    ENUM[69] = :HAS_BLOOD ; NUME[:HAS_BLOOD] = 69
    ENUM[70] = :TRANCES ; NUME[:TRANCES] = 70
    ENUM[71] = :NOEMOTION ; NUME[:NOEMOTION] = 71
    ENUM[72] = :SLOW_LEARNER ; NUME[:SLOW_LEARNER] = 72
    ENUM[73] = :NOSTUCKINS ; NUME[:NOSTUCKINS] = 73
    ENUM[74] = :HAS_PUS ; NUME[:HAS_PUS] = 74
    ENUM[75] = :NOSKULL ; NUME[:NOSKULL] = 75
    ENUM[76] = :NOSKIN ; NUME[:NOSKIN] = 76
    ENUM[77] = :NOBONES ; NUME[:NOBONES] = 77
    ENUM[78] = :NOMEAT ; NUME[:NOMEAT] = 78
    ENUM[79] = :PARALYZEIMMUNE ; NUME[:PARALYZEIMMUNE] = 79
    ENUM[80] = :NOFEAR ; NUME[:NOFEAR] = 80
    ENUM[81] = :CANOPENDOORS ; NUME[:CANOPENDOORS] = 81
    ENUM[82] = :ITEMCORPSE ; NUME[:ITEMCORPSE] = 82
    ENUM[83] = :GETS_WOUND_INFECTIONS ; NUME[:GETS_WOUND_INFECTIONS] = 83
    ENUM[84] = :NOSMELLYROT ; NUME[:NOSMELLYROT] = 84
    ENUM[85] = :REMAINS_UNDETERMINED ; NUME[:REMAINS_UNDETERMINED] = 85
    ENUM[86] = :HASSHELL ; NUME[:HASSHELL] = 86
    ENUM[87] = :PEARL ; NUME[:PEARL] = 87
    ENUM[88] = :TRAINABLE_WAR ; NUME[:TRAINABLE_WAR] = 88
    ENUM[89] = :NO_THOUGHT_CENTER_FOR_MOVEMENT ; NUME[:NO_THOUGHT_CENTER_FOR_MOVEMENT] = 89
    ENUM[90] = :ARENA_RESTRICTED ; NUME[:ARENA_RESTRICTED] = 90
    ENUM[91] = :LAIR_HUNTER ; NUME[:LAIR_HUNTER] = 91
    ENUM[92] = :GELDABLE ; NUME[:GELDABLE] = 92
    ENUM[93] = :VERMIN_HATEABLE ; NUME[:VERMIN_HATEABLE] = 93
    ENUM[94] = :VEGETATION ; NUME[:VEGETATION] = 94
    ENUM[95] = :MAGICAL ; NUME[:MAGICAL] = 95
    ENUM[96] = :NATURAL_ANIMAL ; NUME[:NATURAL_ANIMAL] = 96
    ENUM[97] = :HAS_BABYSTATE ; NUME[:HAS_BABYSTATE] = 97
    ENUM[98] = :HAS_CHILDSTATE ; NUME[:HAS_CHILDSTATE] = 98
    ENUM[99] = :MULTIPLE_LITTER_RARE ; NUME[:MULTIPLE_LITTER_RARE] = 99
    ENUM[100] = :MOUNT ; NUME[:MOUNT] = 100
    ENUM[101] = :MOUNT_EXOTIC ; NUME[:MOUNT_EXOTIC] = 101
    ENUM[102] = :FEATURE_ATTACK_GROUP ; NUME[:FEATURE_ATTACK_GROUP] = 102
    ENUM[103] = :VERMIN_MICRO ; NUME[:VERMIN_MICRO] = 103
    ENUM[104] = :EQUIPS ; NUME[:EQUIPS] = 104
    ENUM[105] = :LAYS_EGGS ; NUME[:LAYS_EGGS] = 105
    ENUM[106] = :GRAZER ; NUME[:GRAZER] = 106
    ENUM[107] = :NOTHOUGHT ; NUME[:NOTHOUGHT] = 107
    ENUM[108] = :TRAPAVOID ; NUME[:TRAPAVOID] = 108
    ENUM[109] = :CAVE_ADAPT ; NUME[:CAVE_ADAPT] = 109
    ENUM[110] = :MEGABEAST ; NUME[:MEGABEAST] = 110
    ENUM[111] = :SEMIMEGABEAST ; NUME[:SEMIMEGABEAST] = 111
    ENUM[112] = :ALL_ACTIVE ; NUME[:ALL_ACTIVE] = 112
    ENUM[113] = :DIURNAL ; NUME[:DIURNAL] = 113
    ENUM[114] = :NOCTURNAL ; NUME[:NOCTURNAL] = 114
    ENUM[115] = :CREPUSCULAR ; NUME[:CREPUSCULAR] = 115
    ENUM[116] = :MATUTINAL ; NUME[:MATUTINAL] = 116
    ENUM[117] = :VESPERTINE ; NUME[:VESPERTINE] = 117
    ENUM[118] = :LIGHT_GEN ; NUME[:LIGHT_GEN] = 118
    ENUM[119] = :LISP ; NUME[:LISP] = 119
    ENUM[120] = :GETS_INFECTIONS_FROM_ROT ; NUME[:GETS_INFECTIONS_FROM_ROT] = 120
    ENUM[121] = :HAS_SOLDIER_TILE ; NUME[:HAS_SOLDIER_TILE] = 121
    ENUM[122] = :ALCOHOL_DEPENDENT ; NUME[:ALCOHOL_DEPENDENT] = 122
    ENUM[123] = :CAN_SWIM_INNATE ; NUME[:CAN_SWIM_INNATE] = 123
    ENUM[124] = :POWER ; NUME[:POWER] = 124
    ENUM[125] = :TENDONS ; NUME[:TENDONS] = 125
    ENUM[126] = :LIGAMENTS ; NUME[:LIGAMENTS] = 126
    ENUM[127] = :HAS_TILE ; NUME[:HAS_TILE] = 127
    ENUM[128] = :HAS_COLOR ; NUME[:HAS_COLOR] = 128
    ENUM[129] = :HAS_GLOW_TILE ; NUME[:HAS_GLOW_TILE] = 129
    ENUM[130] = :HAS_GLOW_COLOR ; NUME[:HAS_GLOW_COLOR] = 130
    ENUM[131] = :FEATURE_BEAST ; NUME[:FEATURE_BEAST] = 131
    ENUM[132] = :TITAN ; NUME[:TITAN] = 132
    ENUM[133] = :UNIQUE_DEMON ; NUME[:UNIQUE_DEMON] = 133
    ENUM[134] = :DEMON ; NUME[:DEMON] = 134
    ENUM[135] = :MANNERISM_LAUGH ; NUME[:MANNERISM_LAUGH] = 135
    ENUM[136] = :MANNERISM_SMILE ; NUME[:MANNERISM_SMILE] = 136
    ENUM[137] = :MANNERISM_WALK ; NUME[:MANNERISM_WALK] = 137
    ENUM[138] = :MANNERISM_SIT ; NUME[:MANNERISM_SIT] = 138
    ENUM[139] = :MANNERISM_BREATH ; NUME[:MANNERISM_BREATH] = 139
    ENUM[140] = :MANNERISM_POSTURE ; NUME[:MANNERISM_POSTURE] = 140
    ENUM[141] = :MANNERISM_STRETCH ; NUME[:MANNERISM_STRETCH] = 141
    ENUM[142] = :MANNERISM_EYELIDS ; NUME[:MANNERISM_EYELIDS] = 142
    ENUM[143] = :NIGHT_CREATURE ; NUME[:NIGHT_CREATURE] = 143
    ENUM[144] = :NIGHT_CREATURE_HUNTER ; NUME[:NIGHT_CREATURE_HUNTER] = 144
    ENUM[145] = :NIGHT_CREATURE_BOGEYMAN ; NUME[:NIGHT_CREATURE_BOGEYMAN] = 145
    ENUM[146] = :CONVERTED_SPOUSE ; NUME[:CONVERTED_SPOUSE] = 146
    ENUM[147] = :SPOUSE_CONVERTER ; NUME[:SPOUSE_CONVERTER] = 147
    ENUM[148] = :SPOUSE_CONVERSION_TARGET ; NUME[:SPOUSE_CONVERSION_TARGET] = 148
    ENUM[149] = :DIE_WHEN_VERMIN_BITE ; NUME[:DIE_WHEN_VERMIN_BITE] = 149
    ENUM[150] = :REMAINS_ON_VERMIN_BITE_DEATH ; NUME[:REMAINS_ON_VERMIN_BITE_DEATH] = 150
    ENUM[151] = :COLONY_EXTERNAL ; NUME[:COLONY_EXTERNAL] = 151
    ENUM[152] = :LAYS_UNUSUAL_EGGS ; NUME[:LAYS_UNUSUAL_EGGS] = 152
    ENUM[153] = :RETURNS_VERMIN_KILLS_TO_OWNER ; NUME[:RETURNS_VERMIN_KILLS_TO_OWNER] = 153
    ENUM[154] = :HUNTS_VERMIN ; NUME[:HUNTS_VERMIN] = 154
    ENUM[155] = :ADOPTS_OWNER ; NUME[:ADOPTS_OWNER] = 155
    ENUM[156] = :HAS_SOUND_ALERT ; NUME[:HAS_SOUND_ALERT] = 156
    ENUM[157] = :HAS_SOUND_PEACEFUL_INTERMITTENT ; NUME[:HAS_SOUND_PEACEFUL_INTERMITTENT] = 157
    ENUM[158] = :NOT_LIVING ; NUME[:NOT_LIVING] = 158
    ENUM[159] = :NO_PHYS_ATT_GAIN ; NUME[:NO_PHYS_ATT_GAIN] = 159
    ENUM[160] = :NO_PHYS_ATT_RUST ; NUME[:NO_PHYS_ATT_RUST] = 160
    ENUM[161] = :CRAZED ; NUME[:CRAZED] = 161
    ENUM[162] = :BLOODSUCKER ; NUME[:BLOODSUCKER] = 162
    ENUM[163] = :NO_VEGETATION_PERTURB ; NUME[:NO_VEGETATION_PERTURB] = 163
    ENUM[164] = :DIVE_HUNTS_VERMIN ; NUME[:DIVE_HUNTS_VERMIN] = 164
    ENUM[165] = :VERMIN_GOBBLER ; NUME[:VERMIN_GOBBLER] = 165
    ENUM[166] = :CANNOT_JUMP ; NUME[:CANNOT_JUMP] = 166
    ENUM[167] = :STANCE_CLIMBER ; NUME[:STANCE_CLIMBER] = 167
    ENUM[168] = :CANNOT_CLIMB ; NUME[:CANNOT_CLIMB] = 168
    ENUM[169] = :LOCAL_POPS_CONTROLLABLE ; NUME[:LOCAL_POPS_CONTROLLABLE] = 169
    ENUM[170] = :OUTSIDER_CONTROLLABLE ; NUME[:OUTSIDER_CONTROLLABLE] = 170
    ENUM[171] = :LOCAL_POPS_PRODUCE_HEROES ; NUME[:LOCAL_POPS_PRODUCE_HEROES] = 171
    ENUM[172] = :STRANGE_MOODS ; NUME[:STRANGE_MOODS] = 172
    ENUM[173] = :HAS_GRASP ; NUME[:HAS_GRASP] = 173
    ENUM[174] = :HAS_FLY_RACE_GAIT ; NUME[:HAS_FLY_RACE_GAIT] = 174
    ENUM[175] = :HAS_RACE_GAIT ; NUME[:HAS_RACE_GAIT] = 175
    ENUM[176] = :NIGHT_CREATURE_NIGHTMARE ; NUME[:NIGHT_CREATURE_NIGHTMARE] = 176
    ENUM[177] = :NIGHT_CREATURE_EXPERIMENTER ; NUME[:NIGHT_CREATURE_EXPERIMENTER] = 177
    ENUM[178] = :SPREAD_EVIL_SPHERES_IF_RULER ; NUME[:SPREAD_EVIL_SPHERES_IF_RULER] = 178
end

class CivzoneType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Home ; NUME[:Home] = 0
    ENUM[1] = :Depot ; NUME[:Depot] = 1
    ENUM[2] = :Stockpile ; NUME[:Stockpile] = 2
    ENUM[3] = :NobleQuarters ; NUME[:NobleQuarters] = 3
    ENUM[7] = :MeadHall ; NUME[:MeadHall] = 7
    ENUM[8] = :ThroneRoom ; NUME[:ThroneRoom] = 8
    ENUM[9] = :ActivityZone ; NUME[:ActivityZone] = 9
    ENUM[10] = :Temple ; NUME[:Temple] = 10
    ENUM[11] = :Kitchen ; NUME[:Kitchen] = 11
    ENUM[12] = :CaptiveRoom ; NUME[:CaptiveRoom] = 12
    ENUM[13] = :TowerTop ; NUME[:TowerTop] = 13
    ENUM[14] = :Courtyard ; NUME[:Courtyard] = 14
    ENUM[15] = :Treasury ; NUME[:Treasury] = 15
    ENUM[16] = :GuardPost ; NUME[:GuardPost] = 16
    ENUM[17] = :Entrance ; NUME[:Entrance] = 17
    ENUM[18] = :SecretLibrary ; NUME[:SecretLibrary] = 18
    ENUM[19] = :Library ; NUME[:Library] = 19
    ENUM[20] = :Plot ; NUME[:Plot] = 20
    ENUM[21] = :MarketStall ; NUME[:MarketStall] = 21
    ENUM[23] = :Campground ; NUME[:Campground] = 23
    ENUM[24] = :CommandTent ; NUME[:CommandTent] = 24
    ENUM[25] = :Tent ; NUME[:Tent] = 25
    ENUM[26] = :CommandTentBld ; NUME[:CommandTentBld] = 26
    ENUM[27] = :TentBld ; NUME[:TentBld] = 27
    ENUM[28] = :MechanismRoom ; NUME[:MechanismRoom] = 28
    ENUM[29] = :DungeonCell ; NUME[:DungeonCell] = 29
    ENUM[30] = :AnimalPit ; NUME[:AnimalPit] = 30
    ENUM[31] = :ClothPit ; NUME[:ClothPit] = 31
    ENUM[32] = :TanningPit ; NUME[:TanningPit] = 32
    ENUM[33] = :ClothClothingPit ; NUME[:ClothClothingPit] = 33
    ENUM[34] = :LeatherClothingPit ; NUME[:LeatherClothingPit] = 34
    ENUM[35] = :BoneCarvingPit ; NUME[:BoneCarvingPit] = 35
    ENUM[36] = :GemCuttingPit ; NUME[:GemCuttingPit] = 36
    ENUM[37] = :WeaponsmithingPit ; NUME[:WeaponsmithingPit] = 37
    ENUM[38] = :BowmakingPit ; NUME[:BowmakingPit] = 38
    ENUM[39] = :BlacksmithingPit ; NUME[:BlacksmithingPit] = 39
    ENUM[40] = :ArmorsmithingPit ; NUME[:ArmorsmithingPit] = 40
    ENUM[41] = :MetalCraftingPit ; NUME[:MetalCraftingPit] = 41
    ENUM[42] = :LeatherworkingPit ; NUME[:LeatherworkingPit] = 42
    ENUM[43] = :CarpentryPit ; NUME[:CarpentryPit] = 43
    ENUM[44] = :StoneworkingPit ; NUME[:StoneworkingPit] = 44
    ENUM[45] = :ForgingPit ; NUME[:ForgingPit] = 45
    ENUM[46] = :FightingPit ; NUME[:FightingPit] = 46
    ENUM[53] = :AnimalWorkshop ; NUME[:AnimalWorkshop] = 53
    ENUM[54] = :ClothWorkshop ; NUME[:ClothWorkshop] = 54
    ENUM[55] = :TanningWorkshop ; NUME[:TanningWorkshop] = 55
    ENUM[56] = :ClothClothingWorkshop ; NUME[:ClothClothingWorkshop] = 56
    ENUM[57] = :LeatherClothingWorkshop ; NUME[:LeatherClothingWorkshop] = 57
    ENUM[58] = :BoneCarvingWorkshop ; NUME[:BoneCarvingWorkshop] = 58
    ENUM[59] = :GemCuttingWorkshop ; NUME[:GemCuttingWorkshop] = 59
    ENUM[60] = :WeaponsmithingWorkshop ; NUME[:WeaponsmithingWorkshop] = 60
    ENUM[61] = :BowmakingWorkshop ; NUME[:BowmakingWorkshop] = 61
    ENUM[62] = :BlacksmithingWorkshop ; NUME[:BlacksmithingWorkshop] = 62
    ENUM[63] = :ArmorsmithingWorkshop ; NUME[:ArmorsmithingWorkshop] = 63
    ENUM[64] = :MetalCraftingWorkshop ; NUME[:MetalCraftingWorkshop] = 64
    ENUM[65] = :LeatherworkingShop ; NUME[:LeatherworkingShop] = 65
    ENUM[66] = :CarpentryWorkshop ; NUME[:CarpentryWorkshop] = 66
    ENUM[67] = :StoneworkingWorkshop ; NUME[:StoneworkingWorkshop] = 67
    ENUM[68] = :ForgingWorkshop ; NUME[:ForgingWorkshop] = 68
end

class CmvVersion < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[10000] = :CMV_0 ; NUME[:CMV_0] = 10000
    ENUM[10001] = :CMV_1 ; NUME[:CMV_1] = 10001
end

class CombatReportEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1] = :Deflected ; NUME[:Deflected] = 1
    ENUM[6] = :Unconscious ; NUME[:Unconscious] = 6
    ENUM[7] = :Stunned ; NUME[:Stunned] = 7
    ENUM[8] = :MoreStunned ; NUME[:MoreStunned] = 8
    ENUM[9] = :Winded ; NUME[:Winded] = 9
    ENUM[10] = :MoreWinded ; NUME[:MoreWinded] = 10
    ENUM[11] = :Nausea ; NUME[:Nausea] = 11
    ENUM[12] = :MoreNausea ; NUME[:MoreNausea] = 12
    ENUM[15] = :ExtractInjected ; NUME[:ExtractInjected] = 15
    ENUM[16] = :ExtractSprayed ; NUME[:ExtractSprayed] = 16
    ENUM[17] = :BloodSucked ; NUME[:BloodSucked] = 17
    ENUM[18] = :SeveredPart ; NUME[:SeveredPart] = 18
    ENUM[20] = :KnockedBack ; NUME[:KnockedBack] = 20
    ENUM[21] = :StuckIn ; NUME[:StuckIn] = 21
    ENUM[22] = :LatchOnPart ; NUME[:LatchOnPart] = 22
    ENUM[23] = :LatchOn ; NUME[:LatchOn] = 23
    ENUM[24] = :Enraged ; NUME[:Enraged] = 24
    ENUM[25] = :PassThrough ; NUME[:PassThrough] = 25
    ENUM[26] = :GlancesAway ; NUME[:GlancesAway] = 26
    ENUM[29] = :MajorArtery ; NUME[:MajorArtery] = 29
    ENUM[30] = :Artery ; NUME[:Artery] = 30
    ENUM[31] = :MotorNerve ; NUME[:MotorNerve] = 31
    ENUM[32] = :SensoryNerve ; NUME[:SensoryNerve] = 32
    ENUM[33] = :NoForce ; NUME[:NoForce] = 33
    ENUM[34] = :Interrupted ; NUME[:Interrupted] = 34
end

class ConflictLevel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Encounter ; NUME[:Encounter] = 0
    ENUM[1] = :Horseplay ; NUME[:Horseplay] = 1
    ENUM[2] = :Training ; NUME[:Training] = 2
    ENUM[3] = :Brawl ; NUME[:Brawl] = 3
    ENUM[4] = :Nonlethal ; NUME[:Nonlethal] = 4
    ENUM[5] = :Lethal ; NUME[:Lethal] = 5
    ENUM[6] = :NoQuarter ; NUME[:NoQuarter] = 6
end

class ConstructionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Fortification ; NUME[:Fortification] = 0
    ENUM[1] = :Wall ; NUME[:Wall] = 1
    ENUM[2] = :Floor ; NUME[:Floor] = 2
    ENUM[3] = :UpStair ; NUME[:UpStair] = 3
    ENUM[4] = :DownStair ; NUME[:DownStair] = 4
    ENUM[5] = :UpDownStair ; NUME[:UpDownStair] = 5
    ENUM[6] = :Ramp ; NUME[:Ramp] = 6
    ENUM[7] = :TrackN ; NUME[:TrackN] = 7
    ENUM[8] = :TrackS ; NUME[:TrackS] = 8
    ENUM[9] = :TrackE ; NUME[:TrackE] = 9
    ENUM[10] = :TrackW ; NUME[:TrackW] = 10
    ENUM[11] = :TrackNS ; NUME[:TrackNS] = 11
    ENUM[12] = :TrackNE ; NUME[:TrackNE] = 12
    ENUM[13] = :TrackNW ; NUME[:TrackNW] = 13
    ENUM[14] = :TrackSE ; NUME[:TrackSE] = 14
    ENUM[15] = :TrackSW ; NUME[:TrackSW] = 15
    ENUM[16] = :TrackEW ; NUME[:TrackEW] = 16
    ENUM[17] = :TrackNSE ; NUME[:TrackNSE] = 17
    ENUM[18] = :TrackNSW ; NUME[:TrackNSW] = 18
    ENUM[19] = :TrackNEW ; NUME[:TrackNEW] = 19
    ENUM[20] = :TrackSEW ; NUME[:TrackSEW] = 20
    ENUM[21] = :TrackNSEW ; NUME[:TrackNSEW] = 21
    ENUM[22] = :TrackRampN ; NUME[:TrackRampN] = 22
    ENUM[23] = :TrackRampS ; NUME[:TrackRampS] = 23
    ENUM[24] = :TrackRampE ; NUME[:TrackRampE] = 24
    ENUM[25] = :TrackRampW ; NUME[:TrackRampW] = 25
    ENUM[26] = :TrackRampNS ; NUME[:TrackRampNS] = 26
    ENUM[27] = :TrackRampNE ; NUME[:TrackRampNE] = 27
    ENUM[28] = :TrackRampNW ; NUME[:TrackRampNW] = 28
    ENUM[29] = :TrackRampSE ; NUME[:TrackRampSE] = 29
    ENUM[30] = :TrackRampSW ; NUME[:TrackRampSW] = 30
    ENUM[31] = :TrackRampEW ; NUME[:TrackRampEW] = 31
    ENUM[32] = :TrackRampNSE ; NUME[:TrackRampNSE] = 32
    ENUM[33] = :TrackRampNSW ; NUME[:TrackRampNSW] = 33
    ENUM[34] = :TrackRampNEW ; NUME[:TrackRampNEW] = 34
    ENUM[35] = :TrackRampSEW ; NUME[:TrackRampSEW] = 35
    ENUM[36] = :TrackRampNSEW ; NUME[:TrackRampNSEW] = 36
end

class ConversationMenu < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :RespondGreeting ; NUME[:RespondGreeting] = 0
    ENUM[1] = :MainMenu ; NUME[:MainMenu] = 1
    ENUM[7] = :RespondGoodbye ; NUME[:RespondGoodbye] = 7
    ENUM[9] = :DenyPermissionSleep ; NUME[:DenyPermissionSleep] = 9
    ENUM[10] = :AskJoin ; NUME[:AskJoin] = 10
    ENUM[11] = :RespondJoin ; NUME[:RespondJoin] = 11
    ENUM[12] = :DiscussRescue ; NUME[:DiscussRescue] = 12
    ENUM[13] = :DiscussAgreement ; NUME[:DiscussAgreement] = 13
    ENUM[14] = :DiscussTrade ; NUME[:DiscussTrade] = 14
    ENUM[15] = :DiscussSurroundingArea ; NUME[:DiscussSurroundingArea] = 15
    ENUM[16] = :RespondAccusation ; NUME[:RespondAccusation] = 16
    ENUM[17] = :DiscussFamily ; NUME[:DiscussFamily] = 17
    ENUM[18] = :RespondArmistice ; NUME[:RespondArmistice] = 18
    ENUM[19] = :RespondDemandYield ; NUME[:RespondDemandYield] = 19
    ENUM[23] = :AskDirections ; NUME[:AskDirections] = 23
    ENUM[30] = :Demand ; NUME[:Demand] = 30
    ENUM[34] = :Barter ; NUME[:Barter] = 34
    ENUM[35] = :DiscussHearthpersonDuties ; NUME[:DiscussHearthpersonDuties] = 35
    ENUM[37] = :DiscussJourney ; NUME[:DiscussJourney] = 37
    ENUM[38] = :DiscussGroup ; NUME[:DiscussGroup] = 38
    ENUM[39] = :DiscussConflict ; NUME[:DiscussConflict] = 39
    ENUM[40] = :DiscussSite ; NUME[:DiscussSite] = 40
    ENUM[41] = :RespondDemand ; NUME[:RespondDemand] = 41
    ENUM[43] = :RespondTributeDemand ; NUME[:RespondTributeDemand] = 43
    ENUM[44] = :RespondTributeOffer ; NUME[:RespondTributeOffer] = 44
    ENUM[45] = :DiscussTradeCancellation ; NUME[:DiscussTradeCancellation] = 45
    ENUM[46] = :RespondPeaceOffer ; NUME[:RespondPeaceOffer] = 46
    ENUM[47] = :DiscussAgreementConclusion ; NUME[:DiscussAgreementConclusion] = 47
    ENUM[48] = :RespondAdoptionRequest ; NUME[:RespondAdoptionRequest] = 48
    ENUM[51] = :RespondPositionOffer ; NUME[:RespondPositionOffer] = 51
    ENUM[52] = :RespondInvocation ; NUME[:RespondInvocation] = 52
    ENUM[54] = :AskAboutPerson ; NUME[:AskAboutPerson] = 54
    ENUM[56] = :DiscussFeelings ; NUME[:DiscussFeelings] = 56
    ENUM[65] = :StateGeneralThoughts ; NUME[:StateGeneralThoughts] = 65
    ENUM[66] = :DiscussValues ; NUME[:DiscussValues] = 66
    ENUM[67] = :RespondValues ; NUME[:RespondValues] = 67
    ENUM[68] = :RespondPassiveReply ; NUME[:RespondPassiveReply] = 68
    ENUM[69] = :RespondFlattery ; NUME[:RespondFlattery] = 69
    ENUM[70] = :RespondDismissal ; NUME[:RespondDismissal] = 70
end

class CorpseMaterialType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Plant ; NUME[:Plant] = 0
    ENUM[1] = :Silk ; NUME[:Silk] = 1
    ENUM[2] = :Leather ; NUME[:Leather] = 2
    ENUM[3] = :Bone ; NUME[:Bone] = 3
    ENUM[4] = :Shell ; NUME[:Shell] = 4
    ENUM[6] = :Soap ; NUME[:Soap] = 6
    ENUM[7] = :Tooth ; NUME[:Tooth] = 7
    ENUM[8] = :Horn ; NUME[:Horn] = 8
    ENUM[9] = :Pearl ; NUME[:Pearl] = 9
    ENUM[10] = :HairWool ; NUME[:HairWool] = 10
    ENUM[11] = :Yarn ; NUME[:Yarn] = 11
end

class CraftMaterialClass < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    MakeSkill = Hash.new(:NONE)
    ImproveSkill = Hash.new(:NONE)
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Metal ; NUME[:Metal] = 0 ; MakeSkill[:Metal] = :FORGE_FURNITURE ; ImproveSkill[:Metal] = :METALCRAFT
    ENUM[1] = :Wood ; NUME[:Wood] = 1 ; MakeSkill[:Wood] = :CARPENTRY ; ImproveSkill[:Wood] = :WOODCRAFT
    ENUM[2] = :Gem ; NUME[:Gem] = 2 ; MakeSkill[:Gem] = :CUTGEM ; ImproveSkill[:Gem] = :ENCRUSTGEM
    ENUM[3] = :Glass ; NUME[:Glass] = 3 ; MakeSkill[:Glass] = :GLASSMAKER
    ENUM[4] = :Stone ; NUME[:Stone] = 4 ; MakeSkill[:Stone] = :MASONRY
    ENUM[5] = :Bone ; NUME[:Bone] = 5 ; MakeSkill[:Bone] = :BONECARVE ; ImproveSkill[:Bone] = :BONECARVE
    ENUM[6] = :Ivory ; NUME[:Ivory] = 6 ; MakeSkill[:Ivory] = :BONECARVE ; ImproveSkill[:Ivory] = :BONECARVE
    ENUM[7] = :Horn ; NUME[:Horn] = 7 ; MakeSkill[:Horn] = :BONECARVE ; ImproveSkill[:Horn] = :BONECARVE
    ENUM[8] = :Pearl ; NUME[:Pearl] = 8 ; MakeSkill[:Pearl] = :BONECARVE ; ImproveSkill[:Pearl] = :BONECARVE
    ENUM[9] = :Shell ; NUME[:Shell] = 9 ; MakeSkill[:Shell] = :BONECARVE ; ImproveSkill[:Shell] = :BONECARVE
    ENUM[10] = :Leather ; NUME[:Leather] = 10 ; MakeSkill[:Leather] = :LEATHERWORK ; ImproveSkill[:Leather] = :LEATHERWORK
    ENUM[11] = :Cloth ; NUME[:Cloth] = 11 ; MakeSkill[:Cloth] = :CLOTHESMAKING ; ImproveSkill[:Cloth] = :CLOTHESMAKING
end

class CreationZonePwgAlterationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :LocationDeath ; NUME[:LocationDeath] = 0
    ENUM[1] = :Camp ; NUME[:Camp] = 1
    ENUM[2] = :SrbRuined ; NUME[:SrbRuined] = 2
    ENUM[3] = :SrpRuined ; NUME[:SrpRuined] = 3
end

class CreatureGraphicsRole < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DEFAULT ; NUME[:DEFAULT] = 0
    ENUM[1] = :ADVENTURER ; NUME[:ADVENTURER] = 1
    ENUM[2] = :GUARD ; NUME[:GUARD] = 2
    ENUM[3] = :ROYALGUARD ; NUME[:ROYALGUARD] = 3
    ENUM[4] = :ANIMATED ; NUME[:ANIMATED] = 4
    ENUM[5] = :GHOST ; NUME[:GHOST] = 5
end

class CreatureInteractionEffectTargetMode < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :BY_TYPE ; NUME[:BY_TYPE] = 0
    ENUM[1] = :BY_TOKEN ; NUME[:BY_TOKEN] = 1
    ENUM[2] = :BY_CATEGORY ; NUME[:BY_CATEGORY] = 2
end

class CreatureInteractionEffectType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PAIN ; NUME[:PAIN] = 0
    ENUM[1] = :SWELLING ; NUME[:SWELLING] = 1
    ENUM[2] = :OOZING ; NUME[:OOZING] = 2
    ENUM[3] = :BRUISING ; NUME[:BRUISING] = 3
    ENUM[4] = :BLISTERS ; NUME[:BLISTERS] = 4
    ENUM[5] = :NUMBNESS ; NUME[:NUMBNESS] = 5
    ENUM[6] = :PARALYSIS ; NUME[:PARALYSIS] = 6
    ENUM[7] = :FEVER ; NUME[:FEVER] = 7
    ENUM[8] = :BLEEDING ; NUME[:BLEEDING] = 8
    ENUM[9] = :COUGH_BLOOD ; NUME[:COUGH_BLOOD] = 9
    ENUM[10] = :VOMIT_BLOOD ; NUME[:VOMIT_BLOOD] = 10
    ENUM[11] = :NAUSEA ; NUME[:NAUSEA] = 11
    ENUM[12] = :UNCONSCIOUSNESS ; NUME[:UNCONSCIOUSNESS] = 12
    ENUM[13] = :NECROSIS ; NUME[:NECROSIS] = 13
    ENUM[14] = :IMPAIR_FUNCTION ; NUME[:IMPAIR_FUNCTION] = 14
    ENUM[15] = :DROWSINESS ; NUME[:DROWSINESS] = 15
    ENUM[16] = :DIZZINESS ; NUME[:DIZZINESS] = 16
    ENUM[17] = :ADD_TAG ; NUME[:ADD_TAG] = 17
    ENUM[18] = :REMOVE_TAG ; NUME[:REMOVE_TAG] = 18
    ENUM[19] = :DISPLAY_TILE ; NUME[:DISPLAY_TILE] = 19
    ENUM[20] = :FLASH_TILE ; NUME[:FLASH_TILE] = 20
    ENUM[21] = :SPEED_CHANGE ; NUME[:SPEED_CHANGE] = 21
    ENUM[22] = :CAN_DO_INTERACTION ; NUME[:CAN_DO_INTERACTION] = 22
    ENUM[23] = :SKILL_ROLL_ADJUST ; NUME[:SKILL_ROLL_ADJUST] = 23
    ENUM[24] = :BODY_TRANSFORMATION ; NUME[:BODY_TRANSFORMATION] = 24
    ENUM[25] = :PHYS_ATT_CHANGE ; NUME[:PHYS_ATT_CHANGE] = 25
    ENUM[26] = :MENT_ATT_CHANGE ; NUME[:MENT_ATT_CHANGE] = 26
    ENUM[27] = :MATERIAL_FORCE_MULTIPLIER ; NUME[:MATERIAL_FORCE_MULTIPLIER] = 27
    ENUM[28] = :BODY_MAT_INTERACTION ; NUME[:BODY_MAT_INTERACTION] = 28
    ENUM[29] = :BODY_APPEARANCE_MODIFIER ; NUME[:BODY_APPEARANCE_MODIFIER] = 29
    ENUM[30] = :BP_APPEARANCE_MODIFIER ; NUME[:BP_APPEARANCE_MODIFIER] = 30
    ENUM[31] = :DISPLAY_NAME ; NUME[:DISPLAY_NAME] = 31
    ENUM[32] = :SENSE_CREATURE_CLASS ; NUME[:SENSE_CREATURE_CLASS] = 32
    ENUM[33] = :FEEL_EMOTION ; NUME[:FEEL_EMOTION] = 33
    ENUM[34] = :CHANGE_PERSONALITY ; NUME[:CHANGE_PERSONALITY] = 34
    ENUM[35] = :ERRATIC_BEHAVIOR ; NUME[:ERRATIC_BEHAVIOR] = 35
    ENUM[36] = :SPECIAL_ATTACK_INTERACTION ; NUME[:SPECIAL_ATTACK_INTERACTION] = 36
    ENUM[37] = :REGROW_PARTS ; NUME[:REGROW_PARTS] = 37
    ENUM[38] = :CLOSE_OPEN_WOUNDS ; NUME[:CLOSE_OPEN_WOUNDS] = 38
    ENUM[39] = :HEAL_TISSUES ; NUME[:HEAL_TISSUES] = 39
    ENUM[40] = :HEAL_NERVES ; NUME[:HEAL_NERVES] = 40
    ENUM[41] = :STOP_BLEEDING ; NUME[:STOP_BLEEDING] = 41
    ENUM[42] = :REDUCE_PAIN ; NUME[:REDUCE_PAIN] = 42
    ENUM[43] = :REDUCE_DIZZINESS ; NUME[:REDUCE_DIZZINESS] = 43
    ENUM[44] = :REDUCE_NAUSEA ; NUME[:REDUCE_NAUSEA] = 44
    ENUM[45] = :REDUCE_SWELLING ; NUME[:REDUCE_SWELLING] = 45
    ENUM[46] = :CURE_INFECTION ; NUME[:CURE_INFECTION] = 46
    ENUM[47] = :REDUCE_PARALYSIS ; NUME[:REDUCE_PARALYSIS] = 47
    ENUM[48] = :REDUCE_FEVER ; NUME[:REDUCE_FEVER] = 48
end

class CreatureRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :EQUIPMENT ; NUME[:EQUIPMENT] = 0
    ENUM[1] = :EQUIPMENT_WAGON ; NUME[:EQUIPMENT_WAGON] = 1
    ENUM[2] = :MUNDANE ; NUME[:MUNDANE] = 2
    ENUM[3] = :VERMIN_EATER ; NUME[:VERMIN_EATER] = 3
    ENUM[4] = :VERMIN_GROUNDER ; NUME[:VERMIN_GROUNDER] = 4
    ENUM[5] = :VERMIN_ROTTER ; NUME[:VERMIN_ROTTER] = 5
    ENUM[6] = :VERMIN_SOIL ; NUME[:VERMIN_SOIL] = 6
    ENUM[7] = :VERMIN_SOIL_COLONY ; NUME[:VERMIN_SOIL_COLONY] = 7
    ENUM[8] = :LARGE_ROAMING ; NUME[:LARGE_ROAMING] = 8
    ENUM[9] = :VERMIN_FISH ; NUME[:VERMIN_FISH] = 9
    ENUM[10] = :LOOSE_CLUSTERS ; NUME[:LOOSE_CLUSTERS] = 10
    ENUM[11] = :FANCIFUL ; NUME[:FANCIFUL] = 11
    ENUM[12] = :BIOME_MOUNTAIN ; NUME[:BIOME_MOUNTAIN] = 12
    ENUM[13] = :BIOME_GLACIER ; NUME[:BIOME_GLACIER] = 13
    ENUM[14] = :BIOME_TUNDRA ; NUME[:BIOME_TUNDRA] = 14
    ENUM[15] = :BIOME_SWAMP_TEMPERATE_FRESHWATER ; NUME[:BIOME_SWAMP_TEMPERATE_FRESHWATER] = 15
    ENUM[16] = :BIOME_SWAMP_TEMPERATE_SALTWATER ; NUME[:BIOME_SWAMP_TEMPERATE_SALTWATER] = 16
    ENUM[17] = :BIOME_MARSH_TEMPERATE_FRESHWATER ; NUME[:BIOME_MARSH_TEMPERATE_FRESHWATER] = 17
    ENUM[18] = :BIOME_MARSH_TEMPERATE_SALTWATER ; NUME[:BIOME_MARSH_TEMPERATE_SALTWATER] = 18
    ENUM[19] = :BIOME_SWAMP_TROPICAL_FRESHWATER ; NUME[:BIOME_SWAMP_TROPICAL_FRESHWATER] = 19
    ENUM[20] = :BIOME_SWAMP_TROPICAL_SALTWATER ; NUME[:BIOME_SWAMP_TROPICAL_SALTWATER] = 20
    ENUM[21] = :BIOME_SWAMP_MANGROVE ; NUME[:BIOME_SWAMP_MANGROVE] = 21
    ENUM[22] = :BIOME_MARSH_TROPICAL_FRESHWATER ; NUME[:BIOME_MARSH_TROPICAL_FRESHWATER] = 22
    ENUM[23] = :BIOME_MARSH_TROPICAL_SALTWATER ; NUME[:BIOME_MARSH_TROPICAL_SALTWATER] = 23
    ENUM[24] = :BIOME_FOREST_TAIGA ; NUME[:BIOME_FOREST_TAIGA] = 24
    ENUM[25] = :BIOME_FOREST_TEMPERATE_CONIFER ; NUME[:BIOME_FOREST_TEMPERATE_CONIFER] = 25
    ENUM[26] = :BIOME_FOREST_TEMPERATE_BROADLEAF ; NUME[:BIOME_FOREST_TEMPERATE_BROADLEAF] = 26
    ENUM[27] = :BIOME_FOREST_TROPICAL_CONIFER ; NUME[:BIOME_FOREST_TROPICAL_CONIFER] = 27
    ENUM[28] = :BIOME_FOREST_TROPICAL_DRY_BROADLEAF ; NUME[:BIOME_FOREST_TROPICAL_DRY_BROADLEAF] = 28
    ENUM[29] = :BIOME_FOREST_TROPICAL_MOIST_BROADLEAF ; NUME[:BIOME_FOREST_TROPICAL_MOIST_BROADLEAF] = 29
    ENUM[30] = :BIOME_GRASSLAND_TEMPERATE ; NUME[:BIOME_GRASSLAND_TEMPERATE] = 30
    ENUM[31] = :BIOME_SAVANNA_TEMPERATE ; NUME[:BIOME_SAVANNA_TEMPERATE] = 31
    ENUM[32] = :BIOME_SHRUBLAND_TEMPERATE ; NUME[:BIOME_SHRUBLAND_TEMPERATE] = 32
    ENUM[33] = :BIOME_GRASSLAND_TROPICAL ; NUME[:BIOME_GRASSLAND_TROPICAL] = 33
    ENUM[34] = :BIOME_SAVANNA_TROPICAL ; NUME[:BIOME_SAVANNA_TROPICAL] = 34
    ENUM[35] = :BIOME_SHRUBLAND_TROPICAL ; NUME[:BIOME_SHRUBLAND_TROPICAL] = 35
    ENUM[36] = :BIOME_DESERT_BADLAND ; NUME[:BIOME_DESERT_BADLAND] = 36
    ENUM[37] = :BIOME_DESERT_ROCK ; NUME[:BIOME_DESERT_ROCK] = 37
    ENUM[38] = :BIOME_DESERT_SAND ; NUME[:BIOME_DESERT_SAND] = 38
    ENUM[39] = :BIOME_OCEAN_TROPICAL ; NUME[:BIOME_OCEAN_TROPICAL] = 39
    ENUM[40] = :BIOME_OCEAN_TEMPERATE ; NUME[:BIOME_OCEAN_TEMPERATE] = 40
    ENUM[41] = :BIOME_OCEAN_ARCTIC ; NUME[:BIOME_OCEAN_ARCTIC] = 41
    ENUM[42] = :BIOME_SUBTERRANEAN_WATER ; NUME[:BIOME_SUBTERRANEAN_WATER] = 42
    ENUM[43] = :BIOME_SUBTERRANEAN_CHASM ; NUME[:BIOME_SUBTERRANEAN_CHASM] = 43
    ENUM[44] = :BIOME_SUBTERRANEAN_LAVA ; NUME[:BIOME_SUBTERRANEAN_LAVA] = 44
    ENUM[45] = :BIOME_POOL_TEMPERATE_FRESHWATER ; NUME[:BIOME_POOL_TEMPERATE_FRESHWATER] = 45
    ENUM[46] = :BIOME_POOL_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_POOL_TEMPERATE_BRACKISHWATER] = 46
    ENUM[47] = :BIOME_POOL_TEMPERATE_SALTWATER ; NUME[:BIOME_POOL_TEMPERATE_SALTWATER] = 47
    ENUM[48] = :BIOME_POOL_TROPICAL_FRESHWATER ; NUME[:BIOME_POOL_TROPICAL_FRESHWATER] = 48
    ENUM[49] = :BIOME_POOL_TROPICAL_BRACKISHWATER ; NUME[:BIOME_POOL_TROPICAL_BRACKISHWATER] = 49
    ENUM[50] = :BIOME_POOL_TROPICAL_SALTWATER ; NUME[:BIOME_POOL_TROPICAL_SALTWATER] = 50
    ENUM[51] = :BIOME_LAKE_TEMPERATE_FRESHWATER ; NUME[:BIOME_LAKE_TEMPERATE_FRESHWATER] = 51
    ENUM[52] = :BIOME_LAKE_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_LAKE_TEMPERATE_BRACKISHWATER] = 52
    ENUM[53] = :BIOME_LAKE_TEMPERATE_SALTWATER ; NUME[:BIOME_LAKE_TEMPERATE_SALTWATER] = 53
    ENUM[54] = :BIOME_LAKE_TROPICAL_FRESHWATER ; NUME[:BIOME_LAKE_TROPICAL_FRESHWATER] = 54
    ENUM[55] = :BIOME_LAKE_TROPICAL_BRACKISHWATER ; NUME[:BIOME_LAKE_TROPICAL_BRACKISHWATER] = 55
    ENUM[56] = :BIOME_LAKE_TROPICAL_SALTWATER ; NUME[:BIOME_LAKE_TROPICAL_SALTWATER] = 56
    ENUM[57] = :BIOME_RIVER_TEMPERATE_FRESHWATER ; NUME[:BIOME_RIVER_TEMPERATE_FRESHWATER] = 57
    ENUM[58] = :BIOME_RIVER_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_RIVER_TEMPERATE_BRACKISHWATER] = 58
    ENUM[59] = :BIOME_RIVER_TEMPERATE_SALTWATER ; NUME[:BIOME_RIVER_TEMPERATE_SALTWATER] = 59
    ENUM[60] = :BIOME_RIVER_TROPICAL_FRESHWATER ; NUME[:BIOME_RIVER_TROPICAL_FRESHWATER] = 60
    ENUM[61] = :BIOME_RIVER_TROPICAL_BRACKISHWATER ; NUME[:BIOME_RIVER_TROPICAL_BRACKISHWATER] = 61
    ENUM[62] = :BIOME_RIVER_TROPICAL_SALTWATER ; NUME[:BIOME_RIVER_TROPICAL_SALTWATER] = 62
    ENUM[63] = :GOOD ; NUME[:GOOD] = 63
    ENUM[64] = :EVIL ; NUME[:EVIL] = 64
    ENUM[65] = :SAVAGE ; NUME[:SAVAGE] = 65
    ENUM[66] = :TWO_GENDERS ; NUME[:TWO_GENDERS] = 66
    ENUM[67] = :MATES_TO_BREED ; NUME[:MATES_TO_BREED] = 67
    ENUM[68] = :HAS_MALE ; NUME[:HAS_MALE] = 68
    ENUM[69] = :HAS_FEMALE ; NUME[:HAS_FEMALE] = 69
    ENUM[70] = :SMALL_RACE ; NUME[:SMALL_RACE] = 70
    ENUM[71] = :HAS_ANY_INTELLIGENT_LEARNS ; NUME[:HAS_ANY_INTELLIGENT_LEARNS] = 71
    ENUM[72] = :HAS_ANY_VERMIN_HATEABLE ; NUME[:HAS_ANY_VERMIN_HATEABLE] = 72
    ENUM[73] = :OCCURS_AS_ENTITY_RACE ; NUME[:OCCURS_AS_ENTITY_RACE] = 73
    ENUM[74] = :HAS_ANY_LARGE_PREDATOR ; NUME[:HAS_ANY_LARGE_PREDATOR] = 74
    ENUM[75] = :HAS_ANY_CURIOUS_BEAST ; NUME[:HAS_ANY_CURIOUS_BEAST] = 75
    ENUM[76] = :HAS_ANY_BENIGN ; NUME[:HAS_ANY_BENIGN] = 76
    ENUM[77] = :HAS_ANY_NATURAL_ANIMAL ; NUME[:HAS_ANY_NATURAL_ANIMAL] = 77
    ENUM[78] = :HAS_ANY_MEGABEAST ; NUME[:HAS_ANY_MEGABEAST] = 78
    ENUM[79] = :HAS_ANY_SEMIMEGABEAST ; NUME[:HAS_ANY_SEMIMEGABEAST] = 79
    ENUM[80] = :HAS_ANY_POWER ; NUME[:HAS_ANY_POWER] = 80
    ENUM[81] = :HAS_ANY_VERMIN_MICRO ; NUME[:HAS_ANY_VERMIN_MICRO] = 81
    ENUM[82] = :HAS_ANY_NOT_FIREIMMUNE ; NUME[:HAS_ANY_NOT_FIREIMMUNE] = 82
    ENUM[83] = :HAS_ANY_CANNOT_BREATHE_WATER ; NUME[:HAS_ANY_CANNOT_BREATHE_WATER] = 83
    ENUM[84] = :HAS_ANY_CANNOT_BREATHE_AIR ; NUME[:HAS_ANY_CANNOT_BREATHE_AIR] = 84
    ENUM[85] = :HAS_ANY_NOT_FLIER ; NUME[:HAS_ANY_NOT_FLIER] = 85
    ENUM[86] = :HAS_ANY_CAN_SWIM ; NUME[:HAS_ANY_CAN_SWIM] = 86
    ENUM[87] = :HAS_ANY_COMMON_DOMESTIC ; NUME[:HAS_ANY_COMMON_DOMESTIC] = 87
    ENUM[88] = :HAS_ANY_UTTERANCES ; NUME[:HAS_ANY_UTTERANCES] = 88
    ENUM[89] = :HAS_ANY_INTELLIGENT_SPEAKS ; NUME[:HAS_ANY_INTELLIGENT_SPEAKS] = 89
    ENUM[90] = :HAS_ANY_FEATURE_BEAST ; NUME[:HAS_ANY_FEATURE_BEAST] = 90
    ENUM[91] = :GENERATED ; NUME[:GENERATED] = 91
    ENUM[92] = :HAS_ANY_TITAN ; NUME[:HAS_ANY_TITAN] = 92
    ENUM[93] = :HAS_ANY_UNIQUE_DEMON ; NUME[:HAS_ANY_UNIQUE_DEMON] = 93
    ENUM[94] = :DOES_NOT_EXIST ; NUME[:DOES_NOT_EXIST] = 94
    ENUM[95] = :HAS_ANY_NOT_LIVING ; NUME[:HAS_ANY_NOT_LIVING] = 95
    ENUM[96] = :HAS_ANY_MISCHIEVOUS ; NUME[:HAS_ANY_MISCHIEVOUS] = 96
    ENUM[97] = :HAS_ANY_FLIER ; NUME[:HAS_ANY_FLIER] = 97
    ENUM[98] = :HAS_ANY_DEMON ; NUME[:HAS_ANY_DEMON] = 98
    ENUM[99] = :HAS_ANY_NIGHT_CREATURE ; NUME[:HAS_ANY_NIGHT_CREATURE] = 99
    ENUM[100] = :HAS_ANY_NIGHT_CREATURE_HUNTER ; NUME[:HAS_ANY_NIGHT_CREATURE_HUNTER] = 100
    ENUM[101] = :HAS_ANY_NIGHT_CREATURE_BOGEYMAN ; NUME[:HAS_ANY_NIGHT_CREATURE_BOGEYMAN] = 101
    ENUM[102] = :HAS_ANY_CARNIVORE ; NUME[:HAS_ANY_CARNIVORE] = 102
    ENUM[103] = :ARTIFICIAL_HIVEABLE ; NUME[:ARTIFICIAL_HIVEABLE] = 103
    ENUM[104] = :UBIQUITOUS ; NUME[:UBIQUITOUS] = 104
    ENUM[105] = :ALL_CASTES_ALIVE ; NUME[:ALL_CASTES_ALIVE] = 105
    ENUM[106] = :HAS_ANY_SUPERNATURAL ; NUME[:HAS_ANY_SUPERNATURAL] = 106
    ENUM[107] = :HAS_ANY_HAS_BLOOD ; NUME[:HAS_ANY_HAS_BLOOD] = 107
    ENUM[108] = :HAS_ANY_GRAZER ; NUME[:HAS_ANY_GRAZER] = 108
    ENUM[109] = :HAS_ANY_IMMOBILE ; NUME[:HAS_ANY_IMMOBILE] = 109
    ENUM[110] = :HAS_ANY_LOCAL_POPS_CONTROLLABLE ; NUME[:HAS_ANY_LOCAL_POPS_CONTROLLABLE] = 110
    ENUM[111] = :HAS_ANY_OUTSIDER_CONTROLLABLE ; NUME[:HAS_ANY_OUTSIDER_CONTROLLABLE] = 111
    ENUM[112] = :HAS_ANY_LOCAL_POPS_PRODUCE_HEROES ; NUME[:HAS_ANY_LOCAL_POPS_PRODUCE_HEROES] = 112
    ENUM[113] = :HAS_ANY_GRASP ; NUME[:HAS_ANY_GRASP] = 113
    ENUM[114] = :HAS_ANY_RACE_GAIT ; NUME[:HAS_ANY_RACE_GAIT] = 114
    ENUM[115] = :HAS_ANY_FLY_RACE_GAIT ; NUME[:HAS_ANY_FLY_RACE_GAIT] = 115
    ENUM[116] = :HAS_ANY_SLOW_LEARNER ; NUME[:HAS_ANY_SLOW_LEARNER] = 116
    ENUM[117] = :HAS_ANY_NIGHT_CREATURE_NIGHTMARE ; NUME[:HAS_ANY_NIGHT_CREATURE_NIGHTMARE] = 117
    ENUM[118] = :HAS_ANY_NIGHT_CREATURE_EXPERIMENTER ; NUME[:HAS_ANY_NIGHT_CREATURE_EXPERIMENTER] = 118
end

class CrimeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Bribery ; NUME[:Bribery] = 0
    ENUM[1] = :BringIntoNetwork ; NUME[:BringIntoNetwork] = 1
    ENUM[2] = :Corruption ; NUME[:Corruption] = 2
    ENUM[3] = :Embezzlement ; NUME[:Embezzlement] = 3
end

class CumulusType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CumulusNone ; NUME[:CumulusNone] = 0
    ENUM[1] = :CumulusMedium ; NUME[:CumulusMedium] = 1
    ENUM[2] = :CumulusMulti ; NUME[:CumulusMulti] = 2
    ENUM[3] = :CumulusNimbus ; NUME[:CumulusNimbus] = 3
end

class CursesColor < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Black ; NUME[:Black] = 0
    ENUM[1] = :Blue ; NUME[:Blue] = 1
    ENUM[2] = :Green ; NUME[:Green] = 2
    ENUM[3] = :Cyan ; NUME[:Cyan] = 3
    ENUM[4] = :Red ; NUME[:Red] = 4
    ENUM[5] = :Magenta ; NUME[:Magenta] = 5
    ENUM[6] = :Yellow ; NUME[:Yellow] = 6
    ENUM[7] = :White ; NUME[:White] = 7
end

class DInitEmbarkConfirm < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ALWAYS ; NUME[:ALWAYS] = 0
    ENUM[1] = :IF_POINTS_REMAIN ; NUME[:IF_POINTS_REMAIN] = 1
    ENUM[2] = :NO ; NUME[:NO] = 2
end

class DInitFlags1 < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :VARIED_GROUND_TILES ; NUME[:VARIED_GROUND_TILES] = 0
    ENUM[1] = :ENGRAVINGS_START_OBSCURED ; NUME[:ENGRAVINGS_START_OBSCURED] = 1
    ENUM[2] = :SHOW_IMP_QUALITY ; NUME[:SHOW_IMP_QUALITY] = 2
    ENUM[3] = :SHOW_FLOW_AMOUNTS ; NUME[:SHOW_FLOW_AMOUNTS] = 3
end

class DInitFlags2 < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MORE ; NUME[:MORE] = 0
    ENUM[1] = :ADVENTURER_TRAPS ; NUME[:ADVENTURER_TRAPS] = 1
    ENUM[2] = :ADVENTURER_ALWAYS_CENTER ; NUME[:ADVENTURER_ALWAYS_CENTER] = 2
end

class DInitFlags3 < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :COFFIN_NO_PETS_DEFAULT ; NUME[:COFFIN_NO_PETS_DEFAULT] = 0
end

class DInitFlags4 < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TEMPERATURE ; NUME[:TEMPERATURE] = 0
    ENUM[1] = :WEATHER ; NUME[:WEATHER] = 1
    ENUM[2] = :ECONOMY ; NUME[:ECONOMY] = 2
    ENUM[3] = :ZERO_RENT ; NUME[:ZERO_RENT] = 3
    ENUM[4] = :AUTOSAVE_SEASONAL ; NUME[:AUTOSAVE_SEASONAL] = 4
    ENUM[5] = :AUTOSAVE_YEARLY ; NUME[:AUTOSAVE_YEARLY] = 5
    ENUM[6] = :AUTOSAVE_PAUSE ; NUME[:AUTOSAVE_PAUSE] = 6
    ENUM[7] = :AUTOBACKUP ; NUME[:AUTOBACKUP] = 7
    ENUM[8] = :INITIAL_SAVE ; NUME[:INITIAL_SAVE] = 8
    ENUM[9] = :INVADERS ; NUME[:INVADERS] = 9
    ENUM[10] = :CAVEINS ; NUME[:CAVEINS] = 10
    ENUM[11] = :ARTIFACTS ; NUME[:ARTIFACTS] = 11
    ENUM[12] = :LOG_MAP_REJECTS ; NUME[:LOG_MAP_REJECTS] = 12
    ENUM[13] = :PAUSE_ON_LOAD ; NUME[:PAUSE_ON_LOAD] = 13
    ENUM[14] = :EMBARK_WARNING_ALWAYS ; NUME[:EMBARK_WARNING_ALWAYS] = 14
    ENUM[15] = :SHOW_ALL_HISTORY_IN_DWARF_MODE ; NUME[:SHOW_ALL_HISTORY_IN_DWARF_MODE] = 15
    ENUM[16] = :TESTING_ARENA ; NUME[:TESTING_ARENA] = 16
    ENUM[17] = :WALKING_SPREADS_SPATTER_DWF ; NUME[:WALKING_SPREADS_SPATTER_DWF] = 17
    ENUM[18] = :WALKING_SPREADS_SPATTER_ADV ; NUME[:WALKING_SPREADS_SPATTER_ADV] = 18
end

class DInitIdlers < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :OFF ; NUME[:OFF] = -1
    ENUM[0] = :TOP ; NUME[:TOP] = 0
    ENUM[1] = :BOTTOM ; NUME[:BOTTOM] = 1
end

class DInitNickname < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :REPLACE_FIRST ; NUME[:REPLACE_FIRST] = 0
    ENUM[1] = :CENTRALIZE ; NUME[:CENTRALIZE] = 1
    ENUM[2] = :REPLACE_ALL ; NUME[:REPLACE_ALL] = 2
end

class DInitTunnel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NO ; NUME[:NO] = 0
    ENUM[1] = :FINDER ; NUME[:FINDER] = 1
    ENUM[2] = :ALWAYS ; NUME[:ALWAYS] = 2
end

class DInitZView < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :OFF ; NUME[:OFF] = 0
    ENUM[1] = :UNHIDDEN ; NUME[:UNHIDDEN] = 1
    ENUM[2] = :CREATURE ; NUME[:CREATURE] = 2
    ENUM[3] = :ON ; NUME[:ON] = 3
end

class DanceFormConfiguration < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :SingleLine ; NUME[:SingleLine] = 0
    ENUM[1] = :SeveralLines ; NUME[:SeveralLines] = 1
    ENUM[2] = :Circle ; NUME[:Circle] = 2
    ENUM[3] = :DoubleCircle ; NUME[:DoubleCircle] = 3
    ENUM[4] = :LooselyMingled ; NUME[:LooselyMingled] = 4
end

class DanceFormContext < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Sacred ; NUME[:Sacred] = 0
    ENUM[1] = :Celebration ; NUME[:Celebration] = 1
    ENUM[2] = :Participation ; NUME[:Participation] = 2
    ENUM[3] = :Social ; NUME[:Social] = 3
    ENUM[4] = :Performance ; NUME[:Performance] = 4
    ENUM[5] = :War ; NUME[:War] = 5
end

class DanceFormGroupSize < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Solo ; NUME[:Solo] = 0
    ENUM[1] = :Partner ; NUME[:Partner] = 1
    ENUM[2] = :Group ; NUME[:Group] = 2
end

class DanceFormMoveGroupType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1] = :BasicMovement ; NUME[:BasicMovement] = 1
    ENUM[2] = :DancePosition ; NUME[:DancePosition] = 2
    ENUM[4] = :DanceMove ; NUME[:DanceMove] = 4
end

class DanceFormMoveModifier < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Graceful ; NUME[:Graceful] = 0
    ENUM[1] = :Serene ; NUME[:Serene] = 1
    ENUM[2] = :SharpEdged ; NUME[:SharpEdged] = 2
    ENUM[3] = :Grotesque ; NUME[:Grotesque] = 3
    ENUM[4] = :Crude ; NUME[:Crude] = 4
    ENUM[5] = :Refined ; NUME[:Refined] = 5
    ENUM[6] = :Understated ; NUME[:Understated] = 6
    ENUM[7] = :Delicate ; NUME[:Delicate] = 7
    ENUM[8] = :Elaborate ; NUME[:Elaborate] = 8
    ENUM[9] = :Expressive ; NUME[:Expressive] = 9
    ENUM[10] = :Strong ; NUME[:Strong] = 10
    ENUM[11] = :Large ; NUME[:Large] = 11
    ENUM[12] = :Weightless ; NUME[:Weightless] = 12
    ENUM[13] = :Fluid ; NUME[:Fluid] = 13
    ENUM[14] = :Undulating ; NUME[:Undulating] = 14
    ENUM[15] = :Soft ; NUME[:Soft] = 15
    ENUM[16] = :Jerking ; NUME[:Jerking] = 16
    ENUM[17] = :Calm ; NUME[:Calm] = 17
    ENUM[18] = :StraightLined ; NUME[:StraightLined] = 18
    ENUM[19] = :High ; NUME[:High] = 19
    ENUM[20] = :Low ; NUME[:Low] = 20
    ENUM[21] = :LoudlyPercussive ; NUME[:LoudlyPercussive] = 21
    ENUM[22] = :SoftlyPercussive ; NUME[:SoftlyPercussive] = 22
    ENUM[23] = :Aborted ; NUME[:Aborted] = 23
    ENUM[24] = :PartiallyRealized ; NUME[:PartiallyRealized] = 24
    ENUM[25] = :Energetic ; NUME[:Energetic] = 25
    ENUM[26] = :Passionate ; NUME[:Passionate] = 26
    ENUM[27] = :Vivacious ; NUME[:Vivacious] = 27
    ENUM[28] = :Joyous ; NUME[:Joyous] = 28
    ENUM[29] = :Proud ; NUME[:Proud] = 29
    ENUM[30] = :Flamboyant ; NUME[:Flamboyant] = 30
    ENUM[31] = :Lively ; NUME[:Lively] = 31
    ENUM[32] = :Spirited ; NUME[:Spirited] = 32
    ENUM[33] = :Vigorous ; NUME[:Vigorous] = 33
    ENUM[34] = :Intense ; NUME[:Intense] = 34
    ENUM[35] = :Aggressive ; NUME[:Aggressive] = 35
    ENUM[36] = :Powerful ; NUME[:Powerful] = 36
    ENUM[37] = :Sluggish ; NUME[:Sluggish] = 37
    ENUM[38] = :Relaxed ; NUME[:Relaxed] = 38
    ENUM[39] = :Passive ; NUME[:Passive] = 39
    ENUM[40] = :Subtle ; NUME[:Subtle] = 40
    ENUM[41] = :Sensual ; NUME[:Sensual] = 41
    ENUM[42] = :Debauched ; NUME[:Debauched] = 42
    ENUM[43] = :Twisting ; NUME[:Twisting] = 43
    ENUM[44] = :Sprightly ; NUME[:Sprightly] = 44
    ENUM[45] = :Sinuous ; NUME[:Sinuous] = 45
end

class DanceFormMoveType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SquareStep ; NUME[:SquareStep] = 0
    ENUM[1] = :CircularStep ; NUME[:CircularStep] = 1
    ENUM[2] = :TriangleStep ; NUME[:TriangleStep] = 2
    ENUM[3] = :FigureEightStep ; NUME[:FigureEightStep] = 3
    ENUM[4] = :IntricateStep ; NUME[:IntricateStep] = 4
    ENUM[5] = :Dance ; NUME[:Dance] = 5
    ENUM[6] = :Turn ; NUME[:Turn] = 6
    ENUM[7] = :FacialExpression ; NUME[:FacialExpression] = 7
    ENUM[8] = :HandGesture ; NUME[:HandGesture] = 8
    ENUM[9] = :StraightWalk ; NUME[:StraightWalk] = 9
    ENUM[10] = :CurvedWalk ; NUME[:CurvedWalk] = 10
    ENUM[11] = :Run ; NUME[:Run] = 11
    ENUM[12] = :Leap ; NUME[:Leap] = 12
    ENUM[13] = :Kick ; NUME[:Kick] = 13
    ENUM[14] = :LeftKick ; NUME[:LeftKick] = 14
    ENUM[15] = :RightKick ; NUME[:RightKick] = 15
    ENUM[16] = :LegLift ; NUME[:LegLift] = 16
    ENUM[17] = :LeftLegLift ; NUME[:LeftLegLift] = 17
    ENUM[18] = :RightLegLift ; NUME[:RightLegLift] = 18
    ENUM[19] = :BodyLevel ; NUME[:BodyLevel] = 19
    ENUM[20] = :BodyLevelChange ; NUME[:BodyLevelChange] = 20
    ENUM[21] = :ArmCarriage ; NUME[:ArmCarriage] = 21
    ENUM[22] = :RaisedLeftArm ; NUME[:RaisedLeftArm] = 22
    ENUM[23] = :RaisedRightArm ; NUME[:RaisedRightArm] = 23
    ENUM[24] = :RaisedArms ; NUME[:RaisedArms] = 24
    ENUM[25] = :Spin ; NUME[:Spin] = 25
    ENUM[26] = :IndependentBodyMovement ; NUME[:IndependentBodyMovement] = 26
    ENUM[27] = :Sway ; NUME[:Sway] = 27
    ENUM[28] = :ForwardBend ; NUME[:ForwardBend] = 28
    ENUM[29] = :BackwardBend ; NUME[:BackwardBend] = 29
    ENUM[30] = :LeftwardBend ; NUME[:LeftwardBend] = 30
    ENUM[31] = :RightwardBend ; NUME[:RightwardBend] = 31
    ENUM[32] = :Footwork ; NUME[:Footwork] = 32
    ENUM[33] = :MovementAlongLineOfDance ; NUME[:MovementAlongLineOfDance] = 33
end

class DanceFormMovementPath < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :TurnClockwise ; NUME[:TurnClockwise] = 0
    ENUM[1] = :TurnCounterClockwise ; NUME[:TurnCounterClockwise] = 1
    ENUM[2] = :ImprovisedPath ; NUME[:ImprovisedPath] = 2
    ENUM[3] = :IntricatePath ; NUME[:IntricatePath] = 3
end

class DanceFormPartnerChangeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :LeadAdvanceAlongMainLineOfMotion ; NUME[:LeadAdvanceAlongMainLineOfMotion] = 0
    ENUM[1] = :LeadAdvanceAgainstMainLineOfMotion ; NUME[:LeadAdvanceAgainstMainLineOfMotion] = 1
    ENUM[2] = :LeadTurningOutClockwise ; NUME[:LeadTurningOutClockwise] = 2
    ENUM[3] = :LeadTurningOutCounterClockwise ; NUME[:LeadTurningOutCounterClockwise] = 3
end

class DanceFormPartnerCueFrequency < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Constantly ; NUME[:Constantly] = 0
    ENUM[1] = :Briefly ; NUME[:Briefly] = 1
end

class DanceFormPartnerDistance < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Closely ; NUME[:Closely] = 0
    ENUM[1] = :OpenContact ; NUME[:OpenContact] = 1
    ENUM[2] = :RareContact ; NUME[:RareContact] = 2
end

class DanceFormPartnerIntent < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :PushingTogether ; NUME[:PushingTogether] = 0
    ENUM[1] = :PullingAway ; NUME[:PullingAway] = 1
    ENUM[2] = :Touch ; NUME[:Touch] = 2
    ENUM[3] = :LightTouch ; NUME[:LightTouch] = 3
    ENUM[4] = :VisualCues ; NUME[:VisualCues] = 4
    ENUM[5] = :SpokenCues ; NUME[:SpokenCues] = 5
end

class DeathConditionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NoStatement ; NUME[:NoStatement] = 0
    ENUM[1] = :SiteBattle ; NUME[:SiteBattle] = 1
    ENUM[2] = :RegionBattle ; NUME[:RegionBattle] = 2
    ENUM[3] = :Wilderness ; NUME[:Wilderness] = 3
    ENUM[5] = :Entombed ; NUME[:Entombed] = 5
    ENUM[6] = :Site ; NUME[:Site] = 6
end

class DeathType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :OLD_AGE ; NUME[:OLD_AGE] = 0
    ENUM[1] = :HUNGER ; NUME[:HUNGER] = 1
    ENUM[2] = :THIRST ; NUME[:THIRST] = 2
    ENUM[3] = :SHOT ; NUME[:SHOT] = 3
    ENUM[4] = :BLEED ; NUME[:BLEED] = 4
    ENUM[5] = :DROWN ; NUME[:DROWN] = 5
    ENUM[6] = :SUFFOCATE ; NUME[:SUFFOCATE] = 6
    ENUM[7] = :STRUCK_DOWN ; NUME[:STRUCK_DOWN] = 7
    ENUM[8] = :SCUTTLE ; NUME[:SCUTTLE] = 8
    ENUM[9] = :COLLISION ; NUME[:COLLISION] = 9
    ENUM[10] = :MAGMA ; NUME[:MAGMA] = 10
    ENUM[11] = :MAGMA_MIST ; NUME[:MAGMA_MIST] = 11
    ENUM[12] = :DRAGONFIRE ; NUME[:DRAGONFIRE] = 12
    ENUM[13] = :FIRE ; NUME[:FIRE] = 13
    ENUM[14] = :SCALD ; NUME[:SCALD] = 14
    ENUM[15] = :CAVEIN ; NUME[:CAVEIN] = 15
    ENUM[16] = :DRAWBRIDGE ; NUME[:DRAWBRIDGE] = 16
    ENUM[17] = :FALLING_ROCKS ; NUME[:FALLING_ROCKS] = 17
    ENUM[18] = :CHASM ; NUME[:CHASM] = 18
    ENUM[19] = :CAGE ; NUME[:CAGE] = 19
    ENUM[20] = :MURDER ; NUME[:MURDER] = 20
    ENUM[21] = :TRAP ; NUME[:TRAP] = 21
    ENUM[22] = :VANISH ; NUME[:VANISH] = 22
    ENUM[23] = :QUIT ; NUME[:QUIT] = 23
    ENUM[24] = :ABANDON ; NUME[:ABANDON] = 24
    ENUM[25] = :HEAT ; NUME[:HEAT] = 25
    ENUM[26] = :COLD ; NUME[:COLD] = 26
    ENUM[27] = :SPIKE ; NUME[:SPIKE] = 27
    ENUM[28] = :ENCASE_LAVA ; NUME[:ENCASE_LAVA] = 28
    ENUM[29] = :ENCASE_MAGMA ; NUME[:ENCASE_MAGMA] = 29
    ENUM[30] = :ENCASE_ICE ; NUME[:ENCASE_ICE] = 30
    ENUM[31] = :BEHEAD ; NUME[:BEHEAD] = 31
    ENUM[32] = :CRUCIFY ; NUME[:CRUCIFY] = 32
    ENUM[33] = :BURY_ALIVE ; NUME[:BURY_ALIVE] = 33
    ENUM[34] = :DROWN_ALT ; NUME[:DROWN_ALT] = 34
    ENUM[35] = :BURN_ALIVE ; NUME[:BURN_ALIVE] = 35
    ENUM[36] = :FEED_TO_BEASTS ; NUME[:FEED_TO_BEASTS] = 36
    ENUM[37] = :HACK_TO_PIECES ; NUME[:HACK_TO_PIECES] = 37
    ENUM[38] = :LEAVE_OUT_IN_AIR ; NUME[:LEAVE_OUT_IN_AIR] = 38
    ENUM[39] = :BOIL ; NUME[:BOIL] = 39
    ENUM[40] = :MELT ; NUME[:MELT] = 40
    ENUM[41] = :CONDENSE ; NUME[:CONDENSE] = 41
    ENUM[42] = :SOLIDIFY ; NUME[:SOLIDIFY] = 42
    ENUM[43] = :INFECTION ; NUME[:INFECTION] = 43
    ENUM[44] = :MEMORIALIZE ; NUME[:MEMORIALIZE] = 44
    ENUM[45] = :SCARE ; NUME[:SCARE] = 45
    ENUM[46] = :DARKNESS ; NUME[:DARKNESS] = 46
    ENUM[47] = :COLLAPSE ; NUME[:COLLAPSE] = 47
    ENUM[48] = :DRAIN_BLOOD ; NUME[:DRAIN_BLOOD] = 48
    ENUM[49] = :SLAUGHTER ; NUME[:SLAUGHTER] = 49
    ENUM[50] = :VEHICLE ; NUME[:VEHICLE] = 50
    ENUM[51] = :FALLING_OBJECT ; NUME[:FALLING_OBJECT] = 51
    ENUM[52] = :LEAPT_FROM_HEIGHT ; NUME[:LEAPT_FROM_HEIGHT] = 52
    ENUM[53] = :DROWN_ALT2 ; NUME[:DROWN_ALT2] = 53
    ENUM[54] = :EXECUTION_GENERIC ; NUME[:EXECUTION_GENERIC] = 54
end

class DfhackKnowledgeScholarFlag < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PhilosophyLogicFormalReasoning ; NUME[:PhilosophyLogicFormalReasoning] = 0
    ENUM[1] = :PhilosophyLogicDeductiveReasoning ; NUME[:PhilosophyLogicDeductiveReasoning] = 1
    ENUM[2] = :PhilosophyLogicSyllogisticLogic ; NUME[:PhilosophyLogicSyllogisticLogic] = 2
    ENUM[3] = :PhilosophyLogicHypotheticalSyllogisms ; NUME[:PhilosophyLogicHypotheticalSyllogisms] = 3
    ENUM[4] = :PhilosophyLogicPropositionalLogic ; NUME[:PhilosophyLogicPropositionalLogic] = 4
    ENUM[5] = :PhilosophyLogicDialecticReasoning ; NUME[:PhilosophyLogicDialecticReasoning] = 5
    ENUM[6] = :PhilosophyLogicAnalogicalInference ; NUME[:PhilosophyLogicAnalogicalInference] = 6
    ENUM[7] = :PhilosophyEthicsAppliedMedical ; NUME[:PhilosophyEthicsAppliedMedical] = 7
    ENUM[8] = :PhilosophyEthicsIndividualValue ; NUME[:PhilosophyEthicsIndividualValue] = 8
    ENUM[9] = :PhilosophyEthicsStateConsequentialism ; NUME[:PhilosophyEthicsStateConsequentialism] = 9
    ENUM[10] = :PhilosophyEpistemologyTruth ; NUME[:PhilosophyEpistemologyTruth] = 10
    ENUM[11] = :PhilosophyEpistemologyPerception ; NUME[:PhilosophyEpistemologyPerception] = 11
    ENUM[12] = :PhilosophyEpistemologyJustification ; NUME[:PhilosophyEpistemologyJustification] = 12
    ENUM[13] = :PhilosophyEpistemologyBelief ; NUME[:PhilosophyEpistemologyBelief] = 13
    ENUM[14] = :PhilosophyMetaphysicsExistence ; NUME[:PhilosophyMetaphysicsExistence] = 14
    ENUM[15] = :PhilosophyMetaphysicsTime ; NUME[:PhilosophyMetaphysicsTime] = 15
    ENUM[16] = :PhilosophyMetaphysicsMindBody ; NUME[:PhilosophyMetaphysicsMindBody] = 16
    ENUM[17] = :PhilosophyMetaphysicsObjectsAndProperties ; NUME[:PhilosophyMetaphysicsObjectsAndProperties] = 17
    ENUM[18] = :PhilosophyMetaphysicsWholesAndParts ; NUME[:PhilosophyMetaphysicsWholesAndParts] = 18
    ENUM[19] = :PhilosophyMetaphysicsEvents ; NUME[:PhilosophyMetaphysicsEvents] = 19
    ENUM[20] = :PhilosophyMetaphysicsProcesses ; NUME[:PhilosophyMetaphysicsProcesses] = 20
    ENUM[21] = :PhilosophyMetaphysicsCausation ; NUME[:PhilosophyMetaphysicsCausation] = 21
    ENUM[22] = :PhilosophyEthicsAppliedMilitary ; NUME[:PhilosophyEthicsAppliedMilitary] = 22
    ENUM[23] = :PhilosophyEthicsAppliedInterpersonalConduct ; NUME[:PhilosophyEthicsAppliedInterpersonalConduct] = 23
    ENUM[24] = :PhilosophySpecializedLaw ; NUME[:PhilosophySpecializedLaw] = 24
    ENUM[25] = :PhilosophySpecializedEducation ; NUME[:PhilosophySpecializedEducation] = 25
    ENUM[26] = :PhilosophySpecializedLanguageGrammar ; NUME[:PhilosophySpecializedLanguageGrammar] = 26
    ENUM[27] = :PhilosophySpecializedLanguageEtymology ; NUME[:PhilosophySpecializedLanguageEtymology] = 27
    ENUM[28] = :PhilosophySpecializedPoliticsDiplomacy ; NUME[:PhilosophySpecializedPoliticsDiplomacy] = 28
    ENUM[29] = :PhilosophySpecializedPoliticsGovernmentForms ; NUME[:PhilosophySpecializedPoliticsGovernmentForms] = 29
    ENUM[30] = :PhilosophySpecializedPoliticsEconomicPolicy ; NUME[:PhilosophySpecializedPoliticsEconomicPolicy] = 30
    ENUM[31] = :PhilosophySpecializedPoliticsSocialWelfare ; NUME[:PhilosophySpecializedPoliticsSocialWelfare] = 31
    ENUM[32] = :PhilosophyLogicInductiveReasoning ; NUME[:PhilosophyLogicInductiveReasoning] = 32
    ENUM[33] = :PhilosophyLogicDirectInference ; NUME[:PhilosophyLogicDirectInference] = 33
    ENUM[34] = :PhilosophyAestheticsNatureOfBeauty ; NUME[:PhilosophyAestheticsNatureOfBeauty] = 34
    ENUM[35] = :PhilosophyAestheticsValueOfArt ; NUME[:PhilosophyAestheticsValueOfArt] = 35
    ENUM[36] = :PhilosophySpecializedLanguageDictionary ; NUME[:PhilosophySpecializedLanguageDictionary] = 36
    ENUM[64] = :MathematicsMethodProofByContradiction ; NUME[:MathematicsMethodProofByContradiction] = 64
    ENUM[65] = :MathematicsNotationZero ; NUME[:MathematicsNotationZero] = 65
    ENUM[66] = :MathematicsNotationNegativeNumbers ; NUME[:MathematicsNotationNegativeNumbers] = 66
    ENUM[67] = :MathematicsNotationLargeNumbers ; NUME[:MathematicsNotationLargeNumbers] = 67
    ENUM[68] = :MathematicsNotationPositional ; NUME[:MathematicsNotationPositional] = 68
    ENUM[69] = :MathematicsGeometryBasicObjects ; NUME[:MathematicsGeometryBasicObjects] = 69
    ENUM[70] = :MathematicsMethodExhaustion ; NUME[:MathematicsMethodExhaustion] = 70
    ENUM[71] = :MathematicsGeometrySimilarAndCongruentTriangles ; NUME[:MathematicsGeometrySimilarAndCongruentTriangles] = 71
    ENUM[72] = :MathematicsGeometryGeometricMeanTheorem ; NUME[:MathematicsGeometryGeometricMeanTheorem] = 72
    ENUM[73] = :MathematicsGeometryIsoscelesBaseAnglesEqual ; NUME[:MathematicsGeometryIsoscelesBaseAnglesEqual] = 73
    ENUM[74] = :MathematicsGeometryInscribedTriangleOnDiameterIsRight ; NUME[:MathematicsGeometryInscribedTriangleOnDiameterIsRight] = 74
    ENUM[75] = :MathematicsGeometryPythagoreanTheorem ; NUME[:MathematicsGeometryPythagoreanTheorem] = 75
    ENUM[76] = :MathematicsGeometryPythagoreanTriplesSmall ; NUME[:MathematicsGeometryPythagoreanTriplesSmall] = 76
    ENUM[77] = :MathematicsGeometryPythagoreanTriples3Digit ; NUME[:MathematicsGeometryPythagoreanTriples3Digit] = 77
    ENUM[78] = :MathematicsGeometryPythagoreanTriples4Digit ; NUME[:MathematicsGeometryPythagoreanTriples4Digit] = 78
    ENUM[79] = :MathematicsGeometryExistenceOfIncommensurableRatios ; NUME[:MathematicsGeometryExistenceOfIncommensurableRatios] = 79
    ENUM[80] = :MathematicsMethodAxiomaticReasoning ; NUME[:MathematicsMethodAxiomaticReasoning] = 80
    ENUM[81] = :MathematicsNumbersUniquePrimeFactorization ; NUME[:MathematicsNumbersUniquePrimeFactorization] = 81
    ENUM[82] = :MathematicsNumbersAlgorithmForComputingGcd ; NUME[:MathematicsNumbersAlgorithmForComputingGcd] = 82
    ENUM[83] = :MathematicsGeometryVolumeOfPyramid ; NUME[:MathematicsGeometryVolumeOfPyramid] = 83
    ENUM[84] = :MathematicsGeometryVolumeOfCone ; NUME[:MathematicsGeometryVolumeOfCone] = 84
    ENUM[85] = :MathematicsGeometryVolumeOfSphere ; NUME[:MathematicsGeometryVolumeOfSphere] = 85
    ENUM[86] = :MathematicsGeometryPiTo4Digits ; NUME[:MathematicsGeometryPiTo4Digits] = 86
    ENUM[87] = :MathematicsNumbersDivisionAlgorithm ; NUME[:MathematicsNumbersDivisionAlgorithm] = 87
    ENUM[88] = :MathematicsGeometryTableOfChordValues ; NUME[:MathematicsGeometryTableOfChordValues] = 88
    ENUM[89] = :MathematicsGeometryAreaOfTriangleFromSideLengths ; NUME[:MathematicsGeometryAreaOfTriangleFromSideLengths] = 89
    ENUM[90] = :MathematicsGeometryAreaOfCircle ; NUME[:MathematicsGeometryAreaOfCircle] = 90
    ENUM[91] = :MathematicsGeometryPiTo6Digits ; NUME[:MathematicsGeometryPiTo6Digits] = 91
    ENUM[92] = :MathematicsGeometryDefinitionsAndBasicPropertiesOfConicSections ; NUME[:MathematicsGeometryDefinitionsAndBasicPropertiesOfConicSections] = 92
    ENUM[93] = :MathematicsNumbersChineseRemainderAlgorithm ; NUME[:MathematicsNumbersChineseRemainderAlgorithm] = 93
    ENUM[94] = :MathematicsGeometryAreaEnclosedByLineAndParabola ; NUME[:MathematicsGeometryAreaEnclosedByLineAndParabola] = 94
    ENUM[95] = :MathematicsNumbersSieveAlgorithmForPrimes ; NUME[:MathematicsNumbersSieveAlgorithmForPrimes] = 95
    ENUM[96] = :MathematicsNumbersRoot2To5Digits ; NUME[:MathematicsNumbersRoot2To5Digits] = 96
    ENUM[97] = :MathematicsNumbersInfinitePrimes ; NUME[:MathematicsNumbersInfinitePrimes] = 97
    ENUM[98] = :MathematicsNumbersRoot2Irrational ; NUME[:MathematicsNumbersRoot2Irrational] = 98
    ENUM[99] = :MathematicsGeometrySurfaceAreaOfSphere ; NUME[:MathematicsGeometrySurfaceAreaOfSphere] = 99
    ENUM[100] = :MathematicsAlgebraFiniteSummationFormulas ; NUME[:MathematicsAlgebraFiniteSummationFormulas] = 100
    ENUM[101] = :MathematicsAlgebraSolvingLinearSystems ; NUME[:MathematicsAlgebraSolvingLinearSystems] = 101
    ENUM[102] = :MathematicsAlgebraBalancingAndCompletion ; NUME[:MathematicsAlgebraBalancingAndCompletion] = 102
    ENUM[103] = :MathematicsAlgebraQuadraticByCompletingSquare ; NUME[:MathematicsAlgebraQuadraticByCompletingSquare] = 103
    ENUM[104] = :MathematicsAlgebraQuadraticFormula ; NUME[:MathematicsAlgebraQuadraticFormula] = 104
    ENUM[105] = :MathematicsNotationSyncopatedAlgebra ; NUME[:MathematicsNotationSyncopatedAlgebra] = 105
    ENUM[106] = :MathematicsGeometryLawOfSines ; NUME[:MathematicsGeometryLawOfSines] = 106
    ENUM[107] = :MathematicsGeometryAngleSumDifferenceTrigIdentities ; NUME[:MathematicsGeometryAngleSumDifferenceTrigIdentities] = 107
    ENUM[108] = :MathematicsAlgebraPascalsTriangle ; NUME[:MathematicsAlgebraPascalsTriangle] = 108
    ENUM[109] = :MathematicsAlgebraSolvingHigherOrderPolynomials ; NUME[:MathematicsAlgebraSolvingHigherOrderPolynomials] = 109
    ENUM[110] = :MathematicsNotationEarlySymbolsForOperations ; NUME[:MathematicsNotationEarlySymbolsForOperations] = 110
    ENUM[111] = :MathematicsAlgebraDivergenceOfHarmonicSeries ; NUME[:MathematicsAlgebraDivergenceOfHarmonicSeries] = 111
    ENUM[112] = :MathematicsGeometryPropertiesOfChords ; NUME[:MathematicsGeometryPropertiesOfChords] = 112
    ENUM[128] = :HistorySourcingBasicReliability ; NUME[:HistorySourcingBasicReliability] = 128
    ENUM[129] = :HistorySourcingRoleOfSystemicBias ; NUME[:HistorySourcingRoleOfSystemicBias] = 129
    ENUM[130] = :HistorySourcingRoleOfStateBiasAndPropaganda ; NUME[:HistorySourcingRoleOfStateBiasAndPropaganda] = 130
    ENUM[131] = :HistorySourcingPersonalInterviews ; NUME[:HistorySourcingPersonalInterviews] = 131
    ENUM[132] = :HistoryTheoryHistoricalCausation ; NUME[:HistoryTheoryHistoricalCausation] = 132
    ENUM[133] = :HistoryTheoryHistoricalCycles ; NUME[:HistoryTheoryHistoricalCycles] = 133
    ENUM[134] = :HistoryTheorySocialCohesion ; NUME[:HistoryTheorySocialCohesion] = 134
    ENUM[135] = :HistoryTheorySocialConflict ; NUME[:HistoryTheorySocialConflict] = 135
    ENUM[136] = :HistoryFormBiography ; NUME[:HistoryFormBiography] = 136
    ENUM[137] = :HistoryFormComparativeBiography ; NUME[:HistoryFormComparativeBiography] = 137
    ENUM[138] = :HistoryFormBiographicalDictionaries ; NUME[:HistoryFormBiographicalDictionaries] = 138
    ENUM[139] = :HistoryFormAutobiographicalAdventure ; NUME[:HistoryFormAutobiographicalAdventure] = 139
    ENUM[140] = :HistoryFormGenealogy ; NUME[:HistoryFormGenealogy] = 140
    ENUM[141] = :HistoryFormEncyclopedia ; NUME[:HistoryFormEncyclopedia] = 141
    ENUM[142] = :HistoryFormCulturalHistory ; NUME[:HistoryFormCulturalHistory] = 142
    ENUM[143] = :HistoryFormCulturalComparison ; NUME[:HistoryFormCulturalComparison] = 143
    ENUM[144] = :HistorySourcingRoleOfCulturalDifferences ; NUME[:HistorySourcingRoleOfCulturalDifferences] = 144
    ENUM[145] = :HistoryFormAlternateHistory ; NUME[:HistoryFormAlternateHistory] = 145
    ENUM[146] = :HistorySourcingBasicArchaeology ; NUME[:HistorySourcingBasicArchaeology] = 146
    ENUM[147] = :HistoryFormTreatiseOnTechEvolution ; NUME[:HistoryFormTreatiseOnTechEvolution] = 147
    ENUM[160] = :AstronomyPhasesOfTheMoon ; NUME[:AstronomyPhasesOfTheMoon] = 160
    ENUM[161] = :AstronomySummerWinterMoon ; NUME[:AstronomySummerWinterMoon] = 161
    ENUM[162] = :AstronomyPathOfTheMoon ; NUME[:AstronomyPathOfTheMoon] = 162
    ENUM[163] = :AstronomyTidesAndTheMoon ; NUME[:AstronomyTidesAndTheMoon] = 163
    ENUM[164] = :AstronomyHeightOfTidesVsMoonAndSun ; NUME[:AstronomyHeightOfTidesVsMoonAndSun] = 164
    ENUM[165] = :AstronomySummerWinterSun ; NUME[:AstronomySummerWinterSun] = 165
    ENUM[166] = :AstronomyRelationshipBetweenLunarSolarYear ; NUME[:AstronomyRelationshipBetweenLunarSolarYear] = 166
    ENUM[167] = :AstronomyDaylightVariationWithSolarYear ; NUME[:AstronomyDaylightVariationWithSolarYear] = 167
    ENUM[168] = :AstronomyGeocentricModel ; NUME[:AstronomyGeocentricModel] = 168
    ENUM[169] = :AstronomyHeliocentricModel ; NUME[:AstronomyHeliocentricModel] = 169
    ENUM[170] = :AstronomyDatesOfLunarAndSolarEclipses ; NUME[:AstronomyDatesOfLunarAndSolarEclipses] = 170
    ENUM[171] = :AstronomyStarCharts ; NUME[:AstronomyStarCharts] = 171
    ENUM[172] = :AstronomyStarCatalogues100 ; NUME[:AstronomyStarCatalogues100] = 172
    ENUM[173] = :AstronomyStarCatalogues1000 ; NUME[:AstronomyStarCatalogues1000] = 173
    ENUM[174] = :AstronomyStarColorClassification ; NUME[:AstronomyStarColorClassification] = 174
    ENUM[175] = :AstronomyStarMagnitudeClassification ; NUME[:AstronomyStarMagnitudeClassification] = 175
    ENUM[176] = :AstronomyShapeOfTheWorld ; NUME[:AstronomyShapeOfTheWorld] = 176
    ENUM[177] = :AstronomyPrecessionOfEquinoxes ; NUME[:AstronomyPrecessionOfEquinoxes] = 177
    ENUM[178] = :AstronomyMethodEmpiricalObservation ; NUME[:AstronomyMethodEmpiricalObservation] = 178
    ENUM[179] = :AstronomyMethodPathModels ; NUME[:AstronomyMethodPathModels] = 179
    ENUM[192] = :NaturalistMethodDissection ; NUME[:NaturalistMethodDissection] = 192
    ENUM[193] = :NaturalistObservationAnatomy ; NUME[:NaturalistObservationAnatomy] = 193
    ENUM[194] = :NaturalistTheoryComparativeAnatomy ; NUME[:NaturalistTheoryComparativeAnatomy] = 194
    ENUM[195] = :NaturalistTheoryClassificationByPhysicalFeatures ; NUME[:NaturalistTheoryClassificationByPhysicalFeatures] = 195
    ENUM[196] = :NaturalistObservationMigrationPatterns ; NUME[:NaturalistObservationMigrationPatterns] = 196
    ENUM[197] = :NaturalistObservationReproductiveBehavior ; NUME[:NaturalistObservationReproductiveBehavior] = 197
    ENUM[198] = :NaturalistObservationForagingBehaviorAndDiet ; NUME[:NaturalistObservationForagingBehaviorAndDiet] = 198
    ENUM[199] = :NaturalistTheoryFoodChain ; NUME[:NaturalistTheoryFoodChain] = 199
    ENUM[200] = :NaturalistObservationSocialBehavior ; NUME[:NaturalistObservationSocialBehavior] = 200
    ENUM[201] = :NaturalistObservationDiseases ; NUME[:NaturalistObservationDiseases] = 201
    ENUM[202] = :NaturalistTheoryClimacticAdaptation ; NUME[:NaturalistTheoryClimacticAdaptation] = 202
    ENUM[203] = :NaturalistObservationEmbriologicalDevelopment ; NUME[:NaturalistObservationEmbriologicalDevelopment] = 203
    ENUM[204] = :NaturalistTheoryStruggleForExistence ; NUME[:NaturalistTheoryStruggleForExistence] = 204
    ENUM[224] = :ChemistryClassificationCombustibles ; NUME[:ChemistryClassificationCombustibles] = 224
    ENUM[225] = :ChemistryClassificationOres ; NUME[:ChemistryClassificationOres] = 225
    ENUM[226] = :ChemistryMetallurgyAlloys ; NUME[:ChemistryMetallurgyAlloys] = 226
    ENUM[227] = :ChemistryClassificationScratchTest ; NUME[:ChemistryClassificationScratchTest] = 227
    ENUM[228] = :ChemistryClassificationElementalTheory ; NUME[:ChemistryClassificationElementalTheory] = 228
    ENUM[229] = :ChemistryChemicalsAdhesives ; NUME[:ChemistryChemicalsAdhesives] = 229
    ENUM[230] = :ChemistryLaboratoryBlastFurnace ; NUME[:ChemistryLaboratoryBlastFurnace] = 230
    ENUM[231] = :ChemistryLaboratoryAlembic ; NUME[:ChemistryLaboratoryAlembic] = 231
    ENUM[232] = :ChemistryLaboratoryTheoryOfLiquidLiquidExtraction ; NUME[:ChemistryLaboratoryTheoryOfLiquidLiquidExtraction] = 232
    ENUM[233] = :ChemistryLaboratoryTheoryOfDistillation ; NUME[:ChemistryLaboratoryTheoryOfDistillation] = 233
    ENUM[234] = :ChemistryLaboratoryTheoryOfEvaporation ; NUME[:ChemistryLaboratoryTheoryOfEvaporation] = 234
    ENUM[235] = :ChemistryClassificationAlkaliAndAcids ; NUME[:ChemistryClassificationAlkaliAndAcids] = 235
    ENUM[236] = :ChemistryLaboratorySystematicExperiments ; NUME[:ChemistryLaboratorySystematicExperiments] = 236
    ENUM[237] = :ChemistryLaboratoryGlassFlask ; NUME[:ChemistryLaboratoryGlassFlask] = 237
    ENUM[238] = :ChemistryLaboratoryGlassBeaker ; NUME[:ChemistryLaboratoryGlassBeaker] = 238
    ENUM[239] = :ChemistryLaboratoryGlassVial ; NUME[:ChemistryLaboratoryGlassVial] = 239
    ENUM[240] = :ChemistryLaboratoryGlassFunnel ; NUME[:ChemistryLaboratoryGlassFunnel] = 240
    ENUM[241] = :ChemistryLaboratoryCrucible ; NUME[:ChemistryLaboratoryCrucible] = 241
    ENUM[242] = :ChemistryChemicalsNitricAcid ; NUME[:ChemistryChemicalsNitricAcid] = 242
    ENUM[243] = :ChemistryChemicalsSulfuricAcid ; NUME[:ChemistryChemicalsSulfuricAcid] = 243
    ENUM[244] = :ChemistryChemicalsAquaRegia ; NUME[:ChemistryChemicalsAquaRegia] = 244
    ENUM[245] = :ChemistryLaboratoryGlassAmpoule ; NUME[:ChemistryLaboratoryGlassAmpoule] = 245
    ENUM[246] = :ChemistryLaboratoryGlassRetort ; NUME[:ChemistryLaboratoryGlassRetort] = 246
    ENUM[247] = :ChemistryLaboratoryLabOvens ; NUME[:ChemistryLaboratoryLabOvens] = 247
    ENUM[256] = :GeographySurveyingBasic ; NUME[:GeographySurveyingBasic] = 256
    ENUM[257] = :GeographySurveyingStaff ; NUME[:GeographySurveyingStaff] = 257
    ENUM[258] = :GeographyCartographyBasic ; NUME[:GeographyCartographyBasic] = 258
    ENUM[259] = :GeographySurveyingTriangulation ; NUME[:GeographySurveyingTriangulation] = 259
    ENUM[260] = :GeographySurveyingCartographical ; NUME[:GeographySurveyingCartographical] = 260
    ENUM[261] = :GeographySurveyingLand ; NUME[:GeographySurveyingLand] = 261
    ENUM[262] = :GeographySurveyingMilitary ; NUME[:GeographySurveyingMilitary] = 262
    ENUM[263] = :GeographySurveyingEngineering ; NUME[:GeographySurveyingEngineering] = 263
    ENUM[264] = :GeographyCartographyGeological ; NUME[:GeographyCartographyGeological] = 264
    ENUM[265] = :GeographyCartographyGridSystem ; NUME[:GeographyCartographyGridSystem] = 265
    ENUM[266] = :GeographyCartographyDistanceScale ; NUME[:GeographyCartographyDistanceScale] = 266
    ENUM[267] = :GeographyCartographyHeightMeasurements ; NUME[:GeographyCartographyHeightMeasurements] = 267
    ENUM[268] = :GeographyMethodEconomicDataCollection ; NUME[:GeographyMethodEconomicDataCollection] = 268
    ENUM[269] = :GeographyCartographyEconomic ; NUME[:GeographyCartographyEconomic] = 269
    ENUM[270] = :GeographyFormAtlas ; NUME[:GeographyFormAtlas] = 270
    ENUM[271] = :GeographyTheoryDeltaFormation ; NUME[:GeographyTheoryDeltaFormation] = 271
    ENUM[272] = :GeographyTheoryWindPatterns ; NUME[:GeographyTheoryWindPatterns] = 272
    ENUM[273] = :GeographyTheoryOriginOfRainfallFromEvapCondense ; NUME[:GeographyTheoryOriginOfRainfallFromEvapCondense] = 273
    ENUM[274] = :GeographyTheoryWaterCycle ; NUME[:GeographyTheoryWaterCycle] = 274
    ENUM[275] = :GeographyTheoryLatitudeClimateZones ; NUME[:GeographyTheoryLatitudeClimateZones] = 275
    ENUM[276] = :GeographyCartographyAccurateMaps ; NUME[:GeographyCartographyAccurateMaps] = 276
    ENUM[277] = :GeographyCartographyMapProjections ; NUME[:GeographyCartographyMapProjections] = 277
    ENUM[288] = :MedicineTheoryDiseaseAndFouledWater ; NUME[:MedicineTheoryDiseaseAndFouledWater] = 288
    ENUM[289] = :MedicineMethodPhysicalExamination ; NUME[:MedicineMethodPhysicalExamination] = 289
    ENUM[290] = :MedicineMethodAutopsy ; NUME[:MedicineMethodAutopsy] = 290
    ENUM[291] = :MedicineTheoryPrognosis ; NUME[:MedicineTheoryPrognosis] = 291
    ENUM[292] = :MedicineToolHerbalRemedies ; NUME[:MedicineToolHerbalRemedies] = 292
    ENUM[293] = :MedicineToolAnimalRemedies ; NUME[:MedicineToolAnimalRemedies] = 293
    ENUM[294] = :MedicineToolMineralRemedies ; NUME[:MedicineToolMineralRemedies] = 294
    ENUM[295] = :MedicineToolBandages ; NUME[:MedicineToolBandages] = 295
    ENUM[296] = :MedicineTheoryDiseaseClassification ; NUME[:MedicineTheoryDiseaseClassification] = 296
    ENUM[297] = :MedicineTheoryToxicology ; NUME[:MedicineTheoryToxicology] = 297
    ENUM[298] = :MedicineTheoryAcuteAndChronicConditions ; NUME[:MedicineTheoryAcuteAndChronicConditions] = 298
    ENUM[299] = :MedicineTheoryEndemicDisease ; NUME[:MedicineTheoryEndemicDisease] = 299
    ENUM[300] = :MedicineTheoryEpidemicDisease ; NUME[:MedicineTheoryEpidemicDisease] = 300
    ENUM[301] = :MedicineTheoryExacerbation ; NUME[:MedicineTheoryExacerbation] = 301
    ENUM[302] = :MedicineTheoryParoxysm ; NUME[:MedicineTheoryParoxysm] = 302
    ENUM[303] = :MedicineTheoryRelapse ; NUME[:MedicineTheoryRelapse] = 303
    ENUM[304] = :MedicineTheoryConvalescence ; NUME[:MedicineTheoryConvalescence] = 304
    ENUM[305] = :MedicineMethodTreatmentOfTraumaticInjuries ; NUME[:MedicineMethodTreatmentOfTraumaticInjuries] = 305
    ENUM[306] = :MedicineMethodFractureTreatment ; NUME[:MedicineMethodFractureTreatment] = 306
    ENUM[307] = :MedicineTheoryFractureClassification ; NUME[:MedicineTheoryFractureClassification] = 307
    ENUM[308] = :MedicineToolTractionBench ; NUME[:MedicineToolTractionBench] = 308
    ENUM[309] = :MedicineMethodFractureImmobilization ; NUME[:MedicineMethodFractureImmobilization] = 309
    ENUM[310] = :MedicineToolOrthopedicCast ; NUME[:MedicineToolOrthopedicCast] = 310
    ENUM[311] = :MedicineMethodSurgeryExcision ; NUME[:MedicineMethodSurgeryExcision] = 311
    ENUM[312] = :MedicineMethodSurgeryIncision ; NUME[:MedicineMethodSurgeryIncision] = 312
    ENUM[313] = :MedicineMethodHerniaSurgery ; NUME[:MedicineMethodHerniaSurgery] = 313
    ENUM[314] = :MedicineMethodTracheotomySurgery ; NUME[:MedicineMethodTracheotomySurgery] = 314
    ENUM[315] = :MedicineMethodLithotomySurgery ; NUME[:MedicineMethodLithotomySurgery] = 315
    ENUM[316] = :MedicineMethodSurgeryScraping ; NUME[:MedicineMethodSurgeryScraping] = 316
    ENUM[317] = :MedicineMethodSurgeryDraining ; NUME[:MedicineMethodSurgeryDraining] = 317
    ENUM[318] = :MedicineMethodSurgeryProbing ; NUME[:MedicineMethodSurgeryProbing] = 318
    ENUM[319] = :MedicineMethodSurgerySuturing ; NUME[:MedicineMethodSurgerySuturing] = 319
    ENUM[320] = :MedicineMethodSurgeryLigature ; NUME[:MedicineMethodSurgeryLigature] = 320
    ENUM[321] = :MedicineTheorySurgicalModels ; NUME[:MedicineTheorySurgicalModels] = 321
    ENUM[322] = :MedicineToolMudBagsAsSurgicalModels ; NUME[:MedicineToolMudBagsAsSurgicalModels] = 322
    ENUM[323] = :MedicineToolPlantsAsSurgicalModels ; NUME[:MedicineToolPlantsAsSurgicalModels] = 323
    ENUM[324] = :MedicineToolAnimalsAsSurgicalModels ; NUME[:MedicineToolAnimalsAsSurgicalModels] = 324
    ENUM[325] = :MedicineTheorySpecializedSurgicalInstruments ; NUME[:MedicineTheorySpecializedSurgicalInstruments] = 325
    ENUM[326] = :MedicineToolForceps ; NUME[:MedicineToolForceps] = 326
    ENUM[327] = :MedicineToolScalpel ; NUME[:MedicineToolScalpel] = 327
    ENUM[328] = :MedicineToolSurgicalScissors ; NUME[:MedicineToolSurgicalScissors] = 328
    ENUM[329] = :MedicineToolSurgicalNeedles ; NUME[:MedicineToolSurgicalNeedles] = 329
    ENUM[330] = :MedicineMethodCataractSurgery ; NUME[:MedicineMethodCataractSurgery] = 330
    ENUM[331] = :MedicineMethodCauterization ; NUME[:MedicineMethodCauterization] = 331
    ENUM[332] = :MedicineMethodAnesthesia ; NUME[:MedicineMethodAnesthesia] = 332
    ENUM[333] = :MedicineTheoryPulmonaryMedicine ; NUME[:MedicineTheoryPulmonaryMedicine] = 333
    ENUM[334] = :MedicineTheoryAnatomicalStudies ; NUME[:MedicineTheoryAnatomicalStudies] = 334
    ENUM[335] = :MedicineTheoryClassificationOfBodilyFluids ; NUME[:MedicineTheoryClassificationOfBodilyFluids] = 335
    ENUM[336] = :MedicineTheoryEyeAnatomy ; NUME[:MedicineTheoryEyeAnatomy] = 336
    ENUM[337] = :MedicineTheoryMotorVsSensoryNerves ; NUME[:MedicineTheoryMotorVsSensoryNerves] = 337
    ENUM[338] = :MedicineTheoryNervousSystemFunction ; NUME[:MedicineTheoryNervousSystemFunction] = 338
    ENUM[339] = :MedicineTheoryReactionTime ; NUME[:MedicineTheoryReactionTime] = 339
    ENUM[340] = :MedicineTheoryBloodVessels ; NUME[:MedicineTheoryBloodVessels] = 340
    ENUM[341] = :MedicineTheoryPulmonaryCirculation ; NUME[:MedicineTheoryPulmonaryCirculation] = 341
    ENUM[342] = :MedicineTheoryComparativeAnatomy ; NUME[:MedicineTheoryComparativeAnatomy] = 342
    ENUM[343] = :MedicineTheoryTheVoice ; NUME[:MedicineTheoryTheVoice] = 343
    ENUM[344] = :MedicineTheoryClassificationOfMuscles ; NUME[:MedicineTheoryClassificationOfMuscles] = 344
    ENUM[345] = :MedicineTheoryClassificationOfMentalIllnesses ; NUME[:MedicineTheoryClassificationOfMentalIllnesses] = 345
    ENUM[346] = :MedicineTheoryTreatmentOfMentalIllnesses ; NUME[:MedicineTheoryTreatmentOfMentalIllnesses] = 346
    ENUM[347] = :MedicineToolDedicatedHospitals ; NUME[:MedicineToolDedicatedHospitals] = 347
    ENUM[348] = :MedicineMethodProfessionalHospitalStaff ; NUME[:MedicineMethodProfessionalHospitalStaff] = 348
    ENUM[349] = :MedicineMethodSpecializedWards ; NUME[:MedicineMethodSpecializedWards] = 349
    ENUM[350] = :MedicineMethodHospitalLab ; NUME[:MedicineMethodHospitalLab] = 350
    ENUM[351] = :MedicineMethodMedicalSchool ; NUME[:MedicineMethodMedicalSchool] = 351
    ENUM[352] = :MedicineMethodAsylumForMentallyIll ; NUME[:MedicineMethodAsylumForMentallyIll] = 352
    ENUM[384] = :EngineeringHorologyShadowClock ; NUME[:EngineeringHorologyShadowClock] = 384
    ENUM[385] = :EngineeringHorologyWaterClock ; NUME[:EngineeringHorologyWaterClock] = 385
    ENUM[386] = :EngineeringHorologyConicalWaterClock ; NUME[:EngineeringHorologyConicalWaterClock] = 386
    ENUM[387] = :EngineeringHorologyWaterClockReservoir ; NUME[:EngineeringHorologyWaterClockReservoir] = 387
    ENUM[388] = :EngineeringHorologyAstrarium ; NUME[:EngineeringHorologyAstrarium] = 388
    ENUM[389] = :EngineeringHorologyHourglass ; NUME[:EngineeringHorologyHourglass] = 389
    ENUM[390] = :EngineeringHorologyMechanicalClock ; NUME[:EngineeringHorologyMechanicalClock] = 390
    ENUM[391] = :EngineeringMachineTheoryOfPulley ; NUME[:EngineeringMachineTheoryOfPulley] = 391
    ENUM[392] = :EngineeringMachinePulley ; NUME[:EngineeringMachinePulley] = 392
    ENUM[393] = :EngineeringMachineTheoryOfScrew ; NUME[:EngineeringMachineTheoryOfScrew] = 393
    ENUM[394] = :EngineeringMachineScrew ; NUME[:EngineeringMachineScrew] = 394
    ENUM[395] = :EngineeringMachineTheoryOfWheelAndAxle ; NUME[:EngineeringMachineTheoryOfWheelAndAxle] = 395
    ENUM[396] = :EngineeringMachineWindlass ; NUME[:EngineeringMachineWindlass] = 396
    ENUM[397] = :EngineeringMachineTheoryOfWedge ; NUME[:EngineeringMachineTheoryOfWedge] = 397
    ENUM[398] = :EngineeringMachineTheoryOfLever ; NUME[:EngineeringMachineTheoryOfLever] = 398
    ENUM[399] = :EngineeringMachineLever ; NUME[:EngineeringMachineLever] = 399
    ENUM[400] = :EngineeringMachineStraightBeamBalance ; NUME[:EngineeringMachineStraightBeamBalance] = 400
    ENUM[401] = :EngineeringMachineTheoryOfGears ; NUME[:EngineeringMachineTheoryOfGears] = 401
    ENUM[402] = :EngineeringMachineWardedLock ; NUME[:EngineeringMachineWardedLock] = 402
    ENUM[403] = :EngineeringMachineTumblerLock ; NUME[:EngineeringMachineTumblerLock] = 403
    ENUM[404] = :EngineeringMachinePadlock ; NUME[:EngineeringMachinePadlock] = 404
    ENUM[405] = :EngineeringMachineCamshaft ; NUME[:EngineeringMachineCamshaft] = 405
    ENUM[406] = :EngineeringMachineCrankshaft ; NUME[:EngineeringMachineCrankshaft] = 406
    ENUM[407] = :EngineeringMachineWaterPoweredSawmill ; NUME[:EngineeringMachineWaterPoweredSawmill] = 407
    ENUM[408] = :EngineeringMachineChariotOdometer ; NUME[:EngineeringMachineChariotOdometer] = 408
    ENUM[409] = :EngineeringMachineChainDrive ; NUME[:EngineeringMachineChainDrive] = 409
    ENUM[410] = :EngineeringMachineMechanicalCompass ; NUME[:EngineeringMachineMechanicalCompass] = 410
    ENUM[411] = :EngineeringMachineDifferentialGear ; NUME[:EngineeringMachineDifferentialGear] = 411
    ENUM[412] = :EngineeringMachineCombinationLock ; NUME[:EngineeringMachineCombinationLock] = 412
    ENUM[413] = :EngineeringMachineVergeEscapement ; NUME[:EngineeringMachineVergeEscapement] = 413
    ENUM[414] = :EngineeringMachineBalanceWheel ; NUME[:EngineeringMachineBalanceWheel] = 414
    ENUM[415] = :EngineeringFluidTheoryOfSiphon ; NUME[:EngineeringFluidTheoryOfSiphon] = 415
    ENUM[416] = :EngineeringFluidValves ; NUME[:EngineeringFluidValves] = 416
    ENUM[417] = :EngineeringFluidForcePump ; NUME[:EngineeringFluidForcePump] = 417
    ENUM[418] = :EngineeringOpticsCrystalLens ; NUME[:EngineeringOpticsCrystalLens] = 418
    ENUM[419] = :EngineeringOpticsWaterFilledSpheres ; NUME[:EngineeringOpticsWaterFilledSpheres] = 419
    ENUM[420] = :EngineeringOpticsGlassLens ; NUME[:EngineeringOpticsGlassLens] = 420
    ENUM[421] = :EngineeringOpticsCameraObscura ; NUME[:EngineeringOpticsCameraObscura] = 421
    ENUM[422] = :EngineeringOpticsParabolicMirror ; NUME[:EngineeringOpticsParabolicMirror] = 422
    ENUM[423] = :EngineeringOpticsTheoryOfColor ; NUME[:EngineeringOpticsTheoryOfColor] = 423
    ENUM[424] = :EngineeringOpticsTheoryOfRainbows ; NUME[:EngineeringOpticsTheoryOfRainbows] = 424
    ENUM[425] = :EngineeringOpticsLawOfRefraction ; NUME[:EngineeringOpticsLawOfRefraction] = 425
    ENUM[426] = :EngineeringDesignModelsAndTemplates ; NUME[:EngineeringDesignModelsAndTemplates] = 426
    ENUM[427] = :EngineeringConstructionWoodLamination ; NUME[:EngineeringConstructionWoodLamination] = 427
    ENUM[428] = :EngineeringAstronomyDioptra ; NUME[:EngineeringAstronomyDioptra] = 428
    ENUM[429] = :EngineeringAstronomyAstrolabe ; NUME[:EngineeringAstronomyAstrolabe] = 429
    ENUM[430] = :EngineeringAstronomyArmillarySphere ; NUME[:EngineeringAstronomyArmillarySphere] = 430
    ENUM[431] = :EngineeringAstronomySphericalAstrolabe ; NUME[:EngineeringAstronomySphericalAstrolabe] = 431
    ENUM[432] = :EngineeringAstronomyMuralInstrument ; NUME[:EngineeringAstronomyMuralInstrument] = 432
    ENUM[433] = :EngineeringAstronomyOrrery ; NUME[:EngineeringAstronomyOrrery] = 433
    ENUM[434] = :EngineeringMachineWaterPoweredTripHammer ; NUME[:EngineeringMachineWaterPoweredTripHammer] = 434
    ENUM[435] = :EngineeringMachineDoubleActingPistonBellows ; NUME[:EngineeringMachineDoubleActingPistonBellows] = 435
    ENUM[436] = :EngineeringFluidArchimedesPrinciple ; NUME[:EngineeringFluidArchimedesPrinciple] = 436
    ENUM[437] = :EngineeringOpticsAtmosphericRefraction ; NUME[:EngineeringOpticsAtmosphericRefraction] = 437
    ENUM[438] = :EngineeringOpticsCauseOfTwilight ; NUME[:EngineeringOpticsCauseOfTwilight] = 438
    ENUM[439] = :EngineeringOpticsHeightOfAtmosphere ; NUME[:EngineeringOpticsHeightOfAtmosphere] = 439
    ENUM[440] = :EngineeringMachinePiston ; NUME[:EngineeringMachinePiston] = 440
    ENUM[441] = :EngineeringMachineCrank ; NUME[:EngineeringMachineCrank] = 441
    ENUM[442] = :EngineeringMachineBellows ; NUME[:EngineeringMachineBellows] = 442
    ENUM[443] = :EngineeringMachineWaterPoweredPistonBellows ; NUME[:EngineeringMachineWaterPoweredPistonBellows] = 443
    ENUM[444] = :EngineeringMachineWaterWheel ; NUME[:EngineeringMachineWaterWheel] = 444
    ENUM[445] = :EngineeringMachineTripHammer ; NUME[:EngineeringMachineTripHammer] = 445
end

class DfhackRoomQualityLevel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    MinValue = Hash.new
    Office = Hash.new
    Bedroom = Hash.new
    DiningRoom = Hash.new
    Burial = Hash.new
    ENUM[0] = :Meager ; NUME[:Meager] = 0 ; MinValue[:Meager] = 0 ; Office[:Meager] = 'Meager Office' ; Bedroom[:Meager] = 'Meager Quarters' ; DiningRoom[:Meager] = 'Meager Dining Room' ; Burial[:Meager] = 'Grave'
    ENUM[1] = :Modest ; NUME[:Modest] = 1 ; MinValue[:Modest] = 100 ; Office[:Modest] = 'Modest Office' ; Bedroom[:Modest] = 'Modest Quarters' ; DiningRoom[:Modest] = 'Modest Dining Room' ; Burial[:Modest] = 'Servant\'s Burial Chamber'
    ENUM[2] = :Normal ; NUME[:Normal] = 2 ; MinValue[:Normal] = 250 ; Office[:Normal] = 'Office' ; Bedroom[:Normal] = 'Quarters' ; DiningRoom[:Normal] = 'Dining Room' ; Burial[:Normal] = 'Burial Chamber'
    ENUM[3] = :Decent ; NUME[:Decent] = 3 ; MinValue[:Decent] = 500 ; Office[:Decent] = 'Decent Office' ; Bedroom[:Decent] = 'Decent Quarters' ; DiningRoom[:Decent] = 'Decent Dining Room' ; Burial[:Decent] = 'Tomb'
    ENUM[4] = :Fine ; NUME[:Fine] = 4 ; MinValue[:Fine] = 1000 ; Office[:Fine] = 'Splendid Office' ; Bedroom[:Fine] = 'Fine Quarters' ; DiningRoom[:Fine] = 'Fine Dining Room' ; Burial[:Fine] = 'Fine Tomb'
    ENUM[5] = :Great ; NUME[:Great] = 5 ; MinValue[:Great] = 1500 ; Office[:Great] = 'Throne Room' ; Bedroom[:Great] = 'Great Bedroom' ; DiningRoom[:Great] = 'Great Dining Room' ; Burial[:Great] = 'Mausoleum'
    ENUM[6] = :Grand ; NUME[:Grand] = 6 ; MinValue[:Grand] = 2500 ; Office[:Grand] = 'Opulent Throne Room' ; Bedroom[:Grand] = 'Grand Bedroom' ; DiningRoom[:Grand] = 'Grand Dining Room' ; Burial[:Grand] = 'Grand Mausoleum'
    ENUM[7] = :Royal ; NUME[:Royal] = 7 ; MinValue[:Royal] = 10000 ; Office[:Royal] = 'Royal Throne Room' ; Bedroom[:Royal] = 'Royal Bedroom' ; DiningRoom[:Royal] = 'Royal Dining Room' ; Burial[:Royal] = 'Royal Mausoleum'
end

class EmbarkFinderOption < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DimensionX ; NUME[:DimensionX] = 0
    ENUM[1] = :DimensionY ; NUME[:DimensionY] = 1
    ENUM[2] = :Savagery ; NUME[:Savagery] = 2
    ENUM[3] = :Evil ; NUME[:Evil] = 3
    ENUM[4] = :Elevation ; NUME[:Elevation] = 4
    ENUM[5] = :Temperature ; NUME[:Temperature] = 5
    ENUM[6] = :Rain ; NUME[:Rain] = 6
    ENUM[7] = :Drainage ; NUME[:Drainage] = 7
    ENUM[8] = :FluxStone ; NUME[:FluxStone] = 8
    ENUM[9] = :AquiferLight ; NUME[:AquiferLight] = 9
    ENUM[10] = :AquiferHeavy ; NUME[:AquiferHeavy] = 10
    ENUM[11] = :River ; NUME[:River] = 11
    ENUM[12] = :UndergroundRiver ; NUME[:UndergroundRiver] = 12
    ENUM[13] = :UndergroundPool ; NUME[:UndergroundPool] = 13
    ENUM[14] = :MagmaPool ; NUME[:MagmaPool] = 14
    ENUM[15] = :MagmaPipe ; NUME[:MagmaPipe] = 15
    ENUM[16] = :Chasm ; NUME[:Chasm] = 16
    ENUM[17] = :BottomlessPit ; NUME[:BottomlessPit] = 17
    ENUM[18] = :OtherFeatures ; NUME[:OtherFeatures] = 18
    ENUM[19] = :ShallowMetal ; NUME[:ShallowMetal] = 19
    ENUM[20] = :DeepMetal ; NUME[:DeepMetal] = 20
    ENUM[21] = :Soil ; NUME[:Soil] = 21
    ENUM[22] = :Clay ; NUME[:Clay] = 22
end

class EmotionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Color = Hash.new(7)
    Divider = Hash.new
    ENUM[-1] = :ANYTHING ; NUME[:ANYTHING] = -1
    ENUM[0] = :ACCEPTANCE ; NUME[:ACCEPTANCE] = 0 ; Color[:ACCEPTANCE] = 7 ; Divider[:ACCEPTANCE] = -8
    ENUM[1] = :ADORATION ; NUME[:ADORATION] = 1 ; Color[:ADORATION] = 11 ; Divider[:ADORATION] = -1
    ENUM[2] = :AFFECTION ; NUME[:AFFECTION] = 2 ; Color[:AFFECTION] = 11 ; Divider[:AFFECTION] = -2
    ENUM[3] = :AGITATION ; NUME[:AGITATION] = 3 ; Color[:AGITATION] = 6 ; Divider[:AGITATION] = 4
    ENUM[4] = :AGGRAVATION ; NUME[:AGGRAVATION] = 4 ; Color[:AGGRAVATION] = 6 ; Divider[:AGGRAVATION] = 4
    ENUM[5] = :AGONY ; NUME[:AGONY] = 5 ; Color[:AGONY] = 14 ; Divider[:AGONY] = 1
    ENUM[6] = :ALARM ; NUME[:ALARM] = 6 ; Color[:ALARM] = 12 ; Divider[:ALARM] = 4
    ENUM[7] = :ALIENATION ; NUME[:ALIENATION] = 7 ; Color[:ALIENATION] = 6 ; Divider[:ALIENATION] = 8
    ENUM[8] = :AMAZEMENT ; NUME[:AMAZEMENT] = 8 ; Color[:AMAZEMENT] = 9 ; Divider[:AMAZEMENT] = 0
    ENUM[9] = :AMBIVALENCE ; NUME[:AMBIVALENCE] = 9 ; Color[:AMBIVALENCE] = 7 ; Divider[:AMBIVALENCE] = 0
    ENUM[10] = :AMUSEMENT ; NUME[:AMUSEMENT] = 10 ; Color[:AMUSEMENT] = 10 ; Divider[:AMUSEMENT] = -4
    ENUM[11] = :ANGER ; NUME[:ANGER] = 11 ; Color[:ANGER] = 12 ; Divider[:ANGER] = 2
    ENUM[12] = :ANGST ; NUME[:ANGST] = 12 ; Color[:ANGST] = 14 ; Divider[:ANGST] = 1
    ENUM[13] = :ANGUISH ; NUME[:ANGUISH] = 13 ; Color[:ANGUISH] = 14 ; Divider[:ANGUISH] = 1
    ENUM[14] = :ANNOYANCE ; NUME[:ANNOYANCE] = 14 ; Color[:ANNOYANCE] = 6 ; Divider[:ANNOYANCE] = 8
    ENUM[16] = :ANXIETY ; NUME[:ANXIETY] = 16 ; Color[:ANXIETY] = 6 ; Divider[:ANXIETY] = 4
    ENUM[17] = :APATHY ; NUME[:APATHY] = 17 ; Color[:APATHY] = 7 ; Divider[:APATHY] = 0
    ENUM[19] = :AROUSAL ; NUME[:AROUSAL] = 19 ; Color[:AROUSAL] = 11 ; Divider[:AROUSAL] = -8
    ENUM[20] = :ASTONISHMENT ; NUME[:ASTONISHMENT] = 20 ; Color[:ASTONISHMENT] = 9 ; Divider[:ASTONISHMENT] = 0
    ENUM[22] = :AVERSION ; NUME[:AVERSION] = 22 ; Color[:AVERSION] = 6 ; Divider[:AVERSION] = 4
    ENUM[23] = :AWE ; NUME[:AWE] = 23 ; Color[:AWE] = 9 ; Divider[:AWE] = 0
    ENUM[24] = :BITTERNESS ; NUME[:BITTERNESS] = 24 ; Color[:BITTERNESS] = 6 ; Divider[:BITTERNESS] = 2
    ENUM[25] = :BLISS ; NUME[:BLISS] = 25 ; Color[:BLISS] = 10 ; Divider[:BLISS] = -1
    ENUM[26] = :BOREDOM ; NUME[:BOREDOM] = 26 ; Color[:BOREDOM] = 6 ; Divider[:BOREDOM] = 8
    ENUM[27] = :CARING ; NUME[:CARING] = 27 ; Color[:CARING] = 11 ; Divider[:CARING] = -2
    ENUM[29] = :CONFUSION ; NUME[:CONFUSION] = 29 ; Color[:CONFUSION] = 6 ; Divider[:CONFUSION] = 8
    ENUM[30] = :CONTEMPT ; NUME[:CONTEMPT] = 30 ; Color[:CONTEMPT] = 6 ; Divider[:CONTEMPT] = 4
    ENUM[31] = :CONTENTMENT ; NUME[:CONTENTMENT] = 31 ; Color[:CONTENTMENT] = 10 ; Divider[:CONTENTMENT] = -8
    ENUM[34] = :DEFEAT ; NUME[:DEFEAT] = 34 ; Color[:DEFEAT] = 14 ; Divider[:DEFEAT] = 2
    ENUM[35] = :DEJECTION ; NUME[:DEJECTION] = 35 ; Color[:DEJECTION] = 6 ; Divider[:DEJECTION] = 4
    ENUM[36] = :DELIGHT ; NUME[:DELIGHT] = 36 ; Color[:DELIGHT] = 10 ; Divider[:DELIGHT] = -1
    ENUM[39] = :DESPAIR ; NUME[:DESPAIR] = 39 ; Color[:DESPAIR] = 14 ; Divider[:DESPAIR] = 1
    ENUM[40] = :DISAPPOINTMENT ; NUME[:DISAPPOINTMENT] = 40 ; Color[:DISAPPOINTMENT] = 6 ; Divider[:DISAPPOINTMENT] = 8
    ENUM[41] = :DISGUST ; NUME[:DISGUST] = 41 ; Color[:DISGUST] = 14 ; Divider[:DISGUST] = 4
    ENUM[42] = :DISILLUSIONMENT ; NUME[:DISILLUSIONMENT] = 42 ; Color[:DISILLUSIONMENT] = 6 ; Divider[:DISILLUSIONMENT] = 8
    ENUM[43] = :DISLIKE ; NUME[:DISLIKE] = 43 ; Color[:DISLIKE] = 6 ; Divider[:DISLIKE] = 8
    ENUM[44] = :DISMAY ; NUME[:DISMAY] = 44 ; Color[:DISMAY] = 14 ; Divider[:DISMAY] = 2
    ENUM[45] = :DISPLEASURE ; NUME[:DISPLEASURE] = 45 ; Color[:DISPLEASURE] = 6 ; Divider[:DISPLEASURE] = 8
    ENUM[46] = :DISTRESS ; NUME[:DISTRESS] = 46 ; Color[:DISTRESS] = 14 ; Divider[:DISTRESS] = 2
    ENUM[47] = :DOUBT ; NUME[:DOUBT] = 47 ; Color[:DOUBT] = 6 ; Divider[:DOUBT] = 8
    ENUM[49] = :EAGERNESS ; NUME[:EAGERNESS] = 49 ; Color[:EAGERNESS] = 9 ; Divider[:EAGERNESS] = -4
    ENUM[51] = :ELATION ; NUME[:ELATION] = 51 ; Color[:ELATION] = 10 ; Divider[:ELATION] = -2
    ENUM[52] = :EMBARRASSMENT ; NUME[:EMBARRASSMENT] = 52 ; Color[:EMBARRASSMENT] = 6 ; Divider[:EMBARRASSMENT] = 8
    ENUM[53] = :EMPATHY ; NUME[:EMPATHY] = 53 ; Color[:EMPATHY] = 11 ; Divider[:EMPATHY] = -2
    ENUM[54] = :EMPTINESS ; NUME[:EMPTINESS] = 54 ; Color[:EMPTINESS] = 14 ; Divider[:EMPTINESS] = 4
    ENUM[55] = :ENJOYMENT ; NUME[:ENJOYMENT] = 55 ; Color[:ENJOYMENT] = 10 ; Divider[:ENJOYMENT] = -8
    ENUM[57] = :ENTHUSIASM ; NUME[:ENTHUSIASM] = 57 ; Color[:ENTHUSIASM] = 10 ; Divider[:ENTHUSIASM] = -8
    ENUM[59] = :EUPHORIA ; NUME[:EUPHORIA] = 59 ; Color[:EUPHORIA] = 10 ; Divider[:EUPHORIA] = -1
    ENUM[60] = :EXASPERATION ; NUME[:EXASPERATION] = 60 ; Color[:EXASPERATION] = 6 ; Divider[:EXASPERATION] = 8
    ENUM[61] = :EXCITEMENT ; NUME[:EXCITEMENT] = 61 ; Color[:EXCITEMENT] = 9 ; Divider[:EXCITEMENT] = -2
    ENUM[62] = :EXHILARATION ; NUME[:EXHILARATION] = 62 ; Color[:EXHILARATION] = 9 ; Divider[:EXHILARATION] = -2
    ENUM[63] = :EXPECTANCY ; NUME[:EXPECTANCY] = 63 ; Color[:EXPECTANCY] = 10 ; Divider[:EXPECTANCY] = -8
    ENUM[64] = :FEAR ; NUME[:FEAR] = 64 ; Color[:FEAR] = 12 ; Divider[:FEAR] = 1
    ENUM[65] = :FEROCITY ; NUME[:FEROCITY] = 65 ; Color[:FEROCITY] = 12 ; Divider[:FEROCITY] = 2
    ENUM[66] = :FONDNESS ; NUME[:FONDNESS] = 66 ; Color[:FONDNESS] = 11 ; Divider[:FONDNESS] = -8
    ENUM[67] = :FREEDOM ; NUME[:FREEDOM] = 67 ; Color[:FREEDOM] = 10 ; Divider[:FREEDOM] = -4
    ENUM[68] = :FRIGHT ; NUME[:FRIGHT] = 68 ; Color[:FRIGHT] = 14 ; Divider[:FRIGHT] = 2
    ENUM[69] = :FRUSTRATION ; NUME[:FRUSTRATION] = 69 ; Color[:FRUSTRATION] = 6 ; Divider[:FRUSTRATION] = 8
    ENUM[71] = :GAIETY ; NUME[:GAIETY] = 71 ; Color[:GAIETY] = 10 ; Divider[:GAIETY] = -2
    ENUM[73] = :GLEE ; NUME[:GLEE] = 73 ; Color[:GLEE] = 10 ; Divider[:GLEE] = -2
    ENUM[74] = :GLOOM ; NUME[:GLOOM] = 74 ; Color[:GLOOM] = 6 ; Divider[:GLOOM] = 4
    ENUM[75] = :GLUMNESS ; NUME[:GLUMNESS] = 75 ; Color[:GLUMNESS] = 6 ; Divider[:GLUMNESS] = 8
    ENUM[76] = :GRATITUDE ; NUME[:GRATITUDE] = 76 ; Color[:GRATITUDE] = 11 ; Divider[:GRATITUDE] = -4
    ENUM[78] = :GRIEF ; NUME[:GRIEF] = 78 ; Color[:GRIEF] = 14 ; Divider[:GRIEF] = 2
    ENUM[79] = :GRIM_SATISFACTION ; NUME[:GRIM_SATISFACTION] = 79 ; Color[:GRIM_SATISFACTION] = 13 ; Divider[:GRIM_SATISFACTION] = 0
    ENUM[80] = :GROUCHINESS ; NUME[:GROUCHINESS] = 80 ; Color[:GROUCHINESS] = 6 ; Divider[:GROUCHINESS] = 8
    ENUM[81] = :GRUMPINESS ; NUME[:GRUMPINESS] = 81 ; Color[:GRUMPINESS] = 6 ; Divider[:GRUMPINESS] = 8
    ENUM[82] = :GUILT ; NUME[:GUILT] = 82 ; Color[:GUILT] = 6 ; Divider[:GUILT] = 4
    ENUM[83] = :HAPPINESS ; NUME[:HAPPINESS] = 83 ; Color[:HAPPINESS] = 10 ; Divider[:HAPPINESS] = -2
    ENUM[84] = :HATRED ; NUME[:HATRED] = 84 ; Color[:HATRED] = 12 ; Divider[:HATRED] = 2
    ENUM[86] = :HOPE ; NUME[:HOPE] = 86 ; Color[:HOPE] = 10 ; Divider[:HOPE] = -2
    ENUM[87] = :HOPELESSNESS ; NUME[:HOPELESSNESS] = 87 ; Color[:HOPELESSNESS] = 14 ; Divider[:HOPELESSNESS] = 2
    ENUM[88] = :HORROR ; NUME[:HORROR] = 88 ; Color[:HORROR] = 12 ; Divider[:HORROR] = 1
    ENUM[90] = :HUMILIATION ; NUME[:HUMILIATION] = 90 ; Color[:HUMILIATION] = 14 ; Divider[:HUMILIATION] = 4
    ENUM[95] = :INSULT ; NUME[:INSULT] = 95 ; Color[:INSULT] = 6 ; Divider[:INSULT] = 4
    ENUM[96] = :INTEREST ; NUME[:INTEREST] = 96 ; Color[:INTEREST] = 9 ; Divider[:INTEREST] = -8
    ENUM[97] = :IRRITATION ; NUME[:IRRITATION] = 97 ; Color[:IRRITATION] = 6 ; Divider[:IRRITATION] = 8
    ENUM[98] = :ISOLATION ; NUME[:ISOLATION] = 98 ; Color[:ISOLATION] = 6 ; Divider[:ISOLATION] = 4
    ENUM[100] = :JOLLINESS ; NUME[:JOLLINESS] = 100 ; Color[:JOLLINESS] = 10 ; Divider[:JOLLINESS] = -4
    ENUM[101] = :JOVIALITY ; NUME[:JOVIALITY] = 101 ; Color[:JOVIALITY] = 10 ; Divider[:JOVIALITY] = -2
    ENUM[102] = :JOY ; NUME[:JOY] = 102 ; Color[:JOY] = 10 ; Divider[:JOY] = -1
    ENUM[103] = :JUBILATION ; NUME[:JUBILATION] = 103 ; Color[:JUBILATION] = 10 ; Divider[:JUBILATION] = -1
    ENUM[105] = :LOATHING ; NUME[:LOATHING] = 105 ; Color[:LOATHING] = 12 ; Divider[:LOATHING] = 2
    ENUM[106] = :LONELINESS ; NUME[:LONELINESS] = 106 ; Color[:LONELINESS] = 6 ; Divider[:LONELINESS] = 4
    ENUM[108] = :LOVE ; NUME[:LOVE] = 108 ; Color[:LOVE] = 11 ; Divider[:LOVE] = -1
    ENUM[110] = :LUST ; NUME[:LUST] = 110 ; Color[:LUST] = 11 ; Divider[:LUST] = -8
    ENUM[112] = :MISERY ; NUME[:MISERY] = 112 ; Color[:MISERY] = 14 ; Divider[:MISERY] = 1
    ENUM[113] = :MORTIFICATION ; NUME[:MORTIFICATION] = 113 ; Color[:MORTIFICATION] = 14 ; Divider[:MORTIFICATION] = 2
    ENUM[115] = :NERVOUSNESS ; NUME[:NERVOUSNESS] = 115 ; Color[:NERVOUSNESS] = 6 ; Divider[:NERVOUSNESS] = 8
    ENUM[116] = :NOSTALGIA ; NUME[:NOSTALGIA] = 116 ; Color[:NOSTALGIA] = 9 ; Divider[:NOSTALGIA] = -8
    ENUM[117] = :OPTIMISM ; NUME[:OPTIMISM] = 117 ; Color[:OPTIMISM] = 10 ; Divider[:OPTIMISM] = -4
    ENUM[118] = :OUTRAGE ; NUME[:OUTRAGE] = 118 ; Color[:OUTRAGE] = 12 ; Divider[:OUTRAGE] = 2
    ENUM[119] = :PANIC ; NUME[:PANIC] = 119 ; Color[:PANIC] = 14 ; Divider[:PANIC] = 1
    ENUM[120] = :PATIENCE ; NUME[:PATIENCE] = 120 ; Color[:PATIENCE] = 7 ; Divider[:PATIENCE] = -8
    ENUM[121] = :PASSION ; NUME[:PASSION] = 121 ; Color[:PASSION] = 11 ; Divider[:PASSION] = -2
    ENUM[122] = :PESSIMISM ; NUME[:PESSIMISM] = 122 ; Color[:PESSIMISM] = 6 ; Divider[:PESSIMISM] = 8
    ENUM[124] = :PLEASURE ; NUME[:PLEASURE] = 124 ; Color[:PLEASURE] = 11 ; Divider[:PLEASURE] = -4
    ENUM[125] = :PRIDE ; NUME[:PRIDE] = 125 ; Color[:PRIDE] = 11 ; Divider[:PRIDE] = -4
    ENUM[126] = :RAGE ; NUME[:RAGE] = 126 ; Color[:RAGE] = 12 ; Divider[:RAGE] = 1
    ENUM[127] = :RAPTURE ; NUME[:RAPTURE] = 127 ; Color[:RAPTURE] = 11 ; Divider[:RAPTURE] = -1
    ENUM[128] = :REJECTION ; NUME[:REJECTION] = 128 ; Color[:REJECTION] = 6 ; Divider[:REJECTION] = 4
    ENUM[129] = :RELIEF ; NUME[:RELIEF] = 129 ; Color[:RELIEF] = 10 ; Divider[:RELIEF] = -2
    ENUM[130] = :REGRET ; NUME[:REGRET] = 130 ; Color[:REGRET] = 6 ; Divider[:REGRET] = 8
    ENUM[131] = :REMORSE ; NUME[:REMORSE] = 131 ; Color[:REMORSE] = 6 ; Divider[:REMORSE] = 4
    ENUM[132] = :REPENTANCE ; NUME[:REPENTANCE] = 132 ; Color[:REPENTANCE] = 9 ; Divider[:REPENTANCE] = -2
    ENUM[133] = :RESENTMENT ; NUME[:RESENTMENT] = 133 ; Color[:RESENTMENT] = 6 ; Divider[:RESENTMENT] = 8
    ENUM[135] = :RIGHTEOUS_INDIGNATION ; NUME[:RIGHTEOUS_INDIGNATION] = 135 ; Color[:RIGHTEOUS_INDIGNATION] = 6 ; Divider[:RIGHTEOUS_INDIGNATION] = 8
    ENUM[136] = :SADNESS ; NUME[:SADNESS] = 136 ; Color[:SADNESS] = 14 ; Divider[:SADNESS] = 4
    ENUM[137] = :SATISFACTION ; NUME[:SATISFACTION] = 137 ; Color[:SATISFACTION] = 10 ; Divider[:SATISFACTION] = -8
    ENUM[139] = :SELF_PITY ; NUME[:SELF_PITY] = 139 ; Color[:SELF_PITY] = 6 ; Divider[:SELF_PITY] = 8
    ENUM[141] = :SERVILE ; NUME[:SERVILE] = 141 ; Color[:SERVILE] = 9 ; Divider[:SERVILE] = 0
    ENUM[142] = :SHAKEN ; NUME[:SHAKEN] = 142 ; Color[:SHAKEN] = 14 ; Divider[:SHAKEN] = 1
    ENUM[143] = :SHAME ; NUME[:SHAME] = 143 ; Color[:SHAME] = 14 ; Divider[:SHAME] = 4
    ENUM[144] = :SHOCK ; NUME[:SHOCK] = 144 ; Color[:SHOCK] = 14 ; Divider[:SHOCK] = 1
    ENUM[149] = :SUSPICION ; NUME[:SUSPICION] = 149 ; Color[:SUSPICION] = 13 ; Divider[:SUSPICION] = 8
    ENUM[150] = :SYMPATHY ; NUME[:SYMPATHY] = 150 ; Color[:SYMPATHY] = 11 ; Divider[:SYMPATHY] = -8
    ENUM[151] = :TENDERNESS ; NUME[:TENDERNESS] = 151 ; Color[:TENDERNESS] = 11 ; Divider[:TENDERNESS] = -2
    ENUM[153] = :TERROR ; NUME[:TERROR] = 153 ; Color[:TERROR] = 12 ; Divider[:TERROR] = 1
    ENUM[154] = :THRILL ; NUME[:THRILL] = 154 ; Color[:THRILL] = 9 ; Divider[:THRILL] = -2
    ENUM[156] = :TRIUMPH ; NUME[:TRIUMPH] = 156 ; Color[:TRIUMPH] = 10 ; Divider[:TRIUMPH] = -2
    ENUM[157] = :UNEASINESS ; NUME[:UNEASINESS] = 157 ; Color[:UNEASINESS] = 6 ; Divider[:UNEASINESS] = 8
    ENUM[158] = :UNHAPPINESS ; NUME[:UNHAPPINESS] = 158 ; Color[:UNHAPPINESS] = 6 ; Divider[:UNHAPPINESS] = 4
    ENUM[159] = :VENGEFULNESS ; NUME[:VENGEFULNESS] = 159 ; Color[:VENGEFULNESS] = 12 ; Divider[:VENGEFULNESS] = 4
    ENUM[161] = :WONDER ; NUME[:WONDER] = 161 ; Color[:WONDER] = 9 ; Divider[:WONDER] = -8
    ENUM[162] = :WORRY ; NUME[:WORRY] = 162 ; Color[:WORRY] = 6 ; Divider[:WORRY] = 8
    ENUM[163] = :WRATH ; NUME[:WRATH] = 163 ; Color[:WRATH] = 12 ; Divider[:WRATH] = 1
    ENUM[164] = :ZEAL ; NUME[:ZEAL] = 164 ; Color[:ZEAL] = 9 ; Divider[:ZEAL] = -4
    ENUM[168] = :RESTLESS ; NUME[:RESTLESS] = 168 ; Color[:RESTLESS] = 6 ; Divider[:RESTLESS] = 8
    ENUM[169] = :ADMIRATION ; NUME[:ADMIRATION] = 169 ; Color[:ADMIRATION] = 11 ; Divider[:ADMIRATION] = -8
end

class EntityActionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :EntityPrimaryCriminals ; NUME[:EntityPrimaryCriminals] = 0
    ENUM[1] = :EntityRelocate ; NUME[:EntityRelocate] = 1
end

class EntityEntityLinkType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PARENT ; NUME[:PARENT] = 0
    ENUM[1] = :CHILD ; NUME[:CHILD] = 1
    ENUM[2] = :RELIGIOUS ; NUME[:RELIGIOUS] = 2
end

class EntityEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Invasion ; NUME[:Invasion] = 0
    ENUM[1] = :Abduction ; NUME[:Abduction] = 1
    ENUM[2] = :Incident ; NUME[:Incident] = 2
    ENUM[3] = :Occupation ; NUME[:Occupation] = 3
    ENUM[4] = :Beast ; NUME[:Beast] = 4
    ENUM[5] = :Group ; NUME[:Group] = 5
    ENUM[6] = :Harass ; NUME[:Harass] = 6
    ENUM[7] = :Flee ; NUME[:Flee] = 7
    ENUM[8] = :Abandon ; NUME[:Abandon] = 8
    ENUM[9] = :Reclaimed ; NUME[:Reclaimed] = 9
    ENUM[10] = :Founded ; NUME[:Founded] = 10
    ENUM[11] = :Reclaiming ; NUME[:Reclaiming] = 11
    ENUM[12] = :Founding ; NUME[:Founding] = 12
    ENUM[13] = :Leave ; NUME[:Leave] = 13
    ENUM[14] = :Insurrection ; NUME[:Insurrection] = 14
    ENUM[15] = :InsurrectionEnd ; NUME[:InsurrectionEnd] = 15
    ENUM[16] = :Succession ; NUME[:Succession] = 16
    ENUM[17] = :Claim ; NUME[:Claim] = 17
    ENUM[18] = :AcceptTributeOffer ; NUME[:AcceptTributeOffer] = 18
    ENUM[19] = :RefuseTributeOffer ; NUME[:RefuseTributeOffer] = 19
    ENUM[20] = :AcceptTributeDemand ; NUME[:AcceptTributeDemand] = 20
    ENUM[21] = :RefuseTributeDemand ; NUME[:RefuseTributeDemand] = 21
    ENUM[22] = :AcceptPeaceOffer ; NUME[:AcceptPeaceOffer] = 22
    ENUM[23] = :RefusePeaceOffer ; NUME[:RefusePeaceOffer] = 23
    ENUM[24] = :CeaseTributeOffer ; NUME[:CeaseTributeOffer] = 24
    ENUM[25] = :ArtifactInSite ; NUME[:ArtifactInSite] = 25
    ENUM[26] = :ArtifactInSubregion ; NUME[:ArtifactInSubregion] = 26
    ENUM[27] = :ArtifactInFeatureLayer ; NUME[:ArtifactInFeatureLayer] = 27
    ENUM[28] = :ArtifactInInventory ; NUME[:ArtifactInInventory] = 28
    ENUM[29] = :ArtifactNotInSite ; NUME[:ArtifactNotInSite] = 29
    ENUM[30] = :ArtifactNotInSubregion ; NUME[:ArtifactNotInSubregion] = 30
    ENUM[31] = :ArtifactNotInFeatureLayer ; NUME[:ArtifactNotInFeatureLayer] = 31
    ENUM[32] = :ArtifactNotInInventory ; NUME[:ArtifactNotInInventory] = 32
    ENUM[33] = :ArtifactWasDestroyed ; NUME[:ArtifactWasDestroyed] = 33
end

class EntityMaterialCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Clothing ; NUME[:Clothing] = 0
    ENUM[1] = :Leather ; NUME[:Leather] = 1
    ENUM[2] = :Cloth ; NUME[:Cloth] = 2
    ENUM[3] = :Wood ; NUME[:Wood] = 3
    ENUM[4] = :Crafts ; NUME[:Crafts] = 4
    ENUM[5] = :Stone ; NUME[:Stone] = 5
    ENUM[6] = :Improvement ; NUME[:Improvement] = 6
    ENUM[7] = :Glass ; NUME[:Glass] = 7
    ENUM[8] = :Wood2 ; NUME[:Wood2] = 8
    ENUM[9] = :Bag ; NUME[:Bag] = 9
    ENUM[10] = :Cage ; NUME[:Cage] = 10
    ENUM[11] = :WeaponMelee ; NUME[:WeaponMelee] = 11
    ENUM[12] = :WeaponRanged ; NUME[:WeaponRanged] = 12
    ENUM[13] = :Ammo ; NUME[:Ammo] = 13
    ENUM[14] = :Ammo2 ; NUME[:Ammo2] = 14
    ENUM[15] = :Pick ; NUME[:Pick] = 15
    ENUM[16] = :Armor ; NUME[:Armor] = 16
    ENUM[17] = :Gem ; NUME[:Gem] = 17
    ENUM[18] = :Bone ; NUME[:Bone] = 18
    ENUM[19] = :Shell ; NUME[:Shell] = 19
    ENUM[20] = :Pearl ; NUME[:Pearl] = 20
    ENUM[21] = :Ivory ; NUME[:Ivory] = 21
    ENUM[22] = :Horn ; NUME[:Horn] = 22
    ENUM[23] = :Other ; NUME[:Other] = 23
    ENUM[24] = :Anvil ; NUME[:Anvil] = 24
    ENUM[25] = :Booze ; NUME[:Booze] = 25
    ENUM[26] = :Metal ; NUME[:Metal] = 26
    ENUM[27] = :PlantFiber ; NUME[:PlantFiber] = 27
    ENUM[28] = :Silk ; NUME[:Silk] = 28
    ENUM[29] = :Wool ; NUME[:Wool] = 29
    ENUM[30] = :Furniture ; NUME[:Furniture] = 30
    ENUM[31] = :MiscWood2 ; NUME[:MiscWood2] = 31
end

class EntityNameType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :OTHER ; NUME[:OTHER] = 0
    ENUM[1] = :CIV ; NUME[:CIV] = 1
    ENUM[2] = :SITE ; NUME[:SITE] = 2
    ENUM[3] = :VESSEL ; NUME[:VESSEL] = 3
    ENUM[4] = :MILITARY_UNIT ; NUME[:MILITARY_UNIT] = 4
    ENUM[5] = :RELIGION ; NUME[:RELIGION] = 5
    ENUM[6] = :TEMPLE ; NUME[:TEMPLE] = 6
    ENUM[7] = :WAR ; NUME[:WAR] = 7
    ENUM[8] = :BATTLE ; NUME[:BATTLE] = 8
    ENUM[9] = :SIEGE ; NUME[:SIEGE] = 9
    ENUM[10] = :ROAD ; NUME[:ROAD] = 10
    ENUM[11] = :BRIDGE ; NUME[:BRIDGE] = 11
    ENUM[12] = :TUNNEL ; NUME[:TUNNEL] = 12
    ENUM[13] = :WALL ; NUME[:WALL] = 13
    ENUM[14] = :LIBRARY ; NUME[:LIBRARY] = 14
    ENUM[15] = :FESTIVAL ; NUME[:FESTIVAL] = 15
    ENUM[16] = :MERCHANT_COMPANY ; NUME[:MERCHANT_COMPANY] = 16
    ENUM[17] = :CRAFT_GUILD ; NUME[:CRAFT_GUILD] = 17
end

class EntityPositionFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :IS_LAW_MAKER ; NUME[:IS_LAW_MAKER] = 0
    ENUM[1] = :ELECTED ; NUME[:ELECTED] = 1
    ENUM[2] = :DUTY_BOUND ; NUME[:DUTY_BOUND] = 2
    ENUM[3] = :MILITARY_SCREEN_ONLY ; NUME[:MILITARY_SCREEN_ONLY] = 3
    ENUM[4] = :GENDER_MALE ; NUME[:GENDER_MALE] = 4
    ENUM[5] = :GENDER_FEMALE ; NUME[:GENDER_FEMALE] = 5
    ENUM[6] = :SUCCESSION_BY_HEIR ; NUME[:SUCCESSION_BY_HEIR] = 6
    ENUM[7] = :HAS_RESPONSIBILITIES ; NUME[:HAS_RESPONSIBILITIES] = 7
    ENUM[8] = :FLASHES ; NUME[:FLASHES] = 8
    ENUM[9] = :BRAG_ON_KILL ; NUME[:BRAG_ON_KILL] = 9
    ENUM[10] = :CHAT_WORTHY ; NUME[:CHAT_WORTHY] = 10
    ENUM[11] = :DO_NOT_CULL ; NUME[:DO_NOT_CULL] = 11
    ENUM[12] = :KILL_QUEST ; NUME[:KILL_QUEST] = 12
    ENUM[13] = :IS_LEADER ; NUME[:IS_LEADER] = 13
    ENUM[14] = :IS_DIPLOMAT ; NUME[:IS_DIPLOMAT] = 14
    ENUM[15] = :EXPORTED_IN_LEGENDS ; NUME[:EXPORTED_IN_LEGENDS] = 15
    ENUM[16] = :DETERMINES_COIN_DESIGN ; NUME[:DETERMINES_COIN_DESIGN] = 16
    ENUM[17] = :ACCOUNT_EXEMPT ; NUME[:ACCOUNT_EXEMPT] = 17
    ENUM[18] = :Unk12 ; NUME[:Unk12] = 18
    ENUM[19] = :Unk13 ; NUME[:Unk13] = 19
    ENUM[20] = :COLOR ; NUME[:COLOR] = 20
    ENUM[21] = :RULES_FROM_LOCATION ; NUME[:RULES_FROM_LOCATION] = 21
    ENUM[22] = :MENIAL_WORK_EXEMPTION ; NUME[:MENIAL_WORK_EXEMPTION] = 22
    ENUM[23] = :MENIAL_WORK_EXEMPTION_SPOUSE ; NUME[:MENIAL_WORK_EXEMPTION_SPOUSE] = 23
    ENUM[24] = :SLEEP_PRETENSION ; NUME[:SLEEP_PRETENSION] = 24
    ENUM[25] = :PUNISHMENT_EXEMPTION ; NUME[:PUNISHMENT_EXEMPTION] = 25
    ENUM[26] = :Unk1a ; NUME[:Unk1a] = 26
    ENUM[27] = :Unk1b ; NUME[:Unk1b] = 27
    ENUM[28] = :QUEST_GIVER ; NUME[:QUEST_GIVER] = 28
    ENUM[29] = :SPECIAL_BURIAL ; NUME[:SPECIAL_BURIAL] = 29
    ENUM[30] = :REQUIRES_MARKET ; NUME[:REQUIRES_MARKET] = 30
    ENUM[31] = :Unk1f ; NUME[:Unk1f] = 31
end

class EntityPositionRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SITE ; NUME[:SITE] = 0
    ENUM[1] = :ELECTED ; NUME[:ELECTED] = 1
    ENUM[2] = :CONQUERED_SITE ; NUME[:CONQUERED_SITE] = 2
    ENUM[3] = :MILITARY_SCREEN_ONLY ; NUME[:MILITARY_SCREEN_ONLY] = 3
    ENUM[4] = :GENDER_MALE ; NUME[:GENDER_MALE] = 4
    ENUM[5] = :GENDER_FEMALE ; NUME[:GENDER_FEMALE] = 5
    ENUM[6] = :SUCCESSION_BY_HEIR ; NUME[:SUCCESSION_BY_HEIR] = 6
    ENUM[7] = :EXPORTED_IN_LEGENDS ; NUME[:EXPORTED_IN_LEGENDS] = 7
    ENUM[8] = :FLASHES ; NUME[:FLASHES] = 8
    ENUM[9] = :BRAG_ON_KILL ; NUME[:BRAG_ON_KILL] = 9
    ENUM[10] = :CHAT_WORTHY ; NUME[:CHAT_WORTHY] = 10
    ENUM[11] = :DO_NOT_CULL ; NUME[:DO_NOT_CULL] = 11
    ENUM[12] = :KILL_QUEST ; NUME[:KILL_QUEST] = 12
    ENUM[13] = :DETERMINES_COIN_DESIGN ; NUME[:DETERMINES_COIN_DESIGN] = 13
    ENUM[14] = :ACCOUNT_EXEMPT ; NUME[:ACCOUNT_EXEMPT] = 14
    ENUM[15] = :DUTY_BOUND ; NUME[:DUTY_BOUND] = 15
    ENUM[16] = :COLOR ; NUME[:COLOR] = 16
    ENUM[17] = :RULES_FROM_LOCATION ; NUME[:RULES_FROM_LOCATION] = 17
    ENUM[18] = :MENIAL_WORK_EXEMPTION ; NUME[:MENIAL_WORK_EXEMPTION] = 18
    ENUM[19] = :MENIAL_WORK_EXEMPTION_SPOUSE ; NUME[:MENIAL_WORK_EXEMPTION_SPOUSE] = 19
    ENUM[20] = :SLEEP_PRETENSION ; NUME[:SLEEP_PRETENSION] = 20
    ENUM[21] = :PUNISHMENT_EXEMPTION ; NUME[:PUNISHMENT_EXEMPTION] = 21
    ENUM[22] = :QUEST_GIVER ; NUME[:QUEST_GIVER] = 22
    ENUM[23] = :SPECIAL_BURIAL ; NUME[:SPECIAL_BURIAL] = 23
    ENUM[24] = :REQUIRES_MARKET ; NUME[:REQUIRES_MARKET] = 24
end

class EntityPositionResponsibility < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :LAW_MAKING ; NUME[:LAW_MAKING] = 0
    ENUM[1] = :LAW_ENFORCEMENT ; NUME[:LAW_ENFORCEMENT] = 1
    ENUM[2] = :RECEIVE_DIPLOMATS ; NUME[:RECEIVE_DIPLOMATS] = 2
    ENUM[3] = :MEET_WORKERS ; NUME[:MEET_WORKERS] = 3
    ENUM[4] = :MANAGE_PRODUCTION ; NUME[:MANAGE_PRODUCTION] = 4
    ENUM[5] = :TRADE ; NUME[:TRADE] = 5
    ENUM[6] = :ACCOUNTING ; NUME[:ACCOUNTING] = 6
    ENUM[7] = :ESTABLISH_COLONY_TRADE_AGREEMENTS ; NUME[:ESTABLISH_COLONY_TRADE_AGREEMENTS] = 7
    ENUM[8] = :MAKE_INTRODUCTIONS ; NUME[:MAKE_INTRODUCTIONS] = 8
    ENUM[9] = :MAKE_PEACE_AGREEMENTS ; NUME[:MAKE_PEACE_AGREEMENTS] = 9
    ENUM[10] = :MAKE_TOPIC_AGREEMENTS ; NUME[:MAKE_TOPIC_AGREEMENTS] = 10
    ENUM[11] = :COLLECT_TAXES ; NUME[:COLLECT_TAXES] = 11
    ENUM[12] = :ESCORT_TAX_COLLECTOR ; NUME[:ESCORT_TAX_COLLECTOR] = 12
    ENUM[13] = :EXECUTIONS ; NUME[:EXECUTIONS] = 13
    ENUM[14] = :TAME_EXOTICS ; NUME[:TAME_EXOTICS] = 14
    ENUM[15] = :RELIGION ; NUME[:RELIGION] = 15
    ENUM[16] = :ATTACK_ENEMIES ; NUME[:ATTACK_ENEMIES] = 16
    ENUM[17] = :PATROL_TERRITORY ; NUME[:PATROL_TERRITORY] = 17
    ENUM[18] = :MILITARY_GOALS ; NUME[:MILITARY_GOALS] = 18
    ENUM[19] = :MILITARY_STRATEGY ; NUME[:MILITARY_STRATEGY] = 19
    ENUM[20] = :UPGRADE_SQUAD_EQUIPMENT ; NUME[:UPGRADE_SQUAD_EQUIPMENT] = 20
    ENUM[21] = :EQUIPMENT_MANIFESTS ; NUME[:EQUIPMENT_MANIFESTS] = 21
    ENUM[22] = :SORT_AMMUNITION ; NUME[:SORT_AMMUNITION] = 22
    ENUM[23] = :BUILD_MORALE ; NUME[:BUILD_MORALE] = 23
    ENUM[24] = :HEALTH_MANAGEMENT ; NUME[:HEALTH_MANAGEMENT] = 24
    ENUM[25] = :ESPIONAGE ; NUME[:ESPIONAGE] = 25
    ENUM[26] = :ADVISE_LEADERS ; NUME[:ADVISE_LEADERS] = 26
    ENUM[27] = :OVERSEE_LEADER_HOUSEHOLD ; NUME[:OVERSEE_LEADER_HOUSEHOLD] = 27
    ENUM[28] = :MANAGE_ANIMALS ; NUME[:MANAGE_ANIMALS] = 28
    ENUM[29] = :MANAGE_LEADER_HOUSEHOLD_FOOD ; NUME[:MANAGE_LEADER_HOUSEHOLD_FOOD] = 29
    ENUM[30] = :MANAGE_LEADER_HOUSEHOLD_DRINKS ; NUME[:MANAGE_LEADER_HOUSEHOLD_DRINKS] = 30
    ENUM[31] = :PREPARE_LEADER_MEALS ; NUME[:PREPARE_LEADER_MEALS] = 31
    ENUM[32] = :MANAGE_LEADER_HOUSEHOLD_CLEANLINESS ; NUME[:MANAGE_LEADER_HOUSEHOLD_CLEANLINESS] = 32
    ENUM[33] = :MAINTAIN_SEWERS ; NUME[:MAINTAIN_SEWERS] = 33
    ENUM[34] = :FOOD_SUPPLY ; NUME[:FOOD_SUPPLY] = 34
    ENUM[35] = :FIRE_SAFETY ; NUME[:FIRE_SAFETY] = 35
    ENUM[36] = :JUDGE ; NUME[:JUDGE] = 36
    ENUM[37] = :BUILDING_SAFETY ; NUME[:BUILDING_SAFETY] = 37
    ENUM[38] = :CONSTRUCTION_PERMITS ; NUME[:CONSTRUCTION_PERMITS] = 38
    ENUM[39] = :MAINTAIN_ROADS ; NUME[:MAINTAIN_ROADS] = 39
    ENUM[40] = :MAINTAIN_BRIDGES ; NUME[:MAINTAIN_BRIDGES] = 40
    ENUM[41] = :MAINTAIN_TUNNELS ; NUME[:MAINTAIN_TUNNELS] = 41
end

class EntityRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CIV_CONTROLLABLE ; NUME[:CIV_CONTROLLABLE] = 0
    ENUM[1] = :INDIV_CONTROLLABLE ; NUME[:INDIV_CONTROLLABLE] = 1
    ENUM[2] = :LAYER_LINKED ; NUME[:LAYER_LINKED] = 2
    ENUM[3] = :INDOOR_WOOD ; NUME[:INDOOR_WOOD] = 3
    ENUM[4] = :WOOD_ARMOR ; NUME[:WOOD_ARMOR] = 4
    ENUM[5] = :SIEGER ; NUME[:SIEGER] = 5
    ENUM[6] = :AMBUSHER ; NUME[:AMBUSHER] = 6
    ENUM[7] = :BABYSNATCHER ; NUME[:BABYSNATCHER] = 7
    ENUM[8] = :ITEM_THIEF ; NUME[:ITEM_THIEF] = 8
    ENUM[9] = :CLOTHING ; NUME[:CLOTHING] = 9
    ENUM[10] = :CURRENCY_BY_YEAR ; NUME[:CURRENCY_BY_YEAR] = 10
    ENUM[11] = :METAL_PREF ; NUME[:METAL_PREF] = 11
    ENUM[12] = :GEM_PREF ; NUME[:GEM_PREF] = 12
    ENUM[13] = :STONE_PREF ; NUME[:STONE_PREF] = 13
    ENUM[14] = :WOOD_WEAPONS ; NUME[:WOOD_WEAPONS] = 14
    ENUM[15] = :BUILDS_OUTDOOR_FORTIFICATIONS ; NUME[:BUILDS_OUTDOOR_FORTIFICATIONS] = 15
    ENUM[16] = :RIVER_PRODUCTS ; NUME[:RIVER_PRODUCTS] = 16
    ENUM[17] = :OCEAN_PRODUCTS ; NUME[:OCEAN_PRODUCTS] = 17
    ENUM[18] = :INDOOR_FARMING ; NUME[:INDOOR_FARMING] = 18
    ENUM[19] = :OUTDOOR_FARMING ; NUME[:OUTDOOR_FARMING] = 19
    ENUM[20] = :USE_CAVE_ANIMALS ; NUME[:USE_CAVE_ANIMALS] = 20
    ENUM[21] = :USE_EVIL_ANIMALS ; NUME[:USE_EVIL_ANIMALS] = 21
    ENUM[22] = :USE_ANIMAL_PRODUCTS ; NUME[:USE_ANIMAL_PRODUCTS] = 22
    ENUM[23] = :COMMON_DOMESTIC_PACK ; NUME[:COMMON_DOMESTIC_PACK] = 23
    ENUM[24] = :COMMON_DOMESTIC_PULL ; NUME[:COMMON_DOMESTIC_PULL] = 24
    ENUM[25] = :COMMON_DOMESTIC_MOUNT ; NUME[:COMMON_DOMESTIC_MOUNT] = 25
    ENUM[26] = :COMMON_DOMESTIC_PET ; NUME[:COMMON_DOMESTIC_PET] = 26
    ENUM[27] = :SUBTERRANEAN_CLOTHING ; NUME[:SUBTERRANEAN_CLOTHING] = 27
    ENUM[28] = :USE_EVIL_WOOD ; NUME[:USE_EVIL_WOOD] = 28
    ENUM[29] = :USE_GOOD_WOOD ; NUME[:USE_GOOD_WOOD] = 29
    ENUM[30] = :USE_EVIL_PLANTS ; NUME[:USE_EVIL_PLANTS] = 30
    ENUM[31] = :USE_GOOD_PLANTS ; NUME[:USE_GOOD_PLANTS] = 31
    ENUM[32] = :USE_GOOD_ANIMALS ; NUME[:USE_GOOD_ANIMALS] = 32
    ENUM[33] = :USE_ANY_PET_RACE ; NUME[:USE_ANY_PET_RACE] = 33
    ENUM[34] = :USE_MISC_PROCESSED_WOOD_PRODUCTS ; NUME[:USE_MISC_PROCESSED_WOOD_PRODUCTS] = 34
    ENUM[35] = :IMPROVED_BOWS ; NUME[:IMPROVED_BOWS] = 35
    ENUM[36] = :OUTDOOR_WOOD ; NUME[:OUTDOOR_WOOD] = 36
    ENUM[37] = :LOCAL_BANDITRY ; NUME[:LOCAL_BANDITRY] = 37
    ENUM[38] = :BUILDS_OUTDOOR_TOMBS ; NUME[:BUILDS_OUTDOOR_TOMBS] = 38
    ENUM[39] = :INVADERS_IGNORE_NEUTRALS ; NUME[:INVADERS_IGNORE_NEUTRALS] = 39
    ENUM[40] = :AT_PEACE_WITH_WILDLIFE ; NUME[:AT_PEACE_WITH_WILDLIFE] = 40
    ENUM[41] = :EQUIPMENT_IMPROVEMENTS ; NUME[:EQUIPMENT_IMPROVEMENTS] = 41
    ENUM[42] = :ABUSE_BODIES ; NUME[:ABUSE_BODIES] = 42
    ENUM[43] = :UNDEAD_CANDIDATE ; NUME[:UNDEAD_CANDIDATE] = 43
    ENUM[44] = :GENERATED ; NUME[:GENERATED] = 44
    ENUM[45] = :SKULKING ; NUME[:SKULKING] = 45
    ENUM[47] = :MERCHANT_NOBILITY ; NUME[:MERCHANT_NOBILITY] = 47
    ENUM[48] = :TREE_CAP_DIPLOMACY ; NUME[:TREE_CAP_DIPLOMACY] = 48
    ENUM[49] = :DIPLOMAT_BODYGUARDS ; NUME[:DIPLOMAT_BODYGUARDS] = 49
    ENUM[50] = :MERCHANT_BODYGUARDS ; NUME[:MERCHANT_BODYGUARDS] = 50
    ENUM[51] = :INDOOR_ORCHARDS ; NUME[:INDOOR_ORCHARDS] = 51
    ENUM[52] = :OUTDOOR_ORCHARDS ; NUME[:OUTDOOR_ORCHARDS] = 52
    ENUM[53] = :WANDERER ; NUME[:WANDERER] = 53
    ENUM[54] = :BEAST_HUNTER ; NUME[:BEAST_HUNTER] = 54
    ENUM[55] = :SCOUT ; NUME[:SCOUT] = 55
    ENUM[56] = :WILL_ACCEPT_TRIBUTE ; NUME[:WILL_ACCEPT_TRIBUTE] = 56
    ENUM[57] = :INDOOR_GARDENS ; NUME[:INDOOR_GARDENS] = 57
    ENUM[58] = :OUTDOOR_GARDENS ; NUME[:OUTDOOR_GARDENS] = 58
    ENUM[59] = :MERCENARY ; NUME[:MERCENARY] = 59
    ENUM[60] = :SITE_GUARDIAN ; NUME[:SITE_GUARDIAN] = 60
    ENUM[61] = :DIVINE_MAT_WEAPONS ; NUME[:DIVINE_MAT_WEAPONS] = 61
    ENUM[62] = :DIVINE_MAT_ARMOR ; NUME[:DIVINE_MAT_ARMOR] = 62
    ENUM[63] = :DIVINE_MAT_CRAFTS ; NUME[:DIVINE_MAT_CRAFTS] = 63
    ENUM[64] = :DIVINE_MAT_CLOTHING ; NUME[:DIVINE_MAT_CLOTHING] = 64
    ENUM[65] = :GENERATE_KEYBOARD_INSTRUMENTS ; NUME[:GENERATE_KEYBOARD_INSTRUMENTS] = 65
    ENUM[66] = :GENERATE_STRINGED_INSTRUMENTS ; NUME[:GENERATE_STRINGED_INSTRUMENTS] = 66
    ENUM[67] = :GENERATE_WIND_INSTRUMENTS ; NUME[:GENERATE_WIND_INSTRUMENTS] = 67
    ENUM[68] = :GENERATE_PERCUSSION_INSTRUMENTS ; NUME[:GENERATE_PERCUSSION_INSTRUMENTS] = 68
    ENUM[69] = :GENERATE_POETIC_FORMS ; NUME[:GENERATE_POETIC_FORMS] = 69
    ENUM[70] = :GENERATE_MUSICAL_FORMS ; NUME[:GENERATE_MUSICAL_FORMS] = 70
    ENUM[71] = :GENERATE_DANCE_FORMS ; NUME[:GENERATE_DANCE_FORMS] = 71
    ENUM[72] = :SET_SCHOLARS_ON_VALUES_AND_JOBS ; NUME[:SET_SCHOLARS_ON_VALUES_AND_JOBS] = 72
    ENUM[73] = :NO_ARTIFACT_CLAIMS ; NUME[:NO_ARTIFACT_CLAIMS] = 73
end

class EntitySellCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Leather ; NUME[:Leather] = 0
    ENUM[1] = :ClothPlant ; NUME[:ClothPlant] = 1
    ENUM[2] = :ClothSilk ; NUME[:ClothSilk] = 2
    ENUM[3] = :Crafts ; NUME[:Crafts] = 3
    ENUM[4] = :Wood ; NUME[:Wood] = 4
    ENUM[5] = :MetalBars ; NUME[:MetalBars] = 5
    ENUM[6] = :SmallCutGems ; NUME[:SmallCutGems] = 6
    ENUM[7] = :LargeCutGems ; NUME[:LargeCutGems] = 7
    ENUM[8] = :StoneBlocks ; NUME[:StoneBlocks] = 8
    ENUM[9] = :Seeds ; NUME[:Seeds] = 9
    ENUM[10] = :Anvils ; NUME[:Anvils] = 10
    ENUM[11] = :Weapons ; NUME[:Weapons] = 11
    ENUM[12] = :TrainingWeapons ; NUME[:TrainingWeapons] = 12
    ENUM[13] = :Ammo ; NUME[:Ammo] = 13
    ENUM[14] = :TrapComponents ; NUME[:TrapComponents] = 14
    ENUM[15] = :DiggingImplements ; NUME[:DiggingImplements] = 15
    ENUM[16] = :Bodywear ; NUME[:Bodywear] = 16
    ENUM[17] = :Headwear ; NUME[:Headwear] = 17
    ENUM[18] = :Handwear ; NUME[:Handwear] = 18
    ENUM[19] = :Footwear ; NUME[:Footwear] = 19
    ENUM[20] = :Legwear ; NUME[:Legwear] = 20
    ENUM[21] = :Shields ; NUME[:Shields] = 21
    ENUM[22] = :Toys ; NUME[:Toys] = 22
    ENUM[23] = :Instruments ; NUME[:Instruments] = 23
    ENUM[24] = :Pets ; NUME[:Pets] = 24
    ENUM[25] = :Drinks ; NUME[:Drinks] = 25
    ENUM[26] = :Cheese ; NUME[:Cheese] = 26
    ENUM[27] = :Powders ; NUME[:Powders] = 27
    ENUM[28] = :Extracts ; NUME[:Extracts] = 28
    ENUM[29] = :Meat ; NUME[:Meat] = 29
    ENUM[30] = :Fish ; NUME[:Fish] = 30
    ENUM[31] = :Plants ; NUME[:Plants] = 31
    ENUM[32] = :FruitsNuts ; NUME[:FruitsNuts] = 32
    ENUM[33] = :GardenVegetables ; NUME[:GardenVegetables] = 33
    ENUM[34] = :MeatFishRecipes ; NUME[:MeatFishRecipes] = 34
    ENUM[35] = :OtherRecipes ; NUME[:OtherRecipes] = 35
    ENUM[36] = :Stone ; NUME[:Stone] = 36
    ENUM[37] = :Cages ; NUME[:Cages] = 37
    ENUM[38] = :BagsLeather ; NUME[:BagsLeather] = 38
    ENUM[39] = :BagsPlant ; NUME[:BagsPlant] = 39
    ENUM[40] = :BagsSilk ; NUME[:BagsSilk] = 40
    ENUM[41] = :ThreadPlant ; NUME[:ThreadPlant] = 41
    ENUM[42] = :ThreadSilk ; NUME[:ThreadSilk] = 42
    ENUM[43] = :RopesPlant ; NUME[:RopesPlant] = 43
    ENUM[44] = :RopesSilk ; NUME[:RopesSilk] = 44
    ENUM[45] = :Barrels ; NUME[:Barrels] = 45
    ENUM[46] = :FlasksWaterskins ; NUME[:FlasksWaterskins] = 46
    ENUM[47] = :Quivers ; NUME[:Quivers] = 47
    ENUM[48] = :Backpacks ; NUME[:Backpacks] = 48
    ENUM[49] = :Sand ; NUME[:Sand] = 49
    ENUM[50] = :Glass ; NUME[:Glass] = 50
    ENUM[51] = :Miscellaneous ; NUME[:Miscellaneous] = 51
    ENUM[52] = :Buckets ; NUME[:Buckets] = 52
    ENUM[53] = :Splints ; NUME[:Splints] = 53
    ENUM[54] = :Crutches ; NUME[:Crutches] = 54
    ENUM[55] = :Eggs ; NUME[:Eggs] = 55
    ENUM[56] = :BagsYarn ; NUME[:BagsYarn] = 56
    ENUM[57] = :RopesYarn ; NUME[:RopesYarn] = 57
    ENUM[58] = :ClothYarn ; NUME[:ClothYarn] = 58
    ENUM[59] = :ThreadYarn ; NUME[:ThreadYarn] = 59
    ENUM[60] = :Tools ; NUME[:Tools] = 60
    ENUM[61] = :Clay ; NUME[:Clay] = 61
    ENUM[62] = :Parchment ; NUME[:Parchment] = 62
    ENUM[63] = :CupsMugsGoblets ; NUME[:CupsMugsGoblets] = 63
end

class EntitySiteLinkType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Claim ; NUME[:Claim] = 0
    ENUM[1] = :Unk1 ; NUME[:Unk1] = 1
    ENUM[2] = :ForeignCrime ; NUME[:ForeignCrime] = 2
    ENUM[3] = :Unk3 ; NUME[:Unk3] = 3
    ENUM[4] = :LocalActivity ; NUME[:LocalActivity] = 4
end

class EnvironmentType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SOIL ; NUME[:SOIL] = 0
    ENUM[1] = :SOIL_OCEAN ; NUME[:SOIL_OCEAN] = 1
    ENUM[2] = :SOIL_SAND ; NUME[:SOIL_SAND] = 2
    ENUM[3] = :METAMORPHIC ; NUME[:METAMORPHIC] = 3
    ENUM[4] = :SEDIMENTARY ; NUME[:SEDIMENTARY] = 4
    ENUM[5] = :IGNEOUS_INTRUSIVE ; NUME[:IGNEOUS_INTRUSIVE] = 5
    ENUM[6] = :IGNEOUS_EXTRUSIVE ; NUME[:IGNEOUS_EXTRUSIVE] = 6
    ENUM[7] = :ALLUVIAL ; NUME[:ALLUVIAL] = 7
end

class EraType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ThreePowers ; NUME[:ThreePowers] = 0
    ENUM[1] = :TwoPowers ; NUME[:TwoPowers] = 1
    ENUM[2] = :OnePower ; NUME[:OnePower] = 2
    ENUM[3] = :Myth ; NUME[:Myth] = 3
    ENUM[4] = :Legends ; NUME[:Legends] = 4
    ENUM[5] = :Twilight ; NUME[:Twilight] = 5
    ENUM[6] = :FairyTales ; NUME[:FairyTales] = 6
    ENUM[7] = :Race ; NUME[:Race] = 7
    ENUM[8] = :Heroes ; NUME[:Heroes] = 8
    ENUM[9] = :Golden ; NUME[:Golden] = 9
    ENUM[10] = :Death ; NUME[:Death] = 10
    ENUM[11] = :Civilization ; NUME[:Civilization] = 11
    ENUM[12] = :Emptiness ; NUME[:Emptiness] = 12
end

class EthicResponse < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NOT_APPLICABLE ; NUME[:NOT_APPLICABLE] = 0
    ENUM[1] = :ACCEPTABLE ; NUME[:ACCEPTABLE] = 1
    ENUM[2] = :PERSONAL_MATTER ; NUME[:PERSONAL_MATTER] = 2
    ENUM[3] = :JUSTIFIED_IF_NO_REPERCUSSIONS ; NUME[:JUSTIFIED_IF_NO_REPERCUSSIONS] = 3
    ENUM[4] = :JUSTIFIED_IF_GOOD_REASON ; NUME[:JUSTIFIED_IF_GOOD_REASON] = 4
    ENUM[5] = :JUSTIFIED_IF_EXTREME_REASON ; NUME[:JUSTIFIED_IF_EXTREME_REASON] = 5
    ENUM[6] = :JUSTIFIED_IF_SELF_DEFENSE ; NUME[:JUSTIFIED_IF_SELF_DEFENSE] = 6
    ENUM[7] = :ONLY_IF_SANCTIONED ; NUME[:ONLY_IF_SANCTIONED] = 7
    ENUM[8] = :MISGUIDED ; NUME[:MISGUIDED] = 8
    ENUM[9] = :SHUN ; NUME[:SHUN] = 9
    ENUM[10] = :APPALLING ; NUME[:APPALLING] = 10
    ENUM[11] = :PUNISH_REPRIMAND ; NUME[:PUNISH_REPRIMAND] = 11
    ENUM[12] = :PUNISH_SERIOUS ; NUME[:PUNISH_SERIOUS] = 12
    ENUM[13] = :PUNISH_EXILE ; NUME[:PUNISH_EXILE] = 13
    ENUM[14] = :PUNISH_CAPITAL ; NUME[:PUNISH_CAPITAL] = 14
    ENUM[15] = :UNTHINKABLE ; NUME[:UNTHINKABLE] = 15
    ENUM[16] = :REQUIRED ; NUME[:REQUIRED] = 16
end

class EthicType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :KILL_ENTITY_MEMBER ; NUME[:KILL_ENTITY_MEMBER] = 0
    ENUM[1] = :KILL_NEUTRAL ; NUME[:KILL_NEUTRAL] = 1
    ENUM[2] = :KILL_ENEMY ; NUME[:KILL_ENEMY] = 2
    ENUM[3] = :KILL_ANIMAL ; NUME[:KILL_ANIMAL] = 3
    ENUM[4] = :KILL_PLANT ; NUME[:KILL_PLANT] = 4
    ENUM[5] = :TORTURE_AS_EXAMPLE ; NUME[:TORTURE_AS_EXAMPLE] = 5
    ENUM[6] = :TORTURE_FOR_INFORMATION ; NUME[:TORTURE_FOR_INFORMATION] = 6
    ENUM[7] = :TORTURE_FOR_FUN ; NUME[:TORTURE_FOR_FUN] = 7
    ENUM[8] = :TORTURE_ANIMALS ; NUME[:TORTURE_ANIMALS] = 8
    ENUM[9] = :TREASON ; NUME[:TREASON] = 9
    ENUM[10] = :OATH_BREAKING ; NUME[:OATH_BREAKING] = 10
    ENUM[11] = :LYING ; NUME[:LYING] = 11
    ENUM[12] = :VANDALISM ; NUME[:VANDALISM] = 12
    ENUM[13] = :TRESPASSING ; NUME[:TRESPASSING] = 13
    ENUM[14] = :THEFT ; NUME[:THEFT] = 14
    ENUM[15] = :ASSAULT ; NUME[:ASSAULT] = 15
    ENUM[16] = :SLAVERY ; NUME[:SLAVERY] = 16
    ENUM[17] = :EAT_SAPIENT_OTHER ; NUME[:EAT_SAPIENT_OTHER] = 17
    ENUM[18] = :EAT_SAPIENT_KILL ; NUME[:EAT_SAPIENT_KILL] = 18
    ENUM[19] = :MAKE_TROPHY_SAME_RACE ; NUME[:MAKE_TROPHY_SAME_RACE] = 19
    ENUM[20] = :MAKE_TROPHY_SAPIENT ; NUME[:MAKE_TROPHY_SAPIENT] = 20
    ENUM[21] = :MAKE_TROPHY_ANIMAL ; NUME[:MAKE_TROPHY_ANIMAL] = 21
end

class ExportMapType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :StandardBiomeSiteMap ; NUME[:StandardBiomeSiteMap] = -1
    ENUM[0] = :ElevationsIncludingLakeAndOceanFloors ; NUME[:ElevationsIncludingLakeAndOceanFloors] = 0
    ENUM[1] = :ElevationsRespectingWaterLevel ; NUME[:ElevationsRespectingWaterLevel] = 1
    ENUM[2] = :Biome ; NUME[:Biome] = 2
    ENUM[3] = :Hydrosphere ; NUME[:Hydrosphere] = 3
    ENUM[4] = :Temperature ; NUME[:Temperature] = 4
    ENUM[5] = :Rainfall ; NUME[:Rainfall] = 5
    ENUM[6] = :Drainage ; NUME[:Drainage] = 6
    ENUM[7] = :Savagery ; NUME[:Savagery] = 7
    ENUM[8] = :Volcanism ; NUME[:Volcanism] = 8
    ENUM[9] = :CurrentVegetation ; NUME[:CurrentVegetation] = 9
    ENUM[10] = :Evil ; NUME[:Evil] = 10
    ENUM[11] = :Salinity ; NUME[:Salinity] = 11
    ENUM[12] = :StructuresFieldsRoadsEtc ; NUME[:StructuresFieldsRoadsEtc] = 12
    ENUM[13] = :Trade ; NUME[:Trade] = 13
    ENUM[14] = :NobilityHoldings ; NUME[:NobilityHoldings] = 14
    ENUM[15] = :Diplomacy ; NUME[:Diplomacy] = 15
end

class FeatureAlterationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NewPopMax ; NUME[:NewPopMax] = 0
    ENUM[1] = :NewLavaFillZ ; NUME[:NewLavaFillZ] = 1
end

class FeatureInitFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[3] = :Discovered ; NUME[:Discovered] = 3
end

class FeatureType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :OutdoorRiver ; NUME[:OutdoorRiver] = 0
    ENUM[1] = :Cave ; NUME[:Cave] = 1
    ENUM[2] = :Pit ; NUME[:Pit] = 2
    ENUM[3] = :MagmaPool ; NUME[:MagmaPool] = 3
    ENUM[4] = :Volcano ; NUME[:Volcano] = 4
    ENUM[5] = :DeepSpecialTube ; NUME[:DeepSpecialTube] = 5
    ENUM[6] = :DeepSurfacePortal ; NUME[:DeepSurfacePortal] = 6
    ENUM[7] = :SubterraneanFromLayer ; NUME[:SubterraneanFromLayer] = 7
    ENUM[8] = :MagmaCoreFromLayer ; NUME[:MagmaCoreFromLayer] = 8
    ENUM[9] = :UnderworldFromLayer ; NUME[:UnderworldFromLayer] = 9
end

class FlowGuideType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TrailingFlow ; NUME[:TrailingFlow] = 0
    ENUM[1] = :ItemCloud ; NUME[:ItemCloud] = 1
end

class FlowType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Miasma ; NUME[:Miasma] = 0
    ENUM[1] = :Steam ; NUME[:Steam] = 1
    ENUM[2] = :Mist ; NUME[:Mist] = 2
    ENUM[3] = :MaterialDust ; NUME[:MaterialDust] = 3
    ENUM[4] = :MagmaMist ; NUME[:MagmaMist] = 4
    ENUM[5] = :Smoke ; NUME[:Smoke] = 5
    ENUM[6] = :Dragonfire ; NUME[:Dragonfire] = 6
    ENUM[7] = :Fire ; NUME[:Fire] = 7
    ENUM[8] = :Web ; NUME[:Web] = 8
    ENUM[9] = :MaterialGas ; NUME[:MaterialGas] = 9
    ENUM[10] = :MaterialVapor ; NUME[:MaterialVapor] = 10
    ENUM[11] = :OceanWave ; NUME[:OceanWave] = 11
    ENUM[12] = :SeaFoam ; NUME[:SeaFoam] = 12
    ENUM[13] = :ItemCloud ; NUME[:ItemCloud] = 13
end

class FogType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FogNone ; NUME[:FogNone] = 0
    ENUM[1] = :FogMist ; NUME[:FogMist] = 1
    ENUM[2] = :FogNormal ; NUME[:FogNormal] = 2
    ENUM[3] = :FogThick ; NUME[:FogThick] = 3
end

class FortressType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :CASTLE ; NUME[:CASTLE] = 0
    ENUM[1] = :TOWER ; NUME[:TOWER] = 1
    ENUM[2] = :MONASTERY ; NUME[:MONASTERY] = 2
    ENUM[3] = :FORT ; NUME[:FORT] = 3
end

class FrontType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FrontNone ; NUME[:FrontNone] = 0
    ENUM[1] = :FrontWarm ; NUME[:FrontWarm] = 1
    ENUM[2] = :FrontCold ; NUME[:FrontCold] = 2
    ENUM[3] = :FrontOccluded ; NUME[:FrontOccluded] = 3
end

class FurnaceType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Name = Hash.new
    ENUM[0] = :WoodFurnace ; NUME[:WoodFurnace] = 0 ; Name[:WoodFurnace] = 'Wood Furnace'
    ENUM[1] = :Smelter ; NUME[:Smelter] = 1
    ENUM[2] = :GlassFurnace ; NUME[:GlassFurnace] = 2 ; Name[:GlassFurnace] = 'Glass Furnace'
    ENUM[3] = :Kiln ; NUME[:Kiln] = 3
    ENUM[4] = :MagmaSmelter ; NUME[:MagmaSmelter] = 4 ; Name[:MagmaSmelter] = 'Magma Smelter'
    ENUM[5] = :MagmaGlassFurnace ; NUME[:MagmaGlassFurnace] = 5 ; Name[:MagmaGlassFurnace] = 'Magma Glass Furnace'
    ENUM[6] = :MagmaKiln ; NUME[:MagmaKiln] = 6 ; Name[:MagmaKiln] = 'Magma Kiln'
    ENUM[7] = :Custom ; NUME[:Custom] = 7 ; Name[:Custom] = 'Custom Furnace'
end

class FurnitureType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FLOODGATE ; NUME[:FLOODGATE] = 0
    ENUM[1] = :HATCH_COVER ; NUME[:HATCH_COVER] = 1
    ENUM[2] = :GRATE ; NUME[:GRATE] = 2
    ENUM[3] = :DOOR ; NUME[:DOOR] = 3
    ENUM[4] = :CATAPULTPARTS ; NUME[:CATAPULTPARTS] = 4
    ENUM[5] = :BALLISTAPARTS ; NUME[:BALLISTAPARTS] = 5
    ENUM[6] = :TRAPPARTS ; NUME[:TRAPPARTS] = 6
    ENUM[7] = :BED ; NUME[:BED] = 7
    ENUM[8] = :TRACTION_BENCH ; NUME[:TRACTION_BENCH] = 8
    ENUM[9] = :WINDOW ; NUME[:WINDOW] = 9
    ENUM[10] = :CHAIR ; NUME[:CHAIR] = 10
    ENUM[11] = :TABLE ; NUME[:TABLE] = 11
    ENUM[12] = :COFFIN ; NUME[:COFFIN] = 12
    ENUM[13] = :STATUE ; NUME[:STATUE] = 13
    ENUM[14] = :SLAB ; NUME[:SLAB] = 14
    ENUM[15] = :QUERN ; NUME[:QUERN] = 15
    ENUM[16] = :MILLSTONE ; NUME[:MILLSTONE] = 16
    ENUM[17] = :ARMORSTAND ; NUME[:ARMORSTAND] = 17
    ENUM[18] = :WEAPONRACK ; NUME[:WEAPONRACK] = 18
    ENUM[19] = :CABINET ; NUME[:CABINET] = 19
    ENUM[20] = :ANVIL ; NUME[:ANVIL] = 20
    ENUM[21] = :BUCKET ; NUME[:BUCKET] = 21
    ENUM[22] = :BIN ; NUME[:BIN] = 22
    ENUM[23] = :BOX ; NUME[:BOX] = 23
    ENUM[24] = :SIEGEAMMO ; NUME[:SIEGEAMMO] = 24
    ENUM[25] = :BARREL ; NUME[:BARREL] = 25
    ENUM[26] = :BALLISTAARROWHEAD ; NUME[:BALLISTAARROWHEAD] = 26
    ENUM[27] = :PIPE_SECTION ; NUME[:PIPE_SECTION] = 27
    ENUM[28] = :FOOD_STORAGE ; NUME[:FOOD_STORAGE] = 28
    ENUM[29] = :MINECART ; NUME[:MINECART] = 29
    ENUM[30] = :WHEELBARROW ; NUME[:WHEELBARROW] = 30
    ENUM[31] = :OTHER_LARGE_TOOLS ; NUME[:OTHER_LARGE_TOOLS] = 31
    ENUM[32] = :SAND_BAG ; NUME[:SAND_BAG] = 32
end

class GaitType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :WALK ; NUME[:WALK] = 0
    ENUM[1] = :FLY ; NUME[:FLY] = 1
    ENUM[2] = :SWIM ; NUME[:SWIM] = 2
    ENUM[3] = :CRAWL ; NUME[:CRAWL] = 3
    ENUM[4] = :CLIMB ; NUME[:CLIMB] = 4
end

class GameMode < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DWARF ; NUME[:DWARF] = 0
    ENUM[1] = :ADVENTURE ; NUME[:ADVENTURE] = 1
    ENUM[2] = :Num ; NUME[:Num] = 2
    ENUM[3] = :NONE ; NUME[:NONE] = 3
end

class GameType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DWARF_MAIN ; NUME[:DWARF_MAIN] = 0
    ENUM[1] = :ADVENTURE_MAIN ; NUME[:ADVENTURE_MAIN] = 1
    ENUM[2] = :VIEW_LEGENDS ; NUME[:VIEW_LEGENDS] = 2
    ENUM[3] = :DWARF_RECLAIM ; NUME[:DWARF_RECLAIM] = 3
    ENUM[4] = :DWARF_ARENA ; NUME[:DWARF_ARENA] = 4
    ENUM[5] = :ADVENTURE_ARENA ; NUME[:ADVENTURE_ARENA] = 5
    ENUM[6] = :ADVENTURE_DUNGEON ; NUME[:ADVENTURE_DUNGEON] = 6
    ENUM[7] = :DWARF_TUTORIAL ; NUME[:DWARF_TUTORIAL] = 7
    ENUM[8] = :DWARF_UNRETIRE ; NUME[:DWARF_UNRETIRE] = 8
    ENUM[9] = :ADVENTURE_WORLD_DEBUG ; NUME[:ADVENTURE_WORLD_DEBUG] = 9
    ENUM[10] = :Num ; NUME[:Num] = 10
    ENUM[11] = :NONE ; NUME[:NONE] = 11
end

class GeneralRefType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ARTIFACT ; NUME[:ARTIFACT] = 0
    ENUM[1] = :IS_ARTIFACT ; NUME[:IS_ARTIFACT] = 1
    ENUM[2] = :NEMESIS ; NUME[:NEMESIS] = 2
    ENUM[3] = :IS_NEMESIS ; NUME[:IS_NEMESIS] = 3
    ENUM[4] = :ITEM ; NUME[:ITEM] = 4
    ENUM[5] = :ITEM_TYPE ; NUME[:ITEM_TYPE] = 5
    ENUM[6] = :COINBATCH ; NUME[:COINBATCH] = 6
    ENUM[7] = :MAPSQUARE ; NUME[:MAPSQUARE] = 7
    ENUM[8] = :ENTITY_ART_IMAGE ; NUME[:ENTITY_ART_IMAGE] = 8
    ENUM[9] = :CONTAINS_UNIT ; NUME[:CONTAINS_UNIT] = 9
    ENUM[10] = :CONTAINS_ITEM ; NUME[:CONTAINS_ITEM] = 10
    ENUM[11] = :CONTAINED_IN_ITEM ; NUME[:CONTAINED_IN_ITEM] = 11
    ENUM[12] = :PROJECTILE ; NUME[:PROJECTILE] = 12
    ENUM[13] = :UNIT ; NUME[:UNIT] = 13
    ENUM[14] = :UNIT_MILKEE ; NUME[:UNIT_MILKEE] = 14
    ENUM[15] = :UNIT_TRAINEE ; NUME[:UNIT_TRAINEE] = 15
    ENUM[16] = :UNIT_ITEMOWNER ; NUME[:UNIT_ITEMOWNER] = 16
    ENUM[17] = :UNIT_TRADEBRINGER ; NUME[:UNIT_TRADEBRINGER] = 17
    ENUM[18] = :UNIT_HOLDER ; NUME[:UNIT_HOLDER] = 18
    ENUM[19] = :UNIT_WORKER ; NUME[:UNIT_WORKER] = 19
    ENUM[20] = :UNIT_CAGEE ; NUME[:UNIT_CAGEE] = 20
    ENUM[21] = :UNIT_BEATEE ; NUME[:UNIT_BEATEE] = 21
    ENUM[22] = :UNIT_FOODRECEIVER ; NUME[:UNIT_FOODRECEIVER] = 22
    ENUM[23] = :UNIT_KIDNAPEE ; NUME[:UNIT_KIDNAPEE] = 23
    ENUM[24] = :UNIT_PATIENT ; NUME[:UNIT_PATIENT] = 24
    ENUM[25] = :UNIT_INFANT ; NUME[:UNIT_INFANT] = 25
    ENUM[26] = :UNIT_SLAUGHTEREE ; NUME[:UNIT_SLAUGHTEREE] = 26
    ENUM[27] = :UNIT_SHEAREE ; NUME[:UNIT_SHEAREE] = 27
    ENUM[28] = :UNIT_SUCKEE ; NUME[:UNIT_SUCKEE] = 28
    ENUM[29] = :UNIT_REPORTEE ; NUME[:UNIT_REPORTEE] = 29
    ENUM[30] = :BUILDING ; NUME[:BUILDING] = 30
    ENUM[31] = :BUILDING_CIVZONE_ASSIGNED ; NUME[:BUILDING_CIVZONE_ASSIGNED] = 31
    ENUM[32] = :BUILDING_TRIGGER ; NUME[:BUILDING_TRIGGER] = 32
    ENUM[33] = :BUILDING_TRIGGERTARGET ; NUME[:BUILDING_TRIGGERTARGET] = 33
    ENUM[34] = :BUILDING_CHAIN ; NUME[:BUILDING_CHAIN] = 34
    ENUM[35] = :BUILDING_CAGED ; NUME[:BUILDING_CAGED] = 35
    ENUM[36] = :BUILDING_HOLDER ; NUME[:BUILDING_HOLDER] = 36
    ENUM[37] = :BUILDING_WELL_TAG ; NUME[:BUILDING_WELL_TAG] = 37
    ENUM[38] = :BUILDING_USE_TARGET_1 ; NUME[:BUILDING_USE_TARGET_1] = 38
    ENUM[39] = :BUILDING_USE_TARGET_2 ; NUME[:BUILDING_USE_TARGET_2] = 39
    ENUM[40] = :BUILDING_DESTINATION ; NUME[:BUILDING_DESTINATION] = 40
    ENUM[41] = :BUILDING_NEST_BOX ; NUME[:BUILDING_NEST_BOX] = 41
    ENUM[42] = :ENTITY ; NUME[:ENTITY] = 42
    ENUM[43] = :ENTITY_STOLEN ; NUME[:ENTITY_STOLEN] = 43
    ENUM[44] = :ENTITY_OFFERED ; NUME[:ENTITY_OFFERED] = 44
    ENUM[45] = :ENTITY_ITEMOWNER ; NUME[:ENTITY_ITEMOWNER] = 45
    ENUM[46] = :LOCATION ; NUME[:LOCATION] = 46
    ENUM[47] = :INTERACTION ; NUME[:INTERACTION] = 47
    ENUM[48] = :ABSTRACT_BUILDING ; NUME[:ABSTRACT_BUILDING] = 48
    ENUM[49] = :HISTORICAL_EVENT ; NUME[:HISTORICAL_EVENT] = 49
    ENUM[50] = :SPHERE ; NUME[:SPHERE] = 50
    ENUM[51] = :SITE ; NUME[:SITE] = 51
    ENUM[52] = :SUBREGION ; NUME[:SUBREGION] = 52
    ENUM[53] = :FEATURE_LAYER ; NUME[:FEATURE_LAYER] = 53
    ENUM[54] = :HISTORICAL_FIGURE ; NUME[:HISTORICAL_FIGURE] = 54
    ENUM[55] = :ENTITY_POP ; NUME[:ENTITY_POP] = 55
    ENUM[56] = :CREATURE ; NUME[:CREATURE] = 56
    ENUM[57] = :UNIT_RIDER ; NUME[:UNIT_RIDER] = 57
    ENUM[58] = :UNIT_CLIMBER ; NUME[:UNIT_CLIMBER] = 58
    ENUM[59] = :UNIT_GELDEE ; NUME[:UNIT_GELDEE] = 59
    ENUM[60] = :KNOWLEDGE_SCHOLAR_FLAG ; NUME[:KNOWLEDGE_SCHOLAR_FLAG] = 60
    ENUM[61] = :ACTIVITY_EVENT ; NUME[:ACTIVITY_EVENT] = 61
    ENUM[62] = :VALUE_LEVEL ; NUME[:VALUE_LEVEL] = 62
    ENUM[63] = :LANGUAGE ; NUME[:LANGUAGE] = 63
    ENUM[64] = :WRITTEN_CONTENT ; NUME[:WRITTEN_CONTENT] = 64
    ENUM[65] = :POETIC_FORM ; NUME[:POETIC_FORM] = 65
    ENUM[66] = :MUSICAL_FORM ; NUME[:MUSICAL_FORM] = 66
    ENUM[67] = :DANCE_FORM ; NUME[:DANCE_FORM] = 67
    ENUM[68] = :BUILDING_DISPLAY_FURNITURE ; NUME[:BUILDING_DISPLAY_FURNITURE] = 68
    ENUM[69] = :UNIT_INTERROGATEE ; NUME[:UNIT_INTERROGATEE] = 69
end

class GeoLayerType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Flag = Hash.new
    ENUM[0] = :SOIL ; NUME[:SOIL] = 0
    ENUM[1] = :SEDIMENTARY ; NUME[:SEDIMENTARY] = 1
    ENUM[2] = :METAMORPHIC ; NUME[:METAMORPHIC] = 2
    ENUM[3] = :IGNEOUS_EXTRUSIVE ; NUME[:IGNEOUS_EXTRUSIVE] = 3
    ENUM[4] = :IGNEOUS_INTRUSIVE ; NUME[:IGNEOUS_INTRUSIVE] = 4
    ENUM[5] = :SOIL_OCEAN ; NUME[:SOIL_OCEAN] = 5
    ENUM[6] = :SOIL_SAND ; NUME[:SOIL_SAND] = 6
    ENUM[7] = :SEDIMENTARY_OCEAN_SHALLOW ; NUME[:SEDIMENTARY_OCEAN_SHALLOW] = 7
    ENUM[8] = :SEDIMENTARY_OCEAN_DEEP ; NUME[:SEDIMENTARY_OCEAN_DEEP] = 8
end

class GhostGoal < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :ScareToDeath ; NUME[:ScareToDeath] = 0
    ENUM[1] = :Stun ; NUME[:Stun] = 1
    ENUM[2] = :Batter ; NUME[:Batter] = 2
    ENUM[3] = :Possess ; NUME[:Possess] = 3
    ENUM[4] = :MisplaceItem ; NUME[:MisplaceItem] = 4
    ENUM[5] = :Haunt ; NUME[:Haunt] = 5
    ENUM[6] = :Torment ; NUME[:Torment] = 6
    ENUM[7] = :ToppleBuilding ; NUME[:ToppleBuilding] = 7
end

class GhostType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :MurderousGhost ; NUME[:MurderousGhost] = 0
    ENUM[1] = :SadisticGhost ; NUME[:SadisticGhost] = 1
    ENUM[2] = :SecretivePoltergeist ; NUME[:SecretivePoltergeist] = 2
    ENUM[3] = :EnergeticPoltergeist ; NUME[:EnergeticPoltergeist] = 3
    ENUM[4] = :AngryGhost ; NUME[:AngryGhost] = 4
    ENUM[5] = :ViolentGhost ; NUME[:ViolentGhost] = 5
    ENUM[6] = :MoaningSpirit ; NUME[:MoaningSpirit] = 6
    ENUM[7] = :HowlingSpirit ; NUME[:HowlingSpirit] = 7
    ENUM[8] = :TroublesomePoltergeist ; NUME[:TroublesomePoltergeist] = 8
    ENUM[9] = :RestlessHaunt ; NUME[:RestlessHaunt] = 9
    ENUM[10] = :ForlornHaunt ; NUME[:ForlornHaunt] = 10
end

class GlovesFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :METAL_ARMOR_LEVELS ; NUME[:METAL_ARMOR_LEVELS] = 0
end

class GoalType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ShortName = Hash.new
    AchievedShortName = Hash.new
    ENUM[0] = :STAY_ALIVE ; NUME[:STAY_ALIVE] = 0 ; ShortName[:STAY_ALIVE] = 'Stay Alive' ; AchievedShortName[:STAY_ALIVE] = 'Stayed Alive'
    ENUM[1] = :MAINTAIN_ENTITY_STATUS ; NUME[:MAINTAIN_ENTITY_STATUS] = 1 ; ShortName[:MAINTAIN_ENTITY_STATUS] = 'Maintain Status' ; AchievedShortName[:MAINTAIN_ENTITY_STATUS] = 'Maintained Status'
    ENUM[2] = :START_A_FAMILY ; NUME[:START_A_FAMILY] = 2 ; ShortName[:START_A_FAMILY] = 'Be a Parent' ; AchievedShortName[:START_A_FAMILY] = 'Is a Parent'
    ENUM[3] = :RULE_THE_WORLD ; NUME[:RULE_THE_WORLD] = 3 ; ShortName[:RULE_THE_WORLD] = 'Rule the World' ; AchievedShortName[:RULE_THE_WORLD] = 'Ruled the World'
    ENUM[4] = :CREATE_A_GREAT_WORK_OF_ART ; NUME[:CREATE_A_GREAT_WORK_OF_ART] = 4 ; ShortName[:CREATE_A_GREAT_WORK_OF_ART] = 'Create Great Artwork' ; AchievedShortName[:CREATE_A_GREAT_WORK_OF_ART] = 'Made Great Artwork'
    ENUM[5] = :CRAFT_A_MASTERWORK ; NUME[:CRAFT_A_MASTERWORK] = 5 ; ShortName[:CRAFT_A_MASTERWORK] = 'Craft a Masterwork' ; AchievedShortName[:CRAFT_A_MASTERWORK] = 'Crafted a Masterwork'
    ENUM[6] = :BRING_PEACE_TO_THE_WORLD ; NUME[:BRING_PEACE_TO_THE_WORLD] = 6 ; ShortName[:BRING_PEACE_TO_THE_WORLD] = 'Bring Peace to World' ; AchievedShortName[:BRING_PEACE_TO_THE_WORLD] = 'Brought World Peace'
    ENUM[7] = :BECOME_A_LEGENDARY_WARRIOR ; NUME[:BECOME_A_LEGENDARY_WARRIOR] = 7 ; ShortName[:BECOME_A_LEGENDARY_WARRIOR] = 'Be Legendary Warrior' ; AchievedShortName[:BECOME_A_LEGENDARY_WARRIOR] = 'Is Legendary Warrior'
    ENUM[8] = :MASTER_A_SKILL ; NUME[:MASTER_A_SKILL] = 8 ; ShortName[:MASTER_A_SKILL] = 'Master a Skill' ; AchievedShortName[:MASTER_A_SKILL] = 'Mastered a Skill'
    ENUM[9] = :FALL_IN_LOVE ; NUME[:FALL_IN_LOVE] = 9 ; ShortName[:FALL_IN_LOVE] = 'Fall in Love' ; AchievedShortName[:FALL_IN_LOVE] = 'Fell in Love'
    ENUM[10] = :SEE_THE_GREAT_NATURAL_SITES ; NUME[:SEE_THE_GREAT_NATURAL_SITES] = 10 ; ShortName[:SEE_THE_GREAT_NATURAL_SITES] = 'See Natural Wonders' ; AchievedShortName[:SEE_THE_GREAT_NATURAL_SITES] = 'Saw Natural Wonders'
    ENUM[11] = :IMMORTALITY ; NUME[:IMMORTALITY] = 11 ; ShortName[:IMMORTALITY] = 'Immortality' ; AchievedShortName[:IMMORTALITY] = 'Immortal'
    ENUM[12] = :MAKE_A_GREAT_DISCOVERY ; NUME[:MAKE_A_GREAT_DISCOVERY] = 12 ; ShortName[:MAKE_A_GREAT_DISCOVERY] = 'Make Great Discovery' ; AchievedShortName[:MAKE_A_GREAT_DISCOVERY] = 'Made Great Discovery'
    ENUM[13] = :ATTAIN_RANK_IN_SOCIETY ; NUME[:ATTAIN_RANK_IN_SOCIETY] = 13 ; ShortName[:ATTAIN_RANK_IN_SOCIETY] = 'Attain Social Rank' ; AchievedShortName[:ATTAIN_RANK_IN_SOCIETY] = 'Attained Social Rank'
    ENUM[14] = :BATHE_WORLD_IN_CHAOS ; NUME[:BATHE_WORLD_IN_CHAOS] = 14 ; ShortName[:BATHE_WORLD_IN_CHAOS] = 'Bathe World in Chaos' ; AchievedShortName[:BATHE_WORLD_IN_CHAOS] = 'World is in Chaos'
end

class GuildId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Miners ; NUME[:Miners] = 0
    ENUM[1] = :Carpenters ; NUME[:Carpenters] = 1
    ENUM[2] = :Masons ; NUME[:Masons] = 2
    ENUM[3] = :Metalsmiths ; NUME[:Metalsmiths] = 3
    ENUM[4] = :Jewelers ; NUME[:Jewelers] = 4
    ENUM[5] = :Craftsmen ; NUME[:Craftsmen] = 5
end

class HaulerType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Any ; NUME[:Any] = 0
    ENUM[1] = :Stone ; NUME[:Stone] = 1
    ENUM[2] = :Wood ; NUME[:Wood] = 2
    ENUM[3] = :Item ; NUME[:Item] = 3
    ENUM[4] = :Bin ; NUME[:Bin] = 4
    ENUM[5] = :Body ; NUME[:Body] = 5
    ENUM[6] = :Food ; NUME[:Food] = 6
    ENUM[7] = :Refuse ; NUME[:Refuse] = 7
    ENUM[8] = :Furniture ; NUME[:Furniture] = 8
    ENUM[9] = :Animal ; NUME[:Animal] = 9
end

class HelmFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :METAL_ARMOR_LEVELS ; NUME[:METAL_ARMOR_LEVELS] = 0
end

class HillockHouseType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1] = :CivicMound ; NUME[:CivicMound] = 1
    ENUM[2] = :CastleMound ; NUME[:CastleMound] = 2
    ENUM[3] = :DrinkingMound ; NUME[:DrinkingMound] = 3
end

class HistfigBodyState < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Active ; NUME[:Active] = 0
    ENUM[1] = :BuriedAtSite ; NUME[:BuriedAtSite] = 1
    ENUM[2] = :UnburiedAtBattlefield ; NUME[:UnburiedAtBattlefield] = 2
    ENUM[3] = :UnburiedAtSubregion ; NUME[:UnburiedAtSubregion] = 3
    ENUM[4] = :UnburiedAtFeatureLayer ; NUME[:UnburiedAtFeatureLayer] = 4
    ENUM[5] = :EntombedAtSite ; NUME[:EntombedAtSite] = 5
    ENUM[6] = :UnburiedAtSite ; NUME[:UnburiedAtSite] = 6
end

class HistfigEntityLinkType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MEMBER ; NUME[:MEMBER] = 0
    ENUM[1] = :FORMER_MEMBER ; NUME[:FORMER_MEMBER] = 1
    ENUM[2] = :MERCENARY ; NUME[:MERCENARY] = 2
    ENUM[3] = :FORMER_MERCENARY ; NUME[:FORMER_MERCENARY] = 3
    ENUM[4] = :SLAVE ; NUME[:SLAVE] = 4
    ENUM[5] = :FORMER_SLAVE ; NUME[:FORMER_SLAVE] = 5
    ENUM[6] = :PRISONER ; NUME[:PRISONER] = 6
    ENUM[7] = :FORMER_PRISONER ; NUME[:FORMER_PRISONER] = 7
    ENUM[8] = :ENEMY ; NUME[:ENEMY] = 8
    ENUM[9] = :CRIMINAL ; NUME[:CRIMINAL] = 9
    ENUM[10] = :POSITION ; NUME[:POSITION] = 10
    ENUM[11] = :FORMER_POSITION ; NUME[:FORMER_POSITION] = 11
    ENUM[12] = :POSITION_CLAIM ; NUME[:POSITION_CLAIM] = 12
    ENUM[13] = :SQUAD ; NUME[:SQUAD] = 13
    ENUM[14] = :FORMER_SQUAD ; NUME[:FORMER_SQUAD] = 14
    ENUM[15] = :OCCUPATION ; NUME[:OCCUPATION] = 15
    ENUM[16] = :FORMER_OCCUPATION ; NUME[:FORMER_OCCUPATION] = 16
end

class HistfigFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :RevealArtwork ; NUME[:RevealArtwork] = 0
    ENUM[1] = :EquipmentCreated ; NUME[:EquipmentCreated] = 1
    ENUM[2] = :Deity ; NUME[:Deity] = 2
    ENUM[3] = :Force ; NUME[:Force] = 3
    ENUM[4] = :SkeletalDeity ; NUME[:SkeletalDeity] = 4
    ENUM[5] = :RottingDeity ; NUME[:RottingDeity] = 5
    ENUM[6] = :WorldgenActed ; NUME[:WorldgenActed] = 6
    ENUM[7] = :Ghost ; NUME[:Ghost] = 7
    ENUM[8] = :SkinDestroyed ; NUME[:SkinDestroyed] = 8
    ENUM[9] = :MeatDestroyed ; NUME[:MeatDestroyed] = 9
    ENUM[10] = :BonesDestroyed ; NUME[:BonesDestroyed] = 10
    ENUM[11] = :BragOnKill ; NUME[:BragOnKill] = 11
    ENUM[12] = :KillQuest ; NUME[:KillQuest] = 12
    ENUM[13] = :Chatworthy ; NUME[:Chatworthy] = 13
    ENUM[14] = :Flashes ; NUME[:Flashes] = 14
    ENUM[15] = :NeverCull ; NUME[:NeverCull] = 15
end

class HistfigHfLinkType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MOTHER ; NUME[:MOTHER] = 0
    ENUM[1] = :FATHER ; NUME[:FATHER] = 1
    ENUM[2] = :SPOUSE ; NUME[:SPOUSE] = 2
    ENUM[3] = :CHILD ; NUME[:CHILD] = 3
    ENUM[4] = :DEITY ; NUME[:DEITY] = 4
    ENUM[5] = :LOVER ; NUME[:LOVER] = 5
    ENUM[6] = :PRISONER ; NUME[:PRISONER] = 6
    ENUM[7] = :IMPRISONER ; NUME[:IMPRISONER] = 7
    ENUM[8] = :MASTER ; NUME[:MASTER] = 8
    ENUM[9] = :APPRENTICE ; NUME[:APPRENTICE] = 9
    ENUM[10] = :COMPANION ; NUME[:COMPANION] = 10
    ENUM[11] = :FORMER_MASTER ; NUME[:FORMER_MASTER] = 11
    ENUM[12] = :FORMER_APPRENTICE ; NUME[:FORMER_APPRENTICE] = 12
    ENUM[13] = :PET_OWNER ; NUME[:PET_OWNER] = 13
    ENUM[14] = :FORMER_SPOUSE ; NUME[:FORMER_SPOUSE] = 14
    ENUM[15] = :DECEASED_SPOUSE ; NUME[:DECEASED_SPOUSE] = 15
end

class HistfigRelationshipType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Mother ; NUME[:Mother] = 0
    ENUM[1] = :Father ; NUME[:Father] = 1
    ENUM[2] = :Parent ; NUME[:Parent] = 2
    ENUM[3] = :Husband ; NUME[:Husband] = 3
    ENUM[4] = :Wife ; NUME[:Wife] = 4
    ENUM[5] = :Spouse ; NUME[:Spouse] = 5
    ENUM[6] = :SonEldest ; NUME[:SonEldest] = 6
    ENUM[7] = :SonEldest2 ; NUME[:SonEldest2] = 7
    ENUM[8] = :SonEldest3 ; NUME[:SonEldest3] = 8
    ENUM[9] = :SonEldest4 ; NUME[:SonEldest4] = 9
    ENUM[10] = :SonEldest5 ; NUME[:SonEldest5] = 10
    ENUM[11] = :SonEldest6 ; NUME[:SonEldest6] = 11
    ENUM[12] = :SonEldest7 ; NUME[:SonEldest7] = 12
    ENUM[13] = :SonEldest8 ; NUME[:SonEldest8] = 13
    ENUM[14] = :SonEldest9 ; NUME[:SonEldest9] = 14
    ENUM[15] = :SonEldest10 ; NUME[:SonEldest10] = 15
    ENUM[16] = :Son ; NUME[:Son] = 16
    ENUM[17] = :SonYoungest ; NUME[:SonYoungest] = 17
    ENUM[18] = :SonOnly ; NUME[:SonOnly] = 18
    ENUM[19] = :DaughterEldest ; NUME[:DaughterEldest] = 19
    ENUM[20] = :DaughterEldest2 ; NUME[:DaughterEldest2] = 20
    ENUM[21] = :DaughterEldest3 ; NUME[:DaughterEldest3] = 21
    ENUM[22] = :DaughterEldest4 ; NUME[:DaughterEldest4] = 22
    ENUM[23] = :DaughterEldest5 ; NUME[:DaughterEldest5] = 23
    ENUM[24] = :DaughterEldest6 ; NUME[:DaughterEldest6] = 24
    ENUM[25] = :DaughterEldest7 ; NUME[:DaughterEldest7] = 25
    ENUM[26] = :DaughterEldest8 ; NUME[:DaughterEldest8] = 26
    ENUM[27] = :DaughterEldest9 ; NUME[:DaughterEldest9] = 27
    ENUM[28] = :DaughterEldest10 ; NUME[:DaughterEldest10] = 28
    ENUM[29] = :Daughter ; NUME[:Daughter] = 29
    ENUM[30] = :DaughterOnly ; NUME[:DaughterOnly] = 30
    ENUM[31] = :DaughterYoungest ; NUME[:DaughterYoungest] = 31
    ENUM[32] = :ChildEldest ; NUME[:ChildEldest] = 32
    ENUM[33] = :ChildEldest2 ; NUME[:ChildEldest2] = 33
    ENUM[34] = :ChildEldest3 ; NUME[:ChildEldest3] = 34
    ENUM[35] = :ChildEldest4 ; NUME[:ChildEldest4] = 35
    ENUM[36] = :ChildEldest5 ; NUME[:ChildEldest5] = 36
    ENUM[37] = :ChildEldest6 ; NUME[:ChildEldest6] = 37
    ENUM[38] = :ChildEldest7 ; NUME[:ChildEldest7] = 38
    ENUM[39] = :ChildEldest8 ; NUME[:ChildEldest8] = 39
    ENUM[40] = :ChildEldest9 ; NUME[:ChildEldest9] = 40
    ENUM[41] = :ChildEldest10 ; NUME[:ChildEldest10] = 41
    ENUM[42] = :Child ; NUME[:Child] = 42
    ENUM[43] = :ChildYoungest ; NUME[:ChildYoungest] = 43
    ENUM[44] = :ChildOnly ; NUME[:ChildOnly] = 44
    ENUM[45] = :PaternalGrandmother ; NUME[:PaternalGrandmother] = 45
    ENUM[46] = :PaternalGrandfather ; NUME[:PaternalGrandfather] = 46
    ENUM[47] = :MaternalGrandmother ; NUME[:MaternalGrandmother] = 47
    ENUM[48] = :MaternalGrandfather ; NUME[:MaternalGrandfather] = 48
    ENUM[49] = :Grandmother ; NUME[:Grandmother] = 49
    ENUM[50] = :Grandfather ; NUME[:Grandfather] = 50
    ENUM[51] = :Grandparent ; NUME[:Grandparent] = 51
    ENUM[52] = :OlderBrother ; NUME[:OlderBrother] = 52
    ENUM[53] = :OlderSister ; NUME[:OlderSister] = 53
    ENUM[54] = :OlderSibling ; NUME[:OlderSibling] = 54
    ENUM[55] = :YoungerBrother ; NUME[:YoungerBrother] = 55
    ENUM[56] = :YoungerSister ; NUME[:YoungerSister] = 56
    ENUM[57] = :YoungerSibling ; NUME[:YoungerSibling] = 57
    ENUM[58] = :Cousin ; NUME[:Cousin] = 58
    ENUM[59] = :Aunt ; NUME[:Aunt] = 59
    ENUM[60] = :Uncle ; NUME[:Uncle] = 60
    ENUM[61] = :Niece ; NUME[:Niece] = 61
    ENUM[62] = :Nephew ; NUME[:Nephew] = 62
    ENUM[63] = :Sibling ; NUME[:Sibling] = 63
    ENUM[64] = :Grandchild ; NUME[:Grandchild] = 64
    ENUM[65] = :OlderHalfBrother ; NUME[:OlderHalfBrother] = 65
    ENUM[66] = :OlderHalfSister ; NUME[:OlderHalfSister] = 66
    ENUM[67] = :OlderHalfSibling ; NUME[:OlderHalfSibling] = 67
    ENUM[68] = :YoungerHalfBrother ; NUME[:YoungerHalfBrother] = 68
    ENUM[69] = :YoungerHalfSister ; NUME[:YoungerHalfSister] = 69
    ENUM[70] = :YoungerHalfSibling ; NUME[:YoungerHalfSibling] = 70
    ENUM[71] = :HalfSibling ; NUME[:HalfSibling] = 71
end

class HistfigSiteLinkType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :OCCUPATION ; NUME[:OCCUPATION] = 0
    ENUM[1] = :SEAT_OF_POWER ; NUME[:SEAT_OF_POWER] = 1
    ENUM[2] = :HANGOUT ; NUME[:HANGOUT] = 2
    ENUM[3] = :HOME_SITE_ABSTRACT_BUILDING ; NUME[:HOME_SITE_ABSTRACT_BUILDING] = 3
    ENUM[4] = :HOME_SITE_REALIZATION_BUILDING ; NUME[:HOME_SITE_REALIZATION_BUILDING] = 4
    ENUM[5] = :LAIR ; NUME[:LAIR] = 5
    ENUM[6] = :HOME_SITE_REALIZATION_SUL ; NUME[:HOME_SITE_REALIZATION_SUL] = 6
    ENUM[7] = :HOME_SITE_SAVED_CIVZONE ; NUME[:HOME_SITE_SAVED_CIVZONE] = 7
    ENUM[8] = :PRISON_ABSTRACT_BUILDING ; NUME[:PRISON_ABSTRACT_BUILDING] = 8
    ENUM[9] = :PRISON_SITE_BUILDING_PROFILE ; NUME[:PRISON_SITE_BUILDING_PROFILE] = 9
end

class HistoricalEntityType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Civilization ; NUME[:Civilization] = 0
    ENUM[1] = :SiteGovernment ; NUME[:SiteGovernment] = 1
    ENUM[2] = :VesselCrew ; NUME[:VesselCrew] = 2
    ENUM[3] = :MigratingGroup ; NUME[:MigratingGroup] = 3
    ENUM[4] = :NomadicGroup ; NUME[:NomadicGroup] = 4
    ENUM[5] = :Religion ; NUME[:Religion] = 5
    ENUM[6] = :MilitaryUnit ; NUME[:MilitaryUnit] = 6
    ENUM[7] = :Outcast ; NUME[:Outcast] = 7
    ENUM[8] = :PerformanceTroupe ; NUME[:PerformanceTroupe] = 8
    ENUM[9] = :MerchantCompany ; NUME[:MerchantCompany] = 9
    ENUM[10] = :Guild ; NUME[:Guild] = 10
end

class HistoryEventCollectionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :WAR ; NUME[:WAR] = 0
    ENUM[1] = :BATTLE ; NUME[:BATTLE] = 1
    ENUM[2] = :DUEL ; NUME[:DUEL] = 2
    ENUM[3] = :SITE_CONQUERED ; NUME[:SITE_CONQUERED] = 3
    ENUM[4] = :ABDUCTION ; NUME[:ABDUCTION] = 4
    ENUM[5] = :THEFT ; NUME[:THEFT] = 5
    ENUM[6] = :BEAST_ATTACK ; NUME[:BEAST_ATTACK] = 6
    ENUM[7] = :JOURNEY ; NUME[:JOURNEY] = 7
    ENUM[8] = :INSURRECTION ; NUME[:INSURRECTION] = 8
    ENUM[9] = :OCCASION ; NUME[:OCCASION] = 9
    ENUM[10] = :PERFORMANCE ; NUME[:PERFORMANCE] = 10
    ENUM[11] = :COMPETITION ; NUME[:COMPETITION] = 11
    ENUM[12] = :PROCESSION ; NUME[:PROCESSION] = 12
    ENUM[13] = :CEREMONY ; NUME[:CEREMONY] = 13
    ENUM[14] = :PURGE ; NUME[:PURGE] = 14
    ENUM[15] = :RAID ; NUME[:RAID] = 15
    ENUM[16] = :PERSECUTION ; NUME[:PERSECUTION] = 16
    ENUM[17] = :ENTITY_OVERTHROWN ; NUME[:ENTITY_OVERTHROWN] = 17
end

class HistoryEventFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Hidden ; NUME[:Hidden] = 0
end

class HistoryEventMerchantFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Vanished ; NUME[:Vanished] = 0
    ENUM[1] = :Hardship ; NUME[:Hardship] = 1
    ENUM[2] = :Seized ; NUME[:Seized] = 2
    ENUM[3] = :Offended ; NUME[:Offended] = 3
    ENUM[4] = :MissingGoods ; NUME[:MissingGoods] = 4
    ENUM[5] = :Tribute ; NUME[:Tribute] = 5
end

class HistoryEventReason < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Insurrection ; NUME[:Insurrection] = 0 ; Caption[:Insurrection] = 'for an insurrection'
    ENUM[1] = :Adventure ; NUME[:Adventure] = 1 ; Caption[:Adventure] = 'to adventure'
    ENUM[2] = :Guide ; NUME[:Guide] = 2 ; Caption[:Guide] = 'as a guide'
    ENUM[3] = :Rescued ; NUME[:Rescued] = 3 ; Caption[:Rescued] = 'in order to be rescued'
    ENUM[4] = :SphereAlignment ; NUME[:SphereAlignment] = 4 ; Caption[:SphereAlignment] = 'due to their cosmic similarity'
    ENUM[5] = :MaintainBalanceInUniverse ; NUME[:MaintainBalanceInUniverse] = 5 ; Caption[:MaintainBalanceInUniverse] = 'in order to maintain balance in the universe'
    ENUM[6] = :HighlightBoundariesBetweenWorlds ; NUME[:HighlightBoundariesBetweenWorlds] = 6 ; Caption[:HighlightBoundariesBetweenWorlds] = 'to create a monument to the boundaries between realities'
    ENUM[7] = :SowTheSeedsOfChaosInTheWorld ; NUME[:SowTheSeedsOfChaosInTheWorld] = 7 ; Caption[:SowTheSeedsOfChaosInTheWorld] = 'to sow the seeds of chaos within'
    ENUM[8] = :ProvideOpportunitiesForCourage ; NUME[:ProvideOpportunitiesForCourage] = 8 ; Caption[:ProvideOpportunitiesForCourage] = 'to provide opportunities for courage to rise'
    ENUM[9] = :BringDeathToTheWorld ; NUME[:BringDeathToTheWorld] = 9 ; Caption[:BringDeathToTheWorld] = 'that more might die'
    ENUM[10] = :LikedAppearance ; NUME[:LikedAppearance] = 10 ; Caption[:LikedAppearance] = 'that all should gaze upon a truly gruesome visage'
    ENUM[11] = :BecauseItWasDestined ; NUME[:BecauseItWasDestined] = 11 ; Caption[:BecauseItWasDestined] = 'because it was destined'
    ENUM[12] = :GreatFortressesBuiltAndTested ; NUME[:GreatFortressesBuiltAndTested] = 12 ; Caption[:GreatFortressesBuiltAndTested] = 'that great fortresses might be raised and tested in siege'
    ENUM[13] = :Whim ; NUME[:Whim] = 13 ; Caption[:Whim] = 'on a whim'
    ENUM[14] = :BringMiseryToTheWorld ; NUME[:BringMiseryToTheWorld] = 14 ; Caption[:BringMiseryToTheWorld] = 'that it might bathe in misery forever'
    ENUM[15] = :BringMurderToTheWorld ; NUME[:BringMurderToTheWorld] = 15 ; Caption[:BringMurderToTheWorld] = 'that more might be murdered'
    ENUM[16] = :BringNightmaresIntoReality ; NUME[:BringNightmaresIntoReality] = 16 ; Caption[:BringNightmaresIntoReality] = 'in order to make nightmares reality'
    ENUM[17] = :BringThralldomToTheWorld ; NUME[:BringThralldomToTheWorld] = 17 ; Caption[:BringThralldomToTheWorld] = 'in order to make thralls of everyone'
    ENUM[18] = :BringTortureToTheWorld ; NUME[:BringTortureToTheWorld] = 18 ; Caption[:BringTortureToTheWorld] = 'in order that acts of torture be perpetrated'
    ENUM[19] = :ProvideOpportunitiesForActsOfValor ; NUME[:ProvideOpportunitiesForActsOfValor] = 19 ; Caption[:ProvideOpportunitiesForActsOfValor] = 'to provide opportunities for acts of valor to be performed'
    ENUM[20] = :BringWarToTheWorld ; NUME[:BringWarToTheWorld] = 20 ; Caption[:BringWarToTheWorld] = 'that war might rage forever'
    ENUM[21] = :FindRelative ; NUME[:FindRelative] = 21 ; Caption[:FindRelative] = 'in order to find a relative'
    ENUM[22] = :OfferCondolences ; NUME[:OfferCondolences] = 22 ; Caption[:OfferCondolences] = 'to offer condolences'
    ENUM[23] = :BeBroughtToSafety ; NUME[:BeBroughtToSafety] = 23 ; Caption[:BeBroughtToSafety] = 'in order to be brought to safety'
    ENUM[24] = :HelpWithRescue ; NUME[:HelpWithRescue] = 24 ; Caption[:HelpWithRescue] = 'to help with a rescue'
    ENUM[25] = :InsufficientWork ; NUME[:InsufficientWork] = 25 ; Caption[:InsufficientWork] = 'due to insufficient work'
    ENUM[26] = :WorkRequest ; NUME[:WorkRequest] = 26 ; Caption[:WorkRequest] = 'to request work'
    ENUM[27] = :MakeWeapon ; NUME[:MakeWeapon] = 27 ; Caption[:MakeWeapon] = 'that weapons be made'
    ENUM[28] = :VentAtBoss ; NUME[:VentAtBoss] = 28 ; Caption[:VentAtBoss] = 'to vent at somebody in charge'
    ENUM[29] = :CryOnBoss ; NUME[:CryOnBoss] = 29 ; Caption[:CryOnBoss] = 'to cry on somebody in charge'
    ENUM[30] = :ShouldHaveReachedGoal ; NUME[:ShouldHaveReachedGoal] = 30 ; Caption[:ShouldHaveReachedGoal] = 'as the goal was not reached'
    ENUM[31] = :InsufficientProgressTowardGoal ; NUME[:InsufficientProgressTowardGoal] = 31 ; Caption[:InsufficientProgressTowardGoal] = 'as insufficient progress was made toward the goal'
    ENUM[32] = :GoingWrongDirection ; NUME[:GoingWrongDirection] = 32 ; Caption[:GoingWrongDirection] = 'after going the wrong direction'
    ENUM[33] = :ArrivedAtLocation ; NUME[:ArrivedAtLocation] = 33 ; Caption[:ArrivedAtLocation] = 'after arriving at the location'
    ENUM[34] = :EntityNoLongerRules ; NUME[:EntityNoLongerRules] = 34 ; Caption[:EntityNoLongerRules] = 'as the relevant government was no longer in control'
    ENUM[35] = :LeftSite ; NUME[:LeftSite] = 35 ; Caption[:LeftSite] = 'after leaving the site'
    ENUM[36] = :ReunitedWithLovedOne ; NUME[:ReunitedWithLovedOne] = 36 ; Caption[:ReunitedWithLovedOne] = 'after being reunited with a loved one'
    ENUM[37] = :ViolentDisagreement ; NUME[:ViolentDisagreement] = 37 ; Caption[:ViolentDisagreement] = 'after a violent disagreement'
    ENUM[38] = :Adopted ; NUME[:Adopted] = 38 ; Caption[:Adopted] = 'after adoption'
    ENUM[39] = :TrueNameInvocation ; NUME[:TrueNameInvocation] = 39 ; Caption[:TrueNameInvocation] = 'after invocation of the true name'
    ENUM[40] = :ArrivedAtPerson ; NUME[:ArrivedAtPerson] = 40 ; Caption[:ArrivedAtPerson] = 'after finding an unknown creature'
    ENUM[41] = :EradicateBeasts ; NUME[:EradicateBeasts] = 41 ; Caption[:EradicateBeasts] = 'in order to eradicate beasts'
    ENUM[42] = :EntertainPeople ; NUME[:EntertainPeople] = 42 ; Caption[:EntertainPeople] = 'in order to entertain people'
    ENUM[43] = :MakeALivingAsAWarrior ; NUME[:MakeALivingAsAWarrior] = 43 ; Caption[:MakeALivingAsAWarrior] = 'in order to make a living as a warrior'
    ENUM[44] = :Study ; NUME[:Study] = 44 ; Caption[:Study] = 'in order to study'
    ENUM[45] = :Flight ; NUME[:Flight] = 45 ; Caption[:Flight] = 'in order to flee'
    ENUM[46] = :Scholarship ; NUME[:Scholarship] = 46 ; Caption[:Scholarship] = 'in order to pursue scholarship'
    ENUM[47] = :BeWithMaster ; NUME[:BeWithMaster] = 47 ; Caption[:BeWithMaster] = 'in order to be with the master'
    ENUM[48] = :BecomeCitizen ; NUME[:BecomeCitizen] = 48 ; Caption[:BecomeCitizen] = 'in order to become a citizen'
    ENUM[49] = :PrefersWorkingAlone ; NUME[:PrefersWorkingAlone] = 49 ; Caption[:PrefersWorkingAlone] = 'in order to continue working alone'
    ENUM[50] = :Jealousy ; NUME[:Jealousy] = 50 ; Caption[:Jealousy] = 'due to jealousy'
    ENUM[51] = :GlorifyHf ; NUME[:GlorifyHf] = 51 ; Caption[:GlorifyHf] = 'in order to glorify an unknown creature'
    ENUM[52] = :HaveNotPerformed ; NUME[:HaveNotPerformed] = 52 ; Caption[:HaveNotPerformed] = 'due to a lack of performances'
    ENUM[53] = :PreventedFromLeaving ; NUME[:PreventedFromLeaving] = 53 ; Caption[:PreventedFromLeaving] = 'after being prevented from leaving'
    ENUM[54] = :Curiosity ; NUME[:Curiosity] = 54 ; Caption[:Curiosity] = 'out of curiosity'
    ENUM[55] = :HireOnAsMercenary ; NUME[:HireOnAsMercenary] = 55 ; Caption[:HireOnAsMercenary] = 'to fill a role as a mercenary'
    ENUM[56] = :HireOnAsPerformer ; NUME[:HireOnAsPerformer] = 56 ; Caption[:HireOnAsPerformer] = 'to fill a role as a performer'
    ENUM[57] = :HireOnAsScholar ; NUME[:HireOnAsScholar] = 57 ; Caption[:HireOnAsScholar] = 'to fill a role as a scholar'
    ENUM[58] = :Drink ; NUME[:Drink] = 58 ; Caption[:Drink] = 'in order to drink'
    ENUM[59] = :AdmireArchitecture ; NUME[:AdmireArchitecture] = 59 ; Caption[:AdmireArchitecture] = 'in order to admire achitecture'
    ENUM[60] = :Pray ; NUME[:Pray] = 60 ; Caption[:Pray] = 'in order to pray'
    ENUM[61] = :Relax ; NUME[:Relax] = 61 ; Caption[:Relax] = 'in order to relax'
    ENUM[62] = :Danger ; NUME[:Danger] = 62 ; Caption[:Danger] = 'to experience danger'
    ENUM[63] = :CannotFindArtifact ; NUME[:CannotFindArtifact] = 63 ; Caption[:CannotFindArtifact] = 'after being unable to find an artifact'
    ENUM[64] = :FailedMood ; NUME[:FailedMood] = 64 ; Caption[:FailedMood] = 'after failing to create an artifact'
    ENUM[65] = :LackOfSleep ; NUME[:LackOfSleep] = 65 ; Caption[:LackOfSleep] = 'due to a lack of sleep'
    ENUM[66] = :TrappedInCage ; NUME[:TrappedInCage] = 66 ; Caption[:TrappedInCage] = 'after being trapped in a cage'
    ENUM[67] = :GreatDealOfStress ; NUME[:GreatDealOfStress] = 67 ; Caption[:GreatDealOfStress] = 'after a great deal of stress'
    ENUM[68] = :UnableToLeaveLocation ; NUME[:UnableToLeaveLocation] = 68 ; Caption[:UnableToLeaveLocation] = 'after being unable to leave a location'
    ENUM[69] = :SanctifyHf ; NUME[:SanctifyHf] = 69 ; Caption[:SanctifyHf] = 'in order to sanctify an unknown creature'
    ENUM[70] = :ArtifactIsHeirloomOfFamilyHfid ; NUME[:ArtifactIsHeirloomOfFamilyHfid] = 70 ; Caption[:ArtifactIsHeirloomOfFamilyHfid] = 'as an heirloom of the an unknown creature family'
    ENUM[71] = :CementBondsOfFriendship ; NUME[:CementBondsOfFriendship] = 71 ; Caption[:CementBondsOfFriendship] = 'in order to cement the bonds of friendship'
    ENUM[72] = :AsASymbolOfEverlastingPeace ; NUME[:AsASymbolOfEverlastingPeace] = 72 ; Caption[:AsASymbolOfEverlastingPeace] = 'as a symbol of everlasting peace'
    ENUM[73] = :OnAPilgrimage ; NUME[:OnAPilgrimage] = 73 ; Caption[:OnAPilgrimage] = 'on a pilgrimage'
    ENUM[74] = :GatherInformation ; NUME[:GatherInformation] = 74 ; Caption[:GatherInformation] = 'to gather information'
    ENUM[75] = :SeekSanctuary ; NUME[:SeekSanctuary] = 75 ; Caption[:SeekSanctuary] = 'in order to find sactuary'
    ENUM[76] = :PartOfTradeNegotiation ; NUME[:PartOfTradeNegotiation] = 76 ; Caption[:PartOfTradeNegotiation] = 'as part of a trade negotiation'
    ENUM[77] = :ArtifactIsSymbolOfEntityPosition ; NUME[:ArtifactIsSymbolOfEntityPosition] = 77 ; Caption[:ArtifactIsSymbolOfEntityPosition] = 'as a symbol of authority within an unknown civilization'
    ENUM[78] = :FearOfPersecution ; NUME[:FearOfPersecution] = 78 ; Caption[:FearOfPersecution] = 'due to fear of persecution'
    ENUM[79] = :SmoothOperation ; NUME[:SmoothOperation] = 79 ; Caption[:SmoothOperation] = 'to smooth the operation of an unknown civilization'
    ENUM[80] = :NuanceBelief ; NUME[:NuanceBelief] = 80 ; Caption[:NuanceBelief] = 'due to a belief in nuances of'
    ENUM[81] = :SharedInterest ; NUME[:SharedInterest] = 81 ; Caption[:SharedInterest] = 'due to a shared interest in'
    ENUM[82] = :EnvyLiving ; NUME[:EnvyLiving] = 82 ; Caption[:EnvyLiving] = 'due to envy of those that live on'
    ENUM[83] = :DeathPanic ; NUME[:DeathPanic] = 83 ; Caption[:DeathPanic] = 'due to panic about what happens after death'
    ENUM[84] = :DeathFear ; NUME[:DeathFear] = 84 ; Caption[:DeathFear] = 'due to fear of death'
    ENUM[85] = :AvoidJudgement ; NUME[:AvoidJudgement] = 85 ; Caption[:AvoidJudgement] = 'unable to face any possible judgment and the afterlife'
    ENUM[86] = :DeathPride ; NUME[:DeathPride] = 86 ; Caption[:DeathPride] = 'being too proud to give in to death'
    ENUM[87] = :DeathVain ; NUME[:DeathVain] = 87 ; Caption[:DeathVain] = 'being too vain to give in to death'
    ENUM[88] = :DeathAmbition ; NUME[:DeathAmbition] = 88 ; Caption[:DeathAmbition] = 'having ambitions for which death was only a small obstacle'
    ENUM[89] = :LackOfFunds ; NUME[:LackOfFunds] = 89 ; Caption[:LackOfFunds] = 'due to lack of funds'
    ENUM[90] = :BattleLosses ; NUME[:BattleLosses] = 90 ; Caption[:BattleLosses] = 'after taking heavy losses in battle'
    ENUM[91] = :ConvictionExile ; NUME[:ConvictionExile] = 91 ; Caption[:ConvictionExile] = 'after being exiled following a criminal conviction'
    ENUM[92] = :PriestVent ; NUME[:PriestVent] = 92 ; Caption[:PriestVent] = 'to vent at a priest'
    ENUM[93] = :PriestCry ; NUME[:PriestCry] = 93 ; Caption[:PriestCry] = 'to cry on a priest'
end

class HistoryEventSimpleBattleSubtype < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SCUFFLE ; NUME[:SCUFFLE] = 0
    ENUM[1] = :ATTACK ; NUME[:ATTACK] = 1
    ENUM[2] = :SURPRISE ; NUME[:SURPRISE] = 2
    ENUM[3] = :AMBUSH ; NUME[:AMBUSH] = 3
    ENUM[4] = :HAPPEN_UPON ; NUME[:HAPPEN_UPON] = 4
    ENUM[5] = :CORNER ; NUME[:CORNER] = 5
    ENUM[6] = :CONFRONT ; NUME[:CONFRONT] = 6
    ENUM[7] = :LOSE_AFTER_RECEIVE_WOUND ; NUME[:LOSE_AFTER_RECEIVE_WOUND] = 7
    ENUM[8] = :LOSE_AFTER_INFLICT_WOUND ; NUME[:LOSE_AFTER_INFLICT_WOUND] = 8
    ENUM[9] = :LOSE_AFTER_EXCHANGE_WOUND ; NUME[:LOSE_AFTER_EXCHANGE_WOUND] = 9
    ENUM[10] = :SUBDUED ; NUME[:SUBDUED] = 10
    ENUM[11] = :GOT_INTO_A_BRAWL ; NUME[:GOT_INTO_A_BRAWL] = 11
end

class HistoryEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :WAR_ATTACKED_SITE ; NUME[:WAR_ATTACKED_SITE] = 0
    ENUM[1] = :WAR_DESTROYED_SITE ; NUME[:WAR_DESTROYED_SITE] = 1
    ENUM[2] = :CREATED_SITE ; NUME[:CREATED_SITE] = 2
    ENUM[3] = :HIST_FIGURE_DIED ; NUME[:HIST_FIGURE_DIED] = 3
    ENUM[4] = :ADD_HF_ENTITY_LINK ; NUME[:ADD_HF_ENTITY_LINK] = 4
    ENUM[5] = :REMOVE_HF_ENTITY_LINK ; NUME[:REMOVE_HF_ENTITY_LINK] = 5
    ENUM[6] = :FIRST_CONTACT ; NUME[:FIRST_CONTACT] = 6
    ENUM[7] = :FIRST_CONTACT_FAILED ; NUME[:FIRST_CONTACT_FAILED] = 7
    ENUM[8] = :TOPICAGREEMENT_CONCLUDED ; NUME[:TOPICAGREEMENT_CONCLUDED] = 8
    ENUM[9] = :TOPICAGREEMENT_REJECTED ; NUME[:TOPICAGREEMENT_REJECTED] = 9
    ENUM[10] = :TOPICAGREEMENT_MADE ; NUME[:TOPICAGREEMENT_MADE] = 10
    ENUM[11] = :WAR_PEACE_ACCEPTED ; NUME[:WAR_PEACE_ACCEPTED] = 11
    ENUM[12] = :WAR_PEACE_REJECTED ; NUME[:WAR_PEACE_REJECTED] = 12
    ENUM[13] = :DIPLOMAT_LOST ; NUME[:DIPLOMAT_LOST] = 13
    ENUM[14] = :AGREEMENTS_VOIDED ; NUME[:AGREEMENTS_VOIDED] = 14
    ENUM[15] = :MERCHANT ; NUME[:MERCHANT] = 15
    ENUM[16] = :ARTIFACT_HIDDEN ; NUME[:ARTIFACT_HIDDEN] = 16
    ENUM[17] = :ARTIFACT_POSSESSED ; NUME[:ARTIFACT_POSSESSED] = 17
    ENUM[18] = :ARTIFACT_CREATED ; NUME[:ARTIFACT_CREATED] = 18
    ENUM[19] = :ARTIFACT_LOST ; NUME[:ARTIFACT_LOST] = 19
    ENUM[20] = :ARTIFACT_FOUND ; NUME[:ARTIFACT_FOUND] = 20
    ENUM[21] = :ARTIFACT_RECOVERED ; NUME[:ARTIFACT_RECOVERED] = 21
    ENUM[22] = :ARTIFACT_DROPPED ; NUME[:ARTIFACT_DROPPED] = 22
    ENUM[23] = :RECLAIM_SITE ; NUME[:RECLAIM_SITE] = 23
    ENUM[24] = :HF_DESTROYED_SITE ; NUME[:HF_DESTROYED_SITE] = 24
    ENUM[25] = :SITE_DIED ; NUME[:SITE_DIED] = 25
    ENUM[26] = :SITE_RETIRED ; NUME[:SITE_RETIRED] = 26
    ENUM[27] = :ENTITY_CREATED ; NUME[:ENTITY_CREATED] = 27
    ENUM[28] = :ENTITY_ACTION ; NUME[:ENTITY_ACTION] = 28
    ENUM[29] = :ENTITY_INCORPORATED ; NUME[:ENTITY_INCORPORATED] = 29
    ENUM[30] = :CREATED_BUILDING ; NUME[:CREATED_BUILDING] = 30
    ENUM[31] = :REPLACED_BUILDING ; NUME[:REPLACED_BUILDING] = 31
    ENUM[32] = :ADD_HF_SITE_LINK ; NUME[:ADD_HF_SITE_LINK] = 32
    ENUM[33] = :REMOVE_HF_SITE_LINK ; NUME[:REMOVE_HF_SITE_LINK] = 33
    ENUM[34] = :ADD_HF_HF_LINK ; NUME[:ADD_HF_HF_LINK] = 34
    ENUM[35] = :REMOVE_HF_HF_LINK ; NUME[:REMOVE_HF_HF_LINK] = 35
    ENUM[36] = :ENTITY_RAZED_BUILDING ; NUME[:ENTITY_RAZED_BUILDING] = 36
    ENUM[37] = :MASTERPIECE_CREATED_ARCH_DESIGN ; NUME[:MASTERPIECE_CREATED_ARCH_DESIGN] = 37
    ENUM[38] = :MASTERPIECE_CREATED_ARCH_CONSTRUCT ; NUME[:MASTERPIECE_CREATED_ARCH_CONSTRUCT] = 38
    ENUM[39] = :MASTERPIECE_CREATED_ITEM ; NUME[:MASTERPIECE_CREATED_ITEM] = 39
    ENUM[40] = :MASTERPIECE_CREATED_DYE_ITEM ; NUME[:MASTERPIECE_CREATED_DYE_ITEM] = 40
    ENUM[41] = :MASTERPIECE_CREATED_ITEM_IMPROVEMENT ; NUME[:MASTERPIECE_CREATED_ITEM_IMPROVEMENT] = 41
    ENUM[42] = :MASTERPIECE_CREATED_FOOD ; NUME[:MASTERPIECE_CREATED_FOOD] = 42
    ENUM[43] = :MASTERPIECE_CREATED_ENGRAVING ; NUME[:MASTERPIECE_CREATED_ENGRAVING] = 43
    ENUM[44] = :MASTERPIECE_LOST ; NUME[:MASTERPIECE_LOST] = 44
    ENUM[45] = :CHANGE_HF_STATE ; NUME[:CHANGE_HF_STATE] = 45
    ENUM[46] = :CHANGE_HF_JOB ; NUME[:CHANGE_HF_JOB] = 46
    ENUM[47] = :WAR_FIELD_BATTLE ; NUME[:WAR_FIELD_BATTLE] = 47
    ENUM[48] = :WAR_PLUNDERED_SITE ; NUME[:WAR_PLUNDERED_SITE] = 48
    ENUM[49] = :WAR_SITE_NEW_LEADER ; NUME[:WAR_SITE_NEW_LEADER] = 49
    ENUM[50] = :WAR_SITE_TRIBUTE_FORCED ; NUME[:WAR_SITE_TRIBUTE_FORCED] = 50
    ENUM[51] = :WAR_SITE_TAKEN_OVER ; NUME[:WAR_SITE_TAKEN_OVER] = 51
    ENUM[52] = :BODY_ABUSED ; NUME[:BODY_ABUSED] = 52
    ENUM[53] = :HIST_FIGURE_ABDUCTED ; NUME[:HIST_FIGURE_ABDUCTED] = 53
    ENUM[54] = :ITEM_STOLEN ; NUME[:ITEM_STOLEN] = 54
    ENUM[55] = :HF_RAZED_BUILDING ; NUME[:HF_RAZED_BUILDING] = 55
    ENUM[56] = :CREATURE_DEVOURED ; NUME[:CREATURE_DEVOURED] = 56
    ENUM[57] = :HIST_FIGURE_WOUNDED ; NUME[:HIST_FIGURE_WOUNDED] = 57
    ENUM[58] = :HIST_FIGURE_SIMPLE_BATTLE_EVENT ; NUME[:HIST_FIGURE_SIMPLE_BATTLE_EVENT] = 58
    ENUM[59] = :CREATED_WORLD_CONSTRUCTION ; NUME[:CREATED_WORLD_CONSTRUCTION] = 59
    ENUM[60] = :HIST_FIGURE_REUNION ; NUME[:HIST_FIGURE_REUNION] = 60
    ENUM[61] = :HIST_FIGURE_REACH_SUMMIT ; NUME[:HIST_FIGURE_REACH_SUMMIT] = 61
    ENUM[62] = :HIST_FIGURE_TRAVEL ; NUME[:HIST_FIGURE_TRAVEL] = 62
    ENUM[63] = :HIST_FIGURE_NEW_PET ; NUME[:HIST_FIGURE_NEW_PET] = 63
    ENUM[64] = :ASSUME_IDENTITY ; NUME[:ASSUME_IDENTITY] = 64
    ENUM[65] = :CREATE_ENTITY_POSITION ; NUME[:CREATE_ENTITY_POSITION] = 65
    ENUM[66] = :CHANGE_CREATURE_TYPE ; NUME[:CHANGE_CREATURE_TYPE] = 66
    ENUM[67] = :HIST_FIGURE_REVIVED ; NUME[:HIST_FIGURE_REVIVED] = 67
    ENUM[68] = :HF_LEARNS_SECRET ; NUME[:HF_LEARNS_SECRET] = 68
    ENUM[69] = :CHANGE_HF_BODY_STATE ; NUME[:CHANGE_HF_BODY_STATE] = 69
    ENUM[70] = :HF_ACT_ON_BUILDING ; NUME[:HF_ACT_ON_BUILDING] = 70
    ENUM[71] = :HF_DOES_INTERACTION ; NUME[:HF_DOES_INTERACTION] = 71
    ENUM[72] = :HF_CONFRONTED ; NUME[:HF_CONFRONTED] = 72
    ENUM[73] = :ENTITY_LAW ; NUME[:ENTITY_LAW] = 73
    ENUM[74] = :HF_GAINS_SECRET_GOAL ; NUME[:HF_GAINS_SECRET_GOAL] = 74
    ENUM[75] = :ARTIFACT_STORED ; NUME[:ARTIFACT_STORED] = 75
    ENUM[76] = :AGREEMENT_FORMED ; NUME[:AGREEMENT_FORMED] = 76
    ENUM[77] = :SITE_DISPUTE ; NUME[:SITE_DISPUTE] = 77
    ENUM[78] = :AGREEMENT_CONCLUDED ; NUME[:AGREEMENT_CONCLUDED] = 78
    ENUM[79] = :INSURRECTION_STARTED ; NUME[:INSURRECTION_STARTED] = 79
    ENUM[80] = :INSURRECTION_ENDED ; NUME[:INSURRECTION_ENDED] = 80
    ENUM[81] = :HF_ATTACKED_SITE ; NUME[:HF_ATTACKED_SITE] = 81
    ENUM[82] = :PERFORMANCE ; NUME[:PERFORMANCE] = 82
    ENUM[83] = :COMPETITION ; NUME[:COMPETITION] = 83
    ENUM[84] = :PROCESSION ; NUME[:PROCESSION] = 84
    ENUM[85] = :CEREMONY ; NUME[:CEREMONY] = 85
    ENUM[86] = :KNOWLEDGE_DISCOVERED ; NUME[:KNOWLEDGE_DISCOVERED] = 86
    ENUM[87] = :ARTIFACT_TRANSFORMED ; NUME[:ARTIFACT_TRANSFORMED] = 87
    ENUM[88] = :ARTIFACT_DESTROYED ; NUME[:ARTIFACT_DESTROYED] = 88
    ENUM[89] = :HF_RELATIONSHIP_DENIED ; NUME[:HF_RELATIONSHIP_DENIED] = 89
    ENUM[90] = :REGIONPOP_INCORPORATED_INTO_ENTITY ; NUME[:REGIONPOP_INCORPORATED_INTO_ENTITY] = 90
    ENUM[91] = :POETIC_FORM_CREATED ; NUME[:POETIC_FORM_CREATED] = 91
    ENUM[92] = :MUSICAL_FORM_CREATED ; NUME[:MUSICAL_FORM_CREATED] = 92
    ENUM[93] = :DANCE_FORM_CREATED ; NUME[:DANCE_FORM_CREATED] = 93
    ENUM[94] = :WRITTEN_CONTENT_COMPOSED ; NUME[:WRITTEN_CONTENT_COMPOSED] = 94
    ENUM[95] = :CHANGE_HF_MOOD ; NUME[:CHANGE_HF_MOOD] = 95
    ENUM[96] = :ARTIFACT_CLAIM_FORMED ; NUME[:ARTIFACT_CLAIM_FORMED] = 96
    ENUM[97] = :ARTIFACT_GIVEN ; NUME[:ARTIFACT_GIVEN] = 97
    ENUM[98] = :HF_ACT_ON_ARTIFACT ; NUME[:HF_ACT_ON_ARTIFACT] = 98
    ENUM[99] = :HF_RECRUITED_UNIT_TYPE_FOR_ENTITY ; NUME[:HF_RECRUITED_UNIT_TYPE_FOR_ENTITY] = 99
    ENUM[100] = :HFS_FORMED_REPUTATION_RELATIONSHIP ; NUME[:HFS_FORMED_REPUTATION_RELATIONSHIP] = 100
    ENUM[101] = :ARTIFACT_COPIED ; NUME[:ARTIFACT_COPIED] = 101
    ENUM[102] = :SNEAK_INTO_SITE ; NUME[:SNEAK_INTO_SITE] = 102
    ENUM[103] = :SPOTTED_LEAVING_SITE ; NUME[:SPOTTED_LEAVING_SITE] = 103
    ENUM[104] = :ENTITY_SEARCHED_SITE ; NUME[:ENTITY_SEARCHED_SITE] = 104
    ENUM[105] = :HF_FREED ; NUME[:HF_FREED] = 105
    ENUM[106] = :HIST_FIGURE_SIMPLE_ACTION ; NUME[:HIST_FIGURE_SIMPLE_ACTION] = 106
    ENUM[107] = :ENTITY_RAMPAGED_IN_SITE ; NUME[:ENTITY_RAMPAGED_IN_SITE] = 107
    ENUM[108] = :ENTITY_FLED_SITE ; NUME[:ENTITY_FLED_SITE] = 108
    ENUM[109] = :TACTICAL_SITUATION ; NUME[:TACTICAL_SITUATION] = 109
    ENUM[110] = :SQUAD_VS_SQUAD ; NUME[:SQUAD_VS_SQUAD] = 110
    ENUM[111] = :SITE_SURRENDERED ; NUME[:SITE_SURRENDERED] = 111
    ENUM[112] = :ENTITY_EXPELS_HF ; NUME[:ENTITY_EXPELS_HF] = 112
    ENUM[113] = :TRADE ; NUME[:TRADE] = 113
    ENUM[114] = :ADD_ENTITY_SITE_PROFILE_FLAG ; NUME[:ADD_ENTITY_SITE_PROFILE_FLAG] = 114
    ENUM[115] = :GAMBLE ; NUME[:GAMBLE] = 115
    ENUM[116] = :ADD_HF_ENTITY_HONOR ; NUME[:ADD_HF_ENTITY_HONOR] = 116
    ENUM[117] = :ENTITY_DISSOLVED ; NUME[:ENTITY_DISSOLVED] = 117
    ENUM[118] = :ENTITY_EQUIPMENT_PURCHASE ; NUME[:ENTITY_EQUIPMENT_PURCHASE] = 118
    ENUM[119] = :MODIFIED_BUILDING ; NUME[:MODIFIED_BUILDING] = 119
    ENUM[120] = :BUILDING_PROFILE_ACQUIRED ; NUME[:BUILDING_PROFILE_ACQUIRED] = 120
    ENUM[121] = :HF_PREACH ; NUME[:HF_PREACH] = 121
    ENUM[122] = :ENTITY_PERSECUTED ; NUME[:ENTITY_PERSECUTED] = 122
    ENUM[123] = :ENTITY_BREACH_FEATURE_LAYER ; NUME[:ENTITY_BREACH_FEATURE_LAYER] = 123
    ENUM[124] = :ENTITY_ALLIANCE_FORMED ; NUME[:ENTITY_ALLIANCE_FORMED] = 124
    ENUM[125] = :HF_RANSOMED ; NUME[:HF_RANSOMED] = 125
    ENUM[126] = :HF_ENSLAVED ; NUME[:HF_ENSLAVED] = 126
    ENUM[127] = :SABOTAGE ; NUME[:SABOTAGE] = 127
    ENUM[128] = :ENTITY_OVERTHROWN ; NUME[:ENTITY_OVERTHROWN] = 128
    ENUM[129] = :HFS_FORMED_INTRIGUE_RELATIONSHIP ; NUME[:HFS_FORMED_INTRIGUE_RELATIONSHIP] = 129
    ENUM[130] = :FAILED_INTRIGUE_CORRUPTION ; NUME[:FAILED_INTRIGUE_CORRUPTION] = 130
    ENUM[131] = :HF_CONVICTED ; NUME[:HF_CONVICTED] = 131
    ENUM[132] = :FAILED_FRAME_ATTEMPT ; NUME[:FAILED_FRAME_ATTEMPT] = 132
    ENUM[133] = :HF_INTERROGATED ; NUME[:HF_INTERROGATED] = 133
end

class IdentityType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    IdTag = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1 ; IdTag[:None] = 'histfig_id'
    ENUM[0] = :HidingCurse ; NUME[:HidingCurse] = 0 ; IdTag[:HidingCurse] = 'histfig_id'
    ENUM[1] = :Impersonating ; NUME[:Impersonating] = 1 ; IdTag[:Impersonating] = 'histfig_id'
    ENUM[2] = :TrueName ; NUME[:TrueName] = 2 ; IdTag[:TrueName] = 'histfig_id'
    ENUM[3] = :FalseIdentity ; NUME[:FalseIdentity] = 3 ; IdTag[:FalseIdentity] = 'nemesis_id'
    ENUM[4] = :InfiltrationIdentity ; NUME[:InfiltrationIdentity] = 4 ; IdTag[:InfiltrationIdentity] = 'histfig_id'
    ENUM[5] = :Identity ; NUME[:Identity] = 5 ; IdTag[:Identity] = 'histfig_id'
end

class ImprovementType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ART_IMAGE ; NUME[:ART_IMAGE] = 0
    ENUM[1] = :COVERED ; NUME[:COVERED] = 1
    ENUM[2] = :RINGS_HANGING ; NUME[:RINGS_HANGING] = 2
    ENUM[3] = :BANDS ; NUME[:BANDS] = 3
    ENUM[4] = :SPIKES ; NUME[:SPIKES] = 4
    ENUM[5] = :ITEMSPECIFIC ; NUME[:ITEMSPECIFIC] = 5
    ENUM[6] = :THREAD ; NUME[:THREAD] = 6
    ENUM[7] = :CLOTH ; NUME[:CLOTH] = 7
    ENUM[8] = :SEWN_IMAGE ; NUME[:SEWN_IMAGE] = 8
    ENUM[9] = :PAGES ; NUME[:PAGES] = 9
    ENUM[10] = :ILLUSTRATION ; NUME[:ILLUSTRATION] = 10
    ENUM[11] = :INSTRUMENT_PIECE ; NUME[:INSTRUMENT_PIECE] = 11
    ENUM[12] = :WRITING ; NUME[:WRITING] = 12
    ENUM[13] = :IMAGE_SET ; NUME[:IMAGE_SET] = 13
end

class InclusionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1] = :VEIN ; NUME[:VEIN] = 1
    ENUM[2] = :CLUSTER ; NUME[:CLUSTER] = 2
    ENUM[3] = :CLUSTER_SMALL ; NUME[:CLUSTER_SMALL] = 3
    ENUM[4] = :CLUSTER_ONE ; NUME[:CLUSTER_ONE] = 4
end

class InitDisplayFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :USE_GRAPHICS ; NUME[:USE_GRAPHICS] = 0
    ENUM[1] = :BLACK_SPACE ; NUME[:BLACK_SPACE] = 1
    ENUM[2] = :PARTIAL_PRINT ; NUME[:PARTIAL_PRINT] = 2
    ENUM[3] = :FRAME_BUFFER ; NUME[:FRAME_BUFFER] = 3
    ENUM[4] = :SINGLE_BUFFER ; NUME[:SINGLE_BUFFER] = 4
    ENUM[5] = :ACCUM_BUFFER ; NUME[:ACCUM_BUFFER] = 5
    ENUM[6] = :VBO ; NUME[:VBO] = 6
    ENUM[7] = :RENDER_2D ; NUME[:RENDER_2D] = 7
    ENUM[8] = :RENDER_2DHW ; NUME[:RENDER_2DHW] = 8
    ENUM[9] = :RENDER_2DASYNC ; NUME[:RENDER_2DASYNC] = 9
    ENUM[10] = :UNUSED_01_08 ; NUME[:UNUSED_01_08] = 10
    ENUM[11] = :TEXT ; NUME[:TEXT] = 11
    ENUM[12] = :SHADER ; NUME[:SHADER] = 12
    ENUM[13] = :NOT_RESIZABLE ; NUME[:NOT_RESIZABLE] = 13
    ENUM[14] = :ARB_SYNC ; NUME[:ARB_SYNC] = 14
end

class InitInputFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MOUSE_OFF ; NUME[:MOUSE_OFF] = 0
    ENUM[1] = :MOUSE_PICTURE ; NUME[:MOUSE_PICTURE] = 1
end

class InitMediaFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SOUND_OFF ; NUME[:SOUND_OFF] = 0
    ENUM[1] = :INTRO_OFF ; NUME[:INTRO_OFF] = 1
    ENUM[2] = :COMPRESS_SAVES ; NUME[:COMPRESS_SAVES] = 2
end

class InitWindowFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TOPMOST ; NUME[:TOPMOST] = 0
    ENUM[1] = :VSYNC_ON ; NUME[:VSYNC_ON] = 1
    ENUM[2] = :VSYNC_OFF ; NUME[:VSYNC_OFF] = 2
    ENUM[3] = :TEXTURE_LINEAR ; NUME[:TEXTURE_LINEAR] = 3
end

class InorganicFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :LAVA ; NUME[:LAVA] = 0
    ENUM[1] = :GENERATED ; NUME[:GENERATED] = 1
    ENUM[2] = :ENVIRONMENT_NON_SOIL_OCEAN ; NUME[:ENVIRONMENT_NON_SOIL_OCEAN] = 2
    ENUM[3] = :SEDIMENTARY ; NUME[:SEDIMENTARY] = 3
    ENUM[4] = :SEDIMENTARY_OCEAN_SHALLOW ; NUME[:SEDIMENTARY_OCEAN_SHALLOW] = 4
    ENUM[5] = :IGNEOUS_INTRUSIVE ; NUME[:IGNEOUS_INTRUSIVE] = 5
    ENUM[6] = :IGNEOUS_EXTRUSIVE ; NUME[:IGNEOUS_EXTRUSIVE] = 6
    ENUM[7] = :METAMORPHIC ; NUME[:METAMORPHIC] = 7
    ENUM[8] = :DEEP_SURFACE ; NUME[:DEEP_SURFACE] = 8
    ENUM[9] = :METAL_ORE ; NUME[:METAL_ORE] = 9
    ENUM[10] = :AQUIFER ; NUME[:AQUIFER] = 10
    ENUM[11] = :SOIL_ANY ; NUME[:SOIL_ANY] = 11
    ENUM[12] = :SOIL_OCEAN ; NUME[:SOIL_OCEAN] = 12
    ENUM[13] = :SOIL_SAND ; NUME[:SOIL_SAND] = 13
    ENUM[14] = :SEDIMENTARY_OCEAN_DEEP ; NUME[:SEDIMENTARY_OCEAN_DEEP] = 14
    ENUM[15] = :THREAD_METAL ; NUME[:THREAD_METAL] = 15
    ENUM[16] = :SPECIAL ; NUME[:SPECIAL] = 16
    ENUM[17] = :SOIL ; NUME[:SOIL] = 17
    ENUM[18] = :DEEP_SPECIAL ; NUME[:DEEP_SPECIAL] = 18
    ENUM[19] = :DIVINE ; NUME[:DIVINE] = 19
    ENUM[25] = :WAFERS ; NUME[:WAFERS] = 25
end

class InstrumentFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :INDEFINITE_PITCH ; NUME[:INDEFINITE_PITCH] = 0
    ENUM[1] = :PLACED_AS_BUILDING ; NUME[:PLACED_AS_BUILDING] = 1
    ENUM[2] = :METAL_MAT ; NUME[:METAL_MAT] = 2
    ENUM[3] = :STONE_MAT ; NUME[:STONE_MAT] = 3
    ENUM[4] = :WOOD_MAT ; NUME[:WOOD_MAT] = 4
    ENUM[5] = :GLASS_MAT ; NUME[:GLASS_MAT] = 5
    ENUM[6] = :CERAMIC_MAT ; NUME[:CERAMIC_MAT] = 6
    ENUM[7] = :SHELL_MAT ; NUME[:SHELL_MAT] = 7
    ENUM[8] = :BONE_MAT ; NUME[:BONE_MAT] = 8
end

class InsurrectionOutcome < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :LeadershipOverthrown ; NUME[:LeadershipOverthrown] = 0
    ENUM[1] = :PopulationGone ; NUME[:PopulationGone] = 1
    ENUM[2] = :Crushed ; NUME[:Crushed] = 2
end

class InteractionEffectLocationHint < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :IN_WATER ; NUME[:IN_WATER] = 0
    ENUM[1] = :IN_MAGMA ; NUME[:IN_MAGMA] = 1
    ENUM[2] = :NO_WATER ; NUME[:NO_WATER] = 2
    ENUM[3] = :NO_MAGMA ; NUME[:NO_MAGMA] = 3
    ENUM[4] = :NO_THICK_FOG ; NUME[:NO_THICK_FOG] = 4
    ENUM[5] = :OUTSIDE ; NUME[:OUTSIDE] = 5
end

class InteractionEffectType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ANIMATE ; NUME[:ANIMATE] = 0
    ENUM[1] = :ADD_SYNDROME ; NUME[:ADD_SYNDROME] = 1
    ENUM[2] = :RESURRECT ; NUME[:RESURRECT] = 2
    ENUM[3] = :CLEAN ; NUME[:CLEAN] = 3
    ENUM[4] = :CONTACT ; NUME[:CONTACT] = 4
    ENUM[5] = :MATERIAL_EMISSION ; NUME[:MATERIAL_EMISSION] = 5
    ENUM[6] = :HIDE ; NUME[:HIDE] = 6
    ENUM[7] = :PROPEL_UNIT ; NUME[:PROPEL_UNIT] = 7
    ENUM[8] = :SUMMON_UNIT ; NUME[:SUMMON_UNIT] = 8
    ENUM[9] = :CHANGE_WEATHER ; NUME[:CHANGE_WEATHER] = 9
    ENUM[10] = :RAISE_GHOST ; NUME[:RAISE_GHOST] = 10
    ENUM[11] = :CREATE_ITEM ; NUME[:CREATE_ITEM] = 11
    ENUM[12] = :CHANGE_ITEM_QUALITY ; NUME[:CHANGE_ITEM_QUALITY] = 12
end

class InteractionFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GENERATED ; NUME[:GENERATED] = 0
    ENUM[1] = :EXPERIMENT_ONLY ; NUME[:EXPERIMENT_ONLY] = 1
end

class InteractionSourceType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :REGION ; NUME[:REGION] = 0
    ENUM[1] = :SECRET ; NUME[:SECRET] = 1
    ENUM[2] = :DISTURBANCE ; NUME[:DISTURBANCE] = 2
    ENUM[3] = :DEITY ; NUME[:DEITY] = 3
    ENUM[4] = :ATTACK ; NUME[:ATTACK] = 4
    ENUM[5] = :INGESTION ; NUME[:INGESTION] = 5
    ENUM[6] = :CREATURE_ACTION ; NUME[:CREATURE_ACTION] = 6
    ENUM[7] = :UNDERGROUND_SPECIAL ; NUME[:UNDERGROUND_SPECIAL] = 7
    ENUM[8] = :EXPERIMENT ; NUME[:EXPERIMENT] = 8
end

class InteractionSourceUsageHint < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MAJOR_CURSE ; NUME[:MAJOR_CURSE] = 0
    ENUM[1] = :GREETING ; NUME[:GREETING] = 1
    ENUM[2] = :CLEAN_SELF ; NUME[:CLEAN_SELF] = 2
    ENUM[3] = :CLEAN_FRIEND ; NUME[:CLEAN_FRIEND] = 3
    ENUM[4] = :ATTACK ; NUME[:ATTACK] = 4
    ENUM[5] = :FLEEING ; NUME[:FLEEING] = 5
    ENUM[6] = :NEGATIVE_SOCIAL_RESPONSE ; NUME[:NEGATIVE_SOCIAL_RESPONSE] = 6
    ENUM[7] = :TORMENT ; NUME[:TORMENT] = 7
    ENUM[8] = :DEFEND ; NUME[:DEFEND] = 8
    ENUM[9] = :MEDIUM_CURSE ; NUME[:MEDIUM_CURSE] = 9
    ENUM[10] = :MINOR_CURSE ; NUME[:MINOR_CURSE] = 10
    ENUM[11] = :MEDIUM_BLESSING ; NUME[:MEDIUM_BLESSING] = 11
    ENUM[12] = :MINOR_BLESSING ; NUME[:MINOR_BLESSING] = 12
end

class InteractionTargetLocationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :CONTEXT_NONE ; NUME[:CONTEXT_NONE] = -1
    ENUM[0] = :CONTEXT_REGION ; NUME[:CONTEXT_REGION] = 0
    ENUM[1] = :CONTEXT_CREATURE ; NUME[:CONTEXT_CREATURE] = 1
    ENUM[2] = :CONTEXT_ITEM ; NUME[:CONTEXT_ITEM] = 2
    ENUM[3] = :CONTEXT_BP ; NUME[:CONTEXT_BP] = 3
    ENUM[4] = :CONTEXT_LOCATION ; NUME[:CONTEXT_LOCATION] = 4
    ENUM[5] = :CONTEXT_CREATURE_OR_LOCATION ; NUME[:CONTEXT_CREATURE_OR_LOCATION] = 5
    ENUM[6] = :RANDOM_NEARBY_LOCATION ; NUME[:RANDOM_NEARBY_LOCATION] = 6
end

class InteractionTargetType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CORPSE ; NUME[:CORPSE] = 0
    ENUM[1] = :CREATURE ; NUME[:CREATURE] = 1
    ENUM[2] = :MATERIAL ; NUME[:MATERIAL] = 2
    ENUM[3] = :LOCATION ; NUME[:LOCATION] = 3
end

class InterfaceBreakdownTypes < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NONE ; NUME[:NONE] = 0
    ENUM[1] = :QUIT ; NUME[:QUIT] = 1
    ENUM[2] = :STOPSCREEN ; NUME[:STOPSCREEN] = 2
    ENUM[3] = :TOFIRST ; NUME[:TOFIRST] = 3
end

class InterfaceKey < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NONE ; NUME[:NONE] = 0
    ENUM[1] = :SELECT ; NUME[:SELECT] = 1
    ENUM[2] = :SEC_SELECT ; NUME[:SEC_SELECT] = 2
    ENUM[3] = :DESELECT ; NUME[:DESELECT] = 3
    ENUM[4] = :SELECT_ALL ; NUME[:SELECT_ALL] = 4
    ENUM[5] = :DESELECT_ALL ; NUME[:DESELECT_ALL] = 5
    ENUM[6] = :LEAVESCREEN ; NUME[:LEAVESCREEN] = 6
    ENUM[7] = :LEAVESCREEN_ALL ; NUME[:LEAVESCREEN_ALL] = 7
    ENUM[8] = :CLOSE_MEGA_ANNOUNCEMENT ; NUME[:CLOSE_MEGA_ANNOUNCEMENT] = 8
    ENUM[9] = :OPTIONS ; NUME[:OPTIONS] = 9
    ENUM[10] = :OPTION_EXPORT ; NUME[:OPTION_EXPORT] = 10
    ENUM[11] = :HELP ; NUME[:HELP] = 11
    ENUM[12] = :TOGGLE_FULLSCREEN ; NUME[:TOGGLE_FULLSCREEN] = 12
    ENUM[13] = :MOVIES ; NUME[:MOVIES] = 13
    ENUM[14] = :ZOOM_IN ; NUME[:ZOOM_IN] = 14
    ENUM[15] = :ZOOM_OUT ; NUME[:ZOOM_OUT] = 15
    ENUM[16] = :ZOOM_TOGGLE ; NUME[:ZOOM_TOGGLE] = 16
    ENUM[17] = :ZOOM_RESET ; NUME[:ZOOM_RESET] = 17
    ENUM[18] = :MOVIE_RECORD ; NUME[:MOVIE_RECORD] = 18
    ENUM[19] = :MOVIE_PLAY ; NUME[:MOVIE_PLAY] = 19
    ENUM[20] = :MOVIE_SAVE ; NUME[:MOVIE_SAVE] = 20
    ENUM[21] = :MOVIE_LOAD ; NUME[:MOVIE_LOAD] = 21
    ENUM[22] = :TOGGLE_TTF ; NUME[:TOGGLE_TTF] = 22
    ENUM[23] = :FPS_UP ; NUME[:FPS_UP] = 23
    ENUM[24] = :FPS_DOWN ; NUME[:FPS_DOWN] = 24
    ENUM[25] = :CHANGETAB ; NUME[:CHANGETAB] = 25
    ENUM[26] = :SEC_CHANGETAB ; NUME[:SEC_CHANGETAB] = 26
    ENUM[27] = :STANDARDSCROLL_UP ; NUME[:STANDARDSCROLL_UP] = 27
    ENUM[28] = :STANDARDSCROLL_DOWN ; NUME[:STANDARDSCROLL_DOWN] = 28
    ENUM[29] = :STANDARDSCROLL_LEFT ; NUME[:STANDARDSCROLL_LEFT] = 29
    ENUM[30] = :STANDARDSCROLL_RIGHT ; NUME[:STANDARDSCROLL_RIGHT] = 30
    ENUM[31] = :STANDARDSCROLL_PAGEUP ; NUME[:STANDARDSCROLL_PAGEUP] = 31
    ENUM[32] = :STANDARDSCROLL_PAGEDOWN ; NUME[:STANDARDSCROLL_PAGEDOWN] = 32
    ENUM[33] = :SECONDSCROLL_UP ; NUME[:SECONDSCROLL_UP] = 33
    ENUM[34] = :SECONDSCROLL_DOWN ; NUME[:SECONDSCROLL_DOWN] = 34
    ENUM[35] = :SECONDSCROLL_PAGEUP ; NUME[:SECONDSCROLL_PAGEUP] = 35
    ENUM[36] = :SECONDSCROLL_PAGEDOWN ; NUME[:SECONDSCROLL_PAGEDOWN] = 36
    ENUM[37] = :CURSOR_UP ; NUME[:CURSOR_UP] = 37
    ENUM[38] = :CURSOR_DOWN ; NUME[:CURSOR_DOWN] = 38
    ENUM[39] = :CURSOR_LEFT ; NUME[:CURSOR_LEFT] = 39
    ENUM[40] = :CURSOR_RIGHT ; NUME[:CURSOR_RIGHT] = 40
    ENUM[41] = :CURSOR_UPLEFT ; NUME[:CURSOR_UPLEFT] = 41
    ENUM[42] = :CURSOR_UPRIGHT ; NUME[:CURSOR_UPRIGHT] = 42
    ENUM[43] = :CURSOR_DOWNLEFT ; NUME[:CURSOR_DOWNLEFT] = 43
    ENUM[44] = :CURSOR_DOWNRIGHT ; NUME[:CURSOR_DOWNRIGHT] = 44
    ENUM[45] = :CURSOR_UP_FAST ; NUME[:CURSOR_UP_FAST] = 45
    ENUM[46] = :CURSOR_DOWN_FAST ; NUME[:CURSOR_DOWN_FAST] = 46
    ENUM[47] = :CURSOR_LEFT_FAST ; NUME[:CURSOR_LEFT_FAST] = 47
    ENUM[48] = :CURSOR_RIGHT_FAST ; NUME[:CURSOR_RIGHT_FAST] = 48
    ENUM[49] = :CURSOR_UPLEFT_FAST ; NUME[:CURSOR_UPLEFT_FAST] = 49
    ENUM[50] = :CURSOR_UPRIGHT_FAST ; NUME[:CURSOR_UPRIGHT_FAST] = 50
    ENUM[51] = :CURSOR_DOWNLEFT_FAST ; NUME[:CURSOR_DOWNLEFT_FAST] = 51
    ENUM[52] = :CURSOR_DOWNRIGHT_FAST ; NUME[:CURSOR_DOWNRIGHT_FAST] = 52
    ENUM[53] = :CURSOR_UP_Z ; NUME[:CURSOR_UP_Z] = 53
    ENUM[54] = :CURSOR_DOWN_Z ; NUME[:CURSOR_DOWN_Z] = 54
    ENUM[55] = :CURSOR_UP_Z_AUX ; NUME[:CURSOR_UP_Z_AUX] = 55
    ENUM[56] = :CURSOR_DOWN_Z_AUX ; NUME[:CURSOR_DOWN_Z_AUX] = 56
    ENUM[57] = :MENU_CONFIRM ; NUME[:MENU_CONFIRM] = 57
    ENUM[58] = :SAVE_BINDINGS ; NUME[:SAVE_BINDINGS] = 58
    ENUM[59] = :LOAD_BINDINGS ; NUME[:LOAD_BINDINGS] = 59
    ENUM[60] = :MACRO_BREAK ; NUME[:MACRO_BREAK] = 60
    ENUM[61] = :RECORD_MACRO ; NUME[:RECORD_MACRO] = 61
    ENUM[62] = :PLAY_MACRO ; NUME[:PLAY_MACRO] = 62
    ENUM[63] = :SAVE_MACRO ; NUME[:SAVE_MACRO] = 63
    ENUM[64] = :LOAD_MACRO ; NUME[:LOAD_MACRO] = 64
    ENUM[65] = :PREFIX ; NUME[:PREFIX] = 65
    ENUM[66] = :OPTION1 ; NUME[:OPTION1] = 66
    ENUM[67] = :OPTION2 ; NUME[:OPTION2] = 67
    ENUM[68] = :OPTION3 ; NUME[:OPTION3] = 68
    ENUM[69] = :OPTION4 ; NUME[:OPTION4] = 69
    ENUM[70] = :OPTION5 ; NUME[:OPTION5] = 70
    ENUM[71] = :OPTION6 ; NUME[:OPTION6] = 71
    ENUM[72] = :OPTION7 ; NUME[:OPTION7] = 72
    ENUM[73] = :OPTION8 ; NUME[:OPTION8] = 73
    ENUM[74] = :OPTION9 ; NUME[:OPTION9] = 74
    ENUM[75] = :OPTION10 ; NUME[:OPTION10] = 75
    ENUM[76] = :OPTION11 ; NUME[:OPTION11] = 76
    ENUM[77] = :OPTION12 ; NUME[:OPTION12] = 77
    ENUM[78] = :OPTION13 ; NUME[:OPTION13] = 78
    ENUM[79] = :OPTION14 ; NUME[:OPTION14] = 79
    ENUM[80] = :OPTION15 ; NUME[:OPTION15] = 80
    ENUM[81] = :OPTION16 ; NUME[:OPTION16] = 81
    ENUM[82] = :OPTION17 ; NUME[:OPTION17] = 82
    ENUM[83] = :OPTION18 ; NUME[:OPTION18] = 83
    ENUM[84] = :OPTION19 ; NUME[:OPTION19] = 84
    ENUM[85] = :OPTION20 ; NUME[:OPTION20] = 85
    ENUM[86] = :SEC_OPTION1 ; NUME[:SEC_OPTION1] = 86
    ENUM[87] = :SEC_OPTION2 ; NUME[:SEC_OPTION2] = 87
    ENUM[88] = :SEC_OPTION3 ; NUME[:SEC_OPTION3] = 88
    ENUM[89] = :SEC_OPTION4 ; NUME[:SEC_OPTION4] = 89
    ENUM[90] = :SEC_OPTION5 ; NUME[:SEC_OPTION5] = 90
    ENUM[91] = :SEC_OPTION6 ; NUME[:SEC_OPTION6] = 91
    ENUM[92] = :SEC_OPTION7 ; NUME[:SEC_OPTION7] = 92
    ENUM[93] = :SEC_OPTION8 ; NUME[:SEC_OPTION8] = 93
    ENUM[94] = :SEC_OPTION9 ; NUME[:SEC_OPTION9] = 94
    ENUM[95] = :SEC_OPTION10 ; NUME[:SEC_OPTION10] = 95
    ENUM[96] = :SEC_OPTION11 ; NUME[:SEC_OPTION11] = 96
    ENUM[97] = :SEC_OPTION12 ; NUME[:SEC_OPTION12] = 97
    ENUM[98] = :SEC_OPTION13 ; NUME[:SEC_OPTION13] = 98
    ENUM[99] = :SEC_OPTION14 ; NUME[:SEC_OPTION14] = 99
    ENUM[100] = :SEC_OPTION15 ; NUME[:SEC_OPTION15] = 100
    ENUM[101] = :SEC_OPTION16 ; NUME[:SEC_OPTION16] = 101
    ENUM[102] = :SEC_OPTION17 ; NUME[:SEC_OPTION17] = 102
    ENUM[103] = :SEC_OPTION18 ; NUME[:SEC_OPTION18] = 103
    ENUM[104] = :SEC_OPTION19 ; NUME[:SEC_OPTION19] = 104
    ENUM[105] = :SEC_OPTION20 ; NUME[:SEC_OPTION20] = 105
    ENUM[106] = :CUSTOM_A ; NUME[:CUSTOM_A] = 106
    ENUM[107] = :CUSTOM_B ; NUME[:CUSTOM_B] = 107
    ENUM[108] = :CUSTOM_C ; NUME[:CUSTOM_C] = 108
    ENUM[109] = :CUSTOM_D ; NUME[:CUSTOM_D] = 109
    ENUM[110] = :CUSTOM_E ; NUME[:CUSTOM_E] = 110
    ENUM[111] = :CUSTOM_F ; NUME[:CUSTOM_F] = 111
    ENUM[112] = :CUSTOM_G ; NUME[:CUSTOM_G] = 112
    ENUM[113] = :CUSTOM_H ; NUME[:CUSTOM_H] = 113
    ENUM[114] = :CUSTOM_I ; NUME[:CUSTOM_I] = 114
    ENUM[115] = :CUSTOM_J ; NUME[:CUSTOM_J] = 115
    ENUM[116] = :CUSTOM_K ; NUME[:CUSTOM_K] = 116
    ENUM[117] = :CUSTOM_L ; NUME[:CUSTOM_L] = 117
    ENUM[118] = :CUSTOM_M ; NUME[:CUSTOM_M] = 118
    ENUM[119] = :CUSTOM_N ; NUME[:CUSTOM_N] = 119
    ENUM[120] = :CUSTOM_O ; NUME[:CUSTOM_O] = 120
    ENUM[121] = :CUSTOM_P ; NUME[:CUSTOM_P] = 121
    ENUM[122] = :CUSTOM_Q ; NUME[:CUSTOM_Q] = 122
    ENUM[123] = :CUSTOM_R ; NUME[:CUSTOM_R] = 123
    ENUM[124] = :CUSTOM_S ; NUME[:CUSTOM_S] = 124
    ENUM[125] = :CUSTOM_T ; NUME[:CUSTOM_T] = 125
    ENUM[126] = :CUSTOM_U ; NUME[:CUSTOM_U] = 126
    ENUM[127] = :CUSTOM_V ; NUME[:CUSTOM_V] = 127
    ENUM[128] = :CUSTOM_W ; NUME[:CUSTOM_W] = 128
    ENUM[129] = :CUSTOM_X ; NUME[:CUSTOM_X] = 129
    ENUM[130] = :CUSTOM_Y ; NUME[:CUSTOM_Y] = 130
    ENUM[131] = :CUSTOM_Z ; NUME[:CUSTOM_Z] = 131
    ENUM[132] = :CUSTOM_SHIFT_A ; NUME[:CUSTOM_SHIFT_A] = 132
    ENUM[133] = :CUSTOM_SHIFT_B ; NUME[:CUSTOM_SHIFT_B] = 133
    ENUM[134] = :CUSTOM_SHIFT_C ; NUME[:CUSTOM_SHIFT_C] = 134
    ENUM[135] = :CUSTOM_SHIFT_D ; NUME[:CUSTOM_SHIFT_D] = 135
    ENUM[136] = :CUSTOM_SHIFT_E ; NUME[:CUSTOM_SHIFT_E] = 136
    ENUM[137] = :CUSTOM_SHIFT_F ; NUME[:CUSTOM_SHIFT_F] = 137
    ENUM[138] = :CUSTOM_SHIFT_G ; NUME[:CUSTOM_SHIFT_G] = 138
    ENUM[139] = :CUSTOM_SHIFT_H ; NUME[:CUSTOM_SHIFT_H] = 139
    ENUM[140] = :CUSTOM_SHIFT_I ; NUME[:CUSTOM_SHIFT_I] = 140
    ENUM[141] = :CUSTOM_SHIFT_J ; NUME[:CUSTOM_SHIFT_J] = 141
    ENUM[142] = :CUSTOM_SHIFT_K ; NUME[:CUSTOM_SHIFT_K] = 142
    ENUM[143] = :CUSTOM_SHIFT_L ; NUME[:CUSTOM_SHIFT_L] = 143
    ENUM[144] = :CUSTOM_SHIFT_M ; NUME[:CUSTOM_SHIFT_M] = 144
    ENUM[145] = :CUSTOM_SHIFT_N ; NUME[:CUSTOM_SHIFT_N] = 145
    ENUM[146] = :CUSTOM_SHIFT_O ; NUME[:CUSTOM_SHIFT_O] = 146
    ENUM[147] = :CUSTOM_SHIFT_P ; NUME[:CUSTOM_SHIFT_P] = 147
    ENUM[148] = :CUSTOM_SHIFT_Q ; NUME[:CUSTOM_SHIFT_Q] = 148
    ENUM[149] = :CUSTOM_SHIFT_R ; NUME[:CUSTOM_SHIFT_R] = 149
    ENUM[150] = :CUSTOM_SHIFT_S ; NUME[:CUSTOM_SHIFT_S] = 150
    ENUM[151] = :CUSTOM_SHIFT_T ; NUME[:CUSTOM_SHIFT_T] = 151
    ENUM[152] = :CUSTOM_SHIFT_U ; NUME[:CUSTOM_SHIFT_U] = 152
    ENUM[153] = :CUSTOM_SHIFT_V ; NUME[:CUSTOM_SHIFT_V] = 153
    ENUM[154] = :CUSTOM_SHIFT_W ; NUME[:CUSTOM_SHIFT_W] = 154
    ENUM[155] = :CUSTOM_SHIFT_X ; NUME[:CUSTOM_SHIFT_X] = 155
    ENUM[156] = :CUSTOM_SHIFT_Y ; NUME[:CUSTOM_SHIFT_Y] = 156
    ENUM[157] = :CUSTOM_SHIFT_Z ; NUME[:CUSTOM_SHIFT_Z] = 157
    ENUM[158] = :CUSTOM_CTRL_A ; NUME[:CUSTOM_CTRL_A] = 158
    ENUM[159] = :CUSTOM_CTRL_B ; NUME[:CUSTOM_CTRL_B] = 159
    ENUM[160] = :CUSTOM_CTRL_C ; NUME[:CUSTOM_CTRL_C] = 160
    ENUM[161] = :CUSTOM_CTRL_D ; NUME[:CUSTOM_CTRL_D] = 161
    ENUM[162] = :CUSTOM_CTRL_E ; NUME[:CUSTOM_CTRL_E] = 162
    ENUM[163] = :CUSTOM_CTRL_F ; NUME[:CUSTOM_CTRL_F] = 163
    ENUM[164] = :CUSTOM_CTRL_G ; NUME[:CUSTOM_CTRL_G] = 164
    ENUM[165] = :CUSTOM_CTRL_H ; NUME[:CUSTOM_CTRL_H] = 165
    ENUM[166] = :CUSTOM_CTRL_I ; NUME[:CUSTOM_CTRL_I] = 166
    ENUM[167] = :CUSTOM_CTRL_J ; NUME[:CUSTOM_CTRL_J] = 167
    ENUM[168] = :CUSTOM_CTRL_K ; NUME[:CUSTOM_CTRL_K] = 168
    ENUM[169] = :CUSTOM_CTRL_L ; NUME[:CUSTOM_CTRL_L] = 169
    ENUM[170] = :CUSTOM_CTRL_M ; NUME[:CUSTOM_CTRL_M] = 170
    ENUM[171] = :CUSTOM_CTRL_N ; NUME[:CUSTOM_CTRL_N] = 171
    ENUM[172] = :CUSTOM_CTRL_O ; NUME[:CUSTOM_CTRL_O] = 172
    ENUM[173] = :CUSTOM_CTRL_P ; NUME[:CUSTOM_CTRL_P] = 173
    ENUM[174] = :CUSTOM_CTRL_Q ; NUME[:CUSTOM_CTRL_Q] = 174
    ENUM[175] = :CUSTOM_CTRL_R ; NUME[:CUSTOM_CTRL_R] = 175
    ENUM[176] = :CUSTOM_CTRL_S ; NUME[:CUSTOM_CTRL_S] = 176
    ENUM[177] = :CUSTOM_CTRL_T ; NUME[:CUSTOM_CTRL_T] = 177
    ENUM[178] = :CUSTOM_CTRL_U ; NUME[:CUSTOM_CTRL_U] = 178
    ENUM[179] = :CUSTOM_CTRL_V ; NUME[:CUSTOM_CTRL_V] = 179
    ENUM[180] = :CUSTOM_CTRL_W ; NUME[:CUSTOM_CTRL_W] = 180
    ENUM[181] = :CUSTOM_CTRL_X ; NUME[:CUSTOM_CTRL_X] = 181
    ENUM[182] = :CUSTOM_CTRL_Y ; NUME[:CUSTOM_CTRL_Y] = 182
    ENUM[183] = :CUSTOM_CTRL_Z ; NUME[:CUSTOM_CTRL_Z] = 183
    ENUM[184] = :CUSTOM_ALT_A ; NUME[:CUSTOM_ALT_A] = 184
    ENUM[185] = :CUSTOM_ALT_B ; NUME[:CUSTOM_ALT_B] = 185
    ENUM[186] = :CUSTOM_ALT_C ; NUME[:CUSTOM_ALT_C] = 186
    ENUM[187] = :CUSTOM_ALT_D ; NUME[:CUSTOM_ALT_D] = 187
    ENUM[188] = :CUSTOM_ALT_E ; NUME[:CUSTOM_ALT_E] = 188
    ENUM[189] = :CUSTOM_ALT_F ; NUME[:CUSTOM_ALT_F] = 189
    ENUM[190] = :CUSTOM_ALT_G ; NUME[:CUSTOM_ALT_G] = 190
    ENUM[191] = :CUSTOM_ALT_H ; NUME[:CUSTOM_ALT_H] = 191
    ENUM[192] = :CUSTOM_ALT_I ; NUME[:CUSTOM_ALT_I] = 192
    ENUM[193] = :CUSTOM_ALT_J ; NUME[:CUSTOM_ALT_J] = 193
    ENUM[194] = :CUSTOM_ALT_K ; NUME[:CUSTOM_ALT_K] = 194
    ENUM[195] = :CUSTOM_ALT_L ; NUME[:CUSTOM_ALT_L] = 195
    ENUM[196] = :CUSTOM_ALT_M ; NUME[:CUSTOM_ALT_M] = 196
    ENUM[197] = :CUSTOM_ALT_N ; NUME[:CUSTOM_ALT_N] = 197
    ENUM[198] = :CUSTOM_ALT_O ; NUME[:CUSTOM_ALT_O] = 198
    ENUM[199] = :CUSTOM_ALT_P ; NUME[:CUSTOM_ALT_P] = 199
    ENUM[200] = :CUSTOM_ALT_Q ; NUME[:CUSTOM_ALT_Q] = 200
    ENUM[201] = :CUSTOM_ALT_R ; NUME[:CUSTOM_ALT_R] = 201
    ENUM[202] = :CUSTOM_ALT_S ; NUME[:CUSTOM_ALT_S] = 202
    ENUM[203] = :CUSTOM_ALT_T ; NUME[:CUSTOM_ALT_T] = 203
    ENUM[204] = :CUSTOM_ALT_U ; NUME[:CUSTOM_ALT_U] = 204
    ENUM[205] = :CUSTOM_ALT_V ; NUME[:CUSTOM_ALT_V] = 205
    ENUM[206] = :CUSTOM_ALT_W ; NUME[:CUSTOM_ALT_W] = 206
    ENUM[207] = :CUSTOM_ALT_X ; NUME[:CUSTOM_ALT_X] = 207
    ENUM[208] = :CUSTOM_ALT_Y ; NUME[:CUSTOM_ALT_Y] = 208
    ENUM[209] = :CUSTOM_ALT_Z ; NUME[:CUSTOM_ALT_Z] = 209
    ENUM[210] = :WORLD_PARAM_TITLE ; NUME[:WORLD_PARAM_TITLE] = 210
    ENUM[211] = :WORLD_PARAM_ADD ; NUME[:WORLD_PARAM_ADD] = 211
    ENUM[212] = :WORLD_PARAM_COPY ; NUME[:WORLD_PARAM_COPY] = 212
    ENUM[213] = :WORLD_PARAM_DELETE ; NUME[:WORLD_PARAM_DELETE] = 213
    ENUM[214] = :WORLD_PARAM_NAME_RANDOM ; NUME[:WORLD_PARAM_NAME_RANDOM] = 214
    ENUM[215] = :WORLD_PARAM_NAME_ENTER ; NUME[:WORLD_PARAM_NAME_ENTER] = 215
    ENUM[216] = :WORLD_PARAM_SEED_RANDOM ; NUME[:WORLD_PARAM_SEED_RANDOM] = 216
    ENUM[217] = :WORLD_PARAM_SEED_ENTER ; NUME[:WORLD_PARAM_SEED_ENTER] = 217
    ENUM[218] = :WORLD_PARAM_LOAD ; NUME[:WORLD_PARAM_LOAD] = 218
    ENUM[219] = :WORLD_PARAM_SAVE ; NUME[:WORLD_PARAM_SAVE] = 219
    ENUM[220] = :WORLD_PARAM_DIM_X_UP ; NUME[:WORLD_PARAM_DIM_X_UP] = 220
    ENUM[221] = :WORLD_PARAM_DIM_X_DOWN ; NUME[:WORLD_PARAM_DIM_X_DOWN] = 221
    ENUM[222] = :WORLD_PARAM_DIM_Y_UP ; NUME[:WORLD_PARAM_DIM_Y_UP] = 222
    ENUM[223] = :WORLD_PARAM_DIM_Y_DOWN ; NUME[:WORLD_PARAM_DIM_Y_DOWN] = 223
    ENUM[224] = :WORLD_PARAM_SET ; NUME[:WORLD_PARAM_SET] = 224
    ENUM[225] = :WORLD_PARAM_INCREASE ; NUME[:WORLD_PARAM_INCREASE] = 225
    ENUM[226] = :WORLD_PARAM_DECREASE ; NUME[:WORLD_PARAM_DECREASE] = 226
    ENUM[227] = :WORLD_PARAM_ENTER_VALUE ; NUME[:WORLD_PARAM_ENTER_VALUE] = 227
    ENUM[228] = :WORLD_PARAM_NULLIFY ; NUME[:WORLD_PARAM_NULLIFY] = 228
    ENUM[229] = :WORLD_PARAM_PRESET ; NUME[:WORLD_PARAM_PRESET] = 229
    ENUM[230] = :WORLD_PARAM_REJECT_CONTINUE ; NUME[:WORLD_PARAM_REJECT_CONTINUE] = 230
    ENUM[231] = :WORLD_PARAM_REJECT_ABORT ; NUME[:WORLD_PARAM_REJECT_ABORT] = 231
    ENUM[232] = :WORLD_PARAM_REJECT_ALLOW_THIS ; NUME[:WORLD_PARAM_REJECT_ALLOW_THIS] = 232
    ENUM[233] = :WORLD_PARAM_REJECT_ALLOW_ALL ; NUME[:WORLD_PARAM_REJECT_ALLOW_ALL] = 233
    ENUM[234] = :WORLD_GEN_CONTINUE ; NUME[:WORLD_GEN_CONTINUE] = 234
    ENUM[235] = :WORLD_GEN_USE ; NUME[:WORLD_GEN_USE] = 235
    ENUM[236] = :WORLD_GEN_ABORT ; NUME[:WORLD_GEN_ABORT] = 236
    ENUM[237] = :WORLDGEN_EXPORT_MAP ; NUME[:WORLDGEN_EXPORT_MAP] = 237
    ENUM[238] = :LEGENDS_EXPORT_MAP ; NUME[:LEGENDS_EXPORT_MAP] = 238
    ENUM[239] = :LEGENDS_EXPORT_XML ; NUME[:LEGENDS_EXPORT_XML] = 239
    ENUM[240] = :LEGENDS_EXPORT_DETAILED_MAP ; NUME[:LEGENDS_EXPORT_DETAILED_MAP] = 240
    ENUM[241] = :LEGENDS_TOGGLE_CIVSITE ; NUME[:LEGENDS_TOGGLE_CIVSITE] = 241
    ENUM[242] = :LEGENDS_STRING_FILTER ; NUME[:LEGENDS_STRING_FILTER] = 242
    ENUM[243] = :A_RETURN_TO_ARENA ; NUME[:A_RETURN_TO_ARENA] = 243
    ENUM[244] = :A_MOVE_N ; NUME[:A_MOVE_N] = 244
    ENUM[245] = :A_MOVE_S ; NUME[:A_MOVE_S] = 245
    ENUM[246] = :A_MOVE_E ; NUME[:A_MOVE_E] = 246
    ENUM[247] = :A_MOVE_W ; NUME[:A_MOVE_W] = 247
    ENUM[248] = :A_MOVE_NW ; NUME[:A_MOVE_NW] = 248
    ENUM[249] = :A_MOVE_NE ; NUME[:A_MOVE_NE] = 249
    ENUM[250] = :A_MOVE_SW ; NUME[:A_MOVE_SW] = 250
    ENUM[251] = :A_MOVE_SE ; NUME[:A_MOVE_SE] = 251
    ENUM[252] = :A_MOVE_SAME_SQUARE ; NUME[:A_MOVE_SAME_SQUARE] = 252
    ENUM[253] = :A_CARE_MOVE_N ; NUME[:A_CARE_MOVE_N] = 253
    ENUM[254] = :A_CARE_MOVE_S ; NUME[:A_CARE_MOVE_S] = 254
    ENUM[255] = :A_CARE_MOVE_E ; NUME[:A_CARE_MOVE_E] = 255
    ENUM[256] = :A_CARE_MOVE_W ; NUME[:A_CARE_MOVE_W] = 256
    ENUM[257] = :A_CARE_MOVE_NW ; NUME[:A_CARE_MOVE_NW] = 257
    ENUM[258] = :A_CARE_MOVE_NE ; NUME[:A_CARE_MOVE_NE] = 258
    ENUM[259] = :A_CARE_MOVE_SW ; NUME[:A_CARE_MOVE_SW] = 259
    ENUM[260] = :A_CARE_MOVE_SE ; NUME[:A_CARE_MOVE_SE] = 260
    ENUM[261] = :A_CARE_MOVE_UPDOWN ; NUME[:A_CARE_MOVE_UPDOWN] = 261
    ENUM[262] = :A_MOVE_N_UP ; NUME[:A_MOVE_N_UP] = 262
    ENUM[263] = :A_MOVE_S_UP ; NUME[:A_MOVE_S_UP] = 263
    ENUM[264] = :A_MOVE_E_UP ; NUME[:A_MOVE_E_UP] = 264
    ENUM[265] = :A_MOVE_W_UP ; NUME[:A_MOVE_W_UP] = 265
    ENUM[266] = :A_MOVE_NW_UP ; NUME[:A_MOVE_NW_UP] = 266
    ENUM[267] = :A_MOVE_NE_UP ; NUME[:A_MOVE_NE_UP] = 267
    ENUM[268] = :A_MOVE_SW_UP ; NUME[:A_MOVE_SW_UP] = 268
    ENUM[269] = :A_MOVE_SE_UP ; NUME[:A_MOVE_SE_UP] = 269
    ENUM[270] = :A_MOVE_UP ; NUME[:A_MOVE_UP] = 270
    ENUM[271] = :A_MOVE_N_DOWN ; NUME[:A_MOVE_N_DOWN] = 271
    ENUM[272] = :A_MOVE_S_DOWN ; NUME[:A_MOVE_S_DOWN] = 272
    ENUM[273] = :A_MOVE_E_DOWN ; NUME[:A_MOVE_E_DOWN] = 273
    ENUM[274] = :A_MOVE_W_DOWN ; NUME[:A_MOVE_W_DOWN] = 274
    ENUM[275] = :A_MOVE_NW_DOWN ; NUME[:A_MOVE_NW_DOWN] = 275
    ENUM[276] = :A_MOVE_NE_DOWN ; NUME[:A_MOVE_NE_DOWN] = 276
    ENUM[277] = :A_MOVE_SW_DOWN ; NUME[:A_MOVE_SW_DOWN] = 277
    ENUM[278] = :A_MOVE_SE_DOWN ; NUME[:A_MOVE_SE_DOWN] = 278
    ENUM[279] = :A_MOVE_DOWN ; NUME[:A_MOVE_DOWN] = 279
    ENUM[280] = :A_MOVE_UP_AUX ; NUME[:A_MOVE_UP_AUX] = 280
    ENUM[281] = :A_MOVE_DOWN_AUX ; NUME[:A_MOVE_DOWN_AUX] = 281
    ENUM[282] = :A_COMBAT_ATTACK ; NUME[:A_COMBAT_ATTACK] = 282
    ENUM[283] = :A_COMBAT_DODGE ; NUME[:A_COMBAT_DODGE] = 283
    ENUM[284] = :A_COMBAT_CHARGEDEF ; NUME[:A_COMBAT_CHARGEDEF] = 284
    ENUM[285] = :A_STATUS ; NUME[:A_STATUS] = 285
    ENUM[286] = :A_STATUS_WRESTLE ; NUME[:A_STATUS_WRESTLE] = 286
    ENUM[287] = :A_STATUS_CUSTOMIZE ; NUME[:A_STATUS_CUSTOMIZE] = 287
    ENUM[288] = :A_STATUS_KILLS ; NUME[:A_STATUS_KILLS] = 288
    ENUM[289] = :A_STATUS_HEALTH ; NUME[:A_STATUS_HEALTH] = 289
    ENUM[290] = :A_STATUS_ATT_SKILL ; NUME[:A_STATUS_ATT_SKILL] = 290
    ENUM[291] = :A_STATUS_DESC ; NUME[:A_STATUS_DESC] = 291
    ENUM[292] = :A_CLEAR_ANNOUNCEMENTS ; NUME[:A_CLEAR_ANNOUNCEMENTS] = 292
    ENUM[293] = :A_SLEEP ; NUME[:A_SLEEP] = 293
    ENUM[294] = :A_SLEEP_SLEEP ; NUME[:A_SLEEP_SLEEP] = 294
    ENUM[295] = :A_SLEEP_WAIT ; NUME[:A_SLEEP_WAIT] = 295
    ENUM[296] = :A_SLEEP_DAWN ; NUME[:A_SLEEP_DAWN] = 296
    ENUM[297] = :A_WAIT ; NUME[:A_WAIT] = 297
    ENUM[298] = :A_SHORT_WAIT ; NUME[:A_SHORT_WAIT] = 298
    ENUM[299] = :A_ATTACK ; NUME[:A_ATTACK] = 299
    ENUM[300] = :A_ATTACK_CONFIRM ; NUME[:A_ATTACK_CONFIRM] = 300
    ENUM[301] = :QUICK_ATTACK ; NUME[:QUICK_ATTACK] = 301
    ENUM[302] = :HEAVY_ATTACK ; NUME[:HEAVY_ATTACK] = 302
    ENUM[303] = :WILD_ATTACK ; NUME[:WILD_ATTACK] = 303
    ENUM[304] = :PRECISE_ATTACK ; NUME[:PRECISE_ATTACK] = 304
    ENUM[305] = :CHARGE_ATTACK ; NUME[:CHARGE_ATTACK] = 305
    ENUM[306] = :MULTI_ATTACK ; NUME[:MULTI_ATTACK] = 306
    ENUM[307] = :A_LOOK ; NUME[:A_LOOK] = 307
    ENUM[308] = :A_SEARCH ; NUME[:A_SEARCH] = 308
    ENUM[309] = :A_ODOR ; NUME[:A_ODOR] = 309
    ENUM[310] = :A_DISPLAY_ODOR ; NUME[:A_DISPLAY_ODOR] = 310
    ENUM[311] = :A_YIELD ; NUME[:A_YIELD] = 311
    ENUM[312] = :A_DISPLAY_TRACKS ; NUME[:A_DISPLAY_TRACKS] = 312
    ENUM[313] = :A_FRESHEST_TRACK ; NUME[:A_FRESHEST_TRACK] = 313
    ENUM[314] = :A_INV_DRAW_WEAPON ; NUME[:A_INV_DRAW_WEAPON] = 314
    ENUM[315] = :A_JUMP ; NUME[:A_JUMP] = 315
    ENUM[316] = :A_HOLD ; NUME[:A_HOLD] = 316
    ENUM[317] = :A_TALK ; NUME[:A_TALK] = 317
    ENUM[318] = :A_CONV_PERSUADE ; NUME[:A_CONV_PERSUADE] = 318
    ENUM[319] = :A_CONV_INTIMIDATE ; NUME[:A_CONV_INTIMIDATE] = 319
    ENUM[320] = :A_ASSUME_IDENTITY_NEW ; NUME[:A_ASSUME_IDENTITY_NEW] = 320
    ENUM[321] = :A_ASSUME_IDENTITY_NONE ; NUME[:A_ASSUME_IDENTITY_NONE] = 321
    ENUM[322] = :A_ASSUME_IDENTITY_NAME ; NUME[:A_ASSUME_IDENTITY_NAME] = 322
    ENUM[323] = :A_ASSUME_IDENTITY_ORIGIN ; NUME[:A_ASSUME_IDENTITY_ORIGIN] = 323
    ENUM[324] = :A_ASSUME_IDENTITY_PROFESSION ; NUME[:A_ASSUME_IDENTITY_PROFESSION] = 324
    ENUM[325] = :A_ASSUME_IDENTITY_WORSHIP ; NUME[:A_ASSUME_IDENTITY_WORSHIP] = 325
    ENUM[326] = :A_INTERACT ; NUME[:A_INTERACT] = 326
    ENUM[327] = :A_ACTION ; NUME[:A_ACTION] = 327
    ENUM[328] = :A_ACTION_CREATE ; NUME[:A_ACTION_CREATE] = 328
    ENUM[329] = :A_ACTION_BUTCHER ; NUME[:A_ACTION_BUTCHER] = 329
    ENUM[330] = :A_ACTION_ABILITY ; NUME[:A_ACTION_ABILITY] = 330
    ENUM[331] = :A_ACTION_POWER ; NUME[:A_ACTION_POWER] = 331
    ENUM[332] = :A_ACTION_COMPOSE ; NUME[:A_ACTION_COMPOSE] = 332
    ENUM[333] = :A_ACTION_WRITE ; NUME[:A_ACTION_WRITE] = 333
    ENUM[334] = :A_CONSTRUCTION ; NUME[:A_CONSTRUCTION] = 334
    ENUM[335] = :ADV_CONSTRUCTION_ZONE_NEW ; NUME[:ADV_CONSTRUCTION_ZONE_NEW] = 335
    ENUM[336] = :ADV_CONSTRUCTION_ZONE_EDIT ; NUME[:ADV_CONSTRUCTION_ZONE_EDIT] = 336
    ENUM[337] = :ADV_CONSTRUCTION_ZONE_ASSIGN ; NUME[:ADV_CONSTRUCTION_ZONE_ASSIGN] = 337
    ENUM[338] = :ADV_CONSTRUCTION_ZONE_DELETE ; NUME[:ADV_CONSTRUCTION_ZONE_DELETE] = 338
    ENUM[339] = :ADV_CONSTRUCTION_ZONE_RECT ; NUME[:ADV_CONSTRUCTION_ZONE_RECT] = 339
    ENUM[340] = :ADV_CONSTRUCTION_ZONE_FLOW ; NUME[:ADV_CONSTRUCTION_ZONE_FLOW] = 340
    ENUM[341] = :ADV_CONSTRUCTION_ZONE_REMOVE_RECT ; NUME[:ADV_CONSTRUCTION_ZONE_REMOVE_RECT] = 341
    ENUM[342] = :ADV_CONSTRUCTION_STAIR_UPDOWN ; NUME[:ADV_CONSTRUCTION_STAIR_UPDOWN] = 342
    ENUM[343] = :ADV_CONSTRUCTION_REMOVE_PLANS ; NUME[:ADV_CONSTRUCTION_REMOVE_PLANS] = 343
    ENUM[344] = :ADV_CONSTRUCTION_REMOVE_EXISTING ; NUME[:ADV_CONSTRUCTION_REMOVE_EXISTING] = 344
    ENUM[345] = :ADV_CONSTRUCTION_MATERIAL ; NUME[:ADV_CONSTRUCTION_MATERIAL] = 345
    ENUM[346] = :ADV_CONSTRUCTION_CONSTRUCTION ; NUME[:ADV_CONSTRUCTION_CONSTRUCTION] = 346
    ENUM[347] = :ADV_CONSTRUCTION_BUILDING ; NUME[:ADV_CONSTRUCTION_BUILDING] = 347
    ENUM[348] = :ADV_CONSTRUCTION_ZONE ; NUME[:ADV_CONSTRUCTION_ZONE] = 348
    ENUM[349] = :ADV_CONSTRUCTION_WORK_MENU ; NUME[:ADV_CONSTRUCTION_WORK_MENU] = 349
    ENUM[350] = :ADV_CONSTRUCTION_NAME_SITE ; NUME[:ADV_CONSTRUCTION_NAME_SITE] = 350
    ENUM[351] = :ADV_CONSTRUCTION_YOU_WORK ; NUME[:ADV_CONSTRUCTION_YOU_WORK] = 351
    ENUM[352] = :ADV_CONSTRUCTION_START ; NUME[:ADV_CONSTRUCTION_START] = 352
    ENUM[353] = :A_COMPOSE_FILTER ; NUME[:A_COMPOSE_FILTER] = 353
    ENUM[354] = :A_INV_LOOK ; NUME[:A_INV_LOOK] = 354
    ENUM[355] = :A_INV_REMOVE ; NUME[:A_INV_REMOVE] = 355
    ENUM[356] = :A_INV_WEAR ; NUME[:A_INV_WEAR] = 356
    ENUM[357] = :A_INV_EATDRINK ; NUME[:A_INV_EATDRINK] = 357
    ENUM[358] = :A_INV_PUTIN ; NUME[:A_INV_PUTIN] = 358
    ENUM[359] = :A_INV_DROP ; NUME[:A_INV_DROP] = 359
    ENUM[360] = :A_GROUND ; NUME[:A_GROUND] = 360
    ENUM[361] = :A_THROW ; NUME[:A_THROW] = 361
    ENUM[362] = :A_SHOOT ; NUME[:A_SHOOT] = 362
    ENUM[363] = :A_ANNOUNCEMENTS ; NUME[:A_ANNOUNCEMENTS] = 363
    ENUM[364] = :A_COMBAT ; NUME[:A_COMBAT] = 364
    ENUM[365] = :A_TACTICAL_SETTINGS ; NUME[:A_TACTICAL_SETTINGS] = 365
    ENUM[366] = :A_MOVEMENT ; NUME[:A_MOVEMENT] = 366
    ENUM[367] = :A_MOVEMENT_SWIM ; NUME[:A_MOVEMENT_SWIM] = 367
    ENUM[368] = :A_SNEAK ; NUME[:A_SNEAK] = 368
    ENUM[369] = :A_SPEED_SNEAK ; NUME[:A_SPEED_SNEAK] = 369
    ENUM[370] = :A_CENTER ; NUME[:A_CENTER] = 370
    ENUM[371] = :A_COMPANIONS ; NUME[:A_COMPANIONS] = 371
    ENUM[372] = :A_BUILDING ; NUME[:A_BUILDING] = 372
    ENUM[373] = :A_TRAVEL ; NUME[:A_TRAVEL] = 373
    ENUM[374] = :A_TRAVEL_SLEEP ; NUME[:A_TRAVEL_SLEEP] = 374
    ENUM[375] = :A_TRAVEL_MAP ; NUME[:A_TRAVEL_MAP] = 375
    ENUM[376] = :A_TRAVEL_HIDE_INSTRUCTIONS ; NUME[:A_TRAVEL_HIDE_INSTRUCTIONS] = 376
    ENUM[377] = :A_DATE ; NUME[:A_DATE] = 377
    ENUM[378] = :A_WEATHER ; NUME[:A_WEATHER] = 378
    ENUM[379] = :A_TEMPERATURE ; NUME[:A_TEMPERATURE] = 379
    ENUM[380] = :A_STANCE ; NUME[:A_STANCE] = 380
    ENUM[381] = :CSHEET_BACKGROUND ; NUME[:CSHEET_BACKGROUND] = 381
    ENUM[382] = :CSHEET_NEW_CHARACTER ; NUME[:CSHEET_NEW_CHARACTER] = 382
    ENUM[383] = :CSHEET_SKILLS ; NUME[:CSHEET_SKILLS] = 383
    ENUM[384] = :CSHEET_APPEARANCE ; NUME[:CSHEET_APPEARANCE] = 384
    ENUM[385] = :CSHEET_PERSONALITY ; NUME[:CSHEET_PERSONALITY] = 385
    ENUM[386] = :CSHEET_EQUIPMENT ; NUME[:CSHEET_EQUIPMENT] = 386
    ENUM[387] = :CSHEET_PETS ; NUME[:CSHEET_PETS] = 387
    ENUM[388] = :CSHEET_RANDOMIZE_BACKGROUND ; NUME[:CSHEET_RANDOMIZE_BACKGROUND] = 388
    ENUM[389] = :CSHEET_SELECT_BACKGROUND_OPTION ; NUME[:CSHEET_SELECT_BACKGROUND_OPTION] = 389
    ENUM[390] = :CSHEET_WORSHIP_UP ; NUME[:CSHEET_WORSHIP_UP] = 390
    ENUM[391] = :CSHEET_WORSHIP_DOWN ; NUME[:CSHEET_WORSHIP_DOWN] = 391
    ENUM[392] = :CSHEET_NEW_ITEM ; NUME[:CSHEET_NEW_ITEM] = 392
    ENUM[393] = :CSHEET_QUALITY_UP ; NUME[:CSHEET_QUALITY_UP] = 393
    ENUM[394] = :CSHEET_QUALITY_DOWN ; NUME[:CSHEET_QUALITY_DOWN] = 394
    ENUM[395] = :CSHEET_NAME_PET ; NUME[:CSHEET_NAME_PET] = 395
    ENUM[396] = :CSHEET_REMOVE_PET ; NUME[:CSHEET_REMOVE_PET] = 396
    ENUM[397] = :CSHEET_ADD_PET ; NUME[:CSHEET_ADD_PET] = 397
    ENUM[398] = :A_ENTER_NAME ; NUME[:A_ENTER_NAME] = 398
    ENUM[399] = :A_CUST_NAME ; NUME[:A_CUST_NAME] = 399
    ENUM[400] = :A_RANDOM_NAME ; NUME[:A_RANDOM_NAME] = 400
    ENUM[401] = :A_RANDOM_APPEARANCE ; NUME[:A_RANDOM_APPEARANCE] = 401
    ENUM[402] = :A_RANDOM_APPEARANCE_FULL ; NUME[:A_RANDOM_APPEARANCE_FULL] = 402
    ENUM[403] = :A_RANDOM_PERSONALITY ; NUME[:A_RANDOM_PERSONALITY] = 403
    ENUM[404] = :A_CUSTOM_PERSONALITY ; NUME[:A_CUSTOM_PERSONALITY] = 404
    ENUM[405] = :A_CHANGE_DREAM ; NUME[:A_CHANGE_DREAM] = 405
    ENUM[406] = :A_CHANGE_GENDER ; NUME[:A_CHANGE_GENDER] = 406
    ENUM[407] = :A_END_TRAVEL ; NUME[:A_END_TRAVEL] = 407
    ENUM[408] = :A_TRAVEL_CLOUDS ; NUME[:A_TRAVEL_CLOUDS] = 408
    ENUM[409] = :A_LOG ; NUME[:A_LOG] = 409
    ENUM[410] = :A_TRAVEL_LOG ; NUME[:A_TRAVEL_LOG] = 410
    ENUM[411] = :A_LOG_SORT ; NUME[:A_LOG_SORT] = 411
    ENUM[412] = :A_LOG_PIN ; NUME[:A_LOG_PIN] = 412
    ENUM[413] = :A_LOG_ENTITIES ; NUME[:A_LOG_ENTITIES] = 413
    ENUM[414] = :A_LOG_SITES ; NUME[:A_LOG_SITES] = 414
    ENUM[415] = :A_LOG_SUBREGIONS ; NUME[:A_LOG_SUBREGIONS] = 415
    ENUM[416] = :A_LOG_FEATURE_LAYERS ; NUME[:A_LOG_FEATURE_LAYERS] = 416
    ENUM[417] = :A_LOG_PEOPLE ; NUME[:A_LOG_PEOPLE] = 417
    ENUM[418] = :A_LOG_AGREEMENTS ; NUME[:A_LOG_AGREEMENTS] = 418
    ENUM[419] = :A_LOG_EVENTS ; NUME[:A_LOG_EVENTS] = 419
    ENUM[420] = :A_LOG_BESTIARY ; NUME[:A_LOG_BESTIARY] = 420
    ENUM[421] = :A_LOG_ARTIFACTS ; NUME[:A_LOG_ARTIFACTS] = 421
    ENUM[422] = :A_LOG_INTRIGUE ; NUME[:A_LOG_INTRIGUE] = 422
    ENUM[423] = :A_LOG_FILTER ; NUME[:A_LOG_FILTER] = 423
    ENUM[424] = :A_LOG_ZOOM_CURRENT_LOCATION ; NUME[:A_LOG_ZOOM_CURRENT_LOCATION] = 424
    ENUM[425] = :A_LOG_ZOOM_SELECTED ; NUME[:A_LOG_ZOOM_SELECTED] = 425
    ENUM[426] = :A_LOG_LINE ; NUME[:A_LOG_LINE] = 426
    ENUM[427] = :A_LOG_MAP ; NUME[:A_LOG_MAP] = 427
    ENUM[428] = :A_BARTER_VIEW ; NUME[:A_BARTER_VIEW] = 428
    ENUM[429] = :A_BARTER_CURRENCY_1 ; NUME[:A_BARTER_CURRENCY_1] = 429
    ENUM[430] = :A_BARTER_CURRENCY_2 ; NUME[:A_BARTER_CURRENCY_2] = 430
    ENUM[431] = :A_BARTER_TRADE ; NUME[:A_BARTER_TRADE] = 431
    ENUM[432] = :A_BARTER_SHOW ; NUME[:A_BARTER_SHOW] = 432
    ENUM[433] = :SETUP_EMBARK ; NUME[:SETUP_EMBARK] = 433
    ENUM[434] = :SETUP_NAME_FORT ; NUME[:SETUP_NAME_FORT] = 434
    ENUM[435] = :SETUP_NAME_GROUP ; NUME[:SETUP_NAME_GROUP] = 435
    ENUM[436] = :SETUP_SYMBOL ; NUME[:SETUP_SYMBOL] = 436
    ENUM[437] = :SETUP_RECLAIM ; NUME[:SETUP_RECLAIM] = 437
    ENUM[438] = :SETUP_FIND ; NUME[:SETUP_FIND] = 438
    ENUM[439] = :SETUP_NOTES ; NUME[:SETUP_NOTES] = 439
    ENUM[440] = :SETUP_NOTES_TAKE_NOTES ; NUME[:SETUP_NOTES_TAKE_NOTES] = 440
    ENUM[441] = :SETUP_NOTES_DELETE_NOTE ; NUME[:SETUP_NOTES_DELETE_NOTE] = 441
    ENUM[442] = :SETUP_NOTES_CHANGE_SYMBOL_SELECTION ; NUME[:SETUP_NOTES_CHANGE_SYMBOL_SELECTION] = 442
    ENUM[443] = :SETUP_NOTES_ADOPT_SYMBOL ; NUME[:SETUP_NOTES_ADOPT_SYMBOL] = 443
    ENUM[444] = :SETUP_LOCAL_Y_UP ; NUME[:SETUP_LOCAL_Y_UP] = 444
    ENUM[445] = :SETUP_LOCAL_Y_DOWN ; NUME[:SETUP_LOCAL_Y_DOWN] = 445
    ENUM[446] = :SETUP_LOCAL_X_UP ; NUME[:SETUP_LOCAL_X_UP] = 446
    ENUM[447] = :SETUP_LOCAL_X_DOWN ; NUME[:SETUP_LOCAL_X_DOWN] = 447
    ENUM[448] = :SETUP_LOCAL_Y_MUP ; NUME[:SETUP_LOCAL_Y_MUP] = 448
    ENUM[449] = :SETUP_LOCAL_Y_MDOWN ; NUME[:SETUP_LOCAL_Y_MDOWN] = 449
    ENUM[450] = :SETUP_LOCAL_X_MUP ; NUME[:SETUP_LOCAL_X_MUP] = 450
    ENUM[451] = :SETUP_LOCAL_X_MDOWN ; NUME[:SETUP_LOCAL_X_MDOWN] = 451
    ENUM[452] = :SETUP_BIOME_1 ; NUME[:SETUP_BIOME_1] = 452
    ENUM[453] = :SETUP_BIOME_2 ; NUME[:SETUP_BIOME_2] = 453
    ENUM[454] = :SETUP_BIOME_3 ; NUME[:SETUP_BIOME_3] = 454
    ENUM[455] = :SETUP_BIOME_4 ; NUME[:SETUP_BIOME_4] = 455
    ENUM[456] = :SETUP_BIOME_5 ; NUME[:SETUP_BIOME_5] = 456
    ENUM[457] = :SETUP_BIOME_6 ; NUME[:SETUP_BIOME_6] = 457
    ENUM[458] = :SETUP_BIOME_7 ; NUME[:SETUP_BIOME_7] = 458
    ENUM[459] = :SETUP_BIOME_8 ; NUME[:SETUP_BIOME_8] = 459
    ENUM[460] = :SETUP_BIOME_9 ; NUME[:SETUP_BIOME_9] = 460
    ENUM[461] = :CHOOSE_NAME_RANDOM ; NUME[:CHOOSE_NAME_RANDOM] = 461
    ENUM[462] = :CHOOSE_NAME_CLEAR ; NUME[:CHOOSE_NAME_CLEAR] = 462
    ENUM[463] = :CHOOSE_NAME_TYPE ; NUME[:CHOOSE_NAME_TYPE] = 463
    ENUM[464] = :CHOOSE_NAME_FIRST ; NUME[:CHOOSE_NAME_FIRST] = 464
    ENUM[465] = :SETUPGAME_NEW ; NUME[:SETUPGAME_NEW] = 465
    ENUM[466] = :SETUPGAME_VIEW ; NUME[:SETUPGAME_VIEW] = 466
    ENUM[467] = :SETUPGAME_CUSTOMIZE_UNIT ; NUME[:SETUPGAME_CUSTOMIZE_UNIT] = 467
    ENUM[468] = :SETUPGAME_SAVE_PROFILE ; NUME[:SETUPGAME_SAVE_PROFILE] = 468
    ENUM[469] = :SETUPGAME_SAVE_PROFILE_ABORT ; NUME[:SETUPGAME_SAVE_PROFILE_ABORT] = 469
    ENUM[470] = :SETUPGAME_SAVE_PROFILE_GO ; NUME[:SETUPGAME_SAVE_PROFILE_GO] = 470
    ENUM[471] = :SETUPGAME_VIEW_PROFILE_PROBLEMS ; NUME[:SETUPGAME_VIEW_PROFILE_PROBLEMS] = 471
    ENUM[472] = :BUILDJOB_ADD ; NUME[:BUILDJOB_ADD] = 472
    ENUM[473] = :BUILDJOB_CANCEL ; NUME[:BUILDJOB_CANCEL] = 473
    ENUM[474] = :BUILDJOB_NAME ; NUME[:BUILDJOB_NAME] = 474
    ENUM[475] = :BUILDJOB_PROMOTE ; NUME[:BUILDJOB_PROMOTE] = 475
    ENUM[476] = :BUILDJOB_NOW ; NUME[:BUILDJOB_NOW] = 476
    ENUM[477] = :BUILDJOB_REPEAT ; NUME[:BUILDJOB_REPEAT] = 477
    ENUM[478] = :BUILDJOB_SUSPEND ; NUME[:BUILDJOB_SUSPEND] = 478
    ENUM[479] = :BUILDJOB_WORKSHOP_PROFILE ; NUME[:BUILDJOB_WORKSHOP_PROFILE] = 479
    ENUM[480] = :BUILDJOB_DETAILS ; NUME[:BUILDJOB_DETAILS] = 480
    ENUM[481] = :BUILDJOB_DETAILS_FILTER ; NUME[:BUILDJOB_DETAILS_FILTER] = 481
    ENUM[482] = :BUILDJOB_WELL_FREE ; NUME[:BUILDJOB_WELL_FREE] = 482
    ENUM[483] = :BUILDJOB_WELL_SIZE ; NUME[:BUILDJOB_WELL_SIZE] = 483
    ENUM[484] = :BUILDJOB_TARGET_FREE ; NUME[:BUILDJOB_TARGET_FREE] = 484
    ENUM[485] = :BUILDJOB_TARGET_SIZE ; NUME[:BUILDJOB_TARGET_SIZE] = 485
    ENUM[486] = :BUILDJOB_TARGET_DOWN ; NUME[:BUILDJOB_TARGET_DOWN] = 486
    ENUM[487] = :BUILDJOB_TARGET_UP ; NUME[:BUILDJOB_TARGET_UP] = 487
    ENUM[488] = :BUILDJOB_TARGET_RIGHT ; NUME[:BUILDJOB_TARGET_RIGHT] = 488
    ENUM[489] = :BUILDJOB_TARGET_LEFT ; NUME[:BUILDJOB_TARGET_LEFT] = 489
    ENUM[490] = :BUILDJOB_STATUE_ASSIGN ; NUME[:BUILDJOB_STATUE_ASSIGN] = 490
    ENUM[491] = :BUILDJOB_STATUE_FREE ; NUME[:BUILDJOB_STATUE_FREE] = 491
    ENUM[492] = :BUILDJOB_STATUE_SIZE ; NUME[:BUILDJOB_STATUE_SIZE] = 492
    ENUM[493] = :BUILDJOB_CAGE_JUSTICE ; NUME[:BUILDJOB_CAGE_JUSTICE] = 493
    ENUM[494] = :BUILDJOB_CAGE_FREE ; NUME[:BUILDJOB_CAGE_FREE] = 494
    ENUM[495] = :BUILDJOB_CAGE_SIZE ; NUME[:BUILDJOB_CAGE_SIZE] = 495
    ENUM[496] = :BUILDJOB_CAGE_ASSIGN_OCC ; NUME[:BUILDJOB_CAGE_ASSIGN_OCC] = 496
    ENUM[497] = :BUILDJOB_CAGE_WATER ; NUME[:BUILDJOB_CAGE_WATER] = 497
    ENUM[498] = :BUILDJOB_CAGE_ASSIGN ; NUME[:BUILDJOB_CAGE_ASSIGN] = 498
    ENUM[499] = :BUILDJOB_CHAIN_ASSIGN_OCC ; NUME[:BUILDJOB_CHAIN_ASSIGN_OCC] = 499
    ENUM[500] = :BUILDJOB_CHAIN_JUSTICE ; NUME[:BUILDJOB_CHAIN_JUSTICE] = 500
    ENUM[501] = :BUILDJOB_CHAIN_ASSIGN ; NUME[:BUILDJOB_CHAIN_ASSIGN] = 501
    ENUM[502] = :BUILDJOB_CHAIN_FREE ; NUME[:BUILDJOB_CHAIN_FREE] = 502
    ENUM[503] = :BUILDJOB_CHAIN_SIZE ; NUME[:BUILDJOB_CHAIN_SIZE] = 503
    ENUM[504] = :BUILDJOB_SIEGE_FIRING ; NUME[:BUILDJOB_SIEGE_FIRING] = 504
    ENUM[505] = :BUILDJOB_SIEGE_ORIENT ; NUME[:BUILDJOB_SIEGE_ORIENT] = 505
    ENUM[506] = :BUILDJOB_DOOR_INTERNAL ; NUME[:BUILDJOB_DOOR_INTERNAL] = 506
    ENUM[507] = :BUILDJOB_DOOR_LOCK ; NUME[:BUILDJOB_DOOR_LOCK] = 507
    ENUM[508] = :BUILDJOB_DOOR_AJAR ; NUME[:BUILDJOB_DOOR_AJAR] = 508
    ENUM[509] = :BUILDJOB_COFFIN_ASSIGN ; NUME[:BUILDJOB_COFFIN_ASSIGN] = 509
    ENUM[510] = :BUILDJOB_COFFIN_FREE ; NUME[:BUILDJOB_COFFIN_FREE] = 510
    ENUM[511] = :BUILDJOB_COFFIN_SIZE ; NUME[:BUILDJOB_COFFIN_SIZE] = 511
    ENUM[512] = :BUILDJOB_COFFIN_BURIAL ; NUME[:BUILDJOB_COFFIN_BURIAL] = 512
    ENUM[513] = :BUILDJOB_COFFIN_CIV ; NUME[:BUILDJOB_COFFIN_CIV] = 513
    ENUM[514] = :BUILDJOB_COFFIN_PET ; NUME[:BUILDJOB_COFFIN_PET] = 514
    ENUM[515] = :BUILDJOB_CHAIR_ASSIGN ; NUME[:BUILDJOB_CHAIR_ASSIGN] = 515
    ENUM[516] = :BUILDJOB_CHAIR_FREE ; NUME[:BUILDJOB_CHAIR_FREE] = 516
    ENUM[517] = :BUILDJOB_CHAIR_SIZE ; NUME[:BUILDJOB_CHAIR_SIZE] = 517
    ENUM[518] = :BUILDJOB_TABLE_ASSIGN ; NUME[:BUILDJOB_TABLE_ASSIGN] = 518
    ENUM[519] = :BUILDJOB_TABLE_HALL ; NUME[:BUILDJOB_TABLE_HALL] = 519
    ENUM[520] = :BUILDJOB_TABLE_FREE ; NUME[:BUILDJOB_TABLE_FREE] = 520
    ENUM[521] = :BUILDJOB_TABLE_SIZE ; NUME[:BUILDJOB_TABLE_SIZE] = 521
    ENUM[522] = :BUILDJOB_BED_ASSIGN ; NUME[:BUILDJOB_BED_ASSIGN] = 522
    ENUM[523] = :BUILDJOB_BED_FREE ; NUME[:BUILDJOB_BED_FREE] = 523
    ENUM[524] = :BUILDJOB_BED_BARRACKS ; NUME[:BUILDJOB_BED_BARRACKS] = 524
    ENUM[525] = :BUILDJOB_BED_DORMITORY ; NUME[:BUILDJOB_BED_DORMITORY] = 525
    ENUM[526] = :BUILDJOB_BED_RENT ; NUME[:BUILDJOB_BED_RENT] = 526
    ENUM[527] = :BUILDJOB_BED_SIZE ; NUME[:BUILDJOB_BED_SIZE] = 527
    ENUM[528] = :BUILDJOB_BED_SLEEP ; NUME[:BUILDJOB_BED_SLEEP] = 528
    ENUM[529] = :BUILDJOB_BED_TRAIN ; NUME[:BUILDJOB_BED_TRAIN] = 529
    ENUM[530] = :BUILDJOB_BED_INDIV_EQ ; NUME[:BUILDJOB_BED_INDIV_EQ] = 530
    ENUM[531] = :BUILDJOB_BED_SQUAD_EQ ; NUME[:BUILDJOB_BED_SQUAD_EQ] = 531
    ENUM[532] = :BUILDJOB_BED_POSITION ; NUME[:BUILDJOB_BED_POSITION] = 532
    ENUM[533] = :BUILDJOB_DEPOT_BRING ; NUME[:BUILDJOB_DEPOT_BRING] = 533
    ENUM[534] = :BUILDJOB_DEPOT_TRADE ; NUME[:BUILDJOB_DEPOT_TRADE] = 534
    ENUM[535] = :BUILDJOB_DEPOT_REQUEST_TRADER ; NUME[:BUILDJOB_DEPOT_REQUEST_TRADER] = 535
    ENUM[536] = :BUILDJOB_DEPOT_BROKER_ONLY ; NUME[:BUILDJOB_DEPOT_BROKER_ONLY] = 536
    ENUM[537] = :BUILDJOB_ANIMALTRAP_BAIT_NONE ; NUME[:BUILDJOB_ANIMALTRAP_BAIT_NONE] = 537
    ENUM[538] = :BUILDJOB_ANIMALTRAP_BAIT_MEAT ; NUME[:BUILDJOB_ANIMALTRAP_BAIT_MEAT] = 538
    ENUM[539] = :BUILDJOB_ANIMALTRAP_BAIT_FISH ; NUME[:BUILDJOB_ANIMALTRAP_BAIT_FISH] = 539
    ENUM[540] = :BUILDJOB_ANIMALTRAP_BAIT_GEM ; NUME[:BUILDJOB_ANIMALTRAP_BAIT_GEM] = 540
    ENUM[541] = :BUILDJOB_FARM_FALLOW ; NUME[:BUILDJOB_FARM_FALLOW] = 541
    ENUM[542] = :BUILDJOB_FARM_FERTILIZE ; NUME[:BUILDJOB_FARM_FERTILIZE] = 542
    ENUM[543] = :BUILDJOB_FARM_SEASFERT ; NUME[:BUILDJOB_FARM_SEASFERT] = 543
    ENUM[544] = :BUILDJOB_FARM_SPRING ; NUME[:BUILDJOB_FARM_SPRING] = 544
    ENUM[545] = :BUILDJOB_FARM_SUMMER ; NUME[:BUILDJOB_FARM_SUMMER] = 545
    ENUM[546] = :BUILDJOB_FARM_AUTUMN ; NUME[:BUILDJOB_FARM_AUTUMN] = 546
    ENUM[547] = :BUILDJOB_FARM_WINTER ; NUME[:BUILDJOB_FARM_WINTER] = 547
    ENUM[548] = :BUILDJOB_RACK_MAT_BONE ; NUME[:BUILDJOB_RACK_MAT_BONE] = 548
    ENUM[549] = :BUILDJOB_RACK_MAT_BRONZE ; NUME[:BUILDJOB_RACK_MAT_BRONZE] = 549
    ENUM[550] = :BUILDJOB_RACK_MAT_COPPER ; NUME[:BUILDJOB_RACK_MAT_COPPER] = 550
    ENUM[551] = :BUILDJOB_RACK_MAT_IRON ; NUME[:BUILDJOB_RACK_MAT_IRON] = 551
    ENUM[552] = :BUILDJOB_RACK_MAT_STEEL ; NUME[:BUILDJOB_RACK_MAT_STEEL] = 552
    ENUM[553] = :BUILDJOB_RACK_MAT_WOOD ; NUME[:BUILDJOB_RACK_MAT_WOOD] = 553
    ENUM[554] = :BUILDJOB_RACK_MAT_METAL ; NUME[:BUILDJOB_RACK_MAT_METAL] = 554
    ENUM[555] = :BUILDJOB_STAND_MAT_BONE ; NUME[:BUILDJOB_STAND_MAT_BONE] = 555
    ENUM[556] = :BUILDJOB_STAND_MAT_LEATHER ; NUME[:BUILDJOB_STAND_MAT_LEATHER] = 556
    ENUM[557] = :BUILDJOB_STAND_MAT_COPPER ; NUME[:BUILDJOB_STAND_MAT_COPPER] = 557
    ENUM[558] = :BUILDJOB_STAND_MAT_BRONZE ; NUME[:BUILDJOB_STAND_MAT_BRONZE] = 558
    ENUM[559] = :BUILDJOB_STAND_MAT_STEEL ; NUME[:BUILDJOB_STAND_MAT_STEEL] = 559
    ENUM[560] = :BUILDJOB_STAND_MAT_IRON ; NUME[:BUILDJOB_STAND_MAT_IRON] = 560
    ENUM[561] = :BUILDJOB_STAND_MAT_WOOD ; NUME[:BUILDJOB_STAND_MAT_WOOD] = 561
    ENUM[562] = :BUILDJOB_STAND_MAT_METAL ; NUME[:BUILDJOB_STAND_MAT_METAL] = 562
    ENUM[563] = :BUILDJOB_RACKSTAND_ASSIGN ; NUME[:BUILDJOB_RACKSTAND_ASSIGN] = 563
    ENUM[564] = :BUILDJOB_RACKSTAND_FREE ; NUME[:BUILDJOB_RACKSTAND_FREE] = 564
    ENUM[565] = :BUILDJOB_RACKSTAND_SIZE ; NUME[:BUILDJOB_RACKSTAND_SIZE] = 565
    ENUM[566] = :BUILDJOB_RACKSTAND_ITEM ; NUME[:BUILDJOB_RACKSTAND_ITEM] = 566
    ENUM[567] = :BUILDJOB_RACKSTAND_MAT ; NUME[:BUILDJOB_RACKSTAND_MAT] = 567
    ENUM[568] = :BUILDJOB_RACKSTAND_DEFAULTS1 ; NUME[:BUILDJOB_RACKSTAND_DEFAULTS1] = 568
    ENUM[569] = :BUILDJOB_RACKSTAND_KILL1 ; NUME[:BUILDJOB_RACKSTAND_KILL1] = 569
    ENUM[570] = :BUILDJOB_RACKSTAND_DEFAULTS2 ; NUME[:BUILDJOB_RACKSTAND_DEFAULTS2] = 570
    ENUM[571] = :BUILDJOB_RACKSTAND_KILL2 ; NUME[:BUILDJOB_RACKSTAND_KILL2] = 571
    ENUM[572] = :BUILDJOB_DISPLAY_FURNITURE_SET ; NUME[:BUILDJOB_DISPLAY_FURNITURE_SET] = 572
    ENUM[573] = :BUILDJOB_DISPLAY_FURNITURE_CANCEL ; NUME[:BUILDJOB_DISPLAY_FURNITURE_CANCEL] = 573
    ENUM[574] = :HOTKEY_BUILDING_ARMORSTAND ; NUME[:HOTKEY_BUILDING_ARMORSTAND] = 574
    ENUM[575] = :HOTKEY_BUILDING_BED ; NUME[:HOTKEY_BUILDING_BED] = 575
    ENUM[576] = :HOTKEY_BUILDING_CHAIR ; NUME[:HOTKEY_BUILDING_CHAIR] = 576
    ENUM[577] = :HOTKEY_BUILDING_COFFIN ; NUME[:HOTKEY_BUILDING_COFFIN] = 577
    ENUM[578] = :HOTKEY_BUILDING_DOOR ; NUME[:HOTKEY_BUILDING_DOOR] = 578
    ENUM[579] = :HOTKEY_BUILDING_FLOODGATE ; NUME[:HOTKEY_BUILDING_FLOODGATE] = 579
    ENUM[580] = :HOTKEY_BUILDING_HATCH ; NUME[:HOTKEY_BUILDING_HATCH] = 580
    ENUM[581] = :HOTKEY_BUILDING_GRATE_WALL ; NUME[:HOTKEY_BUILDING_GRATE_WALL] = 581
    ENUM[582] = :HOTKEY_BUILDING_GRATE_FLOOR ; NUME[:HOTKEY_BUILDING_GRATE_FLOOR] = 582
    ENUM[583] = :HOTKEY_BUILDING_BARS_VERTICAL ; NUME[:HOTKEY_BUILDING_BARS_VERTICAL] = 583
    ENUM[584] = :HOTKEY_BUILDING_BARS_FLOOR ; NUME[:HOTKEY_BUILDING_BARS_FLOOR] = 584
    ENUM[585] = :HOTKEY_BUILDING_CABINET ; NUME[:HOTKEY_BUILDING_CABINET] = 585
    ENUM[586] = :HOTKEY_BUILDING_BOX ; NUME[:HOTKEY_BUILDING_BOX] = 586
    ENUM[587] = :HOTKEY_BUILDING_KENNEL ; NUME[:HOTKEY_BUILDING_KENNEL] = 587
    ENUM[588] = :HOTKEY_BUILDING_FARMPLOT ; NUME[:HOTKEY_BUILDING_FARMPLOT] = 588
    ENUM[589] = :HOTKEY_BUILDING_WEAPONRACK ; NUME[:HOTKEY_BUILDING_WEAPONRACK] = 589
    ENUM[590] = :HOTKEY_BUILDING_STATUE ; NUME[:HOTKEY_BUILDING_STATUE] = 590
    ENUM[591] = :HOTKEY_BUILDING_TABLE ; NUME[:HOTKEY_BUILDING_TABLE] = 591
    ENUM[592] = :HOTKEY_BUILDING_ROAD_DIRT ; NUME[:HOTKEY_BUILDING_ROAD_DIRT] = 592
    ENUM[593] = :HOTKEY_BUILDING_ROAD_PAVED ; NUME[:HOTKEY_BUILDING_ROAD_PAVED] = 593
    ENUM[594] = :HOTKEY_BUILDING_BRIDGE ; NUME[:HOTKEY_BUILDING_BRIDGE] = 594
    ENUM[595] = :HOTKEY_BUILDING_WELL ; NUME[:HOTKEY_BUILDING_WELL] = 595
    ENUM[596] = :HOTKEY_BUILDING_SIEGEENGINE ; NUME[:HOTKEY_BUILDING_SIEGEENGINE] = 596
    ENUM[597] = :HOTKEY_BUILDING_WORKSHOP ; NUME[:HOTKEY_BUILDING_WORKSHOP] = 597
    ENUM[598] = :HOTKEY_BUILDING_FURNACE ; NUME[:HOTKEY_BUILDING_FURNACE] = 598
    ENUM[599] = :HOTKEY_BUILDING_WINDOW_GLASS ; NUME[:HOTKEY_BUILDING_WINDOW_GLASS] = 599
    ENUM[600] = :HOTKEY_BUILDING_WINDOW_GEM ; NUME[:HOTKEY_BUILDING_WINDOW_GEM] = 600
    ENUM[601] = :HOTKEY_BUILDING_SHOP ; NUME[:HOTKEY_BUILDING_SHOP] = 601
    ENUM[602] = :HOTKEY_BUILDING_ANIMALTRAP ; NUME[:HOTKEY_BUILDING_ANIMALTRAP] = 602
    ENUM[603] = :HOTKEY_BUILDING_CHAIN ; NUME[:HOTKEY_BUILDING_CHAIN] = 603
    ENUM[604] = :HOTKEY_BUILDING_CAGE ; NUME[:HOTKEY_BUILDING_CAGE] = 604
    ENUM[605] = :HOTKEY_BUILDING_TRADEDEPOT ; NUME[:HOTKEY_BUILDING_TRADEDEPOT] = 605
    ENUM[606] = :HOTKEY_BUILDING_TRAP ; NUME[:HOTKEY_BUILDING_TRAP] = 606
    ENUM[607] = :HOTKEY_BUILDING_MACHINE ; NUME[:HOTKEY_BUILDING_MACHINE] = 607
    ENUM[608] = :HOTKEY_BUILDING_INSTRUMENT ; NUME[:HOTKEY_BUILDING_INSTRUMENT] = 608
    ENUM[609] = :HOTKEY_BUILDING_SUPPORT ; NUME[:HOTKEY_BUILDING_SUPPORT] = 609
    ENUM[610] = :HOTKEY_BUILDING_ARCHERYTARGET ; NUME[:HOTKEY_BUILDING_ARCHERYTARGET] = 610
    ENUM[611] = :HOTKEY_BUILDING_TRACTION_BENCH ; NUME[:HOTKEY_BUILDING_TRACTION_BENCH] = 611
    ENUM[612] = :HOTKEY_BUILDING_SLAB ; NUME[:HOTKEY_BUILDING_SLAB] = 612
    ENUM[613] = :HOTKEY_BUILDING_NEST_BOX ; NUME[:HOTKEY_BUILDING_NEST_BOX] = 613
    ENUM[614] = :HOTKEY_BUILDING_BOOKCASE ; NUME[:HOTKEY_BUILDING_BOOKCASE] = 614
    ENUM[615] = :HOTKEY_BUILDING_HIVE ; NUME[:HOTKEY_BUILDING_HIVE] = 615
    ENUM[616] = :HOTKEY_BUILDING_DISPLAY_FURNITURE ; NUME[:HOTKEY_BUILDING_DISPLAY_FURNITURE] = 616
    ENUM[617] = :HOTKEY_BUILDING_OFFERING_PLACE ; NUME[:HOTKEY_BUILDING_OFFERING_PLACE] = 617
    ENUM[618] = :HOTKEY_BUILDING_MACHINE_SCREW_PUMP ; NUME[:HOTKEY_BUILDING_MACHINE_SCREW_PUMP] = 618
    ENUM[619] = :HOTKEY_BUILDING_MACHINE_WATER_WHEEL ; NUME[:HOTKEY_BUILDING_MACHINE_WATER_WHEEL] = 619
    ENUM[620] = :HOTKEY_BUILDING_MACHINE_WINDMILL ; NUME[:HOTKEY_BUILDING_MACHINE_WINDMILL] = 620
    ENUM[621] = :HOTKEY_BUILDING_MACHINE_GEAR_ASSEMBLY ; NUME[:HOTKEY_BUILDING_MACHINE_GEAR_ASSEMBLY] = 621
    ENUM[622] = :HOTKEY_BUILDING_MACHINE_AXLE_VERTICAL ; NUME[:HOTKEY_BUILDING_MACHINE_AXLE_VERTICAL] = 622
    ENUM[623] = :HOTKEY_BUILDING_MACHINE_AXLE_HORIZONTAL ; NUME[:HOTKEY_BUILDING_MACHINE_AXLE_HORIZONTAL] = 623
    ENUM[624] = :HOTKEY_BUILDING_MACHINE_ROLLERS ; NUME[:HOTKEY_BUILDING_MACHINE_ROLLERS] = 624
    ENUM[625] = :HOTKEY_BUILDING_SIEGEENGINE_BALLISTA ; NUME[:HOTKEY_BUILDING_SIEGEENGINE_BALLISTA] = 625
    ENUM[626] = :HOTKEY_BUILDING_SIEGEENGINE_CATAPULT ; NUME[:HOTKEY_BUILDING_SIEGEENGINE_CATAPULT] = 626
    ENUM[627] = :HOTKEY_BUILDING_TRAP_STONE ; NUME[:HOTKEY_BUILDING_TRAP_STONE] = 627
    ENUM[628] = :HOTKEY_BUILDING_TRAP_WEAPON ; NUME[:HOTKEY_BUILDING_TRAP_WEAPON] = 628
    ENUM[629] = :HOTKEY_BUILDING_TRAP_LEVER ; NUME[:HOTKEY_BUILDING_TRAP_LEVER] = 629
    ENUM[630] = :HOTKEY_BUILDING_TRAP_TRIGGER ; NUME[:HOTKEY_BUILDING_TRAP_TRIGGER] = 630
    ENUM[631] = :HOTKEY_BUILDING_TRAP_CAGE ; NUME[:HOTKEY_BUILDING_TRAP_CAGE] = 631
    ENUM[632] = :HOTKEY_BUILDING_TRAP_SPIKE ; NUME[:HOTKEY_BUILDING_TRAP_SPIKE] = 632
    ENUM[633] = :HOTKEY_BUILDING_CONSTRUCTION ; NUME[:HOTKEY_BUILDING_CONSTRUCTION] = 633
    ENUM[634] = :HOTKEY_BUILDING_CONSTRUCTION_WALL ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_WALL] = 634
    ENUM[635] = :HOTKEY_BUILDING_CONSTRUCTION_FLOOR ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_FLOOR] = 635
    ENUM[636] = :HOTKEY_BUILDING_CONSTRUCTION_RAMP ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_RAMP] = 636
    ENUM[637] = :HOTKEY_BUILDING_CONSTRUCTION_STAIR_UP ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_STAIR_UP] = 637
    ENUM[638] = :HOTKEY_BUILDING_CONSTRUCTION_STAIR_DOWN ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_STAIR_DOWN] = 638
    ENUM[639] = :HOTKEY_BUILDING_CONSTRUCTION_STAIR_UPDOWN ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_STAIR_UPDOWN] = 639
    ENUM[640] = :HOTKEY_BUILDING_CONSTRUCTION_FORTIFICATION ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_FORTIFICATION] = 640
    ENUM[641] = :HOTKEY_BUILDING_CONSTRUCTION_TRACK ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_TRACK] = 641
    ENUM[642] = :HOTKEY_BUILDING_CONSTRUCTION_TRACK_STOP ; NUME[:HOTKEY_BUILDING_CONSTRUCTION_TRACK_STOP] = 642
    ENUM[643] = :HOTKEY_BUILDING_WORKSHOP_LEATHER ; NUME[:HOTKEY_BUILDING_WORKSHOP_LEATHER] = 643
    ENUM[644] = :HOTKEY_BUILDING_WORKSHOP_QUERN ; NUME[:HOTKEY_BUILDING_WORKSHOP_QUERN] = 644
    ENUM[645] = :HOTKEY_BUILDING_WORKSHOP_MILLSTONE ; NUME[:HOTKEY_BUILDING_WORKSHOP_MILLSTONE] = 645
    ENUM[646] = :HOTKEY_BUILDING_WORKSHOP_LOOM ; NUME[:HOTKEY_BUILDING_WORKSHOP_LOOM] = 646
    ENUM[647] = :HOTKEY_BUILDING_WORKSHOP_CLOTHES ; NUME[:HOTKEY_BUILDING_WORKSHOP_CLOTHES] = 647
    ENUM[648] = :HOTKEY_BUILDING_WORKSHOP_BOWYER ; NUME[:HOTKEY_BUILDING_WORKSHOP_BOWYER] = 648
    ENUM[649] = :HOTKEY_BUILDING_WORKSHOP_CARPENTER ; NUME[:HOTKEY_BUILDING_WORKSHOP_CARPENTER] = 649
    ENUM[650] = :HOTKEY_BUILDING_WORKSHOP_METALSMITH ; NUME[:HOTKEY_BUILDING_WORKSHOP_METALSMITH] = 650
    ENUM[651] = :HOTKEY_BUILDING_WORKSHOP_LAVAMILL ; NUME[:HOTKEY_BUILDING_WORKSHOP_LAVAMILL] = 651
    ENUM[652] = :HOTKEY_BUILDING_WORKSHOP_JEWELER ; NUME[:HOTKEY_BUILDING_WORKSHOP_JEWELER] = 652
    ENUM[653] = :HOTKEY_BUILDING_WORKSHOP_MASON ; NUME[:HOTKEY_BUILDING_WORKSHOP_MASON] = 653
    ENUM[654] = :HOTKEY_BUILDING_WORKSHOP_BUTCHER ; NUME[:HOTKEY_BUILDING_WORKSHOP_BUTCHER] = 654
    ENUM[655] = :HOTKEY_BUILDING_WORKSHOP_TANNER ; NUME[:HOTKEY_BUILDING_WORKSHOP_TANNER] = 655
    ENUM[656] = :HOTKEY_BUILDING_WORKSHOP_DYER ; NUME[:HOTKEY_BUILDING_WORKSHOP_DYER] = 656
    ENUM[657] = :HOTKEY_BUILDING_WORKSHOP_CRAFTSMAN ; NUME[:HOTKEY_BUILDING_WORKSHOP_CRAFTSMAN] = 657
    ENUM[658] = :HOTKEY_BUILDING_WORKSHOP_SIEGE ; NUME[:HOTKEY_BUILDING_WORKSHOP_SIEGE] = 658
    ENUM[659] = :HOTKEY_BUILDING_WORKSHOP_MECHANIC ; NUME[:HOTKEY_BUILDING_WORKSHOP_MECHANIC] = 659
    ENUM[660] = :HOTKEY_BUILDING_WORKSHOP_STILL ; NUME[:HOTKEY_BUILDING_WORKSHOP_STILL] = 660
    ENUM[661] = :HOTKEY_BUILDING_WORKSHOP_FARMER ; NUME[:HOTKEY_BUILDING_WORKSHOP_FARMER] = 661
    ENUM[662] = :HOTKEY_BUILDING_WORKSHOP_KITCHEN ; NUME[:HOTKEY_BUILDING_WORKSHOP_KITCHEN] = 662
    ENUM[663] = :HOTKEY_BUILDING_WORKSHOP_FISHERY ; NUME[:HOTKEY_BUILDING_WORKSHOP_FISHERY] = 663
    ENUM[664] = :HOTKEY_BUILDING_WORKSHOP_ASHERY ; NUME[:HOTKEY_BUILDING_WORKSHOP_ASHERY] = 664
    ENUM[665] = :HOTKEY_BUILDING_FURNACE_WOOD ; NUME[:HOTKEY_BUILDING_FURNACE_WOOD] = 665
    ENUM[666] = :HOTKEY_BUILDING_FURNACE_SMELTER ; NUME[:HOTKEY_BUILDING_FURNACE_SMELTER] = 666
    ENUM[667] = :HOTKEY_BUILDING_FURNACE_GLASS ; NUME[:HOTKEY_BUILDING_FURNACE_GLASS] = 667
    ENUM[668] = :HOTKEY_BUILDING_FURNACE_KILN ; NUME[:HOTKEY_BUILDING_FURNACE_KILN] = 668
    ENUM[669] = :HOTKEY_BUILDING_FURNACE_SMELTER_LAVA ; NUME[:HOTKEY_BUILDING_FURNACE_SMELTER_LAVA] = 669
    ENUM[670] = :HOTKEY_BUILDING_FURNACE_GLASS_LAVA ; NUME[:HOTKEY_BUILDING_FURNACE_GLASS_LAVA] = 670
    ENUM[671] = :HOTKEY_BUILDING_FURNACE_KILN_LAVA ; NUME[:HOTKEY_BUILDING_FURNACE_KILN_LAVA] = 671
    ENUM[672] = :HIVE_INSTALL_COLONY ; NUME[:HIVE_INSTALL_COLONY] = 672
    ENUM[673] = :HIVE_GATHER_PRODUCTS ; NUME[:HIVE_GATHER_PRODUCTS] = 673
    ENUM[674] = :BUILDING_DIM_Y_UP ; NUME[:BUILDING_DIM_Y_UP] = 674
    ENUM[675] = :BUILDING_DIM_Y_DOWN ; NUME[:BUILDING_DIM_Y_DOWN] = 675
    ENUM[676] = :BUILDING_DIM_X_UP ; NUME[:BUILDING_DIM_X_UP] = 676
    ENUM[677] = :BUILDING_DIM_X_DOWN ; NUME[:BUILDING_DIM_X_DOWN] = 677
    ENUM[678] = :BUILDING_ORIENT_UP ; NUME[:BUILDING_ORIENT_UP] = 678
    ENUM[679] = :BUILDING_ORIENT_LEFT ; NUME[:BUILDING_ORIENT_LEFT] = 679
    ENUM[680] = :BUILDING_ORIENT_RIGHT ; NUME[:BUILDING_ORIENT_RIGHT] = 680
    ENUM[681] = :BUILDING_ORIENT_DOWN ; NUME[:BUILDING_ORIENT_DOWN] = 681
    ENUM[682] = :BUILDING_ORIENT_NONE ; NUME[:BUILDING_ORIENT_NONE] = 682
    ENUM[683] = :BUILDING_VIEW_ITEM ; NUME[:BUILDING_VIEW_ITEM] = 683
    ENUM[684] = :BUILDING_ADVANCE_STAGE ; NUME[:BUILDING_ADVANCE_STAGE] = 684
    ENUM[685] = :BUILDING_EXPAND_CONTRACT ; NUME[:BUILDING_EXPAND_CONTRACT] = 685
    ENUM[686] = :BUILDING_TRIGGER_ENABLE_WATER ; NUME[:BUILDING_TRIGGER_ENABLE_WATER] = 686
    ENUM[687] = :BUILDING_TRIGGER_MIN_WATER_UP ; NUME[:BUILDING_TRIGGER_MIN_WATER_UP] = 687
    ENUM[688] = :BUILDING_TRIGGER_MIN_WATER_DOWN ; NUME[:BUILDING_TRIGGER_MIN_WATER_DOWN] = 688
    ENUM[689] = :BUILDING_TRIGGER_MAX_WATER_UP ; NUME[:BUILDING_TRIGGER_MAX_WATER_UP] = 689
    ENUM[690] = :BUILDING_TRIGGER_MAX_WATER_DOWN ; NUME[:BUILDING_TRIGGER_MAX_WATER_DOWN] = 690
    ENUM[691] = :BUILDING_TRIGGER_ENABLE_MAGMA ; NUME[:BUILDING_TRIGGER_ENABLE_MAGMA] = 691
    ENUM[692] = :BUILDING_TRIGGER_MIN_MAGMA_UP ; NUME[:BUILDING_TRIGGER_MIN_MAGMA_UP] = 692
    ENUM[693] = :BUILDING_TRIGGER_MIN_MAGMA_DOWN ; NUME[:BUILDING_TRIGGER_MIN_MAGMA_DOWN] = 693
    ENUM[694] = :BUILDING_TRIGGER_MAX_MAGMA_UP ; NUME[:BUILDING_TRIGGER_MAX_MAGMA_UP] = 694
    ENUM[695] = :BUILDING_TRIGGER_MAX_MAGMA_DOWN ; NUME[:BUILDING_TRIGGER_MAX_MAGMA_DOWN] = 695
    ENUM[696] = :BUILDING_TRIGGER_ENABLE_TRACK_CART ; NUME[:BUILDING_TRIGGER_ENABLE_TRACK_CART] = 696
    ENUM[697] = :BUILDING_TRIGGER_MIN_TRACK_CART_DOWN ; NUME[:BUILDING_TRIGGER_MIN_TRACK_CART_DOWN] = 697
    ENUM[698] = :BUILDING_TRIGGER_MIN_TRACK_CART_UP ; NUME[:BUILDING_TRIGGER_MIN_TRACK_CART_UP] = 698
    ENUM[699] = :BUILDING_TRIGGER_MAX_TRACK_CART_DOWN ; NUME[:BUILDING_TRIGGER_MAX_TRACK_CART_DOWN] = 699
    ENUM[700] = :BUILDING_TRIGGER_MAX_TRACK_CART_UP ; NUME[:BUILDING_TRIGGER_MAX_TRACK_CART_UP] = 700
    ENUM[701] = :BUILDING_TRIGGER_ENABLE_CREATURE ; NUME[:BUILDING_TRIGGER_ENABLE_CREATURE] = 701
    ENUM[702] = :BUILDING_TRIGGER_ENABLE_LOCALS ; NUME[:BUILDING_TRIGGER_ENABLE_LOCALS] = 702
    ENUM[703] = :BUILDING_TRIGGER_RESETS ; NUME[:BUILDING_TRIGGER_RESETS] = 703
    ENUM[704] = :BUILDING_TRIGGER_MIN_SIZE_UP ; NUME[:BUILDING_TRIGGER_MIN_SIZE_UP] = 704
    ENUM[705] = :BUILDING_TRIGGER_MIN_SIZE_DOWN ; NUME[:BUILDING_TRIGGER_MIN_SIZE_DOWN] = 705
    ENUM[706] = :BUILDING_TRIGGER_MAX_SIZE_UP ; NUME[:BUILDING_TRIGGER_MAX_SIZE_UP] = 706
    ENUM[707] = :BUILDING_TRIGGER_MAX_SIZE_DOWN ; NUME[:BUILDING_TRIGGER_MAX_SIZE_DOWN] = 707
    ENUM[708] = :BUILDING_TRIGGER_MIN_SIZE_UP_PLUS ; NUME[:BUILDING_TRIGGER_MIN_SIZE_UP_PLUS] = 708
    ENUM[709] = :BUILDING_TRIGGER_MIN_SIZE_DOWN_PLUS ; NUME[:BUILDING_TRIGGER_MIN_SIZE_DOWN_PLUS] = 709
    ENUM[710] = :BUILDING_TRIGGER_MAX_SIZE_UP_PLUS ; NUME[:BUILDING_TRIGGER_MAX_SIZE_UP_PLUS] = 710
    ENUM[711] = :BUILDING_TRIGGER_MAX_SIZE_DOWN_PLUS ; NUME[:BUILDING_TRIGGER_MAX_SIZE_DOWN_PLUS] = 711
    ENUM[712] = :BUILDING_ROLLERS_SPEED_UP ; NUME[:BUILDING_ROLLERS_SPEED_UP] = 712
    ENUM[713] = :BUILDING_ROLLERS_SPEED_DOWN ; NUME[:BUILDING_ROLLERS_SPEED_DOWN] = 713
    ENUM[714] = :BUILDING_TRACK_STOP_FRICTION_UP ; NUME[:BUILDING_TRACK_STOP_FRICTION_UP] = 714
    ENUM[715] = :BUILDING_TRACK_STOP_FRICTION_DOWN ; NUME[:BUILDING_TRACK_STOP_FRICTION_DOWN] = 715
    ENUM[716] = :BUILDING_TRACK_STOP_DUMP ; NUME[:BUILDING_TRACK_STOP_DUMP] = 716
    ENUM[717] = :DESTROYBUILDING ; NUME[:DESTROYBUILDING] = 717
    ENUM[718] = :SUSPENDBUILDING ; NUME[:SUSPENDBUILDING] = 718
    ENUM[719] = :BUILDINGLIST_ZOOM_T ; NUME[:BUILDINGLIST_ZOOM_T] = 719
    ENUM[720] = :BUILDINGLIST_ZOOM_Q ; NUME[:BUILDINGLIST_ZOOM_Q] = 720
    ENUM[721] = :RECENTER_ON_LEVER ; NUME[:RECENTER_ON_LEVER] = 721
    ENUM[722] = :ASSIGN_LOCATION ; NUME[:ASSIGN_LOCATION] = 722
    ENUM[723] = :LOCATION_NEW ; NUME[:LOCATION_NEW] = 723
    ENUM[724] = :LOCATION_RETIRE ; NUME[:LOCATION_RETIRE] = 724
    ENUM[725] = :LOCATION_INN_TAVERN ; NUME[:LOCATION_INN_TAVERN] = 725
    ENUM[726] = :LOCATION_TEMPLE ; NUME[:LOCATION_TEMPLE] = 726
    ENUM[727] = :LOCATION_RECOGNIZE_PRIESTHOOD ; NUME[:LOCATION_RECOGNIZE_PRIESTHOOD] = 727
    ENUM[728] = :LOCATION_LIBRARY ; NUME[:LOCATION_LIBRARY] = 728
    ENUM[729] = :LOCATION_GUILDHALL ; NUME[:LOCATION_GUILDHALL] = 729
    ENUM[730] = :LOCATION_MAIN_HALL ; NUME[:LOCATION_MAIN_HALL] = 730
    ENUM[731] = :LOCATION_RENAME ; NUME[:LOCATION_RENAME] = 731
    ENUM[732] = :LOCATION_DETAILS ; NUME[:LOCATION_DETAILS] = 732
    ENUM[733] = :LOCATION_RESTRICTION ; NUME[:LOCATION_RESTRICTION] = 733
    ENUM[734] = :LOCATION_SET_NUMBER_1 ; NUME[:LOCATION_SET_NUMBER_1] = 734
    ENUM[735] = :LOCATION_SET_NUMBER_2 ; NUME[:LOCATION_SET_NUMBER_2] = 735
    ENUM[736] = :HOTKEY_MAKE_ASH ; NUME[:HOTKEY_MAKE_ASH] = 736
    ENUM[737] = :HOTKEY_MAKE_CHARCOAL ; NUME[:HOTKEY_MAKE_CHARCOAL] = 737
    ENUM[738] = :HOTKEY_MELT_OBJECT ; NUME[:HOTKEY_MELT_OBJECT] = 738
    ENUM[739] = :HOTKEY_GLASS_GREEN ; NUME[:HOTKEY_GLASS_GREEN] = 739
    ENUM[740] = :HOTKEY_GLASS_CLEAR ; NUME[:HOTKEY_GLASS_CLEAR] = 740
    ENUM[741] = :HOTKEY_GLASS_CRYSTAL ; NUME[:HOTKEY_GLASS_CRYSTAL] = 741
    ENUM[742] = :HOTKEY_COLLECT_SAND ; NUME[:HOTKEY_COLLECT_SAND] = 742
    ENUM[743] = :HOTKEY_COLLECT_CLAY ; NUME[:HOTKEY_COLLECT_CLAY] = 743
    ENUM[744] = :HOTKEY_GLASS_ROUGH ; NUME[:HOTKEY_GLASS_ROUGH] = 744
    ENUM[745] = :HOTKEY_GLASS_ARMORSTAND ; NUME[:HOTKEY_GLASS_ARMORSTAND] = 745
    ENUM[746] = :HOTKEY_GLASS_BOX ; NUME[:HOTKEY_GLASS_BOX] = 746
    ENUM[747] = :HOTKEY_GLASS_CABINET ; NUME[:HOTKEY_GLASS_CABINET] = 747
    ENUM[748] = :HOTKEY_GLASS_COFFIN ; NUME[:HOTKEY_GLASS_COFFIN] = 748
    ENUM[749] = :HOTKEY_GLASS_FLOODGATE ; NUME[:HOTKEY_GLASS_FLOODGATE] = 749
    ENUM[750] = :HOTKEY_GLASS_HATCH_COVER ; NUME[:HOTKEY_GLASS_HATCH_COVER] = 750
    ENUM[751] = :HOTKEY_GLASS_GRATE ; NUME[:HOTKEY_GLASS_GRATE] = 751
    ENUM[752] = :HOTKEY_GLASS_GOBLET ; NUME[:HOTKEY_GLASS_GOBLET] = 752
    ENUM[753] = :HOTKEY_GLASS_TOY ; NUME[:HOTKEY_GLASS_TOY] = 753
    ENUM[754] = :HOTKEY_GLASS_DOOR ; NUME[:HOTKEY_GLASS_DOOR] = 754
    ENUM[755] = :HOTKEY_GLASS_STATUE ; NUME[:HOTKEY_GLASS_STATUE] = 755
    ENUM[756] = :HOTKEY_GLASS_TABLE ; NUME[:HOTKEY_GLASS_TABLE] = 756
    ENUM[757] = :HOTKEY_GLASS_CAGE ; NUME[:HOTKEY_GLASS_CAGE] = 757
    ENUM[758] = :HOTKEY_GLASS_CHAIR ; NUME[:HOTKEY_GLASS_CHAIR] = 758
    ENUM[759] = :HOTKEY_GLASS_BLOCKS ; NUME[:HOTKEY_GLASS_BLOCKS] = 759
    ENUM[760] = :HOTKEY_GLASS_FLASK ; NUME[:HOTKEY_GLASS_FLASK] = 760
    ENUM[761] = :HOTKEY_GLASS_WEAPONRACK ; NUME[:HOTKEY_GLASS_WEAPONRACK] = 761
    ENUM[762] = :HOTKEY_GLASS_WINDOW ; NUME[:HOTKEY_GLASS_WINDOW] = 762
    ENUM[763] = :HOTKEY_ASHERY_LYE ; NUME[:HOTKEY_ASHERY_LYE] = 763
    ENUM[764] = :HOTKEY_ASHERY_POTASH ; NUME[:HOTKEY_ASHERY_POTASH] = 764
    ENUM[765] = :HOTKEY_ASHERY_POTASH_DIRECT ; NUME[:HOTKEY_ASHERY_POTASH_DIRECT] = 765
    ENUM[766] = :HOTKEY_CARPENTER_BARREL ; NUME[:HOTKEY_CARPENTER_BARREL] = 766
    ENUM[767] = :HOTKEY_CARPENTER_BLOCKS ; NUME[:HOTKEY_CARPENTER_BLOCKS] = 767
    ENUM[768] = :HOTKEY_CARPENTER_BUCKET ; NUME[:HOTKEY_CARPENTER_BUCKET] = 768
    ENUM[769] = :HOTKEY_CARPENTER_TRAP_ANIMAL ; NUME[:HOTKEY_CARPENTER_TRAP_ANIMAL] = 769
    ENUM[770] = :HOTKEY_CARPENTER_CAGE ; NUME[:HOTKEY_CARPENTER_CAGE] = 770
    ENUM[771] = :HOTKEY_CARPENTER_ARMORSTAND ; NUME[:HOTKEY_CARPENTER_ARMORSTAND] = 771
    ENUM[772] = :HOTKEY_CARPENTER_BED ; NUME[:HOTKEY_CARPENTER_BED] = 772
    ENUM[773] = :HOTKEY_CARPENTER_CHAIR ; NUME[:HOTKEY_CARPENTER_CHAIR] = 773
    ENUM[774] = :HOTKEY_CARPENTER_COFFIN ; NUME[:HOTKEY_CARPENTER_COFFIN] = 774
    ENUM[775] = :HOTKEY_CARPENTER_DOOR ; NUME[:HOTKEY_CARPENTER_DOOR] = 775
    ENUM[776] = :HOTKEY_CARPENTER_FLOODGATE ; NUME[:HOTKEY_CARPENTER_FLOODGATE] = 776
    ENUM[777] = :HOTKEY_CARPENTER_HATCH_COVER ; NUME[:HOTKEY_CARPENTER_HATCH_COVER] = 777
    ENUM[778] = :HOTKEY_CARPENTER_GRATE ; NUME[:HOTKEY_CARPENTER_GRATE] = 778
    ENUM[779] = :HOTKEY_CARPENTER_CABINET ; NUME[:HOTKEY_CARPENTER_CABINET] = 779
    ENUM[780] = :HOTKEY_CARPENTER_BIN ; NUME[:HOTKEY_CARPENTER_BIN] = 780
    ENUM[781] = :HOTKEY_CARPENTER_BOX ; NUME[:HOTKEY_CARPENTER_BOX] = 781
    ENUM[782] = :HOTKEY_CARPENTER_WEAPONRACK ; NUME[:HOTKEY_CARPENTER_WEAPONRACK] = 782
    ENUM[783] = :HOTKEY_CARPENTER_TABLE ; NUME[:HOTKEY_CARPENTER_TABLE] = 783
    ENUM[784] = :HOTKEY_SIEGE_BALLISTA ; NUME[:HOTKEY_SIEGE_BALLISTA] = 784
    ENUM[785] = :HOTKEY_SIEGE_CATAPULT ; NUME[:HOTKEY_SIEGE_CATAPULT] = 785
    ENUM[786] = :HOTKEY_LEATHER_BOX ; NUME[:HOTKEY_LEATHER_BOX] = 786
    ENUM[787] = :HOTKEY_LEATHER_FLASK ; NUME[:HOTKEY_LEATHER_FLASK] = 787
    ENUM[788] = :HOTKEY_LEATHER_SHIRT ; NUME[:HOTKEY_LEATHER_SHIRT] = 788
    ENUM[789] = :HOTKEY_LEATHER_CLOAK ; NUME[:HOTKEY_LEATHER_CLOAK] = 789
    ENUM[790] = :HOTKEY_LEATHER_BACKPACK ; NUME[:HOTKEY_LEATHER_BACKPACK] = 790
    ENUM[791] = :HOTKEY_LEATHER_QUIVER ; NUME[:HOTKEY_LEATHER_QUIVER] = 791
    ENUM[792] = :HOTKEY_LEATHER_IMAGE ; NUME[:HOTKEY_LEATHER_IMAGE] = 792
    ENUM[793] = :HOTKEY_CLOTHES_MAT_PLANT ; NUME[:HOTKEY_CLOTHES_MAT_PLANT] = 793
    ENUM[794] = :HOTKEY_CLOTHES_MAT_SILK ; NUME[:HOTKEY_CLOTHES_MAT_SILK] = 794
    ENUM[795] = :HOTKEY_CLOTHES_MAT_YARN ; NUME[:HOTKEY_CLOTHES_MAT_YARN] = 795
    ENUM[796] = :HOTKEY_CLOTHES_SHIRT ; NUME[:HOTKEY_CLOTHES_SHIRT] = 796
    ENUM[797] = :HOTKEY_CLOTHES_CLOAK ; NUME[:HOTKEY_CLOTHES_CLOAK] = 797
    ENUM[798] = :HOTKEY_CLOTHES_BOX ; NUME[:HOTKEY_CLOTHES_BOX] = 798
    ENUM[799] = :HOTKEY_CLOTHES_CHAIN ; NUME[:HOTKEY_CLOTHES_CHAIN] = 799
    ENUM[800] = :HOTKEY_CLOTHES_IMAGE ; NUME[:HOTKEY_CLOTHES_IMAGE] = 800
    ENUM[801] = :HOTKEY_CRAFTS_MAT_STONE ; NUME[:HOTKEY_CRAFTS_MAT_STONE] = 801
    ENUM[802] = :HOTKEY_CRAFTS_MAT_WOOD ; NUME[:HOTKEY_CRAFTS_MAT_WOOD] = 802
    ENUM[803] = :HOTKEY_CRAFTS_DEC_BONE ; NUME[:HOTKEY_CRAFTS_DEC_BONE] = 803
    ENUM[804] = :HOTKEY_CRAFTS_DEC_SHELL ; NUME[:HOTKEY_CRAFTS_DEC_SHELL] = 804
    ENUM[805] = :HOTKEY_CRAFTS_DEC_TOOTH ; NUME[:HOTKEY_CRAFTS_DEC_TOOTH] = 805
    ENUM[806] = :HOTKEY_CRAFTS_DEC_HORN ; NUME[:HOTKEY_CRAFTS_DEC_HORN] = 806
    ENUM[807] = :HOTKEY_CRAFTS_DEC_PEARL ; NUME[:HOTKEY_CRAFTS_DEC_PEARL] = 807
    ENUM[808] = :HOTKEY_CRAFTS_TOTEM ; NUME[:HOTKEY_CRAFTS_TOTEM] = 808
    ENUM[809] = :HOTKEY_CRAFTS_CLOTH ; NUME[:HOTKEY_CRAFTS_CLOTH] = 809
    ENUM[810] = :HOTKEY_CRAFTS_SILK ; NUME[:HOTKEY_CRAFTS_SILK] = 810
    ENUM[811] = :HOTKEY_CRAFTS_YARN ; NUME[:HOTKEY_CRAFTS_YARN] = 811
    ENUM[812] = :HOTKEY_CRAFTS_SEL_WOOD ; NUME[:HOTKEY_CRAFTS_SEL_WOOD] = 812
    ENUM[813] = :HOTKEY_CRAFTS_SEL_BONE ; NUME[:HOTKEY_CRAFTS_SEL_BONE] = 813
    ENUM[814] = :HOTKEY_CRAFTS_SEL_SHELL ; NUME[:HOTKEY_CRAFTS_SEL_SHELL] = 814
    ENUM[815] = :HOTKEY_CRAFTS_SHELL ; NUME[:HOTKEY_CRAFTS_SHELL] = 815
    ENUM[816] = :HOTKEY_CRAFTS_TOOTH ; NUME[:HOTKEY_CRAFTS_TOOTH] = 816
    ENUM[817] = :HOTKEY_CRAFTS_HORN ; NUME[:HOTKEY_CRAFTS_HORN] = 817
    ENUM[818] = :HOTKEY_CRAFTS_PEARL ; NUME[:HOTKEY_CRAFTS_PEARL] = 818
    ENUM[819] = :HOTKEY_CRAFTS_BONE ; NUME[:HOTKEY_CRAFTS_BONE] = 819
    ENUM[820] = :HOTKEY_CRAFTS_LEATHER ; NUME[:HOTKEY_CRAFTS_LEATHER] = 820
    ENUM[821] = :HOTKEY_CRAFTS_SLAB ; NUME[:HOTKEY_CRAFTS_SLAB] = 821
    ENUM[822] = :HOTKEY_CRAFTS_MAT_CRAFTS ; NUME[:HOTKEY_CRAFTS_MAT_CRAFTS] = 822
    ENUM[823] = :HOTKEY_CRAFTS_MAT_GOBLET ; NUME[:HOTKEY_CRAFTS_MAT_GOBLET] = 823
    ENUM[824] = :HOTKEY_CRAFTS_MAT_TOY ; NUME[:HOTKEY_CRAFTS_MAT_TOY] = 824
    ENUM[825] = :HOTKEY_SMITH_WEAPON ; NUME[:HOTKEY_SMITH_WEAPON] = 825
    ENUM[826] = :HOTKEY_SMITH_ARMOR ; NUME[:HOTKEY_SMITH_ARMOR] = 826
    ENUM[827] = :HOTKEY_SMITH_FURNITURE ; NUME[:HOTKEY_SMITH_FURNITURE] = 827
    ENUM[828] = :HOTKEY_SMITH_SIEGE ; NUME[:HOTKEY_SMITH_SIEGE] = 828
    ENUM[829] = :HOTKEY_SMITH_TRAP ; NUME[:HOTKEY_SMITH_TRAP] = 829
    ENUM[830] = :HOTKEY_SMITH_OTHER ; NUME[:HOTKEY_SMITH_OTHER] = 830
    ENUM[831] = :HOTKEY_SMITH_METAL ; NUME[:HOTKEY_SMITH_METAL] = 831
    ENUM[832] = :HOTKEY_ALCHEMIST_SOAP ; NUME[:HOTKEY_ALCHEMIST_SOAP] = 832
    ENUM[833] = :HOTKEY_STILL_BREW ; NUME[:HOTKEY_STILL_BREW] = 833
    ENUM[834] = :HOTKEY_STILL_EXTRACT ; NUME[:HOTKEY_STILL_EXTRACT] = 834
    ENUM[835] = :HOTKEY_LOOM_COLLECT_SILK ; NUME[:HOTKEY_LOOM_COLLECT_SILK] = 835
    ENUM[836] = :HOTKEY_LOOM_WEAVE_CLOTH ; NUME[:HOTKEY_LOOM_WEAVE_CLOTH] = 836
    ENUM[837] = :HOTKEY_LOOM_WEAVE_SILK ; NUME[:HOTKEY_LOOM_WEAVE_SILK] = 837
    ENUM[838] = :HOTKEY_LOOM_WEAVE_YARN ; NUME[:HOTKEY_LOOM_WEAVE_YARN] = 838
    ENUM[839] = :HOTKEY_LOOM_WEAVE_METAL ; NUME[:HOTKEY_LOOM_WEAVE_METAL] = 839
    ENUM[840] = :HOTKEY_KITCHEN_COOK_2 ; NUME[:HOTKEY_KITCHEN_COOK_2] = 840
    ENUM[841] = :HOTKEY_KITCHEN_COOK_3 ; NUME[:HOTKEY_KITCHEN_COOK_3] = 841
    ENUM[842] = :HOTKEY_KITCHEN_COOK_4 ; NUME[:HOTKEY_KITCHEN_COOK_4] = 842
    ENUM[843] = :HOTKEY_KITCHEN_RENDER_FAT ; NUME[:HOTKEY_KITCHEN_RENDER_FAT] = 843
    ENUM[844] = :HOTKEY_FARMER_PROCESS ; NUME[:HOTKEY_FARMER_PROCESS] = 844
    ENUM[845] = :HOTKEY_FARMER_PROCESS_VIAL ; NUME[:HOTKEY_FARMER_PROCESS_VIAL] = 845
    ENUM[846] = :HOTKEY_FARMER_PROCESS_BAG ; NUME[:HOTKEY_FARMER_PROCESS_BAG] = 846
    ENUM[847] = :HOTKEY_FARMER_PROCESS_BARREL ; NUME[:HOTKEY_FARMER_PROCESS_BARREL] = 847
    ENUM[848] = :HOTKEY_FARMER_CHEESE ; NUME[:HOTKEY_FARMER_CHEESE] = 848
    ENUM[849] = :HOTKEY_FARMER_MILK ; NUME[:HOTKEY_FARMER_MILK] = 849
    ENUM[850] = :HOTKEY_FARMER_SHEAR_CREATURE ; NUME[:HOTKEY_FARMER_SHEAR_CREATURE] = 850
    ENUM[851] = :HOTKEY_FARMER_SPIN_THREAD ; NUME[:HOTKEY_FARMER_SPIN_THREAD] = 851
    ENUM[852] = :HOTKEY_MILL_MILL ; NUME[:HOTKEY_MILL_MILL] = 852
    ENUM[853] = :HOTKEY_KENNEL_CATCH_VERMIN ; NUME[:HOTKEY_KENNEL_CATCH_VERMIN] = 853
    ENUM[854] = :HOTKEY_KENNEL_TAME_VERMIN ; NUME[:HOTKEY_KENNEL_TAME_VERMIN] = 854
    ENUM[855] = :HOTKEY_FISHERY_PROCESS ; NUME[:HOTKEY_FISHERY_PROCESS] = 855
    ENUM[856] = :HOTKEY_FISHERY_EXTRACT ; NUME[:HOTKEY_FISHERY_EXTRACT] = 856
    ENUM[857] = :HOTKEY_FISHERY_CATCH ; NUME[:HOTKEY_FISHERY_CATCH] = 857
    ENUM[858] = :HOTKEY_BUTCHER_BUTCHER ; NUME[:HOTKEY_BUTCHER_BUTCHER] = 858
    ENUM[859] = :HOTKEY_BUTCHER_EXTRACT ; NUME[:HOTKEY_BUTCHER_EXTRACT] = 859
    ENUM[860] = :HOTKEY_BUTCHER_CATCH ; NUME[:HOTKEY_BUTCHER_CATCH] = 860
    ENUM[861] = :HOTKEY_TANNER_TAN ; NUME[:HOTKEY_TANNER_TAN] = 861
    ENUM[862] = :HOTKEY_DYER_THREAD ; NUME[:HOTKEY_DYER_THREAD] = 862
    ENUM[863] = :HOTKEY_DYER_CLOTH ; NUME[:HOTKEY_DYER_CLOTH] = 863
    ENUM[864] = :HOTKEY_JEWELER_FURNITURE ; NUME[:HOTKEY_JEWELER_FURNITURE] = 864
    ENUM[865] = :HOTKEY_JEWELER_FINISHED ; NUME[:HOTKEY_JEWELER_FINISHED] = 865
    ENUM[866] = :HOTKEY_JEWELER_AMMO ; NUME[:HOTKEY_JEWELER_AMMO] = 866
    ENUM[867] = :HOTKEY_JEWELER_CUT ; NUME[:HOTKEY_JEWELER_CUT] = 867
    ENUM[868] = :HOTKEY_JEWELER_ENCRUST ; NUME[:HOTKEY_JEWELER_ENCRUST] = 868
    ENUM[869] = :HOTKEY_MECHANIC_PARTS ; NUME[:HOTKEY_MECHANIC_PARTS] = 869
    ENUM[870] = :HOTKEY_MECHANIC_TRACTION_BENCH ; NUME[:HOTKEY_MECHANIC_TRACTION_BENCH] = 870
    ENUM[871] = :HOTKEY_MASON_ARMORSTAND ; NUME[:HOTKEY_MASON_ARMORSTAND] = 871
    ENUM[872] = :HOTKEY_MASON_BLOCKS ; NUME[:HOTKEY_MASON_BLOCKS] = 872
    ENUM[873] = :HOTKEY_MASON_CHAIR ; NUME[:HOTKEY_MASON_CHAIR] = 873
    ENUM[874] = :HOTKEY_MASON_COFFIN ; NUME[:HOTKEY_MASON_COFFIN] = 874
    ENUM[875] = :HOTKEY_MASON_DOOR ; NUME[:HOTKEY_MASON_DOOR] = 875
    ENUM[876] = :HOTKEY_MASON_FLOODGATE ; NUME[:HOTKEY_MASON_FLOODGATE] = 876
    ENUM[877] = :HOTKEY_MASON_HATCH_COVER ; NUME[:HOTKEY_MASON_HATCH_COVER] = 877
    ENUM[878] = :HOTKEY_MASON_GRATE ; NUME[:HOTKEY_MASON_GRATE] = 878
    ENUM[879] = :HOTKEY_MASON_CABINET ; NUME[:HOTKEY_MASON_CABINET] = 879
    ENUM[880] = :HOTKEY_MASON_BOX ; NUME[:HOTKEY_MASON_BOX] = 880
    ENUM[881] = :HOTKEY_MASON_STATUE ; NUME[:HOTKEY_MASON_STATUE] = 881
    ENUM[882] = :HOTKEY_MASON_TABLE ; NUME[:HOTKEY_MASON_TABLE] = 882
    ENUM[883] = :HOTKEY_MASON_WEAPONRACK ; NUME[:HOTKEY_MASON_WEAPONRACK] = 883
    ENUM[884] = :HOTKEY_MASON_QUERN ; NUME[:HOTKEY_MASON_QUERN] = 884
    ENUM[885] = :HOTKEY_MASON_MILLSTONE ; NUME[:HOTKEY_MASON_MILLSTONE] = 885
    ENUM[886] = :HOTKEY_MASON_SLAB ; NUME[:HOTKEY_MASON_SLAB] = 886
    ENUM[887] = :HOTKEY_TRAP_BRIDGE ; NUME[:HOTKEY_TRAP_BRIDGE] = 887
    ENUM[888] = :HOTKEY_TRAP_DOOR ; NUME[:HOTKEY_TRAP_DOOR] = 888
    ENUM[889] = :HOTKEY_TRAP_FLOODGATE ; NUME[:HOTKEY_TRAP_FLOODGATE] = 889
    ENUM[890] = :HOTKEY_TRAP_SPIKE ; NUME[:HOTKEY_TRAP_SPIKE] = 890
    ENUM[891] = :HOTKEY_TRAP_HATCH ; NUME[:HOTKEY_TRAP_HATCH] = 891
    ENUM[892] = :HOTKEY_TRAP_GRATE_WALL ; NUME[:HOTKEY_TRAP_GRATE_WALL] = 892
    ENUM[893] = :HOTKEY_TRAP_GRATE_FLOOR ; NUME[:HOTKEY_TRAP_GRATE_FLOOR] = 893
    ENUM[894] = :HOTKEY_TRAP_BARS_VERTICAL ; NUME[:HOTKEY_TRAP_BARS_VERTICAL] = 894
    ENUM[895] = :HOTKEY_TRAP_BARS_FLOOR ; NUME[:HOTKEY_TRAP_BARS_FLOOR] = 895
    ENUM[896] = :HOTKEY_TRAP_SUPPORT ; NUME[:HOTKEY_TRAP_SUPPORT] = 896
    ENUM[897] = :HOTKEY_TRAP_CHAIN ; NUME[:HOTKEY_TRAP_CHAIN] = 897
    ENUM[898] = :HOTKEY_TRAP_CAGE ; NUME[:HOTKEY_TRAP_CAGE] = 898
    ENUM[899] = :HOTKEY_TRAP_GEAR_ASSEMBLY ; NUME[:HOTKEY_TRAP_GEAR_ASSEMBLY] = 899
    ENUM[900] = :HOTKEY_TRAP_TRACK_STOP ; NUME[:HOTKEY_TRAP_TRACK_STOP] = 900
    ENUM[901] = :HOTKEY_TRAP_PULL_LEVER ; NUME[:HOTKEY_TRAP_PULL_LEVER] = 901
    ENUM[902] = :BUILDJOB_STOCKPILE_MASTER ; NUME[:BUILDJOB_STOCKPILE_MASTER] = 902
    ENUM[903] = :BUILDJOB_STOCKPILE_LINK_ANYWHERE ; NUME[:BUILDJOB_STOCKPILE_LINK_ANYWHERE] = 903
    ENUM[904] = :BUILDJOB_STOCKPILE_GIVE_TO ; NUME[:BUILDJOB_STOCKPILE_GIVE_TO] = 904
    ENUM[905] = :BUILDJOB_STOCKPILE_DELETE_CHILD ; NUME[:BUILDJOB_STOCKPILE_DELETE_CHILD] = 905
    ENUM[906] = :BUILDJOB_STOCKPILE_SETTINGS ; NUME[:BUILDJOB_STOCKPILE_SETTINGS] = 906
    ENUM[907] = :BUILDJOB_STOCKPILE_BARREL_UP ; NUME[:BUILDJOB_STOCKPILE_BARREL_UP] = 907
    ENUM[908] = :BUILDJOB_STOCKPILE_BARREL_DOWN ; NUME[:BUILDJOB_STOCKPILE_BARREL_DOWN] = 908
    ENUM[909] = :BUILDJOB_STOCKPILE_BARREL_ZERO ; NUME[:BUILDJOB_STOCKPILE_BARREL_ZERO] = 909
    ENUM[910] = :BUILDJOB_STOCKPILE_BARREL_MAX ; NUME[:BUILDJOB_STOCKPILE_BARREL_MAX] = 910
    ENUM[911] = :BUILDJOB_STOCKPILE_BIN_UP ; NUME[:BUILDJOB_STOCKPILE_BIN_UP] = 911
    ENUM[912] = :BUILDJOB_STOCKPILE_BIN_DOWN ; NUME[:BUILDJOB_STOCKPILE_BIN_DOWN] = 912
    ENUM[913] = :BUILDJOB_STOCKPILE_BIN_ZERO ; NUME[:BUILDJOB_STOCKPILE_BIN_ZERO] = 913
    ENUM[914] = :BUILDJOB_STOCKPILE_BIN_MAX ; NUME[:BUILDJOB_STOCKPILE_BIN_MAX] = 914
    ENUM[915] = :BUILDJOB_STOCKPILE_WHEELBARROW ; NUME[:BUILDJOB_STOCKPILE_WHEELBARROW] = 915
    ENUM[916] = :STOCKPILE_ANIMAL ; NUME[:STOCKPILE_ANIMAL] = 916
    ENUM[917] = :STOCKPILE_FOOD ; NUME[:STOCKPILE_FOOD] = 917
    ENUM[918] = :STOCKPILE_WEAPON ; NUME[:STOCKPILE_WEAPON] = 918
    ENUM[919] = :STOCKPILE_ARMOR ; NUME[:STOCKPILE_ARMOR] = 919
    ENUM[920] = :STOCKPILE_CUSTOM ; NUME[:STOCKPILE_CUSTOM] = 920
    ENUM[921] = :STOCKPILE_CUSTOM_SETTINGS ; NUME[:STOCKPILE_CUSTOM_SETTINGS] = 921
    ENUM[922] = :STOCKPILE_FURNITURE ; NUME[:STOCKPILE_FURNITURE] = 922
    ENUM[923] = :STOCKPILE_GRAVEYARD ; NUME[:STOCKPILE_GRAVEYARD] = 923
    ENUM[924] = :STOCKPILE_REFUSE ; NUME[:STOCKPILE_REFUSE] = 924
    ENUM[925] = :STOCKPILE_WOOD ; NUME[:STOCKPILE_WOOD] = 925
    ENUM[926] = :STOCKPILE_STONE ; NUME[:STOCKPILE_STONE] = 926
    ENUM[927] = :STOCKPILE_GEM ; NUME[:STOCKPILE_GEM] = 927
    ENUM[928] = :STOCKPILE_BARBLOCK ; NUME[:STOCKPILE_BARBLOCK] = 928
    ENUM[929] = :STOCKPILE_CLOTH ; NUME[:STOCKPILE_CLOTH] = 929
    ENUM[930] = :STOCKPILE_LEATHER ; NUME[:STOCKPILE_LEATHER] = 930
    ENUM[931] = :STOCKPILE_AMMO ; NUME[:STOCKPILE_AMMO] = 931
    ENUM[932] = :STOCKPILE_COINS ; NUME[:STOCKPILE_COINS] = 932
    ENUM[933] = :STOCKPILE_FINISHED ; NUME[:STOCKPILE_FINISHED] = 933
    ENUM[934] = :STOCKPILE_SHEET ; NUME[:STOCKPILE_SHEET] = 934
    ENUM[935] = :STOCKPILE_NONE ; NUME[:STOCKPILE_NONE] = 935
    ENUM[936] = :STOCKPILE_SETTINGS_ENABLE ; NUME[:STOCKPILE_SETTINGS_ENABLE] = 936
    ENUM[937] = :STOCKPILE_SETTINGS_DISABLE ; NUME[:STOCKPILE_SETTINGS_DISABLE] = 937
    ENUM[938] = :STOCKPILE_SETTINGS_PERMIT_ALL ; NUME[:STOCKPILE_SETTINGS_PERMIT_ALL] = 938
    ENUM[939] = :STOCKPILE_SETTINGS_FORBID_ALL ; NUME[:STOCKPILE_SETTINGS_FORBID_ALL] = 939
    ENUM[940] = :STOCKPILE_SETTINGS_PERMIT_SUB ; NUME[:STOCKPILE_SETTINGS_PERMIT_SUB] = 940
    ENUM[941] = :STOCKPILE_SETTINGS_FORBID_SUB ; NUME[:STOCKPILE_SETTINGS_FORBID_SUB] = 941
    ENUM[942] = :STOCKPILE_SETTINGS_SPECIFIC1 ; NUME[:STOCKPILE_SETTINGS_SPECIFIC1] = 942
    ENUM[943] = :STOCKPILE_SETTINGS_SPECIFIC2 ; NUME[:STOCKPILE_SETTINGS_SPECIFIC2] = 943
    ENUM[944] = :CIVZONE_NAME ; NUME[:CIVZONE_NAME] = 944
    ENUM[945] = :CIVZONE_REMOVE ; NUME[:CIVZONE_REMOVE] = 945
    ENUM[946] = :CIVZONE_REMOVE_ZONE ; NUME[:CIVZONE_REMOVE_ZONE] = 946
    ENUM[947] = :CIVZONE_SHAPE ; NUME[:CIVZONE_SHAPE] = 947
    ENUM[948] = :CIVZONE_NEXT ; NUME[:CIVZONE_NEXT] = 948
    ENUM[949] = :CIVZONE_WATER_SOURCE ; NUME[:CIVZONE_WATER_SOURCE] = 949
    ENUM[950] = :CIVZONE_FISH ; NUME[:CIVZONE_FISH] = 950
    ENUM[951] = :CIVZONE_GATHER ; NUME[:CIVZONE_GATHER] = 951
    ENUM[952] = :CIVZONE_DUMP ; NUME[:CIVZONE_DUMP] = 952
    ENUM[953] = :CIVZONE_POND ; NUME[:CIVZONE_POND] = 953
    ENUM[954] = :CIVZONE_HOSPITAL ; NUME[:CIVZONE_HOSPITAL] = 954
    ENUM[955] = :CIVZONE_SAND_COLLECT ; NUME[:CIVZONE_SAND_COLLECT] = 955
    ENUM[956] = :CIVZONE_CLAY_COLLECT ; NUME[:CIVZONE_CLAY_COLLECT] = 956
    ENUM[957] = :CIVZONE_ACTIVE ; NUME[:CIVZONE_ACTIVE] = 957
    ENUM[958] = :CIVZONE_MEETING ; NUME[:CIVZONE_MEETING] = 958
    ENUM[959] = :CIVZONE_ANIMAL_TRAINING ; NUME[:CIVZONE_ANIMAL_TRAINING] = 959
    ENUM[960] = :CIVZONE_PEN ; NUME[:CIVZONE_PEN] = 960
    ENUM[961] = :CIVZONE_PEN_OPTIONS ; NUME[:CIVZONE_PEN_OPTIONS] = 961
    ENUM[962] = :CIVZONE_POND_OPTIONS ; NUME[:CIVZONE_POND_OPTIONS] = 962
    ENUM[963] = :CIVZONE_POND_WATER ; NUME[:CIVZONE_POND_WATER] = 963
    ENUM[964] = :CIVZONE_HOSPITAL_OPTIONS ; NUME[:CIVZONE_HOSPITAL_OPTIONS] = 964
    ENUM[965] = :CIVZONE_GATHER_OPTIONS ; NUME[:CIVZONE_GATHER_OPTIONS] = 965
    ENUM[966] = :CIVZONE_GATHER_OPTIONS_PICK_TREES ; NUME[:CIVZONE_GATHER_OPTIONS_PICK_TREES] = 966
    ENUM[967] = :CIVZONE_GATHER_OPTIONS_PICK_SHRUBS ; NUME[:CIVZONE_GATHER_OPTIONS_PICK_SHRUBS] = 967
    ENUM[968] = :CIVZONE_GATHER_OPTIONS_GATHER_FALLEN ; NUME[:CIVZONE_GATHER_OPTIONS_GATHER_FALLEN] = 968
    ENUM[969] = :STORES_VIEW ; NUME[:STORES_VIEW] = 969
    ENUM[970] = :STORES_ZOOM ; NUME[:STORES_ZOOM] = 970
    ENUM[971] = :STORES_FORBID ; NUME[:STORES_FORBID] = 971
    ENUM[972] = :STORES_MELT ; NUME[:STORES_MELT] = 972
    ENUM[973] = :STORES_DUMP ; NUME[:STORES_DUMP] = 973
    ENUM[974] = :STORES_HIDE ; NUME[:STORES_HIDE] = 974
    ENUM[975] = :PET_BUTCHER ; NUME[:PET_BUTCHER] = 975
    ENUM[976] = :PET_GELD ; NUME[:PET_GELD] = 976
    ENUM[977] = :ANIMAL_SELECT_TRAINER ; NUME[:ANIMAL_SELECT_TRAINER] = 977
    ENUM[978] = :ANIMAL_WAR_TRAINING ; NUME[:ANIMAL_WAR_TRAINING] = 978
    ENUM[979] = :ANIMAL_HUNTING_TRAINING ; NUME[:ANIMAL_HUNTING_TRAINING] = 979
    ENUM[980] = :KITCHEN_COOK ; NUME[:KITCHEN_COOK] = 980
    ENUM[981] = :KITCHEN_BREW ; NUME[:KITCHEN_BREW] = 981
    ENUM[982] = :JUSTICE_INTERROGATE ; NUME[:JUSTICE_INTERROGATE] = 982
    ENUM[983] = :JUSTICE_COUNTERINTELLIGENCE ; NUME[:JUSTICE_COUNTERINTELLIGENCE] = 983
    ENUM[984] = :ORDERS_AUTOFORBID ; NUME[:ORDERS_AUTOFORBID] = 984
    ENUM[985] = :ORDERS_FORBID_PROJECTILE ; NUME[:ORDERS_FORBID_PROJECTILE] = 985
    ENUM[986] = :ORDERS_FORBID_YOUR_CORPSE ; NUME[:ORDERS_FORBID_YOUR_CORPSE] = 986
    ENUM[987] = :ORDERS_FORBID_YOUR_ITEMS ; NUME[:ORDERS_FORBID_YOUR_ITEMS] = 987
    ENUM[988] = :ORDERS_FORBID_OTHER_CORPSE ; NUME[:ORDERS_FORBID_OTHER_CORPSE] = 988
    ENUM[989] = :ORDERS_FORBID_OTHER_ITEMS ; NUME[:ORDERS_FORBID_OTHER_ITEMS] = 989
    ENUM[990] = :ORDERS_REFUSE_GATHER ; NUME[:ORDERS_REFUSE_GATHER] = 990
    ENUM[991] = :ORDERS_REFUSE_OUTSIDE ; NUME[:ORDERS_REFUSE_OUTSIDE] = 991
    ENUM[992] = :ORDERS_REFUSE_OUTSIDE_VERMIN ; NUME[:ORDERS_REFUSE_OUTSIDE_VERMIN] = 992
    ENUM[993] = :ORDERS_REFUSE_DUMP_CORPSE ; NUME[:ORDERS_REFUSE_DUMP_CORPSE] = 993
    ENUM[994] = :ORDERS_REFUSE_DUMP_SKULL ; NUME[:ORDERS_REFUSE_DUMP_SKULL] = 994
    ENUM[995] = :ORDERS_REFUSE_DUMP_BONE ; NUME[:ORDERS_REFUSE_DUMP_BONE] = 995
    ENUM[996] = :ORDERS_REFUSE_DUMP_SHELL ; NUME[:ORDERS_REFUSE_DUMP_SHELL] = 996
    ENUM[997] = :ORDERS_REFUSE_DUMP_SKIN ; NUME[:ORDERS_REFUSE_DUMP_SKIN] = 997
    ENUM[998] = :ORDERS_REFUSE_DUMP_OTHER ; NUME[:ORDERS_REFUSE_DUMP_OTHER] = 998
    ENUM[999] = :ORDERS_REFUSE_DUMP_STRAND_TISSUE ; NUME[:ORDERS_REFUSE_DUMP_STRAND_TISSUE] = 999
    ENUM[1000] = :ORDERS_GATHER_FURNITURE ; NUME[:ORDERS_GATHER_FURNITURE] = 1000
    ENUM[1001] = :ORDERS_GATHER_ANIMALS ; NUME[:ORDERS_GATHER_ANIMALS] = 1001
    ENUM[1002] = :ORDERS_GATHER_FOOD ; NUME[:ORDERS_GATHER_FOOD] = 1002
    ENUM[1003] = :ORDERS_GATHER_BODIES ; NUME[:ORDERS_GATHER_BODIES] = 1003
    ENUM[1004] = :ORDERS_REFUSE ; NUME[:ORDERS_REFUSE] = 1004
    ENUM[1005] = :ORDERS_GATHER_STONE ; NUME[:ORDERS_GATHER_STONE] = 1005
    ENUM[1006] = :ORDERS_GATHER_WOOD ; NUME[:ORDERS_GATHER_WOOD] = 1006
    ENUM[1007] = :ORDERS_ALL_HARVEST ; NUME[:ORDERS_ALL_HARVEST] = 1007
    ENUM[1008] = :ORDERS_SAMEPILE ; NUME[:ORDERS_SAMEPILE] = 1008
    ENUM[1009] = :ORDERS_MIXFOODS ; NUME[:ORDERS_MIXFOODS] = 1009
    ENUM[1010] = :ORDERS_LOOM ; NUME[:ORDERS_LOOM] = 1010
    ENUM[1011] = :ORDERS_DYED_CLOTH ; NUME[:ORDERS_DYED_CLOTH] = 1011
    ENUM[1012] = :ORDERS_EXCEPTIONS ; NUME[:ORDERS_EXCEPTIONS] = 1012
    ENUM[1013] = :ORDERS_WORKSHOP ; NUME[:ORDERS_WORKSHOP] = 1013
    ENUM[1014] = :ORDERS_COLLECT_WEB ; NUME[:ORDERS_COLLECT_WEB] = 1014
    ENUM[1015] = :ORDERS_SLAUGHTER ; NUME[:ORDERS_SLAUGHTER] = 1015
    ENUM[1016] = :ORDERS_BUTCHER ; NUME[:ORDERS_BUTCHER] = 1016
    ENUM[1017] = :ORDERS_TAN ; NUME[:ORDERS_TAN] = 1017
    ENUM[1018] = :ORDERS_AUTO_FISHERY ; NUME[:ORDERS_AUTO_FISHERY] = 1018
    ENUM[1019] = :ORDERS_AUTO_KITCHEN ; NUME[:ORDERS_AUTO_KITCHEN] = 1019
    ENUM[1020] = :ORDERS_AUTO_KILN ; NUME[:ORDERS_AUTO_KILN] = 1020
    ENUM[1021] = :ORDERS_AUTO_SMELTER ; NUME[:ORDERS_AUTO_SMELTER] = 1021
    ENUM[1022] = :ORDERS_AUTO_OTHER ; NUME[:ORDERS_AUTO_OTHER] = 1022
    ENUM[1023] = :ORDERS_ZONE ; NUME[:ORDERS_ZONE] = 1023
    ENUM[1024] = :ORDERS_ZONE_DRINKING ; NUME[:ORDERS_ZONE_DRINKING] = 1024
    ENUM[1025] = :ORDERS_ZONE_FISHING ; NUME[:ORDERS_ZONE_FISHING] = 1025
    ENUM[1026] = :D_ONESTEP ; NUME[:D_ONESTEP] = 1026
    ENUM[1027] = :D_PAUSE ; NUME[:D_PAUSE] = 1027
    ENUM[1028] = :D_DEPOT ; NUME[:D_DEPOT] = 1028
    ENUM[1029] = :D_HOT_KEYS ; NUME[:D_HOT_KEYS] = 1029
    ENUM[1030] = :D_HOTKEY1 ; NUME[:D_HOTKEY1] = 1030
    ENUM[1031] = :D_HOTKEY2 ; NUME[:D_HOTKEY2] = 1031
    ENUM[1032] = :D_HOTKEY3 ; NUME[:D_HOTKEY3] = 1032
    ENUM[1033] = :D_HOTKEY4 ; NUME[:D_HOTKEY4] = 1033
    ENUM[1034] = :D_HOTKEY5 ; NUME[:D_HOTKEY5] = 1034
    ENUM[1035] = :D_HOTKEY6 ; NUME[:D_HOTKEY6] = 1035
    ENUM[1036] = :D_HOTKEY7 ; NUME[:D_HOTKEY7] = 1036
    ENUM[1037] = :D_HOTKEY8 ; NUME[:D_HOTKEY8] = 1037
    ENUM[1038] = :D_HOTKEY9 ; NUME[:D_HOTKEY9] = 1038
    ENUM[1039] = :D_HOTKEY10 ; NUME[:D_HOTKEY10] = 1039
    ENUM[1040] = :D_HOTKEY11 ; NUME[:D_HOTKEY11] = 1040
    ENUM[1041] = :D_HOTKEY12 ; NUME[:D_HOTKEY12] = 1041
    ENUM[1042] = :D_HOTKEY13 ; NUME[:D_HOTKEY13] = 1042
    ENUM[1043] = :D_HOTKEY14 ; NUME[:D_HOTKEY14] = 1043
    ENUM[1044] = :D_HOTKEY15 ; NUME[:D_HOTKEY15] = 1044
    ENUM[1045] = :D_HOTKEY16 ; NUME[:D_HOTKEY16] = 1045
    ENUM[1046] = :D_HOTKEY_CHANGE_NAME ; NUME[:D_HOTKEY_CHANGE_NAME] = 1046
    ENUM[1047] = :D_HOTKEY_ZOOM ; NUME[:D_HOTKEY_ZOOM] = 1047
    ENUM[1048] = :D_ANNOUNCE ; NUME[:D_ANNOUNCE] = 1048
    ENUM[1049] = :D_REPORTS ; NUME[:D_REPORTS] = 1049
    ENUM[1050] = :D_BUILDING ; NUME[:D_BUILDING] = 1050
    ENUM[1051] = :D_CIVLIST ; NUME[:D_CIVLIST] = 1051
    ENUM[1052] = :D_DESIGNATE ; NUME[:D_DESIGNATE] = 1052
    ENUM[1053] = :D_ARTLIST ; NUME[:D_ARTLIST] = 1053
    ENUM[1054] = :D_NOBLES ; NUME[:D_NOBLES] = 1054
    ENUM[1055] = :D_ORDERS ; NUME[:D_ORDERS] = 1055
    ENUM[1056] = :D_PETITIONS ; NUME[:D_PETITIONS] = 1056
    ENUM[1057] = :D_LOCATIONS ; NUME[:D_LOCATIONS] = 1057
    ENUM[1058] = :D_MILITARY ; NUME[:D_MILITARY] = 1058
    ENUM[1059] = :D_ROOMS ; NUME[:D_ROOMS] = 1059
    ENUM[1060] = :D_SQUADS ; NUME[:D_SQUADS] = 1060
    ENUM[1061] = :D_STOCKPILES ; NUME[:D_STOCKPILES] = 1061
    ENUM[1062] = :D_CIVZONE ; NUME[:D_CIVZONE] = 1062
    ENUM[1063] = :D_VIEWUNIT ; NUME[:D_VIEWUNIT] = 1063
    ENUM[1064] = :D_JOBLIST ; NUME[:D_JOBLIST] = 1064
    ENUM[1065] = :D_UNITLIST ; NUME[:D_UNITLIST] = 1065
    ENUM[1066] = :D_LOOK ; NUME[:D_LOOK] = 1066
    ENUM[1067] = :D_HAULING ; NUME[:D_HAULING] = 1067
    ENUM[1068] = :D_HAULING_NEW_ROUTE ; NUME[:D_HAULING_NEW_ROUTE] = 1068
    ENUM[1069] = :D_HAULING_NEW_STOP ; NUME[:D_HAULING_NEW_STOP] = 1069
    ENUM[1070] = :D_HAULING_REMOVE ; NUME[:D_HAULING_REMOVE] = 1070
    ENUM[1071] = :D_HAULING_PROMOTE ; NUME[:D_HAULING_PROMOTE] = 1071
    ENUM[1072] = :D_HAULING_VEHICLE ; NUME[:D_HAULING_VEHICLE] = 1072
    ENUM[1073] = :D_HAULING_NICKNAME ; NUME[:D_HAULING_NICKNAME] = 1073
    ENUM[1074] = :D_HAULING_STOP_NEW_DEPART ; NUME[:D_HAULING_STOP_NEW_DEPART] = 1074
    ENUM[1075] = :D_HAULING_STOP_NEW_LINK ; NUME[:D_HAULING_STOP_NEW_LINK] = 1075
    ENUM[1076] = :D_HAULING_STOP_REMOVE ; NUME[:D_HAULING_STOP_REMOVE] = 1076
    ENUM[1077] = :D_HAULING_STOP_SL_SELECT_PILE ; NUME[:D_HAULING_STOP_SL_SELECT_PILE] = 1077
    ENUM[1078] = :D_HAULING_STOP_SL_TAKE_GIVE ; NUME[:D_HAULING_STOP_SL_TAKE_GIVE] = 1078
    ENUM[1079] = :D_HAULING_STOP_LC_DIR ; NUME[:D_HAULING_STOP_LC_DIR] = 1079
    ENUM[1080] = :D_HAULING_STOP_LC_MODE ; NUME[:D_HAULING_STOP_LC_MODE] = 1080
    ENUM[1081] = :D_HAULING_STOP_LC_TIMER_UP ; NUME[:D_HAULING_STOP_LC_TIMER_UP] = 1081
    ENUM[1082] = :D_HAULING_STOP_LC_TIMER_DOWN ; NUME[:D_HAULING_STOP_LC_TIMER_DOWN] = 1082
    ENUM[1083] = :D_HAULING_STOP_LC_FULLNESS_UP ; NUME[:D_HAULING_STOP_LC_FULLNESS_UP] = 1083
    ENUM[1084] = :D_HAULING_STOP_LC_FULLNESS_DOWN ; NUME[:D_HAULING_STOP_LC_FULLNESS_DOWN] = 1084
    ENUM[1085] = :D_HAULING_STOP_LC_MORE_LESS ; NUME[:D_HAULING_STOP_LC_MORE_LESS] = 1085
    ENUM[1086] = :D_HAULING_STOP_LC_DESIRED_TOTAL ; NUME[:D_HAULING_STOP_LC_DESIRED_TOTAL] = 1086
    ENUM[1087] = :D_HAULING_STOP_LC_CHANGE ; NUME[:D_HAULING_STOP_LC_CHANGE] = 1087
    ENUM[1088] = :D_HAULING_STOP_LC_ADVANCED ; NUME[:D_HAULING_STOP_LC_ADVANCED] = 1088
    ENUM[1089] = :D_BURROWS ; NUME[:D_BURROWS] = 1089
    ENUM[1090] = :D_BURROWS_ADD ; NUME[:D_BURROWS_ADD] = 1090
    ENUM[1091] = :D_BURROWS_DELETE ; NUME[:D_BURROWS_DELETE] = 1091
    ENUM[1092] = :D_BURROWS_DEFINE ; NUME[:D_BURROWS_DEFINE] = 1092
    ENUM[1093] = :D_BURROWS_ADD_UNIT ; NUME[:D_BURROWS_ADD_UNIT] = 1093
    ENUM[1094] = :D_BURROWS_WORKSHOP_LIMIT ; NUME[:D_BURROWS_WORKSHOP_LIMIT] = 1094
    ENUM[1095] = :D_BURROWS_CENTER ; NUME[:D_BURROWS_CENTER] = 1095
    ENUM[1096] = :D_BURROWS_NAME ; NUME[:D_BURROWS_NAME] = 1096
    ENUM[1097] = :D_BURROWS_CHANGE_SELECTION ; NUME[:D_BURROWS_CHANGE_SELECTION] = 1097
    ENUM[1098] = :D_BURROWS_BRUSH ; NUME[:D_BURROWS_BRUSH] = 1098
    ENUM[1099] = :D_BURROWS_REMOVE ; NUME[:D_BURROWS_REMOVE] = 1099
    ENUM[1100] = :D_NOTE ; NUME[:D_NOTE] = 1100
    ENUM[1101] = :D_NOTE_PLACE ; NUME[:D_NOTE_PLACE] = 1101
    ENUM[1102] = :D_NOTE_DELETE ; NUME[:D_NOTE_DELETE] = 1102
    ENUM[1103] = :D_NOTE_NAME ; NUME[:D_NOTE_NAME] = 1103
    ENUM[1104] = :D_NOTE_ENTER ; NUME[:D_NOTE_ENTER] = 1104
    ENUM[1105] = :D_NOTE_ADOPT_SYMBOL ; NUME[:D_NOTE_ADOPT_SYMBOL] = 1105
    ENUM[1106] = :D_NOTE_CHANGE_SELECTION ; NUME[:D_NOTE_CHANGE_SELECTION] = 1106
    ENUM[1107] = :D_NOTE_POINTS ; NUME[:D_NOTE_POINTS] = 1107
    ENUM[1108] = :D_NOTE_ROUTE ; NUME[:D_NOTE_ROUTE] = 1108
    ENUM[1109] = :D_NOTE_ROUTE_ADD ; NUME[:D_NOTE_ROUTE_ADD] = 1109
    ENUM[1110] = :D_NOTE_ROUTE_EDIT ; NUME[:D_NOTE_ROUTE_EDIT] = 1110
    ENUM[1111] = :D_NOTE_ROUTE_DELETE ; NUME[:D_NOTE_ROUTE_DELETE] = 1111
    ENUM[1112] = :D_NOTE_ROUTE_CENTER ; NUME[:D_NOTE_ROUTE_CENTER] = 1112
    ENUM[1113] = :D_NOTE_ROUTE_NAME ; NUME[:D_NOTE_ROUTE_NAME] = 1113
    ENUM[1114] = :D_BUILDJOB ; NUME[:D_BUILDJOB] = 1114
    ENUM[1115] = :D_STATUS ; NUME[:D_STATUS] = 1115
    ENUM[1116] = :D_STATUS_OVERALL_HEALTH_RECENTER ; NUME[:D_STATUS_OVERALL_HEALTH_RECENTER] = 1116
    ENUM[1117] = :D_BUILDITEM ; NUME[:D_BUILDITEM] = 1117
    ENUM[1118] = :D_BITEM_FORBID ; NUME[:D_BITEM_FORBID] = 1118
    ENUM[1119] = :D_BITEM_DUMP ; NUME[:D_BITEM_DUMP] = 1119
    ENUM[1120] = :D_BITEM_MELT ; NUME[:D_BITEM_MELT] = 1120
    ENUM[1121] = :D_BITEM_HIDE ; NUME[:D_BITEM_HIDE] = 1121
    ENUM[1122] = :D_BITEM_NAME ; NUME[:D_BITEM_NAME] = 1122
    ENUM[1123] = :D_LOOK_FORBID ; NUME[:D_LOOK_FORBID] = 1123
    ENUM[1124] = :D_LOOK_DUMP ; NUME[:D_LOOK_DUMP] = 1124
    ENUM[1125] = :D_LOOK_MELT ; NUME[:D_LOOK_MELT] = 1125
    ENUM[1126] = :D_LOOK_HIDE ; NUME[:D_LOOK_HIDE] = 1126
    ENUM[1127] = :D_LOOK_FOLLOW ; NUME[:D_LOOK_FOLLOW] = 1127
    ENUM[1128] = :D_LOOK_ARENA_CREATURE ; NUME[:D_LOOK_ARENA_CREATURE] = 1128
    ENUM[1129] = :D_LOOK_ARENA_ADV_MODE ; NUME[:D_LOOK_ARENA_ADV_MODE] = 1129
    ENUM[1130] = :D_LOOK_ARENA_WATER ; NUME[:D_LOOK_ARENA_WATER] = 1130
    ENUM[1131] = :D_LOOK_ARENA_MAGMA ; NUME[:D_LOOK_ARENA_MAGMA] = 1131
    ENUM[1132] = :ARENA_CREATURE_SIDE_DOWN ; NUME[:ARENA_CREATURE_SIDE_DOWN] = 1132
    ENUM[1133] = :ARENA_CREATURE_SIDE_UP ; NUME[:ARENA_CREATURE_SIDE_UP] = 1133
    ENUM[1134] = :ARENA_CREATURE_NEW_ITEM ; NUME[:ARENA_CREATURE_NEW_ITEM] = 1134
    ENUM[1135] = :ARENA_CREATURE_BLANK_LIST ; NUME[:ARENA_CREATURE_BLANK_LIST] = 1135
    ENUM[1136] = :ARENA_CREATURE_REMOVE_ITEM ; NUME[:ARENA_CREATURE_REMOVE_ITEM] = 1136
    ENUM[1137] = :ARENA_CREATURE_UNDEAD ; NUME[:ARENA_CREATURE_UNDEAD] = 1137
    ENUM[1138] = :ARENA_CREATURE_TAME ; NUME[:ARENA_CREATURE_TAME] = 1138
    ENUM[1139] = :ARENA_CREATURE_STRING ; NUME[:ARENA_CREATURE_STRING] = 1139
    ENUM[1140] = :ARENA_CONFLICT_STATE_1 ; NUME[:ARENA_CONFLICT_STATE_1] = 1140
    ENUM[1141] = :ARENA_CONFLICT_STATE_2 ; NUME[:ARENA_CONFLICT_STATE_2] = 1141
    ENUM[1142] = :ARENA_MORALE ; NUME[:ARENA_MORALE] = 1142
    ENUM[1143] = :ARENA_WEATHER ; NUME[:ARENA_WEATHER] = 1143
    ENUM[1144] = :ARENA_WEATHER_SNOW ; NUME[:ARENA_WEATHER_SNOW] = 1144
    ENUM[1145] = :ARENA_WEATHER_MUD ; NUME[:ARENA_WEATHER_MUD] = 1145
    ENUM[1146] = :ARENA_WEATHER_CLEAR_SPATTER ; NUME[:ARENA_WEATHER_CLEAR_SPATTER] = 1146
    ENUM[1147] = :D_LOOK_ARENA_TREE ; NUME[:D_LOOK_ARENA_TREE] = 1147
    ENUM[1148] = :ARENA_TREE_FILTER ; NUME[:ARENA_TREE_FILTER] = 1148
    ENUM[1149] = :ARENA_TREE_AGE ; NUME[:ARENA_TREE_AGE] = 1149
    ENUM[1150] = :D_LOOK_ARENA_MOUNT ; NUME[:D_LOOK_ARENA_MOUNT] = 1150
    ENUM[1151] = :ASSIGNTRADE_VIEW ; NUME[:ASSIGNTRADE_VIEW] = 1151
    ENUM[1152] = :ASSIGNTRADE_STRING ; NUME[:ASSIGNTRADE_STRING] = 1152
    ENUM[1153] = :ASSIGNTRADE_EXCLUDE_PROHIBITED ; NUME[:ASSIGNTRADE_EXCLUDE_PROHIBITED] = 1153
    ENUM[1154] = :ASSIGNTRADE_PENDING ; NUME[:ASSIGNTRADE_PENDING] = 1154
    ENUM[1155] = :ASSIGNTRADE_SORT ; NUME[:ASSIGNTRADE_SORT] = 1155
    ENUM[1156] = :NOBLELIST_REPLACE ; NUME[:NOBLELIST_REPLACE] = 1156
    ENUM[1157] = :NOBLELIST_SETTINGS ; NUME[:NOBLELIST_SETTINGS] = 1157
    ENUM[1158] = :NOBLELIST_CAPITAL ; NUME[:NOBLELIST_CAPITAL] = 1158
    ENUM[1159] = :NOBLELIST_VIEW_CANDIDATE ; NUME[:NOBLELIST_VIEW_CANDIDATE] = 1159
    ENUM[1160] = :TRADE_VIEW ; NUME[:TRADE_VIEW] = 1160
    ENUM[1161] = :TRADE_TRADE ; NUME[:TRADE_TRADE] = 1161
    ENUM[1162] = :TRADE_OFFER ; NUME[:TRADE_OFFER] = 1162
    ENUM[1163] = :TRADE_SEIZE ; NUME[:TRADE_SEIZE] = 1163
    ENUM[1164] = :MILITARY_ACTIVATE ; NUME[:MILITARY_ACTIVATE] = 1164
    ENUM[1165] = :MILITARY_VIEW ; NUME[:MILITARY_VIEW] = 1165
    ENUM[1166] = :MILITARY_WEAPON ; NUME[:MILITARY_WEAPON] = 1166
    ENUM[1167] = :MILITARY_ZOOM ; NUME[:MILITARY_ZOOM] = 1167
    ENUM[1168] = :ANNOUNCE_ZOOM ; NUME[:ANNOUNCE_ZOOM] = 1168
    ENUM[1169] = :ANNOUNCE_ZOOM_2 ; NUME[:ANNOUNCE_ZOOM_2] = 1169
    ENUM[1170] = :UNITJOB_REMOVE_CRE ; NUME[:UNITJOB_REMOVE_CRE] = 1170
    ENUM[1171] = :UNITJOB_ZOOM_CRE ; NUME[:UNITJOB_ZOOM_CRE] = 1171
    ENUM[1172] = :UNITJOB_ZOOM_BUILD ; NUME[:UNITJOB_ZOOM_BUILD] = 1172
    ENUM[1173] = :UNITJOB_VIEW_UNIT ; NUME[:UNITJOB_VIEW_UNIT] = 1173
    ENUM[1174] = :UNITJOB_VIEW_JOB ; NUME[:UNITJOB_VIEW_JOB] = 1174
    ENUM[1175] = :UNITJOB_MANAGER ; NUME[:UNITJOB_MANAGER] = 1175
    ENUM[1176] = :MANAGER_NEW_ORDER ; NUME[:MANAGER_NEW_ORDER] = 1176
    ENUM[1177] = :MANAGER_REMOVE ; NUME[:MANAGER_REMOVE] = 1177
    ENUM[1178] = :MANAGER_PROMOTE ; NUME[:MANAGER_PROMOTE] = 1178
    ENUM[1179] = :MANAGER_MAX ; NUME[:MANAGER_MAX] = 1179
    ENUM[1180] = :MANAGER_WAGES ; NUME[:MANAGER_WAGES] = 1180
    ENUM[1181] = :MANAGER_CONDITIONS ; NUME[:MANAGER_CONDITIONS] = 1181
    ENUM[1182] = :MANAGER_DETAILS ; NUME[:MANAGER_DETAILS] = 1182
    ENUM[1183] = :WORK_ORDER_CONDITION_ADD_ITEM ; NUME[:WORK_ORDER_CONDITION_ADD_ITEM] = 1183
    ENUM[1184] = :WORK_ORDER_CONDITION_ADD_ORDER ; NUME[:WORK_ORDER_CONDITION_ADD_ORDER] = 1184
    ENUM[1185] = :WORK_ORDER_CONDITION_ITEM_TYPE ; NUME[:WORK_ORDER_CONDITION_ITEM_TYPE] = 1185
    ENUM[1186] = :WORK_ORDER_CONDITION_ITEM_MATERIAL ; NUME[:WORK_ORDER_CONDITION_ITEM_MATERIAL] = 1186
    ENUM[1187] = :WORK_ORDER_CONDITION_ITEM_TRAITS ; NUME[:WORK_ORDER_CONDITION_ITEM_TRAITS] = 1187
    ENUM[1188] = :WORK_ORDER_CONDITION_ITEM_INEQUALITY ; NUME[:WORK_ORDER_CONDITION_ITEM_INEQUALITY] = 1188
    ENUM[1189] = :WORK_ORDER_CONDITION_ITEM_NUMBER ; NUME[:WORK_ORDER_CONDITION_ITEM_NUMBER] = 1189
    ENUM[1190] = :WORK_ORDER_CONDITION_DELETE ; NUME[:WORK_ORDER_CONDITION_DELETE] = 1190
    ENUM[1191] = :WORK_ORDER_CONDITION_ORDER_ACTIVATION ; NUME[:WORK_ORDER_CONDITION_ORDER_ACTIVATION] = 1191
    ENUM[1192] = :WORK_ORDER_CONDITION_REAGENTS ; NUME[:WORK_ORDER_CONDITION_REAGENTS] = 1192
    ENUM[1193] = :WORK_ORDER_CONDITION_PRODUCTS ; NUME[:WORK_ORDER_CONDITION_PRODUCTS] = 1193
    ENUM[1194] = :DESIGNATE_BITEM ; NUME[:DESIGNATE_BITEM] = 1194
    ENUM[1195] = :DESIGNATE_CLAIM ; NUME[:DESIGNATE_CLAIM] = 1195
    ENUM[1196] = :DESIGNATE_UNCLAIM ; NUME[:DESIGNATE_UNCLAIM] = 1196
    ENUM[1197] = :DESIGNATE_MELT ; NUME[:DESIGNATE_MELT] = 1197
    ENUM[1198] = :DESIGNATE_NO_MELT ; NUME[:DESIGNATE_NO_MELT] = 1198
    ENUM[1199] = :DESIGNATE_DUMP ; NUME[:DESIGNATE_DUMP] = 1199
    ENUM[1200] = :DESIGNATE_NO_DUMP ; NUME[:DESIGNATE_NO_DUMP] = 1200
    ENUM[1201] = :DESIGNATE_HIDE ; NUME[:DESIGNATE_HIDE] = 1201
    ENUM[1202] = :DESIGNATE_NO_HIDE ; NUME[:DESIGNATE_NO_HIDE] = 1202
    ENUM[1203] = :DESIGNATE_DIG ; NUME[:DESIGNATE_DIG] = 1203
    ENUM[1204] = :DESIGNATE_DIG_REMOVE_STAIRS_RAMPS ; NUME[:DESIGNATE_DIG_REMOVE_STAIRS_RAMPS] = 1204
    ENUM[1205] = :DESIGNATE_TRAFFIC ; NUME[:DESIGNATE_TRAFFIC] = 1205
    ENUM[1206] = :DESIGNATE_TRAFFIC_HIGH ; NUME[:DESIGNATE_TRAFFIC_HIGH] = 1206
    ENUM[1207] = :DESIGNATE_TRAFFIC_NORMAL ; NUME[:DESIGNATE_TRAFFIC_NORMAL] = 1207
    ENUM[1208] = :DESIGNATE_TRAFFIC_LOW ; NUME[:DESIGNATE_TRAFFIC_LOW] = 1208
    ENUM[1209] = :DESIGNATE_TRAFFIC_RESTRICTED ; NUME[:DESIGNATE_TRAFFIC_RESTRICTED] = 1209
    ENUM[1210] = :DESIGNATE_TRAFFIC_INCREASE_WEIGHT ; NUME[:DESIGNATE_TRAFFIC_INCREASE_WEIGHT] = 1210
    ENUM[1211] = :DESIGNATE_TRAFFIC_DECREASE_WEIGHT ; NUME[:DESIGNATE_TRAFFIC_DECREASE_WEIGHT] = 1211
    ENUM[1212] = :DESIGNATE_TRAFFIC_INCREASE_WEIGHT_MORE ; NUME[:DESIGNATE_TRAFFIC_INCREASE_WEIGHT_MORE] = 1212
    ENUM[1213] = :DESIGNATE_TRAFFIC_DECREASE_WEIGHT_MORE ; NUME[:DESIGNATE_TRAFFIC_DECREASE_WEIGHT_MORE] = 1213
    ENUM[1214] = :DESIGNATE_STAIR_UP ; NUME[:DESIGNATE_STAIR_UP] = 1214
    ENUM[1215] = :DESIGNATE_STAIR_DOWN ; NUME[:DESIGNATE_STAIR_DOWN] = 1215
    ENUM[1216] = :DESIGNATE_STAIR_UPDOWN ; NUME[:DESIGNATE_STAIR_UPDOWN] = 1216
    ENUM[1217] = :DESIGNATE_RAMP ; NUME[:DESIGNATE_RAMP] = 1217
    ENUM[1218] = :DESIGNATE_CHANNEL ; NUME[:DESIGNATE_CHANNEL] = 1218
    ENUM[1219] = :DESIGNATE_CHOP ; NUME[:DESIGNATE_CHOP] = 1219
    ENUM[1220] = :DESIGNATE_PLANTS ; NUME[:DESIGNATE_PLANTS] = 1220
    ENUM[1221] = :DESIGNATE_SMOOTH ; NUME[:DESIGNATE_SMOOTH] = 1221
    ENUM[1222] = :DESIGNATE_ENGRAVE ; NUME[:DESIGNATE_ENGRAVE] = 1222
    ENUM[1223] = :DESIGNATE_DETAILS ; NUME[:DESIGNATE_DETAILS] = 1223
    ENUM[1224] = :DESIGNATE_FORTIFY ; NUME[:DESIGNATE_FORTIFY] = 1224
    ENUM[1225] = :DESIGNATE_TRACK ; NUME[:DESIGNATE_TRACK] = 1225
    ENUM[1226] = :DESIGNATE_TOGGLE_ENGRAVING ; NUME[:DESIGNATE_TOGGLE_ENGRAVING] = 1226
    ENUM[1227] = :DESIGNATE_STANDARD_MARKER ; NUME[:DESIGNATE_STANDARD_MARKER] = 1227
    ENUM[1228] = :DESIGNATE_MINE_MODE ; NUME[:DESIGNATE_MINE_MODE] = 1228
    ENUM[1229] = :DESIGNATE_TOGGLE_MARKER ; NUME[:DESIGNATE_TOGGLE_MARKER] = 1229
    ENUM[1230] = :DESIGNATE_UNDO ; NUME[:DESIGNATE_UNDO] = 1230
    ENUM[1231] = :DESIGNATE_REMOVE_CONSTRUCTION ; NUME[:DESIGNATE_REMOVE_CONSTRUCTION] = 1231
    ENUM[1232] = :ITEM_DESCRIPTION ; NUME[:ITEM_DESCRIPTION] = 1232
    ENUM[1233] = :ITEM_FORBID ; NUME[:ITEM_FORBID] = 1233
    ENUM[1234] = :ITEM_MELT ; NUME[:ITEM_MELT] = 1234
    ENUM[1235] = :ITEM_DUMP ; NUME[:ITEM_DUMP] = 1235
    ENUM[1236] = :ITEM_HIDE ; NUME[:ITEM_HIDE] = 1236
    ENUM[1237] = :UNITVIEW_CUSTOMIZE ; NUME[:UNITVIEW_CUSTOMIZE] = 1237
    ENUM[1238] = :UNITVIEW_HEALTH ; NUME[:UNITVIEW_HEALTH] = 1238
    ENUM[1239] = :UNITVIEW_RELATIONSHIPS ; NUME[:UNITVIEW_RELATIONSHIPS] = 1239
    ENUM[1240] = :UNITVIEW_RELATIONSHIPS_ZOOM ; NUME[:UNITVIEW_RELATIONSHIPS_ZOOM] = 1240
    ENUM[1241] = :UNITVIEW_RELATIONSHIPS_VIEW ; NUME[:UNITVIEW_RELATIONSHIPS_VIEW] = 1241
    ENUM[1242] = :UNITVIEW_KILLS ; NUME[:UNITVIEW_KILLS] = 1242
    ENUM[1243] = :UNITVIEW_GEN ; NUME[:UNITVIEW_GEN] = 1243
    ENUM[1244] = :UNITVIEW_INV ; NUME[:UNITVIEW_INV] = 1244
    ENUM[1245] = :UNITVIEW_PRF ; NUME[:UNITVIEW_PRF] = 1245
    ENUM[1246] = :UNITVIEW_WND ; NUME[:UNITVIEW_WND] = 1246
    ENUM[1247] = :UNITVIEW_FOLLOW ; NUME[:UNITVIEW_FOLLOW] = 1247
    ENUM[1248] = :UNITVIEW_NEXT ; NUME[:UNITVIEW_NEXT] = 1248
    ENUM[1249] = :UNITVIEW_SLAUGHTER ; NUME[:UNITVIEW_SLAUGHTER] = 1249
    ENUM[1250] = :UNITVIEW_GELD ; NUME[:UNITVIEW_GELD] = 1250
    ENUM[1251] = :UNITVIEW_GEN_COMBAT ; NUME[:UNITVIEW_GEN_COMBAT] = 1251
    ENUM[1252] = :UNITVIEW_GEN_LABOR ; NUME[:UNITVIEW_GEN_LABOR] = 1252
    ENUM[1253] = :UNITVIEW_GEN_MISC ; NUME[:UNITVIEW_GEN_MISC] = 1253
    ENUM[1254] = :UNITVIEW_PRF_PROF ; NUME[:UNITVIEW_PRF_PROF] = 1254
    ENUM[1255] = :UNITVIEW_PRF_PET ; NUME[:UNITVIEW_PRF_PET] = 1255
    ENUM[1256] = :UNITVIEW_PRF_EXPEL ; NUME[:UNITVIEW_PRF_EXPEL] = 1256
    ENUM[1257] = :UNITVIEW_PRF_VIEW ; NUME[:UNITVIEW_PRF_VIEW] = 1257
    ENUM[1258] = :UNITVIEW_PRF_NEW_SQUAD ; NUME[:UNITVIEW_PRF_NEW_SQUAD] = 1258
    ENUM[1259] = :UNITVIEW_PRF_REMOVE_FROM_SQUAD ; NUME[:UNITVIEW_PRF_REMOVE_FROM_SQUAD] = 1259
    ENUM[1260] = :UNITVIEW_PRF_NAME_CURRENT_SQUAD ; NUME[:UNITVIEW_PRF_NAME_CURRENT_SQUAD] = 1260
    ENUM[1261] = :UNITVIEW_PRF_NAME_SELECTED_SQUAD ; NUME[:UNITVIEW_PRF_NAME_SELECTED_SQUAD] = 1261
    ENUM[1262] = :UNITVIEW_PRF_OCCUPATION ; NUME[:UNITVIEW_PRF_OCCUPATION] = 1262
    ENUM[1263] = :CUSTOMIZE_UNIT_NICKNAME ; NUME[:CUSTOMIZE_UNIT_NICKNAME] = 1263
    ENUM[1264] = :CUSTOMIZE_UNIT_PROFNAME ; NUME[:CUSTOMIZE_UNIT_PROFNAME] = 1264
    ENUM[1265] = :IMAGE_CREATOR_FILTER ; NUME[:IMAGE_CREATOR_FILTER] = 1265
    ENUM[1266] = :IMAGE_CREATOR_NAME ; NUME[:IMAGE_CREATOR_NAME] = 1266
    ENUM[1267] = :IMAGE_CREATOR_DONE ; NUME[:IMAGE_CREATOR_DONE] = 1267
    ENUM[1268] = :CIV_RAID ; NUME[:CIV_RAID] = 1268
    ENUM[1269] = :CIV_CENTER_ON_FORT ; NUME[:CIV_CENTER_ON_FORT] = 1269
    ENUM[1270] = :CIV_HOLDINGS ; NUME[:CIV_HOLDINGS] = 1270
    ENUM[1271] = :CIV_MAP_LEGEND ; NUME[:CIV_MAP_LEGEND] = 1271
    ENUM[1272] = :CIV_REMOVE_MISSION ; NUME[:CIV_REMOVE_MISSION] = 1272
    ENUM[1273] = :CIV_RESCUE ; NUME[:CIV_RESCUE] = 1273
    ENUM[1274] = :CIV_RECOVER ; NUME[:CIV_RECOVER] = 1274
    ENUM[1275] = :CIV_WORLD ; NUME[:CIV_WORLD] = 1275
    ENUM[1276] = :CIV_MISSIONS ; NUME[:CIV_MISSIONS] = 1276
    ENUM[1277] = :CIV_MISSION_DETAILS ; NUME[:CIV_MISSION_DETAILS] = 1277
    ENUM[1278] = :CIV_MISSION_FREE_CAPTIVES ; NUME[:CIV_MISSION_FREE_CAPTIVES] = 1278
    ENUM[1279] = :CIV_MISSION_RELEASE_OTHERS ; NUME[:CIV_MISSION_RELEASE_OTHERS] = 1279
    ENUM[1280] = :CIV_MISSION_TAKE_ARTIFACTS ; NUME[:CIV_MISSION_TAKE_ARTIFACTS] = 1280
    ENUM[1281] = :CIV_MISSION_TAKE_ITEMS ; NUME[:CIV_MISSION_TAKE_ITEMS] = 1281
    ENUM[1282] = :CIV_MISSION_TAKE_LIVESTOCK ; NUME[:CIV_MISSION_TAKE_LIVESTOCK] = 1282
    ENUM[1283] = :CIV_MISSION_RAID ; NUME[:CIV_MISSION_RAID] = 1283
    ENUM[1284] = :CIV_MISSION_PILLAGE ; NUME[:CIV_MISSION_PILLAGE] = 1284
    ENUM[1285] = :CIV_MISSION_RAZE ; NUME[:CIV_MISSION_RAZE] = 1285
    ENUM[1286] = :CIV_MISSION_TRIBUTE_ONE_TIME ; NUME[:CIV_MISSION_TRIBUTE_ONE_TIME] = 1286
    ENUM[1287] = :CIV_MISSION_TRIBUTE_ONGOING ; NUME[:CIV_MISSION_TRIBUTE_ONGOING] = 1287
    ENUM[1288] = :CIV_MISSION_CONQUER ; NUME[:CIV_MISSION_CONQUER] = 1288
    ENUM[1289] = :CIV_MISSION_DEMAND_SURRENDER ; NUME[:CIV_MISSION_DEMAND_SURRENDER] = 1289
    ENUM[1290] = :CIV_NEWS ; NUME[:CIV_NEWS] = 1290
    ENUM[1291] = :CIV_PEOPLE ; NUME[:CIV_PEOPLE] = 1291
    ENUM[1292] = :CIV_ARTIFACTS ; NUME[:CIV_ARTIFACTS] = 1292
    ENUM[1293] = :CIV_CIVS ; NUME[:CIV_CIVS] = 1293
    ENUM[1294] = :D_MILITARY_CREATE_SQUAD ; NUME[:D_MILITARY_CREATE_SQUAD] = 1294
    ENUM[1295] = :D_MILITARY_DISBAND_SQUAD ; NUME[:D_MILITARY_DISBAND_SQUAD] = 1295
    ENUM[1296] = :D_MILITARY_CREATE_SUB_SQUAD ; NUME[:D_MILITARY_CREATE_SUB_SQUAD] = 1296
    ENUM[1297] = :D_MILITARY_CANCEL_ORDERS ; NUME[:D_MILITARY_CANCEL_ORDERS] = 1297
    ENUM[1298] = :D_MILITARY_POSITIONS ; NUME[:D_MILITARY_POSITIONS] = 1298
    ENUM[1299] = :D_MILITARY_ALERTS ; NUME[:D_MILITARY_ALERTS] = 1299
    ENUM[1300] = :D_MILITARY_ALERTS_ADD ; NUME[:D_MILITARY_ALERTS_ADD] = 1300
    ENUM[1301] = :D_MILITARY_ALERTS_DELETE ; NUME[:D_MILITARY_ALERTS_DELETE] = 1301
    ENUM[1302] = :D_MILITARY_ALERTS_SET ; NUME[:D_MILITARY_ALERTS_SET] = 1302
    ENUM[1303] = :D_MILITARY_ALERTS_NAME ; NUME[:D_MILITARY_ALERTS_NAME] = 1303
    ENUM[1304] = :D_MILITARY_ALERTS_SET_RETAIN ; NUME[:D_MILITARY_ALERTS_SET_RETAIN] = 1304
    ENUM[1305] = :D_MILITARY_EQUIP ; NUME[:D_MILITARY_EQUIP] = 1305
    ENUM[1306] = :D_MILITARY_EQUIP_CUSTOMIZE ; NUME[:D_MILITARY_EQUIP_CUSTOMIZE] = 1306
    ENUM[1307] = :D_MILITARY_EQUIP_UNIFORM ; NUME[:D_MILITARY_EQUIP_UNIFORM] = 1307
    ENUM[1308] = :D_MILITARY_EQUIP_PRIORITY ; NUME[:D_MILITARY_EQUIP_PRIORITY] = 1308
    ENUM[1309] = :D_MILITARY_UNIFORMS ; NUME[:D_MILITARY_UNIFORMS] = 1309
    ENUM[1310] = :D_MILITARY_SUPPLIES ; NUME[:D_MILITARY_SUPPLIES] = 1310
    ENUM[1311] = :D_MILITARY_SUPPLIES_WATER_DOWN ; NUME[:D_MILITARY_SUPPLIES_WATER_DOWN] = 1311
    ENUM[1312] = :D_MILITARY_SUPPLIES_WATER_UP ; NUME[:D_MILITARY_SUPPLIES_WATER_UP] = 1312
    ENUM[1313] = :D_MILITARY_SUPPLIES_FOOD_DOWN ; NUME[:D_MILITARY_SUPPLIES_FOOD_DOWN] = 1313
    ENUM[1314] = :D_MILITARY_SUPPLIES_FOOD_UP ; NUME[:D_MILITARY_SUPPLIES_FOOD_UP] = 1314
    ENUM[1315] = :D_MILITARY_AMMUNITION ; NUME[:D_MILITARY_AMMUNITION] = 1315
    ENUM[1316] = :D_MILITARY_AMMUNITION_ADD_ITEM ; NUME[:D_MILITARY_AMMUNITION_ADD_ITEM] = 1316
    ENUM[1317] = :D_MILITARY_AMMUNITION_REMOVE_ITEM ; NUME[:D_MILITARY_AMMUNITION_REMOVE_ITEM] = 1317
    ENUM[1318] = :D_MILITARY_AMMUNITION_LOWER_AMOUNT ; NUME[:D_MILITARY_AMMUNITION_LOWER_AMOUNT] = 1318
    ENUM[1319] = :D_MILITARY_AMMUNITION_RAISE_AMOUNT ; NUME[:D_MILITARY_AMMUNITION_RAISE_AMOUNT] = 1319
    ENUM[1320] = :D_MILITARY_AMMUNITION_LOWER_AMOUNT_LOTS ; NUME[:D_MILITARY_AMMUNITION_LOWER_AMOUNT_LOTS] = 1320
    ENUM[1321] = :D_MILITARY_AMMUNITION_RAISE_AMOUNT_LOTS ; NUME[:D_MILITARY_AMMUNITION_RAISE_AMOUNT_LOTS] = 1321
    ENUM[1322] = :D_MILITARY_AMMUNITION_MATERIAL ; NUME[:D_MILITARY_AMMUNITION_MATERIAL] = 1322
    ENUM[1323] = :D_MILITARY_AMMUNITION_COMBAT ; NUME[:D_MILITARY_AMMUNITION_COMBAT] = 1323
    ENUM[1324] = :D_MILITARY_AMMUNITION_TRAINING ; NUME[:D_MILITARY_AMMUNITION_TRAINING] = 1324
    ENUM[1325] = :D_MILITARY_TRAINING ; NUME[:D_MILITARY_TRAINING] = 1325
    ENUM[1326] = :D_MILITARY_SCHEDULE ; NUME[:D_MILITARY_SCHEDULE] = 1326
    ENUM[1327] = :D_MILITARY_ADD_UNIFORM ; NUME[:D_MILITARY_ADD_UNIFORM] = 1327
    ENUM[1328] = :D_MILITARY_DELETE_UNIFORM ; NUME[:D_MILITARY_DELETE_UNIFORM] = 1328
    ENUM[1329] = :D_MILITARY_NAME_UNIFORM ; NUME[:D_MILITARY_NAME_UNIFORM] = 1329
    ENUM[1330] = :D_MILITARY_NAME_SQUAD ; NUME[:D_MILITARY_NAME_SQUAD] = 1330
    ENUM[1331] = :D_MILITARY_ADD_ARMOR ; NUME[:D_MILITARY_ADD_ARMOR] = 1331
    ENUM[1332] = :D_MILITARY_ADD_PANTS ; NUME[:D_MILITARY_ADD_PANTS] = 1332
    ENUM[1333] = :D_MILITARY_ADD_HELM ; NUME[:D_MILITARY_ADD_HELM] = 1333
    ENUM[1334] = :D_MILITARY_ADD_GLOVES ; NUME[:D_MILITARY_ADD_GLOVES] = 1334
    ENUM[1335] = :D_MILITARY_ADD_BOOTS ; NUME[:D_MILITARY_ADD_BOOTS] = 1335
    ENUM[1336] = :D_MILITARY_ADD_SHIELD ; NUME[:D_MILITARY_ADD_SHIELD] = 1336
    ENUM[1337] = :D_MILITARY_ADD_WEAPON ; NUME[:D_MILITARY_ADD_WEAPON] = 1337
    ENUM[1338] = :D_MILITARY_ADD_MATERIAL ; NUME[:D_MILITARY_ADD_MATERIAL] = 1338
    ENUM[1339] = :D_MILITARY_ADD_COLOR ; NUME[:D_MILITARY_ADD_COLOR] = 1339
    ENUM[1340] = :D_MILITARY_REPLACE_CLOTHING ; NUME[:D_MILITARY_REPLACE_CLOTHING] = 1340
    ENUM[1341] = :D_MILITARY_EXACT_MATCH ; NUME[:D_MILITARY_EXACT_MATCH] = 1341
    ENUM[1342] = :D_SQUADS_MOVE ; NUME[:D_SQUADS_MOVE] = 1342
    ENUM[1343] = :D_SQUADS_KILL ; NUME[:D_SQUADS_KILL] = 1343
    ENUM[1344] = :D_SQUADS_KILL_LIST ; NUME[:D_SQUADS_KILL_LIST] = 1344
    ENUM[1345] = :D_SQUADS_KILL_RECT ; NUME[:D_SQUADS_KILL_RECT] = 1345
    ENUM[1346] = :D_SQUADS_SCHEDULE ; NUME[:D_SQUADS_SCHEDULE] = 1346
    ENUM[1347] = :D_SQUADS_CANCEL_ORDER ; NUME[:D_SQUADS_CANCEL_ORDER] = 1347
    ENUM[1348] = :D_SQUADS_ALERT ; NUME[:D_SQUADS_ALERT] = 1348
    ENUM[1349] = :D_SQUADS_SELECT_INDIVIDUALS ; NUME[:D_SQUADS_SELECT_INDIVIDUALS] = 1349
    ENUM[1350] = :D_SQUADS_CENTER ; NUME[:D_SQUADS_CENTER] = 1350
    ENUM[1351] = :D_SQUAD_SCH_SLEEP ; NUME[:D_SQUAD_SCH_SLEEP] = 1351
    ENUM[1352] = :D_SQUAD_SCH_CIVILIAN_UNIFORM ; NUME[:D_SQUAD_SCH_CIVILIAN_UNIFORM] = 1352
    ENUM[1353] = :D_SQUAD_SCH_GIVE_ORDER ; NUME[:D_SQUAD_SCH_GIVE_ORDER] = 1353
    ENUM[1354] = :D_SQUAD_SCH_EDIT_ORDER ; NUME[:D_SQUAD_SCH_EDIT_ORDER] = 1354
    ENUM[1355] = :D_SQUAD_SCH_CANCEL_ORDER ; NUME[:D_SQUAD_SCH_CANCEL_ORDER] = 1355
    ENUM[1356] = :D_SQUAD_SCH_COPY_ORDERS ; NUME[:D_SQUAD_SCH_COPY_ORDERS] = 1356
    ENUM[1357] = :D_SQUAD_SCH_PASTE_ORDERS ; NUME[:D_SQUAD_SCH_PASTE_ORDERS] = 1357
    ENUM[1358] = :D_SQUAD_SCH_MS_NAME ; NUME[:D_SQUAD_SCH_MS_NAME] = 1358
    ENUM[1359] = :STRING_A000 ; NUME[:STRING_A000] = 1359
    ENUM[1360] = :STRING_A001 ; NUME[:STRING_A001] = 1360
    ENUM[1361] = :STRING_A002 ; NUME[:STRING_A002] = 1361
    ENUM[1362] = :STRING_A003 ; NUME[:STRING_A003] = 1362
    ENUM[1363] = :STRING_A004 ; NUME[:STRING_A004] = 1363
    ENUM[1364] = :STRING_A005 ; NUME[:STRING_A005] = 1364
    ENUM[1365] = :STRING_A006 ; NUME[:STRING_A006] = 1365
    ENUM[1366] = :STRING_A007 ; NUME[:STRING_A007] = 1366
    ENUM[1367] = :STRING_A008 ; NUME[:STRING_A008] = 1367
    ENUM[1368] = :STRING_A009 ; NUME[:STRING_A009] = 1368
    ENUM[1369] = :STRING_A010 ; NUME[:STRING_A010] = 1369
    ENUM[1370] = :STRING_A011 ; NUME[:STRING_A011] = 1370
    ENUM[1371] = :STRING_A012 ; NUME[:STRING_A012] = 1371
    ENUM[1372] = :STRING_A013 ; NUME[:STRING_A013] = 1372
    ENUM[1373] = :STRING_A014 ; NUME[:STRING_A014] = 1373
    ENUM[1374] = :STRING_A015 ; NUME[:STRING_A015] = 1374
    ENUM[1375] = :STRING_A016 ; NUME[:STRING_A016] = 1375
    ENUM[1376] = :STRING_A017 ; NUME[:STRING_A017] = 1376
    ENUM[1377] = :STRING_A018 ; NUME[:STRING_A018] = 1377
    ENUM[1378] = :STRING_A019 ; NUME[:STRING_A019] = 1378
    ENUM[1379] = :STRING_A020 ; NUME[:STRING_A020] = 1379
    ENUM[1380] = :STRING_A021 ; NUME[:STRING_A021] = 1380
    ENUM[1381] = :STRING_A022 ; NUME[:STRING_A022] = 1381
    ENUM[1382] = :STRING_A023 ; NUME[:STRING_A023] = 1382
    ENUM[1383] = :STRING_A024 ; NUME[:STRING_A024] = 1383
    ENUM[1384] = :STRING_A025 ; NUME[:STRING_A025] = 1384
    ENUM[1385] = :STRING_A026 ; NUME[:STRING_A026] = 1385
    ENUM[1386] = :STRING_A027 ; NUME[:STRING_A027] = 1386
    ENUM[1387] = :STRING_A028 ; NUME[:STRING_A028] = 1387
    ENUM[1388] = :STRING_A029 ; NUME[:STRING_A029] = 1388
    ENUM[1389] = :STRING_A030 ; NUME[:STRING_A030] = 1389
    ENUM[1390] = :STRING_A031 ; NUME[:STRING_A031] = 1390
    ENUM[1391] = :STRING_A032 ; NUME[:STRING_A032] = 1391
    ENUM[1392] = :STRING_A033 ; NUME[:STRING_A033] = 1392
    ENUM[1393] = :STRING_A034 ; NUME[:STRING_A034] = 1393
    ENUM[1394] = :STRING_A035 ; NUME[:STRING_A035] = 1394
    ENUM[1395] = :STRING_A036 ; NUME[:STRING_A036] = 1395
    ENUM[1396] = :STRING_A037 ; NUME[:STRING_A037] = 1396
    ENUM[1397] = :STRING_A038 ; NUME[:STRING_A038] = 1397
    ENUM[1398] = :STRING_A039 ; NUME[:STRING_A039] = 1398
    ENUM[1399] = :STRING_A040 ; NUME[:STRING_A040] = 1399
    ENUM[1400] = :STRING_A041 ; NUME[:STRING_A041] = 1400
    ENUM[1401] = :STRING_A042 ; NUME[:STRING_A042] = 1401
    ENUM[1402] = :STRING_A043 ; NUME[:STRING_A043] = 1402
    ENUM[1403] = :STRING_A044 ; NUME[:STRING_A044] = 1403
    ENUM[1404] = :STRING_A045 ; NUME[:STRING_A045] = 1404
    ENUM[1405] = :STRING_A046 ; NUME[:STRING_A046] = 1405
    ENUM[1406] = :STRING_A047 ; NUME[:STRING_A047] = 1406
    ENUM[1407] = :STRING_A048 ; NUME[:STRING_A048] = 1407
    ENUM[1408] = :STRING_A049 ; NUME[:STRING_A049] = 1408
    ENUM[1409] = :STRING_A050 ; NUME[:STRING_A050] = 1409
    ENUM[1410] = :STRING_A051 ; NUME[:STRING_A051] = 1410
    ENUM[1411] = :STRING_A052 ; NUME[:STRING_A052] = 1411
    ENUM[1412] = :STRING_A053 ; NUME[:STRING_A053] = 1412
    ENUM[1413] = :STRING_A054 ; NUME[:STRING_A054] = 1413
    ENUM[1414] = :STRING_A055 ; NUME[:STRING_A055] = 1414
    ENUM[1415] = :STRING_A056 ; NUME[:STRING_A056] = 1415
    ENUM[1416] = :STRING_A057 ; NUME[:STRING_A057] = 1416
    ENUM[1417] = :STRING_A058 ; NUME[:STRING_A058] = 1417
    ENUM[1418] = :STRING_A059 ; NUME[:STRING_A059] = 1418
    ENUM[1419] = :STRING_A060 ; NUME[:STRING_A060] = 1419
    ENUM[1420] = :STRING_A061 ; NUME[:STRING_A061] = 1420
    ENUM[1421] = :STRING_A062 ; NUME[:STRING_A062] = 1421
    ENUM[1422] = :STRING_A063 ; NUME[:STRING_A063] = 1422
    ENUM[1423] = :STRING_A064 ; NUME[:STRING_A064] = 1423
    ENUM[1424] = :STRING_A065 ; NUME[:STRING_A065] = 1424
    ENUM[1425] = :STRING_A066 ; NUME[:STRING_A066] = 1425
    ENUM[1426] = :STRING_A067 ; NUME[:STRING_A067] = 1426
    ENUM[1427] = :STRING_A068 ; NUME[:STRING_A068] = 1427
    ENUM[1428] = :STRING_A069 ; NUME[:STRING_A069] = 1428
    ENUM[1429] = :STRING_A070 ; NUME[:STRING_A070] = 1429
    ENUM[1430] = :STRING_A071 ; NUME[:STRING_A071] = 1430
    ENUM[1431] = :STRING_A072 ; NUME[:STRING_A072] = 1431
    ENUM[1432] = :STRING_A073 ; NUME[:STRING_A073] = 1432
    ENUM[1433] = :STRING_A074 ; NUME[:STRING_A074] = 1433
    ENUM[1434] = :STRING_A075 ; NUME[:STRING_A075] = 1434
    ENUM[1435] = :STRING_A076 ; NUME[:STRING_A076] = 1435
    ENUM[1436] = :STRING_A077 ; NUME[:STRING_A077] = 1436
    ENUM[1437] = :STRING_A078 ; NUME[:STRING_A078] = 1437
    ENUM[1438] = :STRING_A079 ; NUME[:STRING_A079] = 1438
    ENUM[1439] = :STRING_A080 ; NUME[:STRING_A080] = 1439
    ENUM[1440] = :STRING_A081 ; NUME[:STRING_A081] = 1440
    ENUM[1441] = :STRING_A082 ; NUME[:STRING_A082] = 1441
    ENUM[1442] = :STRING_A083 ; NUME[:STRING_A083] = 1442
    ENUM[1443] = :STRING_A084 ; NUME[:STRING_A084] = 1443
    ENUM[1444] = :STRING_A085 ; NUME[:STRING_A085] = 1444
    ENUM[1445] = :STRING_A086 ; NUME[:STRING_A086] = 1445
    ENUM[1446] = :STRING_A087 ; NUME[:STRING_A087] = 1446
    ENUM[1447] = :STRING_A088 ; NUME[:STRING_A088] = 1447
    ENUM[1448] = :STRING_A089 ; NUME[:STRING_A089] = 1448
    ENUM[1449] = :STRING_A090 ; NUME[:STRING_A090] = 1449
    ENUM[1450] = :STRING_A091 ; NUME[:STRING_A091] = 1450
    ENUM[1451] = :STRING_A092 ; NUME[:STRING_A092] = 1451
    ENUM[1452] = :STRING_A093 ; NUME[:STRING_A093] = 1452
    ENUM[1453] = :STRING_A094 ; NUME[:STRING_A094] = 1453
    ENUM[1454] = :STRING_A095 ; NUME[:STRING_A095] = 1454
    ENUM[1455] = :STRING_A096 ; NUME[:STRING_A096] = 1455
    ENUM[1456] = :STRING_A097 ; NUME[:STRING_A097] = 1456
    ENUM[1457] = :STRING_A098 ; NUME[:STRING_A098] = 1457
    ENUM[1458] = :STRING_A099 ; NUME[:STRING_A099] = 1458
    ENUM[1459] = :STRING_A100 ; NUME[:STRING_A100] = 1459
    ENUM[1460] = :STRING_A101 ; NUME[:STRING_A101] = 1460
    ENUM[1461] = :STRING_A102 ; NUME[:STRING_A102] = 1461
    ENUM[1462] = :STRING_A103 ; NUME[:STRING_A103] = 1462
    ENUM[1463] = :STRING_A104 ; NUME[:STRING_A104] = 1463
    ENUM[1464] = :STRING_A105 ; NUME[:STRING_A105] = 1464
    ENUM[1465] = :STRING_A106 ; NUME[:STRING_A106] = 1465
    ENUM[1466] = :STRING_A107 ; NUME[:STRING_A107] = 1466
    ENUM[1467] = :STRING_A108 ; NUME[:STRING_A108] = 1467
    ENUM[1468] = :STRING_A109 ; NUME[:STRING_A109] = 1468
    ENUM[1469] = :STRING_A110 ; NUME[:STRING_A110] = 1469
    ENUM[1470] = :STRING_A111 ; NUME[:STRING_A111] = 1470
    ENUM[1471] = :STRING_A112 ; NUME[:STRING_A112] = 1471
    ENUM[1472] = :STRING_A113 ; NUME[:STRING_A113] = 1472
    ENUM[1473] = :STRING_A114 ; NUME[:STRING_A114] = 1473
    ENUM[1474] = :STRING_A115 ; NUME[:STRING_A115] = 1474
    ENUM[1475] = :STRING_A116 ; NUME[:STRING_A116] = 1475
    ENUM[1476] = :STRING_A117 ; NUME[:STRING_A117] = 1476
    ENUM[1477] = :STRING_A118 ; NUME[:STRING_A118] = 1477
    ENUM[1478] = :STRING_A119 ; NUME[:STRING_A119] = 1478
    ENUM[1479] = :STRING_A120 ; NUME[:STRING_A120] = 1479
    ENUM[1480] = :STRING_A121 ; NUME[:STRING_A121] = 1480
    ENUM[1481] = :STRING_A122 ; NUME[:STRING_A122] = 1481
    ENUM[1482] = :STRING_A123 ; NUME[:STRING_A123] = 1482
    ENUM[1483] = :STRING_A124 ; NUME[:STRING_A124] = 1483
    ENUM[1484] = :STRING_A125 ; NUME[:STRING_A125] = 1484
    ENUM[1485] = :STRING_A126 ; NUME[:STRING_A126] = 1485
    ENUM[1486] = :STRING_A128 ; NUME[:STRING_A128] = 1486
    ENUM[1487] = :STRING_A129 ; NUME[:STRING_A129] = 1487
    ENUM[1488] = :STRING_A130 ; NUME[:STRING_A130] = 1488
    ENUM[1489] = :STRING_A131 ; NUME[:STRING_A131] = 1489
    ENUM[1490] = :STRING_A132 ; NUME[:STRING_A132] = 1490
    ENUM[1491] = :STRING_A133 ; NUME[:STRING_A133] = 1491
    ENUM[1492] = :STRING_A134 ; NUME[:STRING_A134] = 1492
    ENUM[1493] = :STRING_A135 ; NUME[:STRING_A135] = 1493
    ENUM[1494] = :STRING_A136 ; NUME[:STRING_A136] = 1494
    ENUM[1495] = :STRING_A137 ; NUME[:STRING_A137] = 1495
    ENUM[1496] = :STRING_A138 ; NUME[:STRING_A138] = 1496
    ENUM[1497] = :STRING_A139 ; NUME[:STRING_A139] = 1497
    ENUM[1498] = :STRING_A140 ; NUME[:STRING_A140] = 1498
    ENUM[1499] = :STRING_A141 ; NUME[:STRING_A141] = 1499
    ENUM[1500] = :STRING_A142 ; NUME[:STRING_A142] = 1500
    ENUM[1501] = :STRING_A143 ; NUME[:STRING_A143] = 1501
    ENUM[1502] = :STRING_A144 ; NUME[:STRING_A144] = 1502
    ENUM[1503] = :STRING_A145 ; NUME[:STRING_A145] = 1503
    ENUM[1504] = :STRING_A146 ; NUME[:STRING_A146] = 1504
    ENUM[1505] = :STRING_A147 ; NUME[:STRING_A147] = 1505
    ENUM[1506] = :STRING_A148 ; NUME[:STRING_A148] = 1506
    ENUM[1507] = :STRING_A149 ; NUME[:STRING_A149] = 1507
    ENUM[1508] = :STRING_A150 ; NUME[:STRING_A150] = 1508
    ENUM[1509] = :STRING_A151 ; NUME[:STRING_A151] = 1509
    ENUM[1510] = :STRING_A152 ; NUME[:STRING_A152] = 1510
    ENUM[1511] = :STRING_A153 ; NUME[:STRING_A153] = 1511
    ENUM[1512] = :STRING_A154 ; NUME[:STRING_A154] = 1512
    ENUM[1513] = :STRING_A155 ; NUME[:STRING_A155] = 1513
    ENUM[1514] = :STRING_A156 ; NUME[:STRING_A156] = 1514
    ENUM[1515] = :STRING_A157 ; NUME[:STRING_A157] = 1515
    ENUM[1516] = :STRING_A158 ; NUME[:STRING_A158] = 1516
    ENUM[1517] = :STRING_A159 ; NUME[:STRING_A159] = 1517
    ENUM[1518] = :STRING_A160 ; NUME[:STRING_A160] = 1518
    ENUM[1519] = :STRING_A161 ; NUME[:STRING_A161] = 1519
    ENUM[1520] = :STRING_A162 ; NUME[:STRING_A162] = 1520
    ENUM[1521] = :STRING_A163 ; NUME[:STRING_A163] = 1521
    ENUM[1522] = :STRING_A164 ; NUME[:STRING_A164] = 1522
    ENUM[1523] = :STRING_A165 ; NUME[:STRING_A165] = 1523
    ENUM[1524] = :STRING_A166 ; NUME[:STRING_A166] = 1524
    ENUM[1525] = :STRING_A167 ; NUME[:STRING_A167] = 1525
    ENUM[1526] = :STRING_A168 ; NUME[:STRING_A168] = 1526
    ENUM[1527] = :STRING_A169 ; NUME[:STRING_A169] = 1527
    ENUM[1528] = :STRING_A170 ; NUME[:STRING_A170] = 1528
    ENUM[1529] = :STRING_A171 ; NUME[:STRING_A171] = 1529
    ENUM[1530] = :STRING_A172 ; NUME[:STRING_A172] = 1530
    ENUM[1531] = :STRING_A173 ; NUME[:STRING_A173] = 1531
    ENUM[1532] = :STRING_A174 ; NUME[:STRING_A174] = 1532
    ENUM[1533] = :STRING_A175 ; NUME[:STRING_A175] = 1533
    ENUM[1534] = :STRING_A176 ; NUME[:STRING_A176] = 1534
    ENUM[1535] = :STRING_A177 ; NUME[:STRING_A177] = 1535
    ENUM[1536] = :STRING_A178 ; NUME[:STRING_A178] = 1536
    ENUM[1537] = :STRING_A179 ; NUME[:STRING_A179] = 1537
    ENUM[1538] = :STRING_A180 ; NUME[:STRING_A180] = 1538
    ENUM[1539] = :STRING_A181 ; NUME[:STRING_A181] = 1539
    ENUM[1540] = :STRING_A182 ; NUME[:STRING_A182] = 1540
    ENUM[1541] = :STRING_A183 ; NUME[:STRING_A183] = 1541
    ENUM[1542] = :STRING_A184 ; NUME[:STRING_A184] = 1542
    ENUM[1543] = :STRING_A185 ; NUME[:STRING_A185] = 1543
    ENUM[1544] = :STRING_A186 ; NUME[:STRING_A186] = 1544
    ENUM[1545] = :STRING_A187 ; NUME[:STRING_A187] = 1545
    ENUM[1546] = :STRING_A188 ; NUME[:STRING_A188] = 1546
    ENUM[1547] = :STRING_A189 ; NUME[:STRING_A189] = 1547
    ENUM[1548] = :STRING_A190 ; NUME[:STRING_A190] = 1548
    ENUM[1549] = :STRING_A191 ; NUME[:STRING_A191] = 1549
    ENUM[1550] = :STRING_A192 ; NUME[:STRING_A192] = 1550
    ENUM[1551] = :STRING_A193 ; NUME[:STRING_A193] = 1551
    ENUM[1552] = :STRING_A194 ; NUME[:STRING_A194] = 1552
    ENUM[1553] = :STRING_A195 ; NUME[:STRING_A195] = 1553
    ENUM[1554] = :STRING_A196 ; NUME[:STRING_A196] = 1554
    ENUM[1555] = :STRING_A197 ; NUME[:STRING_A197] = 1555
    ENUM[1556] = :STRING_A198 ; NUME[:STRING_A198] = 1556
    ENUM[1557] = :STRING_A199 ; NUME[:STRING_A199] = 1557
    ENUM[1558] = :STRING_A200 ; NUME[:STRING_A200] = 1558
    ENUM[1559] = :STRING_A201 ; NUME[:STRING_A201] = 1559
    ENUM[1560] = :STRING_A202 ; NUME[:STRING_A202] = 1560
    ENUM[1561] = :STRING_A203 ; NUME[:STRING_A203] = 1561
    ENUM[1562] = :STRING_A204 ; NUME[:STRING_A204] = 1562
    ENUM[1563] = :STRING_A205 ; NUME[:STRING_A205] = 1563
    ENUM[1564] = :STRING_A206 ; NUME[:STRING_A206] = 1564
    ENUM[1565] = :STRING_A207 ; NUME[:STRING_A207] = 1565
    ENUM[1566] = :STRING_A208 ; NUME[:STRING_A208] = 1566
    ENUM[1567] = :STRING_A209 ; NUME[:STRING_A209] = 1567
    ENUM[1568] = :STRING_A210 ; NUME[:STRING_A210] = 1568
    ENUM[1569] = :STRING_A211 ; NUME[:STRING_A211] = 1569
    ENUM[1570] = :STRING_A212 ; NUME[:STRING_A212] = 1570
    ENUM[1571] = :STRING_A213 ; NUME[:STRING_A213] = 1571
    ENUM[1572] = :STRING_A214 ; NUME[:STRING_A214] = 1572
    ENUM[1573] = :STRING_A215 ; NUME[:STRING_A215] = 1573
    ENUM[1574] = :STRING_A216 ; NUME[:STRING_A216] = 1574
    ENUM[1575] = :STRING_A217 ; NUME[:STRING_A217] = 1575
    ENUM[1576] = :STRING_A218 ; NUME[:STRING_A218] = 1576
    ENUM[1577] = :STRING_A219 ; NUME[:STRING_A219] = 1577
    ENUM[1578] = :STRING_A220 ; NUME[:STRING_A220] = 1578
    ENUM[1579] = :STRING_A221 ; NUME[:STRING_A221] = 1579
    ENUM[1580] = :STRING_A222 ; NUME[:STRING_A222] = 1580
    ENUM[1581] = :STRING_A223 ; NUME[:STRING_A223] = 1581
    ENUM[1582] = :STRING_A224 ; NUME[:STRING_A224] = 1582
    ENUM[1583] = :STRING_A225 ; NUME[:STRING_A225] = 1583
    ENUM[1584] = :STRING_A226 ; NUME[:STRING_A226] = 1584
    ENUM[1585] = :STRING_A227 ; NUME[:STRING_A227] = 1585
    ENUM[1586] = :STRING_A228 ; NUME[:STRING_A228] = 1586
    ENUM[1587] = :STRING_A229 ; NUME[:STRING_A229] = 1587
    ENUM[1588] = :STRING_A230 ; NUME[:STRING_A230] = 1588
    ENUM[1589] = :STRING_A231 ; NUME[:STRING_A231] = 1589
    ENUM[1590] = :STRING_A232 ; NUME[:STRING_A232] = 1590
    ENUM[1591] = :STRING_A233 ; NUME[:STRING_A233] = 1591
    ENUM[1592] = :STRING_A234 ; NUME[:STRING_A234] = 1592
    ENUM[1593] = :STRING_A235 ; NUME[:STRING_A235] = 1593
    ENUM[1594] = :STRING_A236 ; NUME[:STRING_A236] = 1594
    ENUM[1595] = :STRING_A237 ; NUME[:STRING_A237] = 1595
    ENUM[1596] = :STRING_A238 ; NUME[:STRING_A238] = 1596
    ENUM[1597] = :STRING_A239 ; NUME[:STRING_A239] = 1597
    ENUM[1598] = :STRING_A240 ; NUME[:STRING_A240] = 1598
    ENUM[1599] = :STRING_A241 ; NUME[:STRING_A241] = 1599
    ENUM[1600] = :STRING_A242 ; NUME[:STRING_A242] = 1600
    ENUM[1601] = :STRING_A243 ; NUME[:STRING_A243] = 1601
    ENUM[1602] = :STRING_A244 ; NUME[:STRING_A244] = 1602
    ENUM[1603] = :STRING_A245 ; NUME[:STRING_A245] = 1603
    ENUM[1604] = :STRING_A246 ; NUME[:STRING_A246] = 1604
    ENUM[1605] = :STRING_A247 ; NUME[:STRING_A247] = 1605
    ENUM[1606] = :STRING_A248 ; NUME[:STRING_A248] = 1606
    ENUM[1607] = :STRING_A249 ; NUME[:STRING_A249] = 1607
    ENUM[1608] = :STRING_A250 ; NUME[:STRING_A250] = 1608
    ENUM[1609] = :STRING_A251 ; NUME[:STRING_A251] = 1609
    ENUM[1610] = :STRING_A252 ; NUME[:STRING_A252] = 1610
    ENUM[1611] = :STRING_A253 ; NUME[:STRING_A253] = 1611
    ENUM[1612] = :STRING_A254 ; NUME[:STRING_A254] = 1612
    ENUM[1613] = :STRING_A255 ; NUME[:STRING_A255] = 1613
    ENUM[1614] = :KEYBINDING_COMPLETE ; NUME[:KEYBINDING_COMPLETE] = 1614
end

class InterfacePushTypes < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :AS_PARENT ; NUME[:AS_PARENT] = 0
    ENUM[1] = :AS_CHILD ; NUME[:AS_CHILD] = 1
    ENUM[2] = :AT_BACK ; NUME[:AT_BACK] = 2
    ENUM[3] = :AT_FRONT ; NUME[:AT_FRONT] = 3
end

class ItemMagicnessType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Sparkle ; NUME[:Sparkle] = 0
    ENUM[1] = :AirWarped ; NUME[:AirWarped] = 1
    ENUM[2] = :Whistle ; NUME[:Whistle] = 2
    ENUM[3] = :OddlySquare ; NUME[:OddlySquare] = 3
    ENUM[4] = :SmallBumps ; NUME[:SmallBumps] = 4
    ENUM[5] = :EarthSmell ; NUME[:EarthSmell] = 5
    ENUM[6] = :Lightning ; NUME[:Lightning] = 6
    ENUM[7] = :GrayHairs ; NUME[:GrayHairs] = 7
    ENUM[8] = :RustlingLeaves ; NUME[:RustlingLeaves] = 8
end

class ItemQuality < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Ordinary ; NUME[:Ordinary] = 0
    ENUM[1] = :WellCrafted ; NUME[:WellCrafted] = 1
    ENUM[2] = :FinelyCrafted ; NUME[:FinelyCrafted] = 2
    ENUM[3] = :Superior ; NUME[:Superior] = 3
    ENUM[4] = :Exceptional ; NUME[:Exceptional] = 4
    ENUM[5] = :Masterful ; NUME[:Masterful] = 5
    ENUM[6] = :Artifact ; NUME[:Artifact] = 6
end

class ItemType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    IsRawable = Hash.new
    IsStackable = Hash.new
    IsCasteMat = Hash.new
    Classname = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :BAR ; NUME[:BAR] = 0 ; Caption[:BAR] = 'bars' ; Classname[:BAR] = 'item_barst'
    ENUM[1] = :SMALLGEM ; NUME[:SMALLGEM] = 1 ; Caption[:SMALLGEM] = 'cut gem' ; Classname[:SMALLGEM] = 'item_smallgemst'
    ENUM[2] = :BLOCKS ; NUME[:BLOCKS] = 2 ; Caption[:BLOCKS] = 'blocks' ; Classname[:BLOCKS] = 'item_blocksst'
    ENUM[3] = :ROUGH ; NUME[:ROUGH] = 3 ; Caption[:ROUGH] = 'rough gem' ; Classname[:ROUGH] = 'item_roughst'
    ENUM[4] = :BOULDER ; NUME[:BOULDER] = 4 ; Caption[:BOULDER] = 'boulder' ; Classname[:BOULDER] = 'item_boulderst'
    ENUM[5] = :WOOD ; NUME[:WOOD] = 5 ; Caption[:WOOD] = 'logs' ; Classname[:WOOD] = 'item_woodst'
    ENUM[6] = :DOOR ; NUME[:DOOR] = 6 ; Caption[:DOOR] = 'door' ; Classname[:DOOR] = 'item_doorst'
    ENUM[7] = :FLOODGATE ; NUME[:FLOODGATE] = 7 ; Caption[:FLOODGATE] = 'floodgate' ; Classname[:FLOODGATE] = 'item_floodgatest'
    ENUM[8] = :BED ; NUME[:BED] = 8 ; Caption[:BED] = 'bed' ; Classname[:BED] = 'item_bedst'
    ENUM[9] = :CHAIR ; NUME[:CHAIR] = 9 ; Caption[:CHAIR] = 'chair' ; Classname[:CHAIR] = 'item_chairst'
    ENUM[10] = :CHAIN ; NUME[:CHAIN] = 10 ; Caption[:CHAIN] = 'chain' ; Classname[:CHAIN] = 'item_chainst'
    ENUM[11] = :FLASK ; NUME[:FLASK] = 11 ; Caption[:FLASK] = 'flask' ; Classname[:FLASK] = 'item_flaskst'
    ENUM[12] = :GOBLET ; NUME[:GOBLET] = 12 ; Caption[:GOBLET] = 'goblet' ; Classname[:GOBLET] = 'item_gobletst'
    ENUM[13] = :INSTRUMENT ; NUME[:INSTRUMENT] = 13 ; Caption[:INSTRUMENT] = 'instrument' ; IsRawable[:INSTRUMENT] = true ; Classname[:INSTRUMENT] = 'item_instrumentst'
    ENUM[14] = :TOY ; NUME[:TOY] = 14 ; Caption[:TOY] = 'toy' ; IsRawable[:TOY] = true ; Classname[:TOY] = 'item_toyst'
    ENUM[15] = :WINDOW ; NUME[:WINDOW] = 15 ; Caption[:WINDOW] = 'window' ; Classname[:WINDOW] = 'item_windowst'
    ENUM[16] = :CAGE ; NUME[:CAGE] = 16 ; Caption[:CAGE] = 'cage' ; Classname[:CAGE] = 'item_cagest'
    ENUM[17] = :BARREL ; NUME[:BARREL] = 17 ; Caption[:BARREL] = 'barrel' ; Classname[:BARREL] = 'item_barrelst'
    ENUM[18] = :BUCKET ; NUME[:BUCKET] = 18 ; Caption[:BUCKET] = 'bucket' ; Classname[:BUCKET] = 'item_bucketst'
    ENUM[19] = :ANIMALTRAP ; NUME[:ANIMALTRAP] = 19 ; Caption[:ANIMALTRAP] = 'animal trap' ; Classname[:ANIMALTRAP] = 'item_animaltrapst'
    ENUM[20] = :TABLE ; NUME[:TABLE] = 20 ; Caption[:TABLE] = 'table' ; Classname[:TABLE] = 'item_tablest'
    ENUM[21] = :COFFIN ; NUME[:COFFIN] = 21 ; Caption[:COFFIN] = 'coffin' ; Classname[:COFFIN] = 'item_coffinst'
    ENUM[22] = :STATUE ; NUME[:STATUE] = 22 ; Caption[:STATUE] = 'statue' ; Classname[:STATUE] = 'item_statuest'
    ENUM[23] = :CORPSE ; NUME[:CORPSE] = 23 ; Caption[:CORPSE] = 'corpse' ; Classname[:CORPSE] = 'item_corpsest'
    ENUM[24] = :WEAPON ; NUME[:WEAPON] = 24 ; Caption[:WEAPON] = 'weapon' ; IsRawable[:WEAPON] = true ; Classname[:WEAPON] = 'item_weaponst'
    ENUM[25] = :ARMOR ; NUME[:ARMOR] = 25 ; Caption[:ARMOR] = 'armor' ; IsRawable[:ARMOR] = true ; Classname[:ARMOR] = 'item_armorst'
    ENUM[26] = :SHOES ; NUME[:SHOES] = 26 ; Caption[:SHOES] = 'footwear' ; IsRawable[:SHOES] = true ; Classname[:SHOES] = 'item_shoesst'
    ENUM[27] = :SHIELD ; NUME[:SHIELD] = 27 ; Caption[:SHIELD] = 'shield' ; IsRawable[:SHIELD] = true ; Classname[:SHIELD] = 'item_shieldst'
    ENUM[28] = :HELM ; NUME[:HELM] = 28 ; Caption[:HELM] = 'headwear' ; IsRawable[:HELM] = true ; Classname[:HELM] = 'item_helmst'
    ENUM[29] = :GLOVES ; NUME[:GLOVES] = 29 ; Caption[:GLOVES] = 'handwear' ; IsRawable[:GLOVES] = true ; Classname[:GLOVES] = 'item_glovesst'
    ENUM[30] = :BOX ; NUME[:BOX] = 30 ; Caption[:BOX] = 'box/bag' ; Classname[:BOX] = 'item_boxst'
    ENUM[31] = :BIN ; NUME[:BIN] = 31 ; Caption[:BIN] = 'bin' ; Classname[:BIN] = 'item_binst'
    ENUM[32] = :ARMORSTAND ; NUME[:ARMORSTAND] = 32 ; Caption[:ARMORSTAND] = 'armor stand' ; Classname[:ARMORSTAND] = 'item_armorstandst'
    ENUM[33] = :WEAPONRACK ; NUME[:WEAPONRACK] = 33 ; Caption[:WEAPONRACK] = 'weapon rack' ; Classname[:WEAPONRACK] = 'item_weaponrackst'
    ENUM[34] = :CABINET ; NUME[:CABINET] = 34 ; Caption[:CABINET] = 'cabinet' ; Classname[:CABINET] = 'item_cabinetst'
    ENUM[35] = :FIGURINE ; NUME[:FIGURINE] = 35 ; Caption[:FIGURINE] = 'figurine' ; Classname[:FIGURINE] = 'item_figurinest'
    ENUM[36] = :AMULET ; NUME[:AMULET] = 36 ; Caption[:AMULET] = 'amulet' ; Classname[:AMULET] = 'item_amuletst'
    ENUM[37] = :SCEPTER ; NUME[:SCEPTER] = 37 ; Caption[:SCEPTER] = 'scepter' ; Classname[:SCEPTER] = 'item_scepterst'
    ENUM[38] = :AMMO ; NUME[:AMMO] = 38 ; Caption[:AMMO] = 'ammo' ; IsRawable[:AMMO] = true ; IsStackable[:AMMO] = true ; Classname[:AMMO] = 'item_ammost'
    ENUM[39] = :CROWN ; NUME[:CROWN] = 39 ; Caption[:CROWN] = 'crown' ; Classname[:CROWN] = 'item_crownst'
    ENUM[40] = :RING ; NUME[:RING] = 40 ; Caption[:RING] = 'ring' ; Classname[:RING] = 'item_ringst'
    ENUM[41] = :EARRING ; NUME[:EARRING] = 41 ; Caption[:EARRING] = 'earring' ; Classname[:EARRING] = 'item_earringst'
    ENUM[42] = :BRACELET ; NUME[:BRACELET] = 42 ; Caption[:BRACELET] = 'bracelet' ; Classname[:BRACELET] = 'item_braceletst'
    ENUM[43] = :GEM ; NUME[:GEM] = 43 ; Caption[:GEM] = 'large gem' ; Classname[:GEM] = 'item_gemst'
    ENUM[44] = :ANVIL ; NUME[:ANVIL] = 44 ; Caption[:ANVIL] = 'anvil' ; Classname[:ANVIL] = 'item_anvilst'
    ENUM[45] = :CORPSEPIECE ; NUME[:CORPSEPIECE] = 45 ; Caption[:CORPSEPIECE] = 'body part' ; Classname[:CORPSEPIECE] = 'item_corpsepiecest'
    ENUM[46] = :REMAINS ; NUME[:REMAINS] = 46 ; Caption[:REMAINS] = 'remains' ; IsCasteMat[:REMAINS] = true ; IsStackable[:REMAINS] = true ; Classname[:REMAINS] = 'item_remainsst'
    ENUM[47] = :MEAT ; NUME[:MEAT] = 47 ; Caption[:MEAT] = 'meat' ; IsStackable[:MEAT] = true ; Classname[:MEAT] = 'item_meatst'
    ENUM[48] = :FISH ; NUME[:FISH] = 48 ; Caption[:FISH] = 'fish' ; IsCasteMat[:FISH] = true ; IsStackable[:FISH] = true ; Classname[:FISH] = 'item_fishst'
    ENUM[49] = :FISH_RAW ; NUME[:FISH_RAW] = 49 ; Caption[:FISH_RAW] = 'raw fish' ; IsCasteMat[:FISH_RAW] = true ; IsStackable[:FISH_RAW] = true ; Classname[:FISH_RAW] = 'item_fish_rawst'
    ENUM[50] = :VERMIN ; NUME[:VERMIN] = 50 ; Caption[:VERMIN] = 'vermin' ; IsCasteMat[:VERMIN] = true ; Classname[:VERMIN] = 'item_verminst'
    ENUM[51] = :PET ; NUME[:PET] = 51 ; Caption[:PET] = 'tame vermin' ; IsCasteMat[:PET] = true ; Classname[:PET] = 'item_petst'
    ENUM[52] = :SEEDS ; NUME[:SEEDS] = 52 ; Caption[:SEEDS] = 'seeds' ; Classname[:SEEDS] = 'item_seedsst'
    ENUM[53] = :PLANT ; NUME[:PLANT] = 53 ; Caption[:PLANT] = 'plant' ; IsStackable[:PLANT] = true ; Classname[:PLANT] = 'item_plantst'
    ENUM[54] = :SKIN_TANNED ; NUME[:SKIN_TANNED] = 54 ; Caption[:SKIN_TANNED] = 'leather' ; Classname[:SKIN_TANNED] = 'item_skin_tannedst'
    ENUM[55] = :PLANT_GROWTH ; NUME[:PLANT_GROWTH] = 55 ; Caption[:PLANT_GROWTH] = 'plant growth' ; IsStackable[:PLANT_GROWTH] = true ; Classname[:PLANT_GROWTH] = 'item_plant_growthst'
    ENUM[56] = :THREAD ; NUME[:THREAD] = 56 ; Caption[:THREAD] = 'thread' ; Classname[:THREAD] = 'item_threadst'
    ENUM[57] = :CLOTH ; NUME[:CLOTH] = 57 ; Caption[:CLOTH] = 'cloth' ; Classname[:CLOTH] = 'item_clothst'
    ENUM[58] = :TOTEM ; NUME[:TOTEM] = 58 ; Caption[:TOTEM] = 'totem' ; Classname[:TOTEM] = 'item_totemst'
    ENUM[59] = :PANTS ; NUME[:PANTS] = 59 ; Caption[:PANTS] = 'legwear' ; IsRawable[:PANTS] = true ; Classname[:PANTS] = 'item_pantsst'
    ENUM[60] = :BACKPACK ; NUME[:BACKPACK] = 60 ; Caption[:BACKPACK] = 'backpack' ; Classname[:BACKPACK] = 'item_backpackst'
    ENUM[61] = :QUIVER ; NUME[:QUIVER] = 61 ; Caption[:QUIVER] = 'quiver' ; Classname[:QUIVER] = 'item_quiverst'
    ENUM[62] = :CATAPULTPARTS ; NUME[:CATAPULTPARTS] = 62 ; Caption[:CATAPULTPARTS] = 'catapult part' ; Classname[:CATAPULTPARTS] = 'item_catapultpartsst'
    ENUM[63] = :BALLISTAPARTS ; NUME[:BALLISTAPARTS] = 63 ; Caption[:BALLISTAPARTS] = 'ballista part' ; Classname[:BALLISTAPARTS] = 'item_ballistapartsst'
    ENUM[64] = :SIEGEAMMO ; NUME[:SIEGEAMMO] = 64 ; Caption[:SIEGEAMMO] = 'siege ammo' ; IsRawable[:SIEGEAMMO] = true ; Classname[:SIEGEAMMO] = 'item_siegeammost'
    ENUM[65] = :BALLISTAARROWHEAD ; NUME[:BALLISTAARROWHEAD] = 65 ; Caption[:BALLISTAARROWHEAD] = 'ballista arrow head' ; Classname[:BALLISTAARROWHEAD] = 'item_ballistaarrowheadst'
    ENUM[66] = :TRAPPARTS ; NUME[:TRAPPARTS] = 66 ; Caption[:TRAPPARTS] = 'mechanism' ; Classname[:TRAPPARTS] = 'item_trappartsst'
    ENUM[67] = :TRAPCOMP ; NUME[:TRAPCOMP] = 67 ; Caption[:TRAPCOMP] = 'trap component' ; IsRawable[:TRAPCOMP] = true ; Classname[:TRAPCOMP] = 'item_trapcompst'
    ENUM[68] = :DRINK ; NUME[:DRINK] = 68 ; Caption[:DRINK] = 'drink' ; IsStackable[:DRINK] = true ; Classname[:DRINK] = 'item_drinkst'
    ENUM[69] = :POWDER_MISC ; NUME[:POWDER_MISC] = 69 ; Caption[:POWDER_MISC] = 'powder' ; IsStackable[:POWDER_MISC] = true ; Classname[:POWDER_MISC] = 'item_powder_miscst'
    ENUM[70] = :CHEESE ; NUME[:CHEESE] = 70 ; Caption[:CHEESE] = 'cheese' ; IsStackable[:CHEESE] = true ; Classname[:CHEESE] = 'item_cheesest'
    ENUM[71] = :FOOD ; NUME[:FOOD] = 71 ; Caption[:FOOD] = 'prepared meal' ; IsStackable[:FOOD] = true ; Classname[:FOOD] = 'item_foodst'
    ENUM[72] = :LIQUID_MISC ; NUME[:LIQUID_MISC] = 72 ; Caption[:LIQUID_MISC] = 'liquid' ; IsStackable[:LIQUID_MISC] = true ; Classname[:LIQUID_MISC] = 'item_liquid_miscst'
    ENUM[73] = :COIN ; NUME[:COIN] = 73 ; Caption[:COIN] = 'coin' ; IsStackable[:COIN] = true ; Classname[:COIN] = 'item_coinst'
    ENUM[74] = :GLOB ; NUME[:GLOB] = 74 ; Caption[:GLOB] = 'glob' ; Classname[:GLOB] = 'item_globst'
    ENUM[75] = :ROCK ; NUME[:ROCK] = 75 ; Caption[:ROCK] = 'small rock' ; Classname[:ROCK] = 'item_rockst'
    ENUM[76] = :PIPE_SECTION ; NUME[:PIPE_SECTION] = 76 ; Caption[:PIPE_SECTION] = 'pipe section' ; Classname[:PIPE_SECTION] = 'item_pipe_sectionst'
    ENUM[77] = :HATCH_COVER ; NUME[:HATCH_COVER] = 77 ; Caption[:HATCH_COVER] = 'hatch cover' ; Classname[:HATCH_COVER] = 'item_hatch_coverst'
    ENUM[78] = :GRATE ; NUME[:GRATE] = 78 ; Caption[:GRATE] = 'grate' ; Classname[:GRATE] = 'item_gratest'
    ENUM[79] = :QUERN ; NUME[:QUERN] = 79 ; Caption[:QUERN] = 'quern' ; Classname[:QUERN] = 'item_quernst'
    ENUM[80] = :MILLSTONE ; NUME[:MILLSTONE] = 80 ; Caption[:MILLSTONE] = 'millstone' ; Classname[:MILLSTONE] = 'item_millstonest'
    ENUM[81] = :SPLINT ; NUME[:SPLINT] = 81 ; Caption[:SPLINT] = 'splint' ; Classname[:SPLINT] = 'item_splintst'
    ENUM[82] = :CRUTCH ; NUME[:CRUTCH] = 82 ; Caption[:CRUTCH] = 'crutch' ; Classname[:CRUTCH] = 'item_crutchst'
    ENUM[83] = :TRACTION_BENCH ; NUME[:TRACTION_BENCH] = 83 ; Caption[:TRACTION_BENCH] = 'traction bench' ; Classname[:TRACTION_BENCH] = 'item_traction_benchst'
    ENUM[84] = :ORTHOPEDIC_CAST ; NUME[:ORTHOPEDIC_CAST] = 84 ; Caption[:ORTHOPEDIC_CAST] = 'orthopedic cast' ; Classname[:ORTHOPEDIC_CAST] = 'item_orthopedic_castst'
    ENUM[85] = :TOOL ; NUME[:TOOL] = 85 ; Caption[:TOOL] = 'tool' ; IsRawable[:TOOL] = true ; Classname[:TOOL] = 'item_toolst'
    ENUM[86] = :SLAB ; NUME[:SLAB] = 86 ; Caption[:SLAB] = 'slab' ; Classname[:SLAB] = 'item_slabst'
    ENUM[87] = :EGG ; NUME[:EGG] = 87 ; Caption[:EGG] = 'egg' ; IsCasteMat[:EGG] = true ; IsStackable[:EGG] = true ; Classname[:EGG] = 'item_eggst'
    ENUM[88] = :BOOK ; NUME[:BOOK] = 88 ; Caption[:BOOK] = 'book' ; Classname[:BOOK] = 'item_bookst'
    ENUM[89] = :SHEET ; NUME[:SHEET] = 89 ; Caption[:SHEET] = 'sheet' ; Classname[:SHEET] = 'item_sheetst'
    ENUM[90] = :BRANCH ; NUME[:BRANCH] = 90 ; Caption[:BRANCH] = 'branch' ; Classname[:BRANCH] = 'item_branchst'
end

class ItemdefFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GENERATED ; NUME[:GENERATED] = 0
end

class ItemimprovementSpecificType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HANDLE ; NUME[:HANDLE] = 0
    ENUM[1] = :ROLLERS ; NUME[:ROLLERS] = 1
end

class ItemsOtherId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Item = Hash.new(:NONE)
    GenericItem = Hash.new { |h, k| h[k] = [] }
    ENUM[-1] = :ANY ; NUME[:ANY] = -1
    ENUM[0] = :IN_PLAY ; NUME[:IN_PLAY] = 0
    ENUM[1] = :ANY_ARTIFACT ; NUME[:ANY_ARTIFACT] = 1
    ENUM[2] = :WEAPON ; NUME[:WEAPON] = 2 ; Item[:WEAPON] = :WEAPON
    ENUM[3] = :ANY_WEAPON ; NUME[:ANY_WEAPON] = 3 ; GenericItem[:ANY_WEAPON] << :WEAPON ; GenericItem[:ANY_WEAPON] << :TRAPCOMP
    ENUM[4] = :ANY_SPIKE ; NUME[:ANY_SPIKE] = 4 ; GenericItem[:ANY_SPIKE] << :WEAPON ; GenericItem[:ANY_SPIKE] << :TRAPCOMP
    ENUM[5] = :ANY_TRUE_ARMOR ; NUME[:ANY_TRUE_ARMOR] = 5 ; GenericItem[:ANY_TRUE_ARMOR] << :ARMOR
    ENUM[6] = :ANY_ARMOR_HELM ; NUME[:ANY_ARMOR_HELM] = 6 ; GenericItem[:ANY_ARMOR_HELM] << :HELM
    ENUM[7] = :ANY_ARMOR_SHOES ; NUME[:ANY_ARMOR_SHOES] = 7 ; GenericItem[:ANY_ARMOR_SHOES] << :SHOES
    ENUM[8] = :SHIELD ; NUME[:SHIELD] = 8 ; Item[:SHIELD] = :SHIELD
    ENUM[9] = :ANY_ARMOR_GLOVES ; NUME[:ANY_ARMOR_GLOVES] = 9 ; GenericItem[:ANY_ARMOR_GLOVES] << :GLOVES
    ENUM[10] = :ANY_ARMOR_PANTS ; NUME[:ANY_ARMOR_PANTS] = 10 ; GenericItem[:ANY_ARMOR_PANTS] << :PANTS
    ENUM[11] = :QUIVER ; NUME[:QUIVER] = 11 ; Item[:QUIVER] = :QUIVER
    ENUM[12] = :SPLINT ; NUME[:SPLINT] = 12 ; Item[:SPLINT] = :SPLINT
    ENUM[13] = :ORTHOPEDIC_CAST ; NUME[:ORTHOPEDIC_CAST] = 13 ; Item[:ORTHOPEDIC_CAST] = :ORTHOPEDIC_CAST
    ENUM[14] = :CRUTCH ; NUME[:CRUTCH] = 14 ; Item[:CRUTCH] = :CRUTCH
    ENUM[15] = :BACKPACK ; NUME[:BACKPACK] = 15 ; Item[:BACKPACK] = :BACKPACK
    ENUM[16] = :AMMO ; NUME[:AMMO] = 16 ; Item[:AMMO] = :AMMO
    ENUM[17] = :WOOD ; NUME[:WOOD] = 17 ; Item[:WOOD] = :WOOD
    ENUM[18] = :BRANCH ; NUME[:BRANCH] = 18 ; Item[:BRANCH] = :BRANCH
    ENUM[19] = :BOULDER ; NUME[:BOULDER] = 19 ; Item[:BOULDER] = :BOULDER
    ENUM[20] = :ROCK ; NUME[:ROCK] = 20 ; Item[:ROCK] = :ROCK
    ENUM[21] = :ANY_REFUSE ; NUME[:ANY_REFUSE] = 21 ; GenericItem[:ANY_REFUSE] << :CORPSE ; GenericItem[:ANY_REFUSE] << :ARMOR ; GenericItem[:ANY_REFUSE] << :SHOES ; GenericItem[:ANY_REFUSE] << :HELM ; GenericItem[:ANY_REFUSE] << :GLOVES ; GenericItem[:ANY_REFUSE] << :CORPSEPIECE ; GenericItem[:ANY_REFUSE] << :REMAINS ; GenericItem[:ANY_REFUSE] << :PANTS ; GenericItem[:ANY_REFUSE] << :MEAT ; GenericItem[:ANY_REFUSE] << :FISH ; GenericItem[:ANY_REFUSE] << :FISH_RAW ; GenericItem[:ANY_REFUSE] << :SEEDS ; GenericItem[:ANY_REFUSE] << :PLANT ; GenericItem[:ANY_REFUSE] << :PLANT_GROWTH ; GenericItem[:ANY_REFUSE] << :CHEESE ; GenericItem[:ANY_REFUSE] << :FOOD ; GenericItem[:ANY_REFUSE] << :EGG ; GenericItem[:ANY_REFUSE] << :GLOB
    ENUM[22] = :ANY_GOOD_FOOD ; NUME[:ANY_GOOD_FOOD] = 22 ; GenericItem[:ANY_GOOD_FOOD] << :BOX ; GenericItem[:ANY_GOOD_FOOD] << :MEAT ; GenericItem[:ANY_GOOD_FOOD] << :FISH ; GenericItem[:ANY_GOOD_FOOD] << :FISH_RAW ; GenericItem[:ANY_GOOD_FOOD] << :SEEDS ; GenericItem[:ANY_GOOD_FOOD] << :PLANT ; GenericItem[:ANY_GOOD_FOOD] << :PLANT_GROWTH ; GenericItem[:ANY_GOOD_FOOD] << :CHEESE ; GenericItem[:ANY_GOOD_FOOD] << :FOOD ; GenericItem[:ANY_GOOD_FOOD] << :EGG
    ENUM[23] = :ANY_AUTO_CLEAN ; NUME[:ANY_AUTO_CLEAN] = 23 ; GenericItem[:ANY_AUTO_CLEAN] << :DRINK ; GenericItem[:ANY_AUTO_CLEAN] << :POWDER_MISC ; GenericItem[:ANY_AUTO_CLEAN] << :LIQUID_MISC ; GenericItem[:ANY_AUTO_CLEAN] << :GLOB
    ENUM[24] = :ANY_GENERIC24 ; NUME[:ANY_GENERIC24] = 24 ; GenericItem[:ANY_GENERIC24] << :CAGE ; GenericItem[:ANY_GENERIC24] << :ANIMALTRAP ; GenericItem[:ANY_GENERIC24] << :FISH_RAW ; GenericItem[:ANY_GENERIC24] << :VERMIN ; GenericItem[:ANY_GENERIC24] << :PLANT
    ENUM[25] = :ANY_BUTCHERABLE ; NUME[:ANY_BUTCHERABLE] = 25 ; GenericItem[:ANY_BUTCHERABLE] << :CAGE ; GenericItem[:ANY_BUTCHERABLE] << :ANIMALTRAP ; GenericItem[:ANY_BUTCHERABLE] << :CORPSE ; GenericItem[:ANY_BUTCHERABLE] << :CORPSEPIECE ; GenericItem[:ANY_BUTCHERABLE] << :VERMIN
    ENUM[26] = :ANY_FURNITURE ; NUME[:ANY_FURNITURE] = 26
    ENUM[27] = :ANY_CAGE_OR_TRAP ; NUME[:ANY_CAGE_OR_TRAP] = 27 ; GenericItem[:ANY_CAGE_OR_TRAP] << :CAGE ; GenericItem[:ANY_CAGE_OR_TRAP] << :ANIMALTRAP
    ENUM[28] = :ANY_EDIBLE_RAW ; NUME[:ANY_EDIBLE_RAW] = 28
    ENUM[29] = :ANY_EDIBLE_CARNIVORE ; NUME[:ANY_EDIBLE_CARNIVORE] = 29
    ENUM[30] = :ANY_EDIBLE_BONECARN ; NUME[:ANY_EDIBLE_BONECARN] = 30
    ENUM[31] = :ANY_EDIBLE_VERMIN ; NUME[:ANY_EDIBLE_VERMIN] = 31
    ENUM[32] = :ANY_EDIBLE_VERMIN_BOX ; NUME[:ANY_EDIBLE_VERMIN_BOX] = 32 ; GenericItem[:ANY_EDIBLE_VERMIN_BOX] << :BARREL ; GenericItem[:ANY_EDIBLE_VERMIN_BOX] << :BOX
    ENUM[33] = :ANY_CAN_ROT ; NUME[:ANY_CAN_ROT] = 33 ; GenericItem[:ANY_CAN_ROT] << :CORPSE ; GenericItem[:ANY_CAN_ROT] << :CORPSEPIECE ; GenericItem[:ANY_CAN_ROT] << :REMAINS ; GenericItem[:ANY_CAN_ROT] << :MEAT ; GenericItem[:ANY_CAN_ROT] << :FISH ; GenericItem[:ANY_CAN_ROT] << :FISH_RAW ; GenericItem[:ANY_CAN_ROT] << :SEEDS ; GenericItem[:ANY_CAN_ROT] << :PLANT ; GenericItem[:ANY_CAN_ROT] << :PLANT_GROWTH ; GenericItem[:ANY_CAN_ROT] << :CHEESE ; GenericItem[:ANY_CAN_ROT] << :FOOD ; GenericItem[:ANY_CAN_ROT] << :EGG
    ENUM[34] = :ANY_MURDERED ; NUME[:ANY_MURDERED] = 34 ; GenericItem[:ANY_MURDERED] << :CORPSE ; GenericItem[:ANY_MURDERED] << :CORPSEPIECE ; GenericItem[:ANY_MURDERED] << :REMAINS
    ENUM[35] = :ANY_DEAD_DWARF ; NUME[:ANY_DEAD_DWARF] = 35
    ENUM[36] = :ANY_GENERIC36 ; NUME[:ANY_GENERIC36] = 36 ; GenericItem[:ANY_GENERIC36] << :BAR ; GenericItem[:ANY_GENERIC36] << :SMALLGEM ; GenericItem[:ANY_GENERIC36] << :BLOCKS ; GenericItem[:ANY_GENERIC36] << :ROUGH ; GenericItem[:ANY_GENERIC36] << :CHAIN ; GenericItem[:ANY_GENERIC36] << :FLASK ; GenericItem[:ANY_GENERIC36] << :GOBLET ; GenericItem[:ANY_GENERIC36] << :INSTRUMENT ; GenericItem[:ANY_GENERIC36] << :TOY ; GenericItem[:ANY_GENERIC36] << :FIGURINE ; GenericItem[:ANY_GENERIC36] << :AMULET ; GenericItem[:ANY_GENERIC36] << :SCEPTER ; GenericItem[:ANY_GENERIC36] << :AMMO ; GenericItem[:ANY_GENERIC36] << :CROWN ; GenericItem[:ANY_GENERIC36] << :RING ; GenericItem[:ANY_GENERIC36] << :EARRING ; GenericItem[:ANY_GENERIC36] << :BRACELET ; GenericItem[:ANY_GENERIC36] << :GEM ; GenericItem[:ANY_GENERIC36] << :SKIN_TANNED ; GenericItem[:ANY_GENERIC36] << :THREAD ; GenericItem[:ANY_GENERIC36] << :CLOTH ; GenericItem[:ANY_GENERIC36] << :TOTEM ; GenericItem[:ANY_GENERIC36] << :BACKPACK ; GenericItem[:ANY_GENERIC36] << :QUIVER ; GenericItem[:ANY_GENERIC36] << :BALLISTAARROWHEAD ; GenericItem[:ANY_GENERIC36] << :COIN ; GenericItem[:ANY_GENERIC36] << :SPLINT ; GenericItem[:ANY_GENERIC36] << :TOOL ; GenericItem[:ANY_GENERIC36] << :BOOK
    ENUM[37] = :ANY_GENERIC37 ; NUME[:ANY_GENERIC37] = 37 ; GenericItem[:ANY_GENERIC37] << :ARMOR ; GenericItem[:ANY_GENERIC37] << :SHOES ; GenericItem[:ANY_GENERIC37] << :HELM ; GenericItem[:ANY_GENERIC37] << :GLOVES ; GenericItem[:ANY_GENERIC37] << :PANTS
    ENUM[38] = :ANY_GENERIC38 ; NUME[:ANY_GENERIC38] = 38 ; GenericItem[:ANY_GENERIC38] << :WEAPON ; GenericItem[:ANY_GENERIC38] << :TRAPCOMP ; GenericItem[:ANY_GENERIC38] << :SIEGEAMMO
    ENUM[39] = :ANY_GENERIC39 ; NUME[:ANY_GENERIC39] = 39 ; GenericItem[:ANY_GENERIC39] << :ARMOR ; GenericItem[:ANY_GENERIC39] << :SHOES ; GenericItem[:ANY_GENERIC39] << :SHIELD ; GenericItem[:ANY_GENERIC39] << :HELM ; GenericItem[:ANY_GENERIC39] << :GLOVES ; GenericItem[:ANY_GENERIC39] << :PANTS
    ENUM[40] = :DOOR ; NUME[:DOOR] = 40 ; Item[:DOOR] = :DOOR
    ENUM[41] = :FLOODGATE ; NUME[:FLOODGATE] = 41 ; Item[:FLOODGATE] = :FLOODGATE
    ENUM[42] = :HATCH_COVER ; NUME[:HATCH_COVER] = 42 ; Item[:HATCH_COVER] = :HATCH_COVER
    ENUM[43] = :GRATE ; NUME[:GRATE] = 43 ; Item[:GRATE] = :GRATE
    ENUM[44] = :CAGE ; NUME[:CAGE] = 44 ; Item[:CAGE] = :CAGE
    ENUM[45] = :FLASK ; NUME[:FLASK] = 45 ; Item[:FLASK] = :FLASK
    ENUM[46] = :WINDOW ; NUME[:WINDOW] = 46 ; Item[:WINDOW] = :WINDOW
    ENUM[47] = :GOBLET ; NUME[:GOBLET] = 47 ; Item[:GOBLET] = :GOBLET
    ENUM[48] = :INSTRUMENT ; NUME[:INSTRUMENT] = 48 ; Item[:INSTRUMENT] = :INSTRUMENT
    ENUM[49] = :INSTRUMENT_STATIONARY ; NUME[:INSTRUMENT_STATIONARY] = 49 ; Item[:INSTRUMENT_STATIONARY] = :INSTRUMENT
    ENUM[50] = :TOY ; NUME[:TOY] = 50 ; Item[:TOY] = :TOY
    ENUM[51] = :TOOL ; NUME[:TOOL] = 51 ; Item[:TOOL] = :TOOL
    ENUM[52] = :BUCKET ; NUME[:BUCKET] = 52 ; Item[:BUCKET] = :BUCKET
    ENUM[53] = :BARREL ; NUME[:BARREL] = 53 ; Item[:BARREL] = :BARREL
    ENUM[54] = :CHAIN ; NUME[:CHAIN] = 54 ; Item[:CHAIN] = :CHAIN
    ENUM[55] = :ANIMALTRAP ; NUME[:ANIMALTRAP] = 55 ; Item[:ANIMALTRAP] = :ANIMALTRAP
    ENUM[56] = :BED ; NUME[:BED] = 56 ; Item[:BED] = :BED
    ENUM[57] = :TRACTION_BENCH ; NUME[:TRACTION_BENCH] = 57 ; Item[:TRACTION_BENCH] = :TRACTION_BENCH
    ENUM[58] = :CHAIR ; NUME[:CHAIR] = 58 ; Item[:CHAIR] = :CHAIR
    ENUM[59] = :COFFIN ; NUME[:COFFIN] = 59 ; Item[:COFFIN] = :COFFIN
    ENUM[60] = :TABLE ; NUME[:TABLE] = 60 ; Item[:TABLE] = :TABLE
    ENUM[61] = :STATUE ; NUME[:STATUE] = 61 ; Item[:STATUE] = :STATUE
    ENUM[62] = :SLAB ; NUME[:SLAB] = 62 ; Item[:SLAB] = :SLAB
    ENUM[63] = :QUERN ; NUME[:QUERN] = 63 ; Item[:QUERN] = :QUERN
    ENUM[64] = :MILLSTONE ; NUME[:MILLSTONE] = 64 ; Item[:MILLSTONE] = :MILLSTONE
    ENUM[65] = :BOX ; NUME[:BOX] = 65 ; Item[:BOX] = :BOX
    ENUM[66] = :BIN ; NUME[:BIN] = 66 ; Item[:BIN] = :BIN
    ENUM[67] = :ARMORSTAND ; NUME[:ARMORSTAND] = 67 ; Item[:ARMORSTAND] = :ARMORSTAND
    ENUM[68] = :WEAPONRACK ; NUME[:WEAPONRACK] = 68 ; Item[:WEAPONRACK] = :WEAPONRACK
    ENUM[69] = :CABINET ; NUME[:CABINET] = 69 ; Item[:CABINET] = :CABINET
    ENUM[70] = :ANVIL ; NUME[:ANVIL] = 70 ; Item[:ANVIL] = :ANVIL
    ENUM[71] = :CATAPULTPARTS ; NUME[:CATAPULTPARTS] = 71 ; Item[:CATAPULTPARTS] = :CATAPULTPARTS
    ENUM[72] = :BALLISTAPARTS ; NUME[:BALLISTAPARTS] = 72 ; Item[:BALLISTAPARTS] = :BALLISTAPARTS
    ENUM[73] = :SIEGEAMMO ; NUME[:SIEGEAMMO] = 73 ; Item[:SIEGEAMMO] = :SIEGEAMMO
    ENUM[74] = :TRAPPARTS ; NUME[:TRAPPARTS] = 74 ; Item[:TRAPPARTS] = :TRAPPARTS
    ENUM[75] = :ANY_WEBS ; NUME[:ANY_WEBS] = 75 ; GenericItem[:ANY_WEBS] << :THREAD
    ENUM[76] = :PIPE_SECTION ; NUME[:PIPE_SECTION] = 76 ; Item[:PIPE_SECTION] = :PIPE_SECTION
    ENUM[77] = :ANY_ENCASED ; NUME[:ANY_ENCASED] = 77
    ENUM[78] = :ANY_IN_CONSTRUCTION ; NUME[:ANY_IN_CONSTRUCTION] = 78
    ENUM[79] = :DRINK ; NUME[:DRINK] = 79 ; Item[:DRINK] = :DRINK
    ENUM[80] = :ANY_DRINK ; NUME[:ANY_DRINK] = 80 ; GenericItem[:ANY_DRINK] << :DRINK
    ENUM[81] = :LIQUID_MISC ; NUME[:LIQUID_MISC] = 81 ; Item[:LIQUID_MISC] = :LIQUID_MISC
    ENUM[82] = :POWDER_MISC ; NUME[:POWDER_MISC] = 82 ; Item[:POWDER_MISC] = :POWDER_MISC
    ENUM[83] = :ANY_COOKABLE ; NUME[:ANY_COOKABLE] = 83 ; GenericItem[:ANY_COOKABLE] << :FLASK ; GenericItem[:ANY_COOKABLE] << :CAGE ; GenericItem[:ANY_COOKABLE] << :BARREL ; GenericItem[:ANY_COOKABLE] << :BUCKET ; GenericItem[:ANY_COOKABLE] << :ANIMALTRAP ; GenericItem[:ANY_COOKABLE] << :BOX ; GenericItem[:ANY_COOKABLE] << :MEAT ; GenericItem[:ANY_COOKABLE] << :FISH ; GenericItem[:ANY_COOKABLE] << :FISH_RAW ; GenericItem[:ANY_COOKABLE] << :VERMIN ; GenericItem[:ANY_COOKABLE] << :SEEDS ; GenericItem[:ANY_COOKABLE] << :PLANT ; GenericItem[:ANY_COOKABLE] << :PLANT_GROWTH ; GenericItem[:ANY_COOKABLE] << :DRINK ; GenericItem[:ANY_COOKABLE] << :POWDER_MISC ; GenericItem[:ANY_COOKABLE] << :CHEESE ; GenericItem[:ANY_COOKABLE] << :LIQUID_MISC ; GenericItem[:ANY_COOKABLE] << :GLOB ; GenericItem[:ANY_COOKABLE] << :TOOL ; GenericItem[:ANY_COOKABLE] << :EGG
    ENUM[84] = :ANY_GENERIC84 ; NUME[:ANY_GENERIC84] = 84 ; GenericItem[:ANY_GENERIC84] << :BOX
    ENUM[85] = :VERMIN ; NUME[:VERMIN] = 85 ; GenericItem[:VERMIN] << :VERMIN
    ENUM[86] = :PET ; NUME[:PET] = 86 ; GenericItem[:PET] << :PET
    ENUM[87] = :ANY_CRITTER ; NUME[:ANY_CRITTER] = 87 ; GenericItem[:ANY_CRITTER] << :VERMIN ; GenericItem[:ANY_CRITTER] << :PET
    ENUM[88] = :COIN ; NUME[:COIN] = 88 ; Item[:COIN] = :COIN
    ENUM[89] = :GLOB ; NUME[:GLOB] = 89 ; Item[:GLOB] = :GLOB
    ENUM[90] = :TRAPCOMP ; NUME[:TRAPCOMP] = 90 ; Item[:TRAPCOMP] = :TRAPCOMP
    ENUM[91] = :BAR ; NUME[:BAR] = 91 ; Item[:BAR] = :BAR
    ENUM[92] = :SMALLGEM ; NUME[:SMALLGEM] = 92 ; Item[:SMALLGEM] = :SMALLGEM
    ENUM[93] = :BLOCKS ; NUME[:BLOCKS] = 93 ; Item[:BLOCKS] = :BLOCKS
    ENUM[94] = :ROUGH ; NUME[:ROUGH] = 94 ; Item[:ROUGH] = :ROUGH
    ENUM[95] = :ANY_CORPSE ; NUME[:ANY_CORPSE] = 95 ; GenericItem[:ANY_CORPSE] << :CORPSE ; GenericItem[:ANY_CORPSE] << :CORPSEPIECE
    ENUM[96] = :CORPSE ; NUME[:CORPSE] = 96 ; Item[:CORPSE] = :CORPSE
    ENUM[97] = :BOOK ; NUME[:BOOK] = 97 ; Item[:BOOK] = :BOOK
    ENUM[98] = :FIGURINE ; NUME[:FIGURINE] = 98 ; Item[:FIGURINE] = :FIGURINE
    ENUM[99] = :AMULET ; NUME[:AMULET] = 99 ; Item[:AMULET] = :AMULET
    ENUM[100] = :SCEPTER ; NUME[:SCEPTER] = 100 ; Item[:SCEPTER] = :SCEPTER
    ENUM[101] = :CROWN ; NUME[:CROWN] = 101 ; Item[:CROWN] = :CROWN
    ENUM[102] = :RING ; NUME[:RING] = 102 ; Item[:RING] = :RING
    ENUM[103] = :EARRING ; NUME[:EARRING] = 103 ; Item[:EARRING] = :EARRING
    ENUM[104] = :BRACELET ; NUME[:BRACELET] = 104 ; Item[:BRACELET] = :BRACELET
    ENUM[105] = :GEM ; NUME[:GEM] = 105 ; Item[:GEM] = :GEM
    ENUM[106] = :CORPSEPIECE ; NUME[:CORPSEPIECE] = 106 ; Item[:CORPSEPIECE] = :CORPSEPIECE
    ENUM[107] = :REMAINS ; NUME[:REMAINS] = 107 ; Item[:REMAINS] = :REMAINS
    ENUM[108] = :MEAT ; NUME[:MEAT] = 108 ; Item[:MEAT] = :MEAT
    ENUM[109] = :FISH ; NUME[:FISH] = 109 ; Item[:FISH] = :FISH
    ENUM[110] = :FISH_RAW ; NUME[:FISH_RAW] = 110 ; Item[:FISH_RAW] = :FISH_RAW
    ENUM[111] = :EGG ; NUME[:EGG] = 111 ; Item[:EGG] = :EGG
    ENUM[112] = :SEEDS ; NUME[:SEEDS] = 112 ; Item[:SEEDS] = :SEEDS
    ENUM[113] = :PLANT ; NUME[:PLANT] = 113 ; Item[:PLANT] = :PLANT
    ENUM[114] = :SKIN_TANNED ; NUME[:SKIN_TANNED] = 114 ; Item[:SKIN_TANNED] = :SKIN_TANNED
    ENUM[115] = :PLANT_GROWTH ; NUME[:PLANT_GROWTH] = 115 ; Item[:PLANT_GROWTH] = :PLANT_GROWTH
    ENUM[116] = :THREAD ; NUME[:THREAD] = 116 ; Item[:THREAD] = :THREAD
    ENUM[117] = :CLOTH ; NUME[:CLOTH] = 117 ; Item[:CLOTH] = :CLOTH
    ENUM[118] = :SHEET ; NUME[:SHEET] = 118 ; Item[:SHEET] = :SHEET
    ENUM[119] = :TOTEM ; NUME[:TOTEM] = 119 ; Item[:TOTEM] = :TOTEM
    ENUM[120] = :PANTS ; NUME[:PANTS] = 120 ; Item[:PANTS] = :PANTS
    ENUM[121] = :CHEESE ; NUME[:CHEESE] = 121 ; Item[:CHEESE] = :CHEESE
    ENUM[122] = :FOOD ; NUME[:FOOD] = 122 ; Item[:FOOD] = :FOOD
    ENUM[123] = :BALLISTAARROWHEAD ; NUME[:BALLISTAARROWHEAD] = 123 ; Item[:BALLISTAARROWHEAD] = :BALLISTAARROWHEAD
    ENUM[124] = :ARMOR ; NUME[:ARMOR] = 124 ; Item[:ARMOR] = :ARMOR
    ENUM[125] = :SHOES ; NUME[:SHOES] = 125 ; Item[:SHOES] = :SHOES
    ENUM[126] = :HELM ; NUME[:HELM] = 126 ; Item[:HELM] = :HELM
    ENUM[127] = :GLOVES ; NUME[:GLOVES] = 127 ; Item[:GLOVES] = :GLOVES
    ENUM[128] = :ANY_GENERIC128 ; NUME[:ANY_GENERIC128] = 128 ; GenericItem[:ANY_GENERIC128] << :FLASK ; GenericItem[:ANY_GENERIC128] << :GOBLET ; GenericItem[:ANY_GENERIC128] << :CAGE ; GenericItem[:ANY_GENERIC128] << :BARREL ; GenericItem[:ANY_GENERIC128] << :BUCKET ; GenericItem[:ANY_GENERIC128] << :ANIMALTRAP ; GenericItem[:ANY_GENERIC128] << :COFFIN ; GenericItem[:ANY_GENERIC128] << :BOX ; GenericItem[:ANY_GENERIC128] << :BIN ; GenericItem[:ANY_GENERIC128] << :ARMORSTAND ; GenericItem[:ANY_GENERIC128] << :WEAPONRACK ; GenericItem[:ANY_GENERIC128] << :CABINET ; GenericItem[:ANY_GENERIC128] << :BACKPACK ; GenericItem[:ANY_GENERIC128] << :QUIVER ; GenericItem[:ANY_GENERIC128] << :TOOL
    ENUM[129] = :FOOD_STORAGE ; NUME[:FOOD_STORAGE] = 129 ; GenericItem[:FOOD_STORAGE] << :BARREL ; GenericItem[:FOOD_STORAGE] << :TOOL
    ENUM[130] = :ANY_RECENTLY_DROPPED ; NUME[:ANY_RECENTLY_DROPPED] = 130
    ENUM[131] = :ANY_MELT_DESIGNATED ; NUME[:ANY_MELT_DESIGNATED] = 131
end

class JobItemVectorId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Other = Hash.new(:ANY)
    ENUM[0] = :ANY ; NUME[:ANY] = 0
    ENUM[1] = :IN_PLAY ; NUME[:IN_PLAY] = 1
    ENUM[2] = :ANY_ARTIFACT ; NUME[:ANY_ARTIFACT] = 2
    ENUM[3] = :WEAPON ; NUME[:WEAPON] = 3
    ENUM[4] = :ANY_WEAPON ; NUME[:ANY_WEAPON] = 4
    ENUM[5] = :ANY_SPIKE ; NUME[:ANY_SPIKE] = 5
    ENUM[6] = :ANY_TRUE_ARMOR ; NUME[:ANY_TRUE_ARMOR] = 6
    ENUM[7] = :ANY_ARMOR_HELM ; NUME[:ANY_ARMOR_HELM] = 7
    ENUM[8] = :ANY_ARMOR_SHOES ; NUME[:ANY_ARMOR_SHOES] = 8
    ENUM[9] = :SHIELD ; NUME[:SHIELD] = 9
    ENUM[10] = :ANY_ARMOR_GLOVES ; NUME[:ANY_ARMOR_GLOVES] = 10
    ENUM[11] = :ANY_ARMOR_PANTS ; NUME[:ANY_ARMOR_PANTS] = 11
    ENUM[12] = :QUIVER ; NUME[:QUIVER] = 12
    ENUM[13] = :SPLINT ; NUME[:SPLINT] = 13
    ENUM[14] = :ANY_14 ; NUME[:ANY_14] = 14 ; Other[:ANY_14] = :ANY
    ENUM[15] = :CRUTCH ; NUME[:CRUTCH] = 15
    ENUM[16] = :BACKPACK ; NUME[:BACKPACK] = 16
    ENUM[17] = :AMMO ; NUME[:AMMO] = 17
    ENUM[18] = :WOOD ; NUME[:WOOD] = 18
    ENUM[19] = :BOULDER ; NUME[:BOULDER] = 19
    ENUM[20] = :ROCK ; NUME[:ROCK] = 20
    ENUM[21] = :ANY_REFUSE ; NUME[:ANY_REFUSE] = 21
    ENUM[22] = :ANY_GOOD_FOOD ; NUME[:ANY_GOOD_FOOD] = 22
    ENUM[23] = :ANY_AUTO_CLEAN ; NUME[:ANY_AUTO_CLEAN] = 23
    ENUM[24] = :ANY_GENERIC24 ; NUME[:ANY_GENERIC24] = 24
    ENUM[25] = :ANY_BUTCHERABLE ; NUME[:ANY_BUTCHERABLE] = 25
    ENUM[26] = :ANY_FURNITURE ; NUME[:ANY_FURNITURE] = 26
    ENUM[27] = :ANY_CAGE_OR_TRAP ; NUME[:ANY_CAGE_OR_TRAP] = 27
    ENUM[28] = :ANY_EDIBLE_RAW ; NUME[:ANY_EDIBLE_RAW] = 28
    ENUM[29] = :ANY_EDIBLE_CARNIVORE ; NUME[:ANY_EDIBLE_CARNIVORE] = 29
    ENUM[30] = :ANY_EDIBLE_BONECARN ; NUME[:ANY_EDIBLE_BONECARN] = 30
    ENUM[31] = :ANY_EDIBLE_VERMIN ; NUME[:ANY_EDIBLE_VERMIN] = 31
    ENUM[32] = :ANY_EDIBLE_VERMIN_BOX ; NUME[:ANY_EDIBLE_VERMIN_BOX] = 32
    ENUM[33] = :ANY_CAN_ROT ; NUME[:ANY_CAN_ROT] = 33
    ENUM[34] = :ANY_MURDERED ; NUME[:ANY_MURDERED] = 34
    ENUM[35] = :ANY_DEAD_DWARF ; NUME[:ANY_DEAD_DWARF] = 35
    ENUM[36] = :ANY_GENERIC36 ; NUME[:ANY_GENERIC36] = 36
    ENUM[37] = :ANY_GENERIC37 ; NUME[:ANY_GENERIC37] = 37
    ENUM[38] = :ANY_GENERIC38 ; NUME[:ANY_GENERIC38] = 38
    ENUM[39] = :ANY_GENERIC39 ; NUME[:ANY_GENERIC39] = 39
    ENUM[40] = :DOOR ; NUME[:DOOR] = 40
    ENUM[41] = :FLOODGATE ; NUME[:FLOODGATE] = 41
    ENUM[42] = :HATCH_COVER ; NUME[:HATCH_COVER] = 42
    ENUM[43] = :GRATE ; NUME[:GRATE] = 43
    ENUM[44] = :CAGE ; NUME[:CAGE] = 44
    ENUM[45] = :FLASK ; NUME[:FLASK] = 45
    ENUM[46] = :WINDOW ; NUME[:WINDOW] = 46
    ENUM[47] = :GOBLET ; NUME[:GOBLET] = 47
    ENUM[48] = :INSTRUMENT ; NUME[:INSTRUMENT] = 48
    ENUM[49] = :TOY ; NUME[:TOY] = 49
    ENUM[50] = :BUCKET ; NUME[:BUCKET] = 50
    ENUM[51] = :BARREL ; NUME[:BARREL] = 51
    ENUM[52] = :CHAIN ; NUME[:CHAIN] = 52
    ENUM[53] = :ANIMALTRAP ; NUME[:ANIMALTRAP] = 53
    ENUM[54] = :BED ; NUME[:BED] = 54
    ENUM[55] = :TRACTION_BENCH ; NUME[:TRACTION_BENCH] = 55
    ENUM[56] = :CHAIR ; NUME[:CHAIR] = 56
    ENUM[57] = :COFFIN ; NUME[:COFFIN] = 57
    ENUM[58] = :TABLE ; NUME[:TABLE] = 58
    ENUM[59] = :STATUE ; NUME[:STATUE] = 59
    ENUM[60] = :QUERN ; NUME[:QUERN] = 60
    ENUM[61] = :MILLSTONE ; NUME[:MILLSTONE] = 61
    ENUM[62] = :BOX ; NUME[:BOX] = 62
    ENUM[63] = :BIN ; NUME[:BIN] = 63
    ENUM[64] = :ARMORSTAND ; NUME[:ARMORSTAND] = 64
    ENUM[65] = :WEAPONRACK ; NUME[:WEAPONRACK] = 65
    ENUM[66] = :CABINET ; NUME[:CABINET] = 66
    ENUM[67] = :ANVIL ; NUME[:ANVIL] = 67
    ENUM[68] = :CATAPULTPARTS ; NUME[:CATAPULTPARTS] = 68
    ENUM[69] = :BALLISTAPARTS ; NUME[:BALLISTAPARTS] = 69
    ENUM[70] = :SIEGEAMMO ; NUME[:SIEGEAMMO] = 70
    ENUM[71] = :TRAPPARTS ; NUME[:TRAPPARTS] = 71
    ENUM[72] = :ANY_WEBS ; NUME[:ANY_WEBS] = 72
    ENUM[73] = :PIPE_SECTION ; NUME[:PIPE_SECTION] = 73
    ENUM[74] = :ANY_ENCASED ; NUME[:ANY_ENCASED] = 74
    ENUM[75] = :ANY_IN_CONSTRUCTION ; NUME[:ANY_IN_CONSTRUCTION] = 75
    ENUM[76] = :DRINK ; NUME[:DRINK] = 76
    ENUM[77] = :ANY_DRINK ; NUME[:ANY_DRINK] = 77
    ENUM[78] = :LIQUID_MISC ; NUME[:LIQUID_MISC] = 78
    ENUM[79] = :POWDER_MISC ; NUME[:POWDER_MISC] = 79
    ENUM[80] = :ANY_COOKABLE ; NUME[:ANY_COOKABLE] = 80
    ENUM[81] = :ANY_GENERIC84 ; NUME[:ANY_GENERIC84] = 81
    ENUM[82] = :VERMIN ; NUME[:VERMIN] = 82
    ENUM[83] = :PET ; NUME[:PET] = 83
    ENUM[84] = :ANY_CRITTER ; NUME[:ANY_CRITTER] = 84
    ENUM[85] = :COIN ; NUME[:COIN] = 85
    ENUM[86] = :GLOB ; NUME[:GLOB] = 86
    ENUM[87] = :ANY_RECENTLY_DROPPED ; NUME[:ANY_RECENTLY_DROPPED] = 87
    ENUM[88] = :ANY_MELT_DESIGNATED ; NUME[:ANY_MELT_DESIGNATED] = 88
    ENUM[90] = :TRAPCOMP ; NUME[:TRAPCOMP] = 90
    ENUM[91] = :BAR ; NUME[:BAR] = 91
    ENUM[92] = :SMALLGEM ; NUME[:SMALLGEM] = 92
    ENUM[93] = :BLOCKS ; NUME[:BLOCKS] = 93
    ENUM[94] = :ROUGH ; NUME[:ROUGH] = 94
    ENUM[95] = :CORPSE ; NUME[:CORPSE] = 95
    ENUM[96] = :FIGURINE ; NUME[:FIGURINE] = 96
    ENUM[97] = :AMULET ; NUME[:AMULET] = 97
    ENUM[98] = :SCEPTER ; NUME[:SCEPTER] = 98
    ENUM[99] = :CROWN ; NUME[:CROWN] = 99
    ENUM[100] = :RING ; NUME[:RING] = 100
    ENUM[101] = :EARRING ; NUME[:EARRING] = 101
    ENUM[102] = :BRACELET ; NUME[:BRACELET] = 102
    ENUM[103] = :GEM ; NUME[:GEM] = 103
    ENUM[104] = :CORPSEPIECE ; NUME[:CORPSEPIECE] = 104
    ENUM[105] = :REMAINS ; NUME[:REMAINS] = 105
    ENUM[106] = :MEAT ; NUME[:MEAT] = 106
    ENUM[107] = :FISH ; NUME[:FISH] = 107
    ENUM[108] = :FISH_RAW ; NUME[:FISH_RAW] = 108
    ENUM[109] = :SEEDS ; NUME[:SEEDS] = 109
    ENUM[110] = :PLANT ; NUME[:PLANT] = 110
    ENUM[111] = :SKIN_TANNED ; NUME[:SKIN_TANNED] = 111
    ENUM[112] = :PLANT_GROWTH ; NUME[:PLANT_GROWTH] = 112
    ENUM[113] = :THREAD ; NUME[:THREAD] = 113
    ENUM[114] = :CLOTH ; NUME[:CLOTH] = 114
    ENUM[115] = :TOTEM ; NUME[:TOTEM] = 115
    ENUM[116] = :PANTS ; NUME[:PANTS] = 116
    ENUM[117] = :CHEESE ; NUME[:CHEESE] = 117
    ENUM[118] = :FOOD ; NUME[:FOOD] = 118
    ENUM[119] = :BALLISTAARROWHEAD ; NUME[:BALLISTAARROWHEAD] = 119
    ENUM[120] = :ARMOR ; NUME[:ARMOR] = 120
    ENUM[121] = :SHOES ; NUME[:SHOES] = 121
    ENUM[122] = :HELM ; NUME[:HELM] = 122
    ENUM[123] = :GLOVES ; NUME[:GLOVES] = 123
    ENUM[124] = :ANY_124 ; NUME[:ANY_124] = 124 ; Other[:ANY_124] = :ANY
    ENUM[125] = :ANY_125 ; NUME[:ANY_125] = 125 ; Other[:ANY_125] = :ANY
    ENUM[126] = :EGG ; NUME[:EGG] = 126
    ENUM[127] = :ANY_127 ; NUME[:ANY_127] = 127 ; Other[:ANY_127] = :ANY
    ENUM[128] = :ANY_CORPSE ; NUME[:ANY_CORPSE] = 128
    ENUM[129] = :BOOK ; NUME[:BOOK] = 129
    ENUM[132] = :SHEET ; NUME[:SHEET] = 132
    ENUM[133] = :BRANCH ; NUME[:BRANCH] = 133
end

class JobSkill < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    CaptionNoun = Hash.new
    Profession = Hash.new(:NONE)
    Labor = Hash.new(:NONE)
    Type = Hash.new(:Normal)
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :MINING ; NUME[:MINING] = 0 ; Caption[:MINING] = 'Mining' ; CaptionNoun[:MINING] = 'Miner' ; Profession[:MINING] = :MINER ; Labor[:MINING] = :MINE
    ENUM[1] = :WOODCUTTING ; NUME[:WOODCUTTING] = 1 ; Caption[:WOODCUTTING] = 'Wood Cutting' ; CaptionNoun[:WOODCUTTING] = 'Wood Cutter' ; Profession[:WOODCUTTING] = :WOODCUTTER ; Labor[:WOODCUTTING] = :CUTWOOD
    ENUM[2] = :CARPENTRY ; NUME[:CARPENTRY] = 2 ; Caption[:CARPENTRY] = 'Carpentry' ; CaptionNoun[:CARPENTRY] = 'Carpenter' ; Profession[:CARPENTRY] = :CARPENTER ; Labor[:CARPENTRY] = :CARPENTER
    ENUM[3] = :DETAILSTONE ; NUME[:DETAILSTONE] = 3 ; Caption[:DETAILSTONE] = 'Engraving' ; CaptionNoun[:DETAILSTONE] = 'Engraver' ; Profession[:DETAILSTONE] = :ENGRAVER ; Labor[:DETAILSTONE] = :DETAIL
    ENUM[4] = :MASONRY ; NUME[:MASONRY] = 4 ; Caption[:MASONRY] = 'Masonry' ; CaptionNoun[:MASONRY] = 'Mason' ; Profession[:MASONRY] = :MASON ; Labor[:MASONRY] = :MASON
    ENUM[5] = :ANIMALTRAIN ; NUME[:ANIMALTRAIN] = 5 ; Caption[:ANIMALTRAIN] = 'Animal Training' ; CaptionNoun[:ANIMALTRAIN] = 'Animal Trainer' ; Profession[:ANIMALTRAIN] = :ANIMAL_TRAINER ; Labor[:ANIMALTRAIN] = :ANIMALTRAIN
    ENUM[6] = :ANIMALCARE ; NUME[:ANIMALCARE] = 6 ; Caption[:ANIMALCARE] = 'Animal Caretaking' ; CaptionNoun[:ANIMALCARE] = 'Animal Caretaker' ; Profession[:ANIMALCARE] = :ANIMAL_CARETAKER ; Labor[:ANIMALCARE] = :ANIMALCARE
    ENUM[7] = :DISSECT_FISH ; NUME[:DISSECT_FISH] = 7 ; Caption[:DISSECT_FISH] = 'Fish Dissection' ; CaptionNoun[:DISSECT_FISH] = 'Fish Dissector' ; Profession[:DISSECT_FISH] = :FISH_DISSECTOR ; Labor[:DISSECT_FISH] = :DISSECT_FISH
    ENUM[8] = :DISSECT_VERMIN ; NUME[:DISSECT_VERMIN] = 8 ; Caption[:DISSECT_VERMIN] = 'Animal Dissection' ; CaptionNoun[:DISSECT_VERMIN] = 'Animal Dissector' ; Profession[:DISSECT_VERMIN] = :ANIMAL_DISSECTOR ; Labor[:DISSECT_VERMIN] = :DISSECT_VERMIN
    ENUM[9] = :PROCESSFISH ; NUME[:PROCESSFISH] = 9 ; Caption[:PROCESSFISH] = 'Fish Cleaning' ; CaptionNoun[:PROCESSFISH] = 'Fish Cleaner' ; Profession[:PROCESSFISH] = :FISH_CLEANER ; Labor[:PROCESSFISH] = :CLEAN_FISH
    ENUM[10] = :BUTCHER ; NUME[:BUTCHER] = 10 ; Caption[:BUTCHER] = 'Butchery' ; CaptionNoun[:BUTCHER] = 'Butcher' ; Profession[:BUTCHER] = :BUTCHER ; Labor[:BUTCHER] = :BUTCHER
    ENUM[11] = :TRAPPING ; NUME[:TRAPPING] = 11 ; Caption[:TRAPPING] = 'Trapping' ; CaptionNoun[:TRAPPING] = 'Trapper' ; Profession[:TRAPPING] = :TRAPPER ; Labor[:TRAPPING] = :TRAPPER
    ENUM[12] = :TANNER ; NUME[:TANNER] = 12 ; Caption[:TANNER] = 'Tanning' ; CaptionNoun[:TANNER] = 'Tanner' ; Profession[:TANNER] = :TANNER ; Labor[:TANNER] = :TANNER
    ENUM[13] = :WEAVING ; NUME[:WEAVING] = 13 ; Caption[:WEAVING] = 'Weaving' ; CaptionNoun[:WEAVING] = 'Weaver' ; Profession[:WEAVING] = :WEAVER ; Labor[:WEAVING] = :WEAVER
    ENUM[14] = :BREWING ; NUME[:BREWING] = 14 ; Caption[:BREWING] = 'Brewing' ; CaptionNoun[:BREWING] = 'Brewer' ; Profession[:BREWING] = :BREWER ; Labor[:BREWING] = :BREWER
    ENUM[15] = :ALCHEMY ; NUME[:ALCHEMY] = 15 ; Caption[:ALCHEMY] = 'Alchemy' ; CaptionNoun[:ALCHEMY] = 'Alchemist' ; Profession[:ALCHEMY] = :ALCHEMIST ; Labor[:ALCHEMY] = :ALCHEMIST
    ENUM[16] = :CLOTHESMAKING ; NUME[:CLOTHESMAKING] = 16 ; Caption[:CLOTHESMAKING] = 'Clothes Making' ; CaptionNoun[:CLOTHESMAKING] = 'Clothier' ; Profession[:CLOTHESMAKING] = :CLOTHIER ; Labor[:CLOTHESMAKING] = :CLOTHESMAKER
    ENUM[17] = :MILLING ; NUME[:MILLING] = 17 ; Caption[:MILLING] = 'Milling' ; CaptionNoun[:MILLING] = 'Miller' ; Profession[:MILLING] = :MILLER ; Labor[:MILLING] = :MILLER
    ENUM[18] = :PROCESSPLANTS ; NUME[:PROCESSPLANTS] = 18 ; Caption[:PROCESSPLANTS] = 'Threshing' ; CaptionNoun[:PROCESSPLANTS] = 'Thresher' ; Profession[:PROCESSPLANTS] = :THRESHER ; Labor[:PROCESSPLANTS] = :PROCESS_PLANT
    ENUM[19] = :CHEESEMAKING ; NUME[:CHEESEMAKING] = 19 ; Caption[:CHEESEMAKING] = 'Cheese Making' ; CaptionNoun[:CHEESEMAKING] = 'Cheese Maker' ; Profession[:CHEESEMAKING] = :CHEESE_MAKER ; Labor[:CHEESEMAKING] = :MAKE_CHEESE
    ENUM[20] = :MILK ; NUME[:MILK] = 20 ; Caption[:MILK] = 'Milking' ; CaptionNoun[:MILK] = 'Milker' ; Profession[:MILK] = :MILKER ; Labor[:MILK] = :MILK
    ENUM[21] = :COOK ; NUME[:COOK] = 21 ; Caption[:COOK] = 'Cooking' ; CaptionNoun[:COOK] = 'Cook' ; Profession[:COOK] = :COOK ; Labor[:COOK] = :COOK
    ENUM[22] = :PLANT ; NUME[:PLANT] = 22 ; Caption[:PLANT] = 'Growing' ; CaptionNoun[:PLANT] = 'Grower' ; Profession[:PLANT] = :PLANTER ; Labor[:PLANT] = :PLANT
    ENUM[23] = :HERBALISM ; NUME[:HERBALISM] = 23 ; Caption[:HERBALISM] = 'Herbalism' ; CaptionNoun[:HERBALISM] = 'Herbalist' ; Profession[:HERBALISM] = :HERBALIST ; Labor[:HERBALISM] = :HERBALIST
    ENUM[24] = :FISH ; NUME[:FISH] = 24 ; Caption[:FISH] = 'Fishing' ; CaptionNoun[:FISH] = 'Fisherman' ; Profession[:FISH] = :FISHERMAN ; Labor[:FISH] = :FISH
    ENUM[25] = :SMELT ; NUME[:SMELT] = 25 ; Caption[:SMELT] = 'Furnace Operation' ; CaptionNoun[:SMELT] = 'Furnace Operator' ; Profession[:SMELT] = :FURNACE_OPERATOR ; Labor[:SMELT] = :SMELT
    ENUM[26] = :EXTRACT_STRAND ; NUME[:EXTRACT_STRAND] = 26 ; Caption[:EXTRACT_STRAND] = 'Strand Extraction' ; CaptionNoun[:EXTRACT_STRAND] = 'Strand Extractor' ; Profession[:EXTRACT_STRAND] = :STRAND_EXTRACTOR ; Labor[:EXTRACT_STRAND] = :EXTRACT_STRAND
    ENUM[27] = :FORGE_WEAPON ; NUME[:FORGE_WEAPON] = 27 ; Caption[:FORGE_WEAPON] = 'Weaponsmithing' ; CaptionNoun[:FORGE_WEAPON] = 'Weaponsmith' ; Profession[:FORGE_WEAPON] = :WEAPONSMITH ; Labor[:FORGE_WEAPON] = :FORGE_WEAPON
    ENUM[28] = :FORGE_ARMOR ; NUME[:FORGE_ARMOR] = 28 ; Caption[:FORGE_ARMOR] = 'Armorsmithing' ; CaptionNoun[:FORGE_ARMOR] = 'Armorsmith' ; Profession[:FORGE_ARMOR] = :ARMORER ; Labor[:FORGE_ARMOR] = :FORGE_ARMOR
    ENUM[29] = :FORGE_FURNITURE ; NUME[:FORGE_FURNITURE] = 29 ; Caption[:FORGE_FURNITURE] = 'Metalsmithing' ; CaptionNoun[:FORGE_FURNITURE] = 'Metalsmith' ; Profession[:FORGE_FURNITURE] = :BLACKSMITH ; Labor[:FORGE_FURNITURE] = :FORGE_FURNITURE
    ENUM[30] = :CUTGEM ; NUME[:CUTGEM] = 30 ; Caption[:CUTGEM] = 'Gem Cutting' ; CaptionNoun[:CUTGEM] = 'Gem Cutter' ; Profession[:CUTGEM] = :GEM_CUTTER ; Labor[:CUTGEM] = :CUT_GEM
    ENUM[31] = :ENCRUSTGEM ; NUME[:ENCRUSTGEM] = 31 ; Caption[:ENCRUSTGEM] = 'Gem Setting' ; CaptionNoun[:ENCRUSTGEM] = 'Gem Setter' ; Profession[:ENCRUSTGEM] = :GEM_SETTER ; Labor[:ENCRUSTGEM] = :ENCRUST_GEM
    ENUM[32] = :WOODCRAFT ; NUME[:WOODCRAFT] = 32 ; Caption[:WOODCRAFT] = 'Wood Crafting' ; CaptionNoun[:WOODCRAFT] = 'Wood Crafter' ; Profession[:WOODCRAFT] = :WOODCRAFTER ; Labor[:WOODCRAFT] = :WOOD_CRAFT
    ENUM[33] = :STONECRAFT ; NUME[:STONECRAFT] = 33 ; Caption[:STONECRAFT] = 'Stone Crafting' ; CaptionNoun[:STONECRAFT] = 'Stone Crafter' ; Profession[:STONECRAFT] = :STONECRAFTER ; Labor[:STONECRAFT] = :STONE_CRAFT
    ENUM[34] = :METALCRAFT ; NUME[:METALCRAFT] = 34 ; Caption[:METALCRAFT] = 'Metal Crafting' ; CaptionNoun[:METALCRAFT] = 'Metal Crafter' ; Profession[:METALCRAFT] = :METALCRAFTER ; Labor[:METALCRAFT] = :METAL_CRAFT
    ENUM[35] = :GLASSMAKER ; NUME[:GLASSMAKER] = 35 ; Caption[:GLASSMAKER] = 'Glassmaking' ; CaptionNoun[:GLASSMAKER] = 'Glassmaker' ; Profession[:GLASSMAKER] = :GLASSMAKER ; Labor[:GLASSMAKER] = :GLASSMAKER
    ENUM[36] = :LEATHERWORK ; NUME[:LEATHERWORK] = 36 ; Caption[:LEATHERWORK] = 'Leatherworkering' ; CaptionNoun[:LEATHERWORK] = 'Leatherworker' ; Profession[:LEATHERWORK] = :LEATHERWORKER ; Labor[:LEATHERWORK] = :LEATHER
    ENUM[37] = :BONECARVE ; NUME[:BONECARVE] = 37 ; Caption[:BONECARVE] = 'Bone Carving' ; CaptionNoun[:BONECARVE] = 'Bone Carver' ; Profession[:BONECARVE] = :BONE_CARVER ; Labor[:BONECARVE] = :BONE_CARVE
    ENUM[38] = :AXE ; NUME[:AXE] = 38 ; Caption[:AXE] = 'Axe' ; CaptionNoun[:AXE] = 'Axeman' ; Profession[:AXE] = :AXEMAN ; Type[:AXE] = :MilitaryWeapon
    ENUM[39] = :SWORD ; NUME[:SWORD] = 39 ; Caption[:SWORD] = 'Sword' ; CaptionNoun[:SWORD] = 'Swordsman' ; Profession[:SWORD] = :SWORDSMAN ; Type[:SWORD] = :MilitaryWeapon
    ENUM[40] = :DAGGER ; NUME[:DAGGER] = 40 ; Caption[:DAGGER] = 'Knife' ; CaptionNoun[:DAGGER] = 'Knife User' ; Type[:DAGGER] = :MilitaryWeapon
    ENUM[41] = :MACE ; NUME[:MACE] = 41 ; Caption[:MACE] = 'Mace' ; CaptionNoun[:MACE] = 'Maceman' ; Profession[:MACE] = :MACEMAN ; Type[:MACE] = :MilitaryWeapon
    ENUM[42] = :HAMMER ; NUME[:HAMMER] = 42 ; Caption[:HAMMER] = 'Hammer' ; CaptionNoun[:HAMMER] = 'Hammerman' ; Profession[:HAMMER] = :HAMMERMAN ; Type[:HAMMER] = :MilitaryWeapon
    ENUM[43] = :SPEAR ; NUME[:SPEAR] = 43 ; Caption[:SPEAR] = 'Spear' ; CaptionNoun[:SPEAR] = 'Spearman' ; Profession[:SPEAR] = :SPEARMAN ; Type[:SPEAR] = :MilitaryWeapon
    ENUM[44] = :CROSSBOW ; NUME[:CROSSBOW] = 44 ; Caption[:CROSSBOW] = 'Crossbow' ; CaptionNoun[:CROSSBOW] = 'Crossbowman' ; Profession[:CROSSBOW] = :CROSSBOWMAN ; Type[:CROSSBOW] = :MilitaryWeapon
    ENUM[45] = :SHIELD ; NUME[:SHIELD] = 45 ; Caption[:SHIELD] = 'Shield' ; CaptionNoun[:SHIELD] = 'Shield User' ; Type[:SHIELD] = :MilitaryDefense
    ENUM[46] = :ARMOR ; NUME[:ARMOR] = 46 ; Caption[:ARMOR] = 'Armor' ; CaptionNoun[:ARMOR] = 'Armor User' ; Type[:ARMOR] = :MilitaryDefense
    ENUM[47] = :SIEGECRAFT ; NUME[:SIEGECRAFT] = 47 ; Caption[:SIEGECRAFT] = 'Siege Engineering' ; CaptionNoun[:SIEGECRAFT] = 'Siege Engineer' ; Profession[:SIEGECRAFT] = :SIEGE_ENGINEER ; Labor[:SIEGECRAFT] = :SIEGECRAFT
    ENUM[48] = :SIEGEOPERATE ; NUME[:SIEGEOPERATE] = 48 ; Caption[:SIEGEOPERATE] = 'Siege Operation' ; CaptionNoun[:SIEGEOPERATE] = 'Siege Operator' ; Profession[:SIEGEOPERATE] = :SIEGE_OPERATOR ; Labor[:SIEGEOPERATE] = :SIEGEOPERATE
    ENUM[49] = :BOWYER ; NUME[:BOWYER] = 49 ; Caption[:BOWYER] = 'Bowmaking' ; CaptionNoun[:BOWYER] = 'Bowyer' ; Profession[:BOWYER] = :BOWYER ; Labor[:BOWYER] = :BOWYER
    ENUM[50] = :PIKE ; NUME[:PIKE] = 50 ; Caption[:PIKE] = 'Pike' ; CaptionNoun[:PIKE] = 'Pikeman' ; Profession[:PIKE] = :PIKEMAN ; Type[:PIKE] = :MilitaryWeapon
    ENUM[51] = :WHIP ; NUME[:WHIP] = 51 ; Caption[:WHIP] = 'Lash' ; CaptionNoun[:WHIP] = 'Lasher' ; Profession[:WHIP] = :LASHER ; Type[:WHIP] = :MilitaryWeapon
    ENUM[52] = :BOW ; NUME[:BOW] = 52 ; Caption[:BOW] = 'Bow' ; CaptionNoun[:BOW] = 'Bowman' ; Profession[:BOW] = :BOWMAN ; Type[:BOW] = :MilitaryWeapon
    ENUM[53] = :BLOWGUN ; NUME[:BLOWGUN] = 53 ; Caption[:BLOWGUN] = 'Blowgun' ; CaptionNoun[:BLOWGUN] = 'Blowgunner' ; Profession[:BLOWGUN] = :BLOWGUNMAN ; Type[:BLOWGUN] = :MilitaryWeapon
    ENUM[54] = :THROW ; NUME[:THROW] = 54 ; Caption[:THROW] = 'Throwing' ; CaptionNoun[:THROW] = 'Thrower' ; Type[:THROW] = :MilitaryAttack
    ENUM[55] = :MECHANICS ; NUME[:MECHANICS] = 55 ; Caption[:MECHANICS] = 'Machinery' ; CaptionNoun[:MECHANICS] = 'Mechanic' ; Profession[:MECHANICS] = :MECHANIC ; Labor[:MECHANICS] = :MECHANIC
    ENUM[56] = :MAGIC_NATURE ; NUME[:MAGIC_NATURE] = 56 ; Caption[:MAGIC_NATURE] = 'Nature' ; CaptionNoun[:MAGIC_NATURE] = 'Druid'
    ENUM[57] = :SNEAK ; NUME[:SNEAK] = 57 ; Caption[:SNEAK] = 'Ambush' ; CaptionNoun[:SNEAK] = 'Ambusher' ; Profession[:SNEAK] = :HUNTER ; Labor[:SNEAK] = :HUNT
    ENUM[58] = :DESIGNBUILDING ; NUME[:DESIGNBUILDING] = 58 ; Caption[:DESIGNBUILDING] = 'Building Design' ; CaptionNoun[:DESIGNBUILDING] = 'Building Designer' ; Profession[:DESIGNBUILDING] = :ARCHITECT ; Labor[:DESIGNBUILDING] = :ARCHITECT
    ENUM[59] = :DRESS_WOUNDS ; NUME[:DRESS_WOUNDS] = 59 ; Caption[:DRESS_WOUNDS] = 'Wound Dressing' ; CaptionNoun[:DRESS_WOUNDS] = 'Wound Dresser' ; Labor[:DRESS_WOUNDS] = :DRESSING_WOUNDS ; Type[:DRESS_WOUNDS] = :Medical
    ENUM[60] = :DIAGNOSE ; NUME[:DIAGNOSE] = 60 ; Caption[:DIAGNOSE] = 'Diagnostics' ; CaptionNoun[:DIAGNOSE] = 'Diagnostician' ; Profession[:DIAGNOSE] = :DIAGNOSER ; Labor[:DIAGNOSE] = :DIAGNOSE ; Type[:DIAGNOSE] = :Medical
    ENUM[61] = :SURGERY ; NUME[:SURGERY] = 61 ; Caption[:SURGERY] = 'Surgery' ; CaptionNoun[:SURGERY] = 'Surgeon' ; Profession[:SURGERY] = :SURGEON ; Labor[:SURGERY] = :SURGERY ; Type[:SURGERY] = :Medical
    ENUM[62] = :SET_BONE ; NUME[:SET_BONE] = 62 ; Caption[:SET_BONE] = 'Bone Setting' ; CaptionNoun[:SET_BONE] = 'Bone Doctor' ; Profession[:SET_BONE] = :BONE_SETTER ; Labor[:SET_BONE] = :BONE_SETTING ; Type[:SET_BONE] = :Medical
    ENUM[63] = :SUTURE ; NUME[:SUTURE] = 63 ; Caption[:SUTURE] = 'Suturing' ; CaptionNoun[:SUTURE] = 'Suturer' ; Profession[:SUTURE] = :SUTURER ; Labor[:SUTURE] = :SUTURING ; Type[:SUTURE] = :Medical
    ENUM[64] = :CRUTCH_WALK ; NUME[:CRUTCH_WALK] = 64 ; Caption[:CRUTCH_WALK] = 'Crutch-walking' ; CaptionNoun[:CRUTCH_WALK] = 'Crutch-walker' ; Type[:CRUTCH_WALK] = :Personal
    ENUM[65] = :WOOD_BURNING ; NUME[:WOOD_BURNING] = 65 ; Caption[:WOOD_BURNING] = 'Wood Burning' ; CaptionNoun[:WOOD_BURNING] = 'Wood Burner' ; Profession[:WOOD_BURNING] = :WOOD_BURNER ; Labor[:WOOD_BURNING] = :BURN_WOOD
    ENUM[66] = :LYE_MAKING ; NUME[:LYE_MAKING] = 66 ; Caption[:LYE_MAKING] = 'Lye Making' ; CaptionNoun[:LYE_MAKING] = 'Lye Maker' ; Profession[:LYE_MAKING] = :LYE_MAKER ; Labor[:LYE_MAKING] = :LYE_MAKING
    ENUM[67] = :SOAP_MAKING ; NUME[:SOAP_MAKING] = 67 ; Caption[:SOAP_MAKING] = 'Soap Making' ; CaptionNoun[:SOAP_MAKING] = 'Soaper' ; Profession[:SOAP_MAKING] = :SOAP_MAKER ; Labor[:SOAP_MAKING] = :SOAP_MAKER
    ENUM[68] = :POTASH_MAKING ; NUME[:POTASH_MAKING] = 68 ; Caption[:POTASH_MAKING] = 'Potash Making' ; CaptionNoun[:POTASH_MAKING] = 'Potash Maker' ; Profession[:POTASH_MAKING] = :POTASH_MAKER ; Labor[:POTASH_MAKING] = :POTASH_MAKING
    ENUM[69] = :DYER ; NUME[:DYER] = 69 ; Caption[:DYER] = 'Dyeing' ; CaptionNoun[:DYER] = 'Dyer' ; Profession[:DYER] = :DYER ; Labor[:DYER] = :DYER
    ENUM[70] = :OPERATE_PUMP ; NUME[:OPERATE_PUMP] = 70 ; Caption[:OPERATE_PUMP] = 'Pump Operation' ; CaptionNoun[:OPERATE_PUMP] = 'Pump Operator' ; Profession[:OPERATE_PUMP] = :PUMP_OPERATOR ; Labor[:OPERATE_PUMP] = :OPERATE_PUMP
    ENUM[71] = :SWIMMING ; NUME[:SWIMMING] = 71 ; Caption[:SWIMMING] = 'Swimming' ; CaptionNoun[:SWIMMING] = 'Swimmer' ; Type[:SWIMMING] = :Personal
    ENUM[72] = :PERSUASION ; NUME[:PERSUASION] = 72 ; Caption[:PERSUASION] = 'Persuasion' ; CaptionNoun[:PERSUASION] = 'Persuader' ; Type[:PERSUASION] = :Social
    ENUM[73] = :NEGOTIATION ; NUME[:NEGOTIATION] = 73 ; Caption[:NEGOTIATION] = 'Negotiation' ; CaptionNoun[:NEGOTIATION] = 'Negotiator' ; Type[:NEGOTIATION] = :Social
    ENUM[74] = :JUDGING_INTENT ; NUME[:JUDGING_INTENT] = 74 ; Caption[:JUDGING_INTENT] = 'Judging Intent' ; CaptionNoun[:JUDGING_INTENT] = 'Judge of Intent' ; Type[:JUDGING_INTENT] = :Social
    ENUM[75] = :APPRAISAL ; NUME[:APPRAISAL] = 75 ; Caption[:APPRAISAL] = 'Appraisal' ; CaptionNoun[:APPRAISAL] = 'Appraiser' ; Profession[:APPRAISAL] = :TRADER
    ENUM[76] = :ORGANIZATION ; NUME[:ORGANIZATION] = 76 ; Caption[:ORGANIZATION] = 'Organization' ; CaptionNoun[:ORGANIZATION] = 'Organizer' ; Profession[:ORGANIZATION] = :ADMINISTRATOR
    ENUM[77] = :RECORD_KEEPING ; NUME[:RECORD_KEEPING] = 77 ; Caption[:RECORD_KEEPING] = 'Record Keeping' ; CaptionNoun[:RECORD_KEEPING] = 'Record Keeper' ; Profession[:RECORD_KEEPING] = :CLERK
    ENUM[78] = :LYING ; NUME[:LYING] = 78 ; Caption[:LYING] = 'Lying' ; CaptionNoun[:LYING] = 'Liar' ; Type[:LYING] = :Social
    ENUM[79] = :INTIMIDATION ; NUME[:INTIMIDATION] = 79 ; Caption[:INTIMIDATION] = 'Intimidation' ; CaptionNoun[:INTIMIDATION] = 'Intimidator' ; Type[:INTIMIDATION] = :Social
    ENUM[80] = :CONVERSATION ; NUME[:CONVERSATION] = 80 ; Caption[:CONVERSATION] = 'Conversation' ; CaptionNoun[:CONVERSATION] = 'Conversationalist' ; Type[:CONVERSATION] = :Social
    ENUM[81] = :COMEDY ; NUME[:COMEDY] = 81 ; Caption[:COMEDY] = 'Comedy' ; CaptionNoun[:COMEDY] = 'Comedian' ; Type[:COMEDY] = :Social
    ENUM[82] = :FLATTERY ; NUME[:FLATTERY] = 82 ; Caption[:FLATTERY] = 'Flattery' ; CaptionNoun[:FLATTERY] = 'Flatterer' ; Type[:FLATTERY] = :Social
    ENUM[83] = :CONSOLE ; NUME[:CONSOLE] = 83 ; Caption[:CONSOLE] = 'Consoling' ; CaptionNoun[:CONSOLE] = 'Consoler' ; Type[:CONSOLE] = :Social
    ENUM[84] = :PACIFY ; NUME[:PACIFY] = 84 ; Caption[:PACIFY] = 'Pacification' ; CaptionNoun[:PACIFY] = 'Pacifier' ; Type[:PACIFY] = :Social
    ENUM[85] = :TRACKING ; NUME[:TRACKING] = 85 ; Caption[:TRACKING] = 'Tracking' ; CaptionNoun[:TRACKING] = 'Tracker' ; Type[:TRACKING] = :Personal
    ENUM[86] = :KNOWLEDGE_ACQUISITION ; NUME[:KNOWLEDGE_ACQUISITION] = 86 ; Caption[:KNOWLEDGE_ACQUISITION] = 'Studying' ; CaptionNoun[:KNOWLEDGE_ACQUISITION] = 'Student' ; Type[:KNOWLEDGE_ACQUISITION] = :Social
    ENUM[87] = :CONCENTRATION ; NUME[:CONCENTRATION] = 87 ; Caption[:CONCENTRATION] = 'Concentration' ; CaptionNoun[:CONCENTRATION] = 'Concentration' ; Type[:CONCENTRATION] = :Personal
    ENUM[88] = :DISCIPLINE ; NUME[:DISCIPLINE] = 88 ; Caption[:DISCIPLINE] = 'Discipline' ; CaptionNoun[:DISCIPLINE] = 'Discipline' ; Type[:DISCIPLINE] = :Personal
    ENUM[89] = :SITUATIONAL_AWARENESS ; NUME[:SITUATIONAL_AWARENESS] = 89 ; Caption[:SITUATIONAL_AWARENESS] = 'Observation' ; CaptionNoun[:SITUATIONAL_AWARENESS] = 'Observer' ; Type[:SITUATIONAL_AWARENESS] = :Personal
    ENUM[90] = :WRITING ; NUME[:WRITING] = 90 ; Caption[:WRITING] = 'Writing' ; CaptionNoun[:WRITING] = 'Wordsmith' ; Type[:WRITING] = :Cultural
    ENUM[91] = :PROSE ; NUME[:PROSE] = 91 ; Caption[:PROSE] = 'Prose' ; CaptionNoun[:PROSE] = 'Writer' ; Type[:PROSE] = :Cultural
    ENUM[92] = :POETRY ; NUME[:POETRY] = 92 ; Caption[:POETRY] = 'Poetry' ; CaptionNoun[:POETRY] = 'Poet' ; Profession[:POETRY] = :POET ; Type[:POETRY] = :Cultural
    ENUM[93] = :READING ; NUME[:READING] = 93 ; Caption[:READING] = 'Reading' ; CaptionNoun[:READING] = 'Reader' ; Type[:READING] = :Cultural
    ENUM[94] = :SPEAKING ; NUME[:SPEAKING] = 94 ; Caption[:SPEAKING] = 'Speaking' ; CaptionNoun[:SPEAKING] = 'Speaker' ; Type[:SPEAKING] = :Cultural
    ENUM[95] = :COORDINATION ; NUME[:COORDINATION] = 95 ; Caption[:COORDINATION] = 'Coordination' ; CaptionNoun[:COORDINATION] = 'Coordination' ; Type[:COORDINATION] = :Personal
    ENUM[96] = :BALANCE ; NUME[:BALANCE] = 96 ; Caption[:BALANCE] = 'Balance' ; CaptionNoun[:BALANCE] = 'Balance' ; Type[:BALANCE] = :Personal
    ENUM[97] = :LEADERSHIP ; NUME[:LEADERSHIP] = 97 ; Caption[:LEADERSHIP] = 'Leadership' ; CaptionNoun[:LEADERSHIP] = 'Leader' ; Type[:LEADERSHIP] = :Social
    ENUM[98] = :TEACHING ; NUME[:TEACHING] = 98 ; Caption[:TEACHING] = 'Teaching' ; CaptionNoun[:TEACHING] = 'Teacher' ; Type[:TEACHING] = :Social
    ENUM[99] = :MELEE_COMBAT ; NUME[:MELEE_COMBAT] = 99 ; Caption[:MELEE_COMBAT] = 'Fighting' ; CaptionNoun[:MELEE_COMBAT] = 'Fighter' ; Type[:MELEE_COMBAT] = :MilitaryAttack
    ENUM[100] = :RANGED_COMBAT ; NUME[:RANGED_COMBAT] = 100 ; Caption[:RANGED_COMBAT] = 'Archery' ; CaptionNoun[:RANGED_COMBAT] = 'Archer' ; Type[:RANGED_COMBAT] = :MilitaryAttack
    ENUM[101] = :WRESTLING ; NUME[:WRESTLING] = 101 ; Caption[:WRESTLING] = 'Wrestling' ; CaptionNoun[:WRESTLING] = 'Wrestler' ; Profession[:WRESTLING] = :WRESTLER ; Type[:WRESTLING] = :MilitaryUnarmed
    ENUM[102] = :BITE ; NUME[:BITE] = 102 ; Caption[:BITE] = 'Biting' ; CaptionNoun[:BITE] = 'Biter' ; Type[:BITE] = :MilitaryUnarmed
    ENUM[103] = :GRASP_STRIKE ; NUME[:GRASP_STRIKE] = 103 ; Caption[:GRASP_STRIKE] = 'Striking' ; CaptionNoun[:GRASP_STRIKE] = 'Striker' ; Type[:GRASP_STRIKE] = :MilitaryUnarmed
    ENUM[104] = :STANCE_STRIKE ; NUME[:STANCE_STRIKE] = 104 ; Caption[:STANCE_STRIKE] = 'Kicking' ; CaptionNoun[:STANCE_STRIKE] = 'Kicker' ; Type[:STANCE_STRIKE] = :MilitaryUnarmed
    ENUM[105] = :DODGING ; NUME[:DODGING] = 105 ; Caption[:DODGING] = 'Dodging' ; CaptionNoun[:DODGING] = 'Dodger' ; Type[:DODGING] = :MilitaryDefense
    ENUM[106] = :MISC_WEAPON ; NUME[:MISC_WEAPON] = 106 ; Caption[:MISC_WEAPON] = 'Misc. Object' ; CaptionNoun[:MISC_WEAPON] = 'Misc. Object User' ; Type[:MISC_WEAPON] = :MilitaryWeapon
    ENUM[107] = :KNAPPING ; NUME[:KNAPPING] = 107 ; Caption[:KNAPPING] = 'Knapping' ; CaptionNoun[:KNAPPING] = 'Knapper' ; Type[:KNAPPING] = :MilitaryMisc
    ENUM[108] = :MILITARY_TACTICS ; NUME[:MILITARY_TACTICS] = 108 ; Caption[:MILITARY_TACTICS] = 'Military Tactics' ; CaptionNoun[:MILITARY_TACTICS] = 'Tactician'
    ENUM[109] = :SHEARING ; NUME[:SHEARING] = 109 ; Caption[:SHEARING] = 'Shearing' ; CaptionNoun[:SHEARING] = 'Shearer' ; Profession[:SHEARING] = :SHEARER ; Labor[:SHEARING] = :SHEARER
    ENUM[110] = :SPINNING ; NUME[:SPINNING] = 110 ; Caption[:SPINNING] = 'Spinning' ; CaptionNoun[:SPINNING] = 'Spinner' ; Profession[:SPINNING] = :SPINNER ; Labor[:SPINNING] = :SPINNER
    ENUM[111] = :POTTERY ; NUME[:POTTERY] = 111 ; Caption[:POTTERY] = 'Pottery' ; CaptionNoun[:POTTERY] = 'Potter' ; Profession[:POTTERY] = :POTTER ; Labor[:POTTERY] = :POTTERY
    ENUM[112] = :GLAZING ; NUME[:GLAZING] = 112 ; Caption[:GLAZING] = 'Glazing' ; CaptionNoun[:GLAZING] = 'Glazer' ; Profession[:GLAZING] = :GLAZER ; Labor[:GLAZING] = :GLAZING
    ENUM[113] = :PRESSING ; NUME[:PRESSING] = 113 ; Caption[:PRESSING] = 'Pressing' ; CaptionNoun[:PRESSING] = 'Presser' ; Profession[:PRESSING] = :PRESSER ; Labor[:PRESSING] = :PRESSING
    ENUM[114] = :BEEKEEPING ; NUME[:BEEKEEPING] = 114 ; Caption[:BEEKEEPING] = 'Beekeeping' ; CaptionNoun[:BEEKEEPING] = 'Beekeeper' ; Profession[:BEEKEEPING] = :BEEKEEPER ; Labor[:BEEKEEPING] = :BEEKEEPING
    ENUM[115] = :WAX_WORKING ; NUME[:WAX_WORKING] = 115 ; Caption[:WAX_WORKING] = 'Wax Working' ; CaptionNoun[:WAX_WORKING] = 'Wax Worker' ; Profession[:WAX_WORKING] = :WAX_WORKER ; Labor[:WAX_WORKING] = :WAX_WORKING
    ENUM[116] = :CLIMBING ; NUME[:CLIMBING] = 116 ; Caption[:CLIMBING] = 'Climbing' ; CaptionNoun[:CLIMBING] = 'Climber' ; Type[:CLIMBING] = :Personal
    ENUM[117] = :GELD ; NUME[:GELD] = 117 ; Caption[:GELD] = 'Gelding' ; CaptionNoun[:GELD] = 'Gelder' ; Profession[:GELD] = :GELDER ; Labor[:GELD] = :GELD
    ENUM[118] = :DANCE ; NUME[:DANCE] = 118 ; Caption[:DANCE] = 'Dance' ; CaptionNoun[:DANCE] = 'Dancer' ; Profession[:DANCE] = :DANCER
    ENUM[119] = :MAKE_MUSIC ; NUME[:MAKE_MUSIC] = 119 ; Caption[:MAKE_MUSIC] = 'Music' ; CaptionNoun[:MAKE_MUSIC] = 'Musician' ; Profession[:MAKE_MUSIC] = :BARD
    ENUM[120] = :SING_MUSIC ; NUME[:SING_MUSIC] = 120 ; Caption[:SING_MUSIC] = 'Singing' ; CaptionNoun[:SING_MUSIC] = 'Singer' ; Profession[:SING_MUSIC] = :BARD
    ENUM[121] = :PLAY_KEYBOARD_INSTRUMENT ; NUME[:PLAY_KEYBOARD_INSTRUMENT] = 121 ; Caption[:PLAY_KEYBOARD_INSTRUMENT] = 'Keyboard Instrument' ; CaptionNoun[:PLAY_KEYBOARD_INSTRUMENT] = 'Keyboardist' ; Profession[:PLAY_KEYBOARD_INSTRUMENT] = :BARD
    ENUM[122] = :PLAY_STRINGED_INSTRUMENT ; NUME[:PLAY_STRINGED_INSTRUMENT] = 122 ; Caption[:PLAY_STRINGED_INSTRUMENT] = 'Stringed Instrument' ; CaptionNoun[:PLAY_STRINGED_INSTRUMENT] = 'Stringed Instrumentalist' ; Profession[:PLAY_STRINGED_INSTRUMENT] = :BARD
    ENUM[123] = :PLAY_WIND_INSTRUMENT ; NUME[:PLAY_WIND_INSTRUMENT] = 123 ; Caption[:PLAY_WIND_INSTRUMENT] = 'Wind Instrument' ; CaptionNoun[:PLAY_WIND_INSTRUMENT] = 'Wind Instrumentalist' ; Profession[:PLAY_WIND_INSTRUMENT] = :BARD
    ENUM[124] = :PLAY_PERCUSSION_INSTRUMENT ; NUME[:PLAY_PERCUSSION_INSTRUMENT] = 124 ; Caption[:PLAY_PERCUSSION_INSTRUMENT] = 'Percussion Instrument' ; CaptionNoun[:PLAY_PERCUSSION_INSTRUMENT] = 'Percussionist' ; Profession[:PLAY_PERCUSSION_INSTRUMENT] = :BARD
    ENUM[125] = :CRITICAL_THINKING ; NUME[:CRITICAL_THINKING] = 125 ; Caption[:CRITICAL_THINKING] = 'Critical Thinking' ; CaptionNoun[:CRITICAL_THINKING] = 'Critical Thinker'
    ENUM[126] = :LOGIC ; NUME[:LOGIC] = 126 ; Caption[:LOGIC] = 'Logic' ; CaptionNoun[:LOGIC] = 'Logician'
    ENUM[127] = :MATHEMATICS ; NUME[:MATHEMATICS] = 127 ; Caption[:MATHEMATICS] = 'Mathematics' ; CaptionNoun[:MATHEMATICS] = 'Mathematician'
    ENUM[128] = :ASTRONOMY ; NUME[:ASTRONOMY] = 128 ; Caption[:ASTRONOMY] = 'Astronomy' ; CaptionNoun[:ASTRONOMY] = 'Astronomer'
    ENUM[129] = :CHEMISTRY ; NUME[:CHEMISTRY] = 129 ; Caption[:CHEMISTRY] = 'Chemistry' ; CaptionNoun[:CHEMISTRY] = 'Chemist'
    ENUM[130] = :GEOGRAPHY ; NUME[:GEOGRAPHY] = 130 ; Caption[:GEOGRAPHY] = 'Geography' ; CaptionNoun[:GEOGRAPHY] = 'Geographer'
    ENUM[131] = :OPTICS_ENGINEER ; NUME[:OPTICS_ENGINEER] = 131 ; Caption[:OPTICS_ENGINEER] = 'Optics Engineer' ; CaptionNoun[:OPTICS_ENGINEER] = 'Optics Engineer'
    ENUM[132] = :FLUID_ENGINEER ; NUME[:FLUID_ENGINEER] = 132 ; Caption[:FLUID_ENGINEER] = 'Fluid Engineer' ; CaptionNoun[:FLUID_ENGINEER] = 'Fluid Engineer'
    ENUM[133] = :PAPERMAKING ; NUME[:PAPERMAKING] = 133 ; Caption[:PAPERMAKING] = 'Papermaking' ; CaptionNoun[:PAPERMAKING] = 'Papermaker' ; Profession[:PAPERMAKING] = :PAPERMAKER ; Labor[:PAPERMAKING] = :PAPERMAKING
    ENUM[134] = :BOOKBINDING ; NUME[:BOOKBINDING] = 134 ; Caption[:BOOKBINDING] = 'Bookbinding' ; CaptionNoun[:BOOKBINDING] = 'Bookbinder' ; Profession[:BOOKBINDING] = :BOOKBINDER ; Labor[:BOOKBINDING] = :BOOKBINDING
    ENUM[135] = :INTRIGUE ; NUME[:INTRIGUE] = 135 ; Caption[:INTRIGUE] = 'Intrigue' ; CaptionNoun[:INTRIGUE] = 'Schemer'
    ENUM[136] = :RIDING ; NUME[:RIDING] = 136 ; Caption[:RIDING] = 'Riding' ; CaptionNoun[:RIDING] = 'Rider'
end

class JobSkillClass < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Normal ; NUME[:Normal] = 0
    ENUM[1] = :Medical ; NUME[:Medical] = 1
    ENUM[2] = :Personal ; NUME[:Personal] = 2
    ENUM[3] = :Social ; NUME[:Social] = 3
    ENUM[4] = :Cultural ; NUME[:Cultural] = 4
    ENUM[5] = :MilitaryWeapon ; NUME[:MilitaryWeapon] = 5
    ENUM[6] = :MilitaryUnarmed ; NUME[:MilitaryUnarmed] = 6
    ENUM[7] = :MilitaryAttack ; NUME[:MilitaryAttack] = 7
    ENUM[8] = :MilitaryDefense ; NUME[:MilitaryDefense] = 8
    ENUM[9] = :MilitaryMisc ; NUME[:MilitaryMisc] = 9
end

class JobSubtypeSurgery < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Surgery ; NUME[:Surgery] = 0
    ENUM[1] = :StopBleeding ; NUME[:StopBleeding] = 1
    ENUM[2] = :RepairCompoundFracture ; NUME[:RepairCompoundFracture] = 2
    ENUM[3] = :RemoveRottenTissue ; NUME[:RemoveRottenTissue] = 3
end

class JobType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    Type = Hash.new(:Misc)
    Labor = Hash.new(:NONE)
    Item = Hash.new(:NONE)
    PossibleItem = Hash.new { |h, k| h[k] = [] }
    Material = Hash.new
    Skill = Hash.new(:NONE)
    SkillStone = Hash.new(:NONE)
    SkillWood = Hash.new(:NONE)
    SkillMetal = Hash.new(:NONE)
    IsDesignation = Hash.new(false)
    TagOpHistory = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :CarveFortification ; NUME[:CarveFortification] = 0 ; Caption[:CarveFortification] = 'Carve Fortification' ; Type[:CarveFortification] = :Digging ; Skill[:CarveFortification] = :MINING ; IsDesignation[:CarveFortification] = true
    ENUM[1] = :DetailWall ; NUME[:DetailWall] = 1 ; Caption[:DetailWall] = 'Detail Wall' ; Type[:DetailWall] = :Building ; Skill[:DetailWall] = :DETAILSTONE ; IsDesignation[:DetailWall] = true
    ENUM[2] = :DetailFloor ; NUME[:DetailFloor] = 2 ; Caption[:DetailFloor] = 'Detail Floor' ; Type[:DetailFloor] = :Building ; Skill[:DetailFloor] = :DETAILSTONE ; IsDesignation[:DetailFloor] = true
    ENUM[3] = :Dig ; NUME[:Dig] = 3 ; Caption[:Dig] = 'Dig' ; Type[:Dig] = :Digging ; Skill[:Dig] = :MINING ; IsDesignation[:Dig] = true
    ENUM[4] = :CarveUpwardStaircase ; NUME[:CarveUpwardStaircase] = 4 ; Caption[:CarveUpwardStaircase] = 'Carve Upward Staircase' ; Type[:CarveUpwardStaircase] = :Digging ; Skill[:CarveUpwardStaircase] = :MINING ; IsDesignation[:CarveUpwardStaircase] = true
    ENUM[5] = :CarveDownwardStaircase ; NUME[:CarveDownwardStaircase] = 5 ; Caption[:CarveDownwardStaircase] = 'Carve Downward Staircase' ; Type[:CarveDownwardStaircase] = :Digging ; Skill[:CarveDownwardStaircase] = :MINING ; IsDesignation[:CarveDownwardStaircase] = true
    ENUM[6] = :CarveUpDownStaircase ; NUME[:CarveUpDownStaircase] = 6 ; Caption[:CarveUpDownStaircase] = 'Carve Up/Down Staircase' ; Type[:CarveUpDownStaircase] = :Digging ; Skill[:CarveUpDownStaircase] = :MINING ; IsDesignation[:CarveUpDownStaircase] = true
    ENUM[7] = :CarveRamp ; NUME[:CarveRamp] = 7 ; Caption[:CarveRamp] = 'Carve Ramp' ; Type[:CarveRamp] = :Digging ; Skill[:CarveRamp] = :MINING ; IsDesignation[:CarveRamp] = true
    ENUM[8] = :DigChannel ; NUME[:DigChannel] = 8 ; Caption[:DigChannel] = 'Dig Channel' ; Type[:DigChannel] = :Digging ; Skill[:DigChannel] = :MINING ; IsDesignation[:DigChannel] = true
    ENUM[9] = :FellTree ; NUME[:FellTree] = 9 ; Caption[:FellTree] = 'Fell Tree' ; Type[:FellTree] = :Gathering ; Skill[:FellTree] = :WOODCUTTING ; Item[:FellTree] = :WOOD ; IsDesignation[:FellTree] = true
    ENUM[10] = :GatherPlants ; NUME[:GatherPlants] = 10 ; Caption[:GatherPlants] = 'Gather Plants' ; Type[:GatherPlants] = :Gathering ; Skill[:GatherPlants] = :HERBALISM ; Item[:GatherPlants] = :PLANT ; IsDesignation[:GatherPlants] = true
    ENUM[11] = :RemoveConstruction ; NUME[:RemoveConstruction] = 11 ; Caption[:RemoveConstruction] = 'Remove Construction' ; Type[:RemoveConstruction] = :Building ; Labor[:RemoveConstruction] = :REMOVE_CONSTRUCTION ; IsDesignation[:RemoveConstruction] = true
    ENUM[12] = :CollectWebs ; NUME[:CollectWebs] = 12 ; Caption[:CollectWebs] = 'Collect Webs' ; Type[:CollectWebs] = :Gathering ; Skill[:CollectWebs] = :WEAVING ; Item[:CollectWebs] = :THREAD ; Material[:CollectWebs] = 'silk'
    ENUM[13] = :BringItemToDepot ; NUME[:BringItemToDepot] = 13 ; Caption[:BringItemToDepot] = 'Bring Item to Depot' ; Type[:BringItemToDepot] = :Hauling ; Labor[:BringItemToDepot] = :HAUL_TRADE
    ENUM[14] = :BringItemToShop ; NUME[:BringItemToShop] = 14 ; Caption[:BringItemToShop] = 'Bring Item to Shop' ; Type[:BringItemToShop] = :Hauling ; Labor[:BringItemToShop] = :HAUL_ITEM
    ENUM[15] = :Eat ; NUME[:Eat] = 15 ; Caption[:Eat] = 'Eat' ; Type[:Eat] = :LifeSupport
    ENUM[16] = :GetProvisions ; NUME[:GetProvisions] = 16 ; Caption[:GetProvisions] = 'Get Provisions' ; Type[:GetProvisions] = :LifeSupport
    ENUM[17] = :Drink ; NUME[:Drink] = 17 ; Caption[:Drink] = 'Drink' ; Type[:Drink] = :LifeSupport
    ENUM[18] = :Drink2 ; NUME[:Drink2] = 18 ; Caption[:Drink2] = 'Drink' ; Type[:Drink2] = :LifeSupport
    ENUM[19] = :FillWaterskin ; NUME[:FillWaterskin] = 19 ; Caption[:FillWaterskin] = 'Fill Waterskin' ; Type[:FillWaterskin] = :LifeSupport
    ENUM[20] = :FillWaterskin2 ; NUME[:FillWaterskin2] = 20 ; Caption[:FillWaterskin2] = 'Fill Waterskin' ; Type[:FillWaterskin2] = :LifeSupport
    ENUM[21] = :Sleep ; NUME[:Sleep] = 21 ; Caption[:Sleep] = 'Sleep' ; Type[:Sleep] = :LifeSupport
    ENUM[22] = :CollectSand ; NUME[:CollectSand] = 22 ; Caption[:CollectSand] = 'Collect Sand' ; Type[:CollectSand] = :Gathering ; Labor[:CollectSand] = :HAUL_ITEM ; Item[:CollectSand] = :POWDER_MISC ; Material[:CollectSand] = 'sand'
    ENUM[23] = :Fish ; NUME[:Fish] = 23 ; Caption[:Fish] = 'Fish' ; Type[:Fish] = :Gathering ; Skill[:Fish] = :FISH ; Item[:Fish] = :FISH_RAW
    ENUM[24] = :Hunt ; NUME[:Hunt] = 24 ; Caption[:Hunt] = 'Hunt' ; Type[:Hunt] = :Gathering ; Skill[:Hunt] = :SNEAK ; Item[:Hunt] = :CORPSE
    ENUM[25] = :HuntVermin ; NUME[:HuntVermin] = 25 ; Caption[:HuntVermin] = 'Hunt for Small Creature' ; Type[:HuntVermin] = :Gathering ; Skill[:HuntVermin] = :TRAPPING ; Item[:HuntVermin] = :REMAINS
    ENUM[26] = :Kidnap ; NUME[:Kidnap] = 26 ; Caption[:Kidnap] = 'Kidnap' ; Type[:Kidnap] = :Crime
    ENUM[27] = :BeatCriminal ; NUME[:BeatCriminal] = 27 ; Caption[:BeatCriminal] = 'Beat Criminal' ; Type[:BeatCriminal] = :LawEnforcement
    ENUM[28] = :StartingFistFight ; NUME[:StartingFistFight] = 28 ; Caption[:StartingFistFight] = 'Starting Fist Fight' ; Type[:StartingFistFight] = :Crime
    ENUM[29] = :CollectTaxes ; NUME[:CollectTaxes] = 29 ; Caption[:CollectTaxes] = 'Collect Taxes' ; Type[:CollectTaxes] = :LawEnforcement
    ENUM[30] = :GuardTaxCollector ; NUME[:GuardTaxCollector] = 30 ; Caption[:GuardTaxCollector] = 'Guard Tax Collector' ; Type[:GuardTaxCollector] = :LawEnforcement
    ENUM[31] = :CatchLiveLandAnimal ; NUME[:CatchLiveLandAnimal] = 31 ; Caption[:CatchLiveLandAnimal] = 'Catch Live Land Animal' ; Type[:CatchLiveLandAnimal] = :Gathering ; Skill[:CatchLiveLandAnimal] = :TRAPPING ; Item[:CatchLiveLandAnimal] = :VERMIN
    ENUM[32] = :CatchLiveFish ; NUME[:CatchLiveFish] = 32 ; Caption[:CatchLiveFish] = 'Catch Live Fish' ; Type[:CatchLiveFish] = :Gathering ; Skill[:CatchLiveFish] = :FISH ; Item[:CatchLiveFish] = :VERMIN
    ENUM[33] = :ReturnKill ; NUME[:ReturnKill] = 33 ; Caption[:ReturnKill] = 'Return Kill' ; Type[:ReturnKill] = :Hauling
    ENUM[34] = :CheckChest ; NUME[:CheckChest] = 34 ; Caption[:CheckChest] = 'Check Chest' ; Type[:CheckChest] = :TidyUp
    ENUM[35] = :StoreOwnedItem ; NUME[:StoreOwnedItem] = 35 ; Caption[:StoreOwnedItem] = 'Store Owned Item' ; Type[:StoreOwnedItem] = :TidyUp
    ENUM[36] = :PlaceItemInTomb ; NUME[:PlaceItemInTomb] = 36 ; Caption[:PlaceItemInTomb] = 'Place Item in Tomb' ; Type[:PlaceItemInTomb] = :Hauling ; Labor[:PlaceItemInTomb] = :HAUL_BODY
    ENUM[37] = :StoreItemInStockpile ; NUME[:StoreItemInStockpile] = 37 ; Caption[:StoreItemInStockpile] = 'Store Item in Stockpile' ; Type[:StoreItemInStockpile] = :Hauling
    ENUM[38] = :StoreItemInBag ; NUME[:StoreItemInBag] = 38 ; Caption[:StoreItemInBag] = 'Store Item in Bag' ; Type[:StoreItemInBag] = :Hauling
    ENUM[39] = :StoreItemInHospital ; NUME[:StoreItemInHospital] = 39 ; Caption[:StoreItemInHospital] = 'Store Item in Hospital' ; Type[:StoreItemInHospital] = :Hauling
    ENUM[40] = :StoreItemInLocation ; NUME[:StoreItemInLocation] = 40 ; Caption[:StoreItemInLocation] = 'Store Item In Location' ; Type[:StoreItemInLocation] = :Hauling
    ENUM[42] = :StoreWeapon ; NUME[:StoreWeapon] = 42 ; Caption[:StoreWeapon] = 'Store Weapon' ; Type[:StoreWeapon] = :Hauling
    ENUM[43] = :StoreArmor ; NUME[:StoreArmor] = 43 ; Caption[:StoreArmor] = 'Store Armor' ; Type[:StoreArmor] = :Hauling
    ENUM[44] = :StoreItemInBarrel ; NUME[:StoreItemInBarrel] = 44 ; Caption[:StoreItemInBarrel] = 'Store Item in Barrel' ; Type[:StoreItemInBarrel] = :Hauling
    ENUM[45] = :StoreItemInBin ; NUME[:StoreItemInBin] = 45 ; Caption[:StoreItemInBin] = 'Store Item in Bin' ; Type[:StoreItemInBin] = :Hauling
    ENUM[46] = :SeekArtifact ; NUME[:SeekArtifact] = 46 ; Caption[:SeekArtifact] = 'Seek Artifact'
    ENUM[47] = :SeekInfant ; NUME[:SeekInfant] = 47 ; Caption[:SeekInfant] = 'Seek Infant' ; Type[:SeekInfant] = :LifeSupport
    ENUM[48] = :AttendParty ; NUME[:AttendParty] = 48 ; Caption[:AttendParty] = 'Attend Party' ; Type[:AttendParty] = :Leisure
    ENUM[49] = :GoShopping ; NUME[:GoShopping] = 49 ; Caption[:GoShopping] = 'Go Shopping' ; Type[:GoShopping] = :LifeSupport
    ENUM[50] = :GoShopping2 ; NUME[:GoShopping2] = 50 ; Caption[:GoShopping2] = 'Go Shopping' ; Type[:GoShopping2] = :LifeSupport
    ENUM[51] = :Clean ; NUME[:Clean] = 51 ; Caption[:Clean] = 'Clean' ; Type[:Clean] = :TidyUp
    ENUM[52] = :Rest ; NUME[:Rest] = 52 ; Caption[:Rest] = 'Rest' ; Type[:Rest] = :Leisure
    ENUM[53] = :PickupEquipment ; NUME[:PickupEquipment] = 53 ; Caption[:PickupEquipment] = 'Pickup Equipment' ; Type[:PickupEquipment] = :LifeSupport
    ENUM[54] = :DumpItem ; NUME[:DumpItem] = 54 ; Caption[:DumpItem] = 'Dump Item' ; Type[:DumpItem] = :Hauling ; Labor[:DumpItem] = :HAUL_REFUSE
    ENUM[55] = :StrangeMoodCrafter ; NUME[:StrangeMoodCrafter] = 55 ; Caption[:StrangeMoodCrafter] = 'Strange Mood (Crafter)' ; Type[:StrangeMoodCrafter] = :StrangeMood
    ENUM[56] = :StrangeMoodJeweller ; NUME[:StrangeMoodJeweller] = 56 ; Caption[:StrangeMoodJeweller] = 'Strange Mood (Jeweller)' ; Type[:StrangeMoodJeweller] = :StrangeMood
    ENUM[57] = :StrangeMoodForge ; NUME[:StrangeMoodForge] = 57 ; Caption[:StrangeMoodForge] = 'Strange Mood (Forge)' ; Type[:StrangeMoodForge] = :StrangeMood
    ENUM[58] = :StrangeMoodMagmaForge ; NUME[:StrangeMoodMagmaForge] = 58 ; Caption[:StrangeMoodMagmaForge] = 'Strange Mood (Magma Forge)' ; Type[:StrangeMoodMagmaForge] = :StrangeMood
    ENUM[59] = :StrangeMoodBrooding ; NUME[:StrangeMoodBrooding] = 59 ; Caption[:StrangeMoodBrooding] = 'Strange Mood (Brooding)' ; Type[:StrangeMoodBrooding] = :StrangeMood
    ENUM[60] = :StrangeMoodFell ; NUME[:StrangeMoodFell] = 60 ; Caption[:StrangeMoodFell] = 'Strange Mood (Fell)' ; Type[:StrangeMoodFell] = :StrangeMood
    ENUM[61] = :StrangeMoodCarpenter ; NUME[:StrangeMoodCarpenter] = 61 ; Caption[:StrangeMoodCarpenter] = 'Strange Mood (Carpenter)' ; Type[:StrangeMoodCarpenter] = :StrangeMood
    ENUM[62] = :StrangeMoodMason ; NUME[:StrangeMoodMason] = 62 ; Caption[:StrangeMoodMason] = 'Strange Mood (Mason)' ; Type[:StrangeMoodMason] = :StrangeMood
    ENUM[63] = :StrangeMoodBowyer ; NUME[:StrangeMoodBowyer] = 63 ; Caption[:StrangeMoodBowyer] = 'Strange Mood (Bowyer)' ; Type[:StrangeMoodBowyer] = :StrangeMood
    ENUM[64] = :StrangeMoodTanner ; NUME[:StrangeMoodTanner] = 64 ; Caption[:StrangeMoodTanner] = 'Strange Mood (Leather)' ; Type[:StrangeMoodTanner] = :StrangeMood
    ENUM[65] = :StrangeMoodWeaver ; NUME[:StrangeMoodWeaver] = 65 ; Caption[:StrangeMoodWeaver] = 'Strange Mood (Clothier)' ; Type[:StrangeMoodWeaver] = :StrangeMood
    ENUM[66] = :StrangeMoodGlassmaker ; NUME[:StrangeMoodGlassmaker] = 66 ; Caption[:StrangeMoodGlassmaker] = 'Strange Mood (Glassmaker)' ; Type[:StrangeMoodGlassmaker] = :StrangeMood
    ENUM[67] = :StrangeMoodMechanics ; NUME[:StrangeMoodMechanics] = 67 ; Caption[:StrangeMoodMechanics] = 'Strange Mood (Mechanics)' ; Type[:StrangeMoodMechanics] = :StrangeMood
    ENUM[68] = :ConstructBuilding ; NUME[:ConstructBuilding] = 68 ; Caption[:ConstructBuilding] = 'Construct Building' ; Type[:ConstructBuilding] = :Building
    ENUM[69] = :ConstructDoor ; NUME[:ConstructDoor] = 69 ; Caption[:ConstructDoor] = 'Construct Door' ; Type[:ConstructDoor] = :Manufacture ; Item[:ConstructDoor] = :DOOR
    ENUM[70] = :ConstructFloodgate ; NUME[:ConstructFloodgate] = 70 ; Caption[:ConstructFloodgate] = 'Construct Floodgate' ; Type[:ConstructFloodgate] = :Manufacture ; Item[:ConstructFloodgate] = :FLOODGATE
    ENUM[71] = :ConstructBed ; NUME[:ConstructBed] = 71 ; Caption[:ConstructBed] = 'Construct Bed' ; Type[:ConstructBed] = :Manufacture ; Item[:ConstructBed] = :BED
    ENUM[72] = :ConstructThrone ; NUME[:ConstructThrone] = 72 ; Caption[:ConstructThrone] = 'Construct Throne' ; Type[:ConstructThrone] = :Manufacture ; Item[:ConstructThrone] = :CHAIR
    ENUM[73] = :ConstructCoffin ; NUME[:ConstructCoffin] = 73 ; Caption[:ConstructCoffin] = 'Construct Coffin' ; Type[:ConstructCoffin] = :Manufacture ; Item[:ConstructCoffin] = :COFFIN
    ENUM[74] = :ConstructTable ; NUME[:ConstructTable] = 74 ; Caption[:ConstructTable] = 'Construct Table' ; Type[:ConstructTable] = :Manufacture ; Item[:ConstructTable] = :TABLE
    ENUM[75] = :ConstructChest ; NUME[:ConstructChest] = 75 ; Caption[:ConstructChest] = 'Construct Chest' ; Type[:ConstructChest] = :Manufacture ; Item[:ConstructChest] = :BOX
    ENUM[76] = :ConstructBin ; NUME[:ConstructBin] = 76 ; Caption[:ConstructBin] = 'Construct Bin' ; Type[:ConstructBin] = :Manufacture ; Item[:ConstructBin] = :BIN
    ENUM[77] = :ConstructArmorStand ; NUME[:ConstructArmorStand] = 77 ; Caption[:ConstructArmorStand] = 'Construct Armor Stand' ; Type[:ConstructArmorStand] = :Manufacture ; Item[:ConstructArmorStand] = :ARMORSTAND
    ENUM[78] = :ConstructWeaponRack ; NUME[:ConstructWeaponRack] = 78 ; Caption[:ConstructWeaponRack] = 'Construct Weapon Rack' ; Type[:ConstructWeaponRack] = :Manufacture ; Item[:ConstructWeaponRack] = :WEAPONRACK
    ENUM[79] = :ConstructCabinet ; NUME[:ConstructCabinet] = 79 ; Caption[:ConstructCabinet] = 'Construct Cabinet' ; Type[:ConstructCabinet] = :Manufacture ; Item[:ConstructCabinet] = :CABINET
    ENUM[80] = :ConstructStatue ; NUME[:ConstructStatue] = 80 ; Caption[:ConstructStatue] = 'Construct Statue' ; Type[:ConstructStatue] = :Manufacture ; Item[:ConstructStatue] = :STATUE
    ENUM[81] = :ConstructBlocks ; NUME[:ConstructBlocks] = 81 ; Caption[:ConstructBlocks] = 'Construct Blocks' ; Type[:ConstructBlocks] = :Manufacture ; Item[:ConstructBlocks] = :BLOCKS
    ENUM[82] = :MakeRawGlass ; NUME[:MakeRawGlass] = 82 ; Caption[:MakeRawGlass] = 'Make Raw Glass' ; Type[:MakeRawGlass] = :Manufacture ; Item[:MakeRawGlass] = :ROUGH ; Skill[:MakeRawGlass] = :GLASSMAKER
    ENUM[83] = :MakeCrafts ; NUME[:MakeCrafts] = 83 ; Caption[:MakeCrafts] = 'Make Crafts' ; Type[:MakeCrafts] = :Manufacture ; SkillWood[:MakeCrafts] = :WOODCRAFT ; SkillStone[:MakeCrafts] = :STONECRAFT ; SkillMetal[:MakeCrafts] = :METALCRAFT ; PossibleItem[:MakeCrafts] << :FIGURINE ; PossibleItem[:MakeCrafts] << :AMULET ; PossibleItem[:MakeCrafts] << :RING ; PossibleItem[:MakeCrafts] << :EARRING ; PossibleItem[:MakeCrafts] << :CROWN ; PossibleItem[:MakeCrafts] << :BRACELET ; PossibleItem[:MakeCrafts] << :SCEPTER
    ENUM[84] = :MintCoins ; NUME[:MintCoins] = 84 ; Caption[:MintCoins] = 'Mint Coins' ; Type[:MintCoins] = :Manufacture ; Item[:MintCoins] = :COIN ; SkillMetal[:MintCoins] = :METALCRAFT
    ENUM[85] = :CutGems ; NUME[:CutGems] = 85 ; Caption[:CutGems] = 'Cut Gems' ; Type[:CutGems] = :Manufacture ; Item[:CutGems] = :SMALLGEM ; Skill[:CutGems] = :CUTGEM
    ENUM[86] = :CutGlass ; NUME[:CutGlass] = 86 ; Caption[:CutGlass] = 'Cut Glass' ; Type[:CutGlass] = :Manufacture ; Item[:CutGlass] = :SMALLGEM ; Skill[:CutGlass] = :CUTGEM
    ENUM[87] = :EncrustWithGems ; NUME[:EncrustWithGems] = 87 ; Caption[:EncrustWithGems] = 'Encrust With Gems' ; Type[:EncrustWithGems] = :Improvement ; Skill[:EncrustWithGems] = :ENCRUSTGEM
    ENUM[88] = :EncrustWithGlass ; NUME[:EncrustWithGlass] = 88 ; Caption[:EncrustWithGlass] = 'Encrust With Glass' ; Type[:EncrustWithGlass] = :Improvement ; Skill[:EncrustWithGlass] = :ENCRUSTGEM
    ENUM[89] = :DestroyBuilding ; NUME[:DestroyBuilding] = 89 ; Caption[:DestroyBuilding] = 'Destroy Building' ; Type[:DestroyBuilding] = :Building
    ENUM[90] = :SmeltOre ; NUME[:SmeltOre] = 90 ; Caption[:SmeltOre] = 'Smelt Ore' ; Type[:SmeltOre] = :Manufacture ; Item[:SmeltOre] = :BAR ; Skill[:SmeltOre] = :SMELT
    ENUM[91] = :MeltMetalObject ; NUME[:MeltMetalObject] = 91 ; Caption[:MeltMetalObject] = 'Melt a Metal Object' ; Type[:MeltMetalObject] = :Manufacture ; Item[:MeltMetalObject] = :BAR ; Material[:MeltMetalObject] = 'metal' ; Skill[:MeltMetalObject] = :SMELT
    ENUM[92] = :ExtractMetalStrands ; NUME[:ExtractMetalStrands] = 92 ; Caption[:ExtractMetalStrands] = 'Extract Metal Strands' ; Type[:ExtractMetalStrands] = :Manufacture ; Item[:ExtractMetalStrands] = :THREAD ; Skill[:ExtractMetalStrands] = :EXTRACT_STRAND
    ENUM[93] = :PlantSeeds ; NUME[:PlantSeeds] = 93 ; Caption[:PlantSeeds] = 'Plant Seeds' ; Type[:PlantSeeds] = :Gathering ; Skill[:PlantSeeds] = :PLANT
    ENUM[94] = :HarvestPlants ; NUME[:HarvestPlants] = 94 ; Caption[:HarvestPlants] = 'Harvest Plants' ; Type[:HarvestPlants] = :Gathering ; Skill[:HarvestPlants] = :PLANT ; Item[:HarvestPlants] = :PLANT
    ENUM[95] = :TrainHuntingAnimal ; NUME[:TrainHuntingAnimal] = 95 ; Caption[:TrainHuntingAnimal] = 'Train Hunting Animal' ; Type[:TrainHuntingAnimal] = :UnitHandling ; Skill[:TrainHuntingAnimal] = :ANIMALTRAIN
    ENUM[96] = :TrainWarAnimal ; NUME[:TrainWarAnimal] = 96 ; Caption[:TrainWarAnimal] = 'Train War Animal' ; Type[:TrainWarAnimal] = :UnitHandling ; Skill[:TrainWarAnimal] = :ANIMALTRAIN
    ENUM[97] = :MakeWeapon ; NUME[:MakeWeapon] = 97 ; Caption[:MakeWeapon] = 'Forge Weapon' ; Type[:MakeWeapon] = :Manufacture ; Item[:MakeWeapon] = :WEAPON ; SkillMetal[:MakeWeapon] = :FORGE_WEAPON
    ENUM[98] = :ForgeAnvil ; NUME[:ForgeAnvil] = 98 ; Caption[:ForgeAnvil] = 'Forge Anvil' ; Type[:ForgeAnvil] = :Manufacture ; Item[:ForgeAnvil] = :ANVIL
    ENUM[99] = :ConstructCatapultParts ; NUME[:ConstructCatapultParts] = 99 ; Caption[:ConstructCatapultParts] = 'Construct Catapult Parts' ; Type[:ConstructCatapultParts] = :Manufacture ; Item[:ConstructCatapultParts] = :CATAPULTPARTS ; Skill[:ConstructCatapultParts] = :SIEGECRAFT
    ENUM[100] = :ConstructBallistaParts ; NUME[:ConstructBallistaParts] = 100 ; Caption[:ConstructBallistaParts] = 'Construct Ballista Parts' ; Type[:ConstructBallistaParts] = :Manufacture ; Item[:ConstructBallistaParts] = :BALLISTAPARTS ; Skill[:ConstructBallistaParts] = :SIEGECRAFT
    ENUM[101] = :MakeArmor ; NUME[:MakeArmor] = 101 ; Caption[:MakeArmor] = 'Make Armor' ; Type[:MakeArmor] = :Manufacture ; Item[:MakeArmor] = :ARMOR ; SkillMetal[:MakeArmor] = :FORGE_ARMOR
    ENUM[102] = :MakeHelm ; NUME[:MakeHelm] = 102 ; Caption[:MakeHelm] = 'Forge Helm' ; Type[:MakeHelm] = :Manufacture ; Item[:MakeHelm] = :HELM ; SkillMetal[:MakeHelm] = :FORGE_ARMOR
    ENUM[103] = :MakePants ; NUME[:MakePants] = 103 ; Caption[:MakePants] = 'Make Pants' ; Type[:MakePants] = :Manufacture ; Item[:MakePants] = :PANTS ; SkillMetal[:MakePants] = :FORGE_ARMOR
    ENUM[104] = :StudWith ; NUME[:StudWith] = 104 ; Caption[:StudWith] = 'Stud With' ; Type[:StudWith] = :Improvement
    ENUM[105] = :ButcherAnimal ; NUME[:ButcherAnimal] = 105 ; Caption[:ButcherAnimal] = 'Butcher an Animal' ; Type[:ButcherAnimal] = :Manufacture ; Skill[:ButcherAnimal] = :BUTCHER ; PossibleItem[:ButcherAnimal] << :MEAT ; PossibleItem[:ButcherAnimal] << :CORPSEPIECE ; PossibleItem[:ButcherAnimal] << :GLOB
    ENUM[106] = :PrepareRawFish ; NUME[:PrepareRawFish] = 106 ; Caption[:PrepareRawFish] = 'Prepare a Raw Fish' ; Type[:PrepareRawFish] = :Manufacture ; Item[:PrepareRawFish] = :FISH ; Skill[:PrepareRawFish] = :PROCESSFISH
    ENUM[107] = :MillPlants ; NUME[:MillPlants] = 107 ; Caption[:MillPlants] = 'Mill Plants' ; Type[:MillPlants] = :Manufacture ; Item[:MillPlants] = :POWDER_MISC ; Skill[:MillPlants] = :MILLING
    ENUM[108] = :BaitTrap ; NUME[:BaitTrap] = 108 ; Caption[:BaitTrap] = 'Bait Trap' ; Type[:BaitTrap] = :Hauling ; Skill[:BaitTrap] = :TRAPPING
    ENUM[109] = :MilkCreature ; NUME[:MilkCreature] = 109 ; Caption[:MilkCreature] = 'Milk Creature' ; Type[:MilkCreature] = :Gathering ; Item[:MilkCreature] = :LIQUID_MISC ; Material[:MilkCreature] = 'milk' ; Skill[:MilkCreature] = :MILK
    ENUM[110] = :MakeCheese ; NUME[:MakeCheese] = 110 ; Caption[:MakeCheese] = 'Make Cheese' ; Type[:MakeCheese] = :Manufacture ; Item[:MakeCheese] = :CHEESE ; Skill[:MakeCheese] = :CHEESEMAKING
    ENUM[111] = :ProcessPlants ; NUME[:ProcessPlants] = 111 ; Caption[:ProcessPlants] = 'Process Plants' ; Type[:ProcessPlants] = :Manufacture ; Item[:ProcessPlants] = :THREAD ; Skill[:ProcessPlants] = :PROCESSPLANTS
    ENUM[113] = :ProcessPlantsVial ; NUME[:ProcessPlantsVial] = 113 ; Caption[:ProcessPlantsVial] = 'Process Plants (Vial)' ; Type[:ProcessPlantsVial] = :Manufacture ; Item[:ProcessPlantsVial] = :LIQUID_MISC ; Skill[:ProcessPlantsVial] = :PROCESSPLANTS
    ENUM[114] = :ProcessPlantsBarrel ; NUME[:ProcessPlantsBarrel] = 114 ; Caption[:ProcessPlantsBarrel] = 'Process Plants (Barrel)' ; Type[:ProcessPlantsBarrel] = :Manufacture ; Item[:ProcessPlantsBarrel] = :LIQUID_MISC ; Skill[:ProcessPlantsBarrel] = :PROCESSPLANTS
    ENUM[115] = :PrepareMeal ; NUME[:PrepareMeal] = 115 ; Caption[:PrepareMeal] = 'Prepare Meal' ; Type[:PrepareMeal] = :Manufacture ; Item[:PrepareMeal] = :FOOD ; Skill[:PrepareMeal] = :COOK
    ENUM[116] = :WeaveCloth ; NUME[:WeaveCloth] = 116 ; Caption[:WeaveCloth] = 'Weave Cloth' ; Type[:WeaveCloth] = :Manufacture ; Item[:WeaveCloth] = :CLOTH ; Skill[:WeaveCloth] = :WEAVING
    ENUM[117] = :MakeGloves ; NUME[:MakeGloves] = 117 ; Caption[:MakeGloves] = 'Make Gloves' ; Type[:MakeGloves] = :Manufacture ; Item[:MakeGloves] = :GLOVES ; SkillMetal[:MakeGloves] = :FORGE_ARMOR
    ENUM[118] = :MakeShoes ; NUME[:MakeShoes] = 118 ; Caption[:MakeShoes] = 'Make Shoes' ; Type[:MakeShoes] = :Manufacture ; Item[:MakeShoes] = :SHOES ; SkillMetal[:MakeShoes] = :FORGE_ARMOR
    ENUM[119] = :MakeShield ; NUME[:MakeShield] = 119 ; Caption[:MakeShield] = 'Make Shield' ; Item[:MakeShield] = :SHIELD ; SkillMetal[:MakeShield] = :FORGE_ARMOR
    ENUM[120] = :MakeCage ; NUME[:MakeCage] = 120 ; Caption[:MakeCage] = 'Make Cage' ; Type[:MakeCage] = :Manufacture ; Item[:MakeCage] = :CAGE
    ENUM[121] = :MakeChain ; NUME[:MakeChain] = 121 ; Caption[:MakeChain] = 'Make Chain' ; Type[:MakeChain] = :Manufacture ; Item[:MakeChain] = :CHAIN ; SkillMetal[:MakeChain] = :METALCRAFT
    ENUM[122] = :MakeFlask ; NUME[:MakeFlask] = 122 ; Caption[:MakeFlask] = 'Make Flask' ; Type[:MakeFlask] = :Manufacture ; Item[:MakeFlask] = :FLASK ; SkillMetal[:MakeFlask] = :METALCRAFT
    ENUM[123] = :MakeGoblet ; NUME[:MakeGoblet] = 123 ; Caption[:MakeGoblet] = 'Make Goblet' ; Type[:MakeGoblet] = :Manufacture ; Item[:MakeGoblet] = :GOBLET ; SkillWood[:MakeGoblet] = :WOODCRAFT ; SkillStone[:MakeGoblet] = :STONECRAFT ; SkillMetal[:MakeGoblet] = :METALCRAFT
    ENUM[125] = :MakeToy ; NUME[:MakeToy] = 125 ; Caption[:MakeToy] = 'Make Toy' ; Type[:MakeToy] = :Manufacture ; Item[:MakeToy] = :TOY ; SkillWood[:MakeToy] = :WOODCRAFT ; SkillStone[:MakeToy] = :STONECRAFT ; SkillMetal[:MakeToy] = :METALCRAFT
    ENUM[126] = :MakeAnimalTrap ; NUME[:MakeAnimalTrap] = 126 ; Caption[:MakeAnimalTrap] = 'Make Animal Trap' ; Type[:MakeAnimalTrap] = :Manufacture ; Item[:MakeAnimalTrap] = :ANIMALTRAP ; Skill[:MakeAnimalTrap] = :TRAPPING
    ENUM[127] = :MakeBarrel ; NUME[:MakeBarrel] = 127 ; Caption[:MakeBarrel] = 'Make Barrel' ; Type[:MakeBarrel] = :Manufacture ; Item[:MakeBarrel] = :BARREL
    ENUM[128] = :MakeBucket ; NUME[:MakeBucket] = 128 ; Caption[:MakeBucket] = 'Make Bucket' ; Type[:MakeBucket] = :Manufacture ; Item[:MakeBucket] = :BUCKET
    ENUM[129] = :MakeWindow ; NUME[:MakeWindow] = 129 ; Caption[:MakeWindow] = 'Make Window' ; Type[:MakeWindow] = :Manufacture ; Item[:MakeWindow] = :WINDOW
    ENUM[130] = :MakeTotem ; NUME[:MakeTotem] = 130 ; Caption[:MakeTotem] = 'Make Totem' ; Type[:MakeTotem] = :Manufacture ; Skill[:MakeTotem] = :BONECARVE ; Item[:MakeTotem] = :TOTEM
    ENUM[131] = :MakeAmmo ; NUME[:MakeAmmo] = 131 ; Caption[:MakeAmmo] = 'Make Ammo' ; Type[:MakeAmmo] = :Manufacture ; Item[:MakeAmmo] = :AMMO ; SkillWood[:MakeAmmo] = :WOODCRAFT ; SkillStone[:MakeAmmo] = :STONECRAFT ; SkillMetal[:MakeAmmo] = :FORGE_WEAPON
    ENUM[132] = :DecorateWith ; NUME[:DecorateWith] = 132 ; Caption[:DecorateWith] = 'Decorate With' ; Type[:DecorateWith] = :Improvement
    ENUM[133] = :MakeBackpack ; NUME[:MakeBackpack] = 133 ; Caption[:MakeBackpack] = 'Make Backpack' ; Type[:MakeBackpack] = :Manufacture ; Item[:MakeBackpack] = :BACKPACK
    ENUM[134] = :MakeQuiver ; NUME[:MakeQuiver] = 134 ; Caption[:MakeQuiver] = 'Make Quiver' ; Type[:MakeQuiver] = :Manufacture ; Item[:MakeQuiver] = :QUIVER
    ENUM[135] = :MakeBallistaArrowHead ; NUME[:MakeBallistaArrowHead] = 135 ; Caption[:MakeBallistaArrowHead] = 'Make Ballista Arrow Head' ; Type[:MakeBallistaArrowHead] = :Manufacture ; Item[:MakeBallistaArrowHead] = :BALLISTAARROWHEAD ; SkillMetal[:MakeBallistaArrowHead] = :FORGE_WEAPON
    ENUM[136] = :AssembleSiegeAmmo ; NUME[:AssembleSiegeAmmo] = 136 ; Caption[:AssembleSiegeAmmo] = 'Assemble Siege Ammo' ; Type[:AssembleSiegeAmmo] = :Manufacture ; Item[:AssembleSiegeAmmo] = :SIEGEAMMO ; Skill[:AssembleSiegeAmmo] = :SIEGECRAFT
    ENUM[137] = :LoadCatapult ; NUME[:LoadCatapult] = 137 ; Caption[:LoadCatapult] = 'Load Catapult' ; Type[:LoadCatapult] = :SiegeWeapon ; Skill[:LoadCatapult] = :SIEGEOPERATE
    ENUM[138] = :LoadBallista ; NUME[:LoadBallista] = 138 ; Caption[:LoadBallista] = 'Load Ballista' ; Type[:LoadBallista] = :SiegeWeapon ; Skill[:LoadBallista] = :SIEGEOPERATE
    ENUM[139] = :FireCatapult ; NUME[:FireCatapult] = 139 ; Caption[:FireCatapult] = 'Fire Catapult' ; Type[:FireCatapult] = :SiegeWeapon ; Skill[:FireCatapult] = :SIEGEOPERATE
    ENUM[140] = :FireBallista ; NUME[:FireBallista] = 140 ; Caption[:FireBallista] = 'Fire Ballista' ; Type[:FireBallista] = :SiegeWeapon ; Skill[:FireBallista] = :SIEGEOPERATE
    ENUM[141] = :ConstructMechanisms ; NUME[:ConstructMechanisms] = 141 ; Caption[:ConstructMechanisms] = 'Construct Mechanisms' ; Type[:ConstructMechanisms] = :Manufacture ; Item[:ConstructMechanisms] = :TRAPPARTS ; Skill[:ConstructMechanisms] = :MECHANICS
    ENUM[142] = :MakeTrapComponent ; NUME[:MakeTrapComponent] = 142 ; Caption[:MakeTrapComponent] = 'MakeTrapComponent' ; Type[:MakeTrapComponent] = :Manufacture ; Item[:MakeTrapComponent] = :TRAPCOMP ; SkillMetal[:MakeTrapComponent] = :FORGE_WEAPON
    ENUM[143] = :LoadCageTrap ; NUME[:LoadCageTrap] = 143 ; Caption[:LoadCageTrap] = 'Load Cage Trap' ; Type[:LoadCageTrap] = :Hauling ; Skill[:LoadCageTrap] = :MECHANICS
    ENUM[144] = :LoadStoneTrap ; NUME[:LoadStoneTrap] = 144 ; Caption[:LoadStoneTrap] = 'Load Stone Trap' ; Type[:LoadStoneTrap] = :Hauling ; Skill[:LoadStoneTrap] = :MECHANICS
    ENUM[145] = :LoadWeaponTrap ; NUME[:LoadWeaponTrap] = 145 ; Caption[:LoadWeaponTrap] = 'Load Weapon Trap' ; Type[:LoadWeaponTrap] = :Hauling ; Skill[:LoadWeaponTrap] = :MECHANICS
    ENUM[146] = :CleanTrap ; NUME[:CleanTrap] = 146 ; Caption[:CleanTrap] = 'Clean Trap' ; Type[:CleanTrap] = :TidyUp ; Skill[:CleanTrap] = :MECHANICS
    ENUM[147] = :CastSpell ; NUME[:CastSpell] = 147 ; Caption[:CastSpell] = 'Cast Spell'
    ENUM[148] = :LinkBuildingToTrigger ; NUME[:LinkBuildingToTrigger] = 148 ; Caption[:LinkBuildingToTrigger] = 'Link a Building to Trigger' ; Type[:LinkBuildingToTrigger] = :Building ; Skill[:LinkBuildingToTrigger] = :MECHANICS
    ENUM[149] = :PullLever ; NUME[:PullLever] = 149 ; Caption[:PullLever] = 'Pull the Lever' ; Labor[:PullLever] = :PULL_LEVER
    ENUM[151] = :ExtractFromPlants ; NUME[:ExtractFromPlants] = 151 ; Caption[:ExtractFromPlants] = 'Extract from Plants' ; Type[:ExtractFromPlants] = :Manufacture ; Item[:ExtractFromPlants] = :LIQUID_MISC ; Skill[:ExtractFromPlants] = :HERBALISM
    ENUM[152] = :ExtractFromRawFish ; NUME[:ExtractFromRawFish] = 152 ; Caption[:ExtractFromRawFish] = 'Extract from Raw Fish' ; Type[:ExtractFromRawFish] = :Manufacture ; Item[:ExtractFromRawFish] = :LIQUID_MISC ; Skill[:ExtractFromRawFish] = :DISSECT_FISH
    ENUM[153] = :ExtractFromLandAnimal ; NUME[:ExtractFromLandAnimal] = 153 ; Caption[:ExtractFromLandAnimal] = 'Extract from Land Animal' ; Type[:ExtractFromLandAnimal] = :Manufacture ; Item[:ExtractFromLandAnimal] = :LIQUID_MISC ; Skill[:ExtractFromLandAnimal] = :DISSECT_VERMIN
    ENUM[154] = :TameVermin ; NUME[:TameVermin] = 154 ; Caption[:TameVermin] = 'Tame Small Animal' ; Type[:TameVermin] = :UnitHandling ; Skill[:TameVermin] = :ANIMALTRAIN
    ENUM[155] = :TameAnimal ; NUME[:TameAnimal] = 155 ; Caption[:TameAnimal] = 'Tame ?something?' ; Type[:TameAnimal] = :UnitHandling ; Skill[:TameAnimal] = :ANIMALTRAIN
    ENUM[156] = :ChainAnimal ; NUME[:ChainAnimal] = 156 ; Caption[:ChainAnimal] = 'Chain Animal' ; Type[:ChainAnimal] = :UnitHandling
    ENUM[157] = :UnchainAnimal ; NUME[:UnchainAnimal] = 157 ; Caption[:UnchainAnimal] = 'Unchain Animal' ; Type[:UnchainAnimal] = :UnitHandling
    ENUM[158] = :UnchainPet ; NUME[:UnchainPet] = 158 ; Caption[:UnchainPet] = 'Unchain Pet' ; Type[:UnchainPet] = :UnitHandling
    ENUM[159] = :ReleaseLargeCreature ; NUME[:ReleaseLargeCreature] = 159 ; Caption[:ReleaseLargeCreature] = 'Release Large Creature' ; Type[:ReleaseLargeCreature] = :UnitHandling
    ENUM[160] = :ReleasePet ; NUME[:ReleasePet] = 160 ; Caption[:ReleasePet] = 'Release Pet' ; Type[:ReleasePet] = :UnitHandling
    ENUM[161] = :ReleaseSmallCreature ; NUME[:ReleaseSmallCreature] = 161 ; Caption[:ReleaseSmallCreature] = 'Release Small Creature' ; Type[:ReleaseSmallCreature] = :UnitHandling
    ENUM[162] = :HandleSmallCreature ; NUME[:HandleSmallCreature] = 162 ; Caption[:HandleSmallCreature] = 'Handle Small Creature' ; Type[:HandleSmallCreature] = :UnitHandling
    ENUM[163] = :HandleLargeCreature ; NUME[:HandleLargeCreature] = 163 ; Caption[:HandleLargeCreature] = 'Handle Large Creature' ; Type[:HandleLargeCreature] = :UnitHandling
    ENUM[164] = :CageLargeCreature ; NUME[:CageLargeCreature] = 164 ; Caption[:CageLargeCreature] = 'Cage Large Creature' ; Type[:CageLargeCreature] = :UnitHandling
    ENUM[165] = :CageSmallCreature ; NUME[:CageSmallCreature] = 165 ; Caption[:CageSmallCreature] = 'Cage Small Creature' ; Type[:CageSmallCreature] = :UnitHandling
    ENUM[166] = :RecoverWounded ; NUME[:RecoverWounded] = 166 ; Caption[:RecoverWounded] = 'Recover Wounded' ; Type[:RecoverWounded] = :Hauling ; Labor[:RecoverWounded] = :RECOVER_WOUNDED ; TagOpHistory[:RecoverWounded] = 'bed_id'
    ENUM[167] = :DiagnosePatient ; NUME[:DiagnosePatient] = 167 ; Caption[:DiagnosePatient] = 'Diagnose Patient' ; Type[:DiagnosePatient] = :Medicine ; Skill[:DiagnosePatient] = :DIAGNOSE
    ENUM[168] = :ImmobilizeBreak ; NUME[:ImmobilizeBreak] = 168 ; Caption[:ImmobilizeBreak] = 'Immobilize Break' ; Type[:ImmobilizeBreak] = :Medicine ; Skill[:ImmobilizeBreak] = :SET_BONE
    ENUM[169] = :DressWound ; NUME[:DressWound] = 169 ; Caption[:DressWound] = 'Dress Wound' ; Type[:DressWound] = :Medicine ; Skill[:DressWound] = :DRESS_WOUNDS ; TagOpHistory[:DressWound] = 'bandage'
    ENUM[170] = :CleanPatient ; NUME[:CleanPatient] = 170 ; Caption[:CleanPatient] = 'Clean Patient' ; Type[:CleanPatient] = :Medicine ; Labor[:CleanPatient] = :CLEAN
    ENUM[171] = :Surgery ; NUME[:Surgery] = 171 ; Caption[:Surgery] = 'Surgery' ; Type[:Surgery] = :Medicine ; Skill[:Surgery] = :SURGERY ; TagOpHistory[:Surgery] = 'surgery'
    ENUM[172] = :Suture ; NUME[:Suture] = 172 ; Caption[:Suture] = 'Suture' ; Type[:Suture] = :Medicine ; Skill[:Suture] = :SUTURE ; TagOpHistory[:Suture] = 'bandage'
    ENUM[173] = :SetBone ; NUME[:SetBone] = 173 ; Caption[:SetBone] = 'Set Bone' ; Type[:SetBone] = :Medicine ; Skill[:SetBone] = :SET_BONE
    ENUM[174] = :PlaceInTraction ; NUME[:PlaceInTraction] = 174 ; Caption[:PlaceInTraction] = 'Place In Traction' ; Type[:PlaceInTraction] = :Medicine ; Skill[:PlaceInTraction] = :SET_BONE
    ENUM[175] = :DrainAquarium ; NUME[:DrainAquarium] = 175 ; Caption[:DrainAquarium] = 'Drain Aquarium' ; Type[:DrainAquarium] = :Hauling ; Labor[:DrainAquarium] = :HAUL_WATER
    ENUM[176] = :FillAquarium ; NUME[:FillAquarium] = 176 ; Caption[:FillAquarium] = 'Fill Aquarium' ; Type[:FillAquarium] = :Hauling ; Labor[:FillAquarium] = :HAUL_WATER
    ENUM[177] = :FillPond ; NUME[:FillPond] = 177 ; Caption[:FillPond] = 'Fill Pond' ; Type[:FillPond] = :Hauling ; Labor[:FillPond] = :HAUL_WATER
    ENUM[178] = :GiveWater ; NUME[:GiveWater] = 178 ; Caption[:GiveWater] = 'Give Water' ; Type[:GiveWater] = :LifeSupport ; Labor[:GiveWater] = :FEED_WATER_CIVILIANS
    ENUM[179] = :GiveFood ; NUME[:GiveFood] = 179 ; Caption[:GiveFood] = 'Give Food' ; Type[:GiveFood] = :LifeSupport ; Labor[:GiveFood] = :FEED_WATER_CIVILIANS
    ENUM[180] = :GiveWater2 ; NUME[:GiveWater2] = 180 ; Caption[:GiveWater2] = 'Give Water' ; Type[:GiveWater2] = :LifeSupport ; Labor[:GiveWater2] = :FEED_WATER_CIVILIANS
    ENUM[181] = :GiveFood2 ; NUME[:GiveFood2] = 181 ; Caption[:GiveFood2] = 'Give Food' ; Type[:GiveFood2] = :LifeSupport ; Labor[:GiveFood2] = :FEED_WATER_CIVILIANS
    ENUM[182] = :RecoverPet ; NUME[:RecoverPet] = 182 ; Caption[:RecoverPet] = 'Recover Pet' ; Type[:RecoverPet] = :UnitHandling
    ENUM[183] = :PitLargeAnimal ; NUME[:PitLargeAnimal] = 183 ; Caption[:PitLargeAnimal] = 'Pit/Pond Large Animal' ; Type[:PitLargeAnimal] = :UnitHandling
    ENUM[184] = :PitSmallAnimal ; NUME[:PitSmallAnimal] = 184 ; Caption[:PitSmallAnimal] = 'Pit/Pond Small Animal' ; Type[:PitSmallAnimal] = :UnitHandling
    ENUM[185] = :SlaughterAnimal ; NUME[:SlaughterAnimal] = 185 ; Caption[:SlaughterAnimal] = 'Slaughter Animal' ; Type[:SlaughterAnimal] = :Gathering ; Skill[:SlaughterAnimal] = :BUTCHER ; PossibleItem[:SlaughterAnimal] << :MEAT ; PossibleItem[:SlaughterAnimal] << :CORPSEPIECE ; PossibleItem[:SlaughterAnimal] << :GLOB
    ENUM[186] = :MakeCharcoal ; NUME[:MakeCharcoal] = 186 ; Caption[:MakeCharcoal] = 'Make Charcoal' ; Type[:MakeCharcoal] = :Manufacture ; Item[:MakeCharcoal] = :BAR ; Material[:MakeCharcoal] = 'COAL' ; Skill[:MakeCharcoal] = :WOOD_BURNING
    ENUM[187] = :MakeAsh ; NUME[:MakeAsh] = 187 ; Caption[:MakeAsh] = 'Make Ash' ; Type[:MakeAsh] = :Manufacture ; Item[:MakeAsh] = :BAR ; Material[:MakeAsh] = 'ASH' ; Skill[:MakeAsh] = :WOOD_BURNING
    ENUM[188] = :MakeLye ; NUME[:MakeLye] = 188 ; Caption[:MakeLye] = 'Make Lye' ; Type[:MakeLye] = :Manufacture ; Item[:MakeLye] = :LIQUID_MISC ; Material[:MakeLye] = 'LYE' ; Skill[:MakeLye] = :LYE_MAKING
    ENUM[189] = :MakePotashFromLye ; NUME[:MakePotashFromLye] = 189 ; Caption[:MakePotashFromLye] = 'Make Potash From Lye' ; Type[:MakePotashFromLye] = :Manufacture ; Item[:MakePotashFromLye] = :BAR ; Material[:MakePotashFromLye] = 'POTASH' ; Skill[:MakePotashFromLye] = :POTASH_MAKING
    ENUM[190] = :FertilizeField ; NUME[:FertilizeField] = 190 ; Caption[:FertilizeField] = 'Fertilize Field'
    ENUM[191] = :MakePotashFromAsh ; NUME[:MakePotashFromAsh] = 191 ; Caption[:MakePotashFromAsh] = 'Make Potash From Ash' ; Type[:MakePotashFromAsh] = :Manufacture ; Item[:MakePotashFromAsh] = :BAR ; Material[:MakePotashFromAsh] = 'POTASH' ; Skill[:MakePotashFromAsh] = :POTASH_MAKING
    ENUM[192] = :DyeThread ; NUME[:DyeThread] = 192 ; Caption[:DyeThread] = 'Dye Thread' ; Type[:DyeThread] = :Improvement ; Skill[:DyeThread] = :DYER
    ENUM[193] = :DyeCloth ; NUME[:DyeCloth] = 193 ; Caption[:DyeCloth] = 'Dye Cloth' ; Type[:DyeCloth] = :Improvement ; Skill[:DyeCloth] = :DYER
    ENUM[194] = :SewImage ; NUME[:SewImage] = 194 ; Caption[:SewImage] = 'Sew Image' ; Type[:SewImage] = :Improvement
    ENUM[195] = :MakePipeSection ; NUME[:MakePipeSection] = 195 ; Caption[:MakePipeSection] = 'Make Pipe Section' ; Type[:MakePipeSection] = :Manufacture ; Item[:MakePipeSection] = :PIPE_SECTION
    ENUM[196] = :OperatePump ; NUME[:OperatePump] = 196 ; Caption[:OperatePump] = 'Operate Pump' ; Skill[:OperatePump] = :OPERATE_PUMP
    ENUM[197] = :ManageWorkOrders ; NUME[:ManageWorkOrders] = 197 ; Caption[:ManageWorkOrders] = 'Manage Work Orders' ; Skill[:ManageWorkOrders] = :ORGANIZATION
    ENUM[198] = :UpdateStockpileRecords ; NUME[:UpdateStockpileRecords] = 198 ; Caption[:UpdateStockpileRecords] = 'Update Stockpile Records' ; Skill[:UpdateStockpileRecords] = :RECORD_KEEPING
    ENUM[199] = :TradeAtDepot ; NUME[:TradeAtDepot] = 199 ; Caption[:TradeAtDepot] = 'Trade at Depot' ; Skill[:TradeAtDepot] = :APPRAISAL
    ENUM[200] = :ConstructHatchCover ; NUME[:ConstructHatchCover] = 200 ; Caption[:ConstructHatchCover] = 'Construct Hatch Cover' ; Type[:ConstructHatchCover] = :Manufacture ; Item[:ConstructHatchCover] = :HATCH_COVER
    ENUM[201] = :ConstructGrate ; NUME[:ConstructGrate] = 201 ; Caption[:ConstructGrate] = 'Construct Grate' ; Type[:ConstructGrate] = :Manufacture ; Item[:ConstructGrate] = :GRATE
    ENUM[202] = :RemoveStairs ; NUME[:RemoveStairs] = 202 ; Caption[:RemoveStairs] = 'Remove Stairs/Ramps' ; Type[:RemoveStairs] = :Digging ; Skill[:RemoveStairs] = :MINING ; IsDesignation[:RemoveStairs] = true
    ENUM[203] = :ConstructQuern ; NUME[:ConstructQuern] = 203 ; Caption[:ConstructQuern] = 'Construct Quern' ; Type[:ConstructQuern] = :Manufacture ; Item[:ConstructQuern] = :QUERN
    ENUM[204] = :ConstructMillstone ; NUME[:ConstructMillstone] = 204 ; Caption[:ConstructMillstone] = 'Construct Millstone' ; Type[:ConstructMillstone] = :Manufacture ; Item[:ConstructMillstone] = :MILLSTONE
    ENUM[205] = :ConstructSplint ; NUME[:ConstructSplint] = 205 ; Caption[:ConstructSplint] = 'Construct Splint' ; Type[:ConstructSplint] = :Manufacture ; Item[:ConstructSplint] = :SPLINT
    ENUM[206] = :ConstructCrutch ; NUME[:ConstructCrutch] = 206 ; Caption[:ConstructCrutch] = 'Construct Crutch' ; Type[:ConstructCrutch] = :Manufacture ; Item[:ConstructCrutch] = :CRUTCH
    ENUM[207] = :ConstructTractionBench ; NUME[:ConstructTractionBench] = 207 ; Caption[:ConstructTractionBench] = 'Construct Traction Bench' ; Type[:ConstructTractionBench] = :Manufacture ; Item[:ConstructTractionBench] = :TRACTION_BENCH ; Skill[:ConstructTractionBench] = :MECHANICS
    ENUM[208] = :CleanSelf ; NUME[:CleanSelf] = 208 ; Caption[:CleanSelf] = 'Clean Self' ; Type[:CleanSelf] = :TidyUp
    ENUM[209] = :BringCrutch ; NUME[:BringCrutch] = 209 ; Caption[:BringCrutch] = 'Bring Crutch' ; Type[:BringCrutch] = :Medicine ; TagOpHistory[:BringCrutch] = 'crutch'
    ENUM[210] = :ApplyCast ; NUME[:ApplyCast] = 210 ; Caption[:ApplyCast] = 'Apply Cast' ; Type[:ApplyCast] = :Medicine ; Skill[:ApplyCast] = :SET_BONE
    ENUM[211] = :CustomReaction ; NUME[:CustomReaction] = 211 ; Caption[:CustomReaction] = 'Custom Reaction'
    ENUM[212] = :ConstructSlab ; NUME[:ConstructSlab] = 212 ; Caption[:ConstructSlab] = 'Construct Slab' ; Type[:ConstructSlab] = :Manufacture ; Item[:ConstructSlab] = :SLAB
    ENUM[213] = :EngraveSlab ; NUME[:EngraveSlab] = 213 ; Caption[:EngraveSlab] = 'Engrave Memorial Slab' ; Type[:EngraveSlab] = :Improvement
    ENUM[214] = :ShearCreature ; NUME[:ShearCreature] = 214 ; Caption[:ShearCreature] = 'Shear Creature' ; Type[:ShearCreature] = :Gathering ; Item[:ShearCreature] = :CORPSEPIECE ; Material[:ShearCreature] = 'yarn' ; Skill[:ShearCreature] = :SHEARING
    ENUM[215] = :SpinThread ; NUME[:SpinThread] = 215 ; Caption[:SpinThread] = 'Spin Thread'
    ENUM[216] = :PenLargeAnimal ; NUME[:PenLargeAnimal] = 216 ; Caption[:PenLargeAnimal] = 'Pen/Pasture Large Animal' ; Type[:PenLargeAnimal] = :UnitHandling
    ENUM[217] = :PenSmallAnimal ; NUME[:PenSmallAnimal] = 217 ; Caption[:PenSmallAnimal] = 'Pen/Pasture Small Animal' ; Type[:PenSmallAnimal] = :UnitHandling
    ENUM[218] = :MakeTool ; NUME[:MakeTool] = 218 ; Caption[:MakeTool] = 'Make Tool' ; Type[:MakeTool] = :Manufacture ; Item[:MakeTool] = :TOOL ; SkillWood[:MakeTool] = :WOODCRAFT ; SkillStone[:MakeTool] = :STONECRAFT
    ENUM[219] = :CollectClay ; NUME[:CollectClay] = 219 ; Caption[:CollectClay] = 'Collect Clay' ; Type[:CollectClay] = :Gathering ; Item[:CollectClay] = :BOULDER ; Material[:CollectClay] = 'clay'
    ENUM[220] = :InstallColonyInHive ; NUME[:InstallColonyInHive] = 220 ; Caption[:InstallColonyInHive] = 'Install Colony In Hive'
    ENUM[221] = :CollectHiveProducts ; NUME[:CollectHiveProducts] = 221 ; Caption[:CollectHiveProducts] = 'Collect Hive Products' ; Type[:CollectHiveProducts] = :Gathering
    ENUM[222] = :CauseTrouble ; NUME[:CauseTrouble] = 222 ; Caption[:CauseTrouble] = 'Cause Trouble' ; Type[:CauseTrouble] = :Crime
    ENUM[223] = :DrinkBlood ; NUME[:DrinkBlood] = 223 ; Caption[:DrinkBlood] = 'No Job' ; Type[:DrinkBlood] = :Crime
    ENUM[224] = :ReportCrime ; NUME[:ReportCrime] = 224 ; Caption[:ReportCrime] = 'Report Crime' ; Type[:ReportCrime] = :LawEnforcement
    ENUM[225] = :ExecuteCriminal ; NUME[:ExecuteCriminal] = 225 ; Caption[:ExecuteCriminal] = 'Execute Criminal' ; Type[:ExecuteCriminal] = :LawEnforcement
    ENUM[226] = :TrainAnimal ; NUME[:TrainAnimal] = 226 ; Caption[:TrainAnimal] = 'Train Animal' ; Type[:TrainAnimal] = :UnitHandling ; Skill[:TrainAnimal] = :ANIMALTRAIN
    ENUM[227] = :CarveTrack ; NUME[:CarveTrack] = 227 ; Caption[:CarveTrack] = 'Carve Track' ; Type[:CarveTrack] = :Building
    ENUM[228] = :PushTrackVehicle ; NUME[:PushTrackVehicle] = 228 ; Caption[:PushTrackVehicle] = 'Push Track Vehicle' ; Type[:PushTrackVehicle] = :Hauling ; Labor[:PushTrackVehicle] = :HANDLE_VEHICLES
    ENUM[229] = :PlaceTrackVehicle ; NUME[:PlaceTrackVehicle] = 229 ; Caption[:PlaceTrackVehicle] = 'Place Track Vehicle' ; Type[:PlaceTrackVehicle] = :Hauling ; Labor[:PlaceTrackVehicle] = :HANDLE_VEHICLES
    ENUM[230] = :StoreItemInVehicle ; NUME[:StoreItemInVehicle] = 230 ; Caption[:StoreItemInVehicle] = 'Store Item in Vehicle' ; Type[:StoreItemInVehicle] = :Hauling
    ENUM[231] = :GeldAnimal ; NUME[:GeldAnimal] = 231 ; Caption[:GeldAnimal] = 'Geld ?something?' ; Type[:GeldAnimal] = :UnitHandling ; Skill[:GeldAnimal] = :GELD
    ENUM[232] = :MakeFigurine ; NUME[:MakeFigurine] = 232 ; Caption[:MakeFigurine] = 'Make Figurine' ; Type[:MakeFigurine] = :Manufacture ; SkillWood[:MakeFigurine] = :WOODCRAFT ; SkillStone[:MakeFigurine] = :STONECRAFT ; SkillMetal[:MakeFigurine] = :METALCRAFT ; Item[:MakeFigurine] = :FIGURINE
    ENUM[233] = :MakeAmulet ; NUME[:MakeAmulet] = 233 ; Caption[:MakeAmulet] = 'Make Amulet' ; Type[:MakeAmulet] = :Manufacture ; SkillWood[:MakeAmulet] = :WOODCRAFT ; SkillStone[:MakeAmulet] = :STONECRAFT ; SkillMetal[:MakeAmulet] = :METALCRAFT ; Item[:MakeAmulet] = :AMULET
    ENUM[234] = :MakeScepter ; NUME[:MakeScepter] = 234 ; Caption[:MakeScepter] = 'Make Scepter' ; Type[:MakeScepter] = :Manufacture ; SkillWood[:MakeScepter] = :WOODCRAFT ; SkillStone[:MakeScepter] = :STONECRAFT ; SkillMetal[:MakeScepter] = :METALCRAFT ; Item[:MakeScepter] = :SCEPTER
    ENUM[235] = :MakeCrown ; NUME[:MakeCrown] = 235 ; Caption[:MakeCrown] = 'Make Crown' ; Type[:MakeCrown] = :Manufacture ; SkillWood[:MakeCrown] = :WOODCRAFT ; SkillStone[:MakeCrown] = :STONECRAFT ; SkillMetal[:MakeCrown] = :METALCRAFT ; Item[:MakeCrown] = :CROWN
    ENUM[236] = :MakeRing ; NUME[:MakeRing] = 236 ; Caption[:MakeRing] = 'Make Ring' ; Type[:MakeRing] = :Manufacture ; SkillWood[:MakeRing] = :WOODCRAFT ; SkillStone[:MakeRing] = :STONECRAFT ; SkillMetal[:MakeRing] = :METALCRAFT ; Item[:MakeRing] = :RING
    ENUM[237] = :MakeEarring ; NUME[:MakeEarring] = 237 ; Caption[:MakeEarring] = 'Make Earring' ; Type[:MakeEarring] = :Manufacture ; SkillWood[:MakeEarring] = :WOODCRAFT ; SkillStone[:MakeEarring] = :STONECRAFT ; SkillMetal[:MakeEarring] = :METALCRAFT ; Item[:MakeEarring] = :EARRING
    ENUM[238] = :MakeBracelet ; NUME[:MakeBracelet] = 238 ; Caption[:MakeBracelet] = 'Make Bracelet' ; Type[:MakeBracelet] = :Manufacture ; SkillWood[:MakeBracelet] = :WOODCRAFT ; SkillStone[:MakeBracelet] = :STONECRAFT ; SkillMetal[:MakeBracelet] = :METALCRAFT ; Item[:MakeBracelet] = :BRACELET
    ENUM[239] = :MakeGem ; NUME[:MakeGem] = 239 ; Caption[:MakeGem] = 'Make Large Gem' ; Type[:MakeGem] = :Manufacture ; SkillWood[:MakeGem] = :WOODCRAFT ; SkillStone[:MakeGem] = :STONECRAFT ; SkillMetal[:MakeGem] = :METALCRAFT ; Item[:MakeGem] = :GEM
    ENUM[240] = :PutItemOnDisplay ; NUME[:PutItemOnDisplay] = 240 ; Caption[:PutItemOnDisplay] = 'Put Item on Display' ; Type[:PutItemOnDisplay] = :Hauling
    ENUM[241] = :UnkFakeNoJob ; NUME[:UnkFakeNoJob] = 241 ; Caption[:UnkFakeNoJob] = 'No Job' ; Type[:UnkFakeNoJob] = :Crime
    ENUM[242] = :InterrogateSubject ; NUME[:InterrogateSubject] = 242 ; Caption[:InterrogateSubject] = 'Interrogate Subject' ; Type[:InterrogateSubject] = :LawEnforcement
    ENUM[243] = :UnkFakeNoActivity ; NUME[:UnkFakeNoActivity] = 243 ; Caption[:UnkFakeNoActivity] = 'No Activity' ; Type[:UnkFakeNoActivity] = :Crime
end

class JobTypeClass < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Misc ; NUME[:Misc] = 0
    ENUM[1] = :Digging ; NUME[:Digging] = 1
    ENUM[2] = :Building ; NUME[:Building] = 2
    ENUM[3] = :Hauling ; NUME[:Hauling] = 3
    ENUM[4] = :LifeSupport ; NUME[:LifeSupport] = 4
    ENUM[5] = :TidyUp ; NUME[:TidyUp] = 5
    ENUM[6] = :Leisure ; NUME[:Leisure] = 6
    ENUM[7] = :Gathering ; NUME[:Gathering] = 7
    ENUM[8] = :Manufacture ; NUME[:Manufacture] = 8
    ENUM[9] = :Improvement ; NUME[:Improvement] = 9
    ENUM[10] = :Crime ; NUME[:Crime] = 10
    ENUM[11] = :LawEnforcement ; NUME[:LawEnforcement] = 11
    ENUM[12] = :StrangeMood ; NUME[:StrangeMood] = 12
    ENUM[13] = :UnitHandling ; NUME[:UnitHandling] = 13
    ENUM[14] = :SiegeWeapon ; NUME[:SiegeWeapon] = 14
    ENUM[15] = :Medicine ; NUME[:Medicine] = 15
end

class Justification < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :JustifyLeft ; NUME[:JustifyLeft] = 0
    ENUM[1] = :JustifyCenter ; NUME[:JustifyCenter] = 1
    ENUM[2] = :JustifyRight ; NUME[:JustifyRight] = 2
    ENUM[3] = :JustifyCont ; NUME[:JustifyCont] = 3
    ENUM[4] = :NotTruetype ; NUME[:NotTruetype] = 4
end

class KitchenExcType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1] = :Cook ; NUME[:Cook] = 1
    ENUM[2] = :Brew ; NUME[:Brew] = 2
end

class LairType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :SIMPLE_MOUND ; NUME[:SIMPLE_MOUND] = 0
    ENUM[1] = :SIMPLE_BURROW ; NUME[:SIMPLE_BURROW] = 1
    ENUM[2] = :LABYRINTH ; NUME[:LABYRINTH] = 2
    ENUM[3] = :SHRINE ; NUME[:SHRINE] = 3
    ENUM[4] = :WILDERNESS_LOCATION ; NUME[:WILDERNESS_LOCATION] = 4
end

class LanguageNameCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Unit ; NUME[:Unit] = 0
    ENUM[1] = :Artifact ; NUME[:Artifact] = 1
    ENUM[2] = :ArtifactEvil ; NUME[:ArtifactEvil] = 2
    ENUM[3] = :Swamp ; NUME[:Swamp] = 3
    ENUM[4] = :Desert ; NUME[:Desert] = 4
    ENUM[5] = :Forest ; NUME[:Forest] = 5
    ENUM[6] = :Mountains ; NUME[:Mountains] = 6
    ENUM[7] = :Lake ; NUME[:Lake] = 7
    ENUM[8] = :Ocean ; NUME[:Ocean] = 8
    ENUM[9] = :Glacier ; NUME[:Glacier] = 9
    ENUM[10] = :Tundra ; NUME[:Tundra] = 10
    ENUM[11] = :Grassland ; NUME[:Grassland] = 11
    ENUM[12] = :Hills ; NUME[:Hills] = 12
    ENUM[13] = :Region ; NUME[:Region] = 13
    ENUM[14] = :Cave ; NUME[:Cave] = 14
    ENUM[15] = :SwampEvil ; NUME[:SwampEvil] = 15
    ENUM[16] = :DesertEvil ; NUME[:DesertEvil] = 16
    ENUM[17] = :ForestEvil ; NUME[:ForestEvil] = 17
    ENUM[18] = :MountainsEvil ; NUME[:MountainsEvil] = 18
    ENUM[19] = :LakeEvil ; NUME[:LakeEvil] = 19
    ENUM[20] = :OceanEvil ; NUME[:OceanEvil] = 20
    ENUM[21] = :GlacierEvil ; NUME[:GlacierEvil] = 21
    ENUM[22] = :TundraEvil ; NUME[:TundraEvil] = 22
    ENUM[23] = :GrasslandEvil ; NUME[:GrasslandEvil] = 23
    ENUM[24] = :HillsEvil ; NUME[:HillsEvil] = 24
    ENUM[25] = :SwampGood ; NUME[:SwampGood] = 25
    ENUM[26] = :DesertGood ; NUME[:DesertGood] = 26
    ENUM[27] = :ForestGood ; NUME[:ForestGood] = 27
    ENUM[28] = :MountainsGood ; NUME[:MountainsGood] = 28
    ENUM[29] = :LakeGood ; NUME[:LakeGood] = 29
    ENUM[30] = :OceanGood ; NUME[:OceanGood] = 30
    ENUM[31] = :GlacierGood ; NUME[:GlacierGood] = 31
    ENUM[32] = :TundraGood ; NUME[:TundraGood] = 32
    ENUM[33] = :GrasslandGood ; NUME[:GrasslandGood] = 33
    ENUM[34] = :HillsGood ; NUME[:HillsGood] = 34
    ENUM[35] = :ArtImage ; NUME[:ArtImage] = 35
    ENUM[36] = :MountainPeak ; NUME[:MountainPeak] = 36
    ENUM[37] = :River ; NUME[:River] = 37
    ENUM[38] = :Volcano ; NUME[:Volcano] = 38
    ENUM[39] = :SmallIsland ; NUME[:SmallIsland] = 39
    ENUM[40] = :Island ; NUME[:Island] = 40
    ENUM[41] = :Continent ; NUME[:Continent] = 41
    ENUM[42] = :CommonReligion ; NUME[:CommonReligion] = 42
    ENUM[43] = :Temple ; NUME[:Temple] = 43
    ENUM[44] = :Keep ; NUME[:Keep] = 44
    ENUM[45] = :Unknown2 ; NUME[:Unknown2] = 45
    ENUM[46] = :SymbolArtifice ; NUME[:SymbolArtifice] = 46
    ENUM[47] = :SymbolViolent ; NUME[:SymbolViolent] = 47
    ENUM[48] = :SymbolProtect ; NUME[:SymbolProtect] = 48
    ENUM[49] = :SymbolDomestic ; NUME[:SymbolDomestic] = 49
    ENUM[50] = :SymbolFood ; NUME[:SymbolFood] = 50
    ENUM[51] = :War ; NUME[:War] = 51
    ENUM[52] = :Battle ; NUME[:Battle] = 52
    ENUM[53] = :Siege ; NUME[:Siege] = 53
    ENUM[54] = :Road ; NUME[:Road] = 54
    ENUM[55] = :Wall ; NUME[:Wall] = 55
    ENUM[56] = :Bridge ; NUME[:Bridge] = 56
    ENUM[57] = :Tunnel ; NUME[:Tunnel] = 57
    ENUM[58] = :Tomb ; NUME[:Tomb] = 58
    ENUM[59] = :SymbolProtect2 ; NUME[:SymbolProtect2] = 59
    ENUM[60] = :Library ; NUME[:Library] = 60
    ENUM[61] = :Festival ; NUME[:Festival] = 61
    ENUM[62] = :EntityMerchantCompany ; NUME[:EntityMerchantCompany] = 62
    ENUM[63] = :CountingHouse ; NUME[:CountingHouse] = 63
    ENUM[64] = :EntityMerchantCompany2 ; NUME[:EntityMerchantCompany2] = 64
    ENUM[65] = :Guildhall ; NUME[:Guildhall] = 65
    ENUM[66] = :NecromancerTower ; NUME[:NecromancerTower] = 66
end

class LanguageNameComponent < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FrontCompound ; NUME[:FrontCompound] = 0
    ENUM[1] = :RearCompound ; NUME[:RearCompound] = 1
    ENUM[2] = :FirstAdjective ; NUME[:FirstAdjective] = 2
    ENUM[3] = :SecondAdjective ; NUME[:SecondAdjective] = 3
    ENUM[4] = :HyphenCompound ; NUME[:HyphenCompound] = 4
    ENUM[5] = :TheX ; NUME[:TheX] = 5
    ENUM[6] = :OfX ; NUME[:OfX] = 6
end

class LanguageNameType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Figure ; NUME[:Figure] = 0
    ENUM[1] = :Artifact ; NUME[:Artifact] = 1
    ENUM[2] = :Civilization ; NUME[:Civilization] = 2
    ENUM[3] = :Squad ; NUME[:Squad] = 3
    ENUM[4] = :Site ; NUME[:Site] = 4
    ENUM[5] = :World ; NUME[:World] = 5
    ENUM[6] = :Region ; NUME[:Region] = 6
    ENUM[7] = :Dungeon ; NUME[:Dungeon] = 7
    ENUM[8] = :LegendaryFigure ; NUME[:LegendaryFigure] = 8
    ENUM[9] = :FigureNoFirst ; NUME[:FigureNoFirst] = 9
    ENUM[10] = :FigureFirstOnly ; NUME[:FigureFirstOnly] = 10
    ENUM[11] = :ArtImage ; NUME[:ArtImage] = 11
    ENUM[12] = :AdventuringGroup ; NUME[:AdventuringGroup] = 12
    ENUM[13] = :ElfTree ; NUME[:ElfTree] = 13
    ENUM[14] = :SiteGovernment ; NUME[:SiteGovernment] = 14
    ENUM[15] = :NomadicGroup ; NUME[:NomadicGroup] = 15
    ENUM[16] = :Vessel ; NUME[:Vessel] = 16
    ENUM[17] = :MilitaryUnit ; NUME[:MilitaryUnit] = 17
    ENUM[18] = :Religion ; NUME[:Religion] = 18
    ENUM[19] = :MountainPeak ; NUME[:MountainPeak] = 19
    ENUM[20] = :River ; NUME[:River] = 20
    ENUM[21] = :Temple ; NUME[:Temple] = 21
    ENUM[22] = :Keep ; NUME[:Keep] = 22
    ENUM[23] = :MeadHall ; NUME[:MeadHall] = 23
    ENUM[24] = :SymbolArtifice ; NUME[:SymbolArtifice] = 24
    ENUM[25] = :SymbolViolent ; NUME[:SymbolViolent] = 25
    ENUM[26] = :SymbolProtect ; NUME[:SymbolProtect] = 26
    ENUM[27] = :SymbolDomestic ; NUME[:SymbolDomestic] = 27
    ENUM[28] = :SymbolFood ; NUME[:SymbolFood] = 28
    ENUM[29] = :War ; NUME[:War] = 29
    ENUM[30] = :Battle ; NUME[:Battle] = 30
    ENUM[31] = :Siege ; NUME[:Siege] = 31
    ENUM[32] = :Road ; NUME[:Road] = 32
    ENUM[33] = :Wall ; NUME[:Wall] = 33
    ENUM[34] = :Bridge ; NUME[:Bridge] = 34
    ENUM[35] = :Tunnel ; NUME[:Tunnel] = 35
    ENUM[36] = :PretentiousEntityPosition ; NUME[:PretentiousEntityPosition] = 36
    ENUM[37] = :Monument ; NUME[:Monument] = 37
    ENUM[38] = :Tomb ; NUME[:Tomb] = 38
    ENUM[39] = :OutcastGroup ; NUME[:OutcastGroup] = 39
    ENUM[40] = :Unk40 ; NUME[:Unk40] = 40
    ENUM[41] = :SymbolProtect2 ; NUME[:SymbolProtect2] = 41
    ENUM[42] = :Unk42 ; NUME[:Unk42] = 42
    ENUM[43] = :Library ; NUME[:Library] = 43
    ENUM[44] = :PoeticForm ; NUME[:PoeticForm] = 44
    ENUM[45] = :MusicalForm ; NUME[:MusicalForm] = 45
    ENUM[46] = :DanceForm ; NUME[:DanceForm] = 46
    ENUM[47] = :Festival ; NUME[:Festival] = 47
    ENUM[48] = :FalseIdentity ; NUME[:FalseIdentity] = 48
    ENUM[49] = :MerchantCompany ; NUME[:MerchantCompany] = 49
    ENUM[50] = :CountingHouse ; NUME[:CountingHouse] = 50
    ENUM[51] = :CraftGuild ; NUME[:CraftGuild] = 51
    ENUM[52] = :Guildhall ; NUME[:Guildhall] = 52
    ENUM[53] = :NecromancerTower ; NUME[:NecromancerTower] = 53
end

class LayerType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :Surface ; NUME[:Surface] = -1
    ENUM[0] = :Cavern1 ; NUME[:Cavern1] = 0
    ENUM[1] = :Cavern2 ; NUME[:Cavern2] = 1
    ENUM[2] = :Cavern3 ; NUME[:Cavern3] = 2
    ENUM[3] = :MagmaSea ; NUME[:MagmaSea] = 3
    ENUM[4] = :Underworld ; NUME[:Underworld] = 4
end

class LeverTargetType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    BuildingType = Hash.new(:NONE)
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[66] = :BarsVertical ; NUME[:BarsVertical] = 66
    ENUM[70] = :BarsFloor ; NUME[:BarsFloor] = 70
    ENUM[83] = :SpearsSpikes ; NUME[:SpearsSpikes] = 83 ; BuildingType[:SpearsSpikes] = :Trap
    ENUM[84] = :TrackStop ; NUME[:TrackStop] = 84 ; BuildingType[:TrackStop] = :Trap
    ENUM[97] = :GearAssembly ; NUME[:GearAssembly] = 97
    ENUM[98] = :Bridge ; NUME[:Bridge] = 98
    ENUM[99] = :Chain ; NUME[:Chain] = 99
    ENUM[100] = :Door ; NUME[:Door] = 100
    ENUM[101] = :EncrustGems ; NUME[:EncrustGems] = 101 ; BuildingType[:EncrustGems] = :NONE
    ENUM[102] = :Floodgate ; NUME[:Floodgate] = 102
    ENUM[103] = :GrateFloor ; NUME[:GrateFloor] = 103
    ENUM[104] = :Hatch ; NUME[:Hatch] = 104
    ENUM[106] = :Cage ; NUME[:Cage] = 106
    ENUM[108] = :LeverMechanism ; NUME[:LeverMechanism] = 108 ; BuildingType[:LeverMechanism] = :NONE
    ENUM[115] = :Support ; NUME[:Support] = 115
    ENUM[116] = :TargetMechanism ; NUME[:TargetMechanism] = 116 ; BuildingType[:TargetMechanism] = :NONE
    ENUM[119] = :GrateWall ; NUME[:GrateWall] = 119
end

class MachineType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Standard ; NUME[:Standard] = 0
end

class MasterpieceLossType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MELT ; NUME[:MELT] = 0
    ENUM[1] = :MAGMA ; NUME[:MAGMA] = 1
    ENUM[2] = :FORTIFICATION ; NUME[:FORTIFICATION] = 2
    ENUM[3] = :MINING ; NUME[:MINING] = 3
    ENUM[4] = :CAVEIN ; NUME[:CAVEIN] = 4
    ENUM[5] = :VEGETATION ; NUME[:VEGETATION] = 5
end

class MaterialFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Type = Hash.new(:None)
    ENUM[0] = :BONE ; NUME[:BONE] = 0 ; Type[:BONE] = :Bone
    ENUM[1] = :MEAT ; NUME[:MEAT] = 1
    ENUM[2] = :EDIBLE_VERMIN ; NUME[:EDIBLE_VERMIN] = 2
    ENUM[3] = :EDIBLE_RAW ; NUME[:EDIBLE_RAW] = 3
    ENUM[4] = :EDIBLE_COOKED ; NUME[:EDIBLE_COOKED] = 4
    ENUM[5] = :ALCOHOL ; NUME[:ALCOHOL] = 5
    ENUM[6] = :ITEMS_METAL ; NUME[:ITEMS_METAL] = 6
    ENUM[7] = :ITEMS_BARRED ; NUME[:ITEMS_BARRED] = 7
    ENUM[8] = :ITEMS_SCALED ; NUME[:ITEMS_SCALED] = 8
    ENUM[9] = :ITEMS_LEATHER ; NUME[:ITEMS_LEATHER] = 9
    ENUM[10] = :ITEMS_SOFT ; NUME[:ITEMS_SOFT] = 10
    ENUM[11] = :ITEMS_HARD ; NUME[:ITEMS_HARD] = 11
    ENUM[12] = :IMPLIES_ANIMAL_KILL ; NUME[:IMPLIES_ANIMAL_KILL] = 12
    ENUM[13] = :ALCOHOL_PLANT ; NUME[:ALCOHOL_PLANT] = 13
    ENUM[14] = :ALCOHOL_CREATURE ; NUME[:ALCOHOL_CREATURE] = 14
    ENUM[15] = :CHEESE_PLANT ; NUME[:CHEESE_PLANT] = 15
    ENUM[16] = :CHEESE_CREATURE ; NUME[:CHEESE_CREATURE] = 16
    ENUM[17] = :POWDER_MISC_PLANT ; NUME[:POWDER_MISC_PLANT] = 17
    ENUM[18] = :POWDER_MISC_CREATURE ; NUME[:POWDER_MISC_CREATURE] = 18
    ENUM[19] = :STOCKPILE_GLOB ; NUME[:STOCKPILE_GLOB] = 19
    ENUM[20] = :LIQUID_MISC_PLANT ; NUME[:LIQUID_MISC_PLANT] = 20
    ENUM[21] = :LIQUID_MISC_CREATURE ; NUME[:LIQUID_MISC_CREATURE] = 21
    ENUM[22] = :LIQUID_MISC_OTHER ; NUME[:LIQUID_MISC_OTHER] = 22
    ENUM[23] = :WOOD ; NUME[:WOOD] = 23 ; Type[:WOOD] = :Wood
    ENUM[24] = :THREAD_PLANT ; NUME[:THREAD_PLANT] = 24 ; Type[:THREAD_PLANT] = :Cloth
    ENUM[25] = :TOOTH ; NUME[:TOOTH] = 25 ; Type[:TOOTH] = :Ivory
    ENUM[26] = :HORN ; NUME[:HORN] = 26 ; Type[:HORN] = :Horn
    ENUM[27] = :PEARL ; NUME[:PEARL] = 27 ; Type[:PEARL] = :Pearl
    ENUM[28] = :SHELL ; NUME[:SHELL] = 28 ; Type[:SHELL] = :Shell
    ENUM[29] = :LEATHER ; NUME[:LEATHER] = 29 ; Type[:LEATHER] = :Leather
    ENUM[30] = :SILK ; NUME[:SILK] = 30 ; Type[:SILK] = :Cloth
    ENUM[31] = :SOAP ; NUME[:SOAP] = 31
    ENUM[32] = :ROTS ; NUME[:ROTS] = 32
    ENUM[33] = :IS_DYE ; NUME[:IS_DYE] = 33
    ENUM[34] = :POWDER_MISC ; NUME[:POWDER_MISC] = 34
    ENUM[35] = :LIQUID_MISC ; NUME[:LIQUID_MISC] = 35
    ENUM[36] = :STRUCTURAL_PLANT_MAT ; NUME[:STRUCTURAL_PLANT_MAT] = 36
    ENUM[37] = :SEED_MAT ; NUME[:SEED_MAT] = 37
    ENUM[38] = :LEAF_MAT ; NUME[:LEAF_MAT] = 38
    ENUM[39] = :CHEESE ; NUME[:CHEESE] = 39
    ENUM[40] = :ENTERS_BLOOD ; NUME[:ENTERS_BLOOD] = 40
    ENUM[41] = :BLOOD_MAP_DESCRIPTOR ; NUME[:BLOOD_MAP_DESCRIPTOR] = 41
    ENUM[42] = :ICHOR_MAP_DESCRIPTOR ; NUME[:ICHOR_MAP_DESCRIPTOR] = 42
    ENUM[43] = :GOO_MAP_DESCRIPTOR ; NUME[:GOO_MAP_DESCRIPTOR] = 43
    ENUM[44] = :SLIME_MAP_DESCRIPTOR ; NUME[:SLIME_MAP_DESCRIPTOR] = 44
    ENUM[45] = :PUS_MAP_DESCRIPTOR ; NUME[:PUS_MAP_DESCRIPTOR] = 45
    ENUM[46] = :GENERATES_MIASMA ; NUME[:GENERATES_MIASMA] = 46
    ENUM[47] = :IS_METAL ; NUME[:IS_METAL] = 47 ; Type[:IS_METAL] = :Metal
    ENUM[48] = :IS_GEM ; NUME[:IS_GEM] = 48 ; Type[:IS_GEM] = :Gem
    ENUM[49] = :IS_GLASS ; NUME[:IS_GLASS] = 49 ; Type[:IS_GLASS] = :Glass
    ENUM[50] = :CRYSTAL_GLASSABLE ; NUME[:CRYSTAL_GLASSABLE] = 50
    ENUM[51] = :ITEMS_WEAPON ; NUME[:ITEMS_WEAPON] = 51
    ENUM[52] = :ITEMS_WEAPON_RANGED ; NUME[:ITEMS_WEAPON_RANGED] = 52
    ENUM[53] = :ITEMS_ANVIL ; NUME[:ITEMS_ANVIL] = 53
    ENUM[54] = :ITEMS_AMMO ; NUME[:ITEMS_AMMO] = 54
    ENUM[55] = :ITEMS_DIGGER ; NUME[:ITEMS_DIGGER] = 55
    ENUM[56] = :ITEMS_ARMOR ; NUME[:ITEMS_ARMOR] = 56
    ENUM[57] = :ITEMS_DELICATE ; NUME[:ITEMS_DELICATE] = 57
    ENUM[58] = :ITEMS_SIEGE_ENGINE ; NUME[:ITEMS_SIEGE_ENGINE] = 58
    ENUM[59] = :ITEMS_QUERN ; NUME[:ITEMS_QUERN] = 59
    ENUM[60] = :IS_STONE ; NUME[:IS_STONE] = 60 ; Type[:IS_STONE] = :Stone
    ENUM[61] = :UNDIGGABLE ; NUME[:UNDIGGABLE] = 61
    ENUM[62] = :YARN ; NUME[:YARN] = 62 ; Type[:YARN] = :Cloth
    ENUM[63] = :STOCKPILE_GLOB_PASTE ; NUME[:STOCKPILE_GLOB_PASTE] = 63
    ENUM[64] = :STOCKPILE_GLOB_PRESSED ; NUME[:STOCKPILE_GLOB_PRESSED] = 64
    ENUM[65] = :DISPLAY_UNGLAZED ; NUME[:DISPLAY_UNGLAZED] = 65
    ENUM[66] = :DO_NOT_CLEAN_GLOB ; NUME[:DO_NOT_CLEAN_GLOB] = 66
    ENUM[67] = :NO_STONE_STOCKPILE ; NUME[:NO_STONE_STOCKPILE] = 67
    ENUM[68] = :STOCKPILE_THREAD_METAL ; NUME[:STOCKPILE_THREAD_METAL] = 68
    ENUM[69] = :SWEAT_MAP_DESCRIPTOR ; NUME[:SWEAT_MAP_DESCRIPTOR] = 69
    ENUM[70] = :TEARS_MAP_DESCRIPTOR ; NUME[:TEARS_MAP_DESCRIPTOR] = 70
    ENUM[71] = :SPIT_MAP_DESCRIPTOR ; NUME[:SPIT_MAP_DESCRIPTOR] = 71
    ENUM[72] = :EVAPORATES ; NUME[:EVAPORATES] = 72
    ENUM[74] = :IS_CERAMIC ; NUME[:IS_CERAMIC] = 74
end

class MatterState < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Solid ; NUME[:Solid] = 0
    ENUM[1] = :Liquid ; NUME[:Liquid] = 1
    ENUM[2] = :Gas ; NUME[:Gas] = 2
    ENUM[3] = :Powder ; NUME[:Powder] = 3
    ENUM[4] = :Paste ; NUME[:Paste] = 4
    ENUM[5] = :Pressed ; NUME[:Pressed] = 5
end

class MeetingEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :AcceptAgreement ; NUME[:AcceptAgreement] = 0
    ENUM[1] = :RejectAgreement ; NUME[:RejectAgreement] = 1
    ENUM[2] = :AcceptPeace ; NUME[:AcceptPeace] = 2
    ENUM[3] = :RejectPeace ; NUME[:RejectPeace] = 3
    ENUM[4] = :ExportAgreement ; NUME[:ExportAgreement] = 4
    ENUM[5] = :ImportAgreement ; NUME[:ImportAgreement] = 5
end

class MeetingTopic < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DiscussCurrent ; NUME[:DiscussCurrent] = 0
    ENUM[1] = :RequestPeace ; NUME[:RequestPeace] = 1
    ENUM[2] = :TreeQuota ; NUME[:TreeQuota] = 2
    ENUM[3] = :BecomeLandHolder ; NUME[:BecomeLandHolder] = 3
    ENUM[4] = :PromoteLandHolder ; NUME[:PromoteLandHolder] = 4
    ENUM[5] = :ExportAgreement ; NUME[:ExportAgreement] = 5
    ENUM[6] = :ImportAgreement ; NUME[:ImportAgreement] = 6
    ENUM[7] = :PleasantPlace ; NUME[:PleasantPlace] = 7
    ENUM[8] = :WorldStatus ; NUME[:WorldStatus] = 8
    ENUM[9] = :TributeAgreement ; NUME[:TributeAgreement] = 9
end

class MentalAttributeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ANALYTICAL_ABILITY ; NUME[:ANALYTICAL_ABILITY] = 0
    ENUM[1] = :FOCUS ; NUME[:FOCUS] = 1
    ENUM[2] = :WILLPOWER ; NUME[:WILLPOWER] = 2
    ENUM[3] = :CREATIVITY ; NUME[:CREATIVITY] = 3
    ENUM[4] = :INTUITION ; NUME[:INTUITION] = 4
    ENUM[5] = :PATIENCE ; NUME[:PATIENCE] = 5
    ENUM[6] = :MEMORY ; NUME[:MEMORY] = 6
    ENUM[7] = :LINGUISTIC_ABILITY ; NUME[:LINGUISTIC_ABILITY] = 7
    ENUM[8] = :SPATIAL_SENSE ; NUME[:SPATIAL_SENSE] = 8
    ENUM[9] = :MUSICALITY ; NUME[:MUSICALITY] = 9
    ENUM[10] = :KINESTHETIC_SENSE ; NUME[:KINESTHETIC_SENSE] = 10
    ENUM[11] = :EMPATHY ; NUME[:EMPATHY] = 11
    ENUM[12] = :SOCIAL_AWARENESS ; NUME[:SOCIAL_AWARENESS] = 12
end

class MentalPictureElementType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HF ; NUME[:HF] = 0
    ENUM[1] = :SITE ; NUME[:SITE] = 1
    ENUM[2] = :REGION ; NUME[:REGION] = 2
end

class MentalPicturePropertyType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DATE ; NUME[:DATE] = 0
    ENUM[1] = :ACTION ; NUME[:ACTION] = 1
    ENUM[2] = :TOOL ; NUME[:TOOL] = 2
    ENUM[3] = :EMOTION ; NUME[:EMOTION] = 3
    ENUM[4] = :COLOR_PATTERN ; NUME[:COLOR_PATTERN] = 4
    ENUM[5] = :SHAPE ; NUME[:SHAPE] = 5
    ENUM[6] = :ADJECTIVE ; NUME[:ADJECTIVE] = 6
    ENUM[7] = :POSITION ; NUME[:POSITION] = 7
    ENUM[8] = :TIME ; NUME[:TIME] = 8
end

class MiscTraitType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Tag = Hash.new
    ENUM[0] = :RequestWaterCooldown ; NUME[:RequestWaterCooldown] = 0
    ENUM[1] = :RequestFoodCooldown ; NUME[:RequestFoodCooldown] = 1
    ENUM[2] = :RequestRescueCooldown ; NUME[:RequestRescueCooldown] = 2
    ENUM[3] = :RequestHealthcareCooldown ; NUME[:RequestHealthcareCooldown] = 3
    ENUM[4] = :GetDrinkCooldown ; NUME[:GetDrinkCooldown] = 4
    ENUM[5] = :GetFoodCooldown ; NUME[:GetFoodCooldown] = 5
    ENUM[6] = :CleanSelfCooldown ; NUME[:CleanSelfCooldown] = 6
    ENUM[7] = :Migrant ; NUME[:Migrant] = 7
    ENUM[8] = :RoomComplaint ; NUME[:RoomComplaint] = 8
    ENUM[9] = :UnnamedResident ; NUME[:UnnamedResident] = 9
    ENUM[10] = :RentBedroomCooldown ; NUME[:RentBedroomCooldown] = 10
    ENUM[11] = :ClaimTrinketCooldown ; NUME[:ClaimTrinketCooldown] = 11
    ENUM[12] = :ClaimClothingCooldown ; NUME[:ClaimClothingCooldown] = 12
    ENUM[13] = :WantsDrink ; NUME[:WantsDrink] = 13 ; Tag[:WantsDrink] = 'ALCOHOLIC'
    ENUM[18] = :PrepareToDie ; NUME[:PrepareToDie] = 18
    ENUM[19] = :CaveAdapt ; NUME[:CaveAdapt] = 19 ; Tag[:CaveAdapt] = 'CAVE_ADAPT'
    ENUM[24] = :FollowUnitCooldown ; NUME[:FollowUnitCooldown] = 24
    ENUM[28] = :DangerousTerrainCooldown ; NUME[:DangerousTerrainCooldown] = 28
    ENUM[29] = :Beaching ; NUME[:Beaching] = 29
    ENUM[30] = :IdleAreaCooldown ; NUME[:IdleAreaCooldown] = 30
    ENUM[32] = :PartiedOut ; NUME[:PartiedOut] = 32 ; Tag[:PartiedOut] = 'PARTIED_OUT'
    ENUM[33] = :DiagnosePatientCooldown ; NUME[:DiagnosePatientCooldown] = 33
    ENUM[34] = :DressWoundCooldown ; NUME[:DressWoundCooldown] = 34
    ENUM[35] = :CleanPatientCooldown ; NUME[:CleanPatientCooldown] = 35
    ENUM[36] = :SurgeryCooldown ; NUME[:SurgeryCooldown] = 36
    ENUM[37] = :SutureCooldown ; NUME[:SutureCooldown] = 37
    ENUM[38] = :SetBoneCooldown ; NUME[:SetBoneCooldown] = 38
    ENUM[39] = :PlaceInTractionCooldown ; NUME[:PlaceInTractionCooldown] = 39
    ENUM[40] = :ApplyCastCooldown ; NUME[:ApplyCastCooldown] = 40
    ENUM[41] = :ImmobilizeBreakCooldown ; NUME[:ImmobilizeBreakCooldown] = 41
    ENUM[42] = :BringCrutchCooldown ; NUME[:BringCrutchCooldown] = 42
    ENUM[44] = :MilkCounter ; NUME[:MilkCounter] = 44 ; Tag[:MilkCounter] = 'MILK_COUNTER'
    ENUM[45] = :HadDrill ; NUME[:HadDrill] = 45
    ENUM[46] = :CompletedDrill ; NUME[:CompletedDrill] = 46
    ENUM[47] = :EggSpent ; NUME[:EggSpent] = 47 ; Tag[:EggSpent] = 'EGG_SPENT'
    ENUM[48] = :GroundedAnimalAnger ; NUME[:GroundedAnimalAnger] = 48 ; Tag[:GroundedAnimalAnger] = 'GROUNDED_ANIMAL_ANGER'
    ENUM[50] = :TimeSinceSuckedBlood ; NUME[:TimeSinceSuckedBlood] = 50 ; Tag[:TimeSinceSuckedBlood] = 'TIME_SINCE_SUCKED_BLOOD'
    ENUM[51] = :DrinkingBlood ; NUME[:DrinkingBlood] = 51 ; Tag[:DrinkingBlood] = 'DRINKING_BLOOD'
    ENUM[54] = :RevertWildTimer ; NUME[:RevertWildTimer] = 54
    ENUM[56] = :NoPantsAnger ; NUME[:NoPantsAnger] = 56
    ENUM[57] = :NoShirtAnger ; NUME[:NoShirtAnger] = 57
    ENUM[58] = :NoShoesAnger ; NUME[:NoShoesAnger] = 58
    ENUM[68] = :CitizenshipCooldown ; NUME[:CitizenshipCooldown] = 68
end

class MonumentType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :TOMB ; NUME[:TOMB] = 0
    ENUM[1] = :VAULT ; NUME[:VAULT] = 1
end

class MoodType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Fey ; NUME[:Fey] = 0
    ENUM[1] = :Secretive ; NUME[:Secretive] = 1
    ENUM[2] = :Possessed ; NUME[:Possessed] = 2
    ENUM[3] = :Macabre ; NUME[:Macabre] = 3
    ENUM[4] = :Fell ; NUME[:Fell] = 4
    ENUM[5] = :Melancholy ; NUME[:Melancholy] = 5
    ENUM[6] = :Raving ; NUME[:Raving] = 6
    ENUM[7] = :Berserk ; NUME[:Berserk] = 7
    ENUM[8] = :Baby ; NUME[:Baby] = 8
    ENUM[9] = :Traumatized ; NUME[:Traumatized] = 9
end

class MountainPeakFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :IsVolcano ; NUME[:IsVolcano] = 0
end

class MusicalFormMelodyFrequency < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Always ; NUME[:Always] = 0
    ENUM[1] = :Often ; NUME[:Often] = 1
    ENUM[2] = :Sometimes ; NUME[:Sometimes] = 2
end

class MusicalFormMelodyStyle < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Rising ; NUME[:Rising] = 0
    ENUM[1] = :Falling ; NUME[:Falling] = 1
    ENUM[2] = :RisingFalling ; NUME[:RisingFalling] = 2
    ENUM[3] = :FallingRising ; NUME[:FallingRising] = 3
end

class MusicalFormPassageComponentType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Melody ; NUME[:Melody] = 0
    ENUM[1] = :Counterpoint ; NUME[:Counterpoint] = 1
    ENUM[2] = :Harmony ; NUME[:Harmony] = 2
    ENUM[3] = :Rhythm ; NUME[:Rhythm] = 3
    ENUM[4] = :Unspecified ; NUME[:Unspecified] = 4
end

class MusicalFormPassageLengthType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Short ; NUME[:Short] = 0
    ENUM[1] = :MidLength ; NUME[:MidLength] = 1
    ENUM[2] = :Long ; NUME[:Long] = 2
    ENUM[3] = :Varied ; NUME[:Varied] = 3
end

class MusicalFormPassageType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Unrelated ; NUME[:Unrelated] = 0
    ENUM[1] = :Introduction ; NUME[:Introduction] = 1
    ENUM[2] = :Exposition ; NUME[:Exposition] = 2
    ENUM[3] = :Recapitulation ; NUME[:Recapitulation] = 3
    ENUM[4] = :Synthesis ; NUME[:Synthesis] = 4
    ENUM[5] = :Verse ; NUME[:Verse] = 5
    ENUM[6] = :Chorus ; NUME[:Chorus] = 6
    ENUM[7] = :Finale ; NUME[:Finale] = 7
    ENUM[8] = :Coda ; NUME[:Coda] = 8
    ENUM[9] = :BridgePassage ; NUME[:BridgePassage] = 9
    ENUM[10] = :Theme ; NUME[:Theme] = 10
    ENUM[11] = :Variation ; NUME[:Variation] = 11
end

class MusicalFormPitchStyle < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :SinglePitchesOnly ; NUME[:SinglePitchesOnly] = 0
    ENUM[1] = :IntervalsOnly ; NUME[:IntervalsOnly] = 1
    ENUM[2] = :SparseChords ; NUME[:SparseChords] = 2
    ENUM[3] = :PitchClusters ; NUME[:PitchClusters] = 3
    ENUM[4] = :ChordLayers ; NUME[:ChordLayers] = 4
end

class MusicalFormPurpose < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Entertainment ; NUME[:Entertainment] = 0
    ENUM[1] = :Commemoration ; NUME[:Commemoration] = 1
    ENUM[2] = :Devotion ; NUME[:Devotion] = 2
    ENUM[3] = :Military ; NUME[:Military] = 3
end

class MusicalFormStyle < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :FreeTempo ; NUME[:FreeTempo] = 0
    ENUM[1] = :VerySlow ; NUME[:VerySlow] = 1
    ENUM[2] = :Slow ; NUME[:Slow] = 2
    ENUM[3] = :WalkingPace ; NUME[:WalkingPace] = 3
    ENUM[4] = :ModeratelyPaced ; NUME[:ModeratelyPaced] = 4
    ENUM[5] = :ModeratelyFast ; NUME[:ModeratelyFast] = 5
    ENUM[6] = :Fast ; NUME[:Fast] = 6
    ENUM[7] = :VeryFast ; NUME[:VeryFast] = 7
    ENUM[8] = :ExtremelyFast ; NUME[:ExtremelyFast] = 8
    ENUM[9] = :DoubleTempo ; NUME[:DoubleTempo] = 9
    ENUM[10] = :HalfTempo ; NUME[:HalfTempo] = 10
    ENUM[11] = :Faster ; NUME[:Faster] = 11
    ENUM[12] = :Slower ; NUME[:Slower] = 12
    ENUM[13] = :ResumeTempo ; NUME[:ResumeTempo] = 13
    ENUM[14] = :OriginalTempo ; NUME[:OriginalTempo] = 14
    ENUM[15] = :Accelerates ; NUME[:Accelerates] = 15
    ENUM[16] = :SlowsAndBroadens ; NUME[:SlowsAndBroadens] = 16
    ENUM[17] = :ConsistentlySlowing ; NUME[:ConsistentlySlowing] = 17
    ENUM[18] = :HurriedPace ; NUME[:HurriedPace] = 18
    ENUM[19] = :GraduallySlowsAtEnd ; NUME[:GraduallySlowsAtEnd] = 19
    ENUM[20] = :WhisperedUndertones ; NUME[:WhisperedUndertones] = 20
    ENUM[21] = :VerySoft ; NUME[:VerySoft] = 21
    ENUM[22] = :Soft ; NUME[:Soft] = 22
    ENUM[23] = :ModeratelySoft ; NUME[:ModeratelySoft] = 23
    ENUM[24] = :ModeratelyLoud ; NUME[:ModeratelyLoud] = 24
    ENUM[25] = :Loud ; NUME[:Loud] = 25
    ENUM[26] = :VeryLoud ; NUME[:VeryLoud] = 26
    ENUM[27] = :BecomeLouderAndLouder ; NUME[:BecomeLouderAndLouder] = 27
    ENUM[28] = :BecomeSofterAndSofter ; NUME[:BecomeSofterAndSofter] = 28
    ENUM[29] = :FadeIntoSilence ; NUME[:FadeIntoSilence] = 29
    ENUM[30] = :StartLoudThenImmediatelySoft ; NUME[:StartLoudThenImmediatelySoft] = 30
    ENUM[31] = :SlowsAndDiesAwayAtEnd ; NUME[:SlowsAndDiesAwayAtEnd] = 31
    ENUM[32] = :BecomesCalmerAtEnd ; NUME[:BecomesCalmerAtEnd] = 32
    ENUM[33] = :BecomesFrenzied ; NUME[:BecomesFrenzied] = 33
    ENUM[34] = :StressRhythm ; NUME[:StressRhythm] = 34
    ENUM[35] = :BeStately ; NUME[:BeStately] = 35
    ENUM[36] = :BeBright ; NUME[:BeBright] = 36
    ENUM[37] = :BeLively ; NUME[:BeLively] = 37
    ENUM[38] = :BeSkilled ; NUME[:BeSkilled] = 38
    ENUM[39] = :BeVigorous ; NUME[:BeVigorous] = 39
    ENUM[40] = :BeSpirited ; NUME[:BeSpirited] = 40
    ENUM[41] = :BeDelicate ; NUME[:BeDelicate] = 41
    ENUM[42] = :BeFiery ; NUME[:BeFiery] = 42
    ENUM[43] = :BringSenseOfMotion ; NUME[:BringSenseOfMotion] = 43
    ENUM[44] = :BeFiery2 ; NUME[:BeFiery2] = 44
    ENUM[45] = :WithFeeling ; NUME[:WithFeeling] = 45
    ENUM[46] = :FeelAgitated ; NUME[:FeelAgitated] = 46
    ENUM[47] = :BePassionate ; NUME[:BePassionate] = 47
    ENUM[48] = :Sparkle ; NUME[:Sparkle] = 48
    ENUM[49] = :BeBroad ; NUME[:BeBroad] = 49
    ENUM[50] = :BeMadeSweetly ; NUME[:BeMadeSweetly] = 50
    ENUM[51] = :BeStrong ; NUME[:BeStrong] = 51
    ENUM[52] = :BeEnergetic ; NUME[:BeEnergetic] = 52
    ENUM[53] = :BeForceful ; NUME[:BeForceful] = 53
    ENUM[54] = :FeelHeroic ; NUME[:FeelHeroic] = 54
    ENUM[55] = :BeMadeExpressively ; NUME[:BeMadeExpressively] = 55
    ENUM[56] = :FeelFurious ; NUME[:FeelFurious] = 56
    ENUM[57] = :BeJoyful ; NUME[:BeJoyful] = 57
    ENUM[58] = :BeGrand ; NUME[:BeGrand] = 58
    ENUM[59] = :BeMerry ; NUME[:BeMerry] = 59
    ENUM[60] = :BeGraceful ; NUME[:BeGraceful] = 60
    ENUM[61] = :BuildAsItProceeds ; NUME[:BuildAsItProceeds] = 61
    ENUM[62] = :EvokeTears ; NUME[:EvokeTears] = 62
    ENUM[63] = :BeMelancholic ; NUME[:BeMelancholic] = 63
    ENUM[64] = :FeelMournful ; NUME[:FeelMournful] = 64
    ENUM[65] = :BeMadeWithLightTouch ; NUME[:BeMadeWithLightTouch] = 65
    ENUM[66] = :FeelHeavy ; NUME[:FeelHeavy] = 66
    ENUM[67] = :FeelMysterious ; NUME[:FeelMysterious] = 67
    ENUM[68] = :BeJumpy ; NUME[:BeJumpy] = 68
    ENUM[69] = :FeelPlayful ; NUME[:FeelPlayful] = 69
    ENUM[70] = :FeelTender ; NUME[:FeelTender] = 70
    ENUM[71] = :FeelCalm ; NUME[:FeelCalm] = 71
    ENUM[72] = :BeTriumphant ; NUME[:BeTriumphant] = 72
end

class NeedType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Socialize ; NUME[:Socialize] = 0
    ENUM[1] = :DrinkAlcohol ; NUME[:DrinkAlcohol] = 1
    ENUM[2] = :PrayOrMeditate ; NUME[:PrayOrMeditate] = 2
    ENUM[3] = :StayOccupied ; NUME[:StayOccupied] = 3
    ENUM[4] = :BeCreative ; NUME[:BeCreative] = 4
    ENUM[5] = :Excitement ; NUME[:Excitement] = 5
    ENUM[6] = :LearnSomething ; NUME[:LearnSomething] = 6
    ENUM[7] = :BeWithFamily ; NUME[:BeWithFamily] = 7
    ENUM[8] = :BeWithFriends ; NUME[:BeWithFriends] = 8
    ENUM[9] = :HearEloquence ; NUME[:HearEloquence] = 9
    ENUM[10] = :UpholdTradition ; NUME[:UpholdTradition] = 10
    ENUM[11] = :SelfExamination ; NUME[:SelfExamination] = 11
    ENUM[12] = :MakeMerry ; NUME[:MakeMerry] = 12
    ENUM[13] = :CraftObject ; NUME[:CraftObject] = 13
    ENUM[14] = :MartialTraining ; NUME[:MartialTraining] = 14
    ENUM[15] = :PracticeSkill ; NUME[:PracticeSkill] = 15
    ENUM[16] = :TakeItEasy ; NUME[:TakeItEasy] = 16
    ENUM[17] = :MakeRomance ; NUME[:MakeRomance] = 17
    ENUM[18] = :SeeAnimal ; NUME[:SeeAnimal] = 18
    ENUM[19] = :SeeGreatBeast ; NUME[:SeeGreatBeast] = 19
    ENUM[20] = :AcquireObject ; NUME[:AcquireObject] = 20
    ENUM[21] = :EatGoodMeal ; NUME[:EatGoodMeal] = 21
    ENUM[22] = :Fight ; NUME[:Fight] = 22
    ENUM[23] = :CauseTrouble ; NUME[:CauseTrouble] = 23
    ENUM[24] = :Argue ; NUME[:Argue] = 24
    ENUM[25] = :BeExtravagant ; NUME[:BeExtravagant] = 25
    ENUM[26] = :Wander ; NUME[:Wander] = 26
    ENUM[27] = :HelpSomebody ; NUME[:HelpSomebody] = 27
    ENUM[28] = :ThinkAbstractly ; NUME[:ThinkAbstractly] = 28
    ENUM[29] = :AdmireArt ; NUME[:AdmireArt] = 29
end

class NemesisFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ACTIVE_ADVENTURER ; NUME[:ACTIVE_ADVENTURER] = 0
    ENUM[1] = :RETIRED_ADVENTURER ; NUME[:RETIRED_ADVENTURER] = 1
    ENUM[2] = :ADVENTURER ; NUME[:ADVENTURER] = 2
    ENUM[3] = :Unk3 ; NUME[:Unk3] = 3
    ENUM[4] = :Unk4 ; NUME[:Unk4] = 4
    ENUM[5] = :Unk5 ; NUME[:Unk5] = 5
    ENUM[6] = :Unk6 ; NUME[:Unk6] = 6
    ENUM[7] = :Unk7 ; NUME[:Unk7] = 7
    ENUM[8] = :Unk8 ; NUME[:Unk8] = 8
    ENUM[9] = :HERO ; NUME[:HERO] = 9
    ENUM[10] = :DEMIGOD ; NUME[:DEMIGOD] = 10
end

class NextGlobalId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Unit ; NUME[:Unit] = 0
    ENUM[1] = :Soul ; NUME[:Soul] = 1
    ENUM[2] = :Item ; NUME[:Item] = 2
    ENUM[3] = :Civ ; NUME[:Civ] = 3
    ENUM[4] = :Nem ; NUME[:Nem] = 4
    ENUM[5] = :Artifact ; NUME[:Artifact] = 5
    ENUM[6] = :Job ; NUME[:Job] = 6
    ENUM[7] = :Schedule ; NUME[:Schedule] = 7
    ENUM[8] = :Proj ; NUME[:Proj] = 8
    ENUM[9] = :Building ; NUME[:Building] = 9
    ENUM[10] = :Machine ; NUME[:Machine] = 10
    ENUM[11] = :FlowGuide ; NUME[:FlowGuide] = 11
    ENUM[12] = :Histfig ; NUME[:Histfig] = 12
    ENUM[13] = :Histevent ; NUME[:Histevent] = 13
    ENUM[14] = :Histeventcol ; NUME[:Histeventcol] = 14
    ENUM[15] = :Unitchunk ; NUME[:Unitchunk] = 15
    ENUM[16] = :Imagechunk ; NUME[:Imagechunk] = 16
    ENUM[17] = :Task ; NUME[:Task] = 17
    ENUM[18] = :Squad ; NUME[:Squad] = 18
    ENUM[19] = :Formation ; NUME[:Formation] = 19
    ENUM[20] = :Activity ; NUME[:Activity] = 20
    ENUM[21] = :InteractionInstance ; NUME[:InteractionInstance] = 21
    ENUM[22] = :WrittenContent ; NUME[:WrittenContent] = 22
    ENUM[23] = :Identity ; NUME[:Identity] = 23
    ENUM[24] = :Incident ; NUME[:Incident] = 24
    ENUM[25] = :Crime ; NUME[:Crime] = 25
    ENUM[26] = :Vehicle ; NUME[:Vehicle] = 26
    ENUM[27] = :Army ; NUME[:Army] = 27
    ENUM[28] = :ArmyController ; NUME[:ArmyController] = 28
    ENUM[29] = :ArmyTrackingInfo ; NUME[:ArmyTrackingInfo] = 29
    ENUM[30] = :CulturalIdentity ; NUME[:CulturalIdentity] = 30
    ENUM[31] = :Agreement ; NUME[:Agreement] = 31
    ENUM[32] = :PoeticForm ; NUME[:PoeticForm] = 32
    ENUM[33] = :MusicalForm ; NUME[:MusicalForm] = 33
    ENUM[34] = :DanceForm ; NUME[:DanceForm] = 34
    ENUM[35] = :Scale ; NUME[:Scale] = 35
    ENUM[36] = :Rhythm ; NUME[:Rhythm] = 36
    ENUM[37] = :Occupation ; NUME[:Occupation] = 37
    ENUM[38] = :BeliefSystem ; NUME[:BeliefSystem] = 38
    ENUM[39] = :ImageSet ; NUME[:ImageSet] = 39
    ENUM[40] = :DivinationSet ; NUME[:DivinationSet] = 40
end

class OccasionScheduleFeature < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[2] = :STORYTELLING ; NUME[:STORYTELLING] = 2
    ENUM[3] = :POETRY_RECITAL ; NUME[:POETRY_RECITAL] = 3
    ENUM[4] = :MUSICAL_PERFORMANCE ; NUME[:MUSICAL_PERFORMANCE] = 4
    ENUM[5] = :DANCE_PERFORMANCE ; NUME[:DANCE_PERFORMANCE] = 5
    ENUM[7] = :CRIERS_IN_FRONT ; NUME[:CRIERS_IN_FRONT] = 7
    ENUM[8] = :ORDER_OF_PRECEDENCE ; NUME[:ORDER_OF_PRECEDENCE] = 8
    ENUM[9] = :BANNERS ; NUME[:BANNERS] = 9
    ENUM[10] = :IMAGES ; NUME[:IMAGES] = 10
    ENUM[13] = :ACROBATS ; NUME[:ACROBATS] = 13
    ENUM[14] = :INCENSE_BURNING ; NUME[:INCENSE_BURNING] = 14
    ENUM[15] = :COSTUMES ; NUME[:COSTUMES] = 15
    ENUM[16] = :CANDLES ; NUME[:CANDLES] = 16
    ENUM[17] = :THE_GIVING_OF_ITEMS ; NUME[:THE_GIVING_OF_ITEMS] = 17
    ENUM[18] = :THE_SACRIFICE_OF_ITEMS ; NUME[:THE_SACRIFICE_OF_ITEMS] = 18
end

class OccasionScheduleType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :DANCE_PERFORMANCE ; NUME[:DANCE_PERFORMANCE] = 0
    ENUM[1] = :MUSICAL_PERFORMANCE ; NUME[:MUSICAL_PERFORMANCE] = 1
    ENUM[2] = :POETRY_RECITAL ; NUME[:POETRY_RECITAL] = 2
    ENUM[3] = :STORYTELLING ; NUME[:STORYTELLING] = 3
    ENUM[4] = :DANCE_COMPETITION ; NUME[:DANCE_COMPETITION] = 4
    ENUM[5] = :MUSICAL_COMPETITION ; NUME[:MUSICAL_COMPETITION] = 5
    ENUM[6] = :POETRY_COMPETITION ; NUME[:POETRY_COMPETITION] = 6
    ENUM[7] = :FOOT_RACE ; NUME[:FOOT_RACE] = 7
    ENUM[10] = :WRESTLING_COMPETITION ; NUME[:WRESTLING_COMPETITION] = 10
    ENUM[11] = :THROWING_COMPETITION ; NUME[:THROWING_COMPETITION] = 11
    ENUM[12] = :GLADIATORY_COMPETITION ; NUME[:GLADIATORY_COMPETITION] = 12
    ENUM[13] = :PROCESSION ; NUME[:PROCESSION] = 13
    ENUM[14] = :CEREMONY ; NUME[:CEREMONY] = 14
end

class OccupationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TAVERN_KEEPER ; NUME[:TAVERN_KEEPER] = 0
    ENUM[1] = :PERFORMER ; NUME[:PERFORMER] = 1
    ENUM[2] = :SCHOLAR ; NUME[:SCHOLAR] = 2
    ENUM[3] = :MERCENARY ; NUME[:MERCENARY] = 3
    ENUM[4] = :MONSTER_SLAYER ; NUME[:MONSTER_SLAYER] = 4
    ENUM[5] = :SCRIBE ; NUME[:SCRIBE] = 5
    ENUM[6] = :MESSENGER ; NUME[:MESSENGER] = 6
end

class OrganicMatCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Meat ; NUME[:Meat] = 0
    ENUM[1] = :Fish ; NUME[:Fish] = 1
    ENUM[2] = :UnpreparedFish ; NUME[:UnpreparedFish] = 2
    ENUM[3] = :Eggs ; NUME[:Eggs] = 3
    ENUM[4] = :Plants ; NUME[:Plants] = 4
    ENUM[5] = :PlantDrink ; NUME[:PlantDrink] = 5
    ENUM[6] = :CreatureDrink ; NUME[:CreatureDrink] = 6
    ENUM[7] = :PlantCheese ; NUME[:PlantCheese] = 7
    ENUM[8] = :CreatureCheese ; NUME[:CreatureCheese] = 8
    ENUM[9] = :Seed ; NUME[:Seed] = 9
    ENUM[10] = :Leaf ; NUME[:Leaf] = 10
    ENUM[11] = :PlantPowder ; NUME[:PlantPowder] = 11
    ENUM[12] = :CreaturePowder ; NUME[:CreaturePowder] = 12
    ENUM[13] = :Glob ; NUME[:Glob] = 13
    ENUM[14] = :PlantLiquid ; NUME[:PlantLiquid] = 14
    ENUM[15] = :CreatureLiquid ; NUME[:CreatureLiquid] = 15
    ENUM[16] = :MiscLiquid ; NUME[:MiscLiquid] = 16
    ENUM[17] = :Leather ; NUME[:Leather] = 17
    ENUM[18] = :Silk ; NUME[:Silk] = 18
    ENUM[19] = :PlantFiber ; NUME[:PlantFiber] = 19
    ENUM[20] = :Bone ; NUME[:Bone] = 20
    ENUM[21] = :Shell ; NUME[:Shell] = 21
    ENUM[22] = :Wood ; NUME[:Wood] = 22
    ENUM[23] = :Horn ; NUME[:Horn] = 23
    ENUM[24] = :Pearl ; NUME[:Pearl] = 24
    ENUM[25] = :Tooth ; NUME[:Tooth] = 25
    ENUM[26] = :EdibleCheese ; NUME[:EdibleCheese] = 26
    ENUM[27] = :AnyDrink ; NUME[:AnyDrink] = 27
    ENUM[28] = :EdiblePlant ; NUME[:EdiblePlant] = 28
    ENUM[29] = :CookableLiquid ; NUME[:CookableLiquid] = 29
    ENUM[30] = :CookablePowder ; NUME[:CookablePowder] = 30
    ENUM[31] = :CookableSeed ; NUME[:CookableSeed] = 31
    ENUM[32] = :CookableLeaf ; NUME[:CookableLeaf] = 32
    ENUM[33] = :Paste ; NUME[:Paste] = 33
    ENUM[34] = :Pressed ; NUME[:Pressed] = 34
    ENUM[35] = :Yarn ; NUME[:Yarn] = 35
    ENUM[36] = :MetalThread ; NUME[:MetalThread] = 36
    ENUM[37] = :Paper ; NUME[:Paper] = 37
    ENUM[38] = :Parchment ; NUME[:Parchment] = 38
end

class PantsFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :METAL_ARMOR_LEVELS ; NUME[:METAL_ARMOR_LEVELS] = 0
end

class PartOfSpeech < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Noun ; NUME[:Noun] = 0
    ENUM[1] = :NounPlural ; NUME[:NounPlural] = 1
    ENUM[2] = :Adjective ; NUME[:Adjective] = 2
    ENUM[3] = :Prefix ; NUME[:Prefix] = 3
    ENUM[4] = :Verb ; NUME[:Verb] = 4
    ENUM[5] = :Verb3rdPerson ; NUME[:Verb3rdPerson] = 5
    ENUM[6] = :VerbPast ; NUME[:VerbPast] = 6
    ENUM[7] = :VerbPassive ; NUME[:VerbPassive] = 7
    ENUM[8] = :VerbGerund ; NUME[:VerbGerund] = 8
end

class PatternType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MONOTONE ; NUME[:MONOTONE] = 0
    ENUM[1] = :STRIPES ; NUME[:STRIPES] = 1
    ENUM[2] = :IRIS_EYE ; NUME[:IRIS_EYE] = 2
    ENUM[3] = :SPOTS ; NUME[:SPOTS] = 3
    ENUM[4] = :PUPIL_EYE ; NUME[:PUPIL_EYE] = 4
    ENUM[5] = :MOTTLED ; NUME[:MOTTLED] = 5
end

class PerformanceEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :STORY ; NUME[:STORY] = 0
    ENUM[1] = :POETRY ; NUME[:POETRY] = 1
    ENUM[2] = :MUSIC ; NUME[:MUSIC] = 2
    ENUM[3] = :DANCE ; NUME[:DANCE] = 3
    ENUM[4] = :SERMON_EVENT ; NUME[:SERMON_EVENT] = 4
    ENUM[5] = :SERMON_SPHERE ; NUME[:SERMON_SPHERE] = 5
    ENUM[6] = :SERMON_PROMOTE_VALUE ; NUME[:SERMON_PROMOTE_VALUE] = 6
    ENUM[7] = :SERMON_INVEIGH_AGAINST_VALUE ; NUME[:SERMON_INVEIGH_AGAINST_VALUE] = 7
end

class PerformanceParticipantType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TELL_STORY ; NUME[:TELL_STORY] = 0
    ENUM[1] = :RECITE_POETRY ; NUME[:RECITE_POETRY] = 1
    ENUM[2] = :MAKE_MUSIC ; NUME[:MAKE_MUSIC] = 2
    ENUM[3] = :PERFORM_DANCE ; NUME[:PERFORM_DANCE] = 3
    ENUM[4] = :LISTEN ; NUME[:LISTEN] = 4
    ENUM[5] = :HEAR ; NUME[:HEAR] = 5
end

class PersonalityFacetType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :LOVE_PROPENSITY ; NUME[:LOVE_PROPENSITY] = 0
    ENUM[1] = :HATE_PROPENSITY ; NUME[:HATE_PROPENSITY] = 1
    ENUM[2] = :ENVY_PROPENSITY ; NUME[:ENVY_PROPENSITY] = 2
    ENUM[3] = :CHEER_PROPENSITY ; NUME[:CHEER_PROPENSITY] = 3
    ENUM[4] = :DEPRESSION_PROPENSITY ; NUME[:DEPRESSION_PROPENSITY] = 4
    ENUM[5] = :ANGER_PROPENSITY ; NUME[:ANGER_PROPENSITY] = 5
    ENUM[6] = :ANXIETY_PROPENSITY ; NUME[:ANXIETY_PROPENSITY] = 6
    ENUM[7] = :LUST_PROPENSITY ; NUME[:LUST_PROPENSITY] = 7
    ENUM[8] = :STRESS_VULNERABILITY ; NUME[:STRESS_VULNERABILITY] = 8
    ENUM[9] = :GREED ; NUME[:GREED] = 9
    ENUM[10] = :IMMODERATION ; NUME[:IMMODERATION] = 10
    ENUM[11] = :VIOLENT ; NUME[:VIOLENT] = 11
    ENUM[12] = :PERSEVERENCE ; NUME[:PERSEVERENCE] = 12
    ENUM[13] = :WASTEFULNESS ; NUME[:WASTEFULNESS] = 13
    ENUM[14] = :DISCORD ; NUME[:DISCORD] = 14
    ENUM[15] = :FRIENDLINESS ; NUME[:FRIENDLINESS] = 15
    ENUM[16] = :POLITENESS ; NUME[:POLITENESS] = 16
    ENUM[17] = :DISDAIN_ADVICE ; NUME[:DISDAIN_ADVICE] = 17
    ENUM[18] = :BRAVERY ; NUME[:BRAVERY] = 18
    ENUM[19] = :CONFIDENCE ; NUME[:CONFIDENCE] = 19
    ENUM[20] = :VANITY ; NUME[:VANITY] = 20
    ENUM[21] = :AMBITION ; NUME[:AMBITION] = 21
    ENUM[22] = :GRATITUDE ; NUME[:GRATITUDE] = 22
    ENUM[23] = :IMMODESTY ; NUME[:IMMODESTY] = 23
    ENUM[24] = :HUMOR ; NUME[:HUMOR] = 24
    ENUM[25] = :VENGEFUL ; NUME[:VENGEFUL] = 25
    ENUM[26] = :PRIDE ; NUME[:PRIDE] = 26
    ENUM[27] = :CRUELTY ; NUME[:CRUELTY] = 27
    ENUM[28] = :SINGLEMINDED ; NUME[:SINGLEMINDED] = 28
    ENUM[29] = :HOPEFUL ; NUME[:HOPEFUL] = 29
    ENUM[30] = :CURIOUS ; NUME[:CURIOUS] = 30
    ENUM[31] = :BASHFUL ; NUME[:BASHFUL] = 31
    ENUM[32] = :PRIVACY ; NUME[:PRIVACY] = 32
    ENUM[33] = :PERFECTIONIST ; NUME[:PERFECTIONIST] = 33
    ENUM[34] = :CLOSEMINDED ; NUME[:CLOSEMINDED] = 34
    ENUM[35] = :TOLERANT ; NUME[:TOLERANT] = 35
    ENUM[36] = :EMOTIONALLY_OBSESSIVE ; NUME[:EMOTIONALLY_OBSESSIVE] = 36
    ENUM[37] = :SWAYED_BY_EMOTIONS ; NUME[:SWAYED_BY_EMOTIONS] = 37
    ENUM[38] = :ALTRUISM ; NUME[:ALTRUISM] = 38
    ENUM[39] = :DUTIFULNESS ; NUME[:DUTIFULNESS] = 39
    ENUM[40] = :THOUGHTLESSNESS ; NUME[:THOUGHTLESSNESS] = 40
    ENUM[41] = :ORDERLINESS ; NUME[:ORDERLINESS] = 41
    ENUM[42] = :TRUST ; NUME[:TRUST] = 42
    ENUM[43] = :GREGARIOUSNESS ; NUME[:GREGARIOUSNESS] = 43
    ENUM[44] = :ASSERTIVENESS ; NUME[:ASSERTIVENESS] = 44
    ENUM[45] = :ACTIVITY_LEVEL ; NUME[:ACTIVITY_LEVEL] = 45
    ENUM[46] = :EXCITEMENT_SEEKING ; NUME[:EXCITEMENT_SEEKING] = 46
    ENUM[47] = :IMAGINATION ; NUME[:IMAGINATION] = 47
    ENUM[48] = :ABSTRACT_INCLINED ; NUME[:ABSTRACT_INCLINED] = 48
    ENUM[49] = :ART_INCLINED ; NUME[:ART_INCLINED] = 49
end

class PhysicalAttributeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :STRENGTH ; NUME[:STRENGTH] = 0
    ENUM[1] = :AGILITY ; NUME[:AGILITY] = 1
    ENUM[2] = :TOUGHNESS ; NUME[:TOUGHNESS] = 2
    ENUM[3] = :ENDURANCE ; NUME[:ENDURANCE] = 3
    ENUM[4] = :RECUPERATION ; NUME[:RECUPERATION] = 4
    ENUM[5] = :DISEASE_RESISTANCE ; NUME[:DISEASE_RESISTANCE] = 5
end

class PitchChoiceType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MEMBRANE_POSITION ; NUME[:MEMBRANE_POSITION] = 0
    ENUM[1] = :SUBPART_CHOICE ; NUME[:SUBPART_CHOICE] = 1
    ENUM[2] = :KEYBOARD ; NUME[:KEYBOARD] = 2
    ENUM[3] = :STOPPING_FRET ; NUME[:STOPPING_FRET] = 3
    ENUM[4] = :STOPPING_AGAINST_BODY ; NUME[:STOPPING_AGAINST_BODY] = 4
    ENUM[5] = :STOPPING_HOLE ; NUME[:STOPPING_HOLE] = 5
    ENUM[6] = :STOPPING_HOLE_KEY ; NUME[:STOPPING_HOLE_KEY] = 6
    ENUM[7] = :SLIDE ; NUME[:SLIDE] = 7
    ENUM[8] = :HARMONIC_SERIES ; NUME[:HARMONIC_SERIES] = 8
    ENUM[9] = :VALVE_ROUTES_AIR ; NUME[:VALVE_ROUTES_AIR] = 9
    ENUM[10] = :BP_IN_BELL ; NUME[:BP_IN_BELL] = 10
    ENUM[11] = :FOOT_PEDALS ; NUME[:FOOT_PEDALS] = 11
end

class PlantMaterialDef < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :BasicMat ; NUME[:BasicMat] = 0
    ENUM[1] = :Tree ; NUME[:Tree] = 1
    ENUM[2] = :Drink ; NUME[:Drink] = 2
    ENUM[3] = :Seed ; NUME[:Seed] = 3
    ENUM[4] = :Thread ; NUME[:Thread] = 4
    ENUM[5] = :Mill ; NUME[:Mill] = 5
    ENUM[6] = :ExtractVial ; NUME[:ExtractVial] = 6
    ENUM[7] = :ExtractBarrel ; NUME[:ExtractBarrel] = 7
    ENUM[8] = :ExtractStillVial ; NUME[:ExtractStillVial] = 8
end

class PlantRawFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SPRING ; NUME[:SPRING] = 0
    ENUM[1] = :SUMMER ; NUME[:SUMMER] = 1
    ENUM[2] = :AUTUMN ; NUME[:AUTUMN] = 2
    ENUM[3] = :WINTER ; NUME[:WINTER] = 3
    ENUM[5] = :SEED ; NUME[:SEED] = 5
    ENUM[6] = :TREE_HAS_MUSHROOM_CAP ; NUME[:TREE_HAS_MUSHROOM_CAP] = 6
    ENUM[7] = :DRINK ; NUME[:DRINK] = 7
    ENUM[8] = :EXTRACT_BARREL ; NUME[:EXTRACT_BARREL] = 8
    ENUM[9] = :EXTRACT_VIAL ; NUME[:EXTRACT_VIAL] = 9
    ENUM[10] = :EXTRACT_STILL_VIAL ; NUME[:EXTRACT_STILL_VIAL] = 10
    ENUM[11] = :GENERATED ; NUME[:GENERATED] = 11
    ENUM[12] = :THREAD ; NUME[:THREAD] = 12
    ENUM[13] = :MILL ; NUME[:MILL] = 13
    ENUM[20] = :WET ; NUME[:WET] = 20
    ENUM[21] = :DRY ; NUME[:DRY] = 21
    ENUM[22] = :BIOME_MOUNTAIN ; NUME[:BIOME_MOUNTAIN] = 22
    ENUM[23] = :BIOME_GLACIER ; NUME[:BIOME_GLACIER] = 23
    ENUM[24] = :BIOME_TUNDRA ; NUME[:BIOME_TUNDRA] = 24
    ENUM[25] = :BIOME_SWAMP_TEMPERATE_FRESHWATER ; NUME[:BIOME_SWAMP_TEMPERATE_FRESHWATER] = 25
    ENUM[26] = :BIOME_SWAMP_TEMPERATE_SALTWATER ; NUME[:BIOME_SWAMP_TEMPERATE_SALTWATER] = 26
    ENUM[27] = :BIOME_MARSH_TEMPERATE_FRESHWATER ; NUME[:BIOME_MARSH_TEMPERATE_FRESHWATER] = 27
    ENUM[28] = :BIOME_MARSH_TEMPERATE_SALTWATER ; NUME[:BIOME_MARSH_TEMPERATE_SALTWATER] = 28
    ENUM[29] = :BIOME_SWAMP_TROPICAL_FRESHWATER ; NUME[:BIOME_SWAMP_TROPICAL_FRESHWATER] = 29
    ENUM[30] = :BIOME_SWAMP_TROPICAL_SALTWATER ; NUME[:BIOME_SWAMP_TROPICAL_SALTWATER] = 30
    ENUM[31] = :BIOME_SWAMP_MANGROVE ; NUME[:BIOME_SWAMP_MANGROVE] = 31
    ENUM[32] = :BIOME_MARSH_TROPICAL_FRESHWATER ; NUME[:BIOME_MARSH_TROPICAL_FRESHWATER] = 32
    ENUM[33] = :BIOME_MARSH_TROPICAL_SALTWATER ; NUME[:BIOME_MARSH_TROPICAL_SALTWATER] = 33
    ENUM[34] = :BIOME_FOREST_TAIGA ; NUME[:BIOME_FOREST_TAIGA] = 34
    ENUM[35] = :BIOME_FOREST_TEMPERATE_CONIFER ; NUME[:BIOME_FOREST_TEMPERATE_CONIFER] = 35
    ENUM[36] = :BIOME_FOREST_TEMPERATE_BROADLEAF ; NUME[:BIOME_FOREST_TEMPERATE_BROADLEAF] = 36
    ENUM[37] = :BIOME_FOREST_TROPICAL_CONIFER ; NUME[:BIOME_FOREST_TROPICAL_CONIFER] = 37
    ENUM[38] = :BIOME_FOREST_TROPICAL_DRY_BROADLEAF ; NUME[:BIOME_FOREST_TROPICAL_DRY_BROADLEAF] = 38
    ENUM[39] = :BIOME_FOREST_TROPICAL_MOIST_BROADLEAF ; NUME[:BIOME_FOREST_TROPICAL_MOIST_BROADLEAF] = 39
    ENUM[40] = :BIOME_GRASSLAND_TEMPERATE ; NUME[:BIOME_GRASSLAND_TEMPERATE] = 40
    ENUM[41] = :BIOME_SAVANNA_TEMPERATE ; NUME[:BIOME_SAVANNA_TEMPERATE] = 41
    ENUM[42] = :BIOME_SHRUBLAND_TEMPERATE ; NUME[:BIOME_SHRUBLAND_TEMPERATE] = 42
    ENUM[43] = :BIOME_GRASSLAND_TROPICAL ; NUME[:BIOME_GRASSLAND_TROPICAL] = 43
    ENUM[44] = :BIOME_SAVANNA_TROPICAL ; NUME[:BIOME_SAVANNA_TROPICAL] = 44
    ENUM[45] = :BIOME_SHRUBLAND_TROPICAL ; NUME[:BIOME_SHRUBLAND_TROPICAL] = 45
    ENUM[46] = :BIOME_DESERT_BADLAND ; NUME[:BIOME_DESERT_BADLAND] = 46
    ENUM[47] = :BIOME_DESERT_ROCK ; NUME[:BIOME_DESERT_ROCK] = 47
    ENUM[48] = :BIOME_DESERT_SAND ; NUME[:BIOME_DESERT_SAND] = 48
    ENUM[49] = :BIOME_OCEAN_TROPICAL ; NUME[:BIOME_OCEAN_TROPICAL] = 49
    ENUM[50] = :BIOME_OCEAN_TEMPERATE ; NUME[:BIOME_OCEAN_TEMPERATE] = 50
    ENUM[51] = :BIOME_OCEAN_ARCTIC ; NUME[:BIOME_OCEAN_ARCTIC] = 51
    ENUM[52] = :BIOME_POOL_TEMPERATE_FRESHWATER ; NUME[:BIOME_POOL_TEMPERATE_FRESHWATER] = 52
    ENUM[53] = :BIOME_SUBTERRANEAN_WATER ; NUME[:BIOME_SUBTERRANEAN_WATER] = 53
    ENUM[54] = :BIOME_SUBTERRANEAN_CHASM ; NUME[:BIOME_SUBTERRANEAN_CHASM] = 54
    ENUM[55] = :BIOME_SUBTERRANEAN_LAVA ; NUME[:BIOME_SUBTERRANEAN_LAVA] = 55
    ENUM[56] = :GOOD ; NUME[:GOOD] = 56
    ENUM[57] = :EVIL ; NUME[:EVIL] = 57
    ENUM[58] = :SAVAGE ; NUME[:SAVAGE] = 58
    ENUM[59] = :BIOME_POOL_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_POOL_TEMPERATE_BRACKISHWATER] = 59
    ENUM[60] = :BIOME_POOL_TEMPERATE_SALTWATER ; NUME[:BIOME_POOL_TEMPERATE_SALTWATER] = 60
    ENUM[61] = :BIOME_POOL_TROPICAL_FRESHWATER ; NUME[:BIOME_POOL_TROPICAL_FRESHWATER] = 61
    ENUM[62] = :BIOME_POOL_TROPICAL_BRACKISHWATER ; NUME[:BIOME_POOL_TROPICAL_BRACKISHWATER] = 62
    ENUM[63] = :BIOME_POOL_TROPICAL_SALTWATER ; NUME[:BIOME_POOL_TROPICAL_SALTWATER] = 63
    ENUM[64] = :BIOME_LAKE_TEMPERATE_FRESHWATER ; NUME[:BIOME_LAKE_TEMPERATE_FRESHWATER] = 64
    ENUM[65] = :BIOME_LAKE_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_LAKE_TEMPERATE_BRACKISHWATER] = 65
    ENUM[66] = :BIOME_LAKE_TEMPERATE_SALTWATER ; NUME[:BIOME_LAKE_TEMPERATE_SALTWATER] = 66
    ENUM[67] = :BIOME_LAKE_TROPICAL_FRESHWATER ; NUME[:BIOME_LAKE_TROPICAL_FRESHWATER] = 67
    ENUM[68] = :BIOME_LAKE_TROPICAL_BRACKISHWATER ; NUME[:BIOME_LAKE_TROPICAL_BRACKISHWATER] = 68
    ENUM[69] = :BIOME_LAKE_TROPICAL_SALTWATER ; NUME[:BIOME_LAKE_TROPICAL_SALTWATER] = 69
    ENUM[70] = :BIOME_RIVER_TEMPERATE_FRESHWATER ; NUME[:BIOME_RIVER_TEMPERATE_FRESHWATER] = 70
    ENUM[71] = :BIOME_RIVER_TEMPERATE_BRACKISHWATER ; NUME[:BIOME_RIVER_TEMPERATE_BRACKISHWATER] = 71
    ENUM[72] = :BIOME_RIVER_TEMPERATE_SALTWATER ; NUME[:BIOME_RIVER_TEMPERATE_SALTWATER] = 72
    ENUM[73] = :BIOME_RIVER_TROPICAL_FRESHWATER ; NUME[:BIOME_RIVER_TROPICAL_FRESHWATER] = 73
    ENUM[74] = :BIOME_RIVER_TROPICAL_BRACKISHWATER ; NUME[:BIOME_RIVER_TROPICAL_BRACKISHWATER] = 74
    ENUM[75] = :BIOME_RIVER_TROPICAL_SALTWATER ; NUME[:BIOME_RIVER_TROPICAL_SALTWATER] = 75
    ENUM[76] = :TWIGS_SIDE_BRANCHES ; NUME[:TWIGS_SIDE_BRANCHES] = 76
    ENUM[77] = :SAPLING ; NUME[:SAPLING] = 77
    ENUM[78] = :TREE ; NUME[:TREE] = 78
    ENUM[79] = :GRASS ; NUME[:GRASS] = 79
    ENUM[80] = :TWIGS_ABOVE_BRANCHES ; NUME[:TWIGS_ABOVE_BRANCHES] = 80
    ENUM[81] = :TWIGS_BELOW_BRANCHES ; NUME[:TWIGS_BELOW_BRANCHES] = 81
    ENUM[82] = :TWIGS_SIDE_HEAVY_BRANCHES ; NUME[:TWIGS_SIDE_HEAVY_BRANCHES] = 82
    ENUM[83] = :TWIGS_ABOVE_HEAVY_BRANCHES ; NUME[:TWIGS_ABOVE_HEAVY_BRANCHES] = 83
    ENUM[84] = :TWIGS_BELOW_HEAVY_BRANCHES ; NUME[:TWIGS_BELOW_HEAVY_BRANCHES] = 84
    ENUM[85] = :TWIGS_SIDE_TRUNK ; NUME[:TWIGS_SIDE_TRUNK] = 85
    ENUM[86] = :TWIGS_ABOVE_TRUNK ; NUME[:TWIGS_ABOVE_TRUNK] = 86
    ENUM[87] = :TWIGS_BELOW_TRUNK ; NUME[:TWIGS_BELOW_TRUNK] = 87
end

class PlotRoleType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :PossibleThreat ; NUME[:PossibleThreat] = 0
    ENUM[1] = :Rebuffed ; NUME[:Rebuffed] = 1
    ENUM[2] = :SourceOfFunds ; NUME[:SourceOfFunds] = 2
    ENUM[3] = :SourceOfFundsForMaster ; NUME[:SourceOfFundsForMaster] = 3
    ENUM[4] = :Master ; NUME[:Master] = 4
    ENUM[5] = :SuspectedCriminal ; NUME[:SuspectedCriminal] = 5
    ENUM[6] = :Asset ; NUME[:Asset] = 6
    ENUM[7] = :Lieutenant ; NUME[:Lieutenant] = 7
    ENUM[8] = :UsableThief ; NUME[:UsableThief] = 8
    ENUM[9] = :PotentialEmployer ; NUME[:PotentialEmployer] = 9
    ENUM[10] = :IndirectDirector ; NUME[:IndirectDirector] = 10
    ENUM[11] = :CorruptPositionHolder ; NUME[:CorruptPositionHolder] = 11
    ENUM[12] = :DeliveryTarget ; NUME[:DeliveryTarget] = 12
    ENUM[13] = :Handler ; NUME[:Handler] = 13
    ENUM[14] = :UsableAssassin ; NUME[:UsableAssassin] = 14
    ENUM[15] = :Director ; NUME[:Director] = 15
    ENUM[16] = :Enemy ; NUME[:Enemy] = 16
    ENUM[17] = :UsableSnatcher ; NUME[:UsableSnatcher] = 17
    ENUM[20] = :UnderworldContact ; NUME[:UnderworldContact] = 20
    ENUM[21] = :PossiblyUnknownDirector ; NUME[:PossiblyUnknownDirector] = 21
end

class PlotStrategyType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :CorruptAndPacify ; NUME[:CorruptAndPacify] = 0
    ENUM[1] = :Obey ; NUME[:Obey] = 1
    ENUM[2] = :Avoid ; NUME[:Avoid] = 2
    ENUM[3] = :Use ; NUME[:Use] = 3
    ENUM[4] = :Tax ; NUME[:Tax] = 4
    ENUM[5] = :Neutralize ; NUME[:Neutralize] = 5
    ENUM[6] = :Monitor ; NUME[:Monitor] = 6
    ENUM[7] = :WorkIfSuited ; NUME[:WorkIfSuited] = 7
    ENUM[8] = :Torment ; NUME[:Torment] = 8
end

class PoeticFormAction < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Describe ; NUME[:Describe] = 0
    ENUM[1] = :Satirize ; NUME[:Satirize] = 1
    ENUM[2] = :AmuseAudience ; NUME[:AmuseAudience] = 2
    ENUM[3] = :Complain ; NUME[:Complain] = 3
    ENUM[4] = :Renounce ; NUME[:Renounce] = 4
    ENUM[5] = :MakeApology ; NUME[:MakeApology] = 5
    ENUM[6] = :ExpressPleasure ; NUME[:ExpressPleasure] = 6
    ENUM[7] = :ExpressGrief ; NUME[:ExpressGrief] = 7
    ENUM[8] = :Praise ; NUME[:Praise] = 8
    ENUM[9] = :TeachMoralLesson ; NUME[:TeachMoralLesson] = 9
    ENUM[10] = :MakeAssertion ; NUME[:MakeAssertion] = 10
    ENUM[11] = :MakeCounterAssertion ; NUME[:MakeCounterAssertion] = 11
    ENUM[12] = :MakeConsession ; NUME[:MakeConsession] = 12
    ENUM[13] = :SynthesizePreviousIdeas ; NUME[:SynthesizePreviousIdeas] = 13
    ENUM[14] = :DevelopPreviousIdea ; NUME[:DevelopPreviousIdea] = 14
    ENUM[15] = :InvertTheAssertion ; NUME[:InvertTheAssertion] = 15
    ENUM[16] = :UndercutAssertion ; NUME[:UndercutAssertion] = 16
    ENUM[17] = :MoveAwayFromPreviousIdeas ; NUME[:MoveAwayFromPreviousIdeas] = 17
    ENUM[18] = :ReflectPreviousIdeas ; NUME[:ReflectPreviousIdeas] = 18
    ENUM[19] = :ConsoleAudience ; NUME[:ConsoleAudience] = 19
    ENUM[20] = :RefuseConsolation ; NUME[:RefuseConsolation] = 20
    ENUM[21] = :OfferDifferentPerspective ; NUME[:OfferDifferentPerspective] = 21
    ENUM[22] = :Beseech ; NUME[:Beseech] = 22
end

class PoeticFormAdditionalFeature < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SharesUnderlyingMeaning ; NUME[:SharesUnderlyingMeaning] = 0
    ENUM[1] = :ContrastsUnderlyingMeaning ; NUME[:ContrastsUnderlyingMeaning] = 1
    ENUM[2] = :RequiredToMaintainPhrasing ; NUME[:RequiredToMaintainPhrasing] = 2
    ENUM[3] = :SameGrammaticalStructure ; NUME[:SameGrammaticalStructure] = 3
    ENUM[4] = :SamePlacementOfAllusions ; NUME[:SamePlacementOfAllusions] = 4
    ENUM[5] = :ReverseWordOrder ; NUME[:ReverseWordOrder] = 5
    ENUM[6] = :ReverseGrammaticalStructure ; NUME[:ReverseGrammaticalStructure] = 6
    ENUM[7] = :PresentsDifferentView ; NUME[:PresentsDifferentView] = 7
    ENUM[8] = :MustExpandIdea ; NUME[:MustExpandIdea] = 8
end

class PoeticFormCaesuraPosition < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Initial ; NUME[:Initial] = 0
    ENUM[1] = :Medial ; NUME[:Medial] = 1
    ENUM[2] = :Terminal ; NUME[:Terminal] = 2
end

class PoeticFormMood < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Narrative ; NUME[:Narrative] = 0
    ENUM[1] = :Dramatic ; NUME[:Dramatic] = 1
    ENUM[2] = :Reflective ; NUME[:Reflective] = 2
    ENUM[3] = :Riddle ; NUME[:Riddle] = 3
    ENUM[4] = :Ribald ; NUME[:Ribald] = 4
    ENUM[5] = :Light ; NUME[:Light] = 5
    ENUM[6] = :Solemn ; NUME[:Solemn] = 6
end

class PoeticFormPattern < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :AA ; NUME[:AA] = 0
    ENUM[1] = :AB ; NUME[:AB] = 1
    ENUM[2] = :BA ; NUME[:BA] = 2
    ENUM[3] = :BB ; NUME[:BB] = 3
    ENUM[4] = :AAA ; NUME[:AAA] = 4
    ENUM[5] = :BAA ; NUME[:BAA] = 5
    ENUM[6] = :ABA ; NUME[:ABA] = 6
    ENUM[7] = :AAB ; NUME[:AAB] = 7
    ENUM[8] = :ABB ; NUME[:ABB] = 8
    ENUM[9] = :BBA ; NUME[:BBA] = 9
    ENUM[10] = :BAB ; NUME[:BAB] = 10
    ENUM[11] = :BBB ; NUME[:BBB] = 11
end

class PoeticFormSubject < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Past ; NUME[:Past] = 0
    ENUM[1] = :CurrentEvents ; NUME[:CurrentEvents] = 1
    ENUM[2] = :Future ; NUME[:Future] = 2
    ENUM[3] = :SomeoneRecentlyDeceased ; NUME[:SomeoneRecentlyDeceased] = 3
    ENUM[4] = :SomeoneRecentlyRetired ; NUME[:SomeoneRecentlyRetired] = 4
    ENUM[5] = :Religion ; NUME[:Religion] = 5
    ENUM[6] = :SpecificPlace ; NUME[:SpecificPlace] = 6
    ENUM[7] = :SpecificWildernessRegion ; NUME[:SpecificWildernessRegion] = 7
    ENUM[8] = :Nature ; NUME[:Nature] = 8
    ENUM[9] = :Lover ; NUME[:Lover] = 9
    ENUM[10] = :Family ; NUME[:Family] = 10
    ENUM[11] = :AlcoholicBeverages ; NUME[:AlcoholicBeverages] = 11
    ENUM[12] = :Journey ; NUME[:Journey] = 12
    ENUM[13] = :War ; NUME[:War] = 13
    ENUM[14] = :Hunt ; NUME[:Hunt] = 14
    ENUM[15] = :Mining ; NUME[:Mining] = 15
    ENUM[16] = :Death ; NUME[:Death] = 16
    ENUM[17] = :Immortality ; NUME[:Immortality] = 17
    ENUM[18] = :SomeonesCharacter ; NUME[:SomeonesCharacter] = 18
    ENUM[19] = :Histfig ; NUME[:Histfig] = 19
    ENUM[20] = :Concept ; NUME[:Concept] = 20
end

class PositionCreationReasonType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ForceOfArgument ; NUME[:ForceOfArgument] = 0
    ENUM[1] = :ThreatOfViolence ; NUME[:ThreatOfViolence] = 1
    ENUM[2] = :Collaboration ; NUME[:Collaboration] = 2
    ENUM[3] = :WaveOfPopularSupport ; NUME[:WaveOfPopularSupport] = 3
    ENUM[4] = :AsAMatterOfCourse ; NUME[:AsAMatterOfCourse] = 4
end

class Profession < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    Military = Hash.new(false)
    Parent = Hash.new(:NONE)
    CanAssignLabor = Hash.new(true)
    Color = Hash.new(-1)
    Moodable = Hash.new(false)
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :MINER ; NUME[:MINER] = 0 ; Caption[:MINER] = 'Miner' ; Color[:MINER] = 7 ; Moodable[:MINER] = true
    ENUM[1] = :WOODWORKER ; NUME[:WOODWORKER] = 1 ; Caption[:WOODWORKER] = 'Woodworker' ; Color[:WOODWORKER] = 14 ; Moodable[:WOODWORKER] = true
    ENUM[2] = :CARPENTER ; NUME[:CARPENTER] = 2 ; Caption[:CARPENTER] = 'Carpenter' ; Parent[:CARPENTER] = :WOODWORKER ; Color[:CARPENTER] = 14 ; Moodable[:CARPENTER] = true
    ENUM[3] = :BOWYER ; NUME[:BOWYER] = 3 ; Caption[:BOWYER] = 'Bowyer' ; Parent[:BOWYER] = :WOODWORKER ; Color[:BOWYER] = 14 ; Moodable[:BOWYER] = true
    ENUM[4] = :WOODCUTTER ; NUME[:WOODCUTTER] = 4 ; Caption[:WOODCUTTER] = 'Woodcutter' ; Parent[:WOODCUTTER] = :WOODWORKER ; Color[:WOODCUTTER] = 14 ; Moodable[:WOODCUTTER] = true
    ENUM[5] = :STONEWORKER ; NUME[:STONEWORKER] = 5 ; Caption[:STONEWORKER] = 'Stoneworker' ; Color[:STONEWORKER] = 15 ; Moodable[:STONEWORKER] = true
    ENUM[6] = :ENGRAVER ; NUME[:ENGRAVER] = 6 ; Caption[:ENGRAVER] = 'Engraver' ; Parent[:ENGRAVER] = :STONEWORKER ; Color[:ENGRAVER] = 15 ; Moodable[:ENGRAVER] = true
    ENUM[7] = :MASON ; NUME[:MASON] = 7 ; Caption[:MASON] = 'Mason' ; Parent[:MASON] = :STONEWORKER ; Color[:MASON] = 15 ; Moodable[:MASON] = true
    ENUM[8] = :RANGER ; NUME[:RANGER] = 8 ; Caption[:RANGER] = 'Ranger' ; Color[:RANGER] = 2 ; Moodable[:RANGER] = true
    ENUM[9] = :ANIMAL_CARETAKER ; NUME[:ANIMAL_CARETAKER] = 9 ; Caption[:ANIMAL_CARETAKER] = 'Animal Caretaker' ; Parent[:ANIMAL_CARETAKER] = :RANGER ; Color[:ANIMAL_CARETAKER] = 2 ; Moodable[:ANIMAL_CARETAKER] = true
    ENUM[10] = :ANIMAL_TRAINER ; NUME[:ANIMAL_TRAINER] = 10 ; Caption[:ANIMAL_TRAINER] = 'Animal Trainer' ; Parent[:ANIMAL_TRAINER] = :RANGER ; Color[:ANIMAL_TRAINER] = 2 ; Moodable[:ANIMAL_TRAINER] = true
    ENUM[11] = :HUNTER ; NUME[:HUNTER] = 11 ; Caption[:HUNTER] = 'Hunter' ; Parent[:HUNTER] = :RANGER ; Color[:HUNTER] = 2 ; Moodable[:HUNTER] = true
    ENUM[12] = :TRAPPER ; NUME[:TRAPPER] = 12 ; Caption[:TRAPPER] = 'Trapper' ; Parent[:TRAPPER] = :RANGER ; Color[:TRAPPER] = 2 ; Moodable[:TRAPPER] = true
    ENUM[13] = :ANIMAL_DISSECTOR ; NUME[:ANIMAL_DISSECTOR] = 13 ; Caption[:ANIMAL_DISSECTOR] = 'Animal Dissector' ; Parent[:ANIMAL_DISSECTOR] = :RANGER ; Color[:ANIMAL_DISSECTOR] = 2 ; Moodable[:ANIMAL_DISSECTOR] = true
    ENUM[14] = :METALSMITH ; NUME[:METALSMITH] = 14 ; Caption[:METALSMITH] = 'Metalsmith' ; Color[:METALSMITH] = 8 ; Moodable[:METALSMITH] = true
    ENUM[15] = :FURNACE_OPERATOR ; NUME[:FURNACE_OPERATOR] = 15 ; Caption[:FURNACE_OPERATOR] = 'Furnace Operator' ; Parent[:FURNACE_OPERATOR] = :METALSMITH ; Color[:FURNACE_OPERATOR] = 8 ; Moodable[:FURNACE_OPERATOR] = true
    ENUM[16] = :WEAPONSMITH ; NUME[:WEAPONSMITH] = 16 ; Caption[:WEAPONSMITH] = 'Weaponsmith' ; Parent[:WEAPONSMITH] = :METALSMITH ; Color[:WEAPONSMITH] = 8 ; Moodable[:WEAPONSMITH] = true
    ENUM[17] = :ARMORER ; NUME[:ARMORER] = 17 ; Caption[:ARMORER] = 'Armorer' ; Parent[:ARMORER] = :METALSMITH ; Color[:ARMORER] = 8 ; Moodable[:ARMORER] = true
    ENUM[18] = :BLACKSMITH ; NUME[:BLACKSMITH] = 18 ; Caption[:BLACKSMITH] = 'Blacksmith' ; Parent[:BLACKSMITH] = :METALSMITH ; Color[:BLACKSMITH] = 8 ; Moodable[:BLACKSMITH] = true
    ENUM[19] = :METALCRAFTER ; NUME[:METALCRAFTER] = 19 ; Caption[:METALCRAFTER] = 'Metalcrafter' ; Parent[:METALCRAFTER] = :METALSMITH ; Color[:METALCRAFTER] = 8 ; Moodable[:METALCRAFTER] = true
    ENUM[20] = :JEWELER ; NUME[:JEWELER] = 20 ; Caption[:JEWELER] = 'Jeweler' ; Color[:JEWELER] = 10 ; Moodable[:JEWELER] = true
    ENUM[21] = :GEM_CUTTER ; NUME[:GEM_CUTTER] = 21 ; Caption[:GEM_CUTTER] = 'Gem Cutter' ; Parent[:GEM_CUTTER] = :JEWELER ; Color[:GEM_CUTTER] = 10 ; Moodable[:GEM_CUTTER] = true
    ENUM[22] = :GEM_SETTER ; NUME[:GEM_SETTER] = 22 ; Caption[:GEM_SETTER] = 'Gem Setter' ; Parent[:GEM_SETTER] = :JEWELER ; Color[:GEM_SETTER] = 10 ; Moodable[:GEM_SETTER] = true
    ENUM[23] = :CRAFTSMAN ; NUME[:CRAFTSMAN] = 23 ; Caption[:CRAFTSMAN] = 'Craftsman' ; Color[:CRAFTSMAN] = 9 ; Moodable[:CRAFTSMAN] = true
    ENUM[24] = :WOODCRAFTER ; NUME[:WOODCRAFTER] = 24 ; Caption[:WOODCRAFTER] = 'Woodcrafter' ; Parent[:WOODCRAFTER] = :CRAFTSMAN ; Color[:WOODCRAFTER] = 9 ; Moodable[:WOODCRAFTER] = true
    ENUM[25] = :STONECRAFTER ; NUME[:STONECRAFTER] = 25 ; Caption[:STONECRAFTER] = 'Stonecrafter' ; Parent[:STONECRAFTER] = :CRAFTSMAN ; Color[:STONECRAFTER] = 9 ; Moodable[:STONECRAFTER] = true
    ENUM[26] = :LEATHERWORKER ; NUME[:LEATHERWORKER] = 26 ; Caption[:LEATHERWORKER] = 'Leatherworker' ; Parent[:LEATHERWORKER] = :CRAFTSMAN ; Color[:LEATHERWORKER] = 9 ; Moodable[:LEATHERWORKER] = true
    ENUM[27] = :BONE_CARVER ; NUME[:BONE_CARVER] = 27 ; Caption[:BONE_CARVER] = 'Bone Carver' ; Parent[:BONE_CARVER] = :CRAFTSMAN ; Color[:BONE_CARVER] = 9 ; Moodable[:BONE_CARVER] = true
    ENUM[28] = :WEAVER ; NUME[:WEAVER] = 28 ; Caption[:WEAVER] = 'Weaver' ; Parent[:WEAVER] = :CRAFTSMAN ; Color[:WEAVER] = 9 ; Moodable[:WEAVER] = true
    ENUM[29] = :CLOTHIER ; NUME[:CLOTHIER] = 29 ; Caption[:CLOTHIER] = 'Clothier' ; Parent[:CLOTHIER] = :CRAFTSMAN ; Color[:CLOTHIER] = 9 ; Moodable[:CLOTHIER] = true
    ENUM[30] = :GLASSMAKER ; NUME[:GLASSMAKER] = 30 ; Caption[:GLASSMAKER] = 'Glassmaker' ; Parent[:GLASSMAKER] = :CRAFTSMAN ; Color[:GLASSMAKER] = 9 ; Moodable[:GLASSMAKER] = true
    ENUM[31] = :POTTER ; NUME[:POTTER] = 31 ; Caption[:POTTER] = 'Potter' ; Parent[:POTTER] = :CRAFTSMAN ; Color[:POTTER] = 9 ; Moodable[:POTTER] = true
    ENUM[32] = :GLAZER ; NUME[:GLAZER] = 32 ; Caption[:GLAZER] = 'Glazer' ; Parent[:GLAZER] = :CRAFTSMAN ; Color[:GLAZER] = 9 ; Moodable[:GLAZER] = true
    ENUM[33] = :WAX_WORKER ; NUME[:WAX_WORKER] = 33 ; Caption[:WAX_WORKER] = 'Wax Worker' ; Parent[:WAX_WORKER] = :CRAFTSMAN ; Color[:WAX_WORKER] = 9 ; Moodable[:WAX_WORKER] = true
    ENUM[34] = :STRAND_EXTRACTOR ; NUME[:STRAND_EXTRACTOR] = 34 ; Caption[:STRAND_EXTRACTOR] = 'Strand Extractor' ; Parent[:STRAND_EXTRACTOR] = :CRAFTSMAN ; Color[:STRAND_EXTRACTOR] = 9 ; Moodable[:STRAND_EXTRACTOR] = true
    ENUM[35] = :FISHERY_WORKER ; NUME[:FISHERY_WORKER] = 35 ; Caption[:FISHERY_WORKER] = 'Fishery Worker' ; Color[:FISHERY_WORKER] = 1 ; Moodable[:FISHERY_WORKER] = true
    ENUM[36] = :FISHERMAN ; NUME[:FISHERMAN] = 36 ; Caption[:FISHERMAN] = 'Fisherman' ; Parent[:FISHERMAN] = :FISHERY_WORKER ; Color[:FISHERMAN] = 1 ; Moodable[:FISHERMAN] = true
    ENUM[37] = :FISH_DISSECTOR ; NUME[:FISH_DISSECTOR] = 37 ; Caption[:FISH_DISSECTOR] = 'Fish Dissector' ; Parent[:FISH_DISSECTOR] = :FISHERY_WORKER ; Color[:FISH_DISSECTOR] = 1 ; Moodable[:FISH_DISSECTOR] = true
    ENUM[38] = :FISH_CLEANER ; NUME[:FISH_CLEANER] = 38 ; Caption[:FISH_CLEANER] = 'Fish Cleaner' ; Parent[:FISH_CLEANER] = :FISHERY_WORKER ; Color[:FISH_CLEANER] = 1 ; Moodable[:FISH_CLEANER] = true
    ENUM[39] = :FARMER ; NUME[:FARMER] = 39 ; Caption[:FARMER] = 'Farmer' ; Color[:FARMER] = 6 ; Moodable[:FARMER] = true
    ENUM[40] = :CHEESE_MAKER ; NUME[:CHEESE_MAKER] = 40 ; Caption[:CHEESE_MAKER] = 'Cheese Maker' ; Parent[:CHEESE_MAKER] = :FARMER ; Color[:CHEESE_MAKER] = 6 ; Moodable[:CHEESE_MAKER] = true
    ENUM[41] = :MILKER ; NUME[:MILKER] = 41 ; Caption[:MILKER] = 'Milker' ; Parent[:MILKER] = :FARMER ; Color[:MILKER] = 6 ; Moodable[:MILKER] = true
    ENUM[42] = :COOK ; NUME[:COOK] = 42 ; Caption[:COOK] = 'Cook' ; Parent[:COOK] = :FARMER ; Color[:COOK] = 6 ; Moodable[:COOK] = true
    ENUM[43] = :THRESHER ; NUME[:THRESHER] = 43 ; Caption[:THRESHER] = 'Thresher' ; Parent[:THRESHER] = :FARMER ; Color[:THRESHER] = 6 ; Moodable[:THRESHER] = true
    ENUM[44] = :MILLER ; NUME[:MILLER] = 44 ; Caption[:MILLER] = 'Miller' ; Parent[:MILLER] = :FARMER ; Color[:MILLER] = 6 ; Moodable[:MILLER] = true
    ENUM[45] = :BUTCHER ; NUME[:BUTCHER] = 45 ; Caption[:BUTCHER] = 'Butcher' ; Parent[:BUTCHER] = :FARMER ; Color[:BUTCHER] = 6 ; Moodable[:BUTCHER] = true
    ENUM[46] = :TANNER ; NUME[:TANNER] = 46 ; Caption[:TANNER] = 'Tanner' ; Parent[:TANNER] = :FARMER ; Color[:TANNER] = 6 ; Moodable[:TANNER] = true
    ENUM[47] = :DYER ; NUME[:DYER] = 47 ; Caption[:DYER] = 'Dyer' ; Parent[:DYER] = :FARMER ; Color[:DYER] = 6 ; Moodable[:DYER] = true
    ENUM[48] = :PLANTER ; NUME[:PLANTER] = 48 ; Caption[:PLANTER] = 'Planter' ; Parent[:PLANTER] = :FARMER ; Color[:PLANTER] = 6 ; Moodable[:PLANTER] = true
    ENUM[49] = :HERBALIST ; NUME[:HERBALIST] = 49 ; Caption[:HERBALIST] = 'Herbalist' ; Parent[:HERBALIST] = :FARMER ; Color[:HERBALIST] = 6 ; Moodable[:HERBALIST] = true
    ENUM[50] = :BREWER ; NUME[:BREWER] = 50 ; Caption[:BREWER] = 'Brewer' ; Parent[:BREWER] = :FARMER ; Color[:BREWER] = 6 ; Moodable[:BREWER] = true
    ENUM[51] = :SOAP_MAKER ; NUME[:SOAP_MAKER] = 51 ; Caption[:SOAP_MAKER] = 'Soap Maker' ; Parent[:SOAP_MAKER] = :FARMER ; Color[:SOAP_MAKER] = 6 ; Moodable[:SOAP_MAKER] = true
    ENUM[52] = :POTASH_MAKER ; NUME[:POTASH_MAKER] = 52 ; Caption[:POTASH_MAKER] = 'Potash Maker' ; Parent[:POTASH_MAKER] = :FARMER ; Color[:POTASH_MAKER] = 6 ; Moodable[:POTASH_MAKER] = true
    ENUM[53] = :LYE_MAKER ; NUME[:LYE_MAKER] = 53 ; Caption[:LYE_MAKER] = 'Lye Maker' ; Parent[:LYE_MAKER] = :FARMER ; Color[:LYE_MAKER] = 6 ; Moodable[:LYE_MAKER] = true
    ENUM[54] = :WOOD_BURNER ; NUME[:WOOD_BURNER] = 54 ; Caption[:WOOD_BURNER] = 'Wood Burner' ; Parent[:WOOD_BURNER] = :FARMER ; Color[:WOOD_BURNER] = 6 ; Moodable[:WOOD_BURNER] = true
    ENUM[55] = :SHEARER ; NUME[:SHEARER] = 55 ; Caption[:SHEARER] = 'Shearer' ; Parent[:SHEARER] = :FARMER ; Color[:SHEARER] = 6 ; Moodable[:SHEARER] = true
    ENUM[56] = :SPINNER ; NUME[:SPINNER] = 56 ; Caption[:SPINNER] = 'Spinner' ; Parent[:SPINNER] = :FARMER ; Color[:SPINNER] = 6 ; Moodable[:SPINNER] = true
    ENUM[57] = :PRESSER ; NUME[:PRESSER] = 57 ; Caption[:PRESSER] = 'Presser' ; Parent[:PRESSER] = :FARMER ; Color[:PRESSER] = 6 ; Moodable[:PRESSER] = true
    ENUM[58] = :BEEKEEPER ; NUME[:BEEKEEPER] = 58 ; Caption[:BEEKEEPER] = 'Bee Keeper' ; Parent[:BEEKEEPER] = :FARMER ; Color[:BEEKEEPER] = 6 ; Moodable[:BEEKEEPER] = true
    ENUM[59] = :ENGINEER ; NUME[:ENGINEER] = 59 ; Caption[:ENGINEER] = 'Engineer' ; Color[:ENGINEER] = 12 ; Moodable[:ENGINEER] = true
    ENUM[60] = :MECHANIC ; NUME[:MECHANIC] = 60 ; Caption[:MECHANIC] = 'Mechanic' ; Parent[:MECHANIC] = :ENGINEER ; Color[:MECHANIC] = 12 ; Moodable[:MECHANIC] = true
    ENUM[61] = :SIEGE_ENGINEER ; NUME[:SIEGE_ENGINEER] = 61 ; Caption[:SIEGE_ENGINEER] = 'Siege Engineer' ; Parent[:SIEGE_ENGINEER] = :ENGINEER ; Color[:SIEGE_ENGINEER] = 12 ; Moodable[:SIEGE_ENGINEER] = true
    ENUM[62] = :SIEGE_OPERATOR ; NUME[:SIEGE_OPERATOR] = 62 ; Caption[:SIEGE_OPERATOR] = 'Siege Operator' ; Parent[:SIEGE_OPERATOR] = :ENGINEER ; Color[:SIEGE_OPERATOR] = 12 ; Moodable[:SIEGE_OPERATOR] = true
    ENUM[63] = :PUMP_OPERATOR ; NUME[:PUMP_OPERATOR] = 63 ; Caption[:PUMP_OPERATOR] = 'Pump Operator' ; Parent[:PUMP_OPERATOR] = :ENGINEER ; Color[:PUMP_OPERATOR] = 12 ; Moodable[:PUMP_OPERATOR] = true
    ENUM[64] = :CLERK ; NUME[:CLERK] = 64 ; Caption[:CLERK] = 'Clerk' ; Color[:CLERK] = 5 ; Moodable[:CLERK] = true
    ENUM[65] = :ADMINISTRATOR ; NUME[:ADMINISTRATOR] = 65 ; Caption[:ADMINISTRATOR] = 'Administrator' ; Color[:ADMINISTRATOR] = 5 ; Moodable[:ADMINISTRATOR] = true
    ENUM[66] = :TRADER ; NUME[:TRADER] = 66 ; Caption[:TRADER] = 'Trader' ; Color[:TRADER] = 5 ; Moodable[:TRADER] = true
    ENUM[67] = :ARCHITECT ; NUME[:ARCHITECT] = 67 ; Caption[:ARCHITECT] = 'Architect' ; Color[:ARCHITECT] = 5 ; Moodable[:ARCHITECT] = true
    ENUM[68] = :ALCHEMIST ; NUME[:ALCHEMIST] = 68 ; Caption[:ALCHEMIST] = 'Alchemist' ; Color[:ALCHEMIST] = 5 ; Moodable[:ALCHEMIST] = true
    ENUM[69] = :DOCTOR ; NUME[:DOCTOR] = 69 ; Caption[:DOCTOR] = 'Doctor' ; Color[:DOCTOR] = 5 ; Moodable[:DOCTOR] = true
    ENUM[70] = :DIAGNOSER ; NUME[:DIAGNOSER] = 70 ; Caption[:DIAGNOSER] = 'Diagnoser' ; Parent[:DIAGNOSER] = :DOCTOR ; Color[:DIAGNOSER] = 5 ; Moodable[:DIAGNOSER] = true
    ENUM[71] = :BONE_SETTER ; NUME[:BONE_SETTER] = 71 ; Caption[:BONE_SETTER] = 'Bone Setter' ; Parent[:BONE_SETTER] = :DOCTOR ; Color[:BONE_SETTER] = 5 ; Moodable[:BONE_SETTER] = true
    ENUM[72] = :SUTURER ; NUME[:SUTURER] = 72 ; Caption[:SUTURER] = 'Suturer' ; Parent[:SUTURER] = :DOCTOR ; Color[:SUTURER] = 5 ; Moodable[:SUTURER] = true
    ENUM[73] = :SURGEON ; NUME[:SURGEON] = 73 ; Caption[:SURGEON] = 'Surgeon' ; Parent[:SURGEON] = :DOCTOR ; Color[:SURGEON] = 5 ; Moodable[:SURGEON] = true
    ENUM[74] = :MERCHANT ; NUME[:MERCHANT] = 74 ; Caption[:MERCHANT] = 'Merchant' ; Color[:MERCHANT] = 7
    ENUM[75] = :HAMMERMAN ; NUME[:HAMMERMAN] = 75 ; Caption[:HAMMERMAN] = 'Hammerman' ; Military[:HAMMERMAN] = true ; Color[:HAMMERMAN] = 5
    ENUM[76] = :MASTER_HAMMERMAN ; NUME[:MASTER_HAMMERMAN] = 76 ; Caption[:MASTER_HAMMERMAN] = 'Hammer Lord' ; Military[:MASTER_HAMMERMAN] = true ; Parent[:MASTER_HAMMERMAN] = :HAMMERMAN ; Color[:MASTER_HAMMERMAN] = 13
    ENUM[77] = :SPEARMAN ; NUME[:SPEARMAN] = 77 ; Caption[:SPEARMAN] = 'Spearman' ; Military[:SPEARMAN] = true ; Color[:SPEARMAN] = 6
    ENUM[78] = :MASTER_SPEARMAN ; NUME[:MASTER_SPEARMAN] = 78 ; Caption[:MASTER_SPEARMAN] = 'Spearmaster' ; Military[:MASTER_SPEARMAN] = true ; Parent[:MASTER_SPEARMAN] = :SPEARMAN ; Color[:MASTER_SPEARMAN] = 14
    ENUM[79] = :CROSSBOWMAN ; NUME[:CROSSBOWMAN] = 79 ; Caption[:CROSSBOWMAN] = 'Crossbowman' ; Military[:CROSSBOWMAN] = true ; Color[:CROSSBOWMAN] = 2
    ENUM[80] = :MASTER_CROSSBOWMAN ; NUME[:MASTER_CROSSBOWMAN] = 80 ; Caption[:MASTER_CROSSBOWMAN] = 'Elite Crossbowman' ; Military[:MASTER_CROSSBOWMAN] = true ; Parent[:MASTER_CROSSBOWMAN] = :CROSSBOWMAN ; Color[:MASTER_CROSSBOWMAN] = 10
    ENUM[81] = :WRESTLER ; NUME[:WRESTLER] = 81 ; Caption[:WRESTLER] = 'Wrestler' ; Military[:WRESTLER] = true ; Color[:WRESTLER] = 7
    ENUM[82] = :MASTER_WRESTLER ; NUME[:MASTER_WRESTLER] = 82 ; Caption[:MASTER_WRESTLER] = 'Elite Wrestler' ; Military[:MASTER_WRESTLER] = true ; Parent[:MASTER_WRESTLER] = :WRESTLER ; Color[:MASTER_WRESTLER] = 15
    ENUM[83] = :AXEMAN ; NUME[:AXEMAN] = 83 ; Caption[:AXEMAN] = 'Axeman' ; Military[:AXEMAN] = true ; Color[:AXEMAN] = 1
    ENUM[84] = :MASTER_AXEMAN ; NUME[:MASTER_AXEMAN] = 84 ; Caption[:MASTER_AXEMAN] = 'Axe Lord' ; Military[:MASTER_AXEMAN] = true ; Parent[:MASTER_AXEMAN] = :AXEMAN ; Color[:MASTER_AXEMAN] = 9
    ENUM[85] = :SWORDSMAN ; NUME[:SWORDSMAN] = 85 ; Caption[:SWORDSMAN] = 'Swordsman' ; Military[:SWORDSMAN] = true ; Color[:SWORDSMAN] = 3
    ENUM[86] = :MASTER_SWORDSMAN ; NUME[:MASTER_SWORDSMAN] = 86 ; Caption[:MASTER_SWORDSMAN] = 'Swordsmaster' ; Military[:MASTER_SWORDSMAN] = true ; Parent[:MASTER_SWORDSMAN] = :SWORDSMAN ; Color[:MASTER_SWORDSMAN] = 11
    ENUM[87] = :MACEMAN ; NUME[:MACEMAN] = 87 ; Caption[:MACEMAN] = 'Maceman' ; Military[:MACEMAN] = true ; Color[:MACEMAN] = 4
    ENUM[88] = :MASTER_MACEMAN ; NUME[:MASTER_MACEMAN] = 88 ; Caption[:MASTER_MACEMAN] = 'Mace Lord' ; Military[:MASTER_MACEMAN] = true ; Parent[:MASTER_MACEMAN] = :MACEMAN ; Color[:MASTER_MACEMAN] = 12
    ENUM[89] = :PIKEMAN ; NUME[:PIKEMAN] = 89 ; Caption[:PIKEMAN] = 'Pikeman' ; Military[:PIKEMAN] = true ; Color[:PIKEMAN] = 6
    ENUM[90] = :MASTER_PIKEMAN ; NUME[:MASTER_PIKEMAN] = 90 ; Caption[:MASTER_PIKEMAN] = 'Pikemaster' ; Military[:MASTER_PIKEMAN] = true ; Parent[:MASTER_PIKEMAN] = :PIKEMAN ; Color[:MASTER_PIKEMAN] = 14
    ENUM[91] = :BOWMAN ; NUME[:BOWMAN] = 91 ; Caption[:BOWMAN] = 'Bowman' ; Military[:BOWMAN] = true ; Color[:BOWMAN] = 2
    ENUM[92] = :MASTER_BOWMAN ; NUME[:MASTER_BOWMAN] = 92 ; Caption[:MASTER_BOWMAN] = 'Elite Bowman' ; Military[:MASTER_BOWMAN] = true ; Parent[:MASTER_BOWMAN] = :BOWMAN ; Color[:MASTER_BOWMAN] = 10
    ENUM[93] = :BLOWGUNMAN ; NUME[:BLOWGUNMAN] = 93 ; Caption[:BLOWGUNMAN] = 'Blowgunner' ; Military[:BLOWGUNMAN] = true ; Color[:BLOWGUNMAN] = 8
    ENUM[94] = :MASTER_BLOWGUNMAN ; NUME[:MASTER_BLOWGUNMAN] = 94 ; Caption[:MASTER_BLOWGUNMAN] = 'Master Blowgunner' ; Military[:MASTER_BLOWGUNMAN] = true ; Parent[:MASTER_BLOWGUNMAN] = :BLOWGUNMAN ; Color[:MASTER_BLOWGUNMAN] = 8
    ENUM[95] = :LASHER ; NUME[:LASHER] = 95 ; Caption[:LASHER] = 'Lasher' ; Military[:LASHER] = true ; Color[:LASHER] = 8
    ENUM[96] = :MASTER_LASHER ; NUME[:MASTER_LASHER] = 96 ; Caption[:MASTER_LASHER] = 'Master Lasher' ; Military[:MASTER_LASHER] = true ; Parent[:MASTER_LASHER] = :LASHER ; Color[:MASTER_LASHER] = 8
    ENUM[97] = :RECRUIT ; NUME[:RECRUIT] = 97 ; Caption[:RECRUIT] = 'Recruit' ; Military[:RECRUIT] = true ; Color[:RECRUIT] = 8 ; Moodable[:RECRUIT] = true
    ENUM[98] = :TRAINED_HUNTER ; NUME[:TRAINED_HUNTER] = 98 ; Caption[:TRAINED_HUNTER] = 'Hunting Animal' ; Color[:TRAINED_HUNTER] = 15
    ENUM[99] = :TRAINED_WAR ; NUME[:TRAINED_WAR] = 99 ; Caption[:TRAINED_WAR] = 'War Animal' ; Color[:TRAINED_WAR] = 8
    ENUM[100] = :MASTER_THIEF ; NUME[:MASTER_THIEF] = 100 ; Caption[:MASTER_THIEF] = 'Master Thief' ; Parent[:MASTER_THIEF] = :THIEF ; Color[:MASTER_THIEF] = 8
    ENUM[101] = :THIEF ; NUME[:THIEF] = 101 ; Caption[:THIEF] = 'Thief' ; Color[:THIEF] = 8
    ENUM[102] = :STANDARD ; NUME[:STANDARD] = 102 ; Caption[:STANDARD] = 'Peasant' ; Color[:STANDARD] = -1 ; Moodable[:STANDARD] = true
    ENUM[103] = :CHILD ; NUME[:CHILD] = 103 ; Caption[:CHILD] = 'Child' ; CanAssignLabor[:CHILD] = false ; Parent[:CHILD] = :STANDARD ; Color[:CHILD] = 4 ; Moodable[:CHILD] = true
    ENUM[104] = :BABY ; NUME[:BABY] = 104 ; Caption[:BABY] = 'Baby' ; CanAssignLabor[:BABY] = false ; Parent[:BABY] = :STANDARD ; Color[:BABY] = 4
    ENUM[105] = :DRUNK ; NUME[:DRUNK] = 105 ; Caption[:DRUNK] = 'Drunk' ; CanAssignLabor[:DRUNK] = false ; Parent[:DRUNK] = :STANDARD ; Color[:DRUNK] = 6
    ENUM[106] = :MONSTER_SLAYER ; NUME[:MONSTER_SLAYER] = 106 ; Caption[:MONSTER_SLAYER] = 'Monster slayer' ; CanAssignLabor[:MONSTER_SLAYER] = false ; Parent[:MONSTER_SLAYER] = :STANDARD ; Color[:MONSTER_SLAYER] = 6
    ENUM[107] = :SCOUT ; NUME[:SCOUT] = 107 ; Caption[:SCOUT] = 'Scout' ; CanAssignLabor[:SCOUT] = false ; Parent[:SCOUT] = :STANDARD ; Color[:SCOUT] = 6
    ENUM[108] = :BEAST_HUNTER ; NUME[:BEAST_HUNTER] = 108 ; Caption[:BEAST_HUNTER] = 'Beast hunter' ; CanAssignLabor[:BEAST_HUNTER] = false ; Parent[:BEAST_HUNTER] = :STANDARD ; Color[:BEAST_HUNTER] = 6
    ENUM[109] = :SNATCHER ; NUME[:SNATCHER] = 109 ; Caption[:SNATCHER] = 'Snatcher' ; CanAssignLabor[:SNATCHER] = false ; Parent[:SNATCHER] = :STANDARD ; Color[:SNATCHER] = 6
    ENUM[110] = :MERCENARY ; NUME[:MERCENARY] = 110 ; Caption[:MERCENARY] = 'Mercenary' ; CanAssignLabor[:MERCENARY] = false ; Parent[:MERCENARY] = :STANDARD ; Color[:MERCENARY] = 6
    ENUM[111] = :GELDER ; NUME[:GELDER] = 111 ; Caption[:GELDER] = 'Gelder' ; Parent[:GELDER] = :FARMER ; Color[:GELDER] = 6 ; Moodable[:GELDER] = true
    ENUM[112] = :PERFORMER ; NUME[:PERFORMER] = 112 ; Caption[:PERFORMER] = 'Performer' ; Color[:PERFORMER] = 5 ; Moodable[:PERFORMER] = true
    ENUM[113] = :POET ; NUME[:POET] = 113 ; Caption[:POET] = 'Poet' ; Parent[:POET] = :PERFORMER ; Color[:POET] = 5 ; Moodable[:POET] = true
    ENUM[114] = :BARD ; NUME[:BARD] = 114 ; Caption[:BARD] = 'Bard' ; Parent[:BARD] = :PERFORMER ; Color[:BARD] = 5 ; Moodable[:BARD] = true
    ENUM[115] = :DANCER ; NUME[:DANCER] = 115 ; Caption[:DANCER] = 'Dancer' ; Parent[:DANCER] = :PERFORMER ; Color[:DANCER] = 5 ; Moodable[:DANCER] = true
    ENUM[116] = :SAGE ; NUME[:SAGE] = 116 ; Caption[:SAGE] = 'Sage' ; Parent[:SAGE] = :SCHOLAR ; Color[:SAGE] = 5 ; Moodable[:SAGE] = true
    ENUM[117] = :SCHOLAR ; NUME[:SCHOLAR] = 117 ; Caption[:SCHOLAR] = 'Scholar' ; Color[:SCHOLAR] = 5 ; Moodable[:SCHOLAR] = true
    ENUM[118] = :PHILOSOPHER ; NUME[:PHILOSOPHER] = 118 ; Caption[:PHILOSOPHER] = 'Philosopher' ; Parent[:PHILOSOPHER] = :SCHOLAR ; Color[:PHILOSOPHER] = 5 ; Moodable[:PHILOSOPHER] = true
    ENUM[119] = :MATHEMATICIAN ; NUME[:MATHEMATICIAN] = 119 ; Caption[:MATHEMATICIAN] = 'Mathematician' ; Parent[:MATHEMATICIAN] = :SCHOLAR ; Color[:MATHEMATICIAN] = 5 ; Moodable[:MATHEMATICIAN] = true
    ENUM[120] = :HISTORIAN ; NUME[:HISTORIAN] = 120 ; Caption[:HISTORIAN] = 'Historian' ; Parent[:HISTORIAN] = :SCHOLAR ; Color[:HISTORIAN] = 5 ; Moodable[:HISTORIAN] = true
    ENUM[121] = :ASTRONOMER ; NUME[:ASTRONOMER] = 121 ; Caption[:ASTRONOMER] = 'Astronomer' ; Parent[:ASTRONOMER] = :SCHOLAR ; Color[:ASTRONOMER] = 5 ; Moodable[:ASTRONOMER] = true
    ENUM[122] = :NATURALIST ; NUME[:NATURALIST] = 122 ; Caption[:NATURALIST] = 'Naturalist' ; Parent[:NATURALIST] = :SCHOLAR ; Color[:NATURALIST] = 5 ; Moodable[:NATURALIST] = true
    ENUM[123] = :CHEMIST ; NUME[:CHEMIST] = 123 ; Caption[:CHEMIST] = 'Chemist' ; Parent[:CHEMIST] = :SCHOLAR ; Color[:CHEMIST] = 5 ; Moodable[:CHEMIST] = true
    ENUM[124] = :GEOGRAPHER ; NUME[:GEOGRAPHER] = 124 ; Caption[:GEOGRAPHER] = 'Geographer' ; Parent[:GEOGRAPHER] = :SCHOLAR ; Color[:GEOGRAPHER] = 5 ; Moodable[:GEOGRAPHER] = true
    ENUM[125] = :SCRIBE ; NUME[:SCRIBE] = 125 ; Caption[:SCRIBE] = 'Scribe' ; Color[:SCRIBE] = 5 ; Moodable[:SCRIBE] = true
    ENUM[126] = :PAPERMAKER ; NUME[:PAPERMAKER] = 126 ; Caption[:PAPERMAKER] = 'Papermaker' ; Parent[:PAPERMAKER] = :CRAFTSMAN ; Color[:PAPERMAKER] = 9 ; Moodable[:PAPERMAKER] = true
    ENUM[127] = :BOOKBINDER ; NUME[:BOOKBINDER] = 127 ; Caption[:BOOKBINDER] = 'Bookbinder' ; Parent[:BOOKBINDER] = :CRAFTSMAN ; Color[:BOOKBINDER] = 9 ; Moodable[:BOOKBINDER] = true
    ENUM[128] = :TAVERN_KEEPER ; NUME[:TAVERN_KEEPER] = 128 ; Caption[:TAVERN_KEEPER] = 'Tavern Keeper' ; Color[:TAVERN_KEEPER] = 5
    ENUM[129] = :CRIMINAL ; NUME[:CRIMINAL] = 129 ; Caption[:CRIMINAL] = 'Criminal' ; Color[:CRIMINAL] = 8
    ENUM[130] = :PEDDLER ; NUME[:PEDDLER] = 130 ; Caption[:PEDDLER] = 'Peddler' ; Color[:PEDDLER] = 7
    ENUM[131] = :PROPHET ; NUME[:PROPHET] = 131 ; Caption[:PROPHET] = 'Prophet' ; Color[:PROPHET] = 15
    ENUM[132] = :PILGRIM ; NUME[:PILGRIM] = 132 ; Caption[:PILGRIM] = 'Pilgrim' ; Color[:PILGRIM] = 15
    ENUM[133] = :MONK ; NUME[:MONK] = 133 ; Caption[:MONK] = 'Monk' ; Color[:MONK] = 15
    ENUM[134] = :MESSENGER ; NUME[:MESSENGER] = 134 ; Caption[:MESSENGER] = 'Messenger' ; Color[:MESSENGER] = 5
end

class ProjectileType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Item ; NUME[:Item] = 0
    ENUM[1] = :Unit ; NUME[:Unit] = 1
    ENUM[2] = :Magic ; NUME[:Magic] = 2
end

class PronounType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Symbol = Hash.new
    Subject = Hash.new
    Object = Hash.new
    Posessive = Hash.new
    Reflexive = Hash.new
    ENUM[-1] = :It ; NUME[:It] = -1 ; Subject[:It] = 'it' ; Object[:It] = 'it' ; Posessive[:It] = 'its' ; Reflexive[:It] = 'itself'
    ENUM[0] = :She ; NUME[:She] = 0 ; Symbol[:She] = '\x0c' ; Subject[:She] = 'she' ; Object[:She] = 'her' ; Posessive[:She] = 'her' ; Reflexive[:She] = 'herself'
    ENUM[1] = :He ; NUME[:He] = 1 ; Symbol[:He] = '\x0b' ; Subject[:He] = 'he' ; Object[:He] = 'him' ; Posessive[:He] = 'his' ; Reflexive[:He] = 'himself'
end

class ReactionFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FUEL ; NUME[:FUEL] = 0
    ENUM[1] = :AUTOMATIC ; NUME[:AUTOMATIC] = 1
    ENUM[2] = :ADVENTURE_MODE_ENABLED ; NUME[:ADVENTURE_MODE_ENABLED] = 2
end

class ReactionProductImprovementFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GET_MATERIAL_SAME ; NUME[:GET_MATERIAL_SAME] = 0
    ENUM[1] = :GET_MATERIAL_PRODUCT ; NUME[:GET_MATERIAL_PRODUCT] = 1
    ENUM[2] = :GLAZED ; NUME[:GLAZED] = 2
end

class ReactionProductItemFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GET_MATERIAL_SAME ; NUME[:GET_MATERIAL_SAME] = 0
    ENUM[1] = :GET_MATERIAL_PRODUCT ; NUME[:GET_MATERIAL_PRODUCT] = 1
    ENUM[2] = :FORCE_EDGE ; NUME[:FORCE_EDGE] = 2
    ENUM[3] = :PASTE ; NUME[:PASTE] = 3
    ENUM[4] = :PRESSED ; NUME[:PRESSED] = 4
    ENUM[5] = :CRAFTS ; NUME[:CRAFTS] = 5
end

class ReactionProductType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Item ; NUME[:Item] = 0
    ENUM[1] = :Improvement ; NUME[:Improvement] = 1
end

class ReactionReagentType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Item ; NUME[:Item] = 0
end

class RegionBlockEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SphereField ; NUME[:SphereField] = 0
end

class RegionMapEntryFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HasRiver ; NUME[:HasRiver] = 0
    ENUM[1] = :TileVariant ; NUME[:TileVariant] = 1
    ENUM[3] = :HasSite ; NUME[:HasSite] = 3
    ENUM[5] = :RiverUp ; NUME[:RiverUp] = 5
    ENUM[6] = :RiverDown ; NUME[:RiverDown] = 6
    ENUM[7] = :RiverRight ; NUME[:RiverRight] = 7
    ENUM[8] = :RiverLeft ; NUME[:RiverLeft] = 8
    ENUM[9] = :Discovered ; NUME[:Discovered] = 9
    ENUM[12] = :HasArmy ; NUME[:HasArmy] = 12
    ENUM[13] = :IsPeak ; NUME[:IsPeak] = 13
    ENUM[14] = :IsLake ; NUME[:IsLake] = 14
    ENUM[15] = :IsBrook ; NUME[:IsBrook] = 15
    ENUM[16] = :HasRoad ; NUME[:HasRoad] = 16
end

class RegionWeatherType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CreepingGas ; NUME[:CreepingGas] = 0
    ENUM[1] = :CreepingVapor ; NUME[:CreepingVapor] = 1
    ENUM[2] = :CreepingDust ; NUME[:CreepingDust] = 2
    ENUM[3] = :FallingMaterial ; NUME[:FallingMaterial] = 3
end

class ReportZoomType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Generic ; NUME[:Generic] = 0
    ENUM[1] = :Item ; NUME[:Item] = 1
    ENUM[2] = :Unit ; NUME[:Unit] = 2
end

class ReputationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Hero ; NUME[:Hero] = 0
    ENUM[1] = :Buddy ; NUME[:Buddy] = 1
    ENUM[2] = :Grudge ; NUME[:Grudge] = 2
    ENUM[3] = :AnimalPartner ; NUME[:AnimalPartner] = 3
    ENUM[4] = :Brawler ; NUME[:Brawler] = 4
    ENUM[5] = :Psycho ; NUME[:Psycho] = 5
    ENUM[6] = :TradePartner ; NUME[:TradePartner] = 6
    ENUM[7] = :Friendly ; NUME[:Friendly] = 7
    ENUM[8] = :Killer ; NUME[:Killer] = 8
    ENUM[9] = :Murderer ; NUME[:Murderer] = 9
    ENUM[10] = :Comrade ; NUME[:Comrade] = 10
    ENUM[11] = :RespectedGroup ; NUME[:RespectedGroup] = 11
    ENUM[12] = :HatedGroup ; NUME[:HatedGroup] = 12
    ENUM[13] = :EnemyFighter ; NUME[:EnemyFighter] = 13
    ENUM[14] = :FriendlyFighter ; NUME[:FriendlyFighter] = 14
    ENUM[15] = :Bully ; NUME[:Bully] = 15
    ENUM[16] = :Brigand ; NUME[:Brigand] = 16
    ENUM[17] = :LoyalSoldier ; NUME[:LoyalSoldier] = 17
    ENUM[18] = :Monster ; NUME[:Monster] = 18
    ENUM[19] = :Storyteller ; NUME[:Storyteller] = 19
    ENUM[20] = :Poet ; NUME[:Poet] = 20
    ENUM[21] = :Bard ; NUME[:Bard] = 21
    ENUM[22] = :Dancer ; NUME[:Dancer] = 22
    ENUM[23] = :Quarreler ; NUME[:Quarreler] = 23
    ENUM[24] = :Flatterer ; NUME[:Flatterer] = 24
    ENUM[25] = :Hunter ; NUME[:Hunter] = 25
    ENUM[26] = :ProtectorOfWeak ; NUME[:ProtectorOfWeak] = 26
    ENUM[27] = :TreasureHunter ; NUME[:TreasureHunter] = 27
    ENUM[28] = :Thief ; NUME[:Thief] = 28
    ENUM[29] = :InformationSource ; NUME[:InformationSource] = 29
    ENUM[30] = :PreserverOfKnowledge ; NUME[:PreserverOfKnowledge] = 30
    ENUM[31] = :Intruder ; NUME[:Intruder] = 31
    ENUM[32] = :Preacher ; NUME[:Preacher] = 32
end

class ResourceAllotmentSpecifierType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CROP ; NUME[:CROP] = 0
    ENUM[1] = :STONE ; NUME[:STONE] = 1
    ENUM[2] = :METAL ; NUME[:METAL] = 2
    ENUM[3] = :WOOD ; NUME[:WOOD] = 3
    ENUM[4] = :ARMOR_BODY ; NUME[:ARMOR_BODY] = 4
    ENUM[5] = :ARMOR_PANTS ; NUME[:ARMOR_PANTS] = 5
    ENUM[6] = :ARMOR_GLOVES ; NUME[:ARMOR_GLOVES] = 6
    ENUM[7] = :ARMOR_BOOTS ; NUME[:ARMOR_BOOTS] = 7
    ENUM[8] = :ARMOR_HELM ; NUME[:ARMOR_HELM] = 8
    ENUM[9] = :CLOTHING_BODY ; NUME[:CLOTHING_BODY] = 9
    ENUM[10] = :CLOTHING_PANTS ; NUME[:CLOTHING_PANTS] = 10
    ENUM[11] = :CLOTHING_GLOVES ; NUME[:CLOTHING_GLOVES] = 11
    ENUM[12] = :CLOTHING_BOOTS ; NUME[:CLOTHING_BOOTS] = 12
    ENUM[13] = :CLOTHING_HELM ; NUME[:CLOTHING_HELM] = 13
    ENUM[14] = :WEAPON_MELEE ; NUME[:WEAPON_MELEE] = 14
    ENUM[15] = :WEAPON_RANGED ; NUME[:WEAPON_RANGED] = 15
    ENUM[16] = :ANVIL ; NUME[:ANVIL] = 16
    ENUM[17] = :GEMS ; NUME[:GEMS] = 17
    ENUM[18] = :THREAD ; NUME[:THREAD] = 18
    ENUM[19] = :CLOTH ; NUME[:CLOTH] = 19
    ENUM[20] = :LEATHER ; NUME[:LEATHER] = 20
    ENUM[21] = :QUIVER ; NUME[:QUIVER] = 21
    ENUM[22] = :BACKPACK ; NUME[:BACKPACK] = 22
    ENUM[23] = :FLASK ; NUME[:FLASK] = 23
    ENUM[24] = :BAG ; NUME[:BAG] = 24
    ENUM[25] = :TABLE ; NUME[:TABLE] = 25
    ENUM[26] = :CABINET ; NUME[:CABINET] = 26
    ENUM[27] = :CHAIR ; NUME[:CHAIR] = 27
    ENUM[28] = :BOX ; NUME[:BOX] = 28
    ENUM[29] = :BED ; NUME[:BED] = 29
    ENUM[30] = :CRAFTS ; NUME[:CRAFTS] = 30
    ENUM[31] = :MEAT ; NUME[:MEAT] = 31
    ENUM[32] = :BONE ; NUME[:BONE] = 32
    ENUM[33] = :HORN ; NUME[:HORN] = 33
    ENUM[34] = :SHELL ; NUME[:SHELL] = 34
    ENUM[35] = :TALLOW ; NUME[:TALLOW] = 35
    ENUM[36] = :TOOTH ; NUME[:TOOTH] = 36
    ENUM[37] = :PEARL ; NUME[:PEARL] = 37
    ENUM[38] = :SOAP ; NUME[:SOAP] = 38
    ENUM[39] = :EXTRACT ; NUME[:EXTRACT] = 39
    ENUM[40] = :CHEESE ; NUME[:CHEESE] = 40
    ENUM[41] = :SKIN ; NUME[:SKIN] = 41
    ENUM[42] = :POWDER ; NUME[:POWDER] = 42
    ENUM[43] = :AMMO ; NUME[:AMMO] = 43
end

class SaveVersion < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[1107] = :V0219319a ; NUME[:V0219319a] = 1107
    ENUM[1108] = :V0219319c ; NUME[:V0219319c] = 1108
    ENUM[1108] = :V0219519a ; NUME[:V0219519a] = 1108
    ENUM[1108] = :V0219519b ; NUME[:V0219519b] = 1108
    ENUM[1110] = :V0219519c ; NUME[:V0219519c] = 1110
    ENUM[1121] = :V02110419d ; NUME[:V02110419d] = 1121
    ENUM[1123] = :V02110421a ; NUME[:V02110421a] = 1123
    ENUM[1125] = :V02110421b ; NUME[:V02110421b] = 1125
    ENUM[1128] = :V02110521a ; NUME[:V02110521a] = 1128
    ENUM[1128] = :V02210721a ; NUME[:V02210721a] = 1128
    ENUM[1134] = :V02211022e ; NUME[:V02211022e] = 1134
    ENUM[1137] = :V02211022f ; NUME[:V02211022f] = 1137
    ENUM[1148] = :V02211023a ; NUME[:V02211023a] = 1148
    ENUM[1151] = :V02212023a ; NUME[:V02212023a] = 1151
    ENUM[1161] = :V02212123b ; NUME[:V02212123b] = 1161
    ENUM[1165] = :V02212323a ; NUME[:V02212323a] = 1165
    ENUM[1169] = :V02313023a ; NUME[:V02313023a] = 1169
    ENUM[1205] = :V02716932a ; NUME[:V02716932a] = 1205
    ENUM[1206] = :V02716933a ; NUME[:V02716933a] = 1206
    ENUM[1209] = :V02716933b ; NUME[:V02716933b] = 1209
    ENUM[1211] = :V02716933c ; NUME[:V02716933c] = 1211
    ENUM[1212] = :V02716933d ; NUME[:V02716933d] = 1212
    ENUM[1255] = :V02818139b ; NUME[:V02818139b] = 1255
    ENUM[1256] = :V02818139c ; NUME[:V02818139c] = 1256
    ENUM[1259] = :V02818139d ; NUME[:V02818139d] = 1259
    ENUM[1260] = :V02818139e ; NUME[:V02818139e] = 1260
    ENUM[1261] = :V02818139f ; NUME[:V02818139f] = 1261
    ENUM[1265] = :V02818140a ; NUME[:V02818140a] = 1265
    ENUM[1266] = :V02818140b ; NUME[:V02818140b] = 1266
    ENUM[1267] = :V02818140c ; NUME[:V02818140c] = 1267
    ENUM[1268] = :V02818140d ; NUME[:V02818140d] = 1268
    ENUM[1287] = :V03101 ; NUME[:V03101] = 1287
    ENUM[1288] = :V03102 ; NUME[:V03102] = 1288
    ENUM[1289] = :V03103 ; NUME[:V03103] = 1289
    ENUM[1292] = :V03104 ; NUME[:V03104] = 1292
    ENUM[1295] = :V03105 ; NUME[:V03105] = 1295
    ENUM[1297] = :V03106 ; NUME[:V03106] = 1297
    ENUM[1300] = :V03108 ; NUME[:V03108] = 1300
    ENUM[1304] = :V03109 ; NUME[:V03109] = 1304
    ENUM[1305] = :V03110 ; NUME[:V03110] = 1305
    ENUM[1310] = :V03111 ; NUME[:V03111] = 1310
    ENUM[1311] = :V03112 ; NUME[:V03112] = 1311
    ENUM[1323] = :V03113 ; NUME[:V03113] = 1323
    ENUM[1325] = :V03114 ; NUME[:V03114] = 1325
    ENUM[1326] = :V03115 ; NUME[:V03115] = 1326
    ENUM[1327] = :V03116 ; NUME[:V03116] = 1327
    ENUM[1340] = :V03117 ; NUME[:V03117] = 1340
    ENUM[1341] = :V03118 ; NUME[:V03118] = 1341
    ENUM[1351] = :V03119 ; NUME[:V03119] = 1351
    ENUM[1353] = :V03120 ; NUME[:V03120] = 1353
    ENUM[1354] = :V03121 ; NUME[:V03121] = 1354
    ENUM[1359] = :V03122 ; NUME[:V03122] = 1359
    ENUM[1360] = :V03123 ; NUME[:V03123] = 1360
    ENUM[1361] = :V03124 ; NUME[:V03124] = 1361
    ENUM[1362] = :V03125 ; NUME[:V03125] = 1362
    ENUM[1372] = :V03401 ; NUME[:V03401] = 1372
    ENUM[1374] = :V03402 ; NUME[:V03402] = 1374
    ENUM[1376] = :V03403 ; NUME[:V03403] = 1376
    ENUM[1377] = :V03404 ; NUME[:V03404] = 1377
    ENUM[1378] = :V03405 ; NUME[:V03405] = 1378
    ENUM[1382] = :V03406 ; NUME[:V03406] = 1382
    ENUM[1383] = :V03407 ; NUME[:V03407] = 1383
    ENUM[1400] = :V03408 ; NUME[:V03408] = 1400
    ENUM[1402] = :V03409 ; NUME[:V03409] = 1402
    ENUM[1403] = :V03410 ; NUME[:V03410] = 1403
    ENUM[1404] = :V03411 ; NUME[:V03411] = 1404
    ENUM[1441] = :V04001 ; NUME[:V04001] = 1441
    ENUM[1442] = :V04002 ; NUME[:V04002] = 1442
    ENUM[1443] = :V04003 ; NUME[:V04003] = 1443
    ENUM[1444] = :V04004 ; NUME[:V04004] = 1444
    ENUM[1445] = :V04005 ; NUME[:V04005] = 1445
    ENUM[1446] = :V04006 ; NUME[:V04006] = 1446
    ENUM[1448] = :V04007 ; NUME[:V04007] = 1448
    ENUM[1449] = :V04008 ; NUME[:V04008] = 1449
    ENUM[1451] = :V04009 ; NUME[:V04009] = 1451
    ENUM[1452] = :V04010 ; NUME[:V04010] = 1452
    ENUM[1456] = :V04011 ; NUME[:V04011] = 1456
    ENUM[1459] = :V04012 ; NUME[:V04012] = 1459
    ENUM[1462] = :V04013 ; NUME[:V04013] = 1462
    ENUM[1469] = :V04014 ; NUME[:V04014] = 1469
    ENUM[1470] = :V04015 ; NUME[:V04015] = 1470
    ENUM[1471] = :V04016 ; NUME[:V04016] = 1471
    ENUM[1472] = :V04017 ; NUME[:V04017] = 1472
    ENUM[1473] = :V04018 ; NUME[:V04018] = 1473
    ENUM[1474] = :V04019 ; NUME[:V04019] = 1474
    ENUM[1477] = :V04020 ; NUME[:V04020] = 1477
    ENUM[1478] = :V04021 ; NUME[:V04021] = 1478
    ENUM[1479] = :V04022 ; NUME[:V04022] = 1479
    ENUM[1480] = :V04023 ; NUME[:V04023] = 1480
    ENUM[1481] = :V04024 ; NUME[:V04024] = 1481
    ENUM[1531] = :V04201 ; NUME[:V04201] = 1531
    ENUM[1532] = :V04202 ; NUME[:V04202] = 1532
    ENUM[1533] = :V04203 ; NUME[:V04203] = 1533
    ENUM[1534] = :V04204 ; NUME[:V04204] = 1534
    ENUM[1537] = :V04205 ; NUME[:V04205] = 1537
    ENUM[1542] = :V04206 ; NUME[:V04206] = 1542
    ENUM[1551] = :V04301 ; NUME[:V04301] = 1551
    ENUM[1552] = :V04302 ; NUME[:V04302] = 1552
    ENUM[1553] = :V04303 ; NUME[:V04303] = 1553
    ENUM[1555] = :V04304 ; NUME[:V04304] = 1555
    ENUM[1556] = :V04305 ; NUME[:V04305] = 1556
    ENUM[1596] = :V04401 ; NUME[:V04401] = 1596
    ENUM[1597] = :V04402 ; NUME[:V04402] = 1597
    ENUM[1600] = :V04403 ; NUME[:V04403] = 1600
    ENUM[1603] = :V04404 ; NUME[:V04404] = 1603
    ENUM[1604] = :V04405 ; NUME[:V04405] = 1604
    ENUM[1611] = :V04406 ; NUME[:V04406] = 1611
    ENUM[1612] = :V04407 ; NUME[:V04407] = 1612
    ENUM[1613] = :V04408 ; NUME[:V04408] = 1613
    ENUM[1614] = :V04409 ; NUME[:V04409] = 1614
    ENUM[1620] = :V04410 ; NUME[:V04410] = 1620
    ENUM[1623] = :V04411 ; NUME[:V04411] = 1623
    ENUM[1625] = :V04412 ; NUME[:V04412] = 1625
    ENUM[1710] = :V04701 ; NUME[:V04701] = 1710
    ENUM[1711] = :V04702 ; NUME[:V04702] = 1711
    ENUM[1713] = :V04703 ; NUME[:V04703] = 1713
    ENUM[1715] = :V04704 ; NUME[:V04704] = 1715
    ENUM[1716] = :V04705 ; NUME[:V04705] = 1716
end

class ScaleType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Octave ; NUME[:Octave] = 0
    ENUM[1] = :Variable ; NUME[:Variable] = 1
    ENUM[2] = :PerfectFourth ; NUME[:PerfectFourth] = 2
end

class ScrewPumpDirection < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :FromNorth ; NUME[:FromNorth] = 0
    ENUM[1] = :FromEast ; NUME[:FromEast] = 1
    ENUM[2] = :FromSouth ; NUME[:FromSouth] = 2
    ENUM[3] = :FromWest ; NUME[:FromWest] = 3
end

class Season < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Spring ; NUME[:Spring] = 0
    ENUM[1] = :Summer ; NUME[:Summer] = 1
    ENUM[2] = :Autumn ; NUME[:Autumn] = 2
    ENUM[3] = :Winter ; NUME[:Winter] = 3
end

class ShoesFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :METAL_ARMOR_LEVELS ; NUME[:METAL_ARMOR_LEVELS] = 0
end

class ShopType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GeneralStore ; NUME[:GeneralStore] = 0
    ENUM[1] = :CraftsMarket ; NUME[:CraftsMarket] = 1
    ENUM[2] = :ClothingShop ; NUME[:ClothingShop] = 2
    ENUM[3] = :ExoticClothingShop ; NUME[:ExoticClothingShop] = 3
end

class SiegeengineType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Catapult ; NUME[:Catapult] = 0
    ENUM[1] = :Ballista ; NUME[:Ballista] = 1
end

class SimpleActionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Carouse ; NUME[:Carouse] = 0
    ENUM[1] = :PurchaseWellCraftedEquipment ; NUME[:PurchaseWellCraftedEquipment] = 1
    ENUM[2] = :PurchaseFinelyCraftedEquipment ; NUME[:PurchaseFinelyCraftedEquipment] = 2
    ENUM[3] = :PurchaseSuperiorEquipment ; NUME[:PurchaseSuperiorEquipment] = 3
    ENUM[4] = :PurchaseExceptionalEquipment ; NUME[:PurchaseExceptionalEquipment] = 4
    ENUM[5] = :PurchaseMasterworkEquipment ; NUME[:PurchaseMasterworkEquipment] = 5
    ENUM[6] = :PerformeHorribleExperiments ; NUME[:PerformeHorribleExperiments] = 6
end

class SiteDisputeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Territory ; NUME[:Territory] = 0
    ENUM[1] = :WaterRights ; NUME[:WaterRights] = 1
    ENUM[2] = :GrazingRights ; NUME[:GrazingRights] = 2
    ENUM[3] = :FishingRights ; NUME[:FishingRights] = 3
    ENUM[4] = :RightsOfWay ; NUME[:RightsOfWay] = 4
    ENUM[5] = :LivestockOwnership ; NUME[:LivestockOwnership] = 5
end

class SiteRealizationBuildingType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CottagePlot ; NUME[:CottagePlot] = 0
    ENUM[1] = :CastleWall ; NUME[:CastleWall] = 1
    ENUM[2] = :CastleTower ; NUME[:CastleTower] = 2
    ENUM[3] = :CastleCourtyard ; NUME[:CastleCourtyard] = 3
    ENUM[4] = :House ; NUME[:House] = 4
    ENUM[5] = :Temple ; NUME[:Temple] = 5
    ENUM[6] = :Tomb ; NUME[:Tomb] = 6
    ENUM[7] = :ShopHouse ; NUME[:ShopHouse] = 7
    ENUM[8] = :Warehouse ; NUME[:Warehouse] = 8
    ENUM[9] = :MarketSquare ; NUME[:MarketSquare] = 9
    ENUM[10] = :Pasture ; NUME[:Pasture] = 10
    ENUM[11] = :Waste ; NUME[:Waste] = 11
    ENUM[12] = :Courtyard ; NUME[:Courtyard] = 12
    ENUM[13] = :Well ; NUME[:Well] = 13
    ENUM[14] = :Vault ; NUME[:Vault] = 14
    ENUM[15] = :GreatTower ; NUME[:GreatTower] = 15
    ENUM[16] = :Trenches ; NUME[:Trenches] = 16
    ENUM[17] = :TreeHouse ; NUME[:TreeHouse] = 17
    ENUM[18] = :HillockHouse ; NUME[:HillockHouse] = 18
    ENUM[19] = :MeadHall ; NUME[:MeadHall] = 19
    ENUM[20] = :FortressEntrance ; NUME[:FortressEntrance] = 20
    ENUM[21] = :Library ; NUME[:Library] = 21
    ENUM[22] = :Tavern ; NUME[:Tavern] = 22
    ENUM[23] = :CountingHouse ; NUME[:CountingHouse] = 23
    ENUM[24] = :GuildHall ; NUME[:GuildHall] = 24
    ENUM[25] = :CityTower ; NUME[:CityTower] = 25
    ENUM[26] = :Shrine ; NUME[:Shrine] = 26
    ENUM[28] = :Dormitory ; NUME[:Dormitory] = 28
    ENUM[29] = :Dininghall ; NUME[:Dininghall] = 29
    ENUM[30] = :NecromancerTower ; NUME[:NecromancerTower] = 30
    ENUM[31] = :Barrow ; NUME[:Barrow] = 31
end

class SiteShopType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :GeneralImports ; NUME[:GeneralImports] = 0
    ENUM[1] = :FoodImports ; NUME[:FoodImports] = 1
    ENUM[2] = :ClothingImports ; NUME[:ClothingImports] = 2
    ENUM[3] = :Cloth ; NUME[:Cloth] = 3
    ENUM[4] = :Leather ; NUME[:Leather] = 4
    ENUM[5] = :WovenClothing ; NUME[:WovenClothing] = 5
    ENUM[6] = :LeatherClothing ; NUME[:LeatherClothing] = 6
    ENUM[7] = :BoneCarver ; NUME[:BoneCarver] = 7
    ENUM[8] = :GemCutter ; NUME[:GemCutter] = 8
    ENUM[9] = :Weaponsmith ; NUME[:Weaponsmith] = 9
    ENUM[10] = :Bowyer ; NUME[:Bowyer] = 10
    ENUM[11] = :Blacksmith ; NUME[:Blacksmith] = 11
    ENUM[12] = :Armorsmith ; NUME[:Armorsmith] = 12
    ENUM[13] = :MetalCraft ; NUME[:MetalCraft] = 13
    ENUM[14] = :LeatherGoods ; NUME[:LeatherGoods] = 14
    ENUM[15] = :Carpenter ; NUME[:Carpenter] = 15
    ENUM[16] = :StoneFurniture ; NUME[:StoneFurniture] = 16
    ENUM[17] = :MetalFurniture ; NUME[:MetalFurniture] = 17
    ENUM[18] = :ImportedGoodsMarket ; NUME[:ImportedGoodsMarket] = 18
    ENUM[19] = :ImportedFoodMarket ; NUME[:ImportedFoodMarket] = 19
    ENUM[20] = :ImportedClothingMarket ; NUME[:ImportedClothingMarket] = 20
    ENUM[21] = :MeatMarket ; NUME[:MeatMarket] = 21
    ENUM[22] = :FruitAndVegetableMarket ; NUME[:FruitAndVegetableMarket] = 22
    ENUM[23] = :CheeseMarket ; NUME[:CheeseMarket] = 23
    ENUM[24] = :ProcessedGoodsMarket ; NUME[:ProcessedGoodsMarket] = 24
    ENUM[25] = :Tavern ; NUME[:Tavern] = 25
end

class SiteType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PLAYER_FORTRESS ; NUME[:PLAYER_FORTRESS] = 0
    ENUM[1] = :DARK_FORTRESS ; NUME[:DARK_FORTRESS] = 1
    ENUM[2] = :CAVE ; NUME[:CAVE] = 2
    ENUM[3] = :CAVE_DETAILED ; NUME[:CAVE_DETAILED] = 3
    ENUM[4] = :TREE_CITY ; NUME[:TREE_CITY] = 4
    ENUM[5] = :CITY ; NUME[:CITY] = 5
    ENUM[8] = :FORTRESS ; NUME[:FORTRESS] = 8
    ENUM[10] = :MONUMENT ; NUME[:MONUMENT] = 10
end

class SkillRating < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    XpThreshold = Hash.new
    Caption = Hash.new
    ENUM[0] = :Dabbling ; NUME[:Dabbling] = 0 ; XpThreshold[:Dabbling] = 500 ; Caption[:Dabbling] = 'Dabbling'
    ENUM[1] = :Novice ; NUME[:Novice] = 1 ; XpThreshold[:Novice] = 600 ; Caption[:Novice] = 'Novice'
    ENUM[2] = :Adequate ; NUME[:Adequate] = 2 ; XpThreshold[:Adequate] = 700 ; Caption[:Adequate] = 'Adequate'
    ENUM[3] = :Competent ; NUME[:Competent] = 3 ; XpThreshold[:Competent] = 800 ; Caption[:Competent] = 'Competent'
    ENUM[4] = :Skilled ; NUME[:Skilled] = 4 ; XpThreshold[:Skilled] = 900 ; Caption[:Skilled] = 'Skilled'
    ENUM[5] = :Proficient ; NUME[:Proficient] = 5 ; XpThreshold[:Proficient] = 1000 ; Caption[:Proficient] = 'Proficient'
    ENUM[6] = :Talented ; NUME[:Talented] = 6 ; XpThreshold[:Talented] = 1100 ; Caption[:Talented] = 'Talented'
    ENUM[7] = :Adept ; NUME[:Adept] = 7 ; XpThreshold[:Adept] = 1200 ; Caption[:Adept] = 'Adept'
    ENUM[8] = :Expert ; NUME[:Expert] = 8 ; XpThreshold[:Expert] = 1300 ; Caption[:Expert] = 'Expert'
    ENUM[9] = :Professional ; NUME[:Professional] = 9 ; XpThreshold[:Professional] = 1400 ; Caption[:Professional] = 'Professional'
    ENUM[10] = :Accomplished ; NUME[:Accomplished] = 10 ; XpThreshold[:Accomplished] = 1500 ; Caption[:Accomplished] = 'Accomplished'
    ENUM[11] = :Great ; NUME[:Great] = 11 ; XpThreshold[:Great] = 1600 ; Caption[:Great] = 'Great'
    ENUM[12] = :Master ; NUME[:Master] = 12 ; XpThreshold[:Master] = 1700 ; Caption[:Master] = 'Master'
    ENUM[13] = :HighMaster ; NUME[:HighMaster] = 13 ; XpThreshold[:HighMaster] = 1800 ; Caption[:HighMaster] = 'High Master'
    ENUM[14] = :GrandMaster ; NUME[:GrandMaster] = 14 ; XpThreshold[:GrandMaster] = 1900 ; Caption[:GrandMaster] = 'Grand Master'
    ENUM[15] = :Legendary ; NUME[:Legendary] = 15 ; XpThreshold[:Legendary] = 2000 ; Caption[:Legendary] = 'Legendary'
    ENUM[16] = :Legendary1 ; NUME[:Legendary1] = 16 ; XpThreshold[:Legendary1] = 2100 ; Caption[:Legendary1] = 'Legendary+1'
    ENUM[17] = :Legendary2 ; NUME[:Legendary2] = 17 ; XpThreshold[:Legendary2] = 2200 ; Caption[:Legendary2] = 'Legendary+2'
    ENUM[18] = :Legendary3 ; NUME[:Legendary3] = 18 ; XpThreshold[:Legendary3] = 2300 ; Caption[:Legendary3] = 'Legendary+3'
    ENUM[19] = :Legendary4 ; NUME[:Legendary4] = 19 ; XpThreshold[:Legendary4] = 2400 ; Caption[:Legendary4] = 'Legendary+4'
    ENUM[20] = :Legendary5 ; NUME[:Legendary5] = 20 ; Caption[:Legendary5] = 'Legendary+5'
end

class SlabEngravingType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :Slab ; NUME[:Slab] = -1
    ENUM[0] = :Memorial ; NUME[:Memorial] = 0
    ENUM[1] = :CraftShopSign ; NUME[:CraftShopSign] = 1
    ENUM[2] = :WeaponsmithShopSign ; NUME[:WeaponsmithShopSign] = 2
    ENUM[3] = :ArmorsmithShopSign ; NUME[:ArmorsmithShopSign] = 3
    ENUM[4] = :GeneralStoreSign ; NUME[:GeneralStoreSign] = 4
    ENUM[5] = :FoodShopSign ; NUME[:FoodShopSign] = 5
    ENUM[6] = :Secrets ; NUME[:Secrets] = 6
    ENUM[7] = :FoodImportsSign ; NUME[:FoodImportsSign] = 7
    ENUM[8] = :ClothingImportsSign ; NUME[:ClothingImportsSign] = 8
    ENUM[9] = :GeneralImportsSign ; NUME[:GeneralImportsSign] = 9
    ENUM[10] = :ClothShopSign ; NUME[:ClothShopSign] = 10
    ENUM[11] = :LeatherShopSign ; NUME[:LeatherShopSign] = 11
    ENUM[12] = :WovenClothingShopSign ; NUME[:WovenClothingShopSign] = 12
    ENUM[13] = :LeatherClothingShopSign ; NUME[:LeatherClothingShopSign] = 13
    ENUM[14] = :BoneCarverShopSign ; NUME[:BoneCarverShopSign] = 14
    ENUM[15] = :GemCutterShopSign ; NUME[:GemCutterShopSign] = 15
    ENUM[16] = :WeaponsmithShopSign2 ; NUME[:WeaponsmithShopSign2] = 16
    ENUM[17] = :BowyerShopSign ; NUME[:BowyerShopSign] = 17
    ENUM[18] = :BlacksmithShopSign ; NUME[:BlacksmithShopSign] = 18
    ENUM[19] = :ArmorsmithShopSign2 ; NUME[:ArmorsmithShopSign2] = 19
    ENUM[20] = :MetalCraftShopSign ; NUME[:MetalCraftShopSign] = 20
    ENUM[21] = :LeatherGoodsShopSign ; NUME[:LeatherGoodsShopSign] = 21
    ENUM[22] = :CarpenterShopSign ; NUME[:CarpenterShopSign] = 22
    ENUM[23] = :StoneFurnitureShopSign ; NUME[:StoneFurnitureShopSign] = 23
    ENUM[24] = :MetalFurnitureShopSign ; NUME[:MetalFurnitureShopSign] = 24
    ENUM[25] = :DemonIdentity ; NUME[:DemonIdentity] = 25
    ENUM[26] = :TavernSign ; NUME[:TavernSign] = 26
end

class SoundProductionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PLUCKED_BY_BP ; NUME[:PLUCKED_BY_BP] = 0
    ENUM[1] = :PLUCKED ; NUME[:PLUCKED] = 1
    ENUM[2] = :BOWED ; NUME[:BOWED] = 2
    ENUM[3] = :STRUCK_BY_BP ; NUME[:STRUCK_BY_BP] = 3
    ENUM[4] = :STRUCK ; NUME[:STRUCK] = 4
    ENUM[5] = :VIBRATE_BP_AGAINST_OPENING ; NUME[:VIBRATE_BP_AGAINST_OPENING] = 5
    ENUM[6] = :BLOW_AGAINST_FIPPLE ; NUME[:BLOW_AGAINST_FIPPLE] = 6
    ENUM[7] = :BLOW_OVER_OPENING_SIDE ; NUME[:BLOW_OVER_OPENING_SIDE] = 7
    ENUM[8] = :BLOW_OVER_OPENING_END ; NUME[:BLOW_OVER_OPENING_END] = 8
    ENUM[9] = :BLOW_OVER_SINGLE_REED ; NUME[:BLOW_OVER_SINGLE_REED] = 9
    ENUM[10] = :BLOW_OVER_DOUBLE_REED ; NUME[:BLOW_OVER_DOUBLE_REED] = 10
    ENUM[11] = :BLOW_OVER_FREE_REED ; NUME[:BLOW_OVER_FREE_REED] = 11
    ENUM[12] = :STRUCK_TOGETHER ; NUME[:STRUCK_TOGETHER] = 12
    ENUM[13] = :SHAKEN ; NUME[:SHAKEN] = 13
    ENUM[14] = :SCRAPED ; NUME[:SCRAPED] = 14
    ENUM[15] = :FRICTION ; NUME[:FRICTION] = 15
    ENUM[16] = :RESONATOR ; NUME[:RESONATOR] = 16
    ENUM[17] = :BAG_OVER_REED ; NUME[:BAG_OVER_REED] = 17
    ENUM[18] = :AIR_OVER_REED ; NUME[:AIR_OVER_REED] = 18
    ENUM[19] = :AIR_OVER_FREE_REED ; NUME[:AIR_OVER_FREE_REED] = 19
    ENUM[20] = :AIR_AGAINST_FIPPLE ; NUME[:AIR_AGAINST_FIPPLE] = 20
end

class SpecificRefType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    UnionField = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[1] = :UNIT ; NUME[:UNIT] = 1 ; UnionField[:UNIT] = 'unit'
    ENUM[2] = :JOB ; NUME[:JOB] = 2 ; UnionField[:JOB] = 'job'
    ENUM[3] = :BUILDING_PARTY ; NUME[:BUILDING_PARTY] = 3
    ENUM[4] = :ACTIVITY ; NUME[:ACTIVITY] = 4 ; UnionField[:ACTIVITY] = 'activity'
    ENUM[5] = :ITEM_GENERAL ; NUME[:ITEM_GENERAL] = 5
    ENUM[6] = :EFFECT ; NUME[:EFFECT] = 6 ; UnionField[:EFFECT] = 'effect'
    ENUM[7] = :PETINFO_PET ; NUME[:PETINFO_PET] = 7
    ENUM[8] = :PETINFO_OWNER ; NUME[:PETINFO_OWNER] = 8
    ENUM[9] = :VERMIN_EVENT ; NUME[:VERMIN_EVENT] = 9
    ENUM[10] = :VERMIN_ESCAPED_PET ; NUME[:VERMIN_ESCAPED_PET] = 10 ; UnionField[:VERMIN_ESCAPED_PET] = 'vermin'
    ENUM[11] = :ENTITY ; NUME[:ENTITY] = 11 ; UnionField[:ENTITY] = 'entity'
    ENUM[12] = :PLOT_INFO ; NUME[:PLOT_INFO] = 12
    ENUM[13] = :VIEWSCREEN ; NUME[:VIEWSCREEN] = 13 ; UnionField[:VIEWSCREEN] = 'screen'
    ENUM[14] = :UNIT_ITEM_WRESTLE ; NUME[:UNIT_ITEM_WRESTLE] = 14 ; UnionField[:UNIT_ITEM_WRESTLE] = 'wrestle'
    ENUM[15] = :NULL_REF ; NUME[:NULL_REF] = 15 ; UnionField[:NULL_REF] = 'object'
    ENUM[16] = :HIST_FIG ; NUME[:HIST_FIG] = 16 ; UnionField[:HIST_FIG] = 'histfig'
    ENUM[17] = :SITE ; NUME[:SITE] = 17
    ENUM[18] = :ARTIFACT ; NUME[:ARTIFACT] = 18
    ENUM[19] = :ITEM_IMPROVEMENT ; NUME[:ITEM_IMPROVEMENT] = 19
    ENUM[20] = :COIN_FRONT ; NUME[:COIN_FRONT] = 20
    ENUM[21] = :COIN_BACK ; NUME[:COIN_BACK] = 21
    ENUM[22] = :DETAIL_EVENT ; NUME[:DETAIL_EVENT] = 22
    ENUM[23] = :SUBREGION ; NUME[:SUBREGION] = 23
    ENUM[24] = :FEATURE_LAYER ; NUME[:FEATURE_LAYER] = 24
    ENUM[25] = :ART_IMAGE ; NUME[:ART_IMAGE] = 25
    ENUM[26] = :CREATURE_DEF ; NUME[:CREATURE_DEF] = 26
    ENUM[27] = :ENTITY_ART_IMAGE ; NUME[:ENTITY_ART_IMAGE] = 27
    ENUM[29] = :ENTITY_POPULATION ; NUME[:ENTITY_POPULATION] = 29
    ENUM[30] = :BREED ; NUME[:BREED] = 30
end

class SphereType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :AGRICULTURE ; NUME[:AGRICULTURE] = 0
    ENUM[1] = :ANIMALS ; NUME[:ANIMALS] = 1
    ENUM[2] = :ART ; NUME[:ART] = 2
    ENUM[3] = :BALANCE ; NUME[:BALANCE] = 3
    ENUM[4] = :BEAUTY ; NUME[:BEAUTY] = 4
    ENUM[5] = :BIRTH ; NUME[:BIRTH] = 5
    ENUM[6] = :BLIGHT ; NUME[:BLIGHT] = 6
    ENUM[7] = :BOUNDARIES ; NUME[:BOUNDARIES] = 7
    ENUM[8] = :CAVERNS ; NUME[:CAVERNS] = 8
    ENUM[9] = :CHAOS ; NUME[:CHAOS] = 9
    ENUM[10] = :CHARITY ; NUME[:CHARITY] = 10
    ENUM[11] = :CHILDREN ; NUME[:CHILDREN] = 11
    ENUM[12] = :COASTS ; NUME[:COASTS] = 12
    ENUM[13] = :CONSOLATION ; NUME[:CONSOLATION] = 13
    ENUM[14] = :COURAGE ; NUME[:COURAGE] = 14
    ENUM[15] = :CRAFTS ; NUME[:CRAFTS] = 15
    ENUM[16] = :CREATION ; NUME[:CREATION] = 16
    ENUM[17] = :DANCE ; NUME[:DANCE] = 17
    ENUM[18] = :DARKNESS ; NUME[:DARKNESS] = 18
    ENUM[19] = :DAWN ; NUME[:DAWN] = 19
    ENUM[20] = :DAY ; NUME[:DAY] = 20
    ENUM[21] = :DEATH ; NUME[:DEATH] = 21
    ENUM[22] = :DEFORMITY ; NUME[:DEFORMITY] = 22
    ENUM[23] = :DEPRAVITY ; NUME[:DEPRAVITY] = 23
    ENUM[24] = :DISCIPLINE ; NUME[:DISCIPLINE] = 24
    ENUM[25] = :DISEASE ; NUME[:DISEASE] = 25
    ENUM[26] = :DREAMS ; NUME[:DREAMS] = 26
    ENUM[27] = :DUSK ; NUME[:DUSK] = 27
    ENUM[28] = :DUTY ; NUME[:DUTY] = 28
    ENUM[29] = :EARTH ; NUME[:EARTH] = 29
    ENUM[30] = :FAMILY ; NUME[:FAMILY] = 30
    ENUM[31] = :FAME ; NUME[:FAME] = 31
    ENUM[32] = :FATE ; NUME[:FATE] = 32
    ENUM[33] = :FERTILITY ; NUME[:FERTILITY] = 33
    ENUM[34] = :FESTIVALS ; NUME[:FESTIVALS] = 34
    ENUM[35] = :FIRE ; NUME[:FIRE] = 35
    ENUM[36] = :FISH ; NUME[:FISH] = 36
    ENUM[37] = :FISHING ; NUME[:FISHING] = 37
    ENUM[38] = :FOOD ; NUME[:FOOD] = 38
    ENUM[39] = :FORGIVENESS ; NUME[:FORGIVENESS] = 39
    ENUM[40] = :FORTRESSES ; NUME[:FORTRESSES] = 40
    ENUM[41] = :FREEDOM ; NUME[:FREEDOM] = 41
    ENUM[42] = :GAMBLING ; NUME[:GAMBLING] = 42
    ENUM[43] = :GAMES ; NUME[:GAMES] = 43
    ENUM[44] = :GENEROSITY ; NUME[:GENEROSITY] = 44
    ENUM[45] = :HAPPINESS ; NUME[:HAPPINESS] = 45
    ENUM[46] = :HEALING ; NUME[:HEALING] = 46
    ENUM[47] = :HOSPITALITY ; NUME[:HOSPITALITY] = 47
    ENUM[48] = :HUNTING ; NUME[:HUNTING] = 48
    ENUM[49] = :INSPIRATION ; NUME[:INSPIRATION] = 49
    ENUM[50] = :JEALOUSY ; NUME[:JEALOUSY] = 50
    ENUM[51] = :JEWELS ; NUME[:JEWELS] = 51
    ENUM[52] = :JUSTICE ; NUME[:JUSTICE] = 52
    ENUM[53] = :LABOR ; NUME[:LABOR] = 53
    ENUM[54] = :LAKES ; NUME[:LAKES] = 54
    ENUM[55] = :LAWS ; NUME[:LAWS] = 55
    ENUM[56] = :LIES ; NUME[:LIES] = 56
    ENUM[57] = :LIGHT ; NUME[:LIGHT] = 57
    ENUM[58] = :LIGHTNING ; NUME[:LIGHTNING] = 58
    ENUM[59] = :LONGEVITY ; NUME[:LONGEVITY] = 59
    ENUM[60] = :LOVE ; NUME[:LOVE] = 60
    ENUM[61] = :LOYALTY ; NUME[:LOYALTY] = 61
    ENUM[62] = :LUCK ; NUME[:LUCK] = 62
    ENUM[63] = :LUST ; NUME[:LUST] = 63
    ENUM[64] = :MARRIAGE ; NUME[:MARRIAGE] = 64
    ENUM[65] = :MERCY ; NUME[:MERCY] = 65
    ENUM[66] = :METALS ; NUME[:METALS] = 66
    ENUM[67] = :MINERALS ; NUME[:MINERALS] = 67
    ENUM[68] = :MISERY ; NUME[:MISERY] = 68
    ENUM[69] = :MIST ; NUME[:MIST] = 69
    ENUM[70] = :MOON ; NUME[:MOON] = 70
    ENUM[71] = :MOUNTAINS ; NUME[:MOUNTAINS] = 71
    ENUM[72] = :MUCK ; NUME[:MUCK] = 72
    ENUM[73] = :MURDER ; NUME[:MURDER] = 73
    ENUM[74] = :MUSIC ; NUME[:MUSIC] = 74
    ENUM[75] = :NATURE ; NUME[:NATURE] = 75
    ENUM[76] = :NIGHT ; NUME[:NIGHT] = 76
    ENUM[77] = :NIGHTMARES ; NUME[:NIGHTMARES] = 77
    ENUM[78] = :OATHS ; NUME[:OATHS] = 78
    ENUM[79] = :OCEANS ; NUME[:OCEANS] = 79
    ENUM[80] = :ORDER ; NUME[:ORDER] = 80
    ENUM[81] = :PAINTING ; NUME[:PAINTING] = 81
    ENUM[82] = :PEACE ; NUME[:PEACE] = 82
    ENUM[83] = :PERSUASION ; NUME[:PERSUASION] = 83
    ENUM[84] = :PLANTS ; NUME[:PLANTS] = 84
    ENUM[85] = :POETRY ; NUME[:POETRY] = 85
    ENUM[86] = :PREGNANCY ; NUME[:PREGNANCY] = 86
    ENUM[87] = :RAIN ; NUME[:RAIN] = 87
    ENUM[88] = :RAINBOWS ; NUME[:RAINBOWS] = 88
    ENUM[89] = :REBIRTH ; NUME[:REBIRTH] = 89
    ENUM[90] = :REVELRY ; NUME[:REVELRY] = 90
    ENUM[91] = :REVENGE ; NUME[:REVENGE] = 91
    ENUM[92] = :RIVERS ; NUME[:RIVERS] = 92
    ENUM[93] = :RULERSHIP ; NUME[:RULERSHIP] = 93
    ENUM[94] = :RUMORS ; NUME[:RUMORS] = 94
    ENUM[95] = :SACRIFICE ; NUME[:SACRIFICE] = 95
    ENUM[96] = :SALT ; NUME[:SALT] = 96
    ENUM[97] = :SCHOLARSHIP ; NUME[:SCHOLARSHIP] = 97
    ENUM[98] = :SEASONS ; NUME[:SEASONS] = 98
    ENUM[99] = :SILENCE ; NUME[:SILENCE] = 99
    ENUM[100] = :SKY ; NUME[:SKY] = 100
    ENUM[101] = :SONG ; NUME[:SONG] = 101
    ENUM[102] = :SPEECH ; NUME[:SPEECH] = 102
    ENUM[103] = :STARS ; NUME[:STARS] = 103
    ENUM[104] = :STORMS ; NUME[:STORMS] = 104
    ENUM[105] = :STRENGTH ; NUME[:STRENGTH] = 105
    ENUM[106] = :SUICIDE ; NUME[:SUICIDE] = 106
    ENUM[107] = :SUN ; NUME[:SUN] = 107
    ENUM[108] = :THEFT ; NUME[:THEFT] = 108
    ENUM[109] = :THRALLDOM ; NUME[:THRALLDOM] = 109
    ENUM[110] = :THUNDER ; NUME[:THUNDER] = 110
    ENUM[111] = :TORTURE ; NUME[:TORTURE] = 111
    ENUM[112] = :TRADE ; NUME[:TRADE] = 112
    ENUM[113] = :TRAVELERS ; NUME[:TRAVELERS] = 113
    ENUM[114] = :TREACHERY ; NUME[:TREACHERY] = 114
    ENUM[115] = :TREES ; NUME[:TREES] = 115
    ENUM[116] = :TRICKERY ; NUME[:TRICKERY] = 116
    ENUM[117] = :TRUTH ; NUME[:TRUTH] = 117
    ENUM[118] = :TWILIGHT ; NUME[:TWILIGHT] = 118
    ENUM[119] = :VALOR ; NUME[:VALOR] = 119
    ENUM[120] = :VICTORY ; NUME[:VICTORY] = 120
    ENUM[121] = :VOLCANOS ; NUME[:VOLCANOS] = 121
    ENUM[122] = :WAR ; NUME[:WAR] = 122
    ENUM[123] = :WATER ; NUME[:WATER] = 123
    ENUM[124] = :WEALTH ; NUME[:WEALTH] = 124
    ENUM[125] = :WEATHER ; NUME[:WEATHER] = 125
    ENUM[126] = :WIND ; NUME[:WIND] = 126
    ENUM[127] = :WISDOM ; NUME[:WISDOM] = 127
    ENUM[128] = :WRITING ; NUME[:WRITING] = 128
    ENUM[129] = :YOUTH ; NUME[:YOUTH] = 129
end

class SquadEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Unk0 ; NUME[:Unk0] = 0
    ENUM[1] = :Unk1 ; NUME[:Unk1] = 1
    ENUM[2] = :Unk2 ; NUME[:Unk2] = 2
end

class SquadOrderCannotReason < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NotFollowingOrder ; NUME[:NotFollowingOrder] = 0
    ENUM[1] = :ActivityCancelled ; NUME[:ActivityCancelled] = 1
    ENUM[2] = :NoBarracks ; NUME[:NoBarracks] = 2
    ENUM[3] = :ImproperBarracks ; NUME[:ImproperBarracks] = 3
    ENUM[4] = :NoActivity ; NUME[:NoActivity] = 4
    ENUM[5] = :CannotIndividuallyDrill ; NUME[:CannotIndividuallyDrill] = 5
    ENUM[6] = :DoesNotExist ; NUME[:DoesNotExist] = 6
    ENUM[7] = :NoArcheryTarget ; NUME[:NoArcheryTarget] = 7
    ENUM[8] = :ImproperBuilding ; NUME[:ImproperBuilding] = 8
    ENUM[9] = :UnreachableLocation ; NUME[:UnreachableLocation] = 9
    ENUM[10] = :InvalidLocation ; NUME[:InvalidLocation] = 10
    ENUM[11] = :NoReachableValidTarget ; NUME[:NoReachableValidTarget] = 11
    ENUM[12] = :NoBurrow ; NUME[:NoBurrow] = 12
    ENUM[13] = :NotInSquad ; NUME[:NotInSquad] = 13
    ENUM[14] = :NoPatrolRoute ; NUME[:NoPatrolRoute] = 14
    ENUM[15] = :NoReachablePointOnRoute ; NUME[:NoReachablePointOnRoute] = 15
    ENUM[16] = :InvalidOrder ; NUME[:InvalidOrder] = 16
    ENUM[17] = :NoTemple ; NUME[:NoTemple] = 17
    ENUM[18] = :NoLibrary ; NUME[:NoLibrary] = 18
    ENUM[19] = :NoItem ; NUME[:NoItem] = 19
    ENUM[20] = :CannotLeaveSite ; NUME[:CannotLeaveSite] = 20
end

class SquadOrderType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :MOVE ; NUME[:MOVE] = 0
    ENUM[1] = :KILL_LIST ; NUME[:KILL_LIST] = 1
    ENUM[2] = :DEFEND_BURROWS ; NUME[:DEFEND_BURROWS] = 2
    ENUM[3] = :PATROL_ROUTE ; NUME[:PATROL_ROUTE] = 3
    ENUM[4] = :TRAIN ; NUME[:TRAIN] = 4
    ENUM[5] = :DRIVE_ENTITY_OFF_SITE ; NUME[:DRIVE_ENTITY_OFF_SITE] = 5
    ENUM[6] = :CAUSE_TROUBLE_FOR_ENTITY ; NUME[:CAUSE_TROUBLE_FOR_ENTITY] = 6
    ENUM[7] = :KILL_HF ; NUME[:KILL_HF] = 7
    ENUM[8] = :DRIVE_ARMIES_FROM_SITE ; NUME[:DRIVE_ARMIES_FROM_SITE] = 8
    ENUM[9] = :RETRIEVE_ARTIFACT ; NUME[:RETRIEVE_ARTIFACT] = 9
    ENUM[10] = :RAID_SITE ; NUME[:RAID_SITE] = 10
    ENUM[11] = :RESCUE_HF ; NUME[:RESCUE_HF] = 11
end

class StockpileCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :Remove ; NUME[:Remove] = -1
    ENUM[0] = :Animals ; NUME[:Animals] = 0
    ENUM[1] = :Food ; NUME[:Food] = 1
    ENUM[2] = :Furniture ; NUME[:Furniture] = 2
    ENUM[3] = :Corpses ; NUME[:Corpses] = 3
    ENUM[4] = :Refuse ; NUME[:Refuse] = 4
    ENUM[5] = :Stone ; NUME[:Stone] = 5
    ENUM[6] = :Ore ; NUME[:Ore] = 6
    ENUM[7] = :Ammo ; NUME[:Ammo] = 7
    ENUM[8] = :Coins ; NUME[:Coins] = 8
    ENUM[9] = :Bars ; NUME[:Bars] = 9
    ENUM[10] = :Gems ; NUME[:Gems] = 10
    ENUM[11] = :Goods ; NUME[:Goods] = 11
    ENUM[12] = :Leather ; NUME[:Leather] = 12
    ENUM[13] = :Cloth ; NUME[:Cloth] = 13
    ENUM[14] = :Wood ; NUME[:Wood] = 14
    ENUM[15] = :Weapons ; NUME[:Weapons] = 15
    ENUM[16] = :Armor ; NUME[:Armor] = 16
    ENUM[17] = :Sheets ; NUME[:Sheets] = 17
    ENUM[18] = :Custom ; NUME[:Custom] = 18
end

class StockpileList < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    IsCategory = Hash.new
    ENUM[0] = :Animals ; NUME[:Animals] = 0 ; IsCategory[:Animals] = true
    ENUM[1] = :Food ; NUME[:Food] = 1 ; IsCategory[:Food] = true
    ENUM[2] = :FoodMeat ; NUME[:FoodMeat] = 2
    ENUM[3] = :FoodFish ; NUME[:FoodFish] = 3
    ENUM[4] = :FoodUnpreparedFish ; NUME[:FoodUnpreparedFish] = 4
    ENUM[5] = :FoodEgg ; NUME[:FoodEgg] = 5
    ENUM[6] = :FoodPlants ; NUME[:FoodPlants] = 6
    ENUM[7] = :FoodDrinkPlant ; NUME[:FoodDrinkPlant] = 7
    ENUM[8] = :FoodDrinkAnimal ; NUME[:FoodDrinkAnimal] = 8
    ENUM[9] = :FoodCheesePlant ; NUME[:FoodCheesePlant] = 9
    ENUM[10] = :FoodCheeseAnimal ; NUME[:FoodCheeseAnimal] = 10
    ENUM[11] = :FoodSeeds ; NUME[:FoodSeeds] = 11
    ENUM[12] = :FoodLeaves ; NUME[:FoodLeaves] = 12
    ENUM[13] = :FoodMilledPlant ; NUME[:FoodMilledPlant] = 13
    ENUM[14] = :FoodBoneMeal ; NUME[:FoodBoneMeal] = 14
    ENUM[15] = :FoodFat ; NUME[:FoodFat] = 15
    ENUM[16] = :FoodPaste ; NUME[:FoodPaste] = 16
    ENUM[17] = :FoodPressedMaterial ; NUME[:FoodPressedMaterial] = 17
    ENUM[18] = :FoodExtractPlant ; NUME[:FoodExtractPlant] = 18
    ENUM[19] = :FoodExtractAnimal ; NUME[:FoodExtractAnimal] = 19
    ENUM[20] = :FoodMiscLiquid ; NUME[:FoodMiscLiquid] = 20
    ENUM[21] = :Furniture ; NUME[:Furniture] = 21 ; IsCategory[:Furniture] = true
    ENUM[22] = :FurnitureType ; NUME[:FurnitureType] = 22
    ENUM[23] = :FurnitureStoneClay ; NUME[:FurnitureStoneClay] = 23
    ENUM[24] = :FurnitureMetal ; NUME[:FurnitureMetal] = 24
    ENUM[25] = :FurnitureOtherMaterials ; NUME[:FurnitureOtherMaterials] = 25
    ENUM[26] = :FurnitureCoreQuality ; NUME[:FurnitureCoreQuality] = 26
    ENUM[27] = :FurnitureTotalQuality ; NUME[:FurnitureTotalQuality] = 27
    ENUM[28] = :Corpses ; NUME[:Corpses] = 28 ; IsCategory[:Corpses] = true
    ENUM[29] = :Refuse ; NUME[:Refuse] = 29 ; IsCategory[:Refuse] = true
    ENUM[30] = :RefuseItems ; NUME[:RefuseItems] = 30
    ENUM[31] = :RefuseCorpses ; NUME[:RefuseCorpses] = 31
    ENUM[32] = :RefuseParts ; NUME[:RefuseParts] = 32
    ENUM[33] = :RefuseSkulls ; NUME[:RefuseSkulls] = 33
    ENUM[34] = :RefuseBones ; NUME[:RefuseBones] = 34
    ENUM[35] = :RefuseShells ; NUME[:RefuseShells] = 35
    ENUM[36] = :RefuseTeeth ; NUME[:RefuseTeeth] = 36
    ENUM[37] = :RefuseHorns ; NUME[:RefuseHorns] = 37
    ENUM[38] = :RefuseHair ; NUME[:RefuseHair] = 38
    ENUM[39] = :Stone ; NUME[:Stone] = 39 ; IsCategory[:Stone] = true
    ENUM[40] = :StoneOres ; NUME[:StoneOres] = 40
    ENUM[41] = :StoneEconomic ; NUME[:StoneEconomic] = 41
    ENUM[42] = :StoneOther ; NUME[:StoneOther] = 42
    ENUM[43] = :StoneClay ; NUME[:StoneClay] = 43
    ENUM[44] = :Ammo ; NUME[:Ammo] = 44 ; IsCategory[:Ammo] = true
    ENUM[45] = :AmmoType ; NUME[:AmmoType] = 45
    ENUM[46] = :AmmoMetal ; NUME[:AmmoMetal] = 46
    ENUM[47] = :AmmoOther ; NUME[:AmmoOther] = 47
    ENUM[48] = :AmmoCoreQuality ; NUME[:AmmoCoreQuality] = 48
    ENUM[49] = :AmmoTotalQuality ; NUME[:AmmoTotalQuality] = 49
    ENUM[50] = :Coins ; NUME[:Coins] = 50 ; IsCategory[:Coins] = true
    ENUM[51] = :BarsBlocks ; NUME[:BarsBlocks] = 51 ; IsCategory[:BarsBlocks] = true
    ENUM[52] = :BarsMetal ; NUME[:BarsMetal] = 52
    ENUM[53] = :BarsOther ; NUME[:BarsOther] = 53
    ENUM[54] = :BlocksStone ; NUME[:BlocksStone] = 54
    ENUM[55] = :BlocksMetal ; NUME[:BlocksMetal] = 55
    ENUM[56] = :BlocksOther ; NUME[:BlocksOther] = 56
    ENUM[57] = :Gems ; NUME[:Gems] = 57 ; IsCategory[:Gems] = true
    ENUM[58] = :RoughGem ; NUME[:RoughGem] = 58
    ENUM[59] = :RoughGlass ; NUME[:RoughGlass] = 59
    ENUM[60] = :CutGem ; NUME[:CutGem] = 60
    ENUM[61] = :CutGlass ; NUME[:CutGlass] = 61
    ENUM[62] = :CutStone ; NUME[:CutStone] = 62
    ENUM[63] = :Goods ; NUME[:Goods] = 63 ; IsCategory[:Goods] = true
    ENUM[64] = :GoodsType ; NUME[:GoodsType] = 64
    ENUM[65] = :GoodsStone ; NUME[:GoodsStone] = 65
    ENUM[66] = :GoodsMetal ; NUME[:GoodsMetal] = 66
    ENUM[67] = :GoodsGem ; NUME[:GoodsGem] = 67
    ENUM[68] = :GoodsOther ; NUME[:GoodsOther] = 68
    ENUM[69] = :GoodsCoreQuality ; NUME[:GoodsCoreQuality] = 69
    ENUM[70] = :GoodsTotalQuality ; NUME[:GoodsTotalQuality] = 70
    ENUM[71] = :Leather ; NUME[:Leather] = 71 ; IsCategory[:Leather] = true
    ENUM[72] = :Cloth ; NUME[:Cloth] = 72 ; IsCategory[:Cloth] = true
    ENUM[73] = :ThreadSilk ; NUME[:ThreadSilk] = 73
    ENUM[74] = :ThreadPlant ; NUME[:ThreadPlant] = 74
    ENUM[75] = :ThreadYarn ; NUME[:ThreadYarn] = 75
    ENUM[76] = :ThreadMetal ; NUME[:ThreadMetal] = 76
    ENUM[77] = :ClothSilk ; NUME[:ClothSilk] = 77
    ENUM[78] = :ClothPlant ; NUME[:ClothPlant] = 78
    ENUM[79] = :ClothYarn ; NUME[:ClothYarn] = 79
    ENUM[80] = :ClothMetal ; NUME[:ClothMetal] = 80
    ENUM[81] = :Wood ; NUME[:Wood] = 81 ; IsCategory[:Wood] = true
    ENUM[82] = :Weapons ; NUME[:Weapons] = 82 ; IsCategory[:Weapons] = true
    ENUM[83] = :WeaponsType ; NUME[:WeaponsType] = 83
    ENUM[84] = :WeaponsTrapcomp ; NUME[:WeaponsTrapcomp] = 84
    ENUM[85] = :WeaponsMetal ; NUME[:WeaponsMetal] = 85
    ENUM[86] = :WeaponsStone ; NUME[:WeaponsStone] = 86
    ENUM[87] = :WeaponsOther ; NUME[:WeaponsOther] = 87
    ENUM[88] = :WeaponsCoreQuality ; NUME[:WeaponsCoreQuality] = 88
    ENUM[89] = :WeaponsTotalQuality ; NUME[:WeaponsTotalQuality] = 89
    ENUM[90] = :Armor ; NUME[:Armor] = 90 ; IsCategory[:Armor] = true
    ENUM[91] = :ArmorBody ; NUME[:ArmorBody] = 91
    ENUM[92] = :ArmorHead ; NUME[:ArmorHead] = 92
    ENUM[93] = :ArmorFeet ; NUME[:ArmorFeet] = 93
    ENUM[94] = :ArmorHands ; NUME[:ArmorHands] = 94
    ENUM[95] = :ArmorLegs ; NUME[:ArmorLegs] = 95
    ENUM[96] = :ArmorShield ; NUME[:ArmorShield] = 96
    ENUM[97] = :ArmorMetal ; NUME[:ArmorMetal] = 97
    ENUM[98] = :ArmorOther ; NUME[:ArmorOther] = 98
    ENUM[99] = :ArmorCoreQuality ; NUME[:ArmorCoreQuality] = 99
    ENUM[100] = :ArmorTotalQuality ; NUME[:ArmorTotalQuality] = 100
    ENUM[101] = :Sheet ; NUME[:Sheet] = 101 ; IsCategory[:Sheet] = true
    ENUM[102] = :SheetPaper ; NUME[:SheetPaper] = 102
    ENUM[103] = :SheetParchment ; NUME[:SheetParchment] = 103
    ENUM[104] = :AdditionalOptions ; NUME[:AdditionalOptions] = 104 ; IsCategory[:AdditionalOptions] = true
end

class StrainType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :BENDING ; NUME[:BENDING] = 0
    ENUM[1] = :SHEAR ; NUME[:SHEAR] = 1
    ENUM[2] = :TORSION ; NUME[:TORSION] = 2
    ENUM[3] = :IMPACT ; NUME[:IMPACT] = 3
    ENUM[4] = :TENSILE ; NUME[:TENSILE] = 4
    ENUM[5] = :COMPRESSIVE ; NUME[:COMPRESSIVE] = 5
end

class StratusType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :StratusNone ; NUME[:StratusNone] = 0
    ENUM[1] = :StratusAlto ; NUME[:StratusAlto] = 1
    ENUM[2] = :StratusProper ; NUME[:StratusProper] = 2
    ENUM[3] = :StratusNimbus ; NUME[:StratusNimbus] = 3
end

class TacticalSituation < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :AttackerStronglyFavored ; NUME[:AttackerStronglyFavored] = 0
    ENUM[1] = :AttackerFavored ; NUME[:AttackerFavored] = 1
    ENUM[2] = :AttackerSlightlyFavored ; NUME[:AttackerSlightlyFavored] = 2
    ENUM[3] = :DefenderStronglyFavored ; NUME[:DefenderStronglyFavored] = 3
    ENUM[4] = :DefenderFavored ; NUME[:DefenderFavored] = 4
    ENUM[5] = :DefenderSlightlyFavored ; NUME[:DefenderSlightlyFavored] = 5
    ENUM[6] = :NeitherFavored ; NUME[:NeitherFavored] = 6
end

class TalkChoiceType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Greet ; NUME[:Greet] = 0
    ENUM[1] = :Nevermind ; NUME[:Nevermind] = 1
    ENUM[2] = :Trade ; NUME[:Trade] = 2
    ENUM[3] = :AskJoin ; NUME[:AskJoin] = 3
    ENUM[4] = :AskSurroundings ; NUME[:AskSurroundings] = 4
    ENUM[5] = :SayGoodbye ; NUME[:SayGoodbye] = 5
    ENUM[6] = :AskStructure ; NUME[:AskStructure] = 6
    ENUM[7] = :AskFamily ; NUME[:AskFamily] = 7
    ENUM[8] = :AskProfession ; NUME[:AskProfession] = 8
    ENUM[9] = :AskPermissionSleep ; NUME[:AskPermissionSleep] = 9
    ENUM[10] = :AccuseNightCreature ; NUME[:AccuseNightCreature] = 10
    ENUM[11] = :AskTroubles ; NUME[:AskTroubles] = 11
    ENUM[12] = :BringUpEvent ; NUME[:BringUpEvent] = 12
    ENUM[13] = :SpreadRumor ; NUME[:SpreadRumor] = 13
    ENUM[14] = :ReplyGreeting ; NUME[:ReplyGreeting] = 14
    ENUM[15] = :RefuseConversation ; NUME[:RefuseConversation] = 15
    ENUM[16] = :ReplyImpersonate ; NUME[:ReplyImpersonate] = 16
    ENUM[17] = :BringUpIncident ; NUME[:BringUpIncident] = 17
    ENUM[18] = :TellNothingChanged ; NUME[:TellNothingChanged] = 18
    ENUM[19] = :Goodbye2 ; NUME[:Goodbye2] = 19
    ENUM[20] = :ReturnTopic ; NUME[:ReturnTopic] = 20
    ENUM[21] = :ChangeSubject ; NUME[:ChangeSubject] = 21
    ENUM[22] = :AskTargetAction ; NUME[:AskTargetAction] = 22
    ENUM[23] = :RequestSuggestAction ; NUME[:RequestSuggestAction] = 23
    ENUM[24] = :AskJoinInsurrection ; NUME[:AskJoinInsurrection] = 24
    ENUM[25] = :AskJoinRescue ; NUME[:AskJoinRescue] = 25
    ENUM[26] = :StateOpinion ; NUME[:StateOpinion] = 26
    ENUM[27] = :RespondJoinInsurrection ; NUME[:RespondJoinInsurrection] = 27
    ENUM[29] = :AllowPermissionSleep ; NUME[:AllowPermissionSleep] = 29
    ENUM[30] = :DenyPermissionSleep ; NUME[:DenyPermissionSleep] = 30
    ENUM[32] = :AskJoinAdventure ; NUME[:AskJoinAdventure] = 32
    ENUM[33] = :AskGuideLocation ; NUME[:AskGuideLocation] = 33
    ENUM[34] = :RespondJoin ; NUME[:RespondJoin] = 34
    ENUM[35] = :RespondJoin2 ; NUME[:RespondJoin2] = 35
    ENUM[36] = :OfferCondolences ; NUME[:OfferCondolences] = 36
    ENUM[37] = :StateNotAcquainted ; NUME[:StateNotAcquainted] = 37
    ENUM[38] = :SuggestTravel ; NUME[:SuggestTravel] = 38
    ENUM[39] = :SuggestTalk ; NUME[:SuggestTalk] = 39
    ENUM[40] = :RequestSelfRescue ; NUME[:RequestSelfRescue] = 40
    ENUM[41] = :AskWhatHappened ; NUME[:AskWhatHappened] = 41
    ENUM[42] = :AskBeRescued ; NUME[:AskBeRescued] = 42
    ENUM[43] = :SayNotRemember ; NUME[:SayNotRemember] = 43
    ENUM[45] = :SayNoFamily ; NUME[:SayNoFamily] = 45
    ENUM[46] = :StateUnitLocation ; NUME[:StateUnitLocation] = 46
    ENUM[47] = :ReferToElder ; NUME[:ReferToElder] = 47
    ENUM[48] = :AskComeCloser ; NUME[:AskComeCloser] = 48
    ENUM[49] = :DoBusiness ; NUME[:DoBusiness] = 49
    ENUM[50] = :AskComeStoreLater ; NUME[:AskComeStoreLater] = 50
    ENUM[51] = :AskComeMarketLater ; NUME[:AskComeMarketLater] = 51
    ENUM[52] = :TellTryShopkeeper ; NUME[:TellTryShopkeeper] = 52
    ENUM[53] = :DescribeSurroundings ; NUME[:DescribeSurroundings] = 53
    ENUM[54] = :AskWaitUntilHome ; NUME[:AskWaitUntilHome] = 54
    ENUM[55] = :DescribeFamily ; NUME[:DescribeFamily] = 55
    ENUM[56] = :StateAge ; NUME[:StateAge] = 56
    ENUM[57] = :DescribeProfession ; NUME[:DescribeProfession] = 57
    ENUM[58] = :AnnounceNightCreature ; NUME[:AnnounceNightCreature] = 58
    ENUM[59] = :StateIncredulity ; NUME[:StateIncredulity] = 59
    ENUM[60] = :BypassGreeting ; NUME[:BypassGreeting] = 60
    ENUM[61] = :AskCeaseHostilities ; NUME[:AskCeaseHostilities] = 61
    ENUM[62] = :DemandYield ; NUME[:DemandYield] = 62
    ENUM[63] = :HawkWares ; NUME[:HawkWares] = 63
    ENUM[64] = :YieldTerror ; NUME[:YieldTerror] = 64
    ENUM[65] = :Yield ; NUME[:Yield] = 65
    ENUM[66] = :ExpressOverwhelmingEmotion ; NUME[:ExpressOverwhelmingEmotion] = 66
    ENUM[67] = :ExpressGreatEmotion ; NUME[:ExpressGreatEmotion] = 67
    ENUM[68] = :ExpressEmotion ; NUME[:ExpressEmotion] = 68
    ENUM[69] = :ExpressMinorEmotion ; NUME[:ExpressMinorEmotion] = 69
    ENUM[70] = :ExpressLackEmotion ; NUME[:ExpressLackEmotion] = 70
    ENUM[71] = :OutburstFleeConflict ; NUME[:OutburstFleeConflict] = 71
    ENUM[72] = :StateFleeConflict ; NUME[:StateFleeConflict] = 72
    ENUM[73] = :MentionJourney ; NUME[:MentionJourney] = 73
    ENUM[74] = :SummarizeTroubles ; NUME[:SummarizeTroubles] = 74
    ENUM[75] = :AskAboutIncident ; NUME[:AskAboutIncident] = 75
    ENUM[76] = :AskDirectionsPerson ; NUME[:AskDirectionsPerson] = 76
    ENUM[77] = :AskDirectionsPlace ; NUME[:AskDirectionsPlace] = 77
    ENUM[78] = :AskWhereabouts ; NUME[:AskWhereabouts] = 78
    ENUM[79] = :RequestGuide ; NUME[:RequestGuide] = 79
    ENUM[80] = :RequestGuide2 ; NUME[:RequestGuide2] = 80
    ENUM[81] = :ProvideDirections ; NUME[:ProvideDirections] = 81
    ENUM[82] = :ProvideWhereabouts ; NUME[:ProvideWhereabouts] = 82
    ENUM[83] = :TellTargetSelf ; NUME[:TellTargetSelf] = 83
    ENUM[84] = :TellTargetDead ; NUME[:TellTargetDead] = 84
    ENUM[85] = :RecommendGuide ; NUME[:RecommendGuide] = 85
    ENUM[86] = :ProfessIgnorance ; NUME[:ProfessIgnorance] = 86
    ENUM[87] = :TellAboutPlace ; NUME[:TellAboutPlace] = 87
    ENUM[88] = :AskFavorMenu ; NUME[:AskFavorMenu] = 88
    ENUM[89] = :AskWait ; NUME[:AskWait] = 89
    ENUM[90] = :AskFollow ; NUME[:AskFollow] = 90
    ENUM[91] = :ApologizeBusy ; NUME[:ApologizeBusy] = 91
    ENUM[92] = :ComplyOrder ; NUME[:ComplyOrder] = 92
    ENUM[93] = :AgreeFollow ; NUME[:AgreeFollow] = 93
    ENUM[94] = :ExchangeItems ; NUME[:ExchangeItems] = 94
    ENUM[95] = :AskComeCloser2 ; NUME[:AskComeCloser2] = 95
    ENUM[96] = :InitiateBarter ; NUME[:InitiateBarter] = 96
    ENUM[97] = :AgreeCeaseHostile ; NUME[:AgreeCeaseHostile] = 97
    ENUM[98] = :RefuseCeaseHostile ; NUME[:RefuseCeaseHostile] = 98
    ENUM[99] = :RefuseCeaseHostile2 ; NUME[:RefuseCeaseHostile2] = 99
    ENUM[100] = :RefuseYield ; NUME[:RefuseYield] = 100
    ENUM[101] = :RefuseYield2 ; NUME[:RefuseYield2] = 101
    ENUM[102] = :Brag ; NUME[:Brag] = 102
    ENUM[103] = :DescribeRelation ; NUME[:DescribeRelation] = 103
    ENUM[104] = :ClaimSite ; NUME[:ClaimSite] = 104
    ENUM[105] = :AnnounceLairHunt ; NUME[:AnnounceLairHunt] = 105
    ENUM[106] = :RequestDuty ; NUME[:RequestDuty] = 106
    ENUM[107] = :AskJoinService ; NUME[:AskJoinService] = 107
    ENUM[108] = :AcceptService ; NUME[:AcceptService] = 108
    ENUM[109] = :TellRemainVigilant ; NUME[:TellRemainVigilant] = 109
    ENUM[110] = :GiveServiceOrder ; NUME[:GiveServiceOrder] = 110
    ENUM[111] = :WelcomeSelfHome ; NUME[:WelcomeSelfHome] = 111
    ENUM[113] = :AskTravelReason ; NUME[:AskTravelReason] = 113
    ENUM[114] = :TellTravelReason ; NUME[:TellTravelReason] = 114
    ENUM[115] = :AskLocalRuler ; NUME[:AskLocalRuler] = 115
    ENUM[116] = :ComplainAgreement ; NUME[:ComplainAgreement] = 116
    ENUM[117] = :CancelAgreement ; NUME[:CancelAgreement] = 117
    ENUM[118] = :SummarizeConflict ; NUME[:SummarizeConflict] = 118
    ENUM[119] = :SummarizeViews ; NUME[:SummarizeViews] = 119
    ENUM[120] = :AskClaimStrength ; NUME[:AskClaimStrength] = 120
    ENUM[121] = :AskArmyPosition ; NUME[:AskArmyPosition] = 121
    ENUM[122] = :AskOtherClaims ; NUME[:AskOtherClaims] = 122
    ENUM[123] = :AskDeserters ; NUME[:AskDeserters] = 123
    ENUM[124] = :AskSiteNeighbors ; NUME[:AskSiteNeighbors] = 124
    ENUM[125] = :DescribeSiteNeighbors ; NUME[:DescribeSiteNeighbors] = 125
    ENUM[126] = :RaiseAlarm ; NUME[:RaiseAlarm] = 126
    ENUM[127] = :DemandDropWeapon ; NUME[:DemandDropWeapon] = 127
    ENUM[128] = :AgreeComplyDemand ; NUME[:AgreeComplyDemand] = 128
    ENUM[129] = :RefuseComplyDemand ; NUME[:RefuseComplyDemand] = 129
    ENUM[130] = :AskLocationObject ; NUME[:AskLocationObject] = 130
    ENUM[131] = :DemandTribute ; NUME[:DemandTribute] = 131
    ENUM[132] = :AgreeGiveTribute ; NUME[:AgreeGiveTribute] = 132
    ENUM[133] = :RefuseGiveTribute ; NUME[:RefuseGiveTribute] = 133
    ENUM[134] = :OfferGiveTribute ; NUME[:OfferGiveTribute] = 134
    ENUM[135] = :AgreeAcceptTribute ; NUME[:AgreeAcceptTribute] = 135
    ENUM[136] = :RefuseAcceptTribute ; NUME[:RefuseAcceptTribute] = 136
    ENUM[137] = :CancelTribute ; NUME[:CancelTribute] = 137
    ENUM[138] = :OfferPeace ; NUME[:OfferPeace] = 138
    ENUM[139] = :AgreePeace ; NUME[:AgreePeace] = 139
    ENUM[140] = :RefusePeace ; NUME[:RefusePeace] = 140
    ENUM[141] = :AskTradeDepotLater ; NUME[:AskTradeDepotLater] = 141
    ENUM[142] = :ExpressAstonishment ; NUME[:ExpressAstonishment] = 142
    ENUM[143] = :CommentWeather ; NUME[:CommentWeather] = 143
    ENUM[144] = :CommentNature ; NUME[:CommentNature] = 144
    ENUM[145] = :SummarizeTerritory ; NUME[:SummarizeTerritory] = 145
    ENUM[146] = :SummarizePatrols ; NUME[:SummarizePatrols] = 146
    ENUM[147] = :SummarizeOpposition ; NUME[:SummarizeOpposition] = 147
    ENUM[148] = :DescribeRefugees ; NUME[:DescribeRefugees] = 148
    ENUM[149] = :AccuseTroublemaker ; NUME[:AccuseTroublemaker] = 149
    ENUM[150] = :AskAdopt ; NUME[:AskAdopt] = 150
    ENUM[151] = :AgreeAdopt ; NUME[:AgreeAdopt] = 151
    ENUM[152] = :RefuseAdopt ; NUME[:RefuseAdopt] = 152
    ENUM[153] = :RevokeService ; NUME[:RevokeService] = 153
    ENUM[154] = :InviteService ; NUME[:InviteService] = 154
    ENUM[155] = :AcceptInviteService ; NUME[:AcceptInviteService] = 155
    ENUM[156] = :RefuseShareInformation ; NUME[:RefuseShareInformation] = 156
    ENUM[157] = :RefuseInviteService ; NUME[:RefuseInviteService] = 157
    ENUM[158] = :RefuseRequestService ; NUME[:RefuseRequestService] = 158
    ENUM[159] = :OfferService ; NUME[:OfferService] = 159
    ENUM[160] = :AcceptPositionService ; NUME[:AcceptPositionService] = 160
    ENUM[161] = :RefusePositionService ; NUME[:RefusePositionService] = 161
    ENUM[162] = :InvokeNameBanish ; NUME[:InvokeNameBanish] = 162
    ENUM[163] = :InvokeNameService ; NUME[:InvokeNameService] = 163
    ENUM[164] = :GrovelMaster ; NUME[:GrovelMaster] = 164
    ENUM[165] = :DemandItem ; NUME[:DemandItem] = 165
    ENUM[166] = :GiveServiceReport ; NUME[:GiveServiceReport] = 166
    ENUM[167] = :OfferEncouragement ; NUME[:OfferEncouragement] = 167
    ENUM[168] = :PraiseTaskCompleter ; NUME[:PraiseTaskCompleter] = 168
    ENUM[169] = :AskAboutPersonMenu ; NUME[:AskAboutPersonMenu] = 169
    ENUM[170] = :AskAboutPerson ; NUME[:AskAboutPerson] = 170
    ENUM[171] = :TellAboutPerson ; NUME[:TellAboutPerson] = 171
    ENUM[172] = :AskFeelings ; NUME[:AskFeelings] = 172
    ENUM[173] = :TellThoughts ; NUME[:TellThoughts] = 173
    ENUM[174] = :AskServices ; NUME[:AskServices] = 174
    ENUM[175] = :TellServices ; NUME[:TellServices] = 175
    ENUM[176] = :OrderDrink ; NUME[:OrderDrink] = 176
    ENUM[177] = :RentRoom ; NUME[:RentRoom] = 177
    ENUM[178] = :ExtendRoomRental ; NUME[:ExtendRoomRental] = 178
    ENUM[179] = :ConfirmServiceOrder ; NUME[:ConfirmServiceOrder] = 179
    ENUM[180] = :AskJoinEntertain ; NUME[:AskJoinEntertain] = 180
    ENUM[181] = :RespondJoinEntertain ; NUME[:RespondJoinEntertain] = 181
    ENUM[182] = :AskJoinTroupe ; NUME[:AskJoinTroupe] = 182
    ENUM[184] = :RefuseTroupeApplication ; NUME[:RefuseTroupeApplication] = 184
    ENUM[185] = :InviteJoinTroupe ; NUME[:InviteJoinTroupe] = 185
    ENUM[186] = :AcceptTroupeInvitation ; NUME[:AcceptTroupeInvitation] = 186
    ENUM[187] = :RefuseTroupeInvitation ; NUME[:RefuseTroupeInvitation] = 187
    ENUM[188] = :KickOutOfTroupe ; NUME[:KickOutOfTroupe] = 188
    ENUM[189] = :CreateTroupe ; NUME[:CreateTroupe] = 189
    ENUM[190] = :LeaveTroupe ; NUME[:LeaveTroupe] = 190
    ENUM[191] = :YellServiceOrder ; NUME[:YellServiceOrder] = 191
    ENUM[192] = :TellBePatientForService ; NUME[:TellBePatientForService] = 192
    ENUM[193] = :TellNoServices ; NUME[:TellNoServices] = 193
    ENUM[194] = :AskWaitUntilThere ; NUME[:AskWaitUntilThere] = 194
    ENUM[195] = :DenyWorkingHere ; NUME[:DenyWorkingHere] = 195
    ENUM[196] = :ExpressEmotionMenu ; NUME[:ExpressEmotionMenu] = 196
    ENUM[197] = :StateValueMenu ; NUME[:StateValueMenu] = 197
    ENUM[198] = :StateValue ; NUME[:StateValue] = 198
    ENUM[199] = :SayNoOrderYet ; NUME[:SayNoOrderYet] = 199
    ENUM[200] = :ProvideDirectionsBuilding ; NUME[:ProvideDirectionsBuilding] = 200
    ENUM[201] = :Argue ; NUME[:Argue] = 201
    ENUM[202] = :Flatter ; NUME[:Flatter] = 202
    ENUM[203] = :DismissArgument ; NUME[:DismissArgument] = 203
    ENUM[204] = :RespondPassively ; NUME[:RespondPassively] = 204
    ENUM[205] = :Acquiesce ; NUME[:Acquiesce] = 205
    ENUM[206] = :DerideFlattery ; NUME[:DerideFlattery] = 206
    ENUM[207] = :ExpressOutrageAtDismissal ; NUME[:ExpressOutrageAtDismissal] = 207
    ENUM[208] = :PressArgument ; NUME[:PressArgument] = 208
    ENUM[209] = :DropArgument ; NUME[:DropArgument] = 209
    ENUM[210] = :AskWork ; NUME[:AskWork] = 210
    ENUM[211] = :AskWorkGroup ; NUME[:AskWorkGroup] = 211
    ENUM[212] = :GrantWork ; NUME[:GrantWork] = 212
    ENUM[213] = :RefuseWork ; NUME[:RefuseWork] = 213
    ENUM[214] = :GrantWorkGroup ; NUME[:GrantWorkGroup] = 214
    ENUM[215] = :RefuseWorkGroup ; NUME[:RefuseWorkGroup] = 215
    ENUM[216] = :GiveSquadOrder ; NUME[:GiveSquadOrder] = 216
    ENUM[217] = :Artifact ; NUME[:Artifact] = 217
    ENUM[218] = :PraiseReturn ; NUME[:PraiseReturn] = 218
    ENUM[219] = :ProvideLocation ; NUME[:ProvideLocation] = 219
    ENUM[220] = :Prophesize ; NUME[:Prophesize] = 220
    ENUM[221] = :TalkAboutAncestor ; NUME[:TalkAboutAncestor] = 221
    ENUM[222] = :SuggestTrade ; NUME[:SuggestTrade] = 222
    ENUM[223] = :AcceptNotTrade ; NUME[:AcceptNotTrade] = 223
    ENUM[224] = :DemandIdentity ; NUME[:DemandIdentity] = 224
end

class TempleDeityType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Deity ; NUME[:Deity] = 0
    ENUM[1] = :Religion ; NUME[:Religion] = 1
end

class TheftMethodType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Theft ; NUME[:Theft] = 0
    ENUM[1] = :Confiscated ; NUME[:Confiscated] = 1
    ENUM[2] = :Looted ; NUME[:Looted] = 2
    ENUM[3] = :Recovered ; NUME[:Recovered] = 3
end

class TileBuildingOcc < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :None ; NUME[:None] = 0
    ENUM[1] = :Planned ; NUME[:Planned] = 1
    ENUM[2] = :Passable ; NUME[:Passable] = 2
    ENUM[3] = :Obstacle ; NUME[:Obstacle] = 3
    ENUM[4] = :Well ; NUME[:Well] = 4
    ENUM[5] = :Floored ; NUME[:Floored] = 5
    ENUM[6] = :Impassable ; NUME[:Impassable] = 6
    ENUM[7] = :Dynamic ; NUME[:Dynamic] = 7
end

class TileDigDesignation < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :No ; NUME[:No] = 0
    ENUM[1] = :Default ; NUME[:Default] = 1
    ENUM[2] = :UpDownStair ; NUME[:UpDownStair] = 2
    ENUM[3] = :Channel ; NUME[:Channel] = 3
    ENUM[4] = :Ramp ; NUME[:Ramp] = 4
    ENUM[5] = :DownStair ; NUME[:DownStair] = 5
    ENUM[6] = :UpStair ; NUME[:UpStair] = 6
end

class TileLiquid < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Water ; NUME[:Water] = 0
    ENUM[1] = :Magma ; NUME[:Magma] = 1
end

class TileLiquidFlowDir < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :None ; NUME[:None] = 0
    ENUM[1] = :South ; NUME[:South] = 1
    ENUM[2] = :East ; NUME[:East] = 2
    ENUM[3] = :Northeast ; NUME[:Northeast] = 3
    ENUM[4] = :West ; NUME[:West] = 4
    ENUM[5] = :Northwest ; NUME[:Northwest] = 5
    ENUM[6] = :Southeast ; NUME[:Southeast] = 6
    ENUM[7] = :Southwest ; NUME[:Southwest] = 7
    ENUM[8] = :Inv8 ; NUME[:Inv8] = 8
    ENUM[9] = :Inv9 ; NUME[:Inv9] = 9
    ENUM[10] = :North ; NUME[:North] = 10
    ENUM[11] = :InvB ; NUME[:InvB] = 11
    ENUM[12] = :InvC ; NUME[:InvC] = 12
    ENUM[13] = :InvD ; NUME[:InvD] = 13
    ENUM[14] = :InvE ; NUME[:InvE] = 14
    ENUM[15] = :InvF ; NUME[:InvF] = 15
end

class TileTraffic < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Normal ; NUME[:Normal] = 0
    ENUM[1] = :Low ; NUME[:Low] = 1
    ENUM[2] = :High ; NUME[:High] = 2
    ENUM[3] = :Restricted ; NUME[:Restricted] = 3
end

class Tiletype < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    Shape = Hash.new(:NONE)
    Material = Hash.new(:NONE)
    Variant = Hash.new(:NONE)
    Special = Hash.new(:NONE)
    Direction = Hash.new('--------')
    ENUM[0] = :Void ; NUME[:Void] = 0 ; Caption[:Void] = 'void'
    ENUM[1] = :RampTop ; NUME[:RampTop] = 1 ; Caption[:RampTop] = 'ramp top' ; Shape[:RampTop] = :RAMP_TOP ; Material[:RampTop] = :AIR
    ENUM[2] = :MurkyPool ; NUME[:MurkyPool] = 2 ; Caption[:MurkyPool] = 'murky pool' ; Shape[:MurkyPool] = :FLOOR ; Material[:MurkyPool] = :POOL
    ENUM[3] = :MurkyPoolRamp ; NUME[:MurkyPoolRamp] = 3 ; Caption[:MurkyPoolRamp] = 'murky pool slope' ; Shape[:MurkyPoolRamp] = :RAMP ; Material[:MurkyPoolRamp] = :POOL
    ENUM[4] = :UnderworldGateStairU ; NUME[:UnderworldGateStairU] = 4 ; Caption[:UnderworldGateStairU] = 'underworld gate up' ; Shape[:UnderworldGateStairU] = :STAIR_UP ; Material[:UnderworldGateStairU] = :UNDERWORLD_GATE
    ENUM[5] = :UnderworldGateStairD ; NUME[:UnderworldGateStairD] = 5 ; Caption[:UnderworldGateStairD] = 'underworld gate down' ; Shape[:UnderworldGateStairD] = :STAIR_DOWN ; Material[:UnderworldGateStairD] = :UNDERWORLD_GATE
    ENUM[6] = :UnderworldGateStairUD ; NUME[:UnderworldGateStairUD] = 6 ; Caption[:UnderworldGateStairUD] = 'underworld gate up/down' ; Shape[:UnderworldGateStairUD] = :STAIR_UPDOWN ; Material[:UnderworldGateStairUD] = :UNDERWORLD_GATE
    ENUM[19] = :Driftwood ; NUME[:Driftwood] = 19 ; Caption[:Driftwood] = 'driftwood' ; Shape[:Driftwood] = :FLOOR ; Material[:Driftwood] = :DRIFTWOOD
    ENUM[25] = :FrozenStairUD ; NUME[:FrozenStairUD] = 25 ; Caption[:FrozenStairUD] = 'ice stair up/down' ; Shape[:FrozenStairUD] = :STAIR_UPDOWN ; Material[:FrozenStairUD] = :FROZEN_LIQUID
    ENUM[26] = :FrozenStairD ; NUME[:FrozenStairD] = 26 ; Caption[:FrozenStairD] = 'ice stair down' ; Shape[:FrozenStairD] = :STAIR_DOWN ; Material[:FrozenStairD] = :FROZEN_LIQUID
    ENUM[27] = :FrozenStairU ; NUME[:FrozenStairU] = 27 ; Caption[:FrozenStairU] = 'ice stair up' ; Shape[:FrozenStairU] = :STAIR_UP ; Material[:FrozenStairU] = :FROZEN_LIQUID
    ENUM[32] = :OpenSpace ; NUME[:OpenSpace] = 32 ; Caption[:OpenSpace] = 'open space' ; Shape[:OpenSpace] = :EMPTY ; Material[:OpenSpace] = :AIR
    ENUM[34] = :Shrub ; NUME[:Shrub] = 34 ; Caption[:Shrub] = 'shrub' ; Shape[:Shrub] = :SHRUB ; Material[:Shrub] = :PLANT ; Special[:Shrub] = :NORMAL
    ENUM[35] = :Chasm ; NUME[:Chasm] = 35 ; Caption[:Chasm] = 'chasm' ; Shape[:Chasm] = :ENDLESS_PIT ; Material[:Chasm] = :AIR
    ENUM[36] = :LavaStairUD ; NUME[:LavaStairUD] = 36 ; Caption[:LavaStairUD] = 'obsidian stair up/down' ; Shape[:LavaStairUD] = :STAIR_UPDOWN ; Material[:LavaStairUD] = :LAVA_STONE
    ENUM[37] = :LavaStairD ; NUME[:LavaStairD] = 37 ; Caption[:LavaStairD] = 'obsidian stair down' ; Shape[:LavaStairD] = :STAIR_DOWN ; Material[:LavaStairD] = :LAVA_STONE
    ENUM[38] = :LavaStairU ; NUME[:LavaStairU] = 38 ; Caption[:LavaStairU] = 'obsidian stair up' ; Shape[:LavaStairU] = :STAIR_UP ; Material[:LavaStairU] = :LAVA_STONE
    ENUM[39] = :SoilStairUD ; NUME[:SoilStairUD] = 39 ; Caption[:SoilStairUD] = 'soil stair up/down' ; Shape[:SoilStairUD] = :STAIR_UPDOWN ; Material[:SoilStairUD] = :SOIL
    ENUM[40] = :SoilStairD ; NUME[:SoilStairD] = 40 ; Caption[:SoilStairD] = 'soil stair down' ; Shape[:SoilStairD] = :STAIR_DOWN ; Material[:SoilStairD] = :SOIL
    ENUM[41] = :SoilStairU ; NUME[:SoilStairU] = 41 ; Caption[:SoilStairU] = 'soil stair up' ; Shape[:SoilStairU] = :STAIR_UP ; Material[:SoilStairU] = :SOIL
    ENUM[42] = :EeriePit ; NUME[:EeriePit] = 42 ; Caption[:EeriePit] = 'eerie pit' ; Shape[:EeriePit] = :ENDLESS_PIT ; Material[:EeriePit] = :HFS
    ENUM[43] = :StoneFloorSmooth ; NUME[:StoneFloorSmooth] = 43 ; Caption[:StoneFloorSmooth] = 'smooth stone floor' ; Shape[:StoneFloorSmooth] = :FLOOR ; Material[:StoneFloorSmooth] = :STONE ; Special[:StoneFloorSmooth] = :SMOOTH
    ENUM[44] = :LavaFloorSmooth ; NUME[:LavaFloorSmooth] = 44 ; Caption[:LavaFloorSmooth] = 'smooth obsidian floor' ; Shape[:LavaFloorSmooth] = :FLOOR ; Material[:LavaFloorSmooth] = :LAVA_STONE ; Special[:LavaFloorSmooth] = :SMOOTH
    ENUM[45] = :FeatureFloorSmooth ; NUME[:FeatureFloorSmooth] = 45 ; Caption[:FeatureFloorSmooth] = 'smooth featstone floor' ; Shape[:FeatureFloorSmooth] = :FLOOR ; Material[:FeatureFloorSmooth] = :FEATURE ; Special[:FeatureFloorSmooth] = :SMOOTH
    ENUM[46] = :MineralFloorSmooth ; NUME[:MineralFloorSmooth] = 46 ; Caption[:MineralFloorSmooth] = 'smooth vein floor' ; Shape[:MineralFloorSmooth] = :FLOOR ; Material[:MineralFloorSmooth] = :MINERAL ; Special[:MineralFloorSmooth] = :SMOOTH
    ENUM[47] = :FrozenFloorSmooth ; NUME[:FrozenFloorSmooth] = 47 ; Caption[:FrozenFloorSmooth] = 'smooth ice floor' ; Shape[:FrozenFloorSmooth] = :FLOOR ; Material[:FrozenFloorSmooth] = :FROZEN_LIQUID ; Special[:FrozenFloorSmooth] = :SMOOTH
    ENUM[49] = :Grass1StairUD ; NUME[:Grass1StairUD] = 49 ; Caption[:Grass1StairUD] = 'light grass stair up/down' ; Shape[:Grass1StairUD] = :STAIR_UPDOWN ; Material[:Grass1StairUD] = :GRASS_LIGHT
    ENUM[50] = :Grass1StairD ; NUME[:Grass1StairD] = 50 ; Caption[:Grass1StairD] = 'light grass stair down' ; Shape[:Grass1StairD] = :STAIR_DOWN ; Material[:Grass1StairD] = :GRASS_LIGHT
    ENUM[51] = :Grass1StairU ; NUME[:Grass1StairU] = 51 ; Caption[:Grass1StairU] = 'light grass stair up' ; Shape[:Grass1StairU] = :STAIR_UP ; Material[:Grass1StairU] = :GRASS_LIGHT
    ENUM[52] = :Grass2StairUD ; NUME[:Grass2StairUD] = 52 ; Caption[:Grass2StairUD] = 'dark grass stair up/down' ; Shape[:Grass2StairUD] = :STAIR_UPDOWN ; Material[:Grass2StairUD] = :GRASS_DARK
    ENUM[53] = :Grass2StairD ; NUME[:Grass2StairD] = 53 ; Caption[:Grass2StairD] = 'dark grass stair down' ; Shape[:Grass2StairD] = :STAIR_DOWN ; Material[:Grass2StairD] = :GRASS_DARK
    ENUM[54] = :Grass2StairU ; NUME[:Grass2StairU] = 54 ; Caption[:Grass2StairU] = 'dark grass stair up' ; Shape[:Grass2StairU] = :STAIR_UP ; Material[:Grass2StairU] = :GRASS_DARK
    ENUM[55] = :StoneStairUD ; NUME[:StoneStairUD] = 55 ; Caption[:StoneStairUD] = 'stone stair up/down' ; Shape[:StoneStairUD] = :STAIR_UPDOWN ; Material[:StoneStairUD] = :STONE
    ENUM[56] = :StoneStairD ; NUME[:StoneStairD] = 56 ; Caption[:StoneStairD] = 'stone stair down' ; Shape[:StoneStairD] = :STAIR_DOWN ; Material[:StoneStairD] = :STONE
    ENUM[57] = :StoneStairU ; NUME[:StoneStairU] = 57 ; Caption[:StoneStairU] = 'stone stair up' ; Shape[:StoneStairU] = :STAIR_UP ; Material[:StoneStairU] = :STONE
    ENUM[58] = :MineralStairUD ; NUME[:MineralStairUD] = 58 ; Caption[:MineralStairUD] = 'vein stair up/down' ; Shape[:MineralStairUD] = :STAIR_UPDOWN ; Material[:MineralStairUD] = :MINERAL
    ENUM[59] = :MineralStairD ; NUME[:MineralStairD] = 59 ; Caption[:MineralStairD] = 'vein stair down' ; Shape[:MineralStairD] = :STAIR_DOWN ; Material[:MineralStairD] = :MINERAL
    ENUM[60] = :MineralStairU ; NUME[:MineralStairU] = 60 ; Caption[:MineralStairU] = 'vein stair up' ; Shape[:MineralStairU] = :STAIR_UP ; Material[:MineralStairU] = :MINERAL
    ENUM[61] = :FeatureStairUD ; NUME[:FeatureStairUD] = 61 ; Caption[:FeatureStairUD] = 'featstone stair up/down' ; Shape[:FeatureStairUD] = :STAIR_UPDOWN ; Material[:FeatureStairUD] = :FEATURE
    ENUM[62] = :FeatureStairD ; NUME[:FeatureStairD] = 62 ; Caption[:FeatureStairD] = 'featstone stair down' ; Shape[:FeatureStairD] = :STAIR_DOWN ; Material[:FeatureStairD] = :FEATURE
    ENUM[63] = :FeatureStairU ; NUME[:FeatureStairU] = 63 ; Caption[:FeatureStairU] = 'featstone stair up' ; Shape[:FeatureStairU] = :STAIR_UP ; Material[:FeatureStairU] = :FEATURE
    ENUM[65] = :StoneFortification ; NUME[:StoneFortification] = 65 ; Caption[:StoneFortification] = 'stone fortification' ; Shape[:StoneFortification] = :FORTIFICATION ; Material[:StoneFortification] = :STONE
    ENUM[67] = :Campfire ; NUME[:Campfire] = 67 ; Caption[:Campfire] = 'campfire' ; Shape[:Campfire] = :FLOOR ; Material[:Campfire] = :CAMPFIRE
    ENUM[70] = :Fire ; NUME[:Fire] = 70 ; Caption[:Fire] = 'fire' ; Shape[:Fire] = :FLOOR ; Material[:Fire] = :FIRE
    ENUM[71] = :BurningTreeTrunk ; NUME[:BurningTreeTrunk] = 71 ; Caption[:BurningTreeTrunk] = 'fire' ; Shape[:BurningTreeTrunk] = :WALL ; Material[:BurningTreeTrunk] = :FIRE
    ENUM[72] = :BurningTreeBranches ; NUME[:BurningTreeBranches] = 72 ; Caption[:BurningTreeBranches] = 'fire' ; Shape[:BurningTreeBranches] = :BRANCH ; Material[:BurningTreeBranches] = :FIRE
    ENUM[73] = :BurningTreeTwigs ; NUME[:BurningTreeTwigs] = 73 ; Caption[:BurningTreeTwigs] = 'fire' ; Shape[:BurningTreeTwigs] = :TWIG ; Material[:BurningTreeTwigs] = :FIRE
    ENUM[74] = :BurningTreeCapWall ; NUME[:BurningTreeCapWall] = 74 ; Caption[:BurningTreeCapWall] = 'fire' ; Shape[:BurningTreeCapWall] = :WALL ; Material[:BurningTreeCapWall] = :FIRE
    ENUM[75] = :BurningTreeCapRamp ; NUME[:BurningTreeCapRamp] = 75 ; Caption[:BurningTreeCapRamp] = 'fire' ; Shape[:BurningTreeCapRamp] = :RAMP ; Material[:BurningTreeCapRamp] = :FIRE
    ENUM[76] = :BurningTreeCapFloor ; NUME[:BurningTreeCapFloor] = 76 ; Caption[:BurningTreeCapFloor] = 'fire' ; Shape[:BurningTreeCapFloor] = :FLOOR ; Material[:BurningTreeCapFloor] = :FIRE
    ENUM[79] = :StonePillar ; NUME[:StonePillar] = 79 ; Caption[:StonePillar] = 'stone pillar' ; Shape[:StonePillar] = :WALL ; Material[:StonePillar] = :STONE ; Special[:StonePillar] = :SMOOTH
    ENUM[80] = :LavaPillar ; NUME[:LavaPillar] = 80 ; Caption[:LavaPillar] = 'obsidian pillar' ; Shape[:LavaPillar] = :WALL ; Material[:LavaPillar] = :LAVA_STONE ; Special[:LavaPillar] = :SMOOTH
    ENUM[81] = :FeaturePillar ; NUME[:FeaturePillar] = 81 ; Caption[:FeaturePillar] = 'featstone pillar' ; Shape[:FeaturePillar] = :WALL ; Material[:FeaturePillar] = :FEATURE ; Special[:FeaturePillar] = :SMOOTH
    ENUM[82] = :MineralPillar ; NUME[:MineralPillar] = 82 ; Caption[:MineralPillar] = 'vein pillar' ; Shape[:MineralPillar] = :WALL ; Material[:MineralPillar] = :MINERAL ; Special[:MineralPillar] = :SMOOTH
    ENUM[83] = :FrozenPillar ; NUME[:FrozenPillar] = 83 ; Caption[:FrozenPillar] = 'ice pillar' ; Shape[:FrozenPillar] = :WALL ; Material[:FrozenPillar] = :FROZEN_LIQUID ; Special[:FrozenPillar] = :SMOOTH
    ENUM[89] = :Waterfall ; NUME[:Waterfall] = 89 ; Caption[:Waterfall] = 'waterfall' ; Shape[:Waterfall] = :FLOOR ; Material[:Waterfall] = :RIVER ; Special[:Waterfall] = :WATERFALL
    ENUM[90] = :RiverSource ; NUME[:RiverSource] = 90 ; Caption[:RiverSource] = 'river source' ; Shape[:RiverSource] = :FLOOR ; Material[:RiverSource] = :RIVER ; Special[:RiverSource] = :RIVER_SOURCE
    ENUM[91] = :TreeRootSloping ; NUME[:TreeRootSloping] = 91 ; Caption[:TreeRootSloping] = 'sloping roots' ; Shape[:TreeRootSloping] = :RAMP ; Material[:TreeRootSloping] = :ROOT
    ENUM[92] = :TreeRoots ; NUME[:TreeRoots] = 92 ; Caption[:TreeRoots] = 'roots' ; Shape[:TreeRoots] = :WALL ; Material[:TreeRoots] = :ROOT
    ENUM[93] = :TreeTrunkPillar ; NUME[:TreeTrunkPillar] = 93 ; Caption[:TreeTrunkPillar] = 'trunk pillar' ; Shape[:TreeTrunkPillar] = :WALL ; Material[:TreeTrunkPillar] = :TREE ; Special[:TreeTrunkPillar] = :SMOOTH
    ENUM[94] = :TreeTrunkSloping ; NUME[:TreeTrunkSloping] = 94 ; Caption[:TreeTrunkSloping] = 'sloping trunk' ; Shape[:TreeTrunkSloping] = :RAMP ; Material[:TreeTrunkSloping] = :TREE
    ENUM[95] = :TreeTrunkN ; NUME[:TreeTrunkN] = 95 ; Caption[:TreeTrunkN] = 'trunk (N)' ; Shape[:TreeTrunkN] = :WALL ; Material[:TreeTrunkN] = :TREE ; Direction[:TreeTrunkN] = 'N'
    ENUM[96] = :TreeTrunkS ; NUME[:TreeTrunkS] = 96 ; Caption[:TreeTrunkS] = 'trunk (S)' ; Shape[:TreeTrunkS] = :WALL ; Material[:TreeTrunkS] = :TREE ; Direction[:TreeTrunkS] = 'S'
    ENUM[97] = :TreeTrunkE ; NUME[:TreeTrunkE] = 97 ; Caption[:TreeTrunkE] = 'trunk (E)' ; Shape[:TreeTrunkE] = :WALL ; Material[:TreeTrunkE] = :TREE ; Direction[:TreeTrunkE] = 'E'
    ENUM[98] = :TreeTrunkW ; NUME[:TreeTrunkW] = 98 ; Caption[:TreeTrunkW] = 'trunk (W)' ; Shape[:TreeTrunkW] = :WALL ; Material[:TreeTrunkW] = :TREE ; Direction[:TreeTrunkW] = 'W'
    ENUM[99] = :TreeTrunkNW ; NUME[:TreeTrunkNW] = 99 ; Caption[:TreeTrunkNW] = 'trunk (NW)' ; Shape[:TreeTrunkNW] = :WALL ; Material[:TreeTrunkNW] = :TREE ; Direction[:TreeTrunkNW] = 'NW'
    ENUM[100] = :TreeTrunkNE ; NUME[:TreeTrunkNE] = 100 ; Caption[:TreeTrunkNE] = 'trunk (NE)' ; Shape[:TreeTrunkNE] = :WALL ; Material[:TreeTrunkNE] = :TREE ; Direction[:TreeTrunkNE] = 'NE'
    ENUM[101] = :TreeTrunkSW ; NUME[:TreeTrunkSW] = 101 ; Caption[:TreeTrunkSW] = 'trunk (SW)' ; Shape[:TreeTrunkSW] = :WALL ; Material[:TreeTrunkSW] = :TREE ; Direction[:TreeTrunkSW] = 'SW'
    ENUM[102] = :TreeTrunkSE ; NUME[:TreeTrunkSE] = 102 ; Caption[:TreeTrunkSE] = 'trunk (SE)' ; Shape[:TreeTrunkSE] = :WALL ; Material[:TreeTrunkSE] = :TREE ; Direction[:TreeTrunkSE] = 'SE'
    ENUM[103] = :TreeTrunkBranchN ; NUME[:TreeTrunkBranchN] = 103 ; Caption[:TreeTrunkBranchN] = 'trunk branch (N)' ; Shape[:TreeTrunkBranchN] = :TRUNK_BRANCH ; Material[:TreeTrunkBranchN] = :TREE ; Direction[:TreeTrunkBranchN] = 'N'
    ENUM[104] = :TreeTrunkBranchS ; NUME[:TreeTrunkBranchS] = 104 ; Caption[:TreeTrunkBranchS] = 'trunk branch (S)' ; Shape[:TreeTrunkBranchS] = :TRUNK_BRANCH ; Material[:TreeTrunkBranchS] = :TREE ; Direction[:TreeTrunkBranchS] = 'S'
    ENUM[105] = :TreeTrunkBranchE ; NUME[:TreeTrunkBranchE] = 105 ; Caption[:TreeTrunkBranchE] = 'trunk branch (E)' ; Shape[:TreeTrunkBranchE] = :TRUNK_BRANCH ; Material[:TreeTrunkBranchE] = :TREE ; Direction[:TreeTrunkBranchE] = 'E'
    ENUM[106] = :TreeTrunkBranchW ; NUME[:TreeTrunkBranchW] = 106 ; Caption[:TreeTrunkBranchW] = 'trunk branch (W)' ; Shape[:TreeTrunkBranchW] = :TRUNK_BRANCH ; Material[:TreeTrunkBranchW] = :TREE ; Direction[:TreeTrunkBranchW] = 'W'
    ENUM[107] = :TreeBranchNS ; NUME[:TreeBranchNS] = 107 ; Caption[:TreeBranchNS] = 'branch (NS)' ; Shape[:TreeBranchNS] = :BRANCH ; Material[:TreeBranchNS] = :TREE ; Direction[:TreeBranchNS] = 'NS'
    ENUM[108] = :TreeBranchEW ; NUME[:TreeBranchEW] = 108 ; Caption[:TreeBranchEW] = 'branch (EW)' ; Shape[:TreeBranchEW] = :BRANCH ; Material[:TreeBranchEW] = :TREE ; Direction[:TreeBranchEW] = 'EW'
    ENUM[109] = :TreeBranchesSmooth ; NUME[:TreeBranchesSmooth] = 109 ; Caption[:TreeBranchesSmooth] = 'smooth branch' ; Shape[:TreeBranchesSmooth] = :BRANCH ; Material[:TreeBranchesSmooth] = :TREE ; Special[:TreeBranchesSmooth] = :SMOOTH
    ENUM[110] = :TreeDeadBranchesSmooth ; NUME[:TreeDeadBranchesSmooth] = 110 ; Caption[:TreeDeadBranchesSmooth] = 'smooth dead branch' ; Shape[:TreeDeadBranchesSmooth] = :BRANCH ; Material[:TreeDeadBranchesSmooth] = :TREE ; Special[:TreeDeadBranchesSmooth] = :SMOOTH_DEAD
    ENUM[111] = :TreeBranchNW ; NUME[:TreeBranchNW] = 111 ; Caption[:TreeBranchNW] = 'branch (NW)' ; Shape[:TreeBranchNW] = :BRANCH ; Material[:TreeBranchNW] = :TREE ; Direction[:TreeBranchNW] = 'NW'
    ENUM[112] = :TreeBranchNE ; NUME[:TreeBranchNE] = 112 ; Caption[:TreeBranchNE] = 'branch (NE)' ; Shape[:TreeBranchNE] = :BRANCH ; Material[:TreeBranchNE] = :TREE ; Direction[:TreeBranchNE] = 'NE'
    ENUM[113] = :TreeBranchSW ; NUME[:TreeBranchSW] = 113 ; Caption[:TreeBranchSW] = 'branch (SW)' ; Shape[:TreeBranchSW] = :BRANCH ; Material[:TreeBranchSW] = :TREE ; Direction[:TreeBranchSW] = 'SW'
    ENUM[114] = :TreeBranchSE ; NUME[:TreeBranchSE] = 114 ; Caption[:TreeBranchSE] = 'branch (SE)' ; Shape[:TreeBranchSE] = :BRANCH ; Material[:TreeBranchSE] = :TREE ; Direction[:TreeBranchSE] = 'SE'
    ENUM[115] = :TreeBranches ; NUME[:TreeBranches] = 115 ; Caption[:TreeBranches] = 'branches' ; Shape[:TreeBranches] = :BRANCH ; Material[:TreeBranches] = :TREE
    ENUM[116] = :TreeTwigs ; NUME[:TreeTwigs] = 116 ; Caption[:TreeTwigs] = 'twigs' ; Shape[:TreeTwigs] = :TWIG ; Material[:TreeTwigs] = :TREE
    ENUM[117] = :TreeCapRamp ; NUME[:TreeCapRamp] = 117 ; Caption[:TreeCapRamp] = 'cap ramp' ; Shape[:TreeCapRamp] = :RAMP ; Material[:TreeCapRamp] = :MUSHROOM
    ENUM[118] = :TreeCapPillar ; NUME[:TreeCapPillar] = 118 ; Caption[:TreeCapPillar] = 'cap pillar' ; Shape[:TreeCapPillar] = :WALL ; Material[:TreeCapPillar] = :MUSHROOM ; Special[:TreeCapPillar] = :SMOOTH
    ENUM[119] = :TreeCapWallN ; NUME[:TreeCapWallN] = 119 ; Caption[:TreeCapWallN] = 'cap wall (N)' ; Shape[:TreeCapWallN] = :WALL ; Material[:TreeCapWallN] = :MUSHROOM ; Direction[:TreeCapWallN] = 'N'
    ENUM[120] = :TreeCapWallS ; NUME[:TreeCapWallS] = 120 ; Caption[:TreeCapWallS] = 'cap wall (S)' ; Shape[:TreeCapWallS] = :WALL ; Material[:TreeCapWallS] = :MUSHROOM ; Direction[:TreeCapWallS] = 'S'
    ENUM[121] = :TreeCapWallE ; NUME[:TreeCapWallE] = 121 ; Caption[:TreeCapWallE] = 'cap wall (E)' ; Shape[:TreeCapWallE] = :WALL ; Material[:TreeCapWallE] = :MUSHROOM ; Direction[:TreeCapWallE] = 'E'
    ENUM[122] = :TreeCapWallW ; NUME[:TreeCapWallW] = 122 ; Caption[:TreeCapWallW] = 'cap wall (W)' ; Shape[:TreeCapWallW] = :WALL ; Material[:TreeCapWallW] = :MUSHROOM ; Direction[:TreeCapWallW] = 'W'
    ENUM[123] = :TreeCapWallNW ; NUME[:TreeCapWallNW] = 123 ; Caption[:TreeCapWallNW] = 'cap wall (NW)' ; Shape[:TreeCapWallNW] = :WALL ; Material[:TreeCapWallNW] = :MUSHROOM ; Direction[:TreeCapWallNW] = 'NW'
    ENUM[124] = :TreeCapWallNE ; NUME[:TreeCapWallNE] = 124 ; Caption[:TreeCapWallNE] = 'cap wall (NE)' ; Shape[:TreeCapWallNE] = :WALL ; Material[:TreeCapWallNE] = :MUSHROOM ; Direction[:TreeCapWallNE] = 'NE'
    ENUM[125] = :TreeCapWallSW ; NUME[:TreeCapWallSW] = 125 ; Caption[:TreeCapWallSW] = 'cap wall (SW)' ; Shape[:TreeCapWallSW] = :WALL ; Material[:TreeCapWallSW] = :MUSHROOM ; Direction[:TreeCapWallSW] = 'SW'
    ENUM[126] = :TreeCapWallSE ; NUME[:TreeCapWallSE] = 126 ; Caption[:TreeCapWallSE] = 'cap wall (SE)' ; Shape[:TreeCapWallSE] = :WALL ; Material[:TreeCapWallSE] = :MUSHROOM ; Direction[:TreeCapWallSE] = 'SE'
    ENUM[127] = :TreeCapFloor1 ; NUME[:TreeCapFloor1] = 127 ; Caption[:TreeCapFloor1] = 'cap floor' ; Shape[:TreeCapFloor1] = :FLOOR ; Material[:TreeCapFloor1] = :MUSHROOM ; Variant[:TreeCapFloor1] = :VAR_1
    ENUM[128] = :TreeCapFloor2 ; NUME[:TreeCapFloor2] = 128 ; Caption[:TreeCapFloor2] = 'cap floor' ; Shape[:TreeCapFloor2] = :FLOOR ; Material[:TreeCapFloor2] = :MUSHROOM ; Variant[:TreeCapFloor2] = :VAR_2
    ENUM[129] = :TreeCapFloor3 ; NUME[:TreeCapFloor3] = 129 ; Caption[:TreeCapFloor3] = 'cap floor' ; Shape[:TreeCapFloor3] = :FLOOR ; Material[:TreeCapFloor3] = :MUSHROOM ; Variant[:TreeCapFloor3] = :VAR_3
    ENUM[130] = :TreeCapFloor4 ; NUME[:TreeCapFloor4] = 130 ; Caption[:TreeCapFloor4] = 'cap floor' ; Shape[:TreeCapFloor4] = :FLOOR ; Material[:TreeCapFloor4] = :MUSHROOM ; Variant[:TreeCapFloor4] = :VAR_4
    ENUM[131] = :TreeDeadRootSloping ; NUME[:TreeDeadRootSloping] = 131 ; Caption[:TreeDeadRootSloping] = 'dead sloping roots' ; Shape[:TreeDeadRootSloping] = :RAMP ; Material[:TreeDeadRootSloping] = :ROOT ; Special[:TreeDeadRootSloping] = :DEAD
    ENUM[132] = :TreeDeadRoots ; NUME[:TreeDeadRoots] = 132 ; Caption[:TreeDeadRoots] = 'dead roots' ; Shape[:TreeDeadRoots] = :WALL ; Material[:TreeDeadRoots] = :ROOT ; Special[:TreeDeadRoots] = :DEAD
    ENUM[133] = :TreeDeadTrunkPillar ; NUME[:TreeDeadTrunkPillar] = 133 ; Caption[:TreeDeadTrunkPillar] = 'dead trunk pillar' ; Shape[:TreeDeadTrunkPillar] = :WALL ; Material[:TreeDeadTrunkPillar] = :TREE ; Special[:TreeDeadTrunkPillar] = :SMOOTH_DEAD
    ENUM[134] = :TreeDeadTrunkSloping ; NUME[:TreeDeadTrunkSloping] = 134 ; Caption[:TreeDeadTrunkSloping] = 'dead sloping trunk' ; Shape[:TreeDeadTrunkSloping] = :RAMP ; Material[:TreeDeadTrunkSloping] = :TREE ; Special[:TreeDeadTrunkSloping] = :DEAD
    ENUM[135] = :TreeDeadTrunkN ; NUME[:TreeDeadTrunkN] = 135 ; Caption[:TreeDeadTrunkN] = 'dead trunk (N)' ; Shape[:TreeDeadTrunkN] = :WALL ; Material[:TreeDeadTrunkN] = :TREE ; Special[:TreeDeadTrunkN] = :DEAD ; Direction[:TreeDeadTrunkN] = 'N'
    ENUM[136] = :TreeDeadTrunkS ; NUME[:TreeDeadTrunkS] = 136 ; Caption[:TreeDeadTrunkS] = 'dead trunk (S)' ; Shape[:TreeDeadTrunkS] = :WALL ; Material[:TreeDeadTrunkS] = :TREE ; Special[:TreeDeadTrunkS] = :DEAD ; Direction[:TreeDeadTrunkS] = 'S'
    ENUM[137] = :TreeDeadTrunkE ; NUME[:TreeDeadTrunkE] = 137 ; Caption[:TreeDeadTrunkE] = 'dead trunk (E)' ; Shape[:TreeDeadTrunkE] = :WALL ; Material[:TreeDeadTrunkE] = :TREE ; Special[:TreeDeadTrunkE] = :DEAD ; Direction[:TreeDeadTrunkE] = 'E'
    ENUM[138] = :TreeDeadTrunkW ; NUME[:TreeDeadTrunkW] = 138 ; Caption[:TreeDeadTrunkW] = 'dead trunk (W)' ; Shape[:TreeDeadTrunkW] = :WALL ; Material[:TreeDeadTrunkW] = :TREE ; Special[:TreeDeadTrunkW] = :DEAD ; Direction[:TreeDeadTrunkW] = 'W'
    ENUM[139] = :TreeDeadTrunkNW ; NUME[:TreeDeadTrunkNW] = 139 ; Caption[:TreeDeadTrunkNW] = 'dead trunk (NW)' ; Shape[:TreeDeadTrunkNW] = :WALL ; Material[:TreeDeadTrunkNW] = :TREE ; Special[:TreeDeadTrunkNW] = :DEAD ; Direction[:TreeDeadTrunkNW] = 'NW'
    ENUM[140] = :TreeDeadTrunkNE ; NUME[:TreeDeadTrunkNE] = 140 ; Caption[:TreeDeadTrunkNE] = 'dead trunk (NE)' ; Shape[:TreeDeadTrunkNE] = :WALL ; Material[:TreeDeadTrunkNE] = :TREE ; Special[:TreeDeadTrunkNE] = :DEAD ; Direction[:TreeDeadTrunkNE] = 'NE'
    ENUM[141] = :TreeDeadTrunkSW ; NUME[:TreeDeadTrunkSW] = 141 ; Caption[:TreeDeadTrunkSW] = 'dead trunk (SW)' ; Shape[:TreeDeadTrunkSW] = :WALL ; Material[:TreeDeadTrunkSW] = :TREE ; Special[:TreeDeadTrunkSW] = :DEAD ; Direction[:TreeDeadTrunkSW] = 'SW'
    ENUM[142] = :TreeDeadTrunkSE ; NUME[:TreeDeadTrunkSE] = 142 ; Caption[:TreeDeadTrunkSE] = 'dead trunk (SE)' ; Shape[:TreeDeadTrunkSE] = :WALL ; Material[:TreeDeadTrunkSE] = :TREE ; Special[:TreeDeadTrunkSE] = :DEAD ; Direction[:TreeDeadTrunkSE] = 'SE'
    ENUM[143] = :TreeDeadTrunkBranchN ; NUME[:TreeDeadTrunkBranchN] = 143 ; Caption[:TreeDeadTrunkBranchN] = 'dead trunk branch (N)' ; Shape[:TreeDeadTrunkBranchN] = :TRUNK_BRANCH ; Material[:TreeDeadTrunkBranchN] = :TREE ; Special[:TreeDeadTrunkBranchN] = :DEAD ; Direction[:TreeDeadTrunkBranchN] = 'N'
    ENUM[144] = :TreeDeadTrunkBranchS ; NUME[:TreeDeadTrunkBranchS] = 144 ; Caption[:TreeDeadTrunkBranchS] = 'dead trunk branch (S)' ; Shape[:TreeDeadTrunkBranchS] = :TRUNK_BRANCH ; Material[:TreeDeadTrunkBranchS] = :TREE ; Special[:TreeDeadTrunkBranchS] = :DEAD ; Direction[:TreeDeadTrunkBranchS] = 'S'
    ENUM[145] = :TreeDeadTrunkBranchE ; NUME[:TreeDeadTrunkBranchE] = 145 ; Caption[:TreeDeadTrunkBranchE] = 'dead trunk branch (E)' ; Shape[:TreeDeadTrunkBranchE] = :TRUNK_BRANCH ; Material[:TreeDeadTrunkBranchE] = :TREE ; Special[:TreeDeadTrunkBranchE] = :DEAD ; Direction[:TreeDeadTrunkBranchE] = 'E'
    ENUM[146] = :TreeDeadTrunkBranchW ; NUME[:TreeDeadTrunkBranchW] = 146 ; Caption[:TreeDeadTrunkBranchW] = 'dead trunk branch (W)' ; Shape[:TreeDeadTrunkBranchW] = :TRUNK_BRANCH ; Material[:TreeDeadTrunkBranchW] = :TREE ; Special[:TreeDeadTrunkBranchW] = :DEAD ; Direction[:TreeDeadTrunkBranchW] = 'W'
    ENUM[147] = :TreeDeadBranchNS ; NUME[:TreeDeadBranchNS] = 147 ; Caption[:TreeDeadBranchNS] = 'dead branch (NS)' ; Shape[:TreeDeadBranchNS] = :BRANCH ; Material[:TreeDeadBranchNS] = :TREE ; Special[:TreeDeadBranchNS] = :DEAD ; Direction[:TreeDeadBranchNS] = 'NS'
    ENUM[148] = :TreeDeadBranchEW ; NUME[:TreeDeadBranchEW] = 148 ; Caption[:TreeDeadBranchEW] = 'dead branch (EW)' ; Shape[:TreeDeadBranchEW] = :BRANCH ; Material[:TreeDeadBranchEW] = :TREE ; Special[:TreeDeadBranchEW] = :DEAD ; Direction[:TreeDeadBranchEW] = 'EW'
    ENUM[151] = :TreeDeadBranchNW ; NUME[:TreeDeadBranchNW] = 151 ; Caption[:TreeDeadBranchNW] = 'dead branch (NW)' ; Shape[:TreeDeadBranchNW] = :BRANCH ; Material[:TreeDeadBranchNW] = :TREE ; Special[:TreeDeadBranchNW] = :DEAD ; Direction[:TreeDeadBranchNW] = 'NW'
    ENUM[152] = :TreeDeadBranchNE ; NUME[:TreeDeadBranchNE] = 152 ; Caption[:TreeDeadBranchNE] = 'dead branch (NE)' ; Shape[:TreeDeadBranchNE] = :BRANCH ; Material[:TreeDeadBranchNE] = :TREE ; Special[:TreeDeadBranchNE] = :DEAD ; Direction[:TreeDeadBranchNE] = 'NE'
    ENUM[153] = :TreeDeadBranchSW ; NUME[:TreeDeadBranchSW] = 153 ; Caption[:TreeDeadBranchSW] = 'dead branch (SW)' ; Shape[:TreeDeadBranchSW] = :BRANCH ; Material[:TreeDeadBranchSW] = :TREE ; Special[:TreeDeadBranchSW] = :DEAD ; Direction[:TreeDeadBranchSW] = 'SW'
    ENUM[154] = :TreeDeadBranchSE ; NUME[:TreeDeadBranchSE] = 154 ; Caption[:TreeDeadBranchSE] = 'dead branch (SE)' ; Shape[:TreeDeadBranchSE] = :BRANCH ; Material[:TreeDeadBranchSE] = :TREE ; Special[:TreeDeadBranchSE] = :DEAD ; Direction[:TreeDeadBranchSE] = 'SE'
    ENUM[155] = :TreeDeadBranches ; NUME[:TreeDeadBranches] = 155 ; Caption[:TreeDeadBranches] = 'dead branches' ; Shape[:TreeDeadBranches] = :BRANCH ; Material[:TreeDeadBranches] = :TREE ; Special[:TreeDeadBranches] = :DEAD
    ENUM[156] = :TreeDeadTwigs ; NUME[:TreeDeadTwigs] = 156 ; Caption[:TreeDeadTwigs] = 'dead twigs' ; Shape[:TreeDeadTwigs] = :TWIG ; Material[:TreeDeadTwigs] = :TREE ; Special[:TreeDeadTwigs] = :DEAD
    ENUM[157] = :TreeDeadCapRamp ; NUME[:TreeDeadCapRamp] = 157 ; Caption[:TreeDeadCapRamp] = 'dead cap ramp' ; Shape[:TreeDeadCapRamp] = :RAMP ; Material[:TreeDeadCapRamp] = :MUSHROOM ; Special[:TreeDeadCapRamp] = :DEAD
    ENUM[158] = :TreeDeadCapPillar ; NUME[:TreeDeadCapPillar] = 158 ; Caption[:TreeDeadCapPillar] = 'dead cap pillar' ; Shape[:TreeDeadCapPillar] = :WALL ; Material[:TreeDeadCapPillar] = :MUSHROOM ; Special[:TreeDeadCapPillar] = :SMOOTH_DEAD
    ENUM[159] = :TreeDeadCapWallN ; NUME[:TreeDeadCapWallN] = 159 ; Caption[:TreeDeadCapWallN] = 'dead cap wall (N)' ; Shape[:TreeDeadCapWallN] = :WALL ; Material[:TreeDeadCapWallN] = :MUSHROOM ; Special[:TreeDeadCapWallN] = :DEAD ; Direction[:TreeDeadCapWallN] = 'N'
    ENUM[160] = :TreeDeadCapWallS ; NUME[:TreeDeadCapWallS] = 160 ; Caption[:TreeDeadCapWallS] = 'dead cap wall (S)' ; Shape[:TreeDeadCapWallS] = :WALL ; Material[:TreeDeadCapWallS] = :MUSHROOM ; Special[:TreeDeadCapWallS] = :DEAD ; Direction[:TreeDeadCapWallS] = 'S'
    ENUM[161] = :TreeDeadCapWallE ; NUME[:TreeDeadCapWallE] = 161 ; Caption[:TreeDeadCapWallE] = 'dead cap wall (E)' ; Shape[:TreeDeadCapWallE] = :WALL ; Material[:TreeDeadCapWallE] = :MUSHROOM ; Special[:TreeDeadCapWallE] = :DEAD ; Direction[:TreeDeadCapWallE] = 'E'
    ENUM[162] = :TreeDeadCapWallW ; NUME[:TreeDeadCapWallW] = 162 ; Caption[:TreeDeadCapWallW] = 'dead cap wall (W)' ; Shape[:TreeDeadCapWallW] = :WALL ; Material[:TreeDeadCapWallW] = :MUSHROOM ; Special[:TreeDeadCapWallW] = :DEAD ; Direction[:TreeDeadCapWallW] = 'W'
    ENUM[163] = :TreeDeadCapWallNW ; NUME[:TreeDeadCapWallNW] = 163 ; Caption[:TreeDeadCapWallNW] = 'dead cap wall (NW)' ; Shape[:TreeDeadCapWallNW] = :WALL ; Material[:TreeDeadCapWallNW] = :MUSHROOM ; Special[:TreeDeadCapWallNW] = :DEAD ; Direction[:TreeDeadCapWallNW] = 'NW'
    ENUM[164] = :TreeDeadCapWallNE ; NUME[:TreeDeadCapWallNE] = 164 ; Caption[:TreeDeadCapWallNE] = 'dead cap wall (NE)' ; Shape[:TreeDeadCapWallNE] = :WALL ; Material[:TreeDeadCapWallNE] = :MUSHROOM ; Special[:TreeDeadCapWallNE] = :DEAD ; Direction[:TreeDeadCapWallNE] = 'NE'
    ENUM[165] = :TreeDeadCapWallSW ; NUME[:TreeDeadCapWallSW] = 165 ; Caption[:TreeDeadCapWallSW] = 'dead cap wall (SW)' ; Shape[:TreeDeadCapWallSW] = :WALL ; Material[:TreeDeadCapWallSW] = :MUSHROOM ; Special[:TreeDeadCapWallSW] = :DEAD ; Direction[:TreeDeadCapWallSW] = 'SW'
    ENUM[166] = :TreeDeadCapWallSE ; NUME[:TreeDeadCapWallSE] = 166 ; Caption[:TreeDeadCapWallSE] = 'dead cap wall (SE)' ; Shape[:TreeDeadCapWallSE] = :WALL ; Material[:TreeDeadCapWallSE] = :MUSHROOM ; Special[:TreeDeadCapWallSE] = :DEAD ; Direction[:TreeDeadCapWallSE] = 'SE'
    ENUM[167] = :TreeDeadCapFloor1 ; NUME[:TreeDeadCapFloor1] = 167 ; Caption[:TreeDeadCapFloor1] = 'dead cap floor' ; Shape[:TreeDeadCapFloor1] = :FLOOR ; Material[:TreeDeadCapFloor1] = :MUSHROOM ; Special[:TreeDeadCapFloor1] = :DEAD ; Variant[:TreeDeadCapFloor1] = :VAR_1
    ENUM[168] = :TreeDeadCapFloor2 ; NUME[:TreeDeadCapFloor2] = 168 ; Caption[:TreeDeadCapFloor2] = 'dead cap floor' ; Shape[:TreeDeadCapFloor2] = :FLOOR ; Material[:TreeDeadCapFloor2] = :MUSHROOM ; Special[:TreeDeadCapFloor2] = :DEAD ; Variant[:TreeDeadCapFloor2] = :VAR_2
    ENUM[169] = :TreeDeadCapFloor3 ; NUME[:TreeDeadCapFloor3] = 169 ; Caption[:TreeDeadCapFloor3] = 'dead cap floor' ; Shape[:TreeDeadCapFloor3] = :FLOOR ; Material[:TreeDeadCapFloor3] = :MUSHROOM ; Special[:TreeDeadCapFloor3] = :DEAD ; Variant[:TreeDeadCapFloor3] = :VAR_3
    ENUM[170] = :TreeDeadCapFloor4 ; NUME[:TreeDeadCapFloor4] = 170 ; Caption[:TreeDeadCapFloor4] = 'dead cap floor' ; Shape[:TreeDeadCapFloor4] = :FLOOR ; Material[:TreeDeadCapFloor4] = :MUSHROOM ; Special[:TreeDeadCapFloor4] = :DEAD ; Variant[:TreeDeadCapFloor4] = :VAR_4
    ENUM[172] = :StoneWallWorn1 ; NUME[:StoneWallWorn1] = 172 ; Caption[:StoneWallWorn1] = 'worn 1 stone wall' ; Shape[:StoneWallWorn1] = :WALL ; Material[:StoneWallWorn1] = :STONE ; Special[:StoneWallWorn1] = :WORN_1
    ENUM[173] = :StoneWallWorn2 ; NUME[:StoneWallWorn2] = 173 ; Caption[:StoneWallWorn2] = 'worn 2 stone wall' ; Shape[:StoneWallWorn2] = :WALL ; Material[:StoneWallWorn2] = :STONE ; Special[:StoneWallWorn2] = :WORN_2
    ENUM[174] = :StoneWallWorn3 ; NUME[:StoneWallWorn3] = 174 ; Caption[:StoneWallWorn3] = 'worn 3 stone wall' ; Shape[:StoneWallWorn3] = :WALL ; Material[:StoneWallWorn3] = :STONE ; Special[:StoneWallWorn3] = :WORN_3
    ENUM[175] = :TreeBranchNSE ; NUME[:TreeBranchNSE] = 175 ; Caption[:TreeBranchNSE] = 'branches (NSE)' ; Shape[:TreeBranchNSE] = :BRANCH ; Material[:TreeBranchNSE] = :TREE ; Direction[:TreeBranchNSE] = 'NSE'
    ENUM[176] = :TreeBranchNSW ; NUME[:TreeBranchNSW] = 176 ; Caption[:TreeBranchNSW] = 'branches (NSW)' ; Shape[:TreeBranchNSW] = :BRANCH ; Material[:TreeBranchNSW] = :TREE ; Direction[:TreeBranchNSW] = 'NSW'
    ENUM[177] = :TreeBranchNEW ; NUME[:TreeBranchNEW] = 177 ; Caption[:TreeBranchNEW] = 'branches (NEW)' ; Shape[:TreeBranchNEW] = :BRANCH ; Material[:TreeBranchNEW] = :TREE ; Direction[:TreeBranchNEW] = 'NEW'
    ENUM[178] = :TreeBranchSEW ; NUME[:TreeBranchSEW] = 178 ; Caption[:TreeBranchSEW] = 'branches (SEW)' ; Shape[:TreeBranchSEW] = :BRANCH ; Material[:TreeBranchSEW] = :TREE ; Direction[:TreeBranchSEW] = 'SEW'
    ENUM[179] = :TreeBranchNSEW ; NUME[:TreeBranchNSEW] = 179 ; Caption[:TreeBranchNSEW] = 'branches (NSEW)' ; Shape[:TreeBranchNSEW] = :BRANCH ; Material[:TreeBranchNSEW] = :TREE ; Direction[:TreeBranchNSEW] = 'NSEW'
    ENUM[180] = :TreeDeadBranchNSE ; NUME[:TreeDeadBranchNSE] = 180 ; Caption[:TreeDeadBranchNSE] = 'dead branches (NSW)' ; Shape[:TreeDeadBranchNSE] = :BRANCH ; Material[:TreeDeadBranchNSE] = :TREE ; Special[:TreeDeadBranchNSE] = :DEAD ; Direction[:TreeDeadBranchNSE] = 'NSW'
    ENUM[181] = :TreeDeadBranchNSW ; NUME[:TreeDeadBranchNSW] = 181 ; Caption[:TreeDeadBranchNSW] = 'dead branches (NEW)' ; Shape[:TreeDeadBranchNSW] = :BRANCH ; Material[:TreeDeadBranchNSW] = :TREE ; Special[:TreeDeadBranchNSW] = :DEAD ; Direction[:TreeDeadBranchNSW] = 'NEW'
    ENUM[182] = :TreeDeadBranchNEW ; NUME[:TreeDeadBranchNEW] = 182 ; Caption[:TreeDeadBranchNEW] = 'dead branches (NEW)' ; Shape[:TreeDeadBranchNEW] = :BRANCH ; Material[:TreeDeadBranchNEW] = :TREE ; Special[:TreeDeadBranchNEW] = :DEAD ; Direction[:TreeDeadBranchNEW] = 'NEW'
    ENUM[183] = :TreeDeadBranchSEW ; NUME[:TreeDeadBranchSEW] = 183 ; Caption[:TreeDeadBranchSEW] = 'dead branches (SEW)' ; Shape[:TreeDeadBranchSEW] = :BRANCH ; Material[:TreeDeadBranchSEW] = :TREE ; Special[:TreeDeadBranchSEW] = :DEAD ; Direction[:TreeDeadBranchSEW] = 'SEW'
    ENUM[184] = :TreeDeadBranchNSEW ; NUME[:TreeDeadBranchNSEW] = 184 ; Caption[:TreeDeadBranchNSEW] = 'dead branches (NSEW)' ; Shape[:TreeDeadBranchNSEW] = :BRANCH ; Material[:TreeDeadBranchNSEW] = :TREE ; Special[:TreeDeadBranchNSEW] = :DEAD ; Direction[:TreeDeadBranchNSEW] = 'NSEW'
    ENUM[185] = :TreeTrunkNSE ; NUME[:TreeTrunkNSE] = 185 ; Caption[:TreeTrunkNSE] = 'trunk (NSE)' ; Shape[:TreeTrunkNSE] = :WALL ; Material[:TreeTrunkNSE] = :TREE ; Direction[:TreeTrunkNSE] = 'NSE'
    ENUM[186] = :TreeTrunkNSW ; NUME[:TreeTrunkNSW] = 186 ; Caption[:TreeTrunkNSW] = 'trunk (NSW)' ; Shape[:TreeTrunkNSW] = :WALL ; Material[:TreeTrunkNSW] = :TREE ; Direction[:TreeTrunkNSW] = 'NSW'
    ENUM[187] = :TreeTrunkNEW ; NUME[:TreeTrunkNEW] = 187 ; Caption[:TreeTrunkNEW] = 'trunk (NEW)' ; Shape[:TreeTrunkNEW] = :WALL ; Material[:TreeTrunkNEW] = :TREE ; Direction[:TreeTrunkNEW] = 'NEW'
    ENUM[188] = :TreeTrunkSEW ; NUME[:TreeTrunkSEW] = 188 ; Caption[:TreeTrunkSEW] = 'trunk (SEW)' ; Shape[:TreeTrunkSEW] = :WALL ; Material[:TreeTrunkSEW] = :TREE ; Direction[:TreeTrunkSEW] = 'SEW'
    ENUM[189] = :TreeTrunkNS ; NUME[:TreeTrunkNS] = 189 ; Caption[:TreeTrunkNS] = 'trunk (NS)' ; Shape[:TreeTrunkNS] = :WALL ; Material[:TreeTrunkNS] = :TREE ; Direction[:TreeTrunkNS] = 'NS'
    ENUM[190] = :TreeTrunkEW ; NUME[:TreeTrunkEW] = 190 ; Caption[:TreeTrunkEW] = 'trunk (EW)' ; Shape[:TreeTrunkEW] = :WALL ; Material[:TreeTrunkEW] = :TREE ; Direction[:TreeTrunkEW] = 'EW'
    ENUM[191] = :TreeTrunkNSEW ; NUME[:TreeTrunkNSEW] = 191 ; Caption[:TreeTrunkNSEW] = 'trunk (NSEW)' ; Shape[:TreeTrunkNSEW] = :WALL ; Material[:TreeTrunkNSEW] = :TREE ; Direction[:TreeTrunkNSEW] = 'NSEW'
    ENUM[192] = :TreeTrunkInterior ; NUME[:TreeTrunkInterior] = 192 ; Caption[:TreeTrunkInterior] = 'trunk interior' ; Shape[:TreeTrunkInterior] = :WALL ; Material[:TreeTrunkInterior] = :TREE
    ENUM[193] = :TreeDeadTrunkNSE ; NUME[:TreeDeadTrunkNSE] = 193 ; Caption[:TreeDeadTrunkNSE] = 'dead trunk (NSE)' ; Shape[:TreeDeadTrunkNSE] = :WALL ; Material[:TreeDeadTrunkNSE] = :TREE ; Special[:TreeDeadTrunkNSE] = :DEAD ; Direction[:TreeDeadTrunkNSE] = 'NSE'
    ENUM[194] = :TreeDeadTrunkNSW ; NUME[:TreeDeadTrunkNSW] = 194 ; Caption[:TreeDeadTrunkNSW] = 'dead trunk (NSW)' ; Shape[:TreeDeadTrunkNSW] = :WALL ; Material[:TreeDeadTrunkNSW] = :TREE ; Special[:TreeDeadTrunkNSW] = :DEAD ; Direction[:TreeDeadTrunkNSW] = 'NSW'
    ENUM[195] = :TreeDeadTrunkNEW ; NUME[:TreeDeadTrunkNEW] = 195 ; Caption[:TreeDeadTrunkNEW] = 'dead trunk (NEW)' ; Shape[:TreeDeadTrunkNEW] = :WALL ; Material[:TreeDeadTrunkNEW] = :TREE ; Special[:TreeDeadTrunkNEW] = :DEAD ; Direction[:TreeDeadTrunkNEW] = 'NEW'
    ENUM[196] = :TreeDeadTrunkSEW ; NUME[:TreeDeadTrunkSEW] = 196 ; Caption[:TreeDeadTrunkSEW] = 'dead trunk (SEW)' ; Shape[:TreeDeadTrunkSEW] = :WALL ; Material[:TreeDeadTrunkSEW] = :TREE ; Special[:TreeDeadTrunkSEW] = :DEAD ; Direction[:TreeDeadTrunkSEW] = 'SEW'
    ENUM[197] = :TreeDeadTrunkNS ; NUME[:TreeDeadTrunkNS] = 197 ; Caption[:TreeDeadTrunkNS] = 'dead trunk (NS)' ; Shape[:TreeDeadTrunkNS] = :WALL ; Material[:TreeDeadTrunkNS] = :TREE ; Special[:TreeDeadTrunkNS] = :DEAD ; Direction[:TreeDeadTrunkNS] = 'NS'
    ENUM[198] = :TreeDeadTrunkEW ; NUME[:TreeDeadTrunkEW] = 198 ; Caption[:TreeDeadTrunkEW] = 'dead trunk (EW)' ; Shape[:TreeDeadTrunkEW] = :WALL ; Material[:TreeDeadTrunkEW] = :TREE ; Special[:TreeDeadTrunkEW] = :DEAD ; Direction[:TreeDeadTrunkEW] = 'EW'
    ENUM[199] = :TreeDeadTrunkNSEW ; NUME[:TreeDeadTrunkNSEW] = 199 ; Caption[:TreeDeadTrunkNSEW] = 'dead trunk (NSEW)' ; Shape[:TreeDeadTrunkNSEW] = :WALL ; Material[:TreeDeadTrunkNSEW] = :TREE ; Special[:TreeDeadTrunkNSEW] = :DEAD ; Direction[:TreeDeadTrunkNSEW] = 'NSEW'
    ENUM[200] = :TreeDeadTrunkInterior ; NUME[:TreeDeadTrunkInterior] = 200 ; Caption[:TreeDeadTrunkInterior] = 'dead trunk interior' ; Shape[:TreeDeadTrunkInterior] = :WALL ; Material[:TreeDeadTrunkInterior] = :TREE ; Special[:TreeDeadTrunkInterior] = :DEAD
    ENUM[215] = :StoneWall ; NUME[:StoneWall] = 215 ; Caption[:StoneWall] = 'stone wall' ; Shape[:StoneWall] = :WALL ; Material[:StoneWall] = :STONE ; Special[:StoneWall] = :NORMAL
    ENUM[227] = :Sapling ; NUME[:Sapling] = 227 ; Caption[:Sapling] = 'sapling' ; Shape[:Sapling] = :SAPLING ; Material[:Sapling] = :PLANT ; Special[:Sapling] = :NORMAL
    ENUM[229] = :GrassDryRamp ; NUME[:GrassDryRamp] = 229 ; Caption[:GrassDryRamp] = 'dry grass ramp' ; Shape[:GrassDryRamp] = :RAMP ; Material[:GrassDryRamp] = :GRASS_DRY
    ENUM[230] = :GrassDeadRamp ; NUME[:GrassDeadRamp] = 230 ; Caption[:GrassDeadRamp] = 'dead grass ramp' ; Shape[:GrassDeadRamp] = :RAMP ; Material[:GrassDeadRamp] = :GRASS_DEAD
    ENUM[231] = :GrassLightRamp ; NUME[:GrassLightRamp] = 231 ; Caption[:GrassLightRamp] = 'light grass ramp' ; Shape[:GrassLightRamp] = :RAMP ; Material[:GrassLightRamp] = :GRASS_LIGHT
    ENUM[232] = :GrassDarkRamp ; NUME[:GrassDarkRamp] = 232 ; Caption[:GrassDarkRamp] = 'dark grass ramp' ; Shape[:GrassDarkRamp] = :RAMP ; Material[:GrassDarkRamp] = :GRASS_DARK
    ENUM[233] = :StoneRamp ; NUME[:StoneRamp] = 233 ; Caption[:StoneRamp] = 'stone ramp' ; Shape[:StoneRamp] = :RAMP ; Material[:StoneRamp] = :STONE
    ENUM[234] = :LavaRamp ; NUME[:LavaRamp] = 234 ; Caption[:LavaRamp] = 'obsidian ramp' ; Shape[:LavaRamp] = :RAMP ; Material[:LavaRamp] = :LAVA_STONE
    ENUM[235] = :FeatureRamp ; NUME[:FeatureRamp] = 235 ; Caption[:FeatureRamp] = 'featstone ramp' ; Shape[:FeatureRamp] = :RAMP ; Material[:FeatureRamp] = :FEATURE
    ENUM[236] = :MineralRamp ; NUME[:MineralRamp] = 236 ; Caption[:MineralRamp] = 'vein ramp' ; Shape[:MineralRamp] = :RAMP ; Material[:MineralRamp] = :MINERAL
    ENUM[237] = :SoilRamp ; NUME[:SoilRamp] = 237 ; Caption[:SoilRamp] = 'soil ramp' ; Shape[:SoilRamp] = :RAMP ; Material[:SoilRamp] = :SOIL
    ENUM[238] = :Ashes1 ; NUME[:Ashes1] = 238 ; Caption[:Ashes1] = 'ashes' ; Shape[:Ashes1] = :FLOOR ; Material[:Ashes1] = :ASHES ; Variant[:Ashes1] = :VAR_1
    ENUM[239] = :Ashes2 ; NUME[:Ashes2] = 239 ; Caption[:Ashes2] = 'ashes' ; Shape[:Ashes2] = :FLOOR ; Material[:Ashes2] = :ASHES ; Variant[:Ashes2] = :VAR_2
    ENUM[240] = :Ashes3 ; NUME[:Ashes3] = 240 ; Caption[:Ashes3] = 'ashes' ; Shape[:Ashes3] = :FLOOR ; Material[:Ashes3] = :ASHES ; Variant[:Ashes3] = :VAR_3
    ENUM[241] = :FrozenRamp ; NUME[:FrozenRamp] = 241 ; Caption[:FrozenRamp] = 'ice ramp' ; Shape[:FrozenRamp] = :RAMP ; Material[:FrozenRamp] = :FROZEN_LIQUID
    ENUM[254] = :FrozenFloor2 ; NUME[:FrozenFloor2] = 254 ; Caption[:FrozenFloor2] = 'ice floor' ; Shape[:FrozenFloor2] = :FLOOR ; Material[:FrozenFloor2] = :FROZEN_LIQUID ; Variant[:FrozenFloor2] = :VAR_2 ; Special[:FrozenFloor2] = :NORMAL
    ENUM[255] = :FrozenFloor3 ; NUME[:FrozenFloor3] = 255 ; Caption[:FrozenFloor3] = 'ice floor' ; Shape[:FrozenFloor3] = :FLOOR ; Material[:FrozenFloor3] = :FROZEN_LIQUID ; Variant[:FrozenFloor3] = :VAR_3 ; Special[:FrozenFloor3] = :NORMAL
    ENUM[256] = :FrozenFloor4 ; NUME[:FrozenFloor4] = 256 ; Caption[:FrozenFloor4] = 'ice floor' ; Shape[:FrozenFloor4] = :FLOOR ; Material[:FrozenFloor4] = :FROZEN_LIQUID ; Variant[:FrozenFloor4] = :VAR_4 ; Special[:FrozenFloor4] = :NORMAL
    ENUM[257] = :FurrowedSoil ; NUME[:FurrowedSoil] = 257 ; Caption[:FurrowedSoil] = 'furrowed soil' ; Shape[:FurrowedSoil] = :FLOOR ; Material[:FurrowedSoil] = :SOIL ; Special[:FurrowedSoil] = :FURROWED
    ENUM[258] = :FrozenFloor1 ; NUME[:FrozenFloor1] = 258 ; Caption[:FrozenFloor1] = 'ice floor' ; Shape[:FrozenFloor1] = :FLOOR ; Material[:FrozenFloor1] = :FROZEN_LIQUID ; Variant[:FrozenFloor1] = :VAR_1 ; Special[:FrozenFloor1] = :NORMAL
    ENUM[259] = :SemiMoltenRock ; NUME[:SemiMoltenRock] = 259 ; Caption[:SemiMoltenRock] = 'semi-molten rock' ; Shape[:SemiMoltenRock] = :WALL ; Material[:SemiMoltenRock] = :MAGMA
    ENUM[260] = :MagmaFlow ; NUME[:MagmaFlow] = 260 ; Caption[:MagmaFlow] = 'magma flow' ; Shape[:MagmaFlow] = :FLOOR ; Material[:MagmaFlow] = :MAGMA
    ENUM[261] = :SoilWall ; NUME[:SoilWall] = 261 ; Caption[:SoilWall] = 'soil wall' ; Shape[:SoilWall] = :WALL ; Material[:SoilWall] = :SOIL
    ENUM[262] = :GlowingBarrier ; NUME[:GlowingBarrier] = 262 ; Caption[:GlowingBarrier] = 'glowing barrier' ; Shape[:GlowingBarrier] = :WALL ; Material[:GlowingBarrier] = :HFS
    ENUM[263] = :GlowingFloor ; NUME[:GlowingFloor] = 263 ; Caption[:GlowingFloor] = 'glowing floor' ; Shape[:GlowingFloor] = :FLOOR ; Material[:GlowingFloor] = :HFS
    ENUM[265] = :LavaWallSmoothRD2 ; NUME[:LavaWallSmoothRD2] = 265 ; Caption[:LavaWallSmoothRD2] = 'smooth obsidian wall RD2' ; Shape[:LavaWallSmoothRD2] = :WALL ; Material[:LavaWallSmoothRD2] = :LAVA_STONE ; Special[:LavaWallSmoothRD2] = :SMOOTH ; Direction[:LavaWallSmoothRD2] = '--SS--E-'
    ENUM[266] = :LavaWallSmoothR2D ; NUME[:LavaWallSmoothR2D] = 266 ; Caption[:LavaWallSmoothR2D] = 'smooth obsidian wall R2D' ; Shape[:LavaWallSmoothR2D] = :WALL ; Material[:LavaWallSmoothR2D] = :LAVA_STONE ; Special[:LavaWallSmoothR2D] = :SMOOTH ; Direction[:LavaWallSmoothR2D] = '--S---EE'
    ENUM[267] = :LavaWallSmoothR2U ; NUME[:LavaWallSmoothR2U] = 267 ; Caption[:LavaWallSmoothR2U] = 'smooth obsidian wall R2U' ; Shape[:LavaWallSmoothR2U] = :WALL ; Material[:LavaWallSmoothR2U] = :LAVA_STONE ; Special[:LavaWallSmoothR2U] = :SMOOTH ; Direction[:LavaWallSmoothR2U] = 'N-----EE'
    ENUM[268] = :LavaWallSmoothRU2 ; NUME[:LavaWallSmoothRU2] = 268 ; Caption[:LavaWallSmoothRU2] = 'smooth obsidian wall RU2' ; Shape[:LavaWallSmoothRU2] = :WALL ; Material[:LavaWallSmoothRU2] = :LAVA_STONE ; Special[:LavaWallSmoothRU2] = :SMOOTH ; Direction[:LavaWallSmoothRU2] = 'NN----E-'
    ENUM[269] = :LavaWallSmoothL2U ; NUME[:LavaWallSmoothL2U] = 269 ; Caption[:LavaWallSmoothL2U] = 'smooth obsidian wall L2U' ; Shape[:LavaWallSmoothL2U] = :WALL ; Material[:LavaWallSmoothL2U] = :LAVA_STONE ; Special[:LavaWallSmoothL2U] = :SMOOTH ; Direction[:LavaWallSmoothL2U] = 'N---WW--'
    ENUM[270] = :LavaWallSmoothLU2 ; NUME[:LavaWallSmoothLU2] = 270 ; Caption[:LavaWallSmoothLU2] = 'smooth obsidian wall LU2' ; Shape[:LavaWallSmoothLU2] = :WALL ; Material[:LavaWallSmoothLU2] = :LAVA_STONE ; Special[:LavaWallSmoothLU2] = :SMOOTH ; Direction[:LavaWallSmoothLU2] = 'NN--W---'
    ENUM[271] = :LavaWallSmoothL2D ; NUME[:LavaWallSmoothL2D] = 271 ; Caption[:LavaWallSmoothL2D] = 'smooth obsidian wall L2D' ; Shape[:LavaWallSmoothL2D] = :WALL ; Material[:LavaWallSmoothL2D] = :LAVA_STONE ; Special[:LavaWallSmoothL2D] = :SMOOTH ; Direction[:LavaWallSmoothL2D] = '--S-WW--'
    ENUM[272] = :LavaWallSmoothLD2 ; NUME[:LavaWallSmoothLD2] = 272 ; Caption[:LavaWallSmoothLD2] = 'smooth obsidian wall LD2' ; Shape[:LavaWallSmoothLD2] = :WALL ; Material[:LavaWallSmoothLD2] = :LAVA_STONE ; Special[:LavaWallSmoothLD2] = :SMOOTH ; Direction[:LavaWallSmoothLD2] = '--SSW---'
    ENUM[273] = :LavaWallSmoothLRUD ; NUME[:LavaWallSmoothLRUD] = 273 ; Caption[:LavaWallSmoothLRUD] = 'smooth obsidian wall LRUD' ; Shape[:LavaWallSmoothLRUD] = :WALL ; Material[:LavaWallSmoothLRUD] = :LAVA_STONE ; Special[:LavaWallSmoothLRUD] = :SMOOTH ; Direction[:LavaWallSmoothLRUD] = 'N-S-W-E-'
    ENUM[274] = :LavaWallSmoothRUD ; NUME[:LavaWallSmoothRUD] = 274 ; Caption[:LavaWallSmoothRUD] = 'smooth obsidian wall RUD' ; Shape[:LavaWallSmoothRUD] = :WALL ; Material[:LavaWallSmoothRUD] = :LAVA_STONE ; Special[:LavaWallSmoothRUD] = :SMOOTH ; Direction[:LavaWallSmoothRUD] = 'N-S---E-'
    ENUM[275] = :LavaWallSmoothLRD ; NUME[:LavaWallSmoothLRD] = 275 ; Caption[:LavaWallSmoothLRD] = 'smooth obsidian wall LRD' ; Shape[:LavaWallSmoothLRD] = :WALL ; Material[:LavaWallSmoothLRD] = :LAVA_STONE ; Special[:LavaWallSmoothLRD] = :SMOOTH ; Direction[:LavaWallSmoothLRD] = '--S-W-E-'
    ENUM[276] = :LavaWallSmoothLRU ; NUME[:LavaWallSmoothLRU] = 276 ; Caption[:LavaWallSmoothLRU] = 'smooth obsidian wall LRU' ; Shape[:LavaWallSmoothLRU] = :WALL ; Material[:LavaWallSmoothLRU] = :LAVA_STONE ; Special[:LavaWallSmoothLRU] = :SMOOTH ; Direction[:LavaWallSmoothLRU] = 'N---W-E-'
    ENUM[277] = :LavaWallSmoothLUD ; NUME[:LavaWallSmoothLUD] = 277 ; Caption[:LavaWallSmoothLUD] = 'smooth obsidian wall LUD' ; Shape[:LavaWallSmoothLUD] = :WALL ; Material[:LavaWallSmoothLUD] = :LAVA_STONE ; Special[:LavaWallSmoothLUD] = :SMOOTH ; Direction[:LavaWallSmoothLUD] = 'N-S-W---'
    ENUM[278] = :LavaWallSmoothRD ; NUME[:LavaWallSmoothRD] = 278 ; Caption[:LavaWallSmoothRD] = 'smooth obsidian wall RD' ; Shape[:LavaWallSmoothRD] = :WALL ; Material[:LavaWallSmoothRD] = :LAVA_STONE ; Special[:LavaWallSmoothRD] = :SMOOTH ; Direction[:LavaWallSmoothRD] = '--S---E-'
    ENUM[279] = :LavaWallSmoothRU ; NUME[:LavaWallSmoothRU] = 279 ; Caption[:LavaWallSmoothRU] = 'smooth obsidian wall RU' ; Shape[:LavaWallSmoothRU] = :WALL ; Material[:LavaWallSmoothRU] = :LAVA_STONE ; Special[:LavaWallSmoothRU] = :SMOOTH ; Direction[:LavaWallSmoothRU] = 'N-----E-'
    ENUM[280] = :LavaWallSmoothLU ; NUME[:LavaWallSmoothLU] = 280 ; Caption[:LavaWallSmoothLU] = 'smooth obsidian wall LU' ; Shape[:LavaWallSmoothLU] = :WALL ; Material[:LavaWallSmoothLU] = :LAVA_STONE ; Special[:LavaWallSmoothLU] = :SMOOTH ; Direction[:LavaWallSmoothLU] = 'N---W---'
    ENUM[281] = :LavaWallSmoothLD ; NUME[:LavaWallSmoothLD] = 281 ; Caption[:LavaWallSmoothLD] = 'smooth obsidian wall LD' ; Shape[:LavaWallSmoothLD] = :WALL ; Material[:LavaWallSmoothLD] = :LAVA_STONE ; Special[:LavaWallSmoothLD] = :SMOOTH ; Direction[:LavaWallSmoothLD] = '--S-W---'
    ENUM[282] = :LavaWallSmoothUD ; NUME[:LavaWallSmoothUD] = 282 ; Caption[:LavaWallSmoothUD] = 'smooth obsidian wall UD' ; Shape[:LavaWallSmoothUD] = :WALL ; Material[:LavaWallSmoothUD] = :LAVA_STONE ; Special[:LavaWallSmoothUD] = :SMOOTH ; Direction[:LavaWallSmoothUD] = 'N-S-----'
    ENUM[283] = :LavaWallSmoothLR ; NUME[:LavaWallSmoothLR] = 283 ; Caption[:LavaWallSmoothLR] = 'smooth obsidian wall LR' ; Shape[:LavaWallSmoothLR] = :WALL ; Material[:LavaWallSmoothLR] = :LAVA_STONE ; Special[:LavaWallSmoothLR] = :SMOOTH ; Direction[:LavaWallSmoothLR] = '----W-E-'
    ENUM[284] = :FeatureWallSmoothRD2 ; NUME[:FeatureWallSmoothRD2] = 284 ; Caption[:FeatureWallSmoothRD2] = 'smooth featstone wall RD2' ; Shape[:FeatureWallSmoothRD2] = :WALL ; Material[:FeatureWallSmoothRD2] = :FEATURE ; Special[:FeatureWallSmoothRD2] = :SMOOTH ; Direction[:FeatureWallSmoothRD2] = '--SS--E-'
    ENUM[285] = :FeatureWallSmoothR2D ; NUME[:FeatureWallSmoothR2D] = 285 ; Caption[:FeatureWallSmoothR2D] = 'smooth featstone wall R2D' ; Shape[:FeatureWallSmoothR2D] = :WALL ; Material[:FeatureWallSmoothR2D] = :FEATURE ; Special[:FeatureWallSmoothR2D] = :SMOOTH ; Direction[:FeatureWallSmoothR2D] = '--S---EE'
    ENUM[286] = :FeatureWallSmoothR2U ; NUME[:FeatureWallSmoothR2U] = 286 ; Caption[:FeatureWallSmoothR2U] = 'smooth featstone wall R2U' ; Shape[:FeatureWallSmoothR2U] = :WALL ; Material[:FeatureWallSmoothR2U] = :FEATURE ; Special[:FeatureWallSmoothR2U] = :SMOOTH ; Direction[:FeatureWallSmoothR2U] = 'N-----EE'
    ENUM[287] = :FeatureWallSmoothRU2 ; NUME[:FeatureWallSmoothRU2] = 287 ; Caption[:FeatureWallSmoothRU2] = 'smooth featstone wall RU2' ; Shape[:FeatureWallSmoothRU2] = :WALL ; Material[:FeatureWallSmoothRU2] = :FEATURE ; Special[:FeatureWallSmoothRU2] = :SMOOTH ; Direction[:FeatureWallSmoothRU2] = 'NN----E-'
    ENUM[288] = :FeatureWallSmoothL2U ; NUME[:FeatureWallSmoothL2U] = 288 ; Caption[:FeatureWallSmoothL2U] = 'smooth featstone wall L2U' ; Shape[:FeatureWallSmoothL2U] = :WALL ; Material[:FeatureWallSmoothL2U] = :FEATURE ; Special[:FeatureWallSmoothL2U] = :SMOOTH ; Direction[:FeatureWallSmoothL2U] = 'N---WW--'
    ENUM[289] = :FeatureWallSmoothLU2 ; NUME[:FeatureWallSmoothLU2] = 289 ; Caption[:FeatureWallSmoothLU2] = 'smooth featstone wall LU2' ; Shape[:FeatureWallSmoothLU2] = :WALL ; Material[:FeatureWallSmoothLU2] = :FEATURE ; Special[:FeatureWallSmoothLU2] = :SMOOTH ; Direction[:FeatureWallSmoothLU2] = 'NN--W---'
    ENUM[290] = :FeatureWallSmoothL2D ; NUME[:FeatureWallSmoothL2D] = 290 ; Caption[:FeatureWallSmoothL2D] = 'smooth featstone wall L2D' ; Shape[:FeatureWallSmoothL2D] = :WALL ; Material[:FeatureWallSmoothL2D] = :FEATURE ; Special[:FeatureWallSmoothL2D] = :SMOOTH ; Direction[:FeatureWallSmoothL2D] = '--S-WW--'
    ENUM[291] = :FeatureWallSmoothLD2 ; NUME[:FeatureWallSmoothLD2] = 291 ; Caption[:FeatureWallSmoothLD2] = 'smooth featstone wall LD2' ; Shape[:FeatureWallSmoothLD2] = :WALL ; Material[:FeatureWallSmoothLD2] = :FEATURE ; Special[:FeatureWallSmoothLD2] = :SMOOTH ; Direction[:FeatureWallSmoothLD2] = '--SSW---'
    ENUM[292] = :FeatureWallSmoothLRUD ; NUME[:FeatureWallSmoothLRUD] = 292 ; Caption[:FeatureWallSmoothLRUD] = 'smooth featstone wall LRUD' ; Shape[:FeatureWallSmoothLRUD] = :WALL ; Material[:FeatureWallSmoothLRUD] = :FEATURE ; Special[:FeatureWallSmoothLRUD] = :SMOOTH ; Direction[:FeatureWallSmoothLRUD] = 'N-S-W-E-'
    ENUM[293] = :FeatureWallSmoothRUD ; NUME[:FeatureWallSmoothRUD] = 293 ; Caption[:FeatureWallSmoothRUD] = 'smooth featstone wall RUD' ; Shape[:FeatureWallSmoothRUD] = :WALL ; Material[:FeatureWallSmoothRUD] = :FEATURE ; Special[:FeatureWallSmoothRUD] = :SMOOTH ; Direction[:FeatureWallSmoothRUD] = 'N-S---E-'
    ENUM[294] = :FeatureWallSmoothLRD ; NUME[:FeatureWallSmoothLRD] = 294 ; Caption[:FeatureWallSmoothLRD] = 'smooth featstone wall LRD' ; Shape[:FeatureWallSmoothLRD] = :WALL ; Material[:FeatureWallSmoothLRD] = :FEATURE ; Special[:FeatureWallSmoothLRD] = :SMOOTH ; Direction[:FeatureWallSmoothLRD] = '--S-W-E-'
    ENUM[295] = :FeatureWallSmoothLRU ; NUME[:FeatureWallSmoothLRU] = 295 ; Caption[:FeatureWallSmoothLRU] = 'smooth featstone wall LRU' ; Shape[:FeatureWallSmoothLRU] = :WALL ; Material[:FeatureWallSmoothLRU] = :FEATURE ; Special[:FeatureWallSmoothLRU] = :SMOOTH ; Direction[:FeatureWallSmoothLRU] = 'N---W-E-'
    ENUM[296] = :FeatureWallSmoothLUD ; NUME[:FeatureWallSmoothLUD] = 296 ; Caption[:FeatureWallSmoothLUD] = 'smooth featstone wall LUD' ; Shape[:FeatureWallSmoothLUD] = :WALL ; Material[:FeatureWallSmoothLUD] = :FEATURE ; Special[:FeatureWallSmoothLUD] = :SMOOTH ; Direction[:FeatureWallSmoothLUD] = 'N-S-W---'
    ENUM[297] = :FeatureWallSmoothRD ; NUME[:FeatureWallSmoothRD] = 297 ; Caption[:FeatureWallSmoothRD] = 'smooth featstone wall RD' ; Shape[:FeatureWallSmoothRD] = :WALL ; Material[:FeatureWallSmoothRD] = :FEATURE ; Special[:FeatureWallSmoothRD] = :SMOOTH ; Direction[:FeatureWallSmoothRD] = '--S---E-'
    ENUM[298] = :FeatureWallSmoothRU ; NUME[:FeatureWallSmoothRU] = 298 ; Caption[:FeatureWallSmoothRU] = 'smooth featstone wall RU' ; Shape[:FeatureWallSmoothRU] = :WALL ; Material[:FeatureWallSmoothRU] = :FEATURE ; Special[:FeatureWallSmoothRU] = :SMOOTH ; Direction[:FeatureWallSmoothRU] = 'N-----E-'
    ENUM[299] = :FeatureWallSmoothLU ; NUME[:FeatureWallSmoothLU] = 299 ; Caption[:FeatureWallSmoothLU] = 'smooth featstone wall LU' ; Shape[:FeatureWallSmoothLU] = :WALL ; Material[:FeatureWallSmoothLU] = :FEATURE ; Special[:FeatureWallSmoothLU] = :SMOOTH ; Direction[:FeatureWallSmoothLU] = 'N---W---'
    ENUM[300] = :FeatureWallSmoothLD ; NUME[:FeatureWallSmoothLD] = 300 ; Caption[:FeatureWallSmoothLD] = 'smooth featstone wall LD' ; Shape[:FeatureWallSmoothLD] = :WALL ; Material[:FeatureWallSmoothLD] = :FEATURE ; Special[:FeatureWallSmoothLD] = :SMOOTH ; Direction[:FeatureWallSmoothLD] = '--S-W---'
    ENUM[301] = :FeatureWallSmoothUD ; NUME[:FeatureWallSmoothUD] = 301 ; Caption[:FeatureWallSmoothUD] = 'smooth featstone wall UD' ; Shape[:FeatureWallSmoothUD] = :WALL ; Material[:FeatureWallSmoothUD] = :FEATURE ; Special[:FeatureWallSmoothUD] = :SMOOTH ; Direction[:FeatureWallSmoothUD] = 'N-S-----'
    ENUM[302] = :FeatureWallSmoothLR ; NUME[:FeatureWallSmoothLR] = 302 ; Caption[:FeatureWallSmoothLR] = 'smooth featstone wall LR' ; Shape[:FeatureWallSmoothLR] = :WALL ; Material[:FeatureWallSmoothLR] = :FEATURE ; Special[:FeatureWallSmoothLR] = :SMOOTH ; Direction[:FeatureWallSmoothLR] = '----W-E-'
    ENUM[303] = :StoneWallSmoothRD2 ; NUME[:StoneWallSmoothRD2] = 303 ; Caption[:StoneWallSmoothRD2] = 'smooth stone wall RD2' ; Shape[:StoneWallSmoothRD2] = :WALL ; Material[:StoneWallSmoothRD2] = :STONE ; Special[:StoneWallSmoothRD2] = :SMOOTH ; Direction[:StoneWallSmoothRD2] = '--SS--E-'
    ENUM[304] = :StoneWallSmoothR2D ; NUME[:StoneWallSmoothR2D] = 304 ; Caption[:StoneWallSmoothR2D] = 'smooth stone wall R2D' ; Shape[:StoneWallSmoothR2D] = :WALL ; Material[:StoneWallSmoothR2D] = :STONE ; Special[:StoneWallSmoothR2D] = :SMOOTH ; Direction[:StoneWallSmoothR2D] = '--S---EE'
    ENUM[305] = :StoneWallSmoothR2U ; NUME[:StoneWallSmoothR2U] = 305 ; Caption[:StoneWallSmoothR2U] = 'smooth stone wall R2U' ; Shape[:StoneWallSmoothR2U] = :WALL ; Material[:StoneWallSmoothR2U] = :STONE ; Special[:StoneWallSmoothR2U] = :SMOOTH ; Direction[:StoneWallSmoothR2U] = 'N-----EE'
    ENUM[306] = :StoneWallSmoothRU2 ; NUME[:StoneWallSmoothRU2] = 306 ; Caption[:StoneWallSmoothRU2] = 'smooth stone wall RU2' ; Shape[:StoneWallSmoothRU2] = :WALL ; Material[:StoneWallSmoothRU2] = :STONE ; Special[:StoneWallSmoothRU2] = :SMOOTH ; Direction[:StoneWallSmoothRU2] = 'NN----E-'
    ENUM[307] = :StoneWallSmoothL2U ; NUME[:StoneWallSmoothL2U] = 307 ; Caption[:StoneWallSmoothL2U] = 'smooth stone wall L2U' ; Shape[:StoneWallSmoothL2U] = :WALL ; Material[:StoneWallSmoothL2U] = :STONE ; Special[:StoneWallSmoothL2U] = :SMOOTH ; Direction[:StoneWallSmoothL2U] = 'N---WW--'
    ENUM[308] = :StoneWallSmoothLU2 ; NUME[:StoneWallSmoothLU2] = 308 ; Caption[:StoneWallSmoothLU2] = 'smooth stone wall LU2' ; Shape[:StoneWallSmoothLU2] = :WALL ; Material[:StoneWallSmoothLU2] = :STONE ; Special[:StoneWallSmoothLU2] = :SMOOTH ; Direction[:StoneWallSmoothLU2] = 'NN--W---'
    ENUM[309] = :StoneWallSmoothL2D ; NUME[:StoneWallSmoothL2D] = 309 ; Caption[:StoneWallSmoothL2D] = 'smooth stone wall L2D' ; Shape[:StoneWallSmoothL2D] = :WALL ; Material[:StoneWallSmoothL2D] = :STONE ; Special[:StoneWallSmoothL2D] = :SMOOTH ; Direction[:StoneWallSmoothL2D] = '--S-WW--'
    ENUM[310] = :StoneWallSmoothLD2 ; NUME[:StoneWallSmoothLD2] = 310 ; Caption[:StoneWallSmoothLD2] = 'smooth stone wall LD2' ; Shape[:StoneWallSmoothLD2] = :WALL ; Material[:StoneWallSmoothLD2] = :STONE ; Special[:StoneWallSmoothLD2] = :SMOOTH ; Direction[:StoneWallSmoothLD2] = '--SSW---'
    ENUM[311] = :StoneWallSmoothLRUD ; NUME[:StoneWallSmoothLRUD] = 311 ; Caption[:StoneWallSmoothLRUD] = 'smooth stone wall LRUD' ; Shape[:StoneWallSmoothLRUD] = :WALL ; Material[:StoneWallSmoothLRUD] = :STONE ; Special[:StoneWallSmoothLRUD] = :SMOOTH ; Direction[:StoneWallSmoothLRUD] = 'N-S-W-E-'
    ENUM[312] = :StoneWallSmoothRUD ; NUME[:StoneWallSmoothRUD] = 312 ; Caption[:StoneWallSmoothRUD] = 'smooth stone wall RUD' ; Shape[:StoneWallSmoothRUD] = :WALL ; Material[:StoneWallSmoothRUD] = :STONE ; Special[:StoneWallSmoothRUD] = :SMOOTH ; Direction[:StoneWallSmoothRUD] = 'N-S---E-'
    ENUM[313] = :StoneWallSmoothLRD ; NUME[:StoneWallSmoothLRD] = 313 ; Caption[:StoneWallSmoothLRD] = 'smooth stone wall LRD' ; Shape[:StoneWallSmoothLRD] = :WALL ; Material[:StoneWallSmoothLRD] = :STONE ; Special[:StoneWallSmoothLRD] = :SMOOTH ; Direction[:StoneWallSmoothLRD] = '--S-W-E-'
    ENUM[314] = :StoneWallSmoothLRU ; NUME[:StoneWallSmoothLRU] = 314 ; Caption[:StoneWallSmoothLRU] = 'smooth stone wall LRU' ; Shape[:StoneWallSmoothLRU] = :WALL ; Material[:StoneWallSmoothLRU] = :STONE ; Special[:StoneWallSmoothLRU] = :SMOOTH ; Direction[:StoneWallSmoothLRU] = 'N---W-E-'
    ENUM[315] = :StoneWallSmoothLUD ; NUME[:StoneWallSmoothLUD] = 315 ; Caption[:StoneWallSmoothLUD] = 'smooth stone wall LUD' ; Shape[:StoneWallSmoothLUD] = :WALL ; Material[:StoneWallSmoothLUD] = :STONE ; Special[:StoneWallSmoothLUD] = :SMOOTH ; Direction[:StoneWallSmoothLUD] = 'N-S-W---'
    ENUM[316] = :StoneWallSmoothRD ; NUME[:StoneWallSmoothRD] = 316 ; Caption[:StoneWallSmoothRD] = 'smooth stone wall RD' ; Shape[:StoneWallSmoothRD] = :WALL ; Material[:StoneWallSmoothRD] = :STONE ; Special[:StoneWallSmoothRD] = :SMOOTH ; Direction[:StoneWallSmoothRD] = '--S---E-'
    ENUM[317] = :StoneWallSmoothRU ; NUME[:StoneWallSmoothRU] = 317 ; Caption[:StoneWallSmoothRU] = 'smooth stone wall RU' ; Shape[:StoneWallSmoothRU] = :WALL ; Material[:StoneWallSmoothRU] = :STONE ; Special[:StoneWallSmoothRU] = :SMOOTH ; Direction[:StoneWallSmoothRU] = 'N-----E-'
    ENUM[318] = :StoneWallSmoothLU ; NUME[:StoneWallSmoothLU] = 318 ; Caption[:StoneWallSmoothLU] = 'smooth stone wall LU' ; Shape[:StoneWallSmoothLU] = :WALL ; Material[:StoneWallSmoothLU] = :STONE ; Special[:StoneWallSmoothLU] = :SMOOTH ; Direction[:StoneWallSmoothLU] = 'N---W---'
    ENUM[319] = :StoneWallSmoothLD ; NUME[:StoneWallSmoothLD] = 319 ; Caption[:StoneWallSmoothLD] = 'smooth stone wall LD' ; Shape[:StoneWallSmoothLD] = :WALL ; Material[:StoneWallSmoothLD] = :STONE ; Special[:StoneWallSmoothLD] = :SMOOTH ; Direction[:StoneWallSmoothLD] = '--S-W---'
    ENUM[320] = :StoneWallSmoothUD ; NUME[:StoneWallSmoothUD] = 320 ; Caption[:StoneWallSmoothUD] = 'smooth stone wall UD' ; Shape[:StoneWallSmoothUD] = :WALL ; Material[:StoneWallSmoothUD] = :STONE ; Special[:StoneWallSmoothUD] = :SMOOTH ; Direction[:StoneWallSmoothUD] = 'N-S-----'
    ENUM[321] = :StoneWallSmoothLR ; NUME[:StoneWallSmoothLR] = 321 ; Caption[:StoneWallSmoothLR] = 'smooth stone wall LR' ; Shape[:StoneWallSmoothLR] = :WALL ; Material[:StoneWallSmoothLR] = :STONE ; Special[:StoneWallSmoothLR] = :SMOOTH ; Direction[:StoneWallSmoothLR] = '----W-E-'
    ENUM[322] = :LavaFortification ; NUME[:LavaFortification] = 322 ; Caption[:LavaFortification] = 'obsidian fortification' ; Shape[:LavaFortification] = :FORTIFICATION ; Material[:LavaFortification] = :LAVA_STONE
    ENUM[323] = :FeatureFortification ; NUME[:FeatureFortification] = 323 ; Caption[:FeatureFortification] = 'featstone fortification' ; Shape[:FeatureFortification] = :FORTIFICATION ; Material[:FeatureFortification] = :FEATURE
    ENUM[324] = :LavaWallWorn1 ; NUME[:LavaWallWorn1] = 324 ; Caption[:LavaWallWorn1] = 'worn 1 obsidian wall' ; Shape[:LavaWallWorn1] = :WALL ; Material[:LavaWallWorn1] = :LAVA_STONE ; Special[:LavaWallWorn1] = :WORN_1
    ENUM[325] = :LavaWallWorn2 ; NUME[:LavaWallWorn2] = 325 ; Caption[:LavaWallWorn2] = 'worn 2 obsidian wall' ; Shape[:LavaWallWorn2] = :WALL ; Material[:LavaWallWorn2] = :LAVA_STONE ; Special[:LavaWallWorn2] = :WORN_2
    ENUM[326] = :LavaWallWorn3 ; NUME[:LavaWallWorn3] = 326 ; Caption[:LavaWallWorn3] = 'worn 3 obsidian wall' ; Shape[:LavaWallWorn3] = :WALL ; Material[:LavaWallWorn3] = :LAVA_STONE ; Special[:LavaWallWorn3] = :WORN_3
    ENUM[327] = :LavaWall ; NUME[:LavaWall] = 327 ; Caption[:LavaWall] = 'obsidian wall' ; Shape[:LavaWall] = :WALL ; Material[:LavaWall] = :LAVA_STONE ; Special[:LavaWall] = :NORMAL
    ENUM[328] = :FeatureWallWorn1 ; NUME[:FeatureWallWorn1] = 328 ; Caption[:FeatureWallWorn1] = 'worn 1 featstone wall' ; Shape[:FeatureWallWorn1] = :WALL ; Material[:FeatureWallWorn1] = :FEATURE ; Special[:FeatureWallWorn1] = :WORN_1
    ENUM[329] = :FeatureWallWorn2 ; NUME[:FeatureWallWorn2] = 329 ; Caption[:FeatureWallWorn2] = 'worn 2 featstone wall' ; Shape[:FeatureWallWorn2] = :WALL ; Material[:FeatureWallWorn2] = :FEATURE ; Special[:FeatureWallWorn2] = :WORN_2
    ENUM[330] = :FeatureWallWorn3 ; NUME[:FeatureWallWorn3] = 330 ; Caption[:FeatureWallWorn3] = 'worn 3 featstone wall' ; Shape[:FeatureWallWorn3] = :WALL ; Material[:FeatureWallWorn3] = :FEATURE ; Special[:FeatureWallWorn3] = :WORN_3
    ENUM[331] = :FeatureWall ; NUME[:FeatureWall] = 331 ; Caption[:FeatureWall] = 'featstone wall' ; Shape[:FeatureWall] = :WALL ; Material[:FeatureWall] = :FEATURE ; Special[:FeatureWall] = :NORMAL
    ENUM[332] = :StoneFloor1 ; NUME[:StoneFloor1] = 332 ; Caption[:StoneFloor1] = 'stone floor' ; Shape[:StoneFloor1] = :FLOOR ; Material[:StoneFloor1] = :STONE ; Variant[:StoneFloor1] = :VAR_1 ; Special[:StoneFloor1] = :NORMAL
    ENUM[333] = :StoneFloor2 ; NUME[:StoneFloor2] = 333 ; Caption[:StoneFloor2] = 'stone floor' ; Shape[:StoneFloor2] = :FLOOR ; Material[:StoneFloor2] = :STONE ; Variant[:StoneFloor2] = :VAR_2 ; Special[:StoneFloor2] = :NORMAL
    ENUM[334] = :StoneFloor3 ; NUME[:StoneFloor3] = 334 ; Caption[:StoneFloor3] = 'stone floor' ; Shape[:StoneFloor3] = :FLOOR ; Material[:StoneFloor3] = :STONE ; Variant[:StoneFloor3] = :VAR_3 ; Special[:StoneFloor3] = :NORMAL
    ENUM[335] = :StoneFloor4 ; NUME[:StoneFloor4] = 335 ; Caption[:StoneFloor4] = 'stone floor' ; Shape[:StoneFloor4] = :FLOOR ; Material[:StoneFloor4] = :STONE ; Variant[:StoneFloor4] = :VAR_4 ; Special[:StoneFloor4] = :NORMAL
    ENUM[336] = :LavaFloor1 ; NUME[:LavaFloor1] = 336 ; Caption[:LavaFloor1] = 'obsidian floor' ; Shape[:LavaFloor1] = :FLOOR ; Material[:LavaFloor1] = :LAVA_STONE ; Variant[:LavaFloor1] = :VAR_1 ; Special[:LavaFloor1] = :NORMAL
    ENUM[337] = :LavaFloor2 ; NUME[:LavaFloor2] = 337 ; Caption[:LavaFloor2] = 'obsidian floor' ; Shape[:LavaFloor2] = :FLOOR ; Material[:LavaFloor2] = :LAVA_STONE ; Variant[:LavaFloor2] = :VAR_2 ; Special[:LavaFloor2] = :NORMAL
    ENUM[338] = :LavaFloor3 ; NUME[:LavaFloor3] = 338 ; Caption[:LavaFloor3] = 'obsidian floor' ; Shape[:LavaFloor3] = :FLOOR ; Material[:LavaFloor3] = :LAVA_STONE ; Variant[:LavaFloor3] = :VAR_3 ; Special[:LavaFloor3] = :NORMAL
    ENUM[339] = :LavaFloor4 ; NUME[:LavaFloor4] = 339 ; Caption[:LavaFloor4] = 'obsidian floor' ; Shape[:LavaFloor4] = :FLOOR ; Material[:LavaFloor4] = :LAVA_STONE ; Variant[:LavaFloor4] = :VAR_4 ; Special[:LavaFloor4] = :NORMAL
    ENUM[340] = :FeatureFloor1 ; NUME[:FeatureFloor1] = 340 ; Caption[:FeatureFloor1] = 'featstone floor' ; Shape[:FeatureFloor1] = :FLOOR ; Material[:FeatureFloor1] = :FEATURE ; Variant[:FeatureFloor1] = :VAR_1 ; Special[:FeatureFloor1] = :NORMAL
    ENUM[341] = :FeatureFloor2 ; NUME[:FeatureFloor2] = 341 ; Caption[:FeatureFloor2] = 'featstone floor' ; Shape[:FeatureFloor2] = :FLOOR ; Material[:FeatureFloor2] = :FEATURE ; Variant[:FeatureFloor2] = :VAR_2 ; Special[:FeatureFloor2] = :NORMAL
    ENUM[342] = :FeatureFloor3 ; NUME[:FeatureFloor3] = 342 ; Caption[:FeatureFloor3] = 'featstone floor' ; Shape[:FeatureFloor3] = :FLOOR ; Material[:FeatureFloor3] = :FEATURE ; Variant[:FeatureFloor3] = :VAR_3 ; Special[:FeatureFloor3] = :NORMAL
    ENUM[343] = :FeatureFloor4 ; NUME[:FeatureFloor4] = 343 ; Caption[:FeatureFloor4] = 'featstone floor' ; Shape[:FeatureFloor4] = :FLOOR ; Material[:FeatureFloor4] = :FEATURE ; Variant[:FeatureFloor4] = :VAR_4 ; Special[:FeatureFloor4] = :NORMAL
    ENUM[344] = :GrassDarkFloor1 ; NUME[:GrassDarkFloor1] = 344 ; Caption[:GrassDarkFloor1] = 'dark grass' ; Shape[:GrassDarkFloor1] = :FLOOR ; Material[:GrassDarkFloor1] = :GRASS_DARK ; Variant[:GrassDarkFloor1] = :VAR_1
    ENUM[345] = :GrassDarkFloor2 ; NUME[:GrassDarkFloor2] = 345 ; Caption[:GrassDarkFloor2] = 'dark grass' ; Shape[:GrassDarkFloor2] = :FLOOR ; Material[:GrassDarkFloor2] = :GRASS_DARK ; Variant[:GrassDarkFloor2] = :VAR_2
    ENUM[346] = :GrassDarkFloor3 ; NUME[:GrassDarkFloor3] = 346 ; Caption[:GrassDarkFloor3] = 'dark grass' ; Shape[:GrassDarkFloor3] = :FLOOR ; Material[:GrassDarkFloor3] = :GRASS_DARK ; Variant[:GrassDarkFloor3] = :VAR_3
    ENUM[347] = :GrassDarkFloor4 ; NUME[:GrassDarkFloor4] = 347 ; Caption[:GrassDarkFloor4] = 'dark grass' ; Shape[:GrassDarkFloor4] = :FLOOR ; Material[:GrassDarkFloor4] = :GRASS_DARK ; Variant[:GrassDarkFloor4] = :VAR_4
    ENUM[348] = :SoilFloor1 ; NUME[:SoilFloor1] = 348 ; Caption[:SoilFloor1] = 'soil floor' ; Shape[:SoilFloor1] = :FLOOR ; Material[:SoilFloor1] = :SOIL ; Variant[:SoilFloor1] = :VAR_1 ; Special[:SoilFloor1] = :NORMAL
    ENUM[349] = :SoilFloor2 ; NUME[:SoilFloor2] = 349 ; Caption[:SoilFloor2] = 'soil floor' ; Shape[:SoilFloor2] = :FLOOR ; Material[:SoilFloor2] = :SOIL ; Variant[:SoilFloor2] = :VAR_2 ; Special[:SoilFloor2] = :NORMAL
    ENUM[350] = :SoilFloor3 ; NUME[:SoilFloor3] = 350 ; Caption[:SoilFloor3] = 'soil floor' ; Shape[:SoilFloor3] = :FLOOR ; Material[:SoilFloor3] = :SOIL ; Variant[:SoilFloor3] = :VAR_3 ; Special[:SoilFloor3] = :NORMAL
    ENUM[351] = :SoilFloor4 ; NUME[:SoilFloor4] = 351 ; Caption[:SoilFloor4] = 'soil floor' ; Shape[:SoilFloor4] = :FLOOR ; Material[:SoilFloor4] = :SOIL ; Variant[:SoilFloor4] = :VAR_4 ; Special[:SoilFloor4] = :NORMAL
    ENUM[352] = :SoilWetFloor1 ; NUME[:SoilWetFloor1] = 352 ; Caption[:SoilWetFloor1] = 'wet soil floor' ; Shape[:SoilWetFloor1] = :FLOOR ; Material[:SoilWetFloor1] = :SOIL ; Variant[:SoilWetFloor1] = :VAR_1 ; Special[:SoilWetFloor1] = :WET
    ENUM[353] = :SoilWetFloor2 ; NUME[:SoilWetFloor2] = 353 ; Caption[:SoilWetFloor2] = 'wet soil floor' ; Shape[:SoilWetFloor2] = :FLOOR ; Material[:SoilWetFloor2] = :SOIL ; Variant[:SoilWetFloor2] = :VAR_2 ; Special[:SoilWetFloor2] = :WET
    ENUM[354] = :SoilWetFloor3 ; NUME[:SoilWetFloor3] = 354 ; Caption[:SoilWetFloor3] = 'wet soil floor' ; Shape[:SoilWetFloor3] = :FLOOR ; Material[:SoilWetFloor3] = :SOIL ; Variant[:SoilWetFloor3] = :VAR_3 ; Special[:SoilWetFloor3] = :WET
    ENUM[355] = :SoilWetFloor4 ; NUME[:SoilWetFloor4] = 355 ; Caption[:SoilWetFloor4] = 'wet soil floor' ; Shape[:SoilWetFloor4] = :FLOOR ; Material[:SoilWetFloor4] = :SOIL ; Variant[:SoilWetFloor4] = :VAR_4 ; Special[:SoilWetFloor4] = :WET
    ENUM[356] = :FrozenFortification ; NUME[:FrozenFortification] = 356 ; Caption[:FrozenFortification] = 'ice fortification' ; Shape[:FrozenFortification] = :FORTIFICATION ; Material[:FrozenFortification] = :FROZEN_LIQUID
    ENUM[357] = :FrozenWallWorn1 ; NUME[:FrozenWallWorn1] = 357 ; Caption[:FrozenWallWorn1] = 'worn 1 ice wall' ; Shape[:FrozenWallWorn1] = :WALL ; Material[:FrozenWallWorn1] = :FROZEN_LIQUID ; Special[:FrozenWallWorn1] = :WORN_1
    ENUM[358] = :FrozenWallWorn2 ; NUME[:FrozenWallWorn2] = 358 ; Caption[:FrozenWallWorn2] = 'worn 2 ice wall' ; Shape[:FrozenWallWorn2] = :WALL ; Material[:FrozenWallWorn2] = :FROZEN_LIQUID ; Special[:FrozenWallWorn2] = :WORN_2
    ENUM[359] = :FrozenWallWorn3 ; NUME[:FrozenWallWorn3] = 359 ; Caption[:FrozenWallWorn3] = 'worn 3 ice wall' ; Shape[:FrozenWallWorn3] = :WALL ; Material[:FrozenWallWorn3] = :FROZEN_LIQUID ; Special[:FrozenWallWorn3] = :WORN_3
    ENUM[360] = :FrozenWall ; NUME[:FrozenWall] = 360 ; Caption[:FrozenWall] = 'ice wall' ; Shape[:FrozenWall] = :WALL ; Material[:FrozenWall] = :FROZEN_LIQUID ; Special[:FrozenWall] = :NORMAL
    ENUM[361] = :RiverN ; NUME[:RiverN] = 361 ; Caption[:RiverN] = 'river N' ; Shape[:RiverN] = :FLOOR ; Material[:RiverN] = :RIVER ; Special[:RiverN] = :NORMAL ; Direction[:RiverN] = 'N'
    ENUM[362] = :RiverS ; NUME[:RiverS] = 362 ; Caption[:RiverS] = 'river S' ; Shape[:RiverS] = :FLOOR ; Material[:RiverS] = :RIVER ; Special[:RiverS] = :NORMAL ; Direction[:RiverS] = 'S'
    ENUM[363] = :RiverE ; NUME[:RiverE] = 363 ; Caption[:RiverE] = 'river E' ; Shape[:RiverE] = :FLOOR ; Material[:RiverE] = :RIVER ; Special[:RiverE] = :NORMAL ; Direction[:RiverE] = 'E'
    ENUM[364] = :RiverW ; NUME[:RiverW] = 364 ; Caption[:RiverW] = 'river W' ; Shape[:RiverW] = :FLOOR ; Material[:RiverW] = :RIVER ; Special[:RiverW] = :NORMAL ; Direction[:RiverW] = 'W'
    ENUM[365] = :RiverNW ; NUME[:RiverNW] = 365 ; Caption[:RiverNW] = 'river NW' ; Shape[:RiverNW] = :FLOOR ; Material[:RiverNW] = :RIVER ; Special[:RiverNW] = :NORMAL ; Direction[:RiverNW] = 'NW'
    ENUM[366] = :RiverNE ; NUME[:RiverNE] = 366 ; Caption[:RiverNE] = 'river NE' ; Shape[:RiverNE] = :FLOOR ; Material[:RiverNE] = :RIVER ; Special[:RiverNE] = :NORMAL ; Direction[:RiverNE] = 'NE'
    ENUM[367] = :RiverSW ; NUME[:RiverSW] = 367 ; Caption[:RiverSW] = 'river SW' ; Shape[:RiverSW] = :FLOOR ; Material[:RiverSW] = :RIVER ; Special[:RiverSW] = :NORMAL ; Direction[:RiverSW] = 'SW'
    ENUM[368] = :RiverSE ; NUME[:RiverSE] = 368 ; Caption[:RiverSE] = 'river SE' ; Shape[:RiverSE] = :FLOOR ; Material[:RiverSE] = :RIVER ; Special[:RiverSE] = :NORMAL ; Direction[:RiverSE] = 'SE'
    ENUM[369] = :BrookN ; NUME[:BrookN] = 369 ; Caption[:BrookN] = 'brook bed N' ; Shape[:BrookN] = :BROOK_BED ; Material[:BrookN] = :BROOK ; Direction[:BrookN] = 'N'
    ENUM[370] = :BrookS ; NUME[:BrookS] = 370 ; Caption[:BrookS] = 'brook bed S' ; Shape[:BrookS] = :BROOK_BED ; Material[:BrookS] = :BROOK ; Direction[:BrookS] = 'S'
    ENUM[371] = :BrookE ; NUME[:BrookE] = 371 ; Caption[:BrookE] = 'brook bed E' ; Shape[:BrookE] = :BROOK_BED ; Material[:BrookE] = :BROOK ; Direction[:BrookE] = 'E'
    ENUM[372] = :BrookW ; NUME[:BrookW] = 372 ; Caption[:BrookW] = 'brook bed W' ; Shape[:BrookW] = :BROOK_BED ; Material[:BrookW] = :BROOK ; Direction[:BrookW] = 'W'
    ENUM[373] = :BrookNW ; NUME[:BrookNW] = 373 ; Caption[:BrookNW] = 'brook bed NW' ; Shape[:BrookNW] = :BROOK_BED ; Material[:BrookNW] = :BROOK ; Direction[:BrookNW] = 'NW'
    ENUM[374] = :BrookNE ; NUME[:BrookNE] = 374 ; Caption[:BrookNE] = 'brook bed NE' ; Shape[:BrookNE] = :BROOK_BED ; Material[:BrookNE] = :BROOK ; Direction[:BrookNE] = 'NE'
    ENUM[375] = :BrookSW ; NUME[:BrookSW] = 375 ; Caption[:BrookSW] = 'brook bed SW' ; Shape[:BrookSW] = :BROOK_BED ; Material[:BrookSW] = :BROOK ; Direction[:BrookSW] = 'SW'
    ENUM[376] = :BrookSE ; NUME[:BrookSE] = 376 ; Caption[:BrookSE] = 'brook bed SE' ; Shape[:BrookSE] = :BROOK_BED ; Material[:BrookSE] = :BROOK ; Direction[:BrookSE] = 'SE'
    ENUM[377] = :BrookTop ; NUME[:BrookTop] = 377 ; Caption[:BrookTop] = 'brook top' ; Shape[:BrookTop] = :BROOK_TOP ; Material[:BrookTop] = :BROOK
    ENUM[383] = :GrassDryFloor1 ; NUME[:GrassDryFloor1] = 383 ; Caption[:GrassDryFloor1] = 'dry grass' ; Shape[:GrassDryFloor1] = :FLOOR ; Material[:GrassDryFloor1] = :GRASS_DRY ; Variant[:GrassDryFloor1] = :VAR_1
    ENUM[384] = :GrassDryFloor2 ; NUME[:GrassDryFloor2] = 384 ; Caption[:GrassDryFloor2] = 'dry grass' ; Shape[:GrassDryFloor2] = :FLOOR ; Material[:GrassDryFloor2] = :GRASS_DRY ; Variant[:GrassDryFloor2] = :VAR_2
    ENUM[385] = :GrassDryFloor3 ; NUME[:GrassDryFloor3] = 385 ; Caption[:GrassDryFloor3] = 'dry grass' ; Shape[:GrassDryFloor3] = :FLOOR ; Material[:GrassDryFloor3] = :GRASS_DRY ; Variant[:GrassDryFloor3] = :VAR_3
    ENUM[386] = :GrassDryFloor4 ; NUME[:GrassDryFloor4] = 386 ; Caption[:GrassDryFloor4] = 'dry grass' ; Shape[:GrassDryFloor4] = :FLOOR ; Material[:GrassDryFloor4] = :GRASS_DRY ; Variant[:GrassDryFloor4] = :VAR_4
    ENUM[388] = :SaplingDead ; NUME[:SaplingDead] = 388 ; Caption[:SaplingDead] = 'dead sapling' ; Shape[:SaplingDead] = :SAPLING ; Material[:SaplingDead] = :PLANT ; Special[:SaplingDead] = :DEAD
    ENUM[389] = :ShrubDead ; NUME[:ShrubDead] = 389 ; Caption[:ShrubDead] = 'dead shrub' ; Shape[:ShrubDead] = :SHRUB ; Material[:ShrubDead] = :PLANT ; Special[:ShrubDead] = :DEAD
    ENUM[390] = :GrassDeadFloor1 ; NUME[:GrassDeadFloor1] = 390 ; Caption[:GrassDeadFloor1] = 'dead grass' ; Shape[:GrassDeadFloor1] = :FLOOR ; Material[:GrassDeadFloor1] = :GRASS_DEAD ; Variant[:GrassDeadFloor1] = :VAR_1
    ENUM[391] = :GrassDeadFloor2 ; NUME[:GrassDeadFloor2] = 391 ; Caption[:GrassDeadFloor2] = 'dead grass' ; Shape[:GrassDeadFloor2] = :FLOOR ; Material[:GrassDeadFloor2] = :GRASS_DEAD ; Variant[:GrassDeadFloor2] = :VAR_2
    ENUM[392] = :GrassDeadFloor3 ; NUME[:GrassDeadFloor3] = 392 ; Caption[:GrassDeadFloor3] = 'dead grass' ; Shape[:GrassDeadFloor3] = :FLOOR ; Material[:GrassDeadFloor3] = :GRASS_DEAD ; Variant[:GrassDeadFloor3] = :VAR_3
    ENUM[393] = :GrassDeadFloor4 ; NUME[:GrassDeadFloor4] = 393 ; Caption[:GrassDeadFloor4] = 'dead grass' ; Shape[:GrassDeadFloor4] = :FLOOR ; Material[:GrassDeadFloor4] = :GRASS_DEAD ; Variant[:GrassDeadFloor4] = :VAR_4
    ENUM[394] = :GrassLightFloor1 ; NUME[:GrassLightFloor1] = 394 ; Caption[:GrassLightFloor1] = 'light grass' ; Shape[:GrassLightFloor1] = :FLOOR ; Material[:GrassLightFloor1] = :GRASS_LIGHT ; Variant[:GrassLightFloor1] = :VAR_1
    ENUM[395] = :GrassLightFloor2 ; NUME[:GrassLightFloor2] = 395 ; Caption[:GrassLightFloor2] = 'light grass' ; Shape[:GrassLightFloor2] = :FLOOR ; Material[:GrassLightFloor2] = :GRASS_LIGHT ; Variant[:GrassLightFloor2] = :VAR_2
    ENUM[396] = :GrassLightFloor3 ; NUME[:GrassLightFloor3] = 396 ; Caption[:GrassLightFloor3] = 'light grass' ; Shape[:GrassLightFloor3] = :FLOOR ; Material[:GrassLightFloor3] = :GRASS_LIGHT ; Variant[:GrassLightFloor3] = :VAR_3
    ENUM[397] = :GrassLightFloor4 ; NUME[:GrassLightFloor4] = 397 ; Caption[:GrassLightFloor4] = 'light grass' ; Shape[:GrassLightFloor4] = :FLOOR ; Material[:GrassLightFloor4] = :GRASS_LIGHT ; Variant[:GrassLightFloor4] = :VAR_4
    ENUM[398] = :StoneBoulder ; NUME[:StoneBoulder] = 398 ; Caption[:StoneBoulder] = 'boulder' ; Shape[:StoneBoulder] = :BOULDER ; Material[:StoneBoulder] = :STONE
    ENUM[399] = :LavaBoulder ; NUME[:LavaBoulder] = 399 ; Caption[:LavaBoulder] = 'obsidian boulder' ; Shape[:LavaBoulder] = :BOULDER ; Material[:LavaBoulder] = :LAVA_STONE
    ENUM[400] = :FeatureBoulder ; NUME[:FeatureBoulder] = 400 ; Caption[:FeatureBoulder] = 'featstone boulder' ; Shape[:FeatureBoulder] = :BOULDER ; Material[:FeatureBoulder] = :FEATURE
    ENUM[401] = :StonePebbles1 ; NUME[:StonePebbles1] = 401 ; Caption[:StonePebbles1] = 'stone pebbles' ; Shape[:StonePebbles1] = :PEBBLES ; Material[:StonePebbles1] = :STONE ; Variant[:StonePebbles1] = :VAR_1
    ENUM[402] = :StonePebbles2 ; NUME[:StonePebbles2] = 402 ; Caption[:StonePebbles2] = 'stone pebbles' ; Shape[:StonePebbles2] = :PEBBLES ; Material[:StonePebbles2] = :STONE ; Variant[:StonePebbles2] = :VAR_2
    ENUM[403] = :StonePebbles3 ; NUME[:StonePebbles3] = 403 ; Caption[:StonePebbles3] = 'stone pebbles' ; Shape[:StonePebbles3] = :PEBBLES ; Material[:StonePebbles3] = :STONE ; Variant[:StonePebbles3] = :VAR_3
    ENUM[404] = :StonePebbles4 ; NUME[:StonePebbles4] = 404 ; Caption[:StonePebbles4] = 'stone pebbles' ; Shape[:StonePebbles4] = :PEBBLES ; Material[:StonePebbles4] = :STONE ; Variant[:StonePebbles4] = :VAR_4
    ENUM[405] = :LavaPebbles1 ; NUME[:LavaPebbles1] = 405 ; Caption[:LavaPebbles1] = 'obsidian pebbles' ; Shape[:LavaPebbles1] = :PEBBLES ; Material[:LavaPebbles1] = :LAVA_STONE ; Variant[:LavaPebbles1] = :VAR_1
    ENUM[406] = :LavaPebbles2 ; NUME[:LavaPebbles2] = 406 ; Caption[:LavaPebbles2] = 'obsidian pebbles' ; Shape[:LavaPebbles2] = :PEBBLES ; Material[:LavaPebbles2] = :LAVA_STONE ; Variant[:LavaPebbles2] = :VAR_2
    ENUM[407] = :LavaPebbles3 ; NUME[:LavaPebbles3] = 407 ; Caption[:LavaPebbles3] = 'obsidian pebbles' ; Shape[:LavaPebbles3] = :PEBBLES ; Material[:LavaPebbles3] = :LAVA_STONE ; Variant[:LavaPebbles3] = :VAR_3
    ENUM[408] = :LavaPebbles4 ; NUME[:LavaPebbles4] = 408 ; Caption[:LavaPebbles4] = 'obsidian pebbles' ; Shape[:LavaPebbles4] = :PEBBLES ; Material[:LavaPebbles4] = :LAVA_STONE ; Variant[:LavaPebbles4] = :VAR_4
    ENUM[409] = :FeaturePebbles1 ; NUME[:FeaturePebbles1] = 409 ; Caption[:FeaturePebbles1] = 'featstone pebbles' ; Shape[:FeaturePebbles1] = :PEBBLES ; Material[:FeaturePebbles1] = :FEATURE ; Variant[:FeaturePebbles1] = :VAR_1
    ENUM[410] = :FeaturePebbles2 ; NUME[:FeaturePebbles2] = 410 ; Caption[:FeaturePebbles2] = 'featstone pebbles' ; Shape[:FeaturePebbles2] = :PEBBLES ; Material[:FeaturePebbles2] = :FEATURE ; Variant[:FeaturePebbles2] = :VAR_2
    ENUM[411] = :FeaturePebbles3 ; NUME[:FeaturePebbles3] = 411 ; Caption[:FeaturePebbles3] = 'featstone pebbles' ; Shape[:FeaturePebbles3] = :PEBBLES ; Material[:FeaturePebbles3] = :FEATURE ; Variant[:FeaturePebbles3] = :VAR_3
    ENUM[412] = :FeaturePebbles4 ; NUME[:FeaturePebbles4] = 412 ; Caption[:FeaturePebbles4] = 'featstone pebbles' ; Shape[:FeaturePebbles4] = :PEBBLES ; Material[:FeaturePebbles4] = :FEATURE ; Variant[:FeaturePebbles4] = :VAR_4
    ENUM[413] = :MineralWallSmoothRD2 ; NUME[:MineralWallSmoothRD2] = 413 ; Caption[:MineralWallSmoothRD2] = 'smooth vein wall RD2' ; Shape[:MineralWallSmoothRD2] = :WALL ; Material[:MineralWallSmoothRD2] = :MINERAL ; Special[:MineralWallSmoothRD2] = :SMOOTH ; Direction[:MineralWallSmoothRD2] = '--SS--E-'
    ENUM[414] = :MineralWallSmoothR2D ; NUME[:MineralWallSmoothR2D] = 414 ; Caption[:MineralWallSmoothR2D] = 'smooth vein wall R2D' ; Shape[:MineralWallSmoothR2D] = :WALL ; Material[:MineralWallSmoothR2D] = :MINERAL ; Special[:MineralWallSmoothR2D] = :SMOOTH ; Direction[:MineralWallSmoothR2D] = '--S---EE'
    ENUM[415] = :MineralWallSmoothR2U ; NUME[:MineralWallSmoothR2U] = 415 ; Caption[:MineralWallSmoothR2U] = 'smooth vein wall R2U' ; Shape[:MineralWallSmoothR2U] = :WALL ; Material[:MineralWallSmoothR2U] = :MINERAL ; Special[:MineralWallSmoothR2U] = :SMOOTH ; Direction[:MineralWallSmoothR2U] = 'N-----EE'
    ENUM[416] = :MineralWallSmoothRU2 ; NUME[:MineralWallSmoothRU2] = 416 ; Caption[:MineralWallSmoothRU2] = 'smooth vein wall RU2' ; Shape[:MineralWallSmoothRU2] = :WALL ; Material[:MineralWallSmoothRU2] = :MINERAL ; Special[:MineralWallSmoothRU2] = :SMOOTH ; Direction[:MineralWallSmoothRU2] = 'NN----E-'
    ENUM[417] = :MineralWallSmoothL2U ; NUME[:MineralWallSmoothL2U] = 417 ; Caption[:MineralWallSmoothL2U] = 'smooth vein wall L2U' ; Shape[:MineralWallSmoothL2U] = :WALL ; Material[:MineralWallSmoothL2U] = :MINERAL ; Special[:MineralWallSmoothL2U] = :SMOOTH ; Direction[:MineralWallSmoothL2U] = 'N---WW--'
    ENUM[418] = :MineralWallSmoothLU2 ; NUME[:MineralWallSmoothLU2] = 418 ; Caption[:MineralWallSmoothLU2] = 'smooth vein wall LU2' ; Shape[:MineralWallSmoothLU2] = :WALL ; Material[:MineralWallSmoothLU2] = :MINERAL ; Special[:MineralWallSmoothLU2] = :SMOOTH ; Direction[:MineralWallSmoothLU2] = 'NN--W---'
    ENUM[419] = :MineralWallSmoothL2D ; NUME[:MineralWallSmoothL2D] = 419 ; Caption[:MineralWallSmoothL2D] = 'smooth vein wall L2D' ; Shape[:MineralWallSmoothL2D] = :WALL ; Material[:MineralWallSmoothL2D] = :MINERAL ; Special[:MineralWallSmoothL2D] = :SMOOTH ; Direction[:MineralWallSmoothL2D] = '--S-WW--'
    ENUM[420] = :MineralWallSmoothLD2 ; NUME[:MineralWallSmoothLD2] = 420 ; Caption[:MineralWallSmoothLD2] = 'smooth vein wall LD2' ; Shape[:MineralWallSmoothLD2] = :WALL ; Material[:MineralWallSmoothLD2] = :MINERAL ; Special[:MineralWallSmoothLD2] = :SMOOTH ; Direction[:MineralWallSmoothLD2] = '--SSW---'
    ENUM[421] = :MineralWallSmoothLRUD ; NUME[:MineralWallSmoothLRUD] = 421 ; Caption[:MineralWallSmoothLRUD] = 'smooth vein wall LRUD' ; Shape[:MineralWallSmoothLRUD] = :WALL ; Material[:MineralWallSmoothLRUD] = :MINERAL ; Special[:MineralWallSmoothLRUD] = :SMOOTH ; Direction[:MineralWallSmoothLRUD] = 'N-S-W-E-'
    ENUM[422] = :MineralWallSmoothRUD ; NUME[:MineralWallSmoothRUD] = 422 ; Caption[:MineralWallSmoothRUD] = 'smooth vein wall RUD' ; Shape[:MineralWallSmoothRUD] = :WALL ; Material[:MineralWallSmoothRUD] = :MINERAL ; Special[:MineralWallSmoothRUD] = :SMOOTH ; Direction[:MineralWallSmoothRUD] = 'N-S---E-'
    ENUM[423] = :MineralWallSmoothLRD ; NUME[:MineralWallSmoothLRD] = 423 ; Caption[:MineralWallSmoothLRD] = 'smooth vein wall LRD' ; Shape[:MineralWallSmoothLRD] = :WALL ; Material[:MineralWallSmoothLRD] = :MINERAL ; Special[:MineralWallSmoothLRD] = :SMOOTH ; Direction[:MineralWallSmoothLRD] = '--S-W-E-'
    ENUM[424] = :MineralWallSmoothLRU ; NUME[:MineralWallSmoothLRU] = 424 ; Caption[:MineralWallSmoothLRU] = 'smooth vein wall LRU' ; Shape[:MineralWallSmoothLRU] = :WALL ; Material[:MineralWallSmoothLRU] = :MINERAL ; Special[:MineralWallSmoothLRU] = :SMOOTH ; Direction[:MineralWallSmoothLRU] = 'N---W-E-'
    ENUM[425] = :MineralWallSmoothLUD ; NUME[:MineralWallSmoothLUD] = 425 ; Caption[:MineralWallSmoothLUD] = 'smooth vein wall LUD' ; Shape[:MineralWallSmoothLUD] = :WALL ; Material[:MineralWallSmoothLUD] = :MINERAL ; Special[:MineralWallSmoothLUD] = :SMOOTH ; Direction[:MineralWallSmoothLUD] = 'N-S-W---'
    ENUM[426] = :MineralWallSmoothRD ; NUME[:MineralWallSmoothRD] = 426 ; Caption[:MineralWallSmoothRD] = 'smooth vein wall RD' ; Shape[:MineralWallSmoothRD] = :WALL ; Material[:MineralWallSmoothRD] = :MINERAL ; Special[:MineralWallSmoothRD] = :SMOOTH ; Direction[:MineralWallSmoothRD] = '--S---E-'
    ENUM[427] = :MineralWallSmoothRU ; NUME[:MineralWallSmoothRU] = 427 ; Caption[:MineralWallSmoothRU] = 'smooth vein wall RU' ; Shape[:MineralWallSmoothRU] = :WALL ; Material[:MineralWallSmoothRU] = :MINERAL ; Special[:MineralWallSmoothRU] = :SMOOTH ; Direction[:MineralWallSmoothRU] = 'N-----E-'
    ENUM[428] = :MineralWallSmoothLU ; NUME[:MineralWallSmoothLU] = 428 ; Caption[:MineralWallSmoothLU] = 'smooth vein wall LU' ; Shape[:MineralWallSmoothLU] = :WALL ; Material[:MineralWallSmoothLU] = :MINERAL ; Special[:MineralWallSmoothLU] = :SMOOTH ; Direction[:MineralWallSmoothLU] = 'N---W---'
    ENUM[429] = :MineralWallSmoothLD ; NUME[:MineralWallSmoothLD] = 429 ; Caption[:MineralWallSmoothLD] = 'smooth vein wall LD' ; Shape[:MineralWallSmoothLD] = :WALL ; Material[:MineralWallSmoothLD] = :MINERAL ; Special[:MineralWallSmoothLD] = :SMOOTH ; Direction[:MineralWallSmoothLD] = '--S-W---'
    ENUM[430] = :MineralWallSmoothUD ; NUME[:MineralWallSmoothUD] = 430 ; Caption[:MineralWallSmoothUD] = 'smooth vein wall UD' ; Shape[:MineralWallSmoothUD] = :WALL ; Material[:MineralWallSmoothUD] = :MINERAL ; Special[:MineralWallSmoothUD] = :SMOOTH ; Direction[:MineralWallSmoothUD] = 'N-S-----'
    ENUM[431] = :MineralWallSmoothLR ; NUME[:MineralWallSmoothLR] = 431 ; Caption[:MineralWallSmoothLR] = 'smooth vein wall LR' ; Shape[:MineralWallSmoothLR] = :WALL ; Material[:MineralWallSmoothLR] = :MINERAL ; Special[:MineralWallSmoothLR] = :SMOOTH ; Direction[:MineralWallSmoothLR] = '----W-E-'
    ENUM[432] = :MineralFortification ; NUME[:MineralFortification] = 432 ; Caption[:MineralFortification] = 'vein fortification' ; Shape[:MineralFortification] = :FORTIFICATION ; Material[:MineralFortification] = :MINERAL
    ENUM[433] = :MineralWallWorn1 ; NUME[:MineralWallWorn1] = 433 ; Caption[:MineralWallWorn1] = 'worn 1 vein wall' ; Shape[:MineralWallWorn1] = :WALL ; Material[:MineralWallWorn1] = :MINERAL ; Special[:MineralWallWorn1] = :WORN_1
    ENUM[434] = :MineralWallWorn2 ; NUME[:MineralWallWorn2] = 434 ; Caption[:MineralWallWorn2] = 'worn 2 vein wall' ; Shape[:MineralWallWorn2] = :WALL ; Material[:MineralWallWorn2] = :MINERAL ; Special[:MineralWallWorn2] = :WORN_2
    ENUM[435] = :MineralWallWorn3 ; NUME[:MineralWallWorn3] = 435 ; Caption[:MineralWallWorn3] = 'worn 3 vein wall' ; Shape[:MineralWallWorn3] = :WALL ; Material[:MineralWallWorn3] = :MINERAL ; Special[:MineralWallWorn3] = :WORN_3
    ENUM[436] = :MineralWall ; NUME[:MineralWall] = 436 ; Caption[:MineralWall] = 'vein wall' ; Shape[:MineralWall] = :WALL ; Material[:MineralWall] = :MINERAL ; Special[:MineralWall] = :NORMAL
    ENUM[437] = :MineralFloor1 ; NUME[:MineralFloor1] = 437 ; Caption[:MineralFloor1] = 'vein floor' ; Shape[:MineralFloor1] = :FLOOR ; Material[:MineralFloor1] = :MINERAL ; Variant[:MineralFloor1] = :VAR_1 ; Special[:MineralFloor1] = :NORMAL
    ENUM[438] = :MineralFloor2 ; NUME[:MineralFloor2] = 438 ; Caption[:MineralFloor2] = 'vein floor' ; Shape[:MineralFloor2] = :FLOOR ; Material[:MineralFloor2] = :MINERAL ; Variant[:MineralFloor2] = :VAR_2 ; Special[:MineralFloor2] = :NORMAL
    ENUM[439] = :MineralFloor3 ; NUME[:MineralFloor3] = 439 ; Caption[:MineralFloor3] = 'vein floor' ; Shape[:MineralFloor3] = :FLOOR ; Material[:MineralFloor3] = :MINERAL ; Variant[:MineralFloor3] = :VAR_3 ; Special[:MineralFloor3] = :NORMAL
    ENUM[440] = :MineralFloor4 ; NUME[:MineralFloor4] = 440 ; Caption[:MineralFloor4] = 'vein floor' ; Shape[:MineralFloor4] = :FLOOR ; Material[:MineralFloor4] = :MINERAL ; Variant[:MineralFloor4] = :VAR_4 ; Special[:MineralFloor4] = :NORMAL
    ENUM[441] = :MineralBoulder ; NUME[:MineralBoulder] = 441 ; Caption[:MineralBoulder] = 'vein boulder' ; Shape[:MineralBoulder] = :BOULDER ; Material[:MineralBoulder] = :MINERAL
    ENUM[442] = :MineralPebbles1 ; NUME[:MineralPebbles1] = 442 ; Caption[:MineralPebbles1] = 'vein pebbles' ; Shape[:MineralPebbles1] = :PEBBLES ; Material[:MineralPebbles1] = :MINERAL ; Variant[:MineralPebbles1] = :VAR_1
    ENUM[443] = :MineralPebbles2 ; NUME[:MineralPebbles2] = 443 ; Caption[:MineralPebbles2] = 'vein pebbles' ; Shape[:MineralPebbles2] = :PEBBLES ; Material[:MineralPebbles2] = :MINERAL ; Variant[:MineralPebbles2] = :VAR_2
    ENUM[444] = :MineralPebbles3 ; NUME[:MineralPebbles3] = 444 ; Caption[:MineralPebbles3] = 'vein pebbles' ; Shape[:MineralPebbles3] = :PEBBLES ; Material[:MineralPebbles3] = :MINERAL ; Variant[:MineralPebbles3] = :VAR_3
    ENUM[445] = :MineralPebbles4 ; NUME[:MineralPebbles4] = 445 ; Caption[:MineralPebbles4] = 'vein pebbles' ; Shape[:MineralPebbles4] = :PEBBLES ; Material[:MineralPebbles4] = :MINERAL ; Variant[:MineralPebbles4] = :VAR_4
    ENUM[446] = :FrozenWallSmoothRD2 ; NUME[:FrozenWallSmoothRD2] = 446 ; Caption[:FrozenWallSmoothRD2] = 'smooth ice wall RD2' ; Shape[:FrozenWallSmoothRD2] = :WALL ; Material[:FrozenWallSmoothRD2] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothRD2] = :SMOOTH ; Direction[:FrozenWallSmoothRD2] = '--SS--E-'
    ENUM[447] = :FrozenWallSmoothR2D ; NUME[:FrozenWallSmoothR2D] = 447 ; Caption[:FrozenWallSmoothR2D] = 'smooth ice wall R2D' ; Shape[:FrozenWallSmoothR2D] = :WALL ; Material[:FrozenWallSmoothR2D] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothR2D] = :SMOOTH ; Direction[:FrozenWallSmoothR2D] = '--S---EE'
    ENUM[448] = :FrozenWallSmoothR2U ; NUME[:FrozenWallSmoothR2U] = 448 ; Caption[:FrozenWallSmoothR2U] = 'smooth ice wall R2U' ; Shape[:FrozenWallSmoothR2U] = :WALL ; Material[:FrozenWallSmoothR2U] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothR2U] = :SMOOTH ; Direction[:FrozenWallSmoothR2U] = 'N-----EE'
    ENUM[449] = :FrozenWallSmoothRU2 ; NUME[:FrozenWallSmoothRU2] = 449 ; Caption[:FrozenWallSmoothRU2] = 'smooth ice wall RU2' ; Shape[:FrozenWallSmoothRU2] = :WALL ; Material[:FrozenWallSmoothRU2] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothRU2] = :SMOOTH ; Direction[:FrozenWallSmoothRU2] = 'NN----E-'
    ENUM[450] = :FrozenWallSmoothL2U ; NUME[:FrozenWallSmoothL2U] = 450 ; Caption[:FrozenWallSmoothL2U] = 'smooth ice wall L2U' ; Shape[:FrozenWallSmoothL2U] = :WALL ; Material[:FrozenWallSmoothL2U] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothL2U] = :SMOOTH ; Direction[:FrozenWallSmoothL2U] = 'N---WW--'
    ENUM[451] = :FrozenWallSmoothLU2 ; NUME[:FrozenWallSmoothLU2] = 451 ; Caption[:FrozenWallSmoothLU2] = 'smooth ice wall LU2' ; Shape[:FrozenWallSmoothLU2] = :WALL ; Material[:FrozenWallSmoothLU2] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLU2] = :SMOOTH ; Direction[:FrozenWallSmoothLU2] = 'NN--W---'
    ENUM[452] = :FrozenWallSmoothL2D ; NUME[:FrozenWallSmoothL2D] = 452 ; Caption[:FrozenWallSmoothL2D] = 'smooth ice wall L2D' ; Shape[:FrozenWallSmoothL2D] = :WALL ; Material[:FrozenWallSmoothL2D] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothL2D] = :SMOOTH ; Direction[:FrozenWallSmoothL2D] = '--S-WW--'
    ENUM[453] = :FrozenWallSmoothLD2 ; NUME[:FrozenWallSmoothLD2] = 453 ; Caption[:FrozenWallSmoothLD2] = 'smooth ice wall LD2' ; Shape[:FrozenWallSmoothLD2] = :WALL ; Material[:FrozenWallSmoothLD2] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLD2] = :SMOOTH ; Direction[:FrozenWallSmoothLD2] = '--SSW---'
    ENUM[454] = :FrozenWallSmoothLRUD ; NUME[:FrozenWallSmoothLRUD] = 454 ; Caption[:FrozenWallSmoothLRUD] = 'smooth ice wall LRUD' ; Shape[:FrozenWallSmoothLRUD] = :WALL ; Material[:FrozenWallSmoothLRUD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLRUD] = :SMOOTH ; Direction[:FrozenWallSmoothLRUD] = 'N-S-W-E-'
    ENUM[455] = :FrozenWallSmoothRUD ; NUME[:FrozenWallSmoothRUD] = 455 ; Caption[:FrozenWallSmoothRUD] = 'smooth ice wall RUD' ; Shape[:FrozenWallSmoothRUD] = :WALL ; Material[:FrozenWallSmoothRUD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothRUD] = :SMOOTH ; Direction[:FrozenWallSmoothRUD] = 'N-S---E-'
    ENUM[456] = :FrozenWallSmoothLRD ; NUME[:FrozenWallSmoothLRD] = 456 ; Caption[:FrozenWallSmoothLRD] = 'smooth ice wall LRD' ; Shape[:FrozenWallSmoothLRD] = :WALL ; Material[:FrozenWallSmoothLRD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLRD] = :SMOOTH ; Direction[:FrozenWallSmoothLRD] = '--S-W-E-'
    ENUM[457] = :FrozenWallSmoothLRU ; NUME[:FrozenWallSmoothLRU] = 457 ; Caption[:FrozenWallSmoothLRU] = 'smooth ice wall LRU' ; Shape[:FrozenWallSmoothLRU] = :WALL ; Material[:FrozenWallSmoothLRU] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLRU] = :SMOOTH ; Direction[:FrozenWallSmoothLRU] = 'N---W-E-'
    ENUM[458] = :FrozenWallSmoothLUD ; NUME[:FrozenWallSmoothLUD] = 458 ; Caption[:FrozenWallSmoothLUD] = 'smooth ice wall LUD' ; Shape[:FrozenWallSmoothLUD] = :WALL ; Material[:FrozenWallSmoothLUD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLUD] = :SMOOTH ; Direction[:FrozenWallSmoothLUD] = 'N-S-W---'
    ENUM[459] = :FrozenWallSmoothRD ; NUME[:FrozenWallSmoothRD] = 459 ; Caption[:FrozenWallSmoothRD] = 'smooth ice wall RD' ; Shape[:FrozenWallSmoothRD] = :WALL ; Material[:FrozenWallSmoothRD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothRD] = :SMOOTH ; Direction[:FrozenWallSmoothRD] = '--S---E-'
    ENUM[460] = :FrozenWallSmoothRU ; NUME[:FrozenWallSmoothRU] = 460 ; Caption[:FrozenWallSmoothRU] = 'smooth ice wall RU' ; Shape[:FrozenWallSmoothRU] = :WALL ; Material[:FrozenWallSmoothRU] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothRU] = :SMOOTH ; Direction[:FrozenWallSmoothRU] = 'N-----E-'
    ENUM[461] = :FrozenWallSmoothLU ; NUME[:FrozenWallSmoothLU] = 461 ; Caption[:FrozenWallSmoothLU] = 'smooth ice wall LU' ; Shape[:FrozenWallSmoothLU] = :WALL ; Material[:FrozenWallSmoothLU] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLU] = :SMOOTH ; Direction[:FrozenWallSmoothLU] = 'N---W---'
    ENUM[462] = :FrozenWallSmoothLD ; NUME[:FrozenWallSmoothLD] = 462 ; Caption[:FrozenWallSmoothLD] = 'smooth ice wall LD' ; Shape[:FrozenWallSmoothLD] = :WALL ; Material[:FrozenWallSmoothLD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLD] = :SMOOTH ; Direction[:FrozenWallSmoothLD] = '--S-W---'
    ENUM[463] = :FrozenWallSmoothUD ; NUME[:FrozenWallSmoothUD] = 463 ; Caption[:FrozenWallSmoothUD] = 'smooth ice wall UD' ; Shape[:FrozenWallSmoothUD] = :WALL ; Material[:FrozenWallSmoothUD] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothUD] = :SMOOTH ; Direction[:FrozenWallSmoothUD] = 'N-S-----'
    ENUM[464] = :FrozenWallSmoothLR ; NUME[:FrozenWallSmoothLR] = 464 ; Caption[:FrozenWallSmoothLR] = 'smooth ice wall LR' ; Shape[:FrozenWallSmoothLR] = :WALL ; Material[:FrozenWallSmoothLR] = :FROZEN_LIQUID ; Special[:FrozenWallSmoothLR] = :SMOOTH ; Direction[:FrozenWallSmoothLR] = '----W-E-'
    ENUM[465] = :RiverRampN ; NUME[:RiverRampN] = 465 ; Caption[:RiverRampN] = 'river ramp N' ; Shape[:RiverRampN] = :RAMP ; Material[:RiverRampN] = :RIVER ; Direction[:RiverRampN] = 'N'
    ENUM[466] = :RiverRampS ; NUME[:RiverRampS] = 466 ; Caption[:RiverRampS] = 'river ramp S' ; Shape[:RiverRampS] = :RAMP ; Material[:RiverRampS] = :RIVER ; Direction[:RiverRampS] = 'S'
    ENUM[467] = :RiverRampE ; NUME[:RiverRampE] = 467 ; Caption[:RiverRampE] = 'river ramp E' ; Shape[:RiverRampE] = :RAMP ; Material[:RiverRampE] = :RIVER ; Direction[:RiverRampE] = 'E'
    ENUM[468] = :RiverRampW ; NUME[:RiverRampW] = 468 ; Caption[:RiverRampW] = 'river ramp W' ; Shape[:RiverRampW] = :RAMP ; Material[:RiverRampW] = :RIVER ; Direction[:RiverRampW] = 'W'
    ENUM[469] = :RiverRampNW ; NUME[:RiverRampNW] = 469 ; Caption[:RiverRampNW] = 'river ramp NW' ; Shape[:RiverRampNW] = :RAMP ; Material[:RiverRampNW] = :RIVER ; Direction[:RiverRampNW] = 'NW'
    ENUM[470] = :RiverRampNE ; NUME[:RiverRampNE] = 470 ; Caption[:RiverRampNE] = 'river ramp NE' ; Shape[:RiverRampNE] = :RAMP ; Material[:RiverRampNE] = :RIVER ; Direction[:RiverRampNE] = 'NE'
    ENUM[471] = :RiverRampSW ; NUME[:RiverRampSW] = 471 ; Caption[:RiverRampSW] = 'river ramp SW' ; Shape[:RiverRampSW] = :RAMP ; Material[:RiverRampSW] = :RIVER ; Direction[:RiverRampSW] = 'SW'
    ENUM[472] = :RiverRampSE ; NUME[:RiverRampSE] = 472 ; Caption[:RiverRampSE] = 'river ramp SE' ; Shape[:RiverRampSE] = :RAMP ; Material[:RiverRampSE] = :RIVER ; Direction[:RiverRampSE] = 'SE'
    ENUM[489] = :ConstructedFloor ; NUME[:ConstructedFloor] = 489 ; Caption[:ConstructedFloor] = 'constructed floor' ; Shape[:ConstructedFloor] = :FLOOR ; Material[:ConstructedFloor] = :CONSTRUCTION ; Special[:ConstructedFloor] = :SMOOTH
    ENUM[490] = :ConstructedFortification ; NUME[:ConstructedFortification] = 490 ; Caption[:ConstructedFortification] = 'constructed fortification' ; Shape[:ConstructedFortification] = :FORTIFICATION ; Material[:ConstructedFortification] = :CONSTRUCTION
    ENUM[491] = :ConstructedPillar ; NUME[:ConstructedPillar] = 491 ; Caption[:ConstructedPillar] = 'constructed pillar' ; Shape[:ConstructedPillar] = :WALL ; Material[:ConstructedPillar] = :CONSTRUCTION ; Special[:ConstructedPillar] = :SMOOTH
    ENUM[492] = :ConstructedWallRD2 ; NUME[:ConstructedWallRD2] = 492 ; Caption[:ConstructedWallRD2] = 'constructed wall RD2' ; Shape[:ConstructedWallRD2] = :WALL ; Material[:ConstructedWallRD2] = :CONSTRUCTION ; Special[:ConstructedWallRD2] = :SMOOTH ; Direction[:ConstructedWallRD2] = '--SS--E-'
    ENUM[493] = :ConstructedWallR2D ; NUME[:ConstructedWallR2D] = 493 ; Caption[:ConstructedWallR2D] = 'constructed wall R2D' ; Shape[:ConstructedWallR2D] = :WALL ; Material[:ConstructedWallR2D] = :CONSTRUCTION ; Special[:ConstructedWallR2D] = :SMOOTH ; Direction[:ConstructedWallR2D] = '--S---EE'
    ENUM[494] = :ConstructedWallR2U ; NUME[:ConstructedWallR2U] = 494 ; Caption[:ConstructedWallR2U] = 'constructed wall R2U' ; Shape[:ConstructedWallR2U] = :WALL ; Material[:ConstructedWallR2U] = :CONSTRUCTION ; Special[:ConstructedWallR2U] = :SMOOTH ; Direction[:ConstructedWallR2U] = 'N-----EE'
    ENUM[495] = :ConstructedWallRU2 ; NUME[:ConstructedWallRU2] = 495 ; Caption[:ConstructedWallRU2] = 'constructed wall RU2' ; Shape[:ConstructedWallRU2] = :WALL ; Material[:ConstructedWallRU2] = :CONSTRUCTION ; Special[:ConstructedWallRU2] = :SMOOTH ; Direction[:ConstructedWallRU2] = 'NN----E-'
    ENUM[496] = :ConstructedWallL2U ; NUME[:ConstructedWallL2U] = 496 ; Caption[:ConstructedWallL2U] = 'constructed wall L2U' ; Shape[:ConstructedWallL2U] = :WALL ; Material[:ConstructedWallL2U] = :CONSTRUCTION ; Special[:ConstructedWallL2U] = :SMOOTH ; Direction[:ConstructedWallL2U] = 'N---WW--'
    ENUM[497] = :ConstructedWallLU2 ; NUME[:ConstructedWallLU2] = 497 ; Caption[:ConstructedWallLU2] = 'constructed wall LU2' ; Shape[:ConstructedWallLU2] = :WALL ; Material[:ConstructedWallLU2] = :CONSTRUCTION ; Special[:ConstructedWallLU2] = :SMOOTH ; Direction[:ConstructedWallLU2] = 'NN--W---'
    ENUM[498] = :ConstructedWallL2D ; NUME[:ConstructedWallL2D] = 498 ; Caption[:ConstructedWallL2D] = 'constructed wall L2D' ; Shape[:ConstructedWallL2D] = :WALL ; Material[:ConstructedWallL2D] = :CONSTRUCTION ; Special[:ConstructedWallL2D] = :SMOOTH ; Direction[:ConstructedWallL2D] = '--S-WW--'
    ENUM[499] = :ConstructedWallLD2 ; NUME[:ConstructedWallLD2] = 499 ; Caption[:ConstructedWallLD2] = 'constructed wall LD2' ; Shape[:ConstructedWallLD2] = :WALL ; Material[:ConstructedWallLD2] = :CONSTRUCTION ; Special[:ConstructedWallLD2] = :SMOOTH ; Direction[:ConstructedWallLD2] = '--SSW---'
    ENUM[500] = :ConstructedWallLRUD ; NUME[:ConstructedWallLRUD] = 500 ; Caption[:ConstructedWallLRUD] = 'constructed wall LRUD' ; Shape[:ConstructedWallLRUD] = :WALL ; Material[:ConstructedWallLRUD] = :CONSTRUCTION ; Special[:ConstructedWallLRUD] = :SMOOTH ; Direction[:ConstructedWallLRUD] = 'N-S-W-E-'
    ENUM[501] = :ConstructedWallRUD ; NUME[:ConstructedWallRUD] = 501 ; Caption[:ConstructedWallRUD] = 'constructed wall RUD' ; Shape[:ConstructedWallRUD] = :WALL ; Material[:ConstructedWallRUD] = :CONSTRUCTION ; Special[:ConstructedWallRUD] = :SMOOTH ; Direction[:ConstructedWallRUD] = 'N-S---E-'
    ENUM[502] = :ConstructedWallLRD ; NUME[:ConstructedWallLRD] = 502 ; Caption[:ConstructedWallLRD] = 'constructed wall LRD' ; Shape[:ConstructedWallLRD] = :WALL ; Material[:ConstructedWallLRD] = :CONSTRUCTION ; Special[:ConstructedWallLRD] = :SMOOTH ; Direction[:ConstructedWallLRD] = '--S-W-E-'
    ENUM[503] = :ConstructedWallLRU ; NUME[:ConstructedWallLRU] = 503 ; Caption[:ConstructedWallLRU] = 'constructed wall LRU' ; Shape[:ConstructedWallLRU] = :WALL ; Material[:ConstructedWallLRU] = :CONSTRUCTION ; Special[:ConstructedWallLRU] = :SMOOTH ; Direction[:ConstructedWallLRU] = 'N---W-E-'
    ENUM[504] = :ConstructedWallLUD ; NUME[:ConstructedWallLUD] = 504 ; Caption[:ConstructedWallLUD] = 'constructed wall LUD' ; Shape[:ConstructedWallLUD] = :WALL ; Material[:ConstructedWallLUD] = :CONSTRUCTION ; Special[:ConstructedWallLUD] = :SMOOTH ; Direction[:ConstructedWallLUD] = 'N-S-W---'
    ENUM[505] = :ConstructedWallRD ; NUME[:ConstructedWallRD] = 505 ; Caption[:ConstructedWallRD] = 'constructed wall RD' ; Shape[:ConstructedWallRD] = :WALL ; Material[:ConstructedWallRD] = :CONSTRUCTION ; Special[:ConstructedWallRD] = :SMOOTH ; Direction[:ConstructedWallRD] = '--S---E-'
    ENUM[506] = :ConstructedWallRU ; NUME[:ConstructedWallRU] = 506 ; Caption[:ConstructedWallRU] = 'constructed wall RU' ; Shape[:ConstructedWallRU] = :WALL ; Material[:ConstructedWallRU] = :CONSTRUCTION ; Special[:ConstructedWallRU] = :SMOOTH ; Direction[:ConstructedWallRU] = 'N-----E-'
    ENUM[507] = :ConstructedWallLU ; NUME[:ConstructedWallLU] = 507 ; Caption[:ConstructedWallLU] = 'constructed wall LU' ; Shape[:ConstructedWallLU] = :WALL ; Material[:ConstructedWallLU] = :CONSTRUCTION ; Special[:ConstructedWallLU] = :SMOOTH ; Direction[:ConstructedWallLU] = 'N---W---'
    ENUM[508] = :ConstructedWallLD ; NUME[:ConstructedWallLD] = 508 ; Caption[:ConstructedWallLD] = 'constructed wall LD' ; Shape[:ConstructedWallLD] = :WALL ; Material[:ConstructedWallLD] = :CONSTRUCTION ; Special[:ConstructedWallLD] = :SMOOTH ; Direction[:ConstructedWallLD] = '--S-W---'
    ENUM[509] = :ConstructedWallUD ; NUME[:ConstructedWallUD] = 509 ; Caption[:ConstructedWallUD] = 'constructed wall UD' ; Shape[:ConstructedWallUD] = :WALL ; Material[:ConstructedWallUD] = :CONSTRUCTION ; Special[:ConstructedWallUD] = :SMOOTH ; Direction[:ConstructedWallUD] = 'N-S-----'
    ENUM[510] = :ConstructedWallLR ; NUME[:ConstructedWallLR] = 510 ; Caption[:ConstructedWallLR] = 'constructed wall LR' ; Shape[:ConstructedWallLR] = :WALL ; Material[:ConstructedWallLR] = :CONSTRUCTION ; Special[:ConstructedWallLR] = :SMOOTH ; Direction[:ConstructedWallLR] = '----W-E-'
    ENUM[511] = :ConstructedStairUD ; NUME[:ConstructedStairUD] = 511 ; Caption[:ConstructedStairUD] = 'constructed stair up/down' ; Shape[:ConstructedStairUD] = :STAIR_UPDOWN ; Material[:ConstructedStairUD] = :CONSTRUCTION
    ENUM[512] = :ConstructedStairD ; NUME[:ConstructedStairD] = 512 ; Caption[:ConstructedStairD] = 'constructed stair down' ; Shape[:ConstructedStairD] = :STAIR_DOWN ; Material[:ConstructedStairD] = :CONSTRUCTION
    ENUM[513] = :ConstructedStairU ; NUME[:ConstructedStairU] = 513 ; Caption[:ConstructedStairU] = 'constructed stair up' ; Shape[:ConstructedStairU] = :STAIR_UP ; Material[:ConstructedStairU] = :CONSTRUCTION
    ENUM[514] = :ConstructedRamp ; NUME[:ConstructedRamp] = 514 ; Caption[:ConstructedRamp] = 'constructed ramp' ; Shape[:ConstructedRamp] = :RAMP ; Material[:ConstructedRamp] = :CONSTRUCTION
    ENUM[515] = :StoneFloorTrackN ; NUME[:StoneFloorTrackN] = 515 ; Caption[:StoneFloorTrackN] = 'stone floor track N' ; Shape[:StoneFloorTrackN] = :FLOOR ; Material[:StoneFloorTrackN] = :STONE ; Special[:StoneFloorTrackN] = :TRACK ; Direction[:StoneFloorTrackN] = 'N'
    ENUM[516] = :StoneFloorTrackS ; NUME[:StoneFloorTrackS] = 516 ; Caption[:StoneFloorTrackS] = 'stone floor track S' ; Shape[:StoneFloorTrackS] = :FLOOR ; Material[:StoneFloorTrackS] = :STONE ; Special[:StoneFloorTrackS] = :TRACK ; Direction[:StoneFloorTrackS] = 'S'
    ENUM[517] = :StoneFloorTrackE ; NUME[:StoneFloorTrackE] = 517 ; Caption[:StoneFloorTrackE] = 'stone floor track E' ; Shape[:StoneFloorTrackE] = :FLOOR ; Material[:StoneFloorTrackE] = :STONE ; Special[:StoneFloorTrackE] = :TRACK ; Direction[:StoneFloorTrackE] = 'E'
    ENUM[518] = :StoneFloorTrackW ; NUME[:StoneFloorTrackW] = 518 ; Caption[:StoneFloorTrackW] = 'stone floor track W' ; Shape[:StoneFloorTrackW] = :FLOOR ; Material[:StoneFloorTrackW] = :STONE ; Special[:StoneFloorTrackW] = :TRACK ; Direction[:StoneFloorTrackW] = 'W'
    ENUM[519] = :StoneFloorTrackNS ; NUME[:StoneFloorTrackNS] = 519 ; Caption[:StoneFloorTrackNS] = 'stone floor track NS' ; Shape[:StoneFloorTrackNS] = :FLOOR ; Material[:StoneFloorTrackNS] = :STONE ; Special[:StoneFloorTrackNS] = :TRACK ; Direction[:StoneFloorTrackNS] = 'NS'
    ENUM[520] = :StoneFloorTrackNE ; NUME[:StoneFloorTrackNE] = 520 ; Caption[:StoneFloorTrackNE] = 'stone floor track NE' ; Shape[:StoneFloorTrackNE] = :FLOOR ; Material[:StoneFloorTrackNE] = :STONE ; Special[:StoneFloorTrackNE] = :TRACK ; Direction[:StoneFloorTrackNE] = 'NE'
    ENUM[521] = :StoneFloorTrackNW ; NUME[:StoneFloorTrackNW] = 521 ; Caption[:StoneFloorTrackNW] = 'stone floor track NW' ; Shape[:StoneFloorTrackNW] = :FLOOR ; Material[:StoneFloorTrackNW] = :STONE ; Special[:StoneFloorTrackNW] = :TRACK ; Direction[:StoneFloorTrackNW] = 'NW'
    ENUM[522] = :StoneFloorTrackSE ; NUME[:StoneFloorTrackSE] = 522 ; Caption[:StoneFloorTrackSE] = 'stone floor track SE' ; Shape[:StoneFloorTrackSE] = :FLOOR ; Material[:StoneFloorTrackSE] = :STONE ; Special[:StoneFloorTrackSE] = :TRACK ; Direction[:StoneFloorTrackSE] = 'SE'
    ENUM[523] = :StoneFloorTrackSW ; NUME[:StoneFloorTrackSW] = 523 ; Caption[:StoneFloorTrackSW] = 'stone floor track SW' ; Shape[:StoneFloorTrackSW] = :FLOOR ; Material[:StoneFloorTrackSW] = :STONE ; Special[:StoneFloorTrackSW] = :TRACK ; Direction[:StoneFloorTrackSW] = 'SW'
    ENUM[524] = :StoneFloorTrackEW ; NUME[:StoneFloorTrackEW] = 524 ; Caption[:StoneFloorTrackEW] = 'stone floor track EW' ; Shape[:StoneFloorTrackEW] = :FLOOR ; Material[:StoneFloorTrackEW] = :STONE ; Special[:StoneFloorTrackEW] = :TRACK ; Direction[:StoneFloorTrackEW] = 'EW'
    ENUM[525] = :StoneFloorTrackNSE ; NUME[:StoneFloorTrackNSE] = 525 ; Caption[:StoneFloorTrackNSE] = 'stone floor track NSE' ; Shape[:StoneFloorTrackNSE] = :FLOOR ; Material[:StoneFloorTrackNSE] = :STONE ; Special[:StoneFloorTrackNSE] = :TRACK ; Direction[:StoneFloorTrackNSE] = 'NSE'
    ENUM[526] = :StoneFloorTrackNSW ; NUME[:StoneFloorTrackNSW] = 526 ; Caption[:StoneFloorTrackNSW] = 'stone floor track NSW' ; Shape[:StoneFloorTrackNSW] = :FLOOR ; Material[:StoneFloorTrackNSW] = :STONE ; Special[:StoneFloorTrackNSW] = :TRACK ; Direction[:StoneFloorTrackNSW] = 'NSW'
    ENUM[527] = :StoneFloorTrackNEW ; NUME[:StoneFloorTrackNEW] = 527 ; Caption[:StoneFloorTrackNEW] = 'stone floor track NEW' ; Shape[:StoneFloorTrackNEW] = :FLOOR ; Material[:StoneFloorTrackNEW] = :STONE ; Special[:StoneFloorTrackNEW] = :TRACK ; Direction[:StoneFloorTrackNEW] = 'NEW'
    ENUM[528] = :StoneFloorTrackSEW ; NUME[:StoneFloorTrackSEW] = 528 ; Caption[:StoneFloorTrackSEW] = 'stone floor track SEW' ; Shape[:StoneFloorTrackSEW] = :FLOOR ; Material[:StoneFloorTrackSEW] = :STONE ; Special[:StoneFloorTrackSEW] = :TRACK ; Direction[:StoneFloorTrackSEW] = 'SEW'
    ENUM[529] = :StoneFloorTrackNSEW ; NUME[:StoneFloorTrackNSEW] = 529 ; Caption[:StoneFloorTrackNSEW] = 'stone floor track NSEW' ; Shape[:StoneFloorTrackNSEW] = :FLOOR ; Material[:StoneFloorTrackNSEW] = :STONE ; Special[:StoneFloorTrackNSEW] = :TRACK ; Direction[:StoneFloorTrackNSEW] = 'NSEW'
    ENUM[530] = :LavaFloorTrackN ; NUME[:LavaFloorTrackN] = 530 ; Caption[:LavaFloorTrackN] = 'obsidian floor track N' ; Shape[:LavaFloorTrackN] = :FLOOR ; Material[:LavaFloorTrackN] = :LAVA_STONE ; Special[:LavaFloorTrackN] = :TRACK ; Direction[:LavaFloorTrackN] = 'N'
    ENUM[531] = :LavaFloorTrackS ; NUME[:LavaFloorTrackS] = 531 ; Caption[:LavaFloorTrackS] = 'obsidian floor track S' ; Shape[:LavaFloorTrackS] = :FLOOR ; Material[:LavaFloorTrackS] = :LAVA_STONE ; Special[:LavaFloorTrackS] = :TRACK ; Direction[:LavaFloorTrackS] = 'S'
    ENUM[532] = :LavaFloorTrackE ; NUME[:LavaFloorTrackE] = 532 ; Caption[:LavaFloorTrackE] = 'obsidian floor track E' ; Shape[:LavaFloorTrackE] = :FLOOR ; Material[:LavaFloorTrackE] = :LAVA_STONE ; Special[:LavaFloorTrackE] = :TRACK ; Direction[:LavaFloorTrackE] = 'E'
    ENUM[533] = :LavaFloorTrackW ; NUME[:LavaFloorTrackW] = 533 ; Caption[:LavaFloorTrackW] = 'obsidian floor track W' ; Shape[:LavaFloorTrackW] = :FLOOR ; Material[:LavaFloorTrackW] = :LAVA_STONE ; Special[:LavaFloorTrackW] = :TRACK ; Direction[:LavaFloorTrackW] = 'W'
    ENUM[534] = :LavaFloorTrackNS ; NUME[:LavaFloorTrackNS] = 534 ; Caption[:LavaFloorTrackNS] = 'obsidian floor track NS' ; Shape[:LavaFloorTrackNS] = :FLOOR ; Material[:LavaFloorTrackNS] = :LAVA_STONE ; Special[:LavaFloorTrackNS] = :TRACK ; Direction[:LavaFloorTrackNS] = 'NS'
    ENUM[535] = :LavaFloorTrackNE ; NUME[:LavaFloorTrackNE] = 535 ; Caption[:LavaFloorTrackNE] = 'obsidian floor track NE' ; Shape[:LavaFloorTrackNE] = :FLOOR ; Material[:LavaFloorTrackNE] = :LAVA_STONE ; Special[:LavaFloorTrackNE] = :TRACK ; Direction[:LavaFloorTrackNE] = 'NE'
    ENUM[536] = :LavaFloorTrackNW ; NUME[:LavaFloorTrackNW] = 536 ; Caption[:LavaFloorTrackNW] = 'obsidian floor track NW' ; Shape[:LavaFloorTrackNW] = :FLOOR ; Material[:LavaFloorTrackNW] = :LAVA_STONE ; Special[:LavaFloorTrackNW] = :TRACK ; Direction[:LavaFloorTrackNW] = 'NW'
    ENUM[537] = :LavaFloorTrackSE ; NUME[:LavaFloorTrackSE] = 537 ; Caption[:LavaFloorTrackSE] = 'obsidian floor track SE' ; Shape[:LavaFloorTrackSE] = :FLOOR ; Material[:LavaFloorTrackSE] = :LAVA_STONE ; Special[:LavaFloorTrackSE] = :TRACK ; Direction[:LavaFloorTrackSE] = 'SE'
    ENUM[538] = :LavaFloorTrackSW ; NUME[:LavaFloorTrackSW] = 538 ; Caption[:LavaFloorTrackSW] = 'obsidian floor track SW' ; Shape[:LavaFloorTrackSW] = :FLOOR ; Material[:LavaFloorTrackSW] = :LAVA_STONE ; Special[:LavaFloorTrackSW] = :TRACK ; Direction[:LavaFloorTrackSW] = 'SW'
    ENUM[539] = :LavaFloorTrackEW ; NUME[:LavaFloorTrackEW] = 539 ; Caption[:LavaFloorTrackEW] = 'obsidian floor track EW' ; Shape[:LavaFloorTrackEW] = :FLOOR ; Material[:LavaFloorTrackEW] = :LAVA_STONE ; Special[:LavaFloorTrackEW] = :TRACK ; Direction[:LavaFloorTrackEW] = 'EW'
    ENUM[540] = :LavaFloorTrackNSE ; NUME[:LavaFloorTrackNSE] = 540 ; Caption[:LavaFloorTrackNSE] = 'obsidian floor track NSE' ; Shape[:LavaFloorTrackNSE] = :FLOOR ; Material[:LavaFloorTrackNSE] = :LAVA_STONE ; Special[:LavaFloorTrackNSE] = :TRACK ; Direction[:LavaFloorTrackNSE] = 'NSE'
    ENUM[541] = :LavaFloorTrackNSW ; NUME[:LavaFloorTrackNSW] = 541 ; Caption[:LavaFloorTrackNSW] = 'obsidian floor track NSW' ; Shape[:LavaFloorTrackNSW] = :FLOOR ; Material[:LavaFloorTrackNSW] = :LAVA_STONE ; Special[:LavaFloorTrackNSW] = :TRACK ; Direction[:LavaFloorTrackNSW] = 'NSW'
    ENUM[542] = :LavaFloorTrackNEW ; NUME[:LavaFloorTrackNEW] = 542 ; Caption[:LavaFloorTrackNEW] = 'obsidian floor track NEW' ; Shape[:LavaFloorTrackNEW] = :FLOOR ; Material[:LavaFloorTrackNEW] = :LAVA_STONE ; Special[:LavaFloorTrackNEW] = :TRACK ; Direction[:LavaFloorTrackNEW] = 'NEW'
    ENUM[543] = :LavaFloorTrackSEW ; NUME[:LavaFloorTrackSEW] = 543 ; Caption[:LavaFloorTrackSEW] = 'obsidian floor track SEW' ; Shape[:LavaFloorTrackSEW] = :FLOOR ; Material[:LavaFloorTrackSEW] = :LAVA_STONE ; Special[:LavaFloorTrackSEW] = :TRACK ; Direction[:LavaFloorTrackSEW] = 'SEW'
    ENUM[544] = :LavaFloorTrackNSEW ; NUME[:LavaFloorTrackNSEW] = 544 ; Caption[:LavaFloorTrackNSEW] = 'obsidian floor track NSEW' ; Shape[:LavaFloorTrackNSEW] = :FLOOR ; Material[:LavaFloorTrackNSEW] = :LAVA_STONE ; Special[:LavaFloorTrackNSEW] = :TRACK ; Direction[:LavaFloorTrackNSEW] = 'NSEW'
    ENUM[545] = :FeatureFloorTrackN ; NUME[:FeatureFloorTrackN] = 545 ; Caption[:FeatureFloorTrackN] = 'featstone floor track N' ; Shape[:FeatureFloorTrackN] = :FLOOR ; Material[:FeatureFloorTrackN] = :FEATURE ; Special[:FeatureFloorTrackN] = :TRACK ; Direction[:FeatureFloorTrackN] = 'N'
    ENUM[546] = :FeatureFloorTrackS ; NUME[:FeatureFloorTrackS] = 546 ; Caption[:FeatureFloorTrackS] = 'featstone floor track S' ; Shape[:FeatureFloorTrackS] = :FLOOR ; Material[:FeatureFloorTrackS] = :FEATURE ; Special[:FeatureFloorTrackS] = :TRACK ; Direction[:FeatureFloorTrackS] = 'S'
    ENUM[547] = :FeatureFloorTrackE ; NUME[:FeatureFloorTrackE] = 547 ; Caption[:FeatureFloorTrackE] = 'featstone floor track E' ; Shape[:FeatureFloorTrackE] = :FLOOR ; Material[:FeatureFloorTrackE] = :FEATURE ; Special[:FeatureFloorTrackE] = :TRACK ; Direction[:FeatureFloorTrackE] = 'E'
    ENUM[548] = :FeatureFloorTrackW ; NUME[:FeatureFloorTrackW] = 548 ; Caption[:FeatureFloorTrackW] = 'featstone floor track W' ; Shape[:FeatureFloorTrackW] = :FLOOR ; Material[:FeatureFloorTrackW] = :FEATURE ; Special[:FeatureFloorTrackW] = :TRACK ; Direction[:FeatureFloorTrackW] = 'W'
    ENUM[549] = :FeatureFloorTrackNS ; NUME[:FeatureFloorTrackNS] = 549 ; Caption[:FeatureFloorTrackNS] = 'featstone floor track NS' ; Shape[:FeatureFloorTrackNS] = :FLOOR ; Material[:FeatureFloorTrackNS] = :FEATURE ; Special[:FeatureFloorTrackNS] = :TRACK ; Direction[:FeatureFloorTrackNS] = 'NS'
    ENUM[550] = :FeatureFloorTrackNE ; NUME[:FeatureFloorTrackNE] = 550 ; Caption[:FeatureFloorTrackNE] = 'featstone floor track NE' ; Shape[:FeatureFloorTrackNE] = :FLOOR ; Material[:FeatureFloorTrackNE] = :FEATURE ; Special[:FeatureFloorTrackNE] = :TRACK ; Direction[:FeatureFloorTrackNE] = 'NE'
    ENUM[551] = :FeatureFloorTrackNW ; NUME[:FeatureFloorTrackNW] = 551 ; Caption[:FeatureFloorTrackNW] = 'featstone floor track NW' ; Shape[:FeatureFloorTrackNW] = :FLOOR ; Material[:FeatureFloorTrackNW] = :FEATURE ; Special[:FeatureFloorTrackNW] = :TRACK ; Direction[:FeatureFloorTrackNW] = 'NW'
    ENUM[552] = :FeatureFloorTrackSE ; NUME[:FeatureFloorTrackSE] = 552 ; Caption[:FeatureFloorTrackSE] = 'featstone floor track SE' ; Shape[:FeatureFloorTrackSE] = :FLOOR ; Material[:FeatureFloorTrackSE] = :FEATURE ; Special[:FeatureFloorTrackSE] = :TRACK ; Direction[:FeatureFloorTrackSE] = 'SE'
    ENUM[553] = :FeatureFloorTrackSW ; NUME[:FeatureFloorTrackSW] = 553 ; Caption[:FeatureFloorTrackSW] = 'featstone floor track SW' ; Shape[:FeatureFloorTrackSW] = :FLOOR ; Material[:FeatureFloorTrackSW] = :FEATURE ; Special[:FeatureFloorTrackSW] = :TRACK ; Direction[:FeatureFloorTrackSW] = 'SW'
    ENUM[554] = :FeatureFloorTrackEW ; NUME[:FeatureFloorTrackEW] = 554 ; Caption[:FeatureFloorTrackEW] = 'featstone floor track EW' ; Shape[:FeatureFloorTrackEW] = :FLOOR ; Material[:FeatureFloorTrackEW] = :FEATURE ; Special[:FeatureFloorTrackEW] = :TRACK ; Direction[:FeatureFloorTrackEW] = 'EW'
    ENUM[555] = :FeatureFloorTrackNSE ; NUME[:FeatureFloorTrackNSE] = 555 ; Caption[:FeatureFloorTrackNSE] = 'featstone floor track NSE' ; Shape[:FeatureFloorTrackNSE] = :FLOOR ; Material[:FeatureFloorTrackNSE] = :FEATURE ; Special[:FeatureFloorTrackNSE] = :TRACK ; Direction[:FeatureFloorTrackNSE] = 'NSE'
    ENUM[556] = :FeatureFloorTrackNSW ; NUME[:FeatureFloorTrackNSW] = 556 ; Caption[:FeatureFloorTrackNSW] = 'featstone floor track NSW' ; Shape[:FeatureFloorTrackNSW] = :FLOOR ; Material[:FeatureFloorTrackNSW] = :FEATURE ; Special[:FeatureFloorTrackNSW] = :TRACK ; Direction[:FeatureFloorTrackNSW] = 'NSW'
    ENUM[557] = :FeatureFloorTrackNEW ; NUME[:FeatureFloorTrackNEW] = 557 ; Caption[:FeatureFloorTrackNEW] = 'featstone floor track NEW' ; Shape[:FeatureFloorTrackNEW] = :FLOOR ; Material[:FeatureFloorTrackNEW] = :FEATURE ; Special[:FeatureFloorTrackNEW] = :TRACK ; Direction[:FeatureFloorTrackNEW] = 'NEW'
    ENUM[558] = :FeatureFloorTrackSEW ; NUME[:FeatureFloorTrackSEW] = 558 ; Caption[:FeatureFloorTrackSEW] = 'featstone floor track SEW' ; Shape[:FeatureFloorTrackSEW] = :FLOOR ; Material[:FeatureFloorTrackSEW] = :FEATURE ; Special[:FeatureFloorTrackSEW] = :TRACK ; Direction[:FeatureFloorTrackSEW] = 'SEW'
    ENUM[559] = :FeatureFloorTrackNSEW ; NUME[:FeatureFloorTrackNSEW] = 559 ; Caption[:FeatureFloorTrackNSEW] = 'featstone floor track NSEW' ; Shape[:FeatureFloorTrackNSEW] = :FLOOR ; Material[:FeatureFloorTrackNSEW] = :FEATURE ; Special[:FeatureFloorTrackNSEW] = :TRACK ; Direction[:FeatureFloorTrackNSEW] = 'NSEW'
    ENUM[560] = :MineralFloorTrackN ; NUME[:MineralFloorTrackN] = 560 ; Caption[:MineralFloorTrackN] = 'vein floor track N' ; Shape[:MineralFloorTrackN] = :FLOOR ; Material[:MineralFloorTrackN] = :MINERAL ; Special[:MineralFloorTrackN] = :TRACK ; Direction[:MineralFloorTrackN] = 'N'
    ENUM[561] = :MineralFloorTrackS ; NUME[:MineralFloorTrackS] = 561 ; Caption[:MineralFloorTrackS] = 'vein floor track S' ; Shape[:MineralFloorTrackS] = :FLOOR ; Material[:MineralFloorTrackS] = :MINERAL ; Special[:MineralFloorTrackS] = :TRACK ; Direction[:MineralFloorTrackS] = 'S'
    ENUM[562] = :MineralFloorTrackE ; NUME[:MineralFloorTrackE] = 562 ; Caption[:MineralFloorTrackE] = 'vein floor track E' ; Shape[:MineralFloorTrackE] = :FLOOR ; Material[:MineralFloorTrackE] = :MINERAL ; Special[:MineralFloorTrackE] = :TRACK ; Direction[:MineralFloorTrackE] = 'E'
    ENUM[563] = :MineralFloorTrackW ; NUME[:MineralFloorTrackW] = 563 ; Caption[:MineralFloorTrackW] = 'vein floor track W' ; Shape[:MineralFloorTrackW] = :FLOOR ; Material[:MineralFloorTrackW] = :MINERAL ; Special[:MineralFloorTrackW] = :TRACK ; Direction[:MineralFloorTrackW] = 'W'
    ENUM[564] = :MineralFloorTrackNS ; NUME[:MineralFloorTrackNS] = 564 ; Caption[:MineralFloorTrackNS] = 'vein floor track NS' ; Shape[:MineralFloorTrackNS] = :FLOOR ; Material[:MineralFloorTrackNS] = :MINERAL ; Special[:MineralFloorTrackNS] = :TRACK ; Direction[:MineralFloorTrackNS] = 'NS'
    ENUM[565] = :MineralFloorTrackNE ; NUME[:MineralFloorTrackNE] = 565 ; Caption[:MineralFloorTrackNE] = 'vein floor track NE' ; Shape[:MineralFloorTrackNE] = :FLOOR ; Material[:MineralFloorTrackNE] = :MINERAL ; Special[:MineralFloorTrackNE] = :TRACK ; Direction[:MineralFloorTrackNE] = 'NE'
    ENUM[566] = :MineralFloorTrackNW ; NUME[:MineralFloorTrackNW] = 566 ; Caption[:MineralFloorTrackNW] = 'vein floor track NW' ; Shape[:MineralFloorTrackNW] = :FLOOR ; Material[:MineralFloorTrackNW] = :MINERAL ; Special[:MineralFloorTrackNW] = :TRACK ; Direction[:MineralFloorTrackNW] = 'NW'
    ENUM[567] = :MineralFloorTrackSE ; NUME[:MineralFloorTrackSE] = 567 ; Caption[:MineralFloorTrackSE] = 'vein floor track SE' ; Shape[:MineralFloorTrackSE] = :FLOOR ; Material[:MineralFloorTrackSE] = :MINERAL ; Special[:MineralFloorTrackSE] = :TRACK ; Direction[:MineralFloorTrackSE] = 'SE'
    ENUM[568] = :MineralFloorTrackSW ; NUME[:MineralFloorTrackSW] = 568 ; Caption[:MineralFloorTrackSW] = 'vein floor track SW' ; Shape[:MineralFloorTrackSW] = :FLOOR ; Material[:MineralFloorTrackSW] = :MINERAL ; Special[:MineralFloorTrackSW] = :TRACK ; Direction[:MineralFloorTrackSW] = 'SW'
    ENUM[569] = :MineralFloorTrackEW ; NUME[:MineralFloorTrackEW] = 569 ; Caption[:MineralFloorTrackEW] = 'vein floor track EW' ; Shape[:MineralFloorTrackEW] = :FLOOR ; Material[:MineralFloorTrackEW] = :MINERAL ; Special[:MineralFloorTrackEW] = :TRACK ; Direction[:MineralFloorTrackEW] = 'EW'
    ENUM[570] = :MineralFloorTrackNSE ; NUME[:MineralFloorTrackNSE] = 570 ; Caption[:MineralFloorTrackNSE] = 'vein floor track NSE' ; Shape[:MineralFloorTrackNSE] = :FLOOR ; Material[:MineralFloorTrackNSE] = :MINERAL ; Special[:MineralFloorTrackNSE] = :TRACK ; Direction[:MineralFloorTrackNSE] = 'NSE'
    ENUM[571] = :MineralFloorTrackNSW ; NUME[:MineralFloorTrackNSW] = 571 ; Caption[:MineralFloorTrackNSW] = 'vein floor track NSW' ; Shape[:MineralFloorTrackNSW] = :FLOOR ; Material[:MineralFloorTrackNSW] = :MINERAL ; Special[:MineralFloorTrackNSW] = :TRACK ; Direction[:MineralFloorTrackNSW] = 'NSW'
    ENUM[572] = :MineralFloorTrackNEW ; NUME[:MineralFloorTrackNEW] = 572 ; Caption[:MineralFloorTrackNEW] = 'vein floor track NEW' ; Shape[:MineralFloorTrackNEW] = :FLOOR ; Material[:MineralFloorTrackNEW] = :MINERAL ; Special[:MineralFloorTrackNEW] = :TRACK ; Direction[:MineralFloorTrackNEW] = 'NEW'
    ENUM[573] = :MineralFloorTrackSEW ; NUME[:MineralFloorTrackSEW] = 573 ; Caption[:MineralFloorTrackSEW] = 'vein floor track SEW' ; Shape[:MineralFloorTrackSEW] = :FLOOR ; Material[:MineralFloorTrackSEW] = :MINERAL ; Special[:MineralFloorTrackSEW] = :TRACK ; Direction[:MineralFloorTrackSEW] = 'SEW'
    ENUM[574] = :MineralFloorTrackNSEW ; NUME[:MineralFloorTrackNSEW] = 574 ; Caption[:MineralFloorTrackNSEW] = 'vein floor track NSEW' ; Shape[:MineralFloorTrackNSEW] = :FLOOR ; Material[:MineralFloorTrackNSEW] = :MINERAL ; Special[:MineralFloorTrackNSEW] = :TRACK ; Direction[:MineralFloorTrackNSEW] = 'NSEW'
    ENUM[575] = :FrozenFloorTrackN ; NUME[:FrozenFloorTrackN] = 575 ; Caption[:FrozenFloorTrackN] = 'ice floor track N' ; Shape[:FrozenFloorTrackN] = :FLOOR ; Material[:FrozenFloorTrackN] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackN] = :TRACK ; Direction[:FrozenFloorTrackN] = 'N'
    ENUM[576] = :FrozenFloorTrackS ; NUME[:FrozenFloorTrackS] = 576 ; Caption[:FrozenFloorTrackS] = 'ice floor track S' ; Shape[:FrozenFloorTrackS] = :FLOOR ; Material[:FrozenFloorTrackS] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackS] = :TRACK ; Direction[:FrozenFloorTrackS] = 'S'
    ENUM[577] = :FrozenFloorTrackE ; NUME[:FrozenFloorTrackE] = 577 ; Caption[:FrozenFloorTrackE] = 'ice floor track E' ; Shape[:FrozenFloorTrackE] = :FLOOR ; Material[:FrozenFloorTrackE] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackE] = :TRACK ; Direction[:FrozenFloorTrackE] = 'E'
    ENUM[578] = :FrozenFloorTrackW ; NUME[:FrozenFloorTrackW] = 578 ; Caption[:FrozenFloorTrackW] = 'ice floor track W' ; Shape[:FrozenFloorTrackW] = :FLOOR ; Material[:FrozenFloorTrackW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackW] = :TRACK ; Direction[:FrozenFloorTrackW] = 'W'
    ENUM[579] = :FrozenFloorTrackNS ; NUME[:FrozenFloorTrackNS] = 579 ; Caption[:FrozenFloorTrackNS] = 'ice floor track NS' ; Shape[:FrozenFloorTrackNS] = :FLOOR ; Material[:FrozenFloorTrackNS] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNS] = :TRACK ; Direction[:FrozenFloorTrackNS] = 'NS'
    ENUM[580] = :FrozenFloorTrackNE ; NUME[:FrozenFloorTrackNE] = 580 ; Caption[:FrozenFloorTrackNE] = 'ice floor track NE' ; Shape[:FrozenFloorTrackNE] = :FLOOR ; Material[:FrozenFloorTrackNE] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNE] = :TRACK ; Direction[:FrozenFloorTrackNE] = 'NE'
    ENUM[581] = :FrozenFloorTrackNW ; NUME[:FrozenFloorTrackNW] = 581 ; Caption[:FrozenFloorTrackNW] = 'ice floor track NW' ; Shape[:FrozenFloorTrackNW] = :FLOOR ; Material[:FrozenFloorTrackNW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNW] = :TRACK ; Direction[:FrozenFloorTrackNW] = 'NW'
    ENUM[582] = :FrozenFloorTrackSE ; NUME[:FrozenFloorTrackSE] = 582 ; Caption[:FrozenFloorTrackSE] = 'ice floor track SE' ; Shape[:FrozenFloorTrackSE] = :FLOOR ; Material[:FrozenFloorTrackSE] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackSE] = :TRACK ; Direction[:FrozenFloorTrackSE] = 'SE'
    ENUM[583] = :FrozenFloorTrackSW ; NUME[:FrozenFloorTrackSW] = 583 ; Caption[:FrozenFloorTrackSW] = 'ice floor track SW' ; Shape[:FrozenFloorTrackSW] = :FLOOR ; Material[:FrozenFloorTrackSW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackSW] = :TRACK ; Direction[:FrozenFloorTrackSW] = 'SW'
    ENUM[584] = :FrozenFloorTrackEW ; NUME[:FrozenFloorTrackEW] = 584 ; Caption[:FrozenFloorTrackEW] = 'ice floor track EW' ; Shape[:FrozenFloorTrackEW] = :FLOOR ; Material[:FrozenFloorTrackEW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackEW] = :TRACK ; Direction[:FrozenFloorTrackEW] = 'EW'
    ENUM[585] = :FrozenFloorTrackNSE ; NUME[:FrozenFloorTrackNSE] = 585 ; Caption[:FrozenFloorTrackNSE] = 'ice floor track NSE' ; Shape[:FrozenFloorTrackNSE] = :FLOOR ; Material[:FrozenFloorTrackNSE] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNSE] = :TRACK ; Direction[:FrozenFloorTrackNSE] = 'NSE'
    ENUM[586] = :FrozenFloorTrackNSW ; NUME[:FrozenFloorTrackNSW] = 586 ; Caption[:FrozenFloorTrackNSW] = 'ice floor track NSW' ; Shape[:FrozenFloorTrackNSW] = :FLOOR ; Material[:FrozenFloorTrackNSW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNSW] = :TRACK ; Direction[:FrozenFloorTrackNSW] = 'NSW'
    ENUM[587] = :FrozenFloorTrackNEW ; NUME[:FrozenFloorTrackNEW] = 587 ; Caption[:FrozenFloorTrackNEW] = 'ice floor track NEW' ; Shape[:FrozenFloorTrackNEW] = :FLOOR ; Material[:FrozenFloorTrackNEW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNEW] = :TRACK ; Direction[:FrozenFloorTrackNEW] = 'NEW'
    ENUM[588] = :FrozenFloorTrackSEW ; NUME[:FrozenFloorTrackSEW] = 588 ; Caption[:FrozenFloorTrackSEW] = 'ice floor track SEW' ; Shape[:FrozenFloorTrackSEW] = :FLOOR ; Material[:FrozenFloorTrackSEW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackSEW] = :TRACK ; Direction[:FrozenFloorTrackSEW] = 'SEW'
    ENUM[589] = :FrozenFloorTrackNSEW ; NUME[:FrozenFloorTrackNSEW] = 589 ; Caption[:FrozenFloorTrackNSEW] = 'ice floor track NSEW' ; Shape[:FrozenFloorTrackNSEW] = :FLOOR ; Material[:FrozenFloorTrackNSEW] = :FROZEN_LIQUID ; Special[:FrozenFloorTrackNSEW] = :TRACK ; Direction[:FrozenFloorTrackNSEW] = 'NSEW'
    ENUM[590] = :ConstructedFloorTrackN ; NUME[:ConstructedFloorTrackN] = 590 ; Caption[:ConstructedFloorTrackN] = 'constructed floor track N' ; Shape[:ConstructedFloorTrackN] = :FLOOR ; Material[:ConstructedFloorTrackN] = :CONSTRUCTION ; Special[:ConstructedFloorTrackN] = :TRACK ; Direction[:ConstructedFloorTrackN] = 'N'
    ENUM[591] = :ConstructedFloorTrackS ; NUME[:ConstructedFloorTrackS] = 591 ; Caption[:ConstructedFloorTrackS] = 'constructed floor track S' ; Shape[:ConstructedFloorTrackS] = :FLOOR ; Material[:ConstructedFloorTrackS] = :CONSTRUCTION ; Special[:ConstructedFloorTrackS] = :TRACK ; Direction[:ConstructedFloorTrackS] = 'S'
    ENUM[592] = :ConstructedFloorTrackE ; NUME[:ConstructedFloorTrackE] = 592 ; Caption[:ConstructedFloorTrackE] = 'constructed floor track E' ; Shape[:ConstructedFloorTrackE] = :FLOOR ; Material[:ConstructedFloorTrackE] = :CONSTRUCTION ; Special[:ConstructedFloorTrackE] = :TRACK ; Direction[:ConstructedFloorTrackE] = 'E'
    ENUM[593] = :ConstructedFloorTrackW ; NUME[:ConstructedFloorTrackW] = 593 ; Caption[:ConstructedFloorTrackW] = 'constructed floor track W' ; Shape[:ConstructedFloorTrackW] = :FLOOR ; Material[:ConstructedFloorTrackW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackW] = :TRACK ; Direction[:ConstructedFloorTrackW] = 'W'
    ENUM[594] = :ConstructedFloorTrackNS ; NUME[:ConstructedFloorTrackNS] = 594 ; Caption[:ConstructedFloorTrackNS] = 'constructed floor track NS' ; Shape[:ConstructedFloorTrackNS] = :FLOOR ; Material[:ConstructedFloorTrackNS] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNS] = :TRACK ; Direction[:ConstructedFloorTrackNS] = 'NS'
    ENUM[595] = :ConstructedFloorTrackNE ; NUME[:ConstructedFloorTrackNE] = 595 ; Caption[:ConstructedFloorTrackNE] = 'constructed floor track NE' ; Shape[:ConstructedFloorTrackNE] = :FLOOR ; Material[:ConstructedFloorTrackNE] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNE] = :TRACK ; Direction[:ConstructedFloorTrackNE] = 'NE'
    ENUM[596] = :ConstructedFloorTrackNW ; NUME[:ConstructedFloorTrackNW] = 596 ; Caption[:ConstructedFloorTrackNW] = 'constructed floor track NW' ; Shape[:ConstructedFloorTrackNW] = :FLOOR ; Material[:ConstructedFloorTrackNW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNW] = :TRACK ; Direction[:ConstructedFloorTrackNW] = 'NW'
    ENUM[597] = :ConstructedFloorTrackSE ; NUME[:ConstructedFloorTrackSE] = 597 ; Caption[:ConstructedFloorTrackSE] = 'constructed floor track SE' ; Shape[:ConstructedFloorTrackSE] = :FLOOR ; Material[:ConstructedFloorTrackSE] = :CONSTRUCTION ; Special[:ConstructedFloorTrackSE] = :TRACK ; Direction[:ConstructedFloorTrackSE] = 'SE'
    ENUM[598] = :ConstructedFloorTrackSW ; NUME[:ConstructedFloorTrackSW] = 598 ; Caption[:ConstructedFloorTrackSW] = 'constructed floor track SW' ; Shape[:ConstructedFloorTrackSW] = :FLOOR ; Material[:ConstructedFloorTrackSW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackSW] = :TRACK ; Direction[:ConstructedFloorTrackSW] = 'SW'
    ENUM[599] = :ConstructedFloorTrackEW ; NUME[:ConstructedFloorTrackEW] = 599 ; Caption[:ConstructedFloorTrackEW] = 'constructed floor track EW' ; Shape[:ConstructedFloorTrackEW] = :FLOOR ; Material[:ConstructedFloorTrackEW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackEW] = :TRACK ; Direction[:ConstructedFloorTrackEW] = 'EW'
    ENUM[600] = :ConstructedFloorTrackNSE ; NUME[:ConstructedFloorTrackNSE] = 600 ; Caption[:ConstructedFloorTrackNSE] = 'constructed floor track NSE' ; Shape[:ConstructedFloorTrackNSE] = :FLOOR ; Material[:ConstructedFloorTrackNSE] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNSE] = :TRACK ; Direction[:ConstructedFloorTrackNSE] = 'NSE'
    ENUM[601] = :ConstructedFloorTrackNSW ; NUME[:ConstructedFloorTrackNSW] = 601 ; Caption[:ConstructedFloorTrackNSW] = 'constructed floor track NSW' ; Shape[:ConstructedFloorTrackNSW] = :FLOOR ; Material[:ConstructedFloorTrackNSW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNSW] = :TRACK ; Direction[:ConstructedFloorTrackNSW] = 'NSW'
    ENUM[602] = :ConstructedFloorTrackNEW ; NUME[:ConstructedFloorTrackNEW] = 602 ; Caption[:ConstructedFloorTrackNEW] = 'constructed floor track NEW' ; Shape[:ConstructedFloorTrackNEW] = :FLOOR ; Material[:ConstructedFloorTrackNEW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNEW] = :TRACK ; Direction[:ConstructedFloorTrackNEW] = 'NEW'
    ENUM[603] = :ConstructedFloorTrackSEW ; NUME[:ConstructedFloorTrackSEW] = 603 ; Caption[:ConstructedFloorTrackSEW] = 'constructed floor track SEW' ; Shape[:ConstructedFloorTrackSEW] = :FLOOR ; Material[:ConstructedFloorTrackSEW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackSEW] = :TRACK ; Direction[:ConstructedFloorTrackSEW] = 'SEW'
    ENUM[604] = :ConstructedFloorTrackNSEW ; NUME[:ConstructedFloorTrackNSEW] = 604 ; Caption[:ConstructedFloorTrackNSEW] = 'constructed floor track NSEW' ; Shape[:ConstructedFloorTrackNSEW] = :FLOOR ; Material[:ConstructedFloorTrackNSEW] = :CONSTRUCTION ; Special[:ConstructedFloorTrackNSEW] = :TRACK ; Direction[:ConstructedFloorTrackNSEW] = 'NSEW'
    ENUM[605] = :StoneRampTrackN ; NUME[:StoneRampTrackN] = 605 ; Caption[:StoneRampTrackN] = 'stone ramp track N' ; Shape[:StoneRampTrackN] = :RAMP ; Material[:StoneRampTrackN] = :STONE ; Special[:StoneRampTrackN] = :TRACK ; Direction[:StoneRampTrackN] = 'N'
    ENUM[606] = :StoneRampTrackS ; NUME[:StoneRampTrackS] = 606 ; Caption[:StoneRampTrackS] = 'stone ramp track S' ; Shape[:StoneRampTrackS] = :RAMP ; Material[:StoneRampTrackS] = :STONE ; Special[:StoneRampTrackS] = :TRACK ; Direction[:StoneRampTrackS] = 'S'
    ENUM[607] = :StoneRampTrackE ; NUME[:StoneRampTrackE] = 607 ; Caption[:StoneRampTrackE] = 'stone ramp track E' ; Shape[:StoneRampTrackE] = :RAMP ; Material[:StoneRampTrackE] = :STONE ; Special[:StoneRampTrackE] = :TRACK ; Direction[:StoneRampTrackE] = 'E'
    ENUM[608] = :StoneRampTrackW ; NUME[:StoneRampTrackW] = 608 ; Caption[:StoneRampTrackW] = 'stone ramp track W' ; Shape[:StoneRampTrackW] = :RAMP ; Material[:StoneRampTrackW] = :STONE ; Special[:StoneRampTrackW] = :TRACK ; Direction[:StoneRampTrackW] = 'W'
    ENUM[609] = :StoneRampTrackNS ; NUME[:StoneRampTrackNS] = 609 ; Caption[:StoneRampTrackNS] = 'stone ramp track NS' ; Shape[:StoneRampTrackNS] = :RAMP ; Material[:StoneRampTrackNS] = :STONE ; Special[:StoneRampTrackNS] = :TRACK ; Direction[:StoneRampTrackNS] = 'NS'
    ENUM[610] = :StoneRampTrackNE ; NUME[:StoneRampTrackNE] = 610 ; Caption[:StoneRampTrackNE] = 'stone ramp track NE' ; Shape[:StoneRampTrackNE] = :RAMP ; Material[:StoneRampTrackNE] = :STONE ; Special[:StoneRampTrackNE] = :TRACK ; Direction[:StoneRampTrackNE] = 'NE'
    ENUM[611] = :StoneRampTrackNW ; NUME[:StoneRampTrackNW] = 611 ; Caption[:StoneRampTrackNW] = 'stone ramp track NW' ; Shape[:StoneRampTrackNW] = :RAMP ; Material[:StoneRampTrackNW] = :STONE ; Special[:StoneRampTrackNW] = :TRACK ; Direction[:StoneRampTrackNW] = 'NW'
    ENUM[612] = :StoneRampTrackSE ; NUME[:StoneRampTrackSE] = 612 ; Caption[:StoneRampTrackSE] = 'stone ramp track SE' ; Shape[:StoneRampTrackSE] = :RAMP ; Material[:StoneRampTrackSE] = :STONE ; Special[:StoneRampTrackSE] = :TRACK ; Direction[:StoneRampTrackSE] = 'SE'
    ENUM[613] = :StoneRampTrackSW ; NUME[:StoneRampTrackSW] = 613 ; Caption[:StoneRampTrackSW] = 'stone ramp track SW' ; Shape[:StoneRampTrackSW] = :RAMP ; Material[:StoneRampTrackSW] = :STONE ; Special[:StoneRampTrackSW] = :TRACK ; Direction[:StoneRampTrackSW] = 'SW'
    ENUM[614] = :StoneRampTrackEW ; NUME[:StoneRampTrackEW] = 614 ; Caption[:StoneRampTrackEW] = 'stone ramp track EW' ; Shape[:StoneRampTrackEW] = :RAMP ; Material[:StoneRampTrackEW] = :STONE ; Special[:StoneRampTrackEW] = :TRACK ; Direction[:StoneRampTrackEW] = 'EW'
    ENUM[615] = :StoneRampTrackNSE ; NUME[:StoneRampTrackNSE] = 615 ; Caption[:StoneRampTrackNSE] = 'stone ramp track NSE' ; Shape[:StoneRampTrackNSE] = :RAMP ; Material[:StoneRampTrackNSE] = :STONE ; Special[:StoneRampTrackNSE] = :TRACK ; Direction[:StoneRampTrackNSE] = 'NSE'
    ENUM[616] = :StoneRampTrackNSW ; NUME[:StoneRampTrackNSW] = 616 ; Caption[:StoneRampTrackNSW] = 'stone ramp track NSW' ; Shape[:StoneRampTrackNSW] = :RAMP ; Material[:StoneRampTrackNSW] = :STONE ; Special[:StoneRampTrackNSW] = :TRACK ; Direction[:StoneRampTrackNSW] = 'NSW'
    ENUM[617] = :StoneRampTrackNEW ; NUME[:StoneRampTrackNEW] = 617 ; Caption[:StoneRampTrackNEW] = 'stone ramp track NEW' ; Shape[:StoneRampTrackNEW] = :RAMP ; Material[:StoneRampTrackNEW] = :STONE ; Special[:StoneRampTrackNEW] = :TRACK ; Direction[:StoneRampTrackNEW] = 'NEW'
    ENUM[618] = :StoneRampTrackSEW ; NUME[:StoneRampTrackSEW] = 618 ; Caption[:StoneRampTrackSEW] = 'stone ramp track SEW' ; Shape[:StoneRampTrackSEW] = :RAMP ; Material[:StoneRampTrackSEW] = :STONE ; Special[:StoneRampTrackSEW] = :TRACK ; Direction[:StoneRampTrackSEW] = 'SEW'
    ENUM[619] = :StoneRampTrackNSEW ; NUME[:StoneRampTrackNSEW] = 619 ; Caption[:StoneRampTrackNSEW] = 'stone ramp track NSEW' ; Shape[:StoneRampTrackNSEW] = :RAMP ; Material[:StoneRampTrackNSEW] = :STONE ; Special[:StoneRampTrackNSEW] = :TRACK ; Direction[:StoneRampTrackNSEW] = 'NSEW'
    ENUM[620] = :LavaRampTrackN ; NUME[:LavaRampTrackN] = 620 ; Caption[:LavaRampTrackN] = 'obsidian ramp track N' ; Shape[:LavaRampTrackN] = :RAMP ; Material[:LavaRampTrackN] = :LAVA_STONE ; Special[:LavaRampTrackN] = :TRACK ; Direction[:LavaRampTrackN] = 'N'
    ENUM[621] = :LavaRampTrackS ; NUME[:LavaRampTrackS] = 621 ; Caption[:LavaRampTrackS] = 'obsidian ramp track S' ; Shape[:LavaRampTrackS] = :RAMP ; Material[:LavaRampTrackS] = :LAVA_STONE ; Special[:LavaRampTrackS] = :TRACK ; Direction[:LavaRampTrackS] = 'S'
    ENUM[622] = :LavaRampTrackE ; NUME[:LavaRampTrackE] = 622 ; Caption[:LavaRampTrackE] = 'obsidian ramp track E' ; Shape[:LavaRampTrackE] = :RAMP ; Material[:LavaRampTrackE] = :LAVA_STONE ; Special[:LavaRampTrackE] = :TRACK ; Direction[:LavaRampTrackE] = 'E'
    ENUM[623] = :LavaRampTrackW ; NUME[:LavaRampTrackW] = 623 ; Caption[:LavaRampTrackW] = 'obsidian ramp track W' ; Shape[:LavaRampTrackW] = :RAMP ; Material[:LavaRampTrackW] = :LAVA_STONE ; Special[:LavaRampTrackW] = :TRACK ; Direction[:LavaRampTrackW] = 'W'
    ENUM[624] = :LavaRampTrackNS ; NUME[:LavaRampTrackNS] = 624 ; Caption[:LavaRampTrackNS] = 'obsidian ramp track NS' ; Shape[:LavaRampTrackNS] = :RAMP ; Material[:LavaRampTrackNS] = :LAVA_STONE ; Special[:LavaRampTrackNS] = :TRACK ; Direction[:LavaRampTrackNS] = 'NS'
    ENUM[625] = :LavaRampTrackNE ; NUME[:LavaRampTrackNE] = 625 ; Caption[:LavaRampTrackNE] = 'obsidian ramp track NE' ; Shape[:LavaRampTrackNE] = :RAMP ; Material[:LavaRampTrackNE] = :LAVA_STONE ; Special[:LavaRampTrackNE] = :TRACK ; Direction[:LavaRampTrackNE] = 'NE'
    ENUM[626] = :LavaRampTrackNW ; NUME[:LavaRampTrackNW] = 626 ; Caption[:LavaRampTrackNW] = 'obsidian ramp track NW' ; Shape[:LavaRampTrackNW] = :RAMP ; Material[:LavaRampTrackNW] = :LAVA_STONE ; Special[:LavaRampTrackNW] = :TRACK ; Direction[:LavaRampTrackNW] = 'NW'
    ENUM[627] = :LavaRampTrackSE ; NUME[:LavaRampTrackSE] = 627 ; Caption[:LavaRampTrackSE] = 'obsidian ramp track SE' ; Shape[:LavaRampTrackSE] = :RAMP ; Material[:LavaRampTrackSE] = :LAVA_STONE ; Special[:LavaRampTrackSE] = :TRACK ; Direction[:LavaRampTrackSE] = 'SE'
    ENUM[628] = :LavaRampTrackSW ; NUME[:LavaRampTrackSW] = 628 ; Caption[:LavaRampTrackSW] = 'obsidian ramp track SW' ; Shape[:LavaRampTrackSW] = :RAMP ; Material[:LavaRampTrackSW] = :LAVA_STONE ; Special[:LavaRampTrackSW] = :TRACK ; Direction[:LavaRampTrackSW] = 'SW'
    ENUM[629] = :LavaRampTrackEW ; NUME[:LavaRampTrackEW] = 629 ; Caption[:LavaRampTrackEW] = 'obsidian ramp track EW' ; Shape[:LavaRampTrackEW] = :RAMP ; Material[:LavaRampTrackEW] = :LAVA_STONE ; Special[:LavaRampTrackEW] = :TRACK ; Direction[:LavaRampTrackEW] = 'EW'
    ENUM[630] = :LavaRampTrackNSE ; NUME[:LavaRampTrackNSE] = 630 ; Caption[:LavaRampTrackNSE] = 'obsidian ramp track NSE' ; Shape[:LavaRampTrackNSE] = :RAMP ; Material[:LavaRampTrackNSE] = :LAVA_STONE ; Special[:LavaRampTrackNSE] = :TRACK ; Direction[:LavaRampTrackNSE] = 'NSE'
    ENUM[631] = :LavaRampTrackNSW ; NUME[:LavaRampTrackNSW] = 631 ; Caption[:LavaRampTrackNSW] = 'obsidian ramp track NSW' ; Shape[:LavaRampTrackNSW] = :RAMP ; Material[:LavaRampTrackNSW] = :LAVA_STONE ; Special[:LavaRampTrackNSW] = :TRACK ; Direction[:LavaRampTrackNSW] = 'NSW'
    ENUM[632] = :LavaRampTrackNEW ; NUME[:LavaRampTrackNEW] = 632 ; Caption[:LavaRampTrackNEW] = 'obsidian ramp track NEW' ; Shape[:LavaRampTrackNEW] = :RAMP ; Material[:LavaRampTrackNEW] = :LAVA_STONE ; Special[:LavaRampTrackNEW] = :TRACK ; Direction[:LavaRampTrackNEW] = 'NEW'
    ENUM[633] = :LavaRampTrackSEW ; NUME[:LavaRampTrackSEW] = 633 ; Caption[:LavaRampTrackSEW] = 'obsidian ramp track SEW' ; Shape[:LavaRampTrackSEW] = :RAMP ; Material[:LavaRampTrackSEW] = :LAVA_STONE ; Special[:LavaRampTrackSEW] = :TRACK ; Direction[:LavaRampTrackSEW] = 'SEW'
    ENUM[634] = :LavaRampTrackNSEW ; NUME[:LavaRampTrackNSEW] = 634 ; Caption[:LavaRampTrackNSEW] = 'obsidian ramp track NSEW' ; Shape[:LavaRampTrackNSEW] = :RAMP ; Material[:LavaRampTrackNSEW] = :LAVA_STONE ; Special[:LavaRampTrackNSEW] = :TRACK ; Direction[:LavaRampTrackNSEW] = 'NSEW'
    ENUM[635] = :FeatureRampTrackN ; NUME[:FeatureRampTrackN] = 635 ; Caption[:FeatureRampTrackN] = 'featstone ramp track N' ; Shape[:FeatureRampTrackN] = :RAMP ; Material[:FeatureRampTrackN] = :FEATURE ; Special[:FeatureRampTrackN] = :TRACK ; Direction[:FeatureRampTrackN] = 'N'
    ENUM[636] = :FeatureRampTrackS ; NUME[:FeatureRampTrackS] = 636 ; Caption[:FeatureRampTrackS] = 'featstone ramp track S' ; Shape[:FeatureRampTrackS] = :RAMP ; Material[:FeatureRampTrackS] = :FEATURE ; Special[:FeatureRampTrackS] = :TRACK ; Direction[:FeatureRampTrackS] = 'S'
    ENUM[637] = :FeatureRampTrackE ; NUME[:FeatureRampTrackE] = 637 ; Caption[:FeatureRampTrackE] = 'featstone ramp track E' ; Shape[:FeatureRampTrackE] = :RAMP ; Material[:FeatureRampTrackE] = :FEATURE ; Special[:FeatureRampTrackE] = :TRACK ; Direction[:FeatureRampTrackE] = 'E'
    ENUM[638] = :FeatureRampTrackW ; NUME[:FeatureRampTrackW] = 638 ; Caption[:FeatureRampTrackW] = 'featstone ramp track W' ; Shape[:FeatureRampTrackW] = :RAMP ; Material[:FeatureRampTrackW] = :FEATURE ; Special[:FeatureRampTrackW] = :TRACK ; Direction[:FeatureRampTrackW] = 'W'
    ENUM[639] = :FeatureRampTrackNS ; NUME[:FeatureRampTrackNS] = 639 ; Caption[:FeatureRampTrackNS] = 'featstone ramp track NS' ; Shape[:FeatureRampTrackNS] = :RAMP ; Material[:FeatureRampTrackNS] = :FEATURE ; Special[:FeatureRampTrackNS] = :TRACK ; Direction[:FeatureRampTrackNS] = 'NS'
    ENUM[640] = :FeatureRampTrackNE ; NUME[:FeatureRampTrackNE] = 640 ; Caption[:FeatureRampTrackNE] = 'featstone ramp track NE' ; Shape[:FeatureRampTrackNE] = :RAMP ; Material[:FeatureRampTrackNE] = :FEATURE ; Special[:FeatureRampTrackNE] = :TRACK ; Direction[:FeatureRampTrackNE] = 'NE'
    ENUM[641] = :FeatureRampTrackNW ; NUME[:FeatureRampTrackNW] = 641 ; Caption[:FeatureRampTrackNW] = 'featstone ramp track NW' ; Shape[:FeatureRampTrackNW] = :RAMP ; Material[:FeatureRampTrackNW] = :FEATURE ; Special[:FeatureRampTrackNW] = :TRACK ; Direction[:FeatureRampTrackNW] = 'NW'
    ENUM[642] = :FeatureRampTrackSE ; NUME[:FeatureRampTrackSE] = 642 ; Caption[:FeatureRampTrackSE] = 'featstone ramp track SE' ; Shape[:FeatureRampTrackSE] = :RAMP ; Material[:FeatureRampTrackSE] = :FEATURE ; Special[:FeatureRampTrackSE] = :TRACK ; Direction[:FeatureRampTrackSE] = 'SE'
    ENUM[643] = :FeatureRampTrackSW ; NUME[:FeatureRampTrackSW] = 643 ; Caption[:FeatureRampTrackSW] = 'featstone ramp track SW' ; Shape[:FeatureRampTrackSW] = :RAMP ; Material[:FeatureRampTrackSW] = :FEATURE ; Special[:FeatureRampTrackSW] = :TRACK ; Direction[:FeatureRampTrackSW] = 'SW'
    ENUM[644] = :FeatureRampTrackEW ; NUME[:FeatureRampTrackEW] = 644 ; Caption[:FeatureRampTrackEW] = 'featstone ramp track EW' ; Shape[:FeatureRampTrackEW] = :RAMP ; Material[:FeatureRampTrackEW] = :FEATURE ; Special[:FeatureRampTrackEW] = :TRACK ; Direction[:FeatureRampTrackEW] = 'EW'
    ENUM[645] = :FeatureRampTrackNSE ; NUME[:FeatureRampTrackNSE] = 645 ; Caption[:FeatureRampTrackNSE] = 'featstone ramp track NSE' ; Shape[:FeatureRampTrackNSE] = :RAMP ; Material[:FeatureRampTrackNSE] = :FEATURE ; Special[:FeatureRampTrackNSE] = :TRACK ; Direction[:FeatureRampTrackNSE] = 'NSE'
    ENUM[646] = :FeatureRampTrackNSW ; NUME[:FeatureRampTrackNSW] = 646 ; Caption[:FeatureRampTrackNSW] = 'featstone ramp track NSW' ; Shape[:FeatureRampTrackNSW] = :RAMP ; Material[:FeatureRampTrackNSW] = :FEATURE ; Special[:FeatureRampTrackNSW] = :TRACK ; Direction[:FeatureRampTrackNSW] = 'NSW'
    ENUM[647] = :FeatureRampTrackNEW ; NUME[:FeatureRampTrackNEW] = 647 ; Caption[:FeatureRampTrackNEW] = 'featstone ramp track NEW' ; Shape[:FeatureRampTrackNEW] = :RAMP ; Material[:FeatureRampTrackNEW] = :FEATURE ; Special[:FeatureRampTrackNEW] = :TRACK ; Direction[:FeatureRampTrackNEW] = 'NEW'
    ENUM[648] = :FeatureRampTrackSEW ; NUME[:FeatureRampTrackSEW] = 648 ; Caption[:FeatureRampTrackSEW] = 'featstone ramp track SEW' ; Shape[:FeatureRampTrackSEW] = :RAMP ; Material[:FeatureRampTrackSEW] = :FEATURE ; Special[:FeatureRampTrackSEW] = :TRACK ; Direction[:FeatureRampTrackSEW] = 'SEW'
    ENUM[649] = :FeatureRampTrackNSEW ; NUME[:FeatureRampTrackNSEW] = 649 ; Caption[:FeatureRampTrackNSEW] = 'featstone ramp track NSEW' ; Shape[:FeatureRampTrackNSEW] = :RAMP ; Material[:FeatureRampTrackNSEW] = :FEATURE ; Special[:FeatureRampTrackNSEW] = :TRACK ; Direction[:FeatureRampTrackNSEW] = 'NSEW'
    ENUM[650] = :MineralRampTrackN ; NUME[:MineralRampTrackN] = 650 ; Caption[:MineralRampTrackN] = 'vein ramp track N' ; Shape[:MineralRampTrackN] = :RAMP ; Material[:MineralRampTrackN] = :MINERAL ; Special[:MineralRampTrackN] = :TRACK ; Direction[:MineralRampTrackN] = 'N'
    ENUM[651] = :MineralRampTrackS ; NUME[:MineralRampTrackS] = 651 ; Caption[:MineralRampTrackS] = 'vein ramp track S' ; Shape[:MineralRampTrackS] = :RAMP ; Material[:MineralRampTrackS] = :MINERAL ; Special[:MineralRampTrackS] = :TRACK ; Direction[:MineralRampTrackS] = 'S'
    ENUM[652] = :MineralRampTrackE ; NUME[:MineralRampTrackE] = 652 ; Caption[:MineralRampTrackE] = 'vein ramp track E' ; Shape[:MineralRampTrackE] = :RAMP ; Material[:MineralRampTrackE] = :MINERAL ; Special[:MineralRampTrackE] = :TRACK ; Direction[:MineralRampTrackE] = 'E'
    ENUM[653] = :MineralRampTrackW ; NUME[:MineralRampTrackW] = 653 ; Caption[:MineralRampTrackW] = 'vein ramp track W' ; Shape[:MineralRampTrackW] = :RAMP ; Material[:MineralRampTrackW] = :MINERAL ; Special[:MineralRampTrackW] = :TRACK ; Direction[:MineralRampTrackW] = 'W'
    ENUM[654] = :MineralRampTrackNS ; NUME[:MineralRampTrackNS] = 654 ; Caption[:MineralRampTrackNS] = 'vein ramp track NS' ; Shape[:MineralRampTrackNS] = :RAMP ; Material[:MineralRampTrackNS] = :MINERAL ; Special[:MineralRampTrackNS] = :TRACK ; Direction[:MineralRampTrackNS] = 'NS'
    ENUM[655] = :MineralRampTrackNE ; NUME[:MineralRampTrackNE] = 655 ; Caption[:MineralRampTrackNE] = 'vein ramp track NE' ; Shape[:MineralRampTrackNE] = :RAMP ; Material[:MineralRampTrackNE] = :MINERAL ; Special[:MineralRampTrackNE] = :TRACK ; Direction[:MineralRampTrackNE] = 'NE'
    ENUM[656] = :MineralRampTrackNW ; NUME[:MineralRampTrackNW] = 656 ; Caption[:MineralRampTrackNW] = 'vein ramp track NW' ; Shape[:MineralRampTrackNW] = :RAMP ; Material[:MineralRampTrackNW] = :MINERAL ; Special[:MineralRampTrackNW] = :TRACK ; Direction[:MineralRampTrackNW] = 'NW'
    ENUM[657] = :MineralRampTrackSE ; NUME[:MineralRampTrackSE] = 657 ; Caption[:MineralRampTrackSE] = 'vein ramp track SE' ; Shape[:MineralRampTrackSE] = :RAMP ; Material[:MineralRampTrackSE] = :MINERAL ; Special[:MineralRampTrackSE] = :TRACK ; Direction[:MineralRampTrackSE] = 'SE'
    ENUM[658] = :MineralRampTrackSW ; NUME[:MineralRampTrackSW] = 658 ; Caption[:MineralRampTrackSW] = 'vein ramp track SW' ; Shape[:MineralRampTrackSW] = :RAMP ; Material[:MineralRampTrackSW] = :MINERAL ; Special[:MineralRampTrackSW] = :TRACK ; Direction[:MineralRampTrackSW] = 'SW'
    ENUM[659] = :MineralRampTrackEW ; NUME[:MineralRampTrackEW] = 659 ; Caption[:MineralRampTrackEW] = 'vein ramp track EW' ; Shape[:MineralRampTrackEW] = :RAMP ; Material[:MineralRampTrackEW] = :MINERAL ; Special[:MineralRampTrackEW] = :TRACK ; Direction[:MineralRampTrackEW] = 'EW'
    ENUM[660] = :MineralRampTrackNSE ; NUME[:MineralRampTrackNSE] = 660 ; Caption[:MineralRampTrackNSE] = 'vein ramp track NSE' ; Shape[:MineralRampTrackNSE] = :RAMP ; Material[:MineralRampTrackNSE] = :MINERAL ; Special[:MineralRampTrackNSE] = :TRACK ; Direction[:MineralRampTrackNSE] = 'NSE'
    ENUM[661] = :MineralRampTrackNSW ; NUME[:MineralRampTrackNSW] = 661 ; Caption[:MineralRampTrackNSW] = 'vein ramp track NSW' ; Shape[:MineralRampTrackNSW] = :RAMP ; Material[:MineralRampTrackNSW] = :MINERAL ; Special[:MineralRampTrackNSW] = :TRACK ; Direction[:MineralRampTrackNSW] = 'NSW'
    ENUM[662] = :MineralRampTrackNEW ; NUME[:MineralRampTrackNEW] = 662 ; Caption[:MineralRampTrackNEW] = 'vein ramp track NEW' ; Shape[:MineralRampTrackNEW] = :RAMP ; Material[:MineralRampTrackNEW] = :MINERAL ; Special[:MineralRampTrackNEW] = :TRACK ; Direction[:MineralRampTrackNEW] = 'NEW'
    ENUM[663] = :MineralRampTrackSEW ; NUME[:MineralRampTrackSEW] = 663 ; Caption[:MineralRampTrackSEW] = 'vein ramp track SEW' ; Shape[:MineralRampTrackSEW] = :RAMP ; Material[:MineralRampTrackSEW] = :MINERAL ; Special[:MineralRampTrackSEW] = :TRACK ; Direction[:MineralRampTrackSEW] = 'SEW'
    ENUM[664] = :MineralRampTrackNSEW ; NUME[:MineralRampTrackNSEW] = 664 ; Caption[:MineralRampTrackNSEW] = 'vein ramp track NSEW' ; Shape[:MineralRampTrackNSEW] = :RAMP ; Material[:MineralRampTrackNSEW] = :MINERAL ; Special[:MineralRampTrackNSEW] = :TRACK ; Direction[:MineralRampTrackNSEW] = 'NSEW'
    ENUM[665] = :FrozenRampTrackN ; NUME[:FrozenRampTrackN] = 665 ; Caption[:FrozenRampTrackN] = 'ice ramp track N' ; Shape[:FrozenRampTrackN] = :RAMP ; Material[:FrozenRampTrackN] = :FROZEN_LIQUID ; Special[:FrozenRampTrackN] = :TRACK ; Direction[:FrozenRampTrackN] = 'N'
    ENUM[666] = :FrozenRampTrackS ; NUME[:FrozenRampTrackS] = 666 ; Caption[:FrozenRampTrackS] = 'ice ramp track S' ; Shape[:FrozenRampTrackS] = :RAMP ; Material[:FrozenRampTrackS] = :FROZEN_LIQUID ; Special[:FrozenRampTrackS] = :TRACK ; Direction[:FrozenRampTrackS] = 'S'
    ENUM[667] = :FrozenRampTrackE ; NUME[:FrozenRampTrackE] = 667 ; Caption[:FrozenRampTrackE] = 'ice ramp track E' ; Shape[:FrozenRampTrackE] = :RAMP ; Material[:FrozenRampTrackE] = :FROZEN_LIQUID ; Special[:FrozenRampTrackE] = :TRACK ; Direction[:FrozenRampTrackE] = 'E'
    ENUM[668] = :FrozenRampTrackW ; NUME[:FrozenRampTrackW] = 668 ; Caption[:FrozenRampTrackW] = 'ice ramp track W' ; Shape[:FrozenRampTrackW] = :RAMP ; Material[:FrozenRampTrackW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackW] = :TRACK ; Direction[:FrozenRampTrackW] = 'W'
    ENUM[669] = :FrozenRampTrackNS ; NUME[:FrozenRampTrackNS] = 669 ; Caption[:FrozenRampTrackNS] = 'ice ramp track NS' ; Shape[:FrozenRampTrackNS] = :RAMP ; Material[:FrozenRampTrackNS] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNS] = :TRACK ; Direction[:FrozenRampTrackNS] = 'NS'
    ENUM[670] = :FrozenRampTrackNE ; NUME[:FrozenRampTrackNE] = 670 ; Caption[:FrozenRampTrackNE] = 'ice ramp track NE' ; Shape[:FrozenRampTrackNE] = :RAMP ; Material[:FrozenRampTrackNE] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNE] = :TRACK ; Direction[:FrozenRampTrackNE] = 'NE'
    ENUM[671] = :FrozenRampTrackNW ; NUME[:FrozenRampTrackNW] = 671 ; Caption[:FrozenRampTrackNW] = 'ice ramp track NW' ; Shape[:FrozenRampTrackNW] = :RAMP ; Material[:FrozenRampTrackNW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNW] = :TRACK ; Direction[:FrozenRampTrackNW] = 'NW'
    ENUM[672] = :FrozenRampTrackSE ; NUME[:FrozenRampTrackSE] = 672 ; Caption[:FrozenRampTrackSE] = 'ice ramp track SE' ; Shape[:FrozenRampTrackSE] = :RAMP ; Material[:FrozenRampTrackSE] = :FROZEN_LIQUID ; Special[:FrozenRampTrackSE] = :TRACK ; Direction[:FrozenRampTrackSE] = 'SE'
    ENUM[673] = :FrozenRampTrackSW ; NUME[:FrozenRampTrackSW] = 673 ; Caption[:FrozenRampTrackSW] = 'ice ramp track SW' ; Shape[:FrozenRampTrackSW] = :RAMP ; Material[:FrozenRampTrackSW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackSW] = :TRACK ; Direction[:FrozenRampTrackSW] = 'SW'
    ENUM[674] = :FrozenRampTrackEW ; NUME[:FrozenRampTrackEW] = 674 ; Caption[:FrozenRampTrackEW] = 'ice ramp track EW' ; Shape[:FrozenRampTrackEW] = :RAMP ; Material[:FrozenRampTrackEW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackEW] = :TRACK ; Direction[:FrozenRampTrackEW] = 'EW'
    ENUM[675] = :FrozenRampTrackNSE ; NUME[:FrozenRampTrackNSE] = 675 ; Caption[:FrozenRampTrackNSE] = 'ice ramp track NSE' ; Shape[:FrozenRampTrackNSE] = :RAMP ; Material[:FrozenRampTrackNSE] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNSE] = :TRACK ; Direction[:FrozenRampTrackNSE] = 'NSE'
    ENUM[676] = :FrozenRampTrackNSW ; NUME[:FrozenRampTrackNSW] = 676 ; Caption[:FrozenRampTrackNSW] = 'ice ramp track NSW' ; Shape[:FrozenRampTrackNSW] = :RAMP ; Material[:FrozenRampTrackNSW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNSW] = :TRACK ; Direction[:FrozenRampTrackNSW] = 'NSW'
    ENUM[677] = :FrozenRampTrackNEW ; NUME[:FrozenRampTrackNEW] = 677 ; Caption[:FrozenRampTrackNEW] = 'ice ramp track NEW' ; Shape[:FrozenRampTrackNEW] = :RAMP ; Material[:FrozenRampTrackNEW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNEW] = :TRACK ; Direction[:FrozenRampTrackNEW] = 'NEW'
    ENUM[678] = :FrozenRampTrackSEW ; NUME[:FrozenRampTrackSEW] = 678 ; Caption[:FrozenRampTrackSEW] = 'ice ramp track SEW' ; Shape[:FrozenRampTrackSEW] = :RAMP ; Material[:FrozenRampTrackSEW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackSEW] = :TRACK ; Direction[:FrozenRampTrackSEW] = 'SEW'
    ENUM[679] = :FrozenRampTrackNSEW ; NUME[:FrozenRampTrackNSEW] = 679 ; Caption[:FrozenRampTrackNSEW] = 'ice ramp track NSEW' ; Shape[:FrozenRampTrackNSEW] = :RAMP ; Material[:FrozenRampTrackNSEW] = :FROZEN_LIQUID ; Special[:FrozenRampTrackNSEW] = :TRACK ; Direction[:FrozenRampTrackNSEW] = 'NSEW'
    ENUM[680] = :ConstructedRampTrackN ; NUME[:ConstructedRampTrackN] = 680 ; Caption[:ConstructedRampTrackN] = 'constructed ramp track N' ; Shape[:ConstructedRampTrackN] = :RAMP ; Material[:ConstructedRampTrackN] = :CONSTRUCTION ; Special[:ConstructedRampTrackN] = :TRACK ; Direction[:ConstructedRampTrackN] = 'N'
    ENUM[681] = :ConstructedRampTrackS ; NUME[:ConstructedRampTrackS] = 681 ; Caption[:ConstructedRampTrackS] = 'constructed ramp track S' ; Shape[:ConstructedRampTrackS] = :RAMP ; Material[:ConstructedRampTrackS] = :CONSTRUCTION ; Special[:ConstructedRampTrackS] = :TRACK ; Direction[:ConstructedRampTrackS] = 'S'
    ENUM[682] = :ConstructedRampTrackE ; NUME[:ConstructedRampTrackE] = 682 ; Caption[:ConstructedRampTrackE] = 'constructed ramp track E' ; Shape[:ConstructedRampTrackE] = :RAMP ; Material[:ConstructedRampTrackE] = :CONSTRUCTION ; Special[:ConstructedRampTrackE] = :TRACK ; Direction[:ConstructedRampTrackE] = 'E'
    ENUM[683] = :ConstructedRampTrackW ; NUME[:ConstructedRampTrackW] = 683 ; Caption[:ConstructedRampTrackW] = 'constructed ramp track W' ; Shape[:ConstructedRampTrackW] = :RAMP ; Material[:ConstructedRampTrackW] = :CONSTRUCTION ; Special[:ConstructedRampTrackW] = :TRACK ; Direction[:ConstructedRampTrackW] = 'W'
    ENUM[684] = :ConstructedRampTrackNS ; NUME[:ConstructedRampTrackNS] = 684 ; Caption[:ConstructedRampTrackNS] = 'constructed ramp track NS' ; Shape[:ConstructedRampTrackNS] = :RAMP ; Material[:ConstructedRampTrackNS] = :CONSTRUCTION ; Special[:ConstructedRampTrackNS] = :TRACK ; Direction[:ConstructedRampTrackNS] = 'NS'
    ENUM[685] = :ConstructedRampTrackNE ; NUME[:ConstructedRampTrackNE] = 685 ; Caption[:ConstructedRampTrackNE] = 'constructed ramp track NE' ; Shape[:ConstructedRampTrackNE] = :RAMP ; Material[:ConstructedRampTrackNE] = :CONSTRUCTION ; Special[:ConstructedRampTrackNE] = :TRACK ; Direction[:ConstructedRampTrackNE] = 'NE'
    ENUM[686] = :ConstructedRampTrackNW ; NUME[:ConstructedRampTrackNW] = 686 ; Caption[:ConstructedRampTrackNW] = 'constructed ramp track NW' ; Shape[:ConstructedRampTrackNW] = :RAMP ; Material[:ConstructedRampTrackNW] = :CONSTRUCTION ; Special[:ConstructedRampTrackNW] = :TRACK ; Direction[:ConstructedRampTrackNW] = 'NW'
    ENUM[687] = :ConstructedRampTrackSE ; NUME[:ConstructedRampTrackSE] = 687 ; Caption[:ConstructedRampTrackSE] = 'constructed ramp track SE' ; Shape[:ConstructedRampTrackSE] = :RAMP ; Material[:ConstructedRampTrackSE] = :CONSTRUCTION ; Special[:ConstructedRampTrackSE] = :TRACK ; Direction[:ConstructedRampTrackSE] = 'SE'
    ENUM[688] = :ConstructedRampTrackSW ; NUME[:ConstructedRampTrackSW] = 688 ; Caption[:ConstructedRampTrackSW] = 'constructed ramp track SW' ; Shape[:ConstructedRampTrackSW] = :RAMP ; Material[:ConstructedRampTrackSW] = :CONSTRUCTION ; Special[:ConstructedRampTrackSW] = :TRACK ; Direction[:ConstructedRampTrackSW] = 'SW'
    ENUM[689] = :ConstructedRampTrackEW ; NUME[:ConstructedRampTrackEW] = 689 ; Caption[:ConstructedRampTrackEW] = 'constructed ramp track EW' ; Shape[:ConstructedRampTrackEW] = :RAMP ; Material[:ConstructedRampTrackEW] = :CONSTRUCTION ; Special[:ConstructedRampTrackEW] = :TRACK ; Direction[:ConstructedRampTrackEW] = 'EW'
    ENUM[690] = :ConstructedRampTrackNSE ; NUME[:ConstructedRampTrackNSE] = 690 ; Caption[:ConstructedRampTrackNSE] = 'constructed ramp track NSE' ; Shape[:ConstructedRampTrackNSE] = :RAMP ; Material[:ConstructedRampTrackNSE] = :CONSTRUCTION ; Special[:ConstructedRampTrackNSE] = :TRACK ; Direction[:ConstructedRampTrackNSE] = 'NSE'
    ENUM[691] = :ConstructedRampTrackNSW ; NUME[:ConstructedRampTrackNSW] = 691 ; Caption[:ConstructedRampTrackNSW] = 'constructed ramp track NSW' ; Shape[:ConstructedRampTrackNSW] = :RAMP ; Material[:ConstructedRampTrackNSW] = :CONSTRUCTION ; Special[:ConstructedRampTrackNSW] = :TRACK ; Direction[:ConstructedRampTrackNSW] = 'NSW'
    ENUM[692] = :ConstructedRampTrackNEW ; NUME[:ConstructedRampTrackNEW] = 692 ; Caption[:ConstructedRampTrackNEW] = 'constructed ramp track NEW' ; Shape[:ConstructedRampTrackNEW] = :RAMP ; Material[:ConstructedRampTrackNEW] = :CONSTRUCTION ; Special[:ConstructedRampTrackNEW] = :TRACK ; Direction[:ConstructedRampTrackNEW] = 'NEW'
    ENUM[693] = :ConstructedRampTrackSEW ; NUME[:ConstructedRampTrackSEW] = 693 ; Caption[:ConstructedRampTrackSEW] = 'constructed ramp track SEW' ; Shape[:ConstructedRampTrackSEW] = :RAMP ; Material[:ConstructedRampTrackSEW] = :CONSTRUCTION ; Special[:ConstructedRampTrackSEW] = :TRACK ; Direction[:ConstructedRampTrackSEW] = 'SEW'
    ENUM[694] = :ConstructedRampTrackNSEW ; NUME[:ConstructedRampTrackNSEW] = 694 ; Caption[:ConstructedRampTrackNSEW] = 'constructed ramp track NSEW' ; Shape[:ConstructedRampTrackNSEW] = :RAMP ; Material[:ConstructedRampTrackNSEW] = :CONSTRUCTION ; Special[:ConstructedRampTrackNSEW] = :TRACK ; Direction[:ConstructedRampTrackNSEW] = 'NSEW'
end

class TiletypeMaterial < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :AIR ; NUME[:AIR] = 0 ; Caption[:AIR] = 'empty'
    ENUM[1] = :SOIL ; NUME[:SOIL] = 1 ; Caption[:SOIL] = 'ordinary soil. material depends on geology'
    ENUM[2] = :STONE ; NUME[:STONE] = 2 ; Caption[:STONE] = 'ordinary layer stone. material depends on geology'
    ENUM[3] = :FEATURE ; NUME[:FEATURE] = 3 ; Caption[:FEATURE] = 'map special stone. used for things like hell, curious structures, or adamantine tubes. material depends on local/global special'
    ENUM[4] = :LAVA_STONE ; NUME[:LAVA_STONE] = 4 ; Caption[:LAVA_STONE] = 'lava stone created by mixing magma and water'
    ENUM[5] = :MINERAL ; NUME[:MINERAL] = 5 ; Caption[:MINERAL] = 'vein stone. material depends on mineral veins present'
    ENUM[6] = :FROZEN_LIQUID ; NUME[:FROZEN_LIQUID] = 6 ; Caption[:FROZEN_LIQUID] = 'frozen liquid. material depends on ice vein present (which also indicates what was on the tile before it froze)'
    ENUM[7] = :CONSTRUCTION ; NUME[:CONSTRUCTION] = 7 ; Caption[:CONSTRUCTION] = 'material depends on the construction present'
    ENUM[8] = :GRASS_LIGHT ; NUME[:GRASS_LIGHT] = 8 ; Caption[:GRASS_LIGHT] = 'light grass'
    ENUM[9] = :GRASS_DARK ; NUME[:GRASS_DARK] = 9 ; Caption[:GRASS_DARK] = 'dark grass'
    ENUM[10] = :GRASS_DRY ; NUME[:GRASS_DRY] = 10 ; Caption[:GRASS_DRY] = 'dry grass'
    ENUM[11] = :GRASS_DEAD ; NUME[:GRASS_DEAD] = 11 ; Caption[:GRASS_DEAD] = 'dead grass'
    ENUM[12] = :PLANT ; NUME[:PLANT] = 12 ; Caption[:PLANT] = 'plant'
    ENUM[13] = :HFS ; NUME[:HFS] = 13 ; Caption[:HFS] = 'the stuff glowing barriers/floors and eerie pits are made of - this makes them different from ordinary walls/floors and chasms'
    ENUM[14] = :CAMPFIRE ; NUME[:CAMPFIRE] = 14 ; Caption[:CAMPFIRE] = 'human armies make them when they siege. original tile is lost?'
    ENUM[15] = :FIRE ; NUME[:FIRE] = 15 ; Caption[:FIRE] = 'burning grass'
    ENUM[16] = :ASHES ; NUME[:ASHES] = 16 ; Caption[:ASHES] = 'what remains from a fire'
    ENUM[17] = :MAGMA ; NUME[:MAGMA] = 17 ; Caption[:MAGMA] = 'material for semi-molten rock and magma flow tiles'
    ENUM[18] = :DRIFTWOOD ; NUME[:DRIFTWOOD] = 18 ; Caption[:DRIFTWOOD] = 'driftwood. normally shows up on beaches'
    ENUM[19] = :POOL ; NUME[:POOL] = 19 ; Caption[:POOL] = 'A pool. Gathers water while it\'s raining.'
    ENUM[20] = :BROOK ; NUME[:BROOK] = 20 ; Caption[:BROOK] = 'Brook beds and floors'
    ENUM[21] = :RIVER ; NUME[:RIVER] = 21 ; Caption[:RIVER] = 'It\'s a riverbed. Basically a tile that doesn\'t get muddy.'
    ENUM[22] = :ROOT ; NUME[:ROOT] = 22 ; Caption[:ROOT] = 'tree root'
    ENUM[23] = :TREE ; NUME[:TREE] = 23 ; Caption[:TREE] = 'tree trunk/branch'
    ENUM[24] = :MUSHROOM ; NUME[:MUSHROOM] = 24 ; Caption[:MUSHROOM] = 'mushroom cap'
    ENUM[25] = :UNDERWORLD_GATE ; NUME[:UNDERWORLD_GATE] = 25 ; Caption[:UNDERWORLD_GATE] = 'Underworld Gate'
end

class TiletypeShape < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    BasicShape = Hash.new(:None)
    PassableLow = Hash.new(false)
    PassableHigh = Hash.new(false)
    PassableFlow = Hash.new(false)
    PassableFlowDown = Hash.new(false)
    Walkable = Hash.new(false)
    WalkableUp = Hash.new(false)
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :EMPTY ; NUME[:EMPTY] = 0 ; BasicShape[:EMPTY] = :Open ; PassableLow[:EMPTY] = true ; PassableHigh[:EMPTY] = true ; PassableFlow[:EMPTY] = true ; PassableFlowDown[:EMPTY] = true
    ENUM[1] = :FLOOR ; NUME[:FLOOR] = 1 ; BasicShape[:FLOOR] = :Floor ; PassableHigh[:FLOOR] = true ; PassableFlow[:FLOOR] = true ; Walkable[:FLOOR] = true
    ENUM[2] = :BOULDER ; NUME[:BOULDER] = 2 ; BasicShape[:BOULDER] = :Floor ; PassableHigh[:BOULDER] = true ; PassableFlow[:BOULDER] = true ; Walkable[:BOULDER] = true
    ENUM[3] = :PEBBLES ; NUME[:PEBBLES] = 3 ; BasicShape[:PEBBLES] = :Floor ; PassableHigh[:PEBBLES] = true ; PassableFlow[:PEBBLES] = true ; Walkable[:PEBBLES] = true
    ENUM[4] = :WALL ; NUME[:WALL] = 4 ; BasicShape[:WALL] = :Wall
    ENUM[5] = :FORTIFICATION ; NUME[:FORTIFICATION] = 5 ; BasicShape[:FORTIFICATION] = :Wall ; PassableFlow[:FORTIFICATION] = true
    ENUM[6] = :STAIR_UP ; NUME[:STAIR_UP] = 6 ; BasicShape[:STAIR_UP] = :Stair ; PassableHigh[:STAIR_UP] = true ; PassableFlow[:STAIR_UP] = true ; Walkable[:STAIR_UP] = true ; WalkableUp[:STAIR_UP] = true
    ENUM[7] = :STAIR_DOWN ; NUME[:STAIR_DOWN] = 7 ; BasicShape[:STAIR_DOWN] = :Stair ; PassableLow[:STAIR_DOWN] = true ; PassableHigh[:STAIR_DOWN] = true ; PassableFlow[:STAIR_DOWN] = true ; PassableFlowDown[:STAIR_DOWN] = true ; Walkable[:STAIR_DOWN] = true
    ENUM[8] = :STAIR_UPDOWN ; NUME[:STAIR_UPDOWN] = 8 ; BasicShape[:STAIR_UPDOWN] = :Stair ; PassableLow[:STAIR_UPDOWN] = true ; PassableHigh[:STAIR_UPDOWN] = true ; PassableFlow[:STAIR_UPDOWN] = true ; PassableFlowDown[:STAIR_UPDOWN] = true ; Walkable[:STAIR_UPDOWN] = true ; WalkableUp[:STAIR_UPDOWN] = true
    ENUM[9] = :RAMP ; NUME[:RAMP] = 9 ; Caption[:RAMP] = 'ramps have no direction' ; BasicShape[:RAMP] = :Ramp ; PassableHigh[:RAMP] = true ; PassableFlow[:RAMP] = true ; Walkable[:RAMP] = true ; WalkableUp[:RAMP] = true
    ENUM[10] = :RAMP_TOP ; NUME[:RAMP_TOP] = 10 ; Caption[:RAMP_TOP] = 'used for pathing?' ; BasicShape[:RAMP_TOP] = :Open ; PassableLow[:RAMP_TOP] = true ; PassableHigh[:RAMP_TOP] = true ; PassableFlow[:RAMP_TOP] = true ; PassableFlowDown[:RAMP_TOP] = true ; Walkable[:RAMP_TOP] = true
    ENUM[11] = :BROOK_BED ; NUME[:BROOK_BED] = 11 ; Caption[:BROOK_BED] = 'mineable, water-passable rock on the bottom of a brook' ; BasicShape[:BROOK_BED] = :Wall ; PassableFlow[:BROOK_BED] = true
    ENUM[12] = :BROOK_TOP ; NUME[:BROOK_TOP] = 12 ; Caption[:BROOK_TOP] = 'water-passable floor on top of BROOK_BED tiles' ; BasicShape[:BROOK_TOP] = :Floor ; PassableHigh[:BROOK_TOP] = true ; PassableFlow[:BROOK_TOP] = true ; PassableFlowDown[:BROOK_TOP] = true ; Walkable[:BROOK_TOP] = true
    ENUM[13] = :BRANCH ; NUME[:BRANCH] = 13 ; Caption[:BRANCH] = 'small tree branch' ; BasicShape[:BRANCH] = :Floor ; PassableHigh[:BRANCH] = true ; PassableFlow[:BRANCH] = true ; PassableFlowDown[:BRANCH] = true ; Walkable[:BRANCH] = true
    ENUM[14] = :TRUNK_BRANCH ; NUME[:TRUNK_BRANCH] = 14 ; Caption[:TRUNK_BRANCH] = 'large tree branch' ; BasicShape[:TRUNK_BRANCH] = :Floor ; PassableHigh[:TRUNK_BRANCH] = true ; PassableFlow[:TRUNK_BRANCH] = true ; PassableFlowDown[:TRUNK_BRANCH] = true ; Walkable[:TRUNK_BRANCH] = true
    ENUM[15] = :TWIG ; NUME[:TWIG] = 15 ; Caption[:TWIG] = 'tiny tree branch, not strong enough to support creatures' ; BasicShape[:TWIG] = :Open ; PassableLow[:TWIG] = true ; PassableHigh[:TWIG] = true ; PassableFlow[:TWIG] = true ; PassableFlowDown[:TWIG] = true
    ENUM[16] = :SAPLING ; NUME[:SAPLING] = 16 ; BasicShape[:SAPLING] = :Floor ; PassableHigh[:SAPLING] = true ; PassableFlow[:SAPLING] = true ; Walkable[:SAPLING] = true
    ENUM[17] = :SHRUB ; NUME[:SHRUB] = 17 ; BasicShape[:SHRUB] = :Floor ; PassableHigh[:SHRUB] = true ; PassableFlow[:SHRUB] = true ; Walkable[:SHRUB] = true
    ENUM[18] = :ENDLESS_PIT ; NUME[:ENDLESS_PIT] = 18 ; Caption[:ENDLESS_PIT] = 'a fake endless pit' ; BasicShape[:ENDLESS_PIT] = :Open ; PassableHigh[:ENDLESS_PIT] = true ; PassableFlow[:ENDLESS_PIT] = true ; Walkable[:ENDLESS_PIT] = true
end

class TiletypeShapeBasic < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Open ; NUME[:Open] = 0
    ENUM[1] = :Floor ; NUME[:Floor] = 1
    ENUM[2] = :Ramp ; NUME[:Ramp] = 2
    ENUM[3] = :Wall ; NUME[:Wall] = 3
    ENUM[4] = :Stair ; NUME[:Stair] = 4
end

class TiletypeSpecial < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :NORMAL ; NUME[:NORMAL] = 0 ; Caption[:NORMAL] = 'default for all tiles, nothing special about it'
    ENUM[1] = :RIVER_SOURCE ; NUME[:RIVER_SOURCE] = 1 ; Caption[:RIVER_SOURCE] = 'river source, when it exists on a map'
    ENUM[2] = :WATERFALL ; NUME[:WATERFALL] = 2 ; Caption[:WATERFALL] = 'waterfall from nowhere, used by cave rivers back in 40d'
    ENUM[3] = :SMOOTH ; NUME[:SMOOTH] = 3 ; Caption[:SMOOTH] = 'smooth walls and floors, including constructions'
    ENUM[4] = :FURROWED ; NUME[:FURROWED] = 4 ; Caption[:FURROWED] = 'furrowed soil, left by roads/farms and removing constructions'
    ENUM[5] = :WET ; NUME[:WET] = 5 ; Caption[:WET] = 'wet soil, found on beaches'
    ENUM[6] = :DEAD ; NUME[:DEAD] = 6 ; Caption[:DEAD] = 'dead, used by plants'
    ENUM[7] = :WORN_1 ; NUME[:WORN_1] = 7 ; Caption[:WORN_1] = 'partially (25%) mined walls'
    ENUM[8] = :WORN_2 ; NUME[:WORN_2] = 8 ; Caption[:WORN_2] = 'partially (50%) mined walls'
    ENUM[9] = :WORN_3 ; NUME[:WORN_3] = 9 ; Caption[:WORN_3] = 'partially (75%) mined walls'
    ENUM[10] = :TRACK ; NUME[:TRACK] = 10 ; Caption[:TRACK] = 'mine cart track'
    ENUM[11] = :SMOOTH_DEAD ; NUME[:SMOOTH_DEAD] = 11 ; Caption[:SMOOTH_DEAD] = 'smooth dead leaves, a unique combination'
end

class TiletypeVariant < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :VAR_1 ; NUME[:VAR_1] = 0
    ENUM[1] = :VAR_2 ; NUME[:VAR_2] = 1
    ENUM[2] = :VAR_3 ; NUME[:VAR_3] = 2
    ENUM[3] = :VAR_4 ; NUME[:VAR_4] = 3
end

class TimbreType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CLEAR ; NUME[:CLEAR] = 0
    ENUM[1] = :NOISY ; NUME[:NOISY] = 1
    ENUM[2] = :FULL ; NUME[:FULL] = 2
    ENUM[3] = :THIN ; NUME[:THIN] = 3
    ENUM[4] = :ROUND ; NUME[:ROUND] = 4
    ENUM[5] = :SHARP ; NUME[:SHARP] = 5
    ENUM[6] = :SMOOTH ; NUME[:SMOOTH] = 6
    ENUM[7] = :CHOPPY ; NUME[:CHOPPY] = 7
    ENUM[8] = :STEADY ; NUME[:STEADY] = 8
    ENUM[9] = :EVOLVING ; NUME[:EVOLVING] = 9
    ENUM[10] = :STRONG ; NUME[:STRONG] = 10
    ENUM[11] = :DELICATE ; NUME[:DELICATE] = 11
    ENUM[12] = :BRIGHT ; NUME[:BRIGHT] = 12
    ENUM[13] = :GRACEFUL ; NUME[:GRACEFUL] = 13
    ENUM[14] = :SPARSE ; NUME[:SPARSE] = 14
    ENUM[15] = :BREATHY ; NUME[:BREATHY] = 15
    ENUM[16] = :STRAINED ; NUME[:STRAINED] = 16
    ENUM[17] = :BROAD ; NUME[:BROAD] = 17
    ENUM[18] = :LIGHT ; NUME[:LIGHT] = 18
    ENUM[19] = :MELLOW ; NUME[:MELLOW] = 19
    ENUM[20] = :WOBBLING ; NUME[:WOBBLING] = 20
    ENUM[21] = :FOCUSED ; NUME[:FOCUSED] = 21
    ENUM[22] = :EVEN ; NUME[:EVEN] = 22
    ENUM[23] = :FLUID ; NUME[:FLUID] = 23
    ENUM[24] = :VIBRATING ; NUME[:VIBRATING] = 24
    ENUM[25] = :QUAVERING ; NUME[:QUAVERING] = 25
    ENUM[26] = :EERIE ; NUME[:EERIE] = 26
    ENUM[27] = :FRAGILE ; NUME[:FRAGILE] = 27
    ENUM[28] = :BRITTLE ; NUME[:BRITTLE] = 28
    ENUM[29] = :PURE_ ; NUME[:PURE_] = 29
    ENUM[30] = :PIERCING ; NUME[:PIERCING] = 30
    ENUM[31] = :STRIDENT ; NUME[:STRIDENT] = 31
    ENUM[32] = :WAVERING ; NUME[:WAVERING] = 32
    ENUM[33] = :HARSH ; NUME[:HARSH] = 33
    ENUM[34] = :REEDY ; NUME[:REEDY] = 34
    ENUM[35] = :NASAL ; NUME[:NASAL] = 35
    ENUM[36] = :BUZZY ; NUME[:BUZZY] = 36
    ENUM[37] = :ROUGH ; NUME[:ROUGH] = 37
    ENUM[38] = :WARM ; NUME[:WARM] = 38
    ENUM[39] = :RUGGED ; NUME[:RUGGED] = 39
    ENUM[40] = :HEAVY ; NUME[:HEAVY] = 40
    ENUM[41] = :FLAT ; NUME[:FLAT] = 41
    ENUM[42] = :DARK ; NUME[:DARK] = 42
    ENUM[43] = :CRISP ; NUME[:CRISP] = 43
    ENUM[44] = :SONOROUS ; NUME[:SONOROUS] = 44
    ENUM[45] = :WATERY ; NUME[:WATERY] = 45
    ENUM[46] = :GENTLE ; NUME[:GENTLE] = 46
    ENUM[47] = :SLICING ; NUME[:SLICING] = 47
    ENUM[48] = :LIQUID ; NUME[:LIQUID] = 48
    ENUM[49] = :RAUCOUS ; NUME[:RAUCOUS] = 49
    ENUM[50] = :BREEZY ; NUME[:BREEZY] = 50
    ENUM[51] = :RASPY ; NUME[:RASPY] = 51
    ENUM[52] = :WISPY ; NUME[:WISPY] = 52
    ENUM[53] = :SHRILL ; NUME[:SHRILL] = 53
    ENUM[54] = :MUDDY ; NUME[:MUDDY] = 54
    ENUM[55] = :RICH ; NUME[:RICH] = 55
    ENUM[56] = :DULL ; NUME[:DULL] = 56
    ENUM[57] = :FLOATING ; NUME[:FLOATING] = 57
    ENUM[58] = :RINGING ; NUME[:RINGING] = 58
    ENUM[59] = :RESONANT ; NUME[:RESONANT] = 59
    ENUM[60] = :SWEET ; NUME[:SWEET] = 60
    ENUM[61] = :RIPPLING ; NUME[:RIPPLING] = 61
    ENUM[62] = :SPARKLING ; NUME[:SPARKLING] = 62
end

class TimedEventType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Caravan ; NUME[:Caravan] = 0
    ENUM[1] = :Migrants ; NUME[:Migrants] = 1
    ENUM[2] = :Diplomat ; NUME[:Diplomat] = 2
    ENUM[3] = :FeatureAttack ; NUME[:FeatureAttack] = 3
    ENUM[4] = :Megabeast ; NUME[:Megabeast] = 4
    ENUM[5] = :WildlifeCurious ; NUME[:WildlifeCurious] = 5
    ENUM[6] = :WildlifeMischievous ; NUME[:WildlifeMischievous] = 6
    ENUM[7] = :WildlifeFlier ; NUME[:WildlifeFlier] = 7
    ENUM[8] = :NightCreature ; NUME[:NightCreature] = 8
end

class TissueFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :THICKENS_ON_STRENGTH ; NUME[:THICKENS_ON_STRENGTH] = 0
    ENUM[1] = :THICKENS_ON_ENERGY_STORAGE ; NUME[:THICKENS_ON_ENERGY_STORAGE] = 1
    ENUM[2] = :ARTERIES ; NUME[:ARTERIES] = 2
    ENUM[3] = :SCARS ; NUME[:SCARS] = 3
    ENUM[4] = :STRUCTURAL ; NUME[:STRUCTURAL] = 4
    ENUM[5] = :NERVOUS ; NUME[:NERVOUS] = 5
    ENUM[6] = :THOUGHT ; NUME[:THOUGHT] = 6
    ENUM[7] = :MUSCULAR ; NUME[:MUSCULAR] = 7
    ENUM[8] = :SMELL ; NUME[:SMELL] = 8
    ENUM[9] = :HEAR ; NUME[:HEAR] = 9
    ENUM[10] = :FLIGHT ; NUME[:FLIGHT] = 10
    ENUM[11] = :BREATHE ; NUME[:BREATHE] = 11
    ENUM[12] = :SIGHT ; NUME[:SIGHT] = 12
    ENUM[13] = :COSMETIC ; NUME[:COSMETIC] = 13
    ENUM[14] = :CONNECTS ; NUME[:CONNECTS] = 14
    ENUM[15] = :FUNCTIONAL ; NUME[:FUNCTIONAL] = 15
    ENUM[16] = :MAJOR_ARTERIES ; NUME[:MAJOR_ARTERIES] = 16
    ENUM[17] = :TISSUE_LEAKS ; NUME[:TISSUE_LEAKS] = 17
    ENUM[18] = :STYLEABLE ; NUME[:STYLEABLE] = 18
    ENUM[19] = :CONNECTIVE_TISSUE_ANCHOR ; NUME[:CONNECTIVE_TISSUE_ANCHOR] = 19
    ENUM[20] = :SETTABLE ; NUME[:SETTABLE] = 20
    ENUM[21] = :SPLINTABLE ; NUME[:SPLINTABLE] = 21
end

class TissueStyleType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :NEATLY_COMBED ; NUME[:NEATLY_COMBED] = 0
    ENUM[1] = :BRAIDED ; NUME[:BRAIDED] = 1
    ENUM[2] = :DOUBLE_BRAIDS ; NUME[:DOUBLE_BRAIDS] = 2
    ENUM[3] = :PONY_TAILS ; NUME[:PONY_TAILS] = 3
    ENUM[4] = :CLEAN_SHAVEN ; NUME[:CLEAN_SHAVEN] = 4
end

class ToolFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HARD_MAT ; NUME[:HARD_MAT] = 0
    ENUM[1] = :METAL_MAT ; NUME[:METAL_MAT] = 1
    ENUM[2] = :HAS_EDGE_ATTACK ; NUME[:HAS_EDGE_ATTACK] = 2
    ENUM[3] = :METAL_WEAPON_MAT ; NUME[:METAL_WEAPON_MAT] = 3
    ENUM[4] = :UNIMPROVABLE ; NUME[:UNIMPROVABLE] = 4
    ENUM[5] = :SOFT_MAT ; NUME[:SOFT_MAT] = 5
    ENUM[6] = :WOOD_MAT ; NUME[:WOOD_MAT] = 6
    ENUM[7] = :INVERTED_TILE ; NUME[:INVERTED_TILE] = 7
    ENUM[8] = :FURNITURE ; NUME[:FURNITURE] = 8
    ENUM[9] = :LEATHER_MAT ; NUME[:LEATHER_MAT] = 9
    ENUM[10] = :SILK_MAT ; NUME[:SILK_MAT] = 10
    ENUM[11] = :THREAD_PLANT_MAT ; NUME[:THREAD_PLANT_MAT] = 11
    ENUM[12] = :GLASS_MAT ; NUME[:GLASS_MAT] = 12
    ENUM[13] = :CERAMIC_MAT ; NUME[:CERAMIC_MAT] = 13
    ENUM[14] = :STONE_MAT ; NUME[:STONE_MAT] = 14
    ENUM[15] = :SHELL_MAT ; NUME[:SHELL_MAT] = 15
    ENUM[16] = :BONE_MAT ; NUME[:BONE_MAT] = 16
    ENUM[17] = :NO_DEFAULT_JOB ; NUME[:NO_DEFAULT_JOB] = 17
    ENUM[18] = :INCOMPLETE_ITEM ; NUME[:INCOMPLETE_ITEM] = 18
    ENUM[19] = :SHEET_MAT ; NUME[:SHEET_MAT] = 19
end

class ToolUses < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :LIQUID_COOKING ; NUME[:LIQUID_COOKING] = 0
    ENUM[1] = :LIQUID_SCOOP ; NUME[:LIQUID_SCOOP] = 1
    ENUM[2] = :GRIND_POWDER_RECEPTACLE ; NUME[:GRIND_POWDER_RECEPTACLE] = 2
    ENUM[3] = :GRIND_POWDER_GRINDER ; NUME[:GRIND_POWDER_GRINDER] = 3
    ENUM[4] = :MEAT_CARVING ; NUME[:MEAT_CARVING] = 4
    ENUM[5] = :MEAT_BONING ; NUME[:MEAT_BONING] = 5
    ENUM[6] = :MEAT_SLICING ; NUME[:MEAT_SLICING] = 6
    ENUM[7] = :MEAT_CLEAVING ; NUME[:MEAT_CLEAVING] = 7
    ENUM[8] = :HOLD_MEAT_FOR_CARVING ; NUME[:HOLD_MEAT_FOR_CARVING] = 8
    ENUM[9] = :MEAL_CONTAINER ; NUME[:MEAL_CONTAINER] = 9
    ENUM[10] = :LIQUID_CONTAINER ; NUME[:LIQUID_CONTAINER] = 10
    ENUM[11] = :FOOD_STORAGE ; NUME[:FOOD_STORAGE] = 11
    ENUM[12] = :HIVE ; NUME[:HIVE] = 12
    ENUM[13] = :NEST_BOX ; NUME[:NEST_BOX] = 13
    ENUM[14] = :SMALL_OBJECT_STORAGE ; NUME[:SMALL_OBJECT_STORAGE] = 14
    ENUM[15] = :TRACK_CART ; NUME[:TRACK_CART] = 15
    ENUM[16] = :HEAVY_OBJECT_HAULING ; NUME[:HEAVY_OBJECT_HAULING] = 16
    ENUM[17] = :STAND_AND_WORK_ABOVE ; NUME[:STAND_AND_WORK_ABOVE] = 17
    ENUM[18] = :ROLL_UP_SHEET ; NUME[:ROLL_UP_SHEET] = 18
    ENUM[19] = :PROTECT_FOLDED_SHEETS ; NUME[:PROTECT_FOLDED_SHEETS] = 19
    ENUM[20] = :CONTAIN_WRITING ; NUME[:CONTAIN_WRITING] = 20
    ENUM[21] = :BOOKCASE ; NUME[:BOOKCASE] = 21
    ENUM[22] = :DISPLAY_OBJECT ; NUME[:DISPLAY_OBJECT] = 22
    ENUM[23] = :PLACE_OFFERING ; NUME[:PLACE_OFFERING] = 23
    ENUM[24] = :DIVINATION ; NUME[:DIVINATION] = 24
    ENUM[25] = :GAMES_OF_CHANCE ; NUME[:GAMES_OF_CHANCE] = 25
end

class ToyFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :HARD_MAT ; NUME[:HARD_MAT] = 0
end

class TrainingKnowledgeLevel < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :None ; NUME[:None] = 0
    ENUM[1] = :FewFacts ; NUME[:FewFacts] = 1
    ENUM[2] = :GeneralFamiliarity ; NUME[:GeneralFamiliarity] = 2
    ENUM[3] = :Knowledgeable ; NUME[:Knowledgeable] = 3
    ENUM[4] = :Expert ; NUME[:Expert] = 4
    ENUM[5] = :Domesticated ; NUME[:Domesticated] = 5
end

class TrapType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Lever ; NUME[:Lever] = 0
    ENUM[1] = :PressurePlate ; NUME[:PressurePlate] = 1
    ENUM[2] = :CageTrap ; NUME[:CageTrap] = 2
    ENUM[3] = :StoneFallTrap ; NUME[:StoneFallTrap] = 3
    ENUM[4] = :WeaponTrap ; NUME[:WeaponTrap] = 4
    ENUM[5] = :TrackStop ; NUME[:TrackStop] = 5
end

class TrapcompFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :IS_SCREW ; NUME[:IS_SCREW] = 0
    ENUM[1] = :IS_SPIKE ; NUME[:IS_SPIKE] = 1
    ENUM[2] = :WOOD ; NUME[:WOOD] = 2
    ENUM[3] = :METAL ; NUME[:METAL] = 3
    ENUM[4] = :HAS_EDGE_ATTACK ; NUME[:HAS_EDGE_ATTACK] = 4
end

class TreeHouseType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :TreeHouse ; NUME[:TreeHouse] = 0
    ENUM[1] = :HomeTree ; NUME[:HomeTree] = 1
    ENUM[2] = :ShapingTree ; NUME[:ShapingTree] = 2
    ENUM[3] = :MarketTree ; NUME[:MarketTree] = 3
    ENUM[4] = :Unknown1 ; NUME[:Unknown1] = 4
    ENUM[5] = :Unknown2 ; NUME[:Unknown2] = 5
end

class TuningType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PEGS ; NUME[:PEGS] = 0
    ENUM[1] = :ADJUSTABLE_BRIDGES ; NUME[:ADJUSTABLE_BRIDGES] = 1
    ENUM[2] = :CROOKS ; NUME[:CROOKS] = 2
    ENUM[3] = :TIGHTENING ; NUME[:TIGHTENING] = 3
    ENUM[4] = :LEVERS ; NUME[:LEVERS] = 4
end

class UiAdvmodeMenu < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Default ; NUME[:Default] = 0
    ENUM[1] = :Look ; NUME[:Look] = 1
    ENUM[2] = :ConversationAddress ; NUME[:ConversationAddress] = 2
    ENUM[3] = :ConversationSelect ; NUME[:ConversationSelect] = 3
    ENUM[4] = :ConversationSpeak ; NUME[:ConversationSpeak] = 4
    ENUM[5] = :Inventory ; NUME[:Inventory] = 5
    ENUM[6] = :Drop ; NUME[:Drop] = 6
    ENUM[7] = :ThrowItem ; NUME[:ThrowItem] = 7
    ENUM[8] = :Wear ; NUME[:Wear] = 8
    ENUM[9] = :Remove ; NUME[:Remove] = 9
    ENUM[10] = :Interact ; NUME[:Interact] = 10
    ENUM[11] = :Put ; NUME[:Put] = 11
    ENUM[12] = :PutContainer ; NUME[:PutContainer] = 12
    ENUM[13] = :Eat ; NUME[:Eat] = 13
    ENUM[14] = :ThrowAim ; NUME[:ThrowAim] = 14
    ENUM[15] = :Fire ; NUME[:Fire] = 15
    ENUM[16] = :Get ; NUME[:Get] = 16
    ENUM[17] = :Unk17 ; NUME[:Unk17] = 17
    ENUM[18] = :CombatPrefs ; NUME[:CombatPrefs] = 18
    ENUM[19] = :Companions ; NUME[:Companions] = 19
    ENUM[20] = :MovementPrefs ; NUME[:MovementPrefs] = 20
    ENUM[21] = :SpeedPrefs ; NUME[:SpeedPrefs] = 21
    ENUM[22] = :InteractAction ; NUME[:InteractAction] = 22
    ENUM[23] = :MoveCarefully ; NUME[:MoveCarefully] = 23
    ENUM[24] = :Announcements ; NUME[:Announcements] = 24
    ENUM[25] = :UseBuilding ; NUME[:UseBuilding] = 25
    ENUM[26] = :Travel ; NUME[:Travel] = 26
    ENUM[27] = :TravelSleep ; NUME[:TravelSleep] = 27
    ENUM[28] = :ViewFreshestTrack ; NUME[:ViewFreshestTrack] = 28
    ENUM[29] = :SleepConfirm ; NUME[:SleepConfirm] = 29
    ENUM[30] = :SelectInteractionTarget ; NUME[:SelectInteractionTarget] = 30
    ENUM[31] = :InteractChoices ; NUME[:InteractChoices] = 31
    ENUM[32] = :InteractVehicle ; NUME[:InteractVehicle] = 32
    ENUM[33] = :FallAction ; NUME[:FallAction] = 33
    ENUM[34] = :ViewTracks ; NUME[:ViewTracks] = 34
    ENUM[35] = :Jump ; NUME[:Jump] = 35
    ENUM[36] = :AttackCreature ; NUME[:AttackCreature] = 36
    ENUM[37] = :AttackConfirm ; NUME[:AttackConfirm] = 37
    ENUM[38] = :AttackType ; NUME[:AttackType] = 38
    ENUM[39] = :AttackBodypart ; NUME[:AttackBodypart] = 39
    ENUM[40] = :AttackStrike ; NUME[:AttackStrike] = 40
    ENUM[41] = :Unk41 ; NUME[:Unk41] = 41
    ENUM[42] = :Unk42 ; NUME[:Unk42] = 42
    ENUM[43] = :DodgeDirection ; NUME[:DodgeDirection] = 43
    ENUM[44] = :PerformanceSelect ; NUME[:PerformanceSelect] = 44
    ENUM[45] = :InterruptPerformanceConfirm ; NUME[:InterruptPerformanceConfirm] = 45
    ENUM[46] = :Build ; NUME[:Build] = 46
    ENUM[47] = :AssumeIdentity ; NUME[:AssumeIdentity] = 47
    ENUM[48] = :NameItem ; NUME[:NameItem] = 48
    ENUM[49] = :BecomePartyMember ; NUME[:BecomePartyMember] = 49
    ENUM[50] = :PartyTacticalSettings ; NUME[:PartyTacticalSettings] = 50
end

class UiSidebarMode < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Default ; NUME[:Default] = 0
    ENUM[1] = :Squads ; NUME[:Squads] = 1
    ENUM[2] = :DesignateMine ; NUME[:DesignateMine] = 2
    ENUM[3] = :DesignateRemoveRamps ; NUME[:DesignateRemoveRamps] = 3
    ENUM[4] = :DesignateUpStair ; NUME[:DesignateUpStair] = 4
    ENUM[5] = :DesignateDownStair ; NUME[:DesignateDownStair] = 5
    ENUM[6] = :DesignateUpDownStair ; NUME[:DesignateUpDownStair] = 6
    ENUM[7] = :DesignateUpRamp ; NUME[:DesignateUpRamp] = 7
    ENUM[8] = :DesignateChannel ; NUME[:DesignateChannel] = 8
    ENUM[9] = :DesignateGatherPlants ; NUME[:DesignateGatherPlants] = 9
    ENUM[10] = :DesignateRemoveDesignation ; NUME[:DesignateRemoveDesignation] = 10
    ENUM[11] = :DesignateSmooth ; NUME[:DesignateSmooth] = 11
    ENUM[12] = :DesignateCarveTrack ; NUME[:DesignateCarveTrack] = 12
    ENUM[13] = :DesignateEngrave ; NUME[:DesignateEngrave] = 13
    ENUM[14] = :DesignateCarveFortification ; NUME[:DesignateCarveFortification] = 14
    ENUM[15] = :Stockpiles ; NUME[:Stockpiles] = 15
    ENUM[16] = :Build ; NUME[:Build] = 16
    ENUM[17] = :QueryBuilding ; NUME[:QueryBuilding] = 17
    ENUM[18] = :Orders ; NUME[:Orders] = 18
    ENUM[19] = :OrdersForbid ; NUME[:OrdersForbid] = 19
    ENUM[20] = :OrdersRefuse ; NUME[:OrdersRefuse] = 20
    ENUM[21] = :OrdersWorkshop ; NUME[:OrdersWorkshop] = 21
    ENUM[22] = :OrdersZone ; NUME[:OrdersZone] = 22
    ENUM[23] = :BuildingItems ; NUME[:BuildingItems] = 23
    ENUM[24] = :ViewUnits ; NUME[:ViewUnits] = 24
    ENUM[25] = :LookAround ; NUME[:LookAround] = 25
    ENUM[26] = :DesignateItemsClaim ; NUME[:DesignateItemsClaim] = 26
    ENUM[27] = :DesignateItemsForbid ; NUME[:DesignateItemsForbid] = 27
    ENUM[28] = :DesignateItemsMelt ; NUME[:DesignateItemsMelt] = 28
    ENUM[29] = :DesignateItemsUnmelt ; NUME[:DesignateItemsUnmelt] = 29
    ENUM[30] = :DesignateItemsDump ; NUME[:DesignateItemsDump] = 30
    ENUM[31] = :DesignateItemsUndump ; NUME[:DesignateItemsUndump] = 31
    ENUM[32] = :DesignateItemsHide ; NUME[:DesignateItemsHide] = 32
    ENUM[33] = :DesignateItemsUnhide ; NUME[:DesignateItemsUnhide] = 33
    ENUM[34] = :DesignateChopTrees ; NUME[:DesignateChopTrees] = 34
    ENUM[35] = :DesignateToggleEngravings ; NUME[:DesignateToggleEngravings] = 35
    ENUM[36] = :DesignateToggleMarker ; NUME[:DesignateToggleMarker] = 36
    ENUM[37] = :Hotkeys ; NUME[:Hotkeys] = 37
    ENUM[38] = :DesignateTrafficHigh ; NUME[:DesignateTrafficHigh] = 38
    ENUM[39] = :DesignateTrafficNormal ; NUME[:DesignateTrafficNormal] = 39
    ENUM[40] = :DesignateTrafficLow ; NUME[:DesignateTrafficLow] = 40
    ENUM[41] = :DesignateTrafficRestricted ; NUME[:DesignateTrafficRestricted] = 41
    ENUM[42] = :Zones ; NUME[:Zones] = 42
    ENUM[43] = :ZonesPenInfo ; NUME[:ZonesPenInfo] = 43
    ENUM[44] = :ZonesPitInfo ; NUME[:ZonesPitInfo] = 44
    ENUM[45] = :ZonesHospitalInfo ; NUME[:ZonesHospitalInfo] = 45
    ENUM[46] = :ZonesGatherInfo ; NUME[:ZonesGatherInfo] = 46
    ENUM[47] = :DesignateRemoveConstruction ; NUME[:DesignateRemoveConstruction] = 47
    ENUM[48] = :DepotAccess ; NUME[:DepotAccess] = 48
    ENUM[49] = :NotesPoints ; NUME[:NotesPoints] = 49
    ENUM[50] = :NotesRoutes ; NUME[:NotesRoutes] = 50
    ENUM[51] = :Burrows ; NUME[:Burrows] = 51
    ENUM[52] = :Hauling ; NUME[:Hauling] = 52
    ENUM[53] = :ArenaWeather ; NUME[:ArenaWeather] = 53
    ENUM[54] = :ArenaTrees ; NUME[:ArenaTrees] = 54
    ENUM[55] = :BuildingLocationInfo ; NUME[:BuildingLocationInfo] = 55
    ENUM[56] = :ZonesLocationInfo ; NUME[:ZonesLocationInfo] = 56
end

class UniformCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Body ; NUME[:Body] = 0
    ENUM[1] = :Head ; NUME[:Head] = 1
    ENUM[2] = :Pants ; NUME[:Pants] = 2
    ENUM[3] = :Gloves ; NUME[:Gloves] = 3
    ENUM[4] = :Shoes ; NUME[:Shoes] = 4
    ENUM[5] = :Shield ; NUME[:Shield] = 5
    ENUM[6] = :Weapon ; NUME[:Weapon] = 6
end

class UnitActionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Tag = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1 ; Tag[:None] = 'raw_data'
    ENUM[0] = :Move ; NUME[:Move] = 0 ; Tag[:Move] = 'move'
    ENUM[1] = :Attack ; NUME[:Attack] = 1 ; Tag[:Attack] = 'attack'
    ENUM[2] = :Jump ; NUME[:Jump] = 2 ; Tag[:Jump] = 'jump'
    ENUM[3] = :HoldTerrain ; NUME[:HoldTerrain] = 3 ; Tag[:HoldTerrain] = 'holdterrain'
    ENUM[4] = :ReleaseTerrain ; NUME[:ReleaseTerrain] = 4 ; Tag[:ReleaseTerrain] = 'releaseterrain'
    ENUM[5] = :Climb ; NUME[:Climb] = 5 ; Tag[:Climb] = 'climb'
    ENUM[6] = :Job ; NUME[:Job] = 6 ; Tag[:Job] = 'job'
    ENUM[7] = :Talk ; NUME[:Talk] = 7 ; Tag[:Talk] = 'talk'
    ENUM[8] = :Unsteady ; NUME[:Unsteady] = 8 ; Tag[:Unsteady] = 'unsteady'
    ENUM[9] = :Parry ; NUME[:Parry] = 9 ; Tag[:Parry] = 'parry'
    ENUM[10] = :Block ; NUME[:Block] = 10 ; Tag[:Block] = 'block'
    ENUM[11] = :Dodge ; NUME[:Dodge] = 11 ; Tag[:Dodge] = 'dodge'
    ENUM[12] = :Recover ; NUME[:Recover] = 12 ; Tag[:Recover] = 'recover'
    ENUM[13] = :StandUp ; NUME[:StandUp] = 13 ; Tag[:StandUp] = 'standup'
    ENUM[14] = :LieDown ; NUME[:LieDown] = 14 ; Tag[:LieDown] = 'liedown'
    ENUM[15] = :Job2 ; NUME[:Job2] = 15 ; Tag[:Job2] = 'job2'
    ENUM[16] = :PushObject ; NUME[:PushObject] = 16 ; Tag[:PushObject] = 'pushobject'
    ENUM[17] = :SuckBlood ; NUME[:SuckBlood] = 17 ; Tag[:SuckBlood] = 'suckblood'
    ENUM[18] = :HoldItem ; NUME[:HoldItem] = 18 ; Tag[:HoldItem] = 'holditem'
    ENUM[19] = :ReleaseItem ; NUME[:ReleaseItem] = 19 ; Tag[:ReleaseItem] = 'releaseitem'
    ENUM[20] = :Unk20 ; NUME[:Unk20] = 20 ; Tag[:Unk20] = 'unk20'
    ENUM[21] = :Unk21 ; NUME[:Unk21] = 21 ; Tag[:Unk21] = 'unk21'
    ENUM[22] = :Unk22 ; NUME[:Unk22] = 22 ; Tag[:Unk22] = 'unk22'
    ENUM[23] = :Unk23 ; NUME[:Unk23] = 23 ; Tag[:Unk23] = 'unk23'
end

class UnitLabor < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    Category = Hash.new(:None)
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :MINE ; NUME[:MINE] = 0 ; Caption[:MINE] = 'Mining'
    ENUM[1] = :HAUL_STONE ; NUME[:HAUL_STONE] = 1 ; Caption[:HAUL_STONE] = 'Stone Hauling' ; Category[:HAUL_STONE] = :Hauling
    ENUM[2] = :HAUL_WOOD ; NUME[:HAUL_WOOD] = 2 ; Caption[:HAUL_WOOD] = 'Wood Hauling' ; Category[:HAUL_WOOD] = :Hauling
    ENUM[3] = :HAUL_BODY ; NUME[:HAUL_BODY] = 3 ; Caption[:HAUL_BODY] = 'Burial' ; Category[:HAUL_BODY] = :Hauling
    ENUM[4] = :HAUL_FOOD ; NUME[:HAUL_FOOD] = 4 ; Caption[:HAUL_FOOD] = 'Food Hauling' ; Category[:HAUL_FOOD] = :Hauling
    ENUM[5] = :HAUL_REFUSE ; NUME[:HAUL_REFUSE] = 5 ; Caption[:HAUL_REFUSE] = 'Refuse Hauling' ; Category[:HAUL_REFUSE] = :Hauling
    ENUM[6] = :HAUL_ITEM ; NUME[:HAUL_ITEM] = 6 ; Caption[:HAUL_ITEM] = 'Item Hauling' ; Category[:HAUL_ITEM] = :Hauling
    ENUM[7] = :HAUL_FURNITURE ; NUME[:HAUL_FURNITURE] = 7 ; Caption[:HAUL_FURNITURE] = 'Furniture Hauling' ; Category[:HAUL_FURNITURE] = :Hauling
    ENUM[8] = :HAUL_ANIMALS ; NUME[:HAUL_ANIMALS] = 8 ; Caption[:HAUL_ANIMALS] = 'Animal Hauling' ; Category[:HAUL_ANIMALS] = :Hauling
    ENUM[9] = :CLEAN ; NUME[:CLEAN] = 9 ; Caption[:CLEAN] = 'Cleaning' ; Category[:CLEAN] = :Other
    ENUM[10] = :CUTWOOD ; NUME[:CUTWOOD] = 10 ; Caption[:CUTWOOD] = 'Wood Cutting' ; Category[:CUTWOOD] = :Woodworking
    ENUM[11] = :CARPENTER ; NUME[:CARPENTER] = 11 ; Caption[:CARPENTER] = 'Carpentry' ; Category[:CARPENTER] = :Woodworking
    ENUM[12] = :DETAIL ; NUME[:DETAIL] = 12 ; Caption[:DETAIL] = 'Stone Detailing' ; Category[:DETAIL] = :Stoneworking
    ENUM[13] = :MASON ; NUME[:MASON] = 13 ; Caption[:MASON] = 'Masonry' ; Category[:MASON] = :Stoneworking
    ENUM[14] = :ARCHITECT ; NUME[:ARCHITECT] = 14 ; Caption[:ARCHITECT] = 'Architecture' ; Category[:ARCHITECT] = :Other
    ENUM[15] = :ANIMALTRAIN ; NUME[:ANIMALTRAIN] = 15 ; Caption[:ANIMALTRAIN] = 'Animal Training' ; Category[:ANIMALTRAIN] = :Hunting
    ENUM[16] = :ANIMALCARE ; NUME[:ANIMALCARE] = 16 ; Caption[:ANIMALCARE] = 'Animal Care' ; Category[:ANIMALCARE] = :Hunting
    ENUM[17] = :DIAGNOSE ; NUME[:DIAGNOSE] = 17 ; Caption[:DIAGNOSE] = 'Diagnosis' ; Category[:DIAGNOSE] = :Healthcare
    ENUM[18] = :SURGERY ; NUME[:SURGERY] = 18 ; Caption[:SURGERY] = 'Surgery' ; Category[:SURGERY] = :Healthcare
    ENUM[19] = :BONE_SETTING ; NUME[:BONE_SETTING] = 19 ; Caption[:BONE_SETTING] = 'Setting Bones' ; Category[:BONE_SETTING] = :Healthcare
    ENUM[20] = :SUTURING ; NUME[:SUTURING] = 20 ; Caption[:SUTURING] = 'Suturing' ; Category[:SUTURING] = :Healthcare
    ENUM[21] = :DRESSING_WOUNDS ; NUME[:DRESSING_WOUNDS] = 21 ; Caption[:DRESSING_WOUNDS] = 'Dressing Wounds' ; Category[:DRESSING_WOUNDS] = :Healthcare
    ENUM[22] = :FEED_WATER_CIVILIANS ; NUME[:FEED_WATER_CIVILIANS] = 22 ; Caption[:FEED_WATER_CIVILIANS] = 'Feed Patients/Prisoners' ; Category[:FEED_WATER_CIVILIANS] = :Healthcare
    ENUM[23] = :RECOVER_WOUNDED ; NUME[:RECOVER_WOUNDED] = 23 ; Caption[:RECOVER_WOUNDED] = 'Recovering Wounded' ; Category[:RECOVER_WOUNDED] = :Healthcare
    ENUM[24] = :BUTCHER ; NUME[:BUTCHER] = 24 ; Caption[:BUTCHER] = 'Butchery' ; Category[:BUTCHER] = :Farming
    ENUM[25] = :TRAPPER ; NUME[:TRAPPER] = 25 ; Caption[:TRAPPER] = 'Trapping' ; Category[:TRAPPER] = :Hunting
    ENUM[26] = :DISSECT_VERMIN ; NUME[:DISSECT_VERMIN] = 26 ; Caption[:DISSECT_VERMIN] = 'Small Animal Dissection' ; Category[:DISSECT_VERMIN] = :Hunting
    ENUM[27] = :LEATHER ; NUME[:LEATHER] = 27 ; Caption[:LEATHER] = 'Leatherworking' ; Category[:LEATHER] = :Crafts
    ENUM[28] = :TANNER ; NUME[:TANNER] = 28 ; Caption[:TANNER] = 'Tanning' ; Category[:TANNER] = :Farming
    ENUM[29] = :BREWER ; NUME[:BREWER] = 29 ; Caption[:BREWER] = 'Brewing' ; Category[:BREWER] = :Farming
    ENUM[30] = :ALCHEMIST ; NUME[:ALCHEMIST] = 30 ; Caption[:ALCHEMIST] = 'Alchemy' ; Category[:ALCHEMIST] = :Other
    ENUM[31] = :SOAP_MAKER ; NUME[:SOAP_MAKER] = 31 ; Caption[:SOAP_MAKER] = 'Soap Maker' ; Category[:SOAP_MAKER] = :Farming
    ENUM[32] = :WEAVER ; NUME[:WEAVER] = 32 ; Caption[:WEAVER] = 'Weaving' ; Category[:WEAVER] = :Crafts
    ENUM[33] = :CLOTHESMAKER ; NUME[:CLOTHESMAKER] = 33 ; Caption[:CLOTHESMAKER] = 'Clothesmaking' ; Category[:CLOTHESMAKER] = :Crafts
    ENUM[34] = :MILLER ; NUME[:MILLER] = 34 ; Caption[:MILLER] = 'Milling' ; Category[:MILLER] = :Farming
    ENUM[35] = :PROCESS_PLANT ; NUME[:PROCESS_PLANT] = 35 ; Caption[:PROCESS_PLANT] = 'Plant Processing' ; Category[:PROCESS_PLANT] = :Farming
    ENUM[36] = :MAKE_CHEESE ; NUME[:MAKE_CHEESE] = 36 ; Caption[:MAKE_CHEESE] = 'Cheese Making' ; Category[:MAKE_CHEESE] = :Farming
    ENUM[37] = :MILK ; NUME[:MILK] = 37 ; Caption[:MILK] = 'Milking' ; Category[:MILK] = :Farming
    ENUM[38] = :COOK ; NUME[:COOK] = 38 ; Caption[:COOK] = 'Cooking' ; Category[:COOK] = :Farming
    ENUM[39] = :PLANT ; NUME[:PLANT] = 39 ; Caption[:PLANT] = 'Farming (Fields)' ; Category[:PLANT] = :Farming
    ENUM[40] = :HERBALIST ; NUME[:HERBALIST] = 40 ; Caption[:HERBALIST] = 'Plant Gathering' ; Category[:HERBALIST] = :Farming
    ENUM[41] = :FISH ; NUME[:FISH] = 41 ; Caption[:FISH] = 'Fishing' ; Category[:FISH] = :Fishing
    ENUM[42] = :CLEAN_FISH ; NUME[:CLEAN_FISH] = 42 ; Caption[:CLEAN_FISH] = 'Fish Cleaning' ; Category[:CLEAN_FISH] = :Fishing
    ENUM[43] = :DISSECT_FISH ; NUME[:DISSECT_FISH] = 43 ; Caption[:DISSECT_FISH] = 'Fish Dissection' ; Category[:DISSECT_FISH] = :Fishing
    ENUM[44] = :HUNT ; NUME[:HUNT] = 44 ; Caption[:HUNT] = 'Hunting' ; Category[:HUNT] = :Hunting
    ENUM[45] = :SMELT ; NUME[:SMELT] = 45 ; Caption[:SMELT] = 'Furnace Operating' ; Category[:SMELT] = :Metalsmithing
    ENUM[46] = :FORGE_WEAPON ; NUME[:FORGE_WEAPON] = 46 ; Caption[:FORGE_WEAPON] = 'Weaponsmithing' ; Category[:FORGE_WEAPON] = :Metalsmithing
    ENUM[47] = :FORGE_ARMOR ; NUME[:FORGE_ARMOR] = 47 ; Caption[:FORGE_ARMOR] = 'Armoring' ; Category[:FORGE_ARMOR] = :Metalsmithing
    ENUM[48] = :FORGE_FURNITURE ; NUME[:FORGE_FURNITURE] = 48 ; Caption[:FORGE_FURNITURE] = 'Blacksmithing' ; Category[:FORGE_FURNITURE] = :Metalsmithing
    ENUM[49] = :METAL_CRAFT ; NUME[:METAL_CRAFT] = 49 ; Caption[:METAL_CRAFT] = 'Metalcrafting' ; Category[:METAL_CRAFT] = :Metalsmithing
    ENUM[50] = :CUT_GEM ; NUME[:CUT_GEM] = 50 ; Caption[:CUT_GEM] = 'Gem Cutting' ; Category[:CUT_GEM] = :Jewelry
    ENUM[51] = :ENCRUST_GEM ; NUME[:ENCRUST_GEM] = 51 ; Caption[:ENCRUST_GEM] = 'Gem Setting' ; Category[:ENCRUST_GEM] = :Jewelry
    ENUM[52] = :WOOD_CRAFT ; NUME[:WOOD_CRAFT] = 52 ; Caption[:WOOD_CRAFT] = 'Woodcrafting' ; Category[:WOOD_CRAFT] = :Crafts
    ENUM[53] = :STONE_CRAFT ; NUME[:STONE_CRAFT] = 53 ; Caption[:STONE_CRAFT] = 'Stonecrafting' ; Category[:STONE_CRAFT] = :Crafts
    ENUM[54] = :BONE_CARVE ; NUME[:BONE_CARVE] = 54 ; Caption[:BONE_CARVE] = 'Bone Carving' ; Category[:BONE_CARVE] = :Crafts
    ENUM[55] = :GLASSMAKER ; NUME[:GLASSMAKER] = 55 ; Caption[:GLASSMAKER] = 'Glassmaking' ; Category[:GLASSMAKER] = :Crafts
    ENUM[56] = :EXTRACT_STRAND ; NUME[:EXTRACT_STRAND] = 56 ; Caption[:EXTRACT_STRAND] = 'Strand Extraction' ; Category[:EXTRACT_STRAND] = :Crafts
    ENUM[57] = :SIEGECRAFT ; NUME[:SIEGECRAFT] = 57 ; Caption[:SIEGECRAFT] = 'Siege Engineering' ; Category[:SIEGECRAFT] = :Engineering
    ENUM[58] = :SIEGEOPERATE ; NUME[:SIEGEOPERATE] = 58 ; Caption[:SIEGEOPERATE] = 'Siege Operating' ; Category[:SIEGEOPERATE] = :Engineering
    ENUM[59] = :BOWYER ; NUME[:BOWYER] = 59 ; Caption[:BOWYER] = 'Crossbow-making' ; Category[:BOWYER] = :Woodworking
    ENUM[60] = :MECHANIC ; NUME[:MECHANIC] = 60 ; Caption[:MECHANIC] = 'Mechanics' ; Category[:MECHANIC] = :Engineering
    ENUM[61] = :POTASH_MAKING ; NUME[:POTASH_MAKING] = 61 ; Caption[:POTASH_MAKING] = 'Potash Making' ; Category[:POTASH_MAKING] = :Farming
    ENUM[62] = :LYE_MAKING ; NUME[:LYE_MAKING] = 62 ; Caption[:LYE_MAKING] = 'Lye Making' ; Category[:LYE_MAKING] = :Farming
    ENUM[63] = :DYER ; NUME[:DYER] = 63 ; Caption[:DYER] = 'Dyeing' ; Category[:DYER] = :Farming
    ENUM[64] = :BURN_WOOD ; NUME[:BURN_WOOD] = 64 ; Caption[:BURN_WOOD] = 'Wood Burning' ; Category[:BURN_WOOD] = :Farming
    ENUM[65] = :OPERATE_PUMP ; NUME[:OPERATE_PUMP] = 65 ; Caption[:OPERATE_PUMP] = 'Pump Operating' ; Category[:OPERATE_PUMP] = :Engineering
    ENUM[66] = :SHEARER ; NUME[:SHEARER] = 66 ; Caption[:SHEARER] = 'Shearing' ; Category[:SHEARER] = :Farming
    ENUM[67] = :SPINNER ; NUME[:SPINNER] = 67 ; Caption[:SPINNER] = 'Spinning' ; Category[:SPINNER] = :Farming
    ENUM[68] = :POTTERY ; NUME[:POTTERY] = 68 ; Caption[:POTTERY] = 'Pottery' ; Category[:POTTERY] = :Crafts
    ENUM[69] = :GLAZING ; NUME[:GLAZING] = 69 ; Caption[:GLAZING] = 'Glazing' ; Category[:GLAZING] = :Crafts
    ENUM[70] = :PRESSING ; NUME[:PRESSING] = 70 ; Caption[:PRESSING] = 'Pressing' ; Category[:PRESSING] = :Farming
    ENUM[71] = :BEEKEEPING ; NUME[:BEEKEEPING] = 71 ; Caption[:BEEKEEPING] = 'Bee Keeping' ; Category[:BEEKEEPING] = :Farming
    ENUM[72] = :WAX_WORKING ; NUME[:WAX_WORKING] = 72 ; Caption[:WAX_WORKING] = 'Wax Working' ; Category[:WAX_WORKING] = :Crafts
    ENUM[73] = :HANDLE_VEHICLES ; NUME[:HANDLE_VEHICLES] = 73 ; Caption[:HANDLE_VEHICLES] = 'Push/Haul Vehicles' ; Category[:HANDLE_VEHICLES] = :Hauling
    ENUM[74] = :HAUL_TRADE ; NUME[:HAUL_TRADE] = 74 ; Caption[:HAUL_TRADE] = 'Trade Good Hauling' ; Category[:HAUL_TRADE] = :Hauling
    ENUM[75] = :PULL_LEVER ; NUME[:PULL_LEVER] = 75 ; Caption[:PULL_LEVER] = 'Lever Operation' ; Category[:PULL_LEVER] = :Other
    ENUM[76] = :REMOVE_CONSTRUCTION ; NUME[:REMOVE_CONSTRUCTION] = 76 ; Caption[:REMOVE_CONSTRUCTION] = 'Construction Removal' ; Category[:REMOVE_CONSTRUCTION] = :Other
    ENUM[77] = :HAUL_WATER ; NUME[:HAUL_WATER] = 77 ; Caption[:HAUL_WATER] = 'Water Hauling' ; Category[:HAUL_WATER] = :Hauling
    ENUM[78] = :GELD ; NUME[:GELD] = 78 ; Caption[:GELD] = 'Gelding' ; Category[:GELD] = :Farming
    ENUM[79] = :BUILD_ROAD ; NUME[:BUILD_ROAD] = 79 ; Caption[:BUILD_ROAD] = 'Road Building' ; Category[:BUILD_ROAD] = :Other
    ENUM[80] = :BUILD_CONSTRUCTION ; NUME[:BUILD_CONSTRUCTION] = 80 ; Caption[:BUILD_CONSTRUCTION] = 'Wall/Floor Construction' ; Category[:BUILD_CONSTRUCTION] = :Other
    ENUM[81] = :PAPERMAKING ; NUME[:PAPERMAKING] = 81 ; Caption[:PAPERMAKING] = 'Papermaking' ; Category[:PAPERMAKING] = :Crafts
    ENUM[82] = :BOOKBINDING ; NUME[:BOOKBINDING] = 82 ; Caption[:BOOKBINDING] = 'Bookbinding' ; Category[:BOOKBINDING] = :Crafts
end

class UnitLaborCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-13] = :Other ; NUME[:Other] = -13
    ENUM[-12] = :Hauling ; NUME[:Hauling] = -12
    ENUM[-11] = :Engineering ; NUME[:Engineering] = -11
    ENUM[-10] = :Crafts ; NUME[:Crafts] = -10
    ENUM[-9] = :Jewelry ; NUME[:Jewelry] = -9
    ENUM[-8] = :Metalsmithing ; NUME[:Metalsmithing] = -8
    ENUM[-7] = :Fishing ; NUME[:Fishing] = -7
    ENUM[-6] = :Farming ; NUME[:Farming] = -6
    ENUM[-5] = :Healthcare ; NUME[:Healthcare] = -5
    ENUM[-4] = :Hunting ; NUME[:Hunting] = -4
    ENUM[-3] = :Stoneworking ; NUME[:Stoneworking] = -3
    ENUM[-2] = :Woodworking ; NUME[:Woodworking] = -2
    ENUM[-1] = :None ; NUME[:None] = -1
end

class UnitPathGoal < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :ComeToJobBuilding ; NUME[:ComeToJobBuilding] = 0
    ENUM[1] = :ValidPondDumpUnit ; NUME[:ValidPondDumpUnit] = 1
    ENUM[2] = :ValidPondDump ; NUME[:ValidPondDump] = 2
    ENUM[3] = :ConflictDefense ; NUME[:ConflictDefense] = 3
    ENUM[4] = :AdventureMove ; NUME[:AdventureMove] = 4
    ENUM[5] = :MarauderMill ; NUME[:MarauderMill] = 5
    ENUM[6] = :WildernessCuriousStealTarget ; NUME[:WildernessCuriousStealTarget] = 6
    ENUM[7] = :WildernessRoamer ; NUME[:WildernessRoamer] = 7
    ENUM[8] = :ThiefTarget ; NUME[:ThiefTarget] = 8
    ENUM[9] = :Owner ; NUME[:Owner] = 9
    ENUM[10] = :CheckChest ; NUME[:CheckChest] = 10
    ENUM[11] = :SleepBed ; NUME[:SleepBed] = 11
    ENUM[12] = :SleepBarracks ; NUME[:SleepBarracks] = 12
    ENUM[13] = :SleepGround ; NUME[:SleepGround] = 13
    ENUM[14] = :LeaveWall ; NUME[:LeaveWall] = 14
    ENUM[15] = :FleeTerrain ; NUME[:FleeTerrain] = 15
    ENUM[16] = :TaxRoom ; NUME[:TaxRoom] = 16
    ENUM[17] = :GuardTaxes ; NUME[:GuardTaxes] = 17
    ENUM[18] = :RansackTaxes ; NUME[:RansackTaxes] = 18
    ENUM[19] = :GetEmptySandBag ; NUME[:GetEmptySandBag] = 19
    ENUM[20] = :SandZone ; NUME[:SandZone] = 20
    ENUM[21] = :GrabCage ; NUME[:GrabCage] = 21
    ENUM[22] = :UncageAnimal ; NUME[:UncageAnimal] = 22
    ENUM[23] = :CaptureSmallPet ; NUME[:CaptureSmallPet] = 23
    ENUM[24] = :GrabCageUnit ; NUME[:GrabCageUnit] = 24
    ENUM[25] = :GoToCage ; NUME[:GoToCage] = 25
    ENUM[26] = :GrabAnimalTrap ; NUME[:GrabAnimalTrap] = 26
    ENUM[27] = :CageVermin ; NUME[:CageVermin] = 27
    ENUM[28] = :GrabUnfillBucket ; NUME[:GrabUnfillBucket] = 28
    ENUM[29] = :SeekFillBucket ; NUME[:SeekFillBucket] = 29
    ENUM[30] = :SeekPatientForCarry ; NUME[:SeekPatientForCarry] = 30
    ENUM[31] = :SeekPatientForDiagnosis ; NUME[:SeekPatientForDiagnosis] = 31
    ENUM[32] = :SeekPatientForImmobilizeBreak ; NUME[:SeekPatientForImmobilizeBreak] = 32
    ENUM[33] = :SeekPatientForCrutch ; NUME[:SeekPatientForCrutch] = 33
    ENUM[34] = :SeekPatientForSuturing ; NUME[:SeekPatientForSuturing] = 34
    ENUM[35] = :SeekSurgerySite ; NUME[:SeekSurgerySite] = 35
    ENUM[36] = :CarryPatientToBed ; NUME[:CarryPatientToBed] = 36
    ENUM[37] = :SeekGiveWaterBucket ; NUME[:SeekGiveWaterBucket] = 37
    ENUM[38] = :SeekJobItem ; NUME[:SeekJobItem] = 38
    ENUM[39] = :SeekUnitForItemDrop ; NUME[:SeekUnitForItemDrop] = 39
    ENUM[40] = :SeekUnitForJob ; NUME[:SeekUnitForJob] = 40
    ENUM[41] = :SeekSplint ; NUME[:SeekSplint] = 41
    ENUM[42] = :SeekCrutch ; NUME[:SeekCrutch] = 42
    ENUM[43] = :SeekSutureThread ; NUME[:SeekSutureThread] = 43
    ENUM[44] = :SeekDressingCloth ; NUME[:SeekDressingCloth] = 44
    ENUM[45] = :GoToGiveWaterTarget ; NUME[:GoToGiveWaterTarget] = 45
    ENUM[46] = :SeekFoodForTarget ; NUME[:SeekFoodForTarget] = 46
    ENUM[47] = :SeekTargetForFood ; NUME[:SeekTargetForFood] = 47
    ENUM[48] = :SeekAnimalForSlaughter ; NUME[:SeekAnimalForSlaughter] = 48
    ENUM[49] = :SeekSlaughterBuilding ; NUME[:SeekSlaughterBuilding] = 49
    ENUM[50] = :SeekAnimalForChain ; NUME[:SeekAnimalForChain] = 50
    ENUM[51] = :SeekChainForAnimal ; NUME[:SeekChainForAnimal] = 51
    ENUM[52] = :SeekCageForUnchain ; NUME[:SeekCageForUnchain] = 52
    ENUM[53] = :SeekAnimalForUnchain ; NUME[:SeekAnimalForUnchain] = 53
    ENUM[54] = :GrabFoodForTaming ; NUME[:GrabFoodForTaming] = 54
    ENUM[55] = :SeekAnimalForTaming ; NUME[:SeekAnimalForTaming] = 55
    ENUM[56] = :SeekDrinkItem ; NUME[:SeekDrinkItem] = 56
    ENUM[57] = :SeekFoodItem ; NUME[:SeekFoodItem] = 57
    ENUM[58] = :SeekEatingChair ; NUME[:SeekEatingChair] = 58
    ENUM[59] = :SeekEatingChair2 ; NUME[:SeekEatingChair2] = 59
    ENUM[60] = :SeekBadMoodBuilding ; NUME[:SeekBadMoodBuilding] = 60
    ENUM[61] = :SetGlassMoodBuilding ; NUME[:SetGlassMoodBuilding] = 61
    ENUM[62] = :SetMoodBuilding ; NUME[:SetMoodBuilding] = 62
    ENUM[63] = :SeekFellVictim ; NUME[:SeekFellVictim] = 63
    ENUM[64] = :CleanBuildingSite ; NUME[:CleanBuildingSite] = 64
    ENUM[65] = :ResetPriorityGoal ; NUME[:ResetPriorityGoal] = 65
    ENUM[66] = :MainJobBuilding ; NUME[:MainJobBuilding] = 66
    ENUM[67] = :DropOffJobItems ; NUME[:DropOffJobItems] = 67
    ENUM[68] = :GrabJobResources ; NUME[:GrabJobResources] = 68
    ENUM[69] = :WorkAtBuilding ; NUME[:WorkAtBuilding] = 69
    ENUM[70] = :GrabUniform ; NUME[:GrabUniform] = 70
    ENUM[71] = :GrabClothing ; NUME[:GrabClothing] = 71
    ENUM[72] = :GrabWeapon ; NUME[:GrabWeapon] = 72
    ENUM[73] = :GrabAmmunition ; NUME[:GrabAmmunition] = 73
    ENUM[74] = :GrabShield ; NUME[:GrabShield] = 74
    ENUM[75] = :GrabArmor ; NUME[:GrabArmor] = 75
    ENUM[76] = :GrabHelm ; NUME[:GrabHelm] = 76
    ENUM[77] = :GrabBoots ; NUME[:GrabBoots] = 77
    ENUM[78] = :GrabGloves ; NUME[:GrabGloves] = 78
    ENUM[79] = :GrabPants ; NUME[:GrabPants] = 79
    ENUM[80] = :GrabQuiver ; NUME[:GrabQuiver] = 80
    ENUM[81] = :GrabBackpack ; NUME[:GrabBackpack] = 81
    ENUM[82] = :GrabWaterskin ; NUME[:GrabWaterskin] = 82
    ENUM[83] = :StartHunt ; NUME[:StartHunt] = 83
    ENUM[84] = :StartFish ; NUME[:StartFish] = 84
    ENUM[85] = :Clean ; NUME[:Clean] = 85
    ENUM[86] = :HuntVermin ; NUME[:HuntVermin] = 86
    ENUM[87] = :Patrol ; NUME[:Patrol] = 87
    ENUM[88] = :SquadStation ; NUME[:SquadStation] = 88
    ENUM[89] = :SeekInfant ; NUME[:SeekInfant] = 89
    ENUM[90] = :ShopSpecific ; NUME[:ShopSpecific] = 90
    ENUM[91] = :MillInShop ; NUME[:MillInShop] = 91
    ENUM[92] = :GoToShop ; NUME[:GoToShop] = 92
    ENUM[93] = :SeekTrainingAmmunition ; NUME[:SeekTrainingAmmunition] = 93
    ENUM[94] = :ArcheryTrainingSite ; NUME[:ArcheryTrainingSite] = 94
    ENUM[95] = :SparringPartner ; NUME[:SparringPartner] = 95
    ENUM[96] = :SparringSite ; NUME[:SparringSite] = 96
    ENUM[97] = :AttendParty ; NUME[:AttendParty] = 97
    ENUM[98] = :SeekArtifact ; NUME[:SeekArtifact] = 98
    ENUM[99] = :GrabAmmunitionForBuilding ; NUME[:GrabAmmunitionForBuilding] = 99
    ENUM[100] = :SeekBuildingForAmmunition ; NUME[:SeekBuildingForAmmunition] = 100
    ENUM[101] = :SeekItemForStorage ; NUME[:SeekItemForStorage] = 101
    ENUM[102] = :StoreItem ; NUME[:StoreItem] = 102
    ENUM[103] = :GrabKill ; NUME[:GrabKill] = 103
    ENUM[104] = :DropKillAtButcher ; NUME[:DropKillAtButcher] = 104
    ENUM[105] = :DropKillOutFront ; NUME[:DropKillOutFront] = 105
    ENUM[106] = :GoToBeatingTarget ; NUME[:GoToBeatingTarget] = 106
    ENUM[107] = :SeekKidnapVictim ; NUME[:SeekKidnapVictim] = 107
    ENUM[108] = :SeekHuntingTarget ; NUME[:SeekHuntingTarget] = 108
    ENUM[109] = :SeekTargetMechanism ; NUME[:SeekTargetMechanism] = 109
    ENUM[110] = :SeekTargetForMechanism ; NUME[:SeekTargetForMechanism] = 110
    ENUM[111] = :SeekMechanismForTrigger ; NUME[:SeekMechanismForTrigger] = 111
    ENUM[112] = :SeekTriggerForMechanism ; NUME[:SeekTriggerForMechanism] = 112
    ENUM[113] = :SeekTrapForVerminCatch ; NUME[:SeekTrapForVerminCatch] = 113
    ENUM[114] = :SeekVerminForCatching ; NUME[:SeekVerminForCatching] = 114
    ENUM[115] = :SeekVerminCatchLocation ; NUME[:SeekVerminCatchLocation] = 115
    ENUM[116] = :WanderVerminCatchLocation ; NUME[:WanderVerminCatchLocation] = 116
    ENUM[117] = :SeekVerminForHunting ; NUME[:SeekVerminForHunting] = 117
    ENUM[118] = :SeekVerminHuntingSpot ; NUME[:SeekVerminHuntingSpot] = 118
    ENUM[119] = :WanderVerminHuntingSpot ; NUME[:WanderVerminHuntingSpot] = 119
    ENUM[120] = :SeekFishTrap ; NUME[:SeekFishTrap] = 120
    ENUM[121] = :SeekFishCatchLocation ; NUME[:SeekFishCatchLocation] = 121
    ENUM[122] = :SeekWellForWater ; NUME[:SeekWellForWater] = 122
    ENUM[123] = :SeekDrinkAreaForWater ; NUME[:SeekDrinkAreaForWater] = 123
    ENUM[124] = :UpgradeSquadEquipment ; NUME[:UpgradeSquadEquipment] = 124
    ENUM[125] = :PrepareEquipmentManifests ; NUME[:PrepareEquipmentManifests] = 125
    ENUM[126] = :WanderDepot ; NUME[:WanderDepot] = 126
    ENUM[127] = :SeekUpdateOffice ; NUME[:SeekUpdateOffice] = 127
    ENUM[128] = :SeekManageOffice ; NUME[:SeekManageOffice] = 128
    ENUM[129] = :AssignedBuildingJob ; NUME[:AssignedBuildingJob] = 129
    ENUM[130] = :ChaseOpponent ; NUME[:ChaseOpponent] = 130
    ENUM[131] = :FleeFromOpponent ; NUME[:FleeFromOpponent] = 131
    ENUM[132] = :AttackBuilding ; NUME[:AttackBuilding] = 132
    ENUM[133] = :StartBedCarry ; NUME[:StartBedCarry] = 133
    ENUM[134] = :StartGiveFoodWater ; NUME[:StartGiveFoodWater] = 134
    ENUM[135] = :StartMedicalAid ; NUME[:StartMedicalAid] = 135
    ENUM[136] = :SeekStationFlood ; NUME[:SeekStationFlood] = 136
    ENUM[137] = :SeekStation ; NUME[:SeekStation] = 137
    ENUM[138] = :StartWaterJobWell ; NUME[:StartWaterJobWell] = 138
    ENUM[139] = :StartWaterJobDrinkArea ; NUME[:StartWaterJobDrinkArea] = 139
    ENUM[140] = :StartEatJob ; NUME[:StartEatJob] = 140
    ENUM[141] = :ScheduledMeal ; NUME[:ScheduledMeal] = 141
    ENUM[142] = :ScheduledSleepBed ; NUME[:ScheduledSleepBed] = 142
    ENUM[143] = :ScheduledSleepGround ; NUME[:ScheduledSleepGround] = 143
    ENUM[144] = :Rest ; NUME[:Rest] = 144
    ENUM[145] = :RemoveConstruction ; NUME[:RemoveConstruction] = 145
    ENUM[146] = :Chop ; NUME[:Chop] = 146
    ENUM[147] = :Detail ; NUME[:Detail] = 147
    ENUM[148] = :GatherPlant ; NUME[:GatherPlant] = 148
    ENUM[149] = :Dig ; NUME[:Dig] = 149
    ENUM[150] = :Mischief ; NUME[:Mischief] = 150
    ENUM[151] = :ChaseOpponentSameSquare ; NUME[:ChaseOpponentSameSquare] = 151
    ENUM[152] = :RestRecovered ; NUME[:RestRecovered] = 152
    ENUM[153] = :RestReset ; NUME[:RestReset] = 153
    ENUM[154] = :CombatTraining ; NUME[:CombatTraining] = 154
    ENUM[155] = :SkillDemonstration ; NUME[:SkillDemonstration] = 155
    ENUM[156] = :IndividualSkillDrill ; NUME[:IndividualSkillDrill] = 156
    ENUM[157] = :SeekBuildingForItemDrop ; NUME[:SeekBuildingForItemDrop] = 157
    ENUM[158] = :SeekBuildingForJob ; NUME[:SeekBuildingForJob] = 158
    ENUM[159] = :GrabMilkUnit ; NUME[:GrabMilkUnit] = 159
    ENUM[160] = :GoToMilkStation ; NUME[:GoToMilkStation] = 160
    ENUM[161] = :SeekPatientForDressWound ; NUME[:SeekPatientForDressWound] = 161
    ENUM[162] = :UndeadHunt ; NUME[:UndeadHunt] = 162
    ENUM[163] = :GrabShearUnit ; NUME[:GrabShearUnit] = 163
    ENUM[164] = :GoToShearStation ; NUME[:GoToShearStation] = 164
    ENUM[165] = :LayEggNestBox ; NUME[:LayEggNestBox] = 165
    ENUM[166] = :ClayZone ; NUME[:ClayZone] = 166
    ENUM[167] = :ColonyToInstall ; NUME[:ColonyToInstall] = 167
    ENUM[168] = :ReturnColonyToInstall ; NUME[:ReturnColonyToInstall] = 168
    ENUM[169] = :Nonsense ; NUME[:Nonsense] = 169
    ENUM[170] = :SeekBloodSuckVictim ; NUME[:SeekBloodSuckVictim] = 170
    ENUM[171] = :SeekSheriff ; NUME[:SeekSheriff] = 171
    ENUM[172] = :GrabExecutionWeapon ; NUME[:GrabExecutionWeapon] = 172
    ENUM[173] = :TrainAnimal ; NUME[:TrainAnimal] = 173
    ENUM[174] = :GuardPath ; NUME[:GuardPath] = 174
    ENUM[175] = :Harass ; NUME[:Harass] = 175
    ENUM[176] = :SiteWalk ; NUME[:SiteWalk] = 176
    ENUM[177] = :SiteWalkToBuilding ; NUME[:SiteWalkToBuilding] = 177
    ENUM[178] = :Reunion ; NUME[:Reunion] = 178
    ENUM[179] = :ArmyWalk ; NUME[:ArmyWalk] = 179
    ENUM[180] = :ChaseOpponentFlood ; NUME[:ChaseOpponentFlood] = 180
    ENUM[181] = :ChargeAttack ; NUME[:ChargeAttack] = 181
    ENUM[182] = :FleeFromOpponentClimb ; NUME[:FleeFromOpponentClimb] = 182
    ENUM[183] = :SeekLadderToClimb ; NUME[:SeekLadderToClimb] = 183
    ENUM[184] = :SeekLadderToMove ; NUME[:SeekLadderToMove] = 184
    ENUM[185] = :PlaceLadder ; NUME[:PlaceLadder] = 185
    ENUM[186] = :SeekAnimalForGelding ; NUME[:SeekAnimalForGelding] = 186
    ENUM[187] = :SeekGeldingBuilding ; NUME[:SeekGeldingBuilding] = 187
    ENUM[188] = :Prayer ; NUME[:Prayer] = 188
    ENUM[189] = :Socialize ; NUME[:Socialize] = 189
    ENUM[190] = :Performance ; NUME[:Performance] = 190
    ENUM[191] = :Research ; NUME[:Research] = 191
    ENUM[192] = :PonderTopic ; NUME[:PonderTopic] = 192
    ENUM[193] = :FillServiceOrder ; NUME[:FillServiceOrder] = 193
    ENUM[194] = :GetWrittenContent ; NUME[:GetWrittenContent] = 194
    ENUM[195] = :GoToReadingPlace ; NUME[:GoToReadingPlace] = 195
    ENUM[196] = :GetWritingMaterials ; NUME[:GetWritingMaterials] = 196
    ENUM[197] = :GoToWritingPlace ; NUME[:GoToWritingPlace] = 197
    ENUM[198] = :Worship ; NUME[:Worship] = 198
    ENUM[199] = :GrabInstrument ; NUME[:GrabInstrument] = 199
    ENUM[200] = :Play ; NUME[:Play] = 200
    ENUM[201] = :MakeBelieve ; NUME[:MakeBelieve] = 201
    ENUM[202] = :PlayWithToy ; NUME[:PlayWithToy] = 202
    ENUM[203] = :GrabToy ; NUME[:GrabToy] = 203
end

class UnitRelationshipType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Pet ; NUME[:Pet] = 0
    ENUM[1] = :Spouse ; NUME[:Spouse] = 1
    ENUM[2] = :Mother ; NUME[:Mother] = 2
    ENUM[3] = :Father ; NUME[:Father] = 3
    ENUM[4] = :LastAttacker ; NUME[:LastAttacker] = 4
    ENUM[5] = :GroupLeader ; NUME[:GroupLeader] = 5
    ENUM[6] = :Draggee ; NUME[:Draggee] = 6
    ENUM[7] = :Dragger ; NUME[:Dragger] = 7
    ENUM[8] = :RiderMount ; NUME[:RiderMount] = 8
    ENUM[9] = :Lover ; NUME[:Lover] = 9
    ENUM[10] = :Unk10 ; NUME[:Unk10] = 10
    ENUM[11] = :Sibling ; NUME[:Sibling] = 11
    ENUM[12] = :Child ; NUME[:Child] = 12
    ENUM[13] = :Friend ; NUME[:Friend] = 13
    ENUM[14] = :Grudge ; NUME[:Grudge] = 14
    ENUM[15] = :Worship ; NUME[:Worship] = 15
    ENUM[16] = :AcquaintanceLong ; NUME[:AcquaintanceLong] = 16
    ENUM[17] = :AcquaintancePassing ; NUME[:AcquaintancePassing] = 17
    ENUM[18] = :Bonded ; NUME[:Bonded] = 18
    ENUM[19] = :Hero ; NUME[:Hero] = 19
    ENUM[20] = :ConsidersViolent ; NUME[:ConsidersViolent] = 20
    ENUM[21] = :ConsidersPsychotic ; NUME[:ConsidersPsychotic] = 21
    ENUM[22] = :GoodForBusiness ; NUME[:GoodForBusiness] = 22
    ENUM[23] = :FriendlyTerms ; NUME[:FriendlyTerms] = 23
    ENUM[24] = :ConsidersKiller ; NUME[:ConsidersKiller] = 24
    ENUM[25] = :ConsidersMurderer ; NUME[:ConsidersMurderer] = 25
    ENUM[26] = :Comrade ; NUME[:Comrade] = 26
    ENUM[27] = :MemberOfRespectedGroup ; NUME[:MemberOfRespectedGroup] = 27
    ENUM[28] = :MemberOfHatedGroup ; NUME[:MemberOfHatedGroup] = 28
    ENUM[29] = :EnemyFighter ; NUME[:EnemyFighter] = 29
    ENUM[30] = :FriendlyFighter ; NUME[:FriendlyFighter] = 30
    ENUM[31] = :ConsidersBully ; NUME[:ConsidersBully] = 31
    ENUM[32] = :ConsidersBrigand ; NUME[:ConsidersBrigand] = 32
    ENUM[33] = :LoyalSoldier ; NUME[:LoyalSoldier] = 33
    ENUM[34] = :ConsidersMonster ; NUME[:ConsidersMonster] = 34
    ENUM[35] = :ConsidersStoryteller ; NUME[:ConsidersStoryteller] = 35
    ENUM[36] = :ConsidersPoet ; NUME[:ConsidersPoet] = 36
    ENUM[37] = :ConsidersBard ; NUME[:ConsidersBard] = 37
    ENUM[38] = :ConsidersDancer ; NUME[:ConsidersDancer] = 38
    ENUM[39] = :Master ; NUME[:Master] = 39
    ENUM[40] = :Apprentice ; NUME[:Apprentice] = 40
    ENUM[41] = :Companion ; NUME[:Companion] = 41
    ENUM[42] = :FormerMaster ; NUME[:FormerMaster] = 42
    ENUM[43] = :FormerApprentice ; NUME[:FormerApprentice] = 43
    ENUM[44] = :ConsidersQuarreler ; NUME[:ConsidersQuarreler] = 44
    ENUM[45] = :ConsidersFlatterer ; NUME[:ConsidersFlatterer] = 45
    ENUM[46] = :Hunter ; NUME[:Hunter] = 46
    ENUM[47] = :ProtectorOfTheWeak ; NUME[:ProtectorOfTheWeak] = 47
end

class UnitReportType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Combat ; NUME[:Combat] = 0
    ENUM[1] = :Sparring ; NUME[:Sparring] = 1
    ENUM[2] = :Hunting ; NUME[:Hunting] = 2
end

class UnitStationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Nonsense ; NUME[:Nonsense] = 0
    ENUM[1] = :DungeonCommander ; NUME[:DungeonCommander] = 1
    ENUM[2] = :InsaneMood ; NUME[:InsaneMood] = 2
    ENUM[3] = :UndeadHunt ; NUME[:UndeadHunt] = 3
    ENUM[4] = :SiegerPatrol ; NUME[:SiegerPatrol] = 4
    ENUM[5] = :MaraudeTarget ; NUME[:MaraudeTarget] = 5
    ENUM[6] = :SiegerBasepoint ; NUME[:SiegerBasepoint] = 6
    ENUM[7] = :SiegerMill ; NUME[:SiegerMill] = 7
    ENUM[8] = :AmbushPatrol ; NUME[:AmbushPatrol] = 8
    ENUM[9] = :MarauderMill ; NUME[:MarauderMill] = 9
    ENUM[10] = :WildernessCuriousWander ; NUME[:WildernessCuriousWander] = 10
    ENUM[11] = :WildernessCuriousStealTarget ; NUME[:WildernessCuriousStealTarget] = 11
    ENUM[12] = :WildernessRoamer ; NUME[:WildernessRoamer] = 12
    ENUM[13] = :PatternPatrol ; NUME[:PatternPatrol] = 13
    ENUM[14] = :InactiveMarauder ; NUME[:InactiveMarauder] = 14
    ENUM[15] = :Owner ; NUME[:Owner] = 15
    ENUM[16] = :Commander ; NUME[:Commander] = 16
    ENUM[17] = :ChainedAnimal ; NUME[:ChainedAnimal] = 17
    ENUM[18] = :MeetingLocation ; NUME[:MeetingLocation] = 18
    ENUM[19] = :MeetingLocationBuilding ; NUME[:MeetingLocationBuilding] = 19
    ENUM[20] = :Depot ; NUME[:Depot] = 20
    ENUM[21] = :VerminHunting ; NUME[:VerminHunting] = 21
    ENUM[22] = :SeekCommander ; NUME[:SeekCommander] = 22
    ENUM[23] = :ReturnToBase ; NUME[:ReturnToBase] = 23
    ENUM[24] = :MillAnywhere ; NUME[:MillAnywhere] = 24
    ENUM[25] = :Wagon ; NUME[:Wagon] = 25
    ENUM[26] = :MillBuilding ; NUME[:MillBuilding] = 26
    ENUM[27] = :HeadForEdge ; NUME[:HeadForEdge] = 27
    ENUM[28] = :MillingFlood ; NUME[:MillingFlood] = 28
    ENUM[29] = :MillingBurrow ; NUME[:MillingBurrow] = 29
    ENUM[30] = :SquadMove ; NUME[:SquadMove] = 30
    ENUM[31] = :SquadKillList ; NUME[:SquadKillList] = 31
    ENUM[32] = :SquadPatrol ; NUME[:SquadPatrol] = 32
    ENUM[33] = :SquadDefendBurrow ; NUME[:SquadDefendBurrow] = 33
    ENUM[34] = :SquadDefendBurrowFromTarget ; NUME[:SquadDefendBurrowFromTarget] = 34
    ENUM[35] = :LairHunter ; NUME[:LairHunter] = 35
    ENUM[36] = :Graze ; NUME[:Graze] = 36
    ENUM[37] = :Guard ; NUME[:Guard] = 37
    ENUM[38] = :Alarm ; NUME[:Alarm] = 38
    ENUM[39] = :MoveToSite ; NUME[:MoveToSite] = 39
    ENUM[40] = :ClaimSite ; NUME[:ClaimSite] = 40
    ENUM[41] = :WaitOrder ; NUME[:WaitOrder] = 41
end

class UnitThoughtType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Caption = Hash.new
    XmlCaption = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Conflict ; NUME[:Conflict] = 0 ; Caption[:Conflict] = 'while in conflict' ; XmlCaption[:Conflict] = 'conflict'
    ENUM[1] = :Trauma ; NUME[:Trauma] = 1 ; Caption[:Trauma] = 'after experiencing trauma' ; XmlCaption[:Trauma] = 'death and injury'
    ENUM[2] = :WitnessDeath ; NUME[:WitnessDeath] = 2 ; Caption[:WitnessDeath] = 'after seeing somebody die' ; XmlCaption[:WitnessDeath] = 'witnessed death in incident'
    ENUM[3] = :UnexpectedDeath ; NUME[:UnexpectedDeath] = 3 ; Caption[:UnexpectedDeath] = 'at the unexpected death of [somebody]' ; XmlCaption[:UnexpectedDeath] = 'hf died unexpectedly'
    ENUM[4] = :Death ; NUME[:Death] = 4 ; Caption[:Death] = 'at somebody\'s death' ; XmlCaption[:Death] = 'hf is dead'
    ENUM[5] = :Kill ; NUME[:Kill] = 5 ; Caption[:Kill] = 'while killing somebody' ; XmlCaption[:Kill] = 'slayer in incident'
    ENUM[6] = :LoveSeparated ; NUME[:LoveSeparated] = 6 ; Caption[:LoveSeparated] = 'at being separated from a loved one' ; XmlCaption[:LoveSeparated] = 'separated from hf'
    ENUM[7] = :LoveReunited ; NUME[:LoveReunited] = 7 ; Caption[:LoveReunited] = 'after being reunited with a loved one' ; XmlCaption[:LoveReunited] = 'reunited with hf'
    ENUM[8] = :JoinConflict ; NUME[:JoinConflict] = 8 ; Caption[:JoinConflict] = 'when joining an existing conflict' ; XmlCaption[:JoinConflict] = 'jump into existing conflict'
    ENUM[9] = :MakeMasterwork ; NUME[:MakeMasterwork] = 9 ; Caption[:MakeMasterwork] = 'after producing a masterwork' ; XmlCaption[:MakeMasterwork] = 'produced masterwork'
    ENUM[10] = :MadeArtifact ; NUME[:MadeArtifact] = 10 ; Caption[:MadeArtifact] = 'after creating an artifact' ; XmlCaption[:MadeArtifact] = 'produced artifact'
    ENUM[11] = :MasterSkill ; NUME[:MasterSkill] = 11 ; Caption[:MasterSkill] = 'upon mastering [skill]' ; XmlCaption[:MasterSkill] = 'mastered skill'
    ENUM[12] = :NewRomance ; NUME[:NewRomance] = 12 ; Caption[:NewRomance] = 'as [he] was caught up in a new romance' ; XmlCaption[:NewRomance] = 'fell in love'
    ENUM[13] = :BecomeParent ; NUME[:BecomeParent] = 13 ; Caption[:BecomeParent] = 'after becoming a parent' ; XmlCaption[:BecomeParent] = 'became parent'
    ENUM[14] = :NearConflict ; NUME[:NearConflict] = 14 ; Caption[:NearConflict] = 'being near to a conflict' ; XmlCaption[:NearConflict] = 'nearby conflict'
    ENUM[15] = :CancelAgreement ; NUME[:CancelAgreement] = 15 ; Caption[:CancelAgreement] = 'after an agreement was cancelled' ; XmlCaption[:CancelAgreement] = 'agreement cancelled'
    ENUM[16] = :JoinTravel ; NUME[:JoinTravel] = 16 ; Caption[:JoinTravel] = 'upon joining a traveling group' ; XmlCaption[:JoinTravel] = 'being an agreement companion'
    ENUM[17] = :SiteControlled ; NUME[:SiteControlled] = 17 ; Caption[:SiteControlled] = 'after a site was controlled' ; XmlCaption[:SiteControlled] = 'entity controls site'
    ENUM[18] = :TributeCancel ; NUME[:TributeCancel] = 18 ; Caption[:TributeCancel] = 'after a tribute cancellation' ; XmlCaption[:TributeCancel] = 'entity cancels tribute'
    ENUM[19] = :Incident ; NUME[:Incident] = 19 ; Caption[:Incident] = 'after an incident' ; XmlCaption[:Incident] = 'incident'
    ENUM[20] = :HearRumor ; NUME[:HearRumor] = 20 ; Caption[:HearRumor] = 'after hearing a rumor' ; XmlCaption[:HearRumor] = 'rumor'
    ENUM[21] = :MilitaryRemoved ; NUME[:MilitaryRemoved] = 21 ; Caption[:MilitaryRemoved] = 'after being removed from a military group' ; XmlCaption[:MilitaryRemoved] = 'kicked out of squad'
    ENUM[22] = :StrangerWeapon ; NUME[:StrangerWeapon] = 22 ; Caption[:StrangerWeapon] = 'when a stranger advanced with a weapon' ; XmlCaption[:StrangerWeapon] = 'stranger advancing with weapon'
    ENUM[23] = :StrangerSneaking ; NUME[:StrangerSneaking] = 23 ; Caption[:StrangerSneaking] = 'after seeing a stranger sneaking around' ; XmlCaption[:StrangerSneaking] = 'stranger sneaking around'
    ENUM[24] = :SawDrinkBlood ; NUME[:SawDrinkBlood] = 24 ; Caption[:SawDrinkBlood] = 'after witnessing a night creature drinking blood' ; XmlCaption[:SawDrinkBlood] = 'witnessed blood drinking in incident'
    ENUM[25] = :Complained ; NUME[:Complained] = 25 ; Caption[:Complained] = '[multiple]' ; XmlCaption[:Complained] = 'made complaint'
    ENUM[26] = :ReceivedComplaint ; NUME[:ReceivedComplaint] = 26 ; Caption[:ReceivedComplaint] = '[multiple]' ; XmlCaption[:ReceivedComplaint] = 'listened to complaint'
    ENUM[27] = :AdmireBuilding ; NUME[:AdmireBuilding] = 27 ; Caption[:AdmireBuilding] = 'near a [quality] [building]' ; XmlCaption[:AdmireBuilding] = 'admire building'
    ENUM[28] = :AdmireOwnBuilding ; NUME[:AdmireOwnBuilding] = 28 ; Caption[:AdmireOwnBuilding] = 'near [his] own [quality] [building]' ; XmlCaption[:AdmireOwnBuilding] = 'admire owned building'
    ENUM[29] = :AdmireArrangedBuilding ; NUME[:AdmireArrangedBuilding] = 29 ; Caption[:AdmireArrangedBuilding] = 'near a [quality] tastefully arranged [building]' ; XmlCaption[:AdmireArrangedBuilding] = 'admire arranged building'
    ENUM[30] = :AdmireOwnArrangedBuilding ; NUME[:AdmireOwnArrangedBuilding] = 30 ; Caption[:AdmireOwnArrangedBuilding] = 'near [his] own [quality] tastefully arranged [building]' ; XmlCaption[:AdmireOwnArrangedBuilding] = 'admire owned arranged building'
    ENUM[31] = :LostPet ; NUME[:LostPet] = 31 ; Caption[:LostPet] = 'after losing a pet' ; XmlCaption[:LostPet] = 'pet lost'
    ENUM[32] = :ThrownStuff ; NUME[:ThrownStuff] = 32 ; Caption[:ThrownStuff] = 'after throwing something' ; XmlCaption[:ThrownStuff] = 'threw hauled item in tantrum'
    ENUM[33] = :JailReleased ; NUME[:JailReleased] = 33 ; Caption[:JailReleased] = 'after being released from confinement' ; XmlCaption[:JailReleased] = 'freed from prison'
    ENUM[34] = :Miscarriage ; NUME[:Miscarriage] = 34 ; Caption[:Miscarriage] = 'after a miscarriage' ; XmlCaption[:Miscarriage] = 'had miscarriage'
    ENUM[35] = :SpouseMiscarriage ; NUME[:SpouseMiscarriage] = 35 ; Caption[:SpouseMiscarriage] = 'after [his] spouse\'s miscarriage' ; XmlCaption[:SpouseMiscarriage] = 'spouse had miscarriage'
    ENUM[36] = :OldClothing ; NUME[:OldClothing] = 36 ; Caption[:OldClothing] = 'to be wearing old clothing' ; XmlCaption[:OldClothing] = 'old clothing'
    ENUM[37] = :TatteredClothing ; NUME[:TatteredClothing] = 37 ; Caption[:TatteredClothing] = 'to be wearing tattered clothing' ; XmlCaption[:TatteredClothing] = 'tattered clothing'
    ENUM[38] = :RottedClothing ; NUME[:RottedClothing] = 38 ; Caption[:RottedClothing] = 'to have clothes rot off of [his] body' ; XmlCaption[:RottedClothing] = 'clothing rots away'
    ENUM[39] = :GhostNightmare ; NUME[:GhostNightmare] = 39 ; Caption[:GhostNightmare] = 'after being tormented in nightmares by a dead [somebody]' ; XmlCaption[:GhostNightmare] = 'haunted in dreams'
    ENUM[40] = :GhostHaunt ; NUME[:GhostHaunt] = 40 ; Caption[:GhostHaunt] = 'after being haunted/tormented/possessed by a dead [somebody]' ; XmlCaption[:GhostHaunt] = 'haunted'
    ENUM[41] = :Spar ; NUME[:Spar] = 41 ; Caption[:Spar] = 'after a sparring session' ; XmlCaption[:Spar] = 'good spar'
    ENUM[42] = :UnableComplain ; NUME[:UnableComplain] = 42 ; Caption[:UnableComplain] = 'after being unable to [meet]' ; XmlCaption[:UnableComplain] = 'complaint unregistered'
    ENUM[43] = :LongPatrol ; NUME[:LongPatrol] = 43 ; Caption[:LongPatrol] = 'during long patrol duty' ; XmlCaption[:LongPatrol] = 'long patrol'
    ENUM[44] = :SunNausea ; NUME[:SunNausea] = 44 ; Caption[:SunNausea] = 'after being nauseated bu the sun' ; XmlCaption[:SunNausea] = 'sun nauseated'
    ENUM[45] = :SunIrritated ; NUME[:SunIrritated] = 45 ; Caption[:SunIrritated] = 'at being out in the sunshine again' ; XmlCaption[:SunIrritated] = 'sun irritated'
    ENUM[46] = :Drowsy ; NUME[:Drowsy] = 46 ; Caption[:Drowsy] = 'when drowsy' ; XmlCaption[:Drowsy] = 'drowsy'
    ENUM[47] = :VeryDrowsy ; NUME[:VeryDrowsy] = 47 ; Caption[:VeryDrowsy] = 'when utterly sleep-deprived' ; XmlCaption[:VeryDrowsy] = 'very drowsy'
    ENUM[48] = :Thirsty ; NUME[:Thirsty] = 48 ; Caption[:Thirsty] = 'when thirsty' ; XmlCaption[:Thirsty] = 'thirsty'
    ENUM[49] = :Dehydrated ; NUME[:Dehydrated] = 49 ; Caption[:Dehydrated] = 'when dehydrated' ; XmlCaption[:Dehydrated] = 'dehydrated'
    ENUM[50] = :Hungry ; NUME[:Hungry] = 50 ; Caption[:Hungry] = 'when hungry' ; XmlCaption[:Hungry] = 'hungry'
    ENUM[51] = :Starving ; NUME[:Starving] = 51 ; Caption[:Starving] = 'when starving' ; XmlCaption[:Starving] = 'starving'
    ENUM[52] = :MajorInjuries ; NUME[:MajorInjuries] = 52 ; Caption[:MajorInjuries] = 'after suffering a major injury' ; XmlCaption[:MajorInjuries] = 'suffered major injury'
    ENUM[53] = :MinorInjuries ; NUME[:MinorInjuries] = 53 ; Caption[:MinorInjuries] = 'after suffering a minor injury' ; XmlCaption[:MinorInjuries] = 'suffered minor injury'
    ENUM[54] = :SleepNoise ; NUME[:SleepNoise] = 54 ; Caption[:SleepNoise] = 'after [varying]' ; XmlCaption[:SleepNoise] = 'rough sleep'
    ENUM[55] = :Rest ; NUME[:Rest] = 55 ; Caption[:Rest] = 'after being able to rest and recuperate' ; XmlCaption[:Rest] = 'resting'
    ENUM[56] = :FreakishWeather ; NUME[:FreakishWeather] = 56 ; Caption[:FreakishWeather] = 'when caught in freakish weather' ; XmlCaption[:FreakishWeather] = 'caught in freakish weather'
    ENUM[57] = :Rain ; NUME[:Rain] = 57 ; Caption[:Rain] = 'when caught in the rain' ; XmlCaption[:Rain] = 'caught in rain'
    ENUM[58] = :SnowStorm ; NUME[:SnowStorm] = 58 ; Caption[:SnowStorm] = 'when caught in a snow storm' ; XmlCaption[:SnowStorm] = 'caught in snow'
    ENUM[59] = :Miasma ; NUME[:Miasma] = 59 ; Caption[:Miasma] = 'after retching on a miasma' ; XmlCaption[:Miasma] = 'caught in miasma'
    ENUM[60] = :Smoke ; NUME[:Smoke] = 60 ; Caption[:Smoke] = 'after choking on smoke underground' ; XmlCaption[:Smoke] = 'caught in smoke'
    ENUM[61] = :Waterfall ; NUME[:Waterfall] = 61 ; Caption[:Waterfall] = 'being near to a waterfall' ; XmlCaption[:Waterfall] = 'waterfall mist'
    ENUM[62] = :Dust ; NUME[:Dust] = 62 ; Caption[:Dust] = 'after choking on dust underground' ; XmlCaption[:Dust] = 'caught in dust'
    ENUM[63] = :Demands ; NUME[:Demands] = 63 ; Caption[:Demands] = 'considering the state of demands' ; XmlCaption[:Demands] = 'considering demand'
    ENUM[64] = :ImproperPunishment ; NUME[:ImproperPunishment] = 64 ; Caption[:ImproperPunishment] = 'that a criminal could not be properly punished' ; XmlCaption[:ImproperPunishment] = 'punishment of victimizer reduced'
    ENUM[65] = :PunishmentReduced ; NUME[:PunishmentReduced] = 65 ; Caption[:PunishmentReduced] = 'to have [his] punishment reduced' ; XmlCaption[:PunishmentReduced] = 'personal punishment reduced'
    ENUM[66] = :Elected ; NUME[:Elected] = 66 ; Caption[:Elected] = 'to be elected' ; XmlCaption[:Elected] = 'elected'
    ENUM[67] = :Reelected ; NUME[:Reelected] = 67 ; Caption[:Reelected] = 'to be re-elected' ; XmlCaption[:Reelected] = 'reelected'
    ENUM[68] = :RequestApproved ; NUME[:RequestApproved] = 68 ; Caption[:RequestApproved] = 'having a request approved' ; XmlCaption[:RequestApproved] = 'request approved'
    ENUM[69] = :RequestIgnored ; NUME[:RequestIgnored] = 69 ; Caption[:RequestIgnored] = 'having a request ignored' ; XmlCaption[:RequestIgnored] = 'request ignored'
    ENUM[70] = :NoPunishment ; NUME[:NoPunishment] = 70 ; Caption[:NoPunishment] = 'that nobody could be punished for a failure' ; XmlCaption[:NoPunishment] = 'nobody to punish for failed mandate'
    ENUM[71] = :PunishmentDelayed ; NUME[:PunishmentDelayed] = 71 ; Caption[:PunishmentDelayed] = 'to have [his] punishment delayed' ; XmlCaption[:PunishmentDelayed] = 'personal punishment delayed'
    ENUM[72] = :DelayedPunishment ; NUME[:DelayedPunishment] = 72 ; Caption[:DelayedPunishment] = 'after the delayed punishment of a criminal' ; XmlCaption[:DelayedPunishment] = 'punishment of victimizer delayed'
    ENUM[73] = :ScarceCageChain ; NUME[:ScarceCageChain] = 73 ; Caption[:ScarceCageChain] = 'considering the scarcity of cages and chains' ; XmlCaption[:ScarceCageChain] = 'insufficient justice buildings'
    ENUM[74] = :MandateIgnored ; NUME[:MandateIgnored] = 74 ; Caption[:MandateIgnored] = 'having a mandate ignored' ; XmlCaption[:MandateIgnored] = 'mandate ignored'
    ENUM[75] = :MandateDeadlineMissed ; NUME[:MandateDeadlineMissed] = 75 ; Caption[:MandateDeadlineMissed] = 'having a mandate deadline missed' ; XmlCaption[:MandateDeadlineMissed] = 'mandate only partially completed'
    ENUM[76] = :LackWork ; NUME[:LackWork] = 76 ; Caption[:LackWork] = 'after the lack of work last season' ; XmlCaption[:LackWork] = 'insufficient work'
    ENUM[77] = :SmashedBuilding ; NUME[:SmashedBuilding] = 77 ; Caption[:SmashedBuilding] = 'after smashing up a building' ; XmlCaption[:SmashedBuilding] = 'destroyed building'
    ENUM[78] = :ToppledStuff ; NUME[:ToppledStuff] = 78 ; Caption[:ToppledStuff] = 'after toppling something over' ; XmlCaption[:ToppledStuff] = 'committed vandalism'
    ENUM[79] = :NoblePromotion ; NUME[:NoblePromotion] = 79 ; Caption[:NoblePromotion] = 'after receiving a higher rank of nobility' ; XmlCaption[:NoblePromotion] = 'land holder rank increased'
    ENUM[80] = :BecomeNoble ; NUME[:BecomeNoble] = 80 ; Caption[:BecomeNoble] = 'after entering the nobility' ; XmlCaption[:BecomeNoble] = 'established as land holder'
    ENUM[81] = :Cavein ; NUME[:Cavein] = 81 ; Caption[:Cavein] = 'after being knocked out during a cave-in' ; XmlCaption[:Cavein] = 'knocked out by cavein'
    ENUM[82] = :MandateDeadlineMet ; NUME[:MandateDeadlineMet] = 82 ; Caption[:MandateDeadlineMet] = 'to have a mandate deadline met' ; XmlCaption[:MandateDeadlineMet] = 'mandate was obeyed'
    ENUM[83] = :Uncovered ; NUME[:Uncovered] = 83 ; Caption[:Uncovered] = 'to be uncovered' ; XmlCaption[:Uncovered] = 'naked'
    ENUM[84] = :NoShirt ; NUME[:NoShirt] = 84 ; Caption[:NoShirt] = 'to have no shirt' ; XmlCaption[:NoShirt] = 'no shirt'
    ENUM[85] = :NoShoes ; NUME[:NoShoes] = 85 ; Caption[:NoShoes] = 'to have no shoes' ; XmlCaption[:NoShoes] = 'no shoes'
    ENUM[86] = :EatPet ; NUME[:EatPet] = 86 ; Caption[:EatPet] = 'after being forced to eat a treasured pet to survive' ; XmlCaption[:EatPet] = 'ate own pet while starving'
    ENUM[87] = :EatLikedCreature ; NUME[:EatLikedCreature] = 87 ; Caption[:EatLikedCreature] = 'after being forced to eat a beloved creature to survive' ; XmlCaption[:EatLikedCreature] = 'ate favorite animal while starving'
    ENUM[88] = :EatVermin ; NUME[:EatVermin] = 88 ; Caption[:EatVermin] = 'after being forced to eat vermin to survive' ; XmlCaption[:EatVermin] = 'ate vermin while starving'
    ENUM[89] = :FistFight ; NUME[:FistFight] = 89 ; Caption[:FistFight] = 'after starting a fist fight' ; XmlCaption[:FistFight] = 'beat somebody up'
    ENUM[90] = :GaveBeating ; NUME[:GaveBeating] = 90 ; Caption[:GaveBeating] = 'after punishing somebody with a beating' ; XmlCaption[:GaveBeating] = 'punished somebody with beating'
    ENUM[91] = :GotBeaten ; NUME[:GotBeaten] = 91 ; Caption[:GotBeaten] = 'after being beaten' ; XmlCaption[:GotBeaten] = 'punished by beating'
    ENUM[92] = :GaveHammering ; NUME[:GaveHammering] = 92 ; Caption[:GaveHammering] = 'after beating somebody with a hammer' ; XmlCaption[:GaveHammering] = 'punished somebody with tool'
    ENUM[93] = :GotHammered ; NUME[:GotHammered] = 93 ; Caption[:GotHammered] = 'after being beaten with a hammer' ; XmlCaption[:GotHammered] = 'punished by tool'
    ENUM[94] = :NoHammer ; NUME[:NoHammer] = 94 ; Caption[:NoHammer] = 'after being unable to find a hammer' ; XmlCaption[:NoHammer] = 'cannot get punishment tool'
    ENUM[95] = :SameFood ; NUME[:SameFood] = 95 ; Caption[:SameFood] = 'eating the same old food' ; XmlCaption[:SameFood] = 'tired of food'
    ENUM[96] = :AteRotten ; NUME[:AteRotten] = 96 ; Caption[:AteRotten] = 'after eating rotten food' ; XmlCaption[:AteRotten] = 'eaten rotten food'
    ENUM[97] = :GoodMeal ; NUME[:GoodMeal] = 97 ; Caption[:GoodMeal] = 'after eating [quality food]' ; XmlCaption[:GoodMeal] = 'good food'
    ENUM[98] = :GoodDrink ; NUME[:GoodDrink] = 98 ; Caption[:GoodDrink] = 'after having [quality drink]' ; XmlCaption[:GoodDrink] = 'good drink'
    ENUM[99] = :MoreChests ; NUME[:MoreChests] = 99 ; Caption[:MoreChests] = 'not having enough chests' ; XmlCaption[:MoreChests] = 'do not have enough chests'
    ENUM[100] = :MoreCabinets ; NUME[:MoreCabinets] = 100 ; Caption[:MoreCabinets] = 'not having enough cabinets' ; XmlCaption[:MoreCabinets] = 'do not have enough cabinets'
    ENUM[101] = :MoreWeaponRacks ; NUME[:MoreWeaponRacks] = 101 ; Caption[:MoreWeaponRacks] = 'not having enough weapon racks' ; XmlCaption[:MoreWeaponRacks] = 'do not have enough weapon racks'
    ENUM[102] = :MoreArmorStands ; NUME[:MoreArmorStands] = 102 ; Caption[:MoreArmorStands] = 'not having enough armor stands' ; XmlCaption[:MoreArmorStands] = 'do not have enough armor stands'
    ENUM[103] = :RoomPretension ; NUME[:RoomPretension] = 103 ; Caption[:RoomPretension] = 'by a lesser\'s pretentious [room] arrangements' ; XmlCaption[:RoomPretension] = 'lesser has better room'
    ENUM[104] = :LackTables ; NUME[:LackTables] = 104 ; Caption[:LackTables] = 'at the lack of dining tables' ; XmlCaption[:LackTables] = 'eating without table'
    ENUM[105] = :CrowdedTables ; NUME[:CrowdedTables] = 105 ; Caption[:CrowdedTables] = 'eating at a crowded table' ; XmlCaption[:CrowdedTables] = 'eating at crowded table'
    ENUM[106] = :DiningQuality ; NUME[:DiningQuality] = 106 ; Caption[:DiningQuality] = 'dining in [a quality] dining room' ; XmlCaption[:DiningQuality] = 'eating in dining room'
    ENUM[107] = :NoDining ; NUME[:NoDining] = 107 ; Caption[:NoDining] = 'being without a proper dining room' ; XmlCaption[:NoDining] = 'eating without dining room'
    ENUM[108] = :LackChairs ; NUME[:LackChairs] = 108 ; Caption[:LackChairs] = 'at the lack of chairs' ; XmlCaption[:LackChairs] = 'eating without chair'
    ENUM[109] = :TrainingBond ; NUME[:TrainingBond] = 109 ; Caption[:TrainingBond] = 'after forming a bond with an animal training partner' ; XmlCaption[:TrainingBond] = 'new bonded relationship'
    ENUM[110] = :Rescued ; NUME[:Rescued] = 110 ; Caption[:Rescued] = 'after being rescued' ; XmlCaption[:Rescued] = 'was rescued'
    ENUM[111] = :RescuedOther ; NUME[:RescuedOther] = 111 ; Caption[:RescuedOther] = 'after bringing somebody to rest in bed' ; XmlCaption[:RescuedOther] = 'rescued somebody'
    ENUM[112] = :SatisfiedAtWork ; NUME[:SatisfiedAtWork] = 112 ; Caption[:SatisfiedAtWork] = 'at work' ; XmlCaption[:SatisfiedAtWork] = 'completed job'
    ENUM[113] = :TaxedLostProperty ; NUME[:TaxedLostProperty] = 113 ; Caption[:TaxedLostProperty] = 'after losing property to the tax collector\'s escorts' ; XmlCaption[:TaxedLostProperty] = 'tax escort stole property'
    ENUM[114] = :Taxed ; NUME[:Taxed] = 114 ; Caption[:Taxed] = 'after being taxed' ; XmlCaption[:Taxed] = 'lost property to taxes'
    ENUM[115] = :LackProtection ; NUME[:LackProtection] = 115 ; Caption[:LackProtection] = 'not having adequate protection' ; XmlCaption[:LackProtection] = 'have inadequate protection'
    ENUM[116] = :TaxRoomUnreachable ; NUME[:TaxRoomUnreachable] = 116 ; Caption[:TaxRoomUnreachable] = 'after being unable to reach a room for tax collection' ; XmlCaption[:TaxRoomUnreachable] = 'taxable room inaccessible'
    ENUM[117] = :TaxRoomMisinformed ; NUME[:TaxRoomMisinformed] = 117 ; Caption[:TaxRoomMisinformed] = 'after being misinformed about a room for tax collection' ; XmlCaption[:TaxRoomMisinformed] = 'misinformed about taxable room'
    ENUM[118] = :PleasedNoble ; NUME[:PleasedNoble] = 118 ; Caption[:PleasedNoble] = 'having pleased a noble' ; XmlCaption[:PleasedNoble] = 'pleased nobility'
    ENUM[119] = :TaxCollectionSmooth ; NUME[:TaxCollectionSmooth] = 119 ; Caption[:TaxCollectionSmooth] = 'that the tax collection went smoothly' ; XmlCaption[:TaxCollectionSmooth] = 'tax collector succeeded'
    ENUM[120] = :DisappointedNoble ; NUME[:DisappointedNoble] = 120 ; Caption[:DisappointedNoble] = 'having disappointed a noble' ; XmlCaption[:DisappointedNoble] = 'disappointed nobility'
    ENUM[121] = :TaxCollectionRough ; NUME[:TaxCollectionRough] = 121 ; Caption[:TaxCollectionRough] = 'that the tax collection didn\'t go smoothly' ; XmlCaption[:TaxCollectionRough] = 'tax collector failed'
    ENUM[122] = :MadeFriend ; NUME[:MadeFriend] = 122 ; Caption[:MadeFriend] = 'after making a friend' ; XmlCaption[:MadeFriend] = 'new buddy'
    ENUM[123] = :FormedGrudge ; NUME[:FormedGrudge] = 123 ; Caption[:FormedGrudge] = 'after forming a grudge' ; XmlCaption[:FormedGrudge] = 'new grudge'
    ENUM[124] = :AnnoyedVermin ; NUME[:AnnoyedVermin] = 124 ; Caption[:AnnoyedVermin] = 'after being accosted by [vermin]' ; XmlCaption[:AnnoyedVermin] = 'near hated vermin'
    ENUM[125] = :NearVermin ; NUME[:NearVermin] = 125 ; Caption[:NearVermin] = 'after being near [vermin]' ; XmlCaption[:NearVermin] = 'near favorite animal'
    ENUM[126] = :PesteredVermin ; NUME[:PesteredVermin] = 126 ; Caption[:PesteredVermin] = 'after being pestered by [vermin]' ; XmlCaption[:PesteredVermin] = 'pestered by flying micro vermin'
    ENUM[127] = :AcquiredItem ; NUME[:AcquiredItem] = 127 ; Caption[:AcquiredItem] = 'after a satisfying acquisition' ; XmlCaption[:AcquiredItem] = 'acquired item'
    ENUM[128] = :AdoptedPet ; NUME[:AdoptedPet] = 128 ; Caption[:AdoptedPet] = 'after adopting a new pet' ; XmlCaption[:AdoptedPet] = 'acquired favorite animal as pet'
    ENUM[129] = :Jailed ; NUME[:Jailed] = 129 ; Caption[:Jailed] = 'after being confined' ; XmlCaption[:Jailed] = 'confined'
    ENUM[130] = :Bath ; NUME[:Bath] = 130 ; Caption[:Bath] = 'after a bath' ; XmlCaption[:Bath] = 'cleaned self'
    ENUM[131] = :SoapyBath ; NUME[:SoapyBath] = 131 ; Caption[:SoapyBath] = 'after a soapy bath' ; XmlCaption[:SoapyBath] = 'cleaned self with soap'
    ENUM[132] = :SparringAccident ; NUME[:SparringAccident] = 132 ; Caption[:SparringAccident] = 'after killing somebody by accident while sparring' ; XmlCaption[:SparringAccident] = 'killed somebody in training accident'
    ENUM[133] = :Attacked ; NUME[:Attacked] = 133 ; Caption[:Attacked] = 'after being attacked' ; XmlCaption[:Attacked] = 'attacked'
    ENUM[134] = :AttackedByDead ; NUME[:AttackedByDead] = 134 ; Caption[:AttackedByDead] = 'after being attacked by dead [HF relative]' ; XmlCaption[:AttackedByDead] = 'attacked by zombie possible relative'
    ENUM[135] = :SameBooze ; NUME[:SameBooze] = 135 ; Caption[:SameBooze] = 'drinking the same old booze' ; XmlCaption[:SameBooze] = 'tired of drink'
    ENUM[136] = :DrinkBlood ; NUME[:DrinkBlood] = 136 ; Caption[:DrinkBlood] = 'while forced to drink bloody water' ; XmlCaption[:DrinkBlood] = 'drinking blood'
    ENUM[137] = :DrinkSlime ; NUME[:DrinkSlime] = 137 ; Caption[:DrinkSlime] = 'while forced to drink slime' ; XmlCaption[:DrinkSlime] = 'drinking slime'
    ENUM[138] = :DrinkVomit ; NUME[:DrinkVomit] = 138 ; Caption[:DrinkVomit] = 'while forced to drink vomit' ; XmlCaption[:DrinkVomit] = 'drinking vomit'
    ENUM[139] = :DrinkGoo ; NUME[:DrinkGoo] = 139 ; Caption[:DrinkGoo] = 'while forced to drink gooey water' ; XmlCaption[:DrinkGoo] = 'drinking goo'
    ENUM[140] = :DrinkIchor ; NUME[:DrinkIchor] = 140 ; Caption[:DrinkIchor] = 'while forced to drink ichorous water' ; XmlCaption[:DrinkIchor] = 'drinking ichor'
    ENUM[141] = :DrinkPus ; NUME[:DrinkPus] = 141 ; Caption[:DrinkPus] = 'while forced to drink purulent water' ; XmlCaption[:DrinkPus] = 'drinking pus'
    ENUM[142] = :NastyWater ; NUME[:NastyWater] = 142 ; Caption[:NastyWater] = 'drinking nasty water' ; XmlCaption[:NastyWater] = 'drinking nasty'
    ENUM[143] = :DrankSpoiled ; NUME[:DrankSpoiled] = 143 ; Caption[:DrankSpoiled] = 'after drinking something spoiled' ; XmlCaption[:DrankSpoiled] = 'drinking rotten'
    ENUM[144] = :LackWell ; NUME[:LackWell] = 144 ; Caption[:LackWell] = 'after drinking water without a well' ; XmlCaption[:LackWell] = 'drinking without well'
    ENUM[145] = :NearCaged ; NUME[:NearCaged] = 145 ; Caption[:NearCaged] = 'after being near to a [animal] in a cage' ; XmlCaption[:NearCaged] = 'view favorite animal caged'
    ENUM[146] = :NearCagedHated ; NUME[:NearCagedHated] = 146 ; Caption[:NearCagedHated] = 'after being near to a [animal] in a cage' ; XmlCaption[:NearCagedHated] = 'view hated vermin caged'
    ENUM[147] = :LackBedroom ; NUME[:LackBedroom] = 147 ; Caption[:LackBedroom] = 'after sleeping without a proper room' ; XmlCaption[:LackBedroom] = 'slept without proper room'
    ENUM[148] = :BedroomQuality ; NUME[:BedroomQuality] = 148 ; Caption[:BedroomQuality] = 'after sleeing in a [quality] bedroom' ; XmlCaption[:BedroomQuality] = 'slept in room'
    ENUM[149] = :SleptFloor ; NUME[:SleptFloor] = 149 ; Caption[:SleptFloor] = 'after sleeping on the floor' ; XmlCaption[:SleptFloor] = 'slept on smooth floor'
    ENUM[150] = :SleptMud ; NUME[:SleptMud] = 150 ; Caption[:SleptMud] = 'after sleeping in the mud' ; XmlCaption[:SleptMud] = 'slept in mud'
    ENUM[151] = :SleptGrass ; NUME[:SleptGrass] = 151 ; Caption[:SleptGrass] = 'after sleeping in the grass' ; XmlCaption[:SleptGrass] = 'slept on grass'
    ENUM[152] = :SleptRoughFloor ; NUME[:SleptRoughFloor] = 152 ; Caption[:SleptRoughFloor] = 'after sleeping on a rough cave floor' ; XmlCaption[:SleptRoughFloor] = 'slept on rough stone'
    ENUM[153] = :SleptRocks ; NUME[:SleptRocks] = 153 ; Caption[:SleptRocks] = 'after sleeping on rocks' ; XmlCaption[:SleptRocks] = 'slept on rocks'
    ENUM[154] = :SleptIce ; NUME[:SleptIce] = 154 ; Caption[:SleptIce] = 'after sleeping on ice' ; XmlCaption[:SleptIce] = 'slept on ice'
    ENUM[155] = :SleptDirt ; NUME[:SleptDirt] = 155 ; Caption[:SleptDirt] = 'after sleeping in the dirt' ; XmlCaption[:SleptDirt] = 'slept on dirt'
    ENUM[156] = :SleptDriftwood ; NUME[:SleptDriftwood] = 156 ; Caption[:SleptDriftwood] = 'after sleeping on a pile of driftwood' ; XmlCaption[:SleptDriftwood] = 'slept on driftwood'
    ENUM[157] = :ArtDefacement ; NUME[:ArtDefacement] = 157 ; Caption[:ArtDefacement] = 'after suffering the travesty of art defacement' ; XmlCaption[:ArtDefacement] = 'artwork defaced'
    ENUM[158] = :Evicted ; NUME[:Evicted] = 158 ; Caption[:Evicted] = 'after being evicted' ; XmlCaption[:Evicted] = 'evicted'
    ENUM[159] = :GaveBirth ; NUME[:GaveBirth] = 159 ; Caption[:GaveBirth] = 'after giving birth to [a baby]' ; XmlCaption[:GaveBirth] = 'gave birth'
    ENUM[160] = :SpouseGaveBirth ; NUME[:SpouseGaveBirth] = 160 ; Caption[:SpouseGaveBirth] = 'after becoming a parent of [a baby]' ; XmlCaption[:SpouseGaveBirth] = 'gained relative'
    ENUM[161] = :ReceivedWater ; NUME[:ReceivedWater] = 161 ; Caption[:ReceivedWater] = 'after receiving water' ; XmlCaption[:ReceivedWater] = 'received water'
    ENUM[162] = :GaveWater ; NUME[:GaveWater] = 162 ; Caption[:GaveWater] = 'after giving somebody water' ; XmlCaption[:GaveWater] = 'gave water'
    ENUM[163] = :ReceivedFood ; NUME[:ReceivedFood] = 163 ; Caption[:ReceivedFood] = 'after receiving food' ; XmlCaption[:ReceivedFood] = 'received food'
    ENUM[164] = :GaveFood ; NUME[:GaveFood] = 164 ; Caption[:GaveFood] = 'after giving somebody food' ; XmlCaption[:GaveFood] = 'gave food'
    ENUM[165] = :Talked ; NUME[:Talked] = 165 ; Caption[:Talked] = 'talking with a [relation]' ; XmlCaption[:Talked] = 'relation chat'
    ENUM[166] = :OfficeQuality ; NUME[:OfficeQuality] = 166 ; Caption[:OfficeQuality] = 'conducted meeting in a [quality] room' ; XmlCaption[:OfficeQuality] = 'met in room'
    ENUM[167] = :MeetingInBedroom ; NUME[:MeetingInBedroom] = 167 ; Caption[:MeetingInBedroom] = 'having to conduct an official meeting in a bedroom' ; XmlCaption[:MeetingInBedroom] = 'official meeting in bedroom'
    ENUM[168] = :MeetingInDiningRoom ; NUME[:MeetingInDiningRoom] = 168 ; Caption[:MeetingInDiningRoom] = 'having to conduct an official meeting in a dining room' ; XmlCaption[:MeetingInDiningRoom] = 'official meeting in dining room'
    ENUM[169] = :NoRooms ; NUME[:NoRooms] = 169 ; Caption[:NoRooms] = 'not having any rooms' ; XmlCaption[:NoRooms] = 'official meeting without room'
    ENUM[170] = :TombQuality ; NUME[:TombQuality] = 170 ; Caption[:TombQuality] = 'having a [quality] tomb after gaining another year' ; XmlCaption[:TombQuality] = 'have tomb'
    ENUM[171] = :TombLack ; NUME[:TombLack] = 171 ; Caption[:TombLack] = 'about not having a tomb after gaining another year' ; XmlCaption[:TombLack] = 'have no tomb'
    ENUM[172] = :TalkToNoble ; NUME[:TalkToNoble] = 172 ; Caption[:TalkToNoble] = 'after talking to a pillar of society' ; XmlCaption[:TalkToNoble] = 'interacted with community pillar'
    ENUM[173] = :InteractPet ; NUME[:InteractPet] = 173 ; Caption[:InteractPet] = 'after interacting with a pet' ; XmlCaption[:InteractPet] = 'interacted with pet'
    ENUM[174] = :ConvictionCorpse ; NUME[:ConvictionCorpse] = 174 ; Caption[:ConvictionCorpse] = 'after a long-dead corpse was convicted of a crime' ; XmlCaption[:ConvictionCorpse] = 'dead unit convicted'
    ENUM[175] = :ConvictionAnimal ; NUME[:ConvictionAnimal] = 175 ; Caption[:ConvictionAnimal] = 'after an animal was convicted of a crime' ; XmlCaption[:ConvictionAnimal] = 'animal convicted'
    ENUM[176] = :ConvictionVictim ; NUME[:ConvictionVictim] = 176 ; Caption[:ConvictionVictim] = 'after the bizarre conviction against all reason of the victim of a crime' ; XmlCaption[:ConvictionVictim] = 'victim convicted'
    ENUM[177] = :ConvictionJusticeSelf ; NUME[:ConvictionJusticeSelf] = 177 ; Caption[:ConvictionJusticeSelf] = 'upon receiving justice through a criminal\'s conviction' ; XmlCaption[:ConvictionJusticeSelf] = 'perpetrator convicted'
    ENUM[178] = :ConvictionJusticeFamily ; NUME[:ConvictionJusticeFamily] = 178 ; Caption[:ConvictionJusticeFamily] = 'when a family member received justice through a criminal\'s conviction' ; XmlCaption[:ConvictionJusticeFamily] = 'perpetrator against family convicted'
    ENUM[179] = :Decay ; NUME[:Decay] = 179 ; Caption[:Decay] = 'after being forced to endure the decay of a [relative]' ; XmlCaption[:Decay] = 'body of relation rotted'
    ENUM[180] = :NeedsUnfulfilled ; NUME[:NeedsUnfulfilled] = 180 ; Caption[:NeedsUnfulfilled] = 'after [varying]' ; XmlCaption[:NeedsUnfulfilled] = 'unmet needs'
    ENUM[181] = :Prayer ; NUME[:Prayer] = 181 ; Caption[:Prayer] = 'after communing with [deity]' ; XmlCaption[:Prayer] = 'pray to hf'
    ENUM[182] = :DrinkWithoutCup ; NUME[:DrinkWithoutCup] = 182 ; Caption[:DrinkWithoutCup] = 'after having a drink without using a goblet, cup or mug' ; XmlCaption[:DrinkWithoutCup] = 'drinking without goblet'
    ENUM[183] = :ResearchBreakthrough ; NUME[:ResearchBreakthrough] = 183 ; Caption[:ResearchBreakthrough] = 'after making a breakthrough concerning [research]' ; XmlCaption[:ResearchBreakthrough] = 'research breakthrough'
    ENUM[184] = :ResearchStalled ; NUME[:ResearchStalled] = 184 ; Caption[:ResearchStalled] = 'after being unable to advance the study of [research]' ; XmlCaption[:ResearchStalled] = 'stuck on research topic'
    ENUM[185] = :PonderTopic ; NUME[:PonderTopic] = 185 ; Caption[:PonderTopic] = 'after pondering [research]' ; XmlCaption[:PonderTopic] = 'ponder research topic'
    ENUM[186] = :DiscussTopic ; NUME[:DiscussTopic] = 186 ; Caption[:DiscussTopic] = 'after discussing [research]' ; XmlCaption[:DiscussTopic] = 'discuss research topic'
    ENUM[187] = :Syndrome ; NUME[:Syndrome] = 187 ; Caption[:Syndrome] = 'due to [syndrome]' ; XmlCaption[:Syndrome] = 'syndrome emotion'
    ENUM[188] = :Perform ; NUME[:Perform] = 188 ; Caption[:Perform] = 'while performing' ; XmlCaption[:Perform] = 'performed in incident'
    ENUM[189] = :WatchPerform ; NUME[:WatchPerform] = 189 ; Caption[:WatchPerform] = 'after watching a performance' ; XmlCaption[:WatchPerform] = 'saw performance in incident'
    ENUM[190] = :RemoveTroupe ; NUME[:RemoveTroupe] = 190 ; Caption[:RemoveTroupe] = 'after being removed from a performance troupe' ; XmlCaption[:RemoveTroupe] = 'kicked out of troupe'
    ENUM[191] = :LearnTopic ; NUME[:LearnTopic] = 191 ; Caption[:LearnTopic] = 'after learning about [topic]' ; XmlCaption[:LearnTopic] = 'learned scholar flag'
    ENUM[192] = :LearnSkill ; NUME[:LearnSkill] = 192 ; Caption[:LearnSkill] = 'after learning about [skill]' ; XmlCaption[:LearnSkill] = 'learned skill'
    ENUM[193] = :LearnBook ; NUME[:LearnBook] = 193 ; Caption[:LearnBook] = 'after learning [book]' ; XmlCaption[:LearnBook] = 'learned written content'
    ENUM[194] = :LearnInteraction ; NUME[:LearnInteraction] = 194 ; Caption[:LearnInteraction] = 'after learning [interaction]' ; XmlCaption[:LearnInteraction] = 'learned interaction'
    ENUM[195] = :LearnPoetry ; NUME[:LearnPoetry] = 195 ; Caption[:LearnPoetry] = 'after learning [poetic form]' ; XmlCaption[:LearnPoetry] = 'learned poetic form'
    ENUM[196] = :LearnMusic ; NUME[:LearnMusic] = 196 ; Caption[:LearnMusic] = 'after learning [musical form]' ; XmlCaption[:LearnMusic] = 'learned musical form'
    ENUM[197] = :LearnDance ; NUME[:LearnDance] = 197 ; Caption[:LearnDance] = 'after learning [dance form]' ; XmlCaption[:LearnDance] = 'learned dance form'
    ENUM[198] = :TeachTopic ; NUME[:TeachTopic] = 198 ; Caption[:TeachTopic] = 'after teaching [topic]' ; XmlCaption[:TeachTopic] = 'taught scholar flag'
    ENUM[199] = :TeachSkill ; NUME[:TeachSkill] = 199 ; Caption[:TeachSkill] = 'after teaching [skill]' ; XmlCaption[:TeachSkill] = 'taught skill'
    ENUM[200] = :ReadBook ; NUME[:ReadBook] = 200 ; Caption[:ReadBook] = 'after reading [book]' ; XmlCaption[:ReadBook] = 'read written content'
    ENUM[201] = :WriteBook ; NUME[:WriteBook] = 201 ; Caption[:WriteBook] = 'after writing [book]' ; XmlCaption[:WriteBook] = 'wrote written content'
    ENUM[202] = :BecomeResident ; NUME[:BecomeResident] = 202 ; Caption[:BecomeResident] = 'afer being granted residency' ; XmlCaption[:BecomeResident] = 'residency petition accepted'
    ENUM[203] = :BecomeCitizen ; NUME[:BecomeCitizen] = 203 ; Caption[:BecomeCitizen] = 'after being granted citizenship' ; XmlCaption[:BecomeCitizen] = 'citizenship petition accepted'
    ENUM[204] = :DenyResident ; NUME[:DenyResident] = 204 ; Caption[:DenyResident] = 'after being denied residency' ; XmlCaption[:DenyResident] = 'residency petition rejected'
    ENUM[205] = :DenyCitizen ; NUME[:DenyCitizen] = 205 ; Caption[:DenyCitizen] = 'after being denied citizenship' ; XmlCaption[:DenyCitizen] = 'citizenship petition rejected'
    ENUM[206] = :LeaveTroupe ; NUME[:LeaveTroupe] = 206 ; Caption[:LeaveTroupe] = 'after leaving a performance troupe' ; XmlCaption[:LeaveTroupe] = 'left troupe'
    ENUM[207] = :MakeBelieve ; NUME[:MakeBelieve] = 207 ; Caption[:MakeBelieve] = 'after playing make believe' ; XmlCaption[:MakeBelieve] = 'make believe'
    ENUM[208] = :PlayToy ; NUME[:PlayToy] = 208 ; Caption[:PlayToy] = 'after playing with [a toy]' ; XmlCaption[:PlayToy] = 'play with toy'
    ENUM[209] = :DreamAbout ; NUME[:DreamAbout] = 209 ; XmlCaption[:DreamAbout] = 'dream about hf'
    ENUM[210] = :Dream ; NUME[:Dream] = 210 ; XmlCaption[:Dream] = 'dream'
    ENUM[211] = :Nightmare ; NUME[:Nightmare] = 211 ; XmlCaption[:Nightmare] = 'nightmare'
    ENUM[212] = :Argument ; NUME[:Argument] = 212 ; Caption[:Argument] = 'after getting into an argument' ; XmlCaption[:Argument] = 'argument'
    ENUM[213] = :CombatDrills ; NUME[:CombatDrills] = 213 ; Caption[:CombatDrills] = 'after combat drills' ; XmlCaption[:CombatDrills] = 'did individual melee drills'
    ENUM[214] = :ArcheryPractice ; NUME[:ArcheryPractice] = 214 ; Caption[:ArcheryPractice] = 'after practicing at the archery target' ; XmlCaption[:ArcheryPractice] = 'did ranged practice'
    ENUM[215] = :ImproveSkill ; NUME[:ImproveSkill] = 215 ; Caption[:ImproveSkill] = 'upon improving [skill]' ; XmlCaption[:ImproveSkill] = 'improved skill'
    ENUM[216] = :WearItem ; NUME[:WearItem] = 216 ; Caption[:WearItem] = 'after putting on a [quality] item' ; XmlCaption[:WearItem] = 'put on quality worn item'
    ENUM[217] = :RealizeValue ; NUME[:RealizeValue] = 217 ; Caption[:RealizeValue] = 'after realizing the [level] of [value]' ; XmlCaption[:RealizeValue] = 'change personality value'
    ENUM[218] = :OpinionStoryteller ; NUME[:OpinionStoryteller] = 218 ; XmlCaption[:OpinionStoryteller] = 'active performance storyteller'
    ENUM[219] = :OpinionRecitation ; NUME[:OpinionRecitation] = 219 ; XmlCaption[:OpinionRecitation] = 'active performance poem reciter'
    ENUM[220] = :OpinionInstrumentSimulation ; NUME[:OpinionInstrumentSimulation] = 220 ; XmlCaption[:OpinionInstrumentSimulation] = 'active performance simulated instrument'
    ENUM[221] = :OpinionInstrumentPlayer ; NUME[:OpinionInstrumentPlayer] = 221 ; XmlCaption[:OpinionInstrumentPlayer] = 'active performance instrument'
    ENUM[222] = :OpinionSinger ; NUME[:OpinionSinger] = 222 ; XmlCaption[:OpinionSinger] = 'active performance singer'
    ENUM[223] = :OpinionChanter ; NUME[:OpinionChanter] = 223 ; XmlCaption[:OpinionChanter] = 'active performance chanter'
    ENUM[224] = :OpinionDancer ; NUME[:OpinionDancer] = 224 ; XmlCaption[:OpinionDancer] = 'active performance dancer'
    ENUM[225] = :OpinionStory ; NUME[:OpinionStory] = 225 ; XmlCaption[:OpinionStory] = 'active story event'
    ENUM[226] = :OpinionPoetry ; NUME[:OpinionPoetry] = 226 ; XmlCaption[:OpinionPoetry] = 'active poetic form'
    ENUM[227] = :OpinionMusic ; NUME[:OpinionMusic] = 227 ; XmlCaption[:OpinionMusic] = 'active musical form'
    ENUM[228] = :OpinionDance ; NUME[:OpinionDance] = 228 ; XmlCaption[:OpinionDance] = 'active dance form'
    ENUM[229] = :Defeated ; NUME[:Defeated] = 229 ; XmlCaption[:Defeated] = 'defeated hf'
    ENUM[230] = :FavoritePossession ; NUME[:FavoritePossession] = 230 ; XmlCaption[:FavoritePossession] = 'item was favorite possession'
    ENUM[231] = :PreserveBody ; NUME[:PreserveBody] = 231 ; XmlCaption[:PreserveBody] = 'by preserving part of body'
    ENUM[232] = :Murdered ; NUME[:Murdered] = 232 ; XmlCaption[:Murdered] = 'murdered hf'
    ENUM[233] = :HistEventCollection ; NUME[:HistEventCollection] = 233 ; XmlCaption[:HistEventCollection] = 'historical event collection'
    ENUM[234] = :ViewOwnDisplay ; NUME[:ViewOwnDisplay] = 234 ; XmlCaption[:ViewOwnDisplay] = 'viewed item in own display'
    ENUM[235] = :ViewDisplay ; NUME[:ViewDisplay] = 235 ; XmlCaption[:ViewDisplay] = 'viewed displayed item'
    ENUM[236] = :AcquireArtifact ; NUME[:AcquireArtifact] = 236 ; XmlCaption[:AcquireArtifact] = 'acquired artifact'
    ENUM[237] = :DenySanctuary ; NUME[:DenySanctuary] = 237 ; XmlCaption[:DenySanctuary] = 'turned child away from sanctuary'
    ENUM[238] = :CaughtSneaking ; NUME[:CaughtSneaking] = 238 ; XmlCaption[:CaughtSneaking] = 'caught sneaking last stand'
    ENUM[239] = :GaveArtifact ; NUME[:GaveArtifact] = 239 ; XmlCaption[:GaveArtifact] = 'claimed artifact given away'
    ENUM[240] = :SawDeadBody ; NUME[:SawDeadBody] = 240 ; Caption[:SawDeadBody] = 'saw [somebody]\'s dead body' ; XmlCaption[:SawDeadBody] = 'saw a dead body'
    ENUM[241] = :Expelled ; NUME[:Expelled] = 241 ; Caption[:Expelled] = 'after being expelled' ; XmlCaption[:Expelled] = 'expelled'
    ENUM[242] = :RelativeExpelled ; NUME[:RelativeExpelled] = 242 ; Caption[:RelativeExpelled] = 'after [somebody] was expelled' ; XmlCaption[:RelativeExpelled] = 'relative expelled'
    ENUM[243] = :PromisedVampireImmortality ; NUME[:PromisedVampireImmortality] = 243 ; XmlCaption[:PromisedVampireImmortality] = 'preying on civilized for blood'
    ENUM[244] = :PromisedNecroImmortality ; NUME[:PromisedNecroImmortality] = 244 ; XmlCaption[:PromisedNecroImmortality] = 'unnaturally ageless'
    ENUM[245] = :SiteLecture ; NUME[:SiteLecture] = 245 ; Caption[:SiteLecture] = 'after watching a lecture in [site]' ; XmlCaption[:SiteLecture] = 'scholarly lecture in site'
    ENUM[246] = :SitePerformance ; NUME[:SitePerformance] = 246 ; Caption[:SitePerformance] = 'after watching a performance in [site]' ; XmlCaption[:SitePerformance] = 'performance in site'
    ENUM[247] = :AcceptedBribe ; NUME[:AcceptedBribe] = 247 ; Caption[:AcceptedBribe] = 'after accepting bribes in exchange for leniency' ; XmlCaption[:AcceptedBribe] = 'accepting bribes for leniency'
    ENUM[248] = :EmbezzledFunds ; NUME[:EmbezzledFunds] = 248 ; Caption[:EmbezzledFunds] = 'after embezzling funds' ; XmlCaption[:EmbezzledFunds] = 'embezzling funds from position'
    ENUM[249] = :CutOfCorruptFunds ; NUME[:CutOfCorruptFunds] = 249 ; Caption[:CutOfCorruptFunds] = 'after receiving a cut of corruptly-obtained funds' ; XmlCaption[:CutOfCorruptFunds] = 'cut of corrupt funds'
    ENUM[250] = :Abducted ; NUME[:Abducted] = 250 ; Caption[:Abducted] = 'after abducting [somebody]' ; XmlCaption[:Abducted] = 'abducted hf'
    ENUM[251] = :FromAfar ; NUME[:FromAfar] = 251 ; Caption[:FromAfar] = 'from afar' ; XmlCaption[:FromAfar] = 'from afar'
    ENUM[252] = :AcceptedTemplePetition ; NUME[:AcceptedTemplePetition] = 252 ; Caption[:AcceptedTemplePetition] = 'after the acceptance of a petition for a temple for [entity]' ; XmlCaption[:AcceptedTemplePetition] = 'temple petition accepted'
    ENUM[253] = :EstablishedTemple ; NUME[:EstablishedTemple] = 253 ; Caption[:EstablishedTemple] = 'after the establishment of a temple for [entity]' ; XmlCaption[:EstablishedTemple] = 'entity temple recognition'
    ENUM[254] = :RejectedTemplePetition ; NUME[:RejectedTemplePetition] = 254 ; XmlCaption[:RejectedTemplePetition] = 'guildhall petition accepted'
    ENUM[255] = :IgnoredTemplePetition ; NUME[:IgnoredTemplePetition] = 255 ; XmlCaption[:IgnoredTemplePetition] = 'guildhall petition accepted'
    ENUM[256] = :AbandonedTemplePetition ; NUME[:AbandonedTemplePetition] = 256 ; XmlCaption[:AbandonedTemplePetition] = 'guildhall petition accepted'
    ENUM[257] = :DeferredToSuperior ; NUME[:DeferredToSuperior] = 257 ; XmlCaption[:DeferredToSuperior] = 'is entity subordinate'
    ENUM[258] = :AcceptedGuildhallPetition ; NUME[:AcceptedGuildhallPetition] = 258 ; Caption[:AcceptedGuildhallPetition] = 'after the acceptance of a petition for a guildhall for [entity]' ; XmlCaption[:AcceptedGuildhallPetition] = 'guildhall petition accepted'
    ENUM[259] = :EstablishedGuildhallPetition ; NUME[:EstablishedGuildhallPetition] = 259 ; Caption[:EstablishedGuildhallPetition] = 'after the establishment of a guildhall for [entity]' ; XmlCaption[:EstablishedGuildhallPetition] = 'entity temple recognition'
    ENUM[260] = :RejectedGuildhallPetition ; NUME[:RejectedGuildhallPetition] = 260 ; XmlCaption[:RejectedGuildhallPetition] = ''
    ENUM[261] = :IgnoredGuildhallPetition ; NUME[:IgnoredGuildhallPetition] = 261 ; XmlCaption[:IgnoredGuildhallPetition] = ''
    ENUM[262] = :AbandonedGuildhallPetition ; NUME[:AbandonedGuildhallPetition] = 262 ; XmlCaption[:AbandonedGuildhallPetition] = ''
    ENUM[263] = :InfiltrationMission ; NUME[:InfiltrationMission] = 263 ; Caption[:InfiltrationMission] = 'during an infiltration mission' ; XmlCaption[:InfiltrationMission] = 'during an infilitration mission'
    ENUM[264] = :BreakUp ; NUME[:BreakUp] = 264 ; Caption[:BreakUp] = 'after a break up' ; XmlCaption[:BreakUp] = 'broke up with lover'
    ENUM[265] = :Divorce ; NUME[:Divorce] = 265 ; Caption[:Divorce] = 'after getting divorced' ; XmlCaption[:Divorce] = 'divorced'
    ENUM[266] = :Unk266 ; NUME[:Unk266] = 266 ; XmlCaption[:Unk266] = 'active performance preacher'
    ENUM[267] = :Unk267 ; NUME[:Unk267] = 267 ; XmlCaption[:Unk267] = 'active sermon worship hfid'
    ENUM[268] = :Unk268 ; NUME[:Unk268] = 268 ; XmlCaption[:Unk268] = 'active sermon sphere'
    ENUM[269] = :Unk269 ; NUME[:Unk269] = 269 ; XmlCaption[:Unk269] = 'active sermon promote value'
    ENUM[270] = :Unk270 ; NUME[:Unk270] = 270 ; XmlCaption[:Unk270] = 'active sermon refuse value'
    ENUM[271] = :IntellectualDiscussion ; NUME[:IntellectualDiscussion] = 271 ; Caption[:IntellectualDiscussion] = 'having an intellectual discussion with [somebody]' ; XmlCaption[:IntellectualDiscussion] = 'relation abstract chat'
    ENUM[272] = :SharePersonalInsight ; NUME[:SharePersonalInsight] = 272 ; Caption[:SharePersonalInsight] = 'sharing a personal insight with [somebody]' ; XmlCaption[:SharePersonalInsight] = 'relation gave personal chat'
    ENUM[273] = :ShareOthersPersonalInsight ; NUME[:ShareOthersPersonalInsight] = 273 ; Caption[:ShareOthersPersonalInsight] = 'sharing [somebody]\'s personal insight' ; XmlCaption[:ShareOthersPersonalInsight] = 'relation received personal chat'
    ENUM[274] = :DiscussProblems ; NUME[:DiscussProblems] = 274 ; Caption[:DiscussProblems] = 'discussing their problems with [somebody]' ; XmlCaption[:DiscussProblems] = 'relation gave stress complaint chat'
    ENUM[275] = :DiscussOthersProblems ; NUME[:DiscussOthersProblems] = 275 ; Caption[:DiscussOthersProblems] = 'discussing [somebody]\'s problems' ; XmlCaption[:DiscussOthersProblems] = 'relation received stress complaint chat'
end

class UnitsOtherId < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ANY_RIDER ; NUME[:ANY_RIDER] = 0
    ENUM[1] = :ANY_BABY2 ; NUME[:ANY_BABY2] = 1
end

class VagueRelationshipType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :ChildhoodFriend ; NUME[:ChildhoodFriend] = 0
    ENUM[1] = :WarBuddy ; NUME[:WarBuddy] = 1
    ENUM[2] = :JealousObsession ; NUME[:JealousObsession] = 2
    ENUM[3] = :JealousRelationshipGrudge ; NUME[:JealousRelationshipGrudge] = 3
    ENUM[4] = :Lover ; NUME[:Lover] = 4
    ENUM[5] = :FormerLover ; NUME[:FormerLover] = 5
    ENUM[6] = :ScholarBuddy ; NUME[:ScholarBuddy] = 6
    ENUM[7] = :ArtisticBuddy ; NUME[:ArtisticBuddy] = 7
    ENUM[8] = :AthleteBuddy ; NUME[:AthleteBuddy] = 8
    ENUM[9] = :AtheleticRival ; NUME[:AtheleticRival] = 9
    ENUM[10] = :BusinessRival ; NUME[:BusinessRival] = 10
    ENUM[11] = :ReligiousPersecutionGrudge ; NUME[:ReligiousPersecutionGrudge] = 11
    ENUM[12] = :Grudge ; NUME[:Grudge] = 12
    ENUM[13] = :PersecutionGrudge ; NUME[:PersecutionGrudge] = 13
    ENUM[14] = :SupernaturalGrudge ; NUME[:SupernaturalGrudge] = 14
    ENUM[15] = :Lieutenant ; NUME[:Lieutenant] = 15
    ENUM[16] = :WorshippedDeity ; NUME[:WorshippedDeity] = 16
    ENUM[17] = :Spouse ; NUME[:Spouse] = 17
    ENUM[18] = :Mother ; NUME[:Mother] = 18
    ENUM[19] = :Father ; NUME[:Father] = 19
    ENUM[20] = :Master ; NUME[:Master] = 20
    ENUM[21] = :Apprentice ; NUME[:Apprentice] = 21
    ENUM[22] = :Companion ; NUME[:Companion] = 22
    ENUM[23] = :ExSpouse ; NUME[:ExSpouse] = 23
    ENUM[24] = :Neighbor ; NUME[:Neighbor] = 24
    ENUM[25] = :SharedEntity ; NUME[:SharedEntity] = 25
end

class ValueType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :LAW ; NUME[:LAW] = 0
    ENUM[1] = :LOYALTY ; NUME[:LOYALTY] = 1
    ENUM[2] = :FAMILY ; NUME[:FAMILY] = 2
    ENUM[3] = :FRIENDSHIP ; NUME[:FRIENDSHIP] = 3
    ENUM[4] = :POWER ; NUME[:POWER] = 4
    ENUM[5] = :TRUTH ; NUME[:TRUTH] = 5
    ENUM[6] = :CUNNING ; NUME[:CUNNING] = 6
    ENUM[7] = :ELOQUENCE ; NUME[:ELOQUENCE] = 7
    ENUM[8] = :FAIRNESS ; NUME[:FAIRNESS] = 8
    ENUM[9] = :DECORUM ; NUME[:DECORUM] = 9
    ENUM[10] = :TRADITION ; NUME[:TRADITION] = 10
    ENUM[11] = :ARTWORK ; NUME[:ARTWORK] = 11
    ENUM[12] = :COOPERATION ; NUME[:COOPERATION] = 12
    ENUM[13] = :INDEPENDENCE ; NUME[:INDEPENDENCE] = 13
    ENUM[14] = :STOICISM ; NUME[:STOICISM] = 14
    ENUM[15] = :INTROSPECTION ; NUME[:INTROSPECTION] = 15
    ENUM[16] = :SELF_CONTROL ; NUME[:SELF_CONTROL] = 16
    ENUM[17] = :TRANQUILITY ; NUME[:TRANQUILITY] = 17
    ENUM[18] = :HARMONY ; NUME[:HARMONY] = 18
    ENUM[19] = :MERRIMENT ; NUME[:MERRIMENT] = 19
    ENUM[20] = :CRAFTSMANSHIP ; NUME[:CRAFTSMANSHIP] = 20
    ENUM[21] = :MARTIAL_PROWESS ; NUME[:MARTIAL_PROWESS] = 21
    ENUM[22] = :SKILL ; NUME[:SKILL] = 22
    ENUM[23] = :HARD_WORK ; NUME[:HARD_WORK] = 23
    ENUM[24] = :SACRIFICE ; NUME[:SACRIFICE] = 24
    ENUM[25] = :COMPETITION ; NUME[:COMPETITION] = 25
    ENUM[26] = :PERSEVERENCE ; NUME[:PERSEVERENCE] = 26
    ENUM[27] = :LEISURE_TIME ; NUME[:LEISURE_TIME] = 27
    ENUM[28] = :COMMERCE ; NUME[:COMMERCE] = 28
    ENUM[29] = :ROMANCE ; NUME[:ROMANCE] = 29
    ENUM[30] = :NATURE ; NUME[:NATURE] = 30
    ENUM[31] = :PEACE ; NUME[:PEACE] = 31
    ENUM[32] = :KNOWLEDGE ; NUME[:KNOWLEDGE] = 32
end

class VerminCategory < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :Eater ; NUME[:Eater] = 0
    ENUM[1] = :Grounder ; NUME[:Grounder] = 1
    ENUM[2] = :Rotter ; NUME[:Rotter] = 2
    ENUM[3] = :Swamper ; NUME[:Swamper] = 3
    ENUM[4] = :Searched ; NUME[:Searched] = 4
    ENUM[5] = :Disturbed ; NUME[:Disturbed] = 5
    ENUM[6] = :Dropped ; NUME[:Dropped] = 6
    ENUM[7] = :Underworld ; NUME[:Underworld] = 7
end

class ViewscreenImageCreatorMode < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :ArtistToChoose ; NUME[:ArtistToChoose] = 0
    ENUM[1] = :Histfig ; NUME[:Histfig] = 1
    ENUM[2] = :Site ; NUME[:Site] = 2
    ENUM[3] = :Entity ; NUME[:Entity] = 3
    ENUM[4] = :HistoryEvent ; NUME[:HistoryEvent] = 4
    ENUM[5] = :ExistingImage ; NUME[:ExistingImage] = 5
    ENUM[6] = :NewImage ; NUME[:NewImage] = 6
    ENUM[7] = :AddCreature ; NUME[:AddCreature] = 7
    ENUM[8] = :AddHistfig ; NUME[:AddHistfig] = 8
    ENUM[9] = :AddPlant ; NUME[:AddPlant] = 9
    ENUM[10] = :AddTree ; NUME[:AddTree] = 10
    ENUM[11] = :AddShape ; NUME[:AddShape] = 11
    ENUM[12] = :AddObject ; NUME[:AddObject] = 12
    ENUM[13] = :AddArtifact ; NUME[:AddArtifact] = 13
    ENUM[14] = :AddRelationship ; NUME[:AddRelationship] = 14
    ENUM[15] = :ChooseRelationshipX ; NUME[:ChooseRelationshipX] = 15
    ENUM[16] = :ChooseRelationshipY ; NUME[:ChooseRelationshipY] = 16
    ENUM[17] = :EnterNumber ; NUME[:EnterNumber] = 17
    ENUM[18] = :DeleteElement ; NUME[:DeleteElement] = 18
end

class ViewscreenKitchenprefPage < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :VegetablesFruitLeaves ; NUME[:VegetablesFruitLeaves] = 0
    ENUM[1] = :Seeds ; NUME[:Seeds] = 1
    ENUM[2] = :Drinks ; NUME[:Drinks] = 2
    ENUM[3] = :MeatFishOther ; NUME[:MeatFishOther] = 3
end

class ViewscreenUnitlistPage < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Citizens ; NUME[:Citizens] = 0
    ENUM[1] = :Livestock ; NUME[:Livestock] = 1
    ENUM[2] = :Others ; NUME[:Others] = 2
    ENUM[3] = :Dead ; NUME[:Dead] = 3
end

class WeaponFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :CAN_STONE ; NUME[:CAN_STONE] = 0
    ENUM[1] = :HAS_EDGE_ATTACK ; NUME[:HAS_EDGE_ATTACK] = 1
    ENUM[2] = :TRAINING ; NUME[:TRAINING] = 2
end

class WeatherType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :None ; NUME[:None] = 0
    ENUM[1] = :Rain ; NUME[:Rain] = 1
    ENUM[2] = :Snow ; NUME[:Snow] = 2
end

class WhereaboutsType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :NONE ; NUME[:NONE] = -1
    ENUM[0] = :Wanderer ; NUME[:Wanderer] = 0
    ENUM[1] = :Settler ; NUME[:Settler] = 1
    ENUM[2] = :Refugee ; NUME[:Refugee] = 2
    ENUM[3] = :ArmyDied ; NUME[:ArmyDied] = 3
    ENUM[4] = :ArmySurvived ; NUME[:ArmySurvived] = 4
    ENUM[5] = :Visitor ; NUME[:Visitor] = 5
end

class WitnessReportType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[-1] = :None ; NUME[:None] = -1
    ENUM[0] = :WitnessedCrime ; NUME[:WitnessedCrime] = 0
    ENUM[1] = :FoundCorpse ; NUME[:FoundCorpse] = 1
end

class WorkshopType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    Name = Hash.new
    ENUM[0] = :Carpenters ; NUME[:Carpenters] = 0 ; Name[:Carpenters] = 'Carpenter\'s Workshop'
    ENUM[1] = :Farmers ; NUME[:Farmers] = 1 ; Name[:Farmers] = 'Farmer\'s Workshop'
    ENUM[2] = :Masons ; NUME[:Masons] = 2 ; Name[:Masons] = 'Mason\'s Workshop'
    ENUM[3] = :Craftsdwarfs ; NUME[:Craftsdwarfs] = 3 ; Name[:Craftsdwarfs] = 'Craftsdwarf\'s Workshop'
    ENUM[4] = :Jewelers ; NUME[:Jewelers] = 4 ; Name[:Jewelers] = 'Jeweler\'s Workshop'
    ENUM[5] = :MetalsmithsForge ; NUME[:MetalsmithsForge] = 5 ; Name[:MetalsmithsForge] = 'Metalsmith\'s Forge'
    ENUM[6] = :MagmaForge ; NUME[:MagmaForge] = 6 ; Name[:MagmaForge] = 'Magma Forge'
    ENUM[7] = :Bowyers ; NUME[:Bowyers] = 7 ; Name[:Bowyers] = 'Bowyer\'s Workshop'
    ENUM[8] = :Mechanics ; NUME[:Mechanics] = 8 ; Name[:Mechanics] = 'Mechanic\'s Workshop'
    ENUM[9] = :Siege ; NUME[:Siege] = 9 ; Name[:Siege] = 'Siege Workshop'
    ENUM[10] = :Butchers ; NUME[:Butchers] = 10 ; Name[:Butchers] = 'Butcher\'s Shop'
    ENUM[11] = :Leatherworks ; NUME[:Leatherworks] = 11 ; Name[:Leatherworks] = 'Leather Works'
    ENUM[12] = :Tanners ; NUME[:Tanners] = 12 ; Name[:Tanners] = 'Tanner\'s Shop'
    ENUM[13] = :Clothiers ; NUME[:Clothiers] = 13 ; Name[:Clothiers] = 'Clothier\'s Shop'
    ENUM[14] = :Fishery ; NUME[:Fishery] = 14
    ENUM[15] = :Still ; NUME[:Still] = 15
    ENUM[16] = :Loom ; NUME[:Loom] = 16
    ENUM[17] = :Quern ; NUME[:Quern] = 17
    ENUM[18] = :Kennels ; NUME[:Kennels] = 18
    ENUM[19] = :Kitchen ; NUME[:Kitchen] = 19
    ENUM[20] = :Ashery ; NUME[:Ashery] = 20
    ENUM[21] = :Dyers ; NUME[:Dyers] = 21 ; Name[:Dyers] = 'Dyer\'s Shop'
    ENUM[22] = :Millstone ; NUME[:Millstone] = 22
    ENUM[23] = :Custom ; NUME[:Custom] = 23 ; Name[:Custom] = 'Custom Workshop'
    ENUM[24] = :Tool ; NUME[:Tool] = 24
end

class WorldCaveinFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ProcessColumns ; NUME[:ProcessColumns] = 0
end

class WorldConstructionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ROAD ; NUME[:ROAD] = 0
    ENUM[1] = :TUNNEL ; NUME[:TUNNEL] = 1
    ENUM[2] = :BRIDGE ; NUME[:BRIDGE] = 2
    ENUM[3] = :WALL ; NUME[:WALL] = 3
end

class WorldPopulationType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Animal ; NUME[:Animal] = 0
    ENUM[1] = :Vermin ; NUME[:Vermin] = 1
    ENUM[2] = :Unk2 ; NUME[:Unk2] = 2
    ENUM[3] = :VerminInnumerable ; NUME[:VerminInnumerable] = 3
    ENUM[4] = :ColonyInsect ; NUME[:ColonyInsect] = 4
    ENUM[5] = :Tree ; NUME[:Tree] = 5
    ENUM[6] = :Grass ; NUME[:Grass] = 6
    ENUM[7] = :Bush ; NUME[:Bush] = 7
end

class WorldRegionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Swamp ; NUME[:Swamp] = 0
    ENUM[1] = :Desert ; NUME[:Desert] = 1
    ENUM[2] = :Jungle ; NUME[:Jungle] = 2
    ENUM[3] = :Mountains ; NUME[:Mountains] = 3
    ENUM[4] = :Ocean ; NUME[:Ocean] = 4
    ENUM[5] = :Lake ; NUME[:Lake] = 5
    ENUM[6] = :Glacier ; NUME[:Glacier] = 6
    ENUM[7] = :Tundra ; NUME[:Tundra] = 7
    ENUM[8] = :Steppe ; NUME[:Steppe] = 8
    ENUM[9] = :Hills ; NUME[:Hills] = 9
end

class WorldSiteFlags < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Undiscovered ; NUME[:Undiscovered] = 0
    ENUM[3] = :Town ; NUME[:Town] = 3
    ENUM[9] = :CaveCapital ; NUME[:CaveCapital] = 9
end

class WorldSiteType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :PlayerFortress ; NUME[:PlayerFortress] = 0
    ENUM[1] = :DarkFortress ; NUME[:DarkFortress] = 1
    ENUM[2] = :Cave ; NUME[:Cave] = 2
    ENUM[3] = :MountainHalls ; NUME[:MountainHalls] = 3
    ENUM[4] = :ForestRetreat ; NUME[:ForestRetreat] = 4
    ENUM[5] = :Town ; NUME[:Town] = 5
    ENUM[6] = :ImportantLocation ; NUME[:ImportantLocation] = 6
    ENUM[7] = :LairShrine ; NUME[:LairShrine] = 7
    ENUM[8] = :Fortress ; NUME[:Fortress] = 8
    ENUM[9] = :Camp ; NUME[:Camp] = 9
    ENUM[10] = :Monument ; NUME[:Monument] = 10
end

class WorldgenRangeType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ELEVATION ; NUME[:ELEVATION] = 0
    ENUM[1] = :RAINFALL ; NUME[:RAINFALL] = 1
    ENUM[3] = :TEMPERATURE ; NUME[:TEMPERATURE] = 3
    ENUM[5] = :DRAINAGE ; NUME[:DRAINAGE] = 5
    ENUM[6] = :VOLCANISM ; NUME[:VOLCANISM] = 6
    ENUM[7] = :SAVAGERY ; NUME[:SAVAGERY] = 7
end

class WorldgenRegionType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :SWAMP ; NUME[:SWAMP] = 0
    ENUM[1] = :DESERT ; NUME[:DESERT] = 1
    ENUM[2] = :FOREST ; NUME[:FOREST] = 2
    ENUM[3] = :MOUNTAINS ; NUME[:MOUNTAINS] = 3
    ENUM[4] = :OCEAN ; NUME[:OCEAN] = 4
    ENUM[5] = :LAKE ; NUME[:LAKE] = 5
    ENUM[6] = :GLACIER ; NUME[:GLACIER] = 6
    ENUM[7] = :TUNDRA ; NUME[:TUNDRA] = 7
    ENUM[8] = :GRASSLAND ; NUME[:GRASSLAND] = 8
    ENUM[9] = :HILLS ; NUME[:HILLS] = 9
end

class WoundEffectType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Bruise ; NUME[:Bruise] = 0
    ENUM[1] = :Burn ; NUME[:Burn] = 1
    ENUM[2] = :Frostbite ; NUME[:Frostbite] = 2
    ENUM[3] = :Burn2 ; NUME[:Burn2] = 3
    ENUM[4] = :Melting ; NUME[:Melting] = 4
    ENUM[5] = :Boiling ; NUME[:Boiling] = 5
    ENUM[6] = :Freezing ; NUME[:Freezing] = 6
    ENUM[7] = :Condensation ; NUME[:Condensation] = 7
    ENUM[8] = :Necrosis ; NUME[:Necrosis] = 8
    ENUM[9] = :Blister ; NUME[:Blister] = 9
end

class WrittenContentStyle < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Meandering ; NUME[:Meandering] = 0
    ENUM[1] = :Cheerful ; NUME[:Cheerful] = 1
    ENUM[2] = :Depressing ; NUME[:Depressing] = 2
    ENUM[3] = :Rigid ; NUME[:Rigid] = 3
    ENUM[4] = :Serious ; NUME[:Serious] = 4
    ENUM[5] = :Disjointed ; NUME[:Disjointed] = 5
    ENUM[6] = :Ornate ; NUME[:Ornate] = 6
    ENUM[7] = :Forceful ; NUME[:Forceful] = 7
    ENUM[8] = :Humorous ; NUME[:Humorous] = 8
    ENUM[9] = :Immature ; NUME[:Immature] = 9
    ENUM[10] = :SelfIndulgent ; NUME[:SelfIndulgent] = 10
    ENUM[11] = :Touching ; NUME[:Touching] = 11
    ENUM[12] = :Compassionate ; NUME[:Compassionate] = 12
    ENUM[13] = :Vicious ; NUME[:Vicious] = 13
    ENUM[14] = :Concise ; NUME[:Concise] = 14
    ENUM[15] = :Scornful ; NUME[:Scornful] = 15
    ENUM[16] = :Witty ; NUME[:Witty] = 16
    ENUM[17] = :Ranting ; NUME[:Ranting] = 17
end

class WrittenContentType < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :Manual ; NUME[:Manual] = 0
    ENUM[1] = :Guide ; NUME[:Guide] = 1
    ENUM[2] = :Chronicle ; NUME[:Chronicle] = 2
    ENUM[3] = :ShortStory ; NUME[:ShortStory] = 3
    ENUM[4] = :Novel ; NUME[:Novel] = 4
    ENUM[5] = :Biography ; NUME[:Biography] = 5
    ENUM[6] = :Autobiography ; NUME[:Autobiography] = 6
    ENUM[7] = :Poem ; NUME[:Poem] = 7
    ENUM[8] = :Play ; NUME[:Play] = 8
    ENUM[9] = :Letter ; NUME[:Letter] = 9
    ENUM[10] = :Essay ; NUME[:Essay] = 10
    ENUM[11] = :Dialog ; NUME[:Dialog] = 11
    ENUM[12] = :MusicalComposition ; NUME[:MusicalComposition] = 12
    ENUM[13] = :Choreography ; NUME[:Choreography] = 13
    ENUM[14] = :ComparativeBiography ; NUME[:ComparativeBiography] = 14
    ENUM[15] = :BiographicalDictionary ; NUME[:BiographicalDictionary] = 15
    ENUM[16] = :Genealogy ; NUME[:Genealogy] = 16
    ENUM[17] = :Encyclopedia ; NUME[:Encyclopedia] = 17
    ENUM[18] = :CulturalHistory ; NUME[:CulturalHistory] = 18
    ENUM[19] = :CulturalComparison ; NUME[:CulturalComparison] = 19
    ENUM[20] = :AlternateHistory ; NUME[:AlternateHistory] = 20
    ENUM[21] = :TreatiseOnTechnologicalEvolution ; NUME[:TreatiseOnTechnologicalEvolution] = 21
    ENUM[22] = :Dictionary ; NUME[:Dictionary] = 22
    ENUM[23] = :StarChart ; NUME[:StarChart] = 23
    ENUM[24] = :StarCatalogue ; NUME[:StarCatalogue] = 24
    ENUM[25] = :Atlas ; NUME[:Atlas] = 25
end

class ZoomCommands < MemHack::Enum
    ENUM = Hash.new
    NUME = Hash.new
    ENUM[0] = :ZoomIn ; NUME[:ZoomIn] = 0
    ENUM[1] = :ZoomOut ; NUME[:ZoomOut] = 1
    ENUM[2] = :ZoomReset ; NUME[:ZoomReset] = 2
    ENUM[3] = :ZoomFullscreen ; NUME[:ZoomFullscreen] = 3
    ENUM[4] = :ZoomResetgrid ; NUME[:ZoomResetgrid] = 4
end

class Viewscreen < MemHack::Compound
    sizeof 32

    rtti_classname :viewscreenst

    field(:child, 8) {
        pointer {
            global :Viewscreen
        }
    }
    field(:parent, 16) {
        pointer {
            global :Viewscreen
        }
    }
    field(:breakdown_level, 24) {
        number 8, true, :NONE, InterfaceBreakdownTypes
    }
    field(:option_key_pressed, 25) {
        number 8, true
    }
    def feed(events)
        DFHack.vmethod_call(self, 0, events) ; nil
    end
    def logic()
        DFHack.vmethod_call(self, 8) ; nil
    end
    def render()
        DFHack.vmethod_call(self, 16) ; nil
    end
    def resize(w, h)
        DFHack.vmethod_call(self, 24, w, h) ; nil
    end
    def help()
        DFHack.vmethod_call(self, 32) ; nil
    end
    def movies_okay()
        val = DFHack.vmethod_call(self, 40)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def is_option_screen()
        val = DFHack.vmethod_call(self, 48)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def is_save_screen()
        val = DFHack.vmethod_call(self, 56)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def key_conflict(arg0)
        val = DFHack.vmethod_call(self, 72, InterfaceKey.int(arg0))
        (val & 1) != 0
    end
end

class KeybindingScreen < Viewscreen
    sizeof 336

    rtti_classname :KeybindingScreen

    field(:mode, 32) {
        class ::DFHack::KeybindingScreen_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Main ; NUME[:Main] = 0
            ENUM[1] = :KeyL ; NUME[:KeyL] = 1
            ENUM[2] = :KeyR ; NUME[:KeyR] = 2
            ENUM[3] = :Macro ; NUME[:Macro] = 3
            ENUM[4] = :Register ; NUME[:Register] = 4
        end

        number 32, true, nil, KeybindingScreen_TMode
    }
    field(:main, 36) {
        global :WidgetMenu
    }
    field(:keyL, 96) {
        global :WidgetMenu
    }
    field(:keyR, 156) {
        global :WidgetMenu
    }
    field(:macro, 216) {
        global :WidgetMenu
    }
    field(:keyRegister, 276) {
        global :WidgetMenu
    }
end

class MacroScreenLoad < Viewscreen
    sizeof 104

    rtti_classname :MacroScreenLoad

    field(:menu, 32) {
        global :WidgetMenu
    }
    field(:width, 92) {
        number 32, true
    }
    field(:height, 96) {
        number 32, true
    }
end

class MacroScreenSave < Viewscreen
    sizeof 72

    rtti_classname :MacroScreenSave

    field(:id, 32) {
        global :WidgetTextbox
    }
end

class AbstractBuilding < MemHack::Compound
    sizeof 184

    rtti_classname :abstract_buildingst

    field(:id, 8) {
        number 32, true
    }
    field(:inhabitants, 16) {
        stl_vector(8) {
            pointer {
                compound(:AbstractBuilding_TInhabitants) {
                    sizeof 8

                    field(:unk_1, 0) {
                        number 16, true
                    }
                    field(:histfig_id, 4) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                }
            }
        }
    }
    field(:flags, 40) {
        df_flagarray(AbstractBuildingFlags)
    }
    field(:unk1, 56) {
        pointer {
            compound(:AbstractBuilding_TUnk1) {
                sizeof 64

                field(:hfig, 0) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def hfig_tg ; hfig.map { |i| df.world.history.figures.binsearch(i) } ; end
                field(:unk_1, 24) {
                    number 32, true
                }
                field(:architectural_elements, 32) {
                    stl_vector(2) {
                        global :ArchitecturalElement
                    }
                }
                field(:mat_type, 56) {
                    number 16, true, -1
                }
                field(:mat_index, 60) {
                    number 32, true
                }
            }
        }
    }
    field(:unk2, 64) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:parent_building_id, 88) {
        number 32, true, -1
    }
    field(:child_building_ids, 96) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:site_owner_id, 120) {
        number 32, true, -1
    }
    def site_owner_tg ; df.world.entities.all.binsearch(site_owner_id) ; end
    field(:scribeinfo, 128) {
        pointer {
            global :LocationScribeJobs
        }
    }
    field(:reputation_reports, 136) {
        pointer {
            global :SiteReputationInfo
        }
    }
    field(:unk_v42_3, 144) {
        pointer {
            static_array(8, 4) {
                number 32, true
            }
        }
    }
    field(:site_id, 152) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:pos, 156) {
        global :Coord2d
    }
    field(:occupations, 160) {
        stl_vector(8) {
            pointer {
                global :Occupation
            }
        }
    }
    def getType()
        AbstractBuildingType.sym(DFHack.vmethod_call(self, 0))
    end
    def getDisplayTile(tile, fg, bg, bright)
        DFHack.vmethod_call(self, 8, tile, fg, bg, bright) ; nil
    end
    def getName()
        ptr = DFHack.vmethod_call(self, 16)
        class << self
            global :LanguageName
        end._at(ptr) if ptr != 0
    end
    def getContents()
        ptr = DFHack.vmethod_call(self, 24)
        class << self
            global :AbstractBuildingContents
        end._at(ptr) if ptr != 0
    end
    def write_file(file)
        DFHack.vmethod_call(self, 32, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 40, file, SaveVersion.int(loadversion)) ; nil
    end
    def getReligionID()
        val = DFHack.vmethod_call(self, 56)
    end
    def getEntombed()
        ptr = DFHack.vmethod_call(self, 88)
        class << self
            global :AbstractBuildingEntombed
        end._at(ptr) if ptr != 0
    end
    def generate_xml(arg0, indent)
        DFHack.vmethod_call(self, 96, arg0, indent) ; nil
    end
end

class AbstractBuildingContents < MemHack::Compound
    sizeof 80

    field(:need_more, 0) {
        compound(:AbstractBuildingContents_TNeedMore) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:goblets, 0) { bit 0 }
            field(:instruments, 0) { bit 1 }
            field(:paper, 0) { bit 2 }
        }
    }
    field(:profession, 4) {
        number 16, true, nil, Profession
    }
    field(:desired_goblets, 8) {
        number 32, true
    }
    field(:desired_instruments, 12) {
        number 32, true
    }
    field(:desired_paper, 16) {
        number 32, true
    }
    field(:desired_copies, 20) {
        number 32, true, 2
    }
    field(:location_tier, 24) {
        number 32, true
    }
    field(:location_value, 28) {
        number 32, true
    }
    field(:count_goblets, 32) {
        number 32, true
    }
    field(:count_instruments, 36) {
        number 32, true
    }
    field(:count_paper, 40) {
        number 32, true
    }
    field(:unk_v47_2, 44) {
        number 32, true, 100
    }
    field(:unk_v47_3, 48) {
        number 32, true
    }
    field(:building_ids, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def building_tgs ; building_ids.map { |i| df.world.buildings.all.binsearch(i) } ; end
end

class AbstractBuildingCountingHousest < AbstractBuilding
    sizeof 304

    rtti_classname :abstract_building_counting_housest

    field(:name, 184) {
        global :LanguageName
    }
end

class AbstractBuildingDarkTowerst < AbstractBuilding
    sizeof 304

    rtti_classname :abstract_building_dark_towerst

    field(:name, 184) {
        global :LanguageName
    }
end

class AbstractBuildingDungeonst < AbstractBuilding
    sizeof 376

    rtti_classname :abstract_building_dungeonst

    field(:name, 184) {
        global :LanguageName
    }
    field(:dungeon_type, 304) {
        class ::DFHack::AbstractBuildingDungeonst_TDungeonType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :DUNGEON ; NUME[:DUNGEON] = 0
            ENUM[1] = :SEWERS ; NUME[:SEWERS] = 1
            ENUM[2] = :CATACOMBS ; NUME[:CATACOMBS] = 2
        end

        number 16, true, nil, AbstractBuildingDungeonst_TDungeonType
    }
    field(:unk_1, 308) {
        number 32, true
    }
    field(:entombed, 312) {
        global :AbstractBuildingEntombed
    }
    field(:unk_2, 360) {
        number 32, true
    }
    field(:unk_3, 364) {
        number 32, true
    }
    field(:unk_4, 368) {
        number 32, true
    }
end

class AbstractBuildingEntombed < MemHack::Compound
    sizeof 48

    field(:populations, 0) {
        stl_vector(8) {
            pointer {
                compound(:AbstractBuildingEntombed_TPopulations) {
                    sizeof 32

                    field(:count, 0) {
                        number 32, true
                    }
                    field(:race, 4) {
                        number 32, true, -1
                    }
                    def race_tg ; df.world.raws.creatures.all[race] ; end
                    field(:population, 8) {
                        number 32, true, -1
                    }
                    def population_tg ; df.world.entity_populations.binsearch(population) ; end
                    field(:unk_4, 12) {
                        number 32, true, -1
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        number 32, true
                    }
                    field(:unk_8, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:histfigs, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfigs_tg ; histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class AbstractBuildingGuildhallst < AbstractBuilding
    sizeof 384

    rtti_classname :abstract_building_guildhallst

    field(:name, 184) {
        global :LanguageName
    }
    field(:contents, 304) {
        global :AbstractBuildingContents
    }
end

class AbstractBuildingInnTavernst < AbstractBuilding
    sizeof 416

    rtti_classname :abstract_building_inn_tavernst

    field(:name, 184) {
        global :LanguageName
    }
    field(:contents, 304) {
        global :AbstractBuildingContents
    }
    field(:room_info, 384) {
        stl_vector(8) {
            pointer {
                compound(:AbstractBuildingInnTavernst_TRoomInfo) {
                    sizeof 56

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:unk_1, 8) {
                        stl_string
                    }
                    field(:world_x, 40) {
                        number 32, true
                    }
                    field(:world_y, 44) {
                        number 32, true
                    }
                    field(:world_z, 48) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:next_room_info_id, 408) {
        number 32, true
    }
end

class AbstractBuildingKeepst < AbstractBuilding
    sizeof 304

    rtti_classname :abstract_building_keepst

    field(:name, 184) {
        global :LanguageName
    }
end

class AbstractBuildingLibraryst < AbstractBuilding
    sizeof 424

    rtti_classname :abstract_building_libraryst

    field(:name, 184) {
        global :LanguageName
    }
    field(:copied_artifacts, 304) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def copied_artifacts_tg ; copied_artifacts.map { |i| df.world.artifacts.all.binsearch(i) } ; end
    field(:unk_1, 328) {
        number 32, true
    }
    field(:unk_2, 332) {
        number 32, true
    }
    field(:unk_3, 336) {
        number 32, true
    }
    field(:unk_4, 340) {
        number 32, true
    }
    field(:contents, 344) {
        global :AbstractBuildingContents
    }
end

class AbstractBuildingMarketst < AbstractBuilding
    sizeof 304

    rtti_classname :abstract_building_marketst

    field(:name, 184) {
        global :LanguageName
    }
end

class AbstractBuildingMeadHallst < AbstractBuilding
    sizeof 336

    rtti_classname :abstract_building_mead_hallst

    field(:name, 184) {
        global :LanguageName
    }
    field(:item1, 304) {
        global :SiteBuildingItem
    }
    field(:item2, 320) {
        global :SiteBuildingItem
    }
end

class AbstractBuildingTemplest < AbstractBuilding
    sizeof 392

    rtti_classname :abstract_building_templest

    field(:deity_type, 184) {
        number 32, true, nil, TempleDeityType
    }
    field(:deity_data, 188) {
        global :TempleDeityData
    }
    field(:name, 192) {
        global :LanguageName
    }
    field(:contents, 312) {
        global :AbstractBuildingContents
    }
end

class AbstractBuildingTombst < AbstractBuilding
    sizeof 360

    rtti_classname :abstract_building_tombst

    field(:name, 184) {
        global :LanguageName
    }
    field(:entombed, 304) {
        global :AbstractBuildingEntombed
    }
    field(:precedence, 352) {
        number 32, true
    }
end

class AbstractBuildingTowerst < AbstractBuilding
    sizeof 312

    rtti_classname :abstract_building_towerst

    field(:name, 184) {
        global :LanguageName
    }
    field(:unk_1, 304) {
        number 32, true
    }
end

class AbstractBuildingUnderworldSpirest < AbstractBuilding
    sizeof 312

    rtti_classname :abstract_building_underworld_spirest

    field(:name, 184) {
        global :LanguageName
    }
    field(:unk_bc, 304) {
        number 32, true
    }
end

class ActiveScriptVarst < MemHack::Compound
    sizeof 40

    rtti_classname :active_script_varst

    field(:name, 8) {
        stl_string
    }
    def setColor()
        DFHack.vmethod_call(self, 0) ; nil
    end
    def formatString(output, format)
        DFHack.vmethod_call(self, 8, output, format) ; nil
    end
    def getValue(int_value, ref_value)
        DFHack.vmethod_call(self, 16, int_value, ref_value) ; nil
    end
    def setValue(var)
        DFHack.vmethod_call(self, 24, var) ; nil
    end
    def removeUnit(ref_value)
        DFHack.vmethod_call(self, 32, ref_value) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 40, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 48, file, SaveVersion.int(loadversion)) ; nil
    end
end

class ActiveScriptVarLongst < ActiveScriptVarst
    sizeof 48

    rtti_classname :active_script_var_longst

    field(:value, 40) {
        number 32, true
    }
end

class ActiveScriptVarUnitst < ActiveScriptVarst
    sizeof 48

    rtti_classname :active_script_var_unitst

    field(:unit, 40) {
        pointer {
            global :Unit
        }
    }
end

class ActivityEntry < MemHack::Compound
    sizeof 40

    field(:id, 0) {
        number 32, true
    }
    field(:type, 4) {
        number 16, true, nil, ActivityEntryType
    }
    field(:events, 8) {
        stl_vector(8) {
            pointer {
                global :ActivityEvent
            }
        }
    }
    field(:next_event_id, 32) {
        number 32, true
    }
    field(:army_controller, 36) {
        number 32, true, -1
    }
    def army_controller_tg ; df.world.army_controllers.all.binsearch(army_controller) ; end
end

class ActivityEvent < MemHack::Compound
    sizeof 72

    rtti_classname :activity_eventst

    field(:event_id, 8) {
        number 32, true
    }
    field(:activity_id, 12) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:parent_event_id, 16) {
        number 32, true, -1
    }
    field(:flags, 20) {
        compound(:ActivityEvent_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:dismissed, 0) { bit 0 }
            field(:squad, 0) { bit 1 }
        }
    }
    field(:unk_v42_1, 24) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEvent_TUnkV421) {
                    sizeof 12

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:item_id, 4) {
                        number 32, true, -1
                    }
                    def item_tg ; df.world.items.all.binsearch(item_id) ; end
                    field(:unk_2, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v42_2, 48) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEvent_TUnkV422) {
                    sizeof 16

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true, -1
                    }
                    field(:item_id, 8) {
                        number 32, true, -1
                    }
                    def item_tg ; df.world.items.all.binsearch(item_id) ; end
                    field(:unk_3, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
    def getType()
        ActivityEventType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def isEmpty()
        val = DFHack.vmethod_call(self, 32)
        (val & 1) != 0
    end
    def getParticipantInfo()
        ptr = DFHack.vmethod_call(self, 56)
        class << self
            global :ActivityEventParticipants
        end._at(ptr) if ptr != 0
    end
    def dismiss(children_too)
        DFHack.vmethod_call(self, 64, children_too) ; nil
    end
    def move(dx, dy, dz)
        DFHack.vmethod_call(self, 72, dx, dy, dz) ; nil
    end
    def removeParticipant(histfig, unit, arg2)
        DFHack.vmethod_call(self, 80, histfig, unit, arg2) ; nil
    end
    def process(arg0, unit)
        DFHack.vmethod_call(self, 88, arg0, unit) ; nil
    end
    def checkDrillInvalid(unit)
        val = DFHack.vmethod_call(self, 96, unit)
    end
    def decUniformLock(arg0)
        val = DFHack.vmethod_call(self, 104, arg0)
        (val & 1) != 0
    end
    def getSquadEventType()
        SquadEventType.sym(DFHack.vmethod_call(self, 112))
    end
    def setDemoSkill(skill)
        DFHack.vmethod_call(self, 120, JobSkill.int(skill)) ; nil
    end
    def setSkillDemoTimers(wait_countdown, train_rounds, train_countdown)
        DFHack.vmethod_call(self, 128, wait_countdown, train_rounds, train_countdown) ; nil
    end
    def adjustOrganizeCounter(amount)
        DFHack.vmethod_call(self, 136, amount) ; nil
    end
    def getOrganizer(hist_figure_id, unit_id)
        DFHack.vmethod_call(self, 144, hist_figure_id, unit_id) ; nil
    end
    def getBuilding()
        ptr = DFHack.vmethod_call(self, 152)
        class << self
            number 32, true
        end._at(ptr) if ptr != 0
    end
    def isSparring()
        val = DFHack.vmethod_call(self, 160)
        (val & 1) != 0
    end
    def getUniformType()
        val = DFHack.vmethod_call(self, 168)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getName(unit_id, str)
        DFHack.vmethod_call(self, 176, unit_id, str) ; nil
    end
end

class ActivityEventCombatTrainingst < ActivityEvent
    sizeof 192

    rtti_classname :activity_event_combat_trainingst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:hist_figure_id, 180) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:unit_id, 184) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:organize_counter, 188) {
        number 32, true
    }
end

class ActivityEventConflictst < ActivityEvent
    sizeof 112

    rtti_classname :activity_event_conflictst

    field(:sides, 72) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventConflictst_TSides) {
                    sizeof 88

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:histfig_ids, 8) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def histfig_tgs ; histfig_ids.map { |i| df.world.history.figures.binsearch(i) } ; end
                    field(:unit_ids, 32) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def unit_tgs ; unit_ids.map { |i| df.world.units.all.binsearch(i) } ; end
                    field(:enemies, 56) {
                        stl_vector(8) {
                            pointer {
                                compound(:ActivityEventConflictst_TSides_TEnemies) {
                                    sizeof 8

                                    field(:id, 0) {
                                        number 32, true
                                    }
                                    field(:conflict_level, 4) {
                                        number 32, true, nil, ConflictLevel
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_1, 80) {
                        number 32, true
                    }
                    field(:unk_2, 84) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_1, 96) {
        number 32, true
    }
    field(:unk_2, 100) {
        number 32, true
    }
    field(:unk_3, 104) {
        number 32, true
    }
    field(:unk_v42_3, 108) {
        number 32, true
    }
end

class ActivityEventConversationst < ActivityEvent
    sizeof 856

    rtti_classname :activity_event_conversationst

    field(:participants, 72) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventConversationst_TParticipants) {
                    sizeof 8

                    field(:unit_id, 0) {
                        number 32, true, -1
                    }
                    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
                    field(:histfig_id, 4) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                }
            }
        }
    }
    field(:menu, 96) {
        number 32, true, nil, ConversationMenu
    }
    field(:unk1, 100) {
        global :EntityEvent
    }
    field(:unk_1, 140) {
        number 32, true
    }
    field(:unk_2, 144) {
        number 32, true
    }
    field(:unk_3, 148) {
        number 32, true
    }
    field(:unk_4, 152) {
        number 32, true
    }
    field(:unk_v42_3, 156) {
        number 32, true
    }
    field(:unk_v42_4, 160) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_5, 184) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_6, 208) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventConversationst_TUnk6) {
                    sizeof 32

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 16, true
                    }
                    field(:unk_3, 6) {
                        number 16, true
                    }
                    field(:unk_4, 8) {
                        number 16, true
                    }
                    field(:unk_5, 12) {
                        number 32, true
                    }
                    field(:unk_6, 16) {
                        number 32, true
                    }
                    field(:unk_7, 20) {
                        number 32, true
                    }
                    field(:unk_8, 24) {
                        number 32, true
                    }
                    field(:unk_9, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_7, 232) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_8, 256) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_b4, 280) {
        compound(:ActivityEventConversationst_TUnkB4) {
            field(:unk_1, 0) {
                number 32, true
            }
            field(:unk_2, 4) {
                number 32, true
            }
            field(:unk_3, 8) {
                number 32, true
            }
            field(:unk_4, 16) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_5, 40) {
                number 32, true
            }
        }
    }
    field(:turns, 328) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventConversationst_TTurns) {
                    sizeof 88

                    field(:speaker, 0) {
                        number 32, true, -1
                    }
                    def speaker_tg ; df.world.units.all.binsearch(speaker) ; end
                    field(:speaker_hfid, 4) {
                        number 32, true, -1
                    }
                    def speaker_hfid_tg ; df.world.history.figures.binsearch(speaker_hfid) ; end
                    field(:type, 8) {
                        number 32, true, nil, TalkChoiceType
                    }
                    field(:unk_1, 12) {
                        static_array(4, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_2, 28) {
                        static_array(14, 2) {
                            number 16, false
                        }
                    }
                    field(:foreground, 56) {
                        number 16, true
                    }
                    field(:background, 58) {
                        number 16, true
                    }
                    field(:bright, 60) {
                        number 16, true
                    }
                    field(:year, 64) {
                        number 32, true
                    }
                    field(:ticks, 68) {
                        number 32, true
                    }
                    field(:unk_3, 72) {
                        number 32, true
                    }
                    field(:unk_4, 76) {
                        number 32, true
                    }
                    field(:unk_5, 80) {
                        number 32, true
                    }
                    field(:unk_34014_1, 84) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:floor_holder, 352) {
        number 32, true, -1
    }
    def floor_holder_tg ; df.world.units.all.binsearch(floor_holder) ; end
    field(:floor_holder_hfid, 356) {
        number 32, true, -1
    }
    def floor_holder_hfid_tg ; df.world.history.figures.binsearch(floor_holder_hfid) ; end
    field(:pause, 360) {
        number 32, true
    }
    field(:flags2, 364) {
        compound(:ActivityEventConversationst_TFlags2) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:shouting, 0) { bit 1 }
        }
    }
    field(:unk2, 368) {
        compound(:ActivityEventConversationst_TUnk2) {
            field(:unk_1, 0) {
                stl_vector(8) {
                    pointer {
                        global :Incident
                    }
                }
            }
            field(:unk_2, 24) {
                number 32, true
            }
            field(:unk_3, 28) {
                number 32, true
            }
            field(:unk_4, 32) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_5, 56) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_6, 80) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_7, 104) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_8, 128) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_9, 152) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_10, 176) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_11, 200) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_12, 224) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_13, 248) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_14, 272) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_15, 296) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_16, 320) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_17, 344) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_18, 368) {
                number 32, true
            }
            field(:unk_19, 372) {
                number 32, true
            }
            field(:unk_20, 376) {
                number 32, true
            }
            field(:unk_21, 380) {
                number 32, true
            }
            field(:unk_22, 384) {
                number 32, true
            }
            field(:unk_23, 388) {
                number 32, true
            }
            field(:unk_24, 392) {
                number 32, true
            }
            field(:unk_25, 396) {
                number 32, true
            }
            field(:unk_26, 400) {
                number 32, true
            }
            field(:unk_27, 404) {
                number 32, true
            }
            field(:unk_28, 408) {
                number 32, true
            }
            field(:unk_29, 412) {
                number 32, true
            }
        }
    }
    field(:choices, 784) {
        stl_vector(8) {
            pointer {
                global :TalkChoice
            }
        }
    }
    field(:unk3, 808) {
        number 32, true, :None, ConversationMenu
    }
    field(:unk4, 812) {
        static_array(11, 4) {
            number 32, true
        }
    }
end

class ActivityEventCopyWrittenContentst < ActivityEvent
    sizeof 112

    rtti_classname :activity_event_copy_written_contentst

    field(:unit_id, 72) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:histfig_id, 76) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:occupation_id, 80) {
        number 32, true
    }
    field(:building_id, 84) {
        number 32, true
    }
    field(:site_id, 88) {
        number 32, true
    }
    field(:location_id, 92) {
        number 32, true
    }
    field(:flagsmaybe, 96) {
        compound(:ActivityEventCopyWrittenContentst_TFlagsmaybe) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:unk0, 0) { bit 0 }
        }
    }
    field(:unk_1, 100) {
        number 32, true
    }
    field(:timer, 104) {
        number 32, true
    }
end

class ActivityEventDiscussTopicst < ActivityEvent
    sizeof 216

    rtti_classname :activity_event_discuss_topicst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:site_id, 176) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 180) {
        number 32, true, -1
    }
    field(:building_id, 184) {
        number 32, true
    }
    field(:unk_1, 188) {
        number 32, true
    }
    field(:knowledge, 192) {
        global :KnowledgeScholarCategoryFlag
    }
    field(:timer, 200) {
        number 32, true
    }
    field(:unk_2, 204) {
        number 32, true
    }
    field(:unk_3, 208) {
        number 32, true, -1
    }
    def unk_3_tg ; df.world.history.figures.binsearch(unk_3) ; end
end

class ActivityEventEncounterst < ActivityEvent
    sizeof 192

    rtti_classname :activity_event_encounterst

    field(:unk_1, 72) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventEncounterst_TUnk1) {
                    sizeof 40

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        number 32, true
                    }
                    field(:unk_8, 28) {
                        number 32, true
                    }
                    field(:unk_9, 32) {
                        number 32, true
                    }
                    field(:unk_10, 36) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_2, 96) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventEncounterst_TUnk2) {
                    sizeof 32

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        number 32, true
                    }
                    field(:unk_8, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_3, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_4, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_5, 168) {
        number 32, true
    }
    field(:unk_6, 172) {
        number 32, true
    }
    field(:unk_7, 176) {
        number 32, true
    }
    field(:unk_8, 180) {
        number 32, true
    }
    field(:unk_9, 184) {
        number 32, true
    }
end

class ActivityEventFillServiceOrderst < ActivityEvent
    sizeof 88

    rtti_classname :activity_event_fill_service_orderst

    field(:histfig_id, 72) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:unit_id, 76) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:occupation_id, 80) {
        number 32, true, -1
    }
    def occupation_tg ; df.world.occupations.all.binsearch(occupation_id) ; end
    field(:unk_1, 84) {
        number 32, true
    }
end

class ActivityEventGuardst < ActivityEvent
    sizeof 112

    rtti_classname :activity_event_guardst

    field(:unk_1, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 96) {
        global :Coord
    }
    field(:unk_3, 104) {
        number 32, true
    }
end

class ActivityEventHarassmentst < ActivityEvent
    sizeof 144

    rtti_classname :activity_event_harassmentst

    field(:unk_1, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 96) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventHarassmentst_TUnk2) {
                    sizeof 80

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        static_array(3, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_3, 16) {
                        number 32, true
                    }
                    field(:unk_4, 20) {
                        number 32, true
                    }
                    field(:unk_5, 24) {
                        number 32, true
                    }
                    field(:unk_6, 28) {
                        number 32, true
                    }
                    field(:unk_7, 32) {
                        number 32, true
                    }
                    field(:unk_8, 36) {
                        number 32, true
                    }
                    field(:unk_9, 40) {
                        number 32, true
                    }
                    field(:unk_10, 44) {
                        number 32, true
                    }
                    field(:unk_11, 48) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_12, 72) {
                        number 32, true
                    }
                    field(:unk_13, 76) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_3, 120) {
        number 32, true
    }
    field(:unk_4, 124) {
        number 32, true
    }
    field(:unk_5, 128) {
        number 32, true
    }
    field(:unk_6, 132) {
        number 32, true
    }
    field(:unk_7, 136) {
        number 32, true
    }
    field(:unk_8, 140) {
        number 32, true
    }
end

class ActivityEventIndividualSkillDrillst < ActivityEvent
    sizeof 184

    rtti_classname :activity_event_individual_skill_drillst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:countdown, 180) {
        number 32, true, 3000
    }
end

class ActivityEventMakeBelievest < ActivityEvent
    sizeof 248

    rtti_classname :activity_event_make_believest

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:unk_1, 176) {
        number 32, true
    }
    field(:unk_2, 180) {
        number 32, true
    }
    field(:unk_3, 184) {
        number 32, true
    }
    field(:unk_4, 188) {
        static_array(49, 1) {
            number 8, true
        }
    }
    field(:unk_5, 238) {
        global :Coord
    }
end

class ActivityEventParticipants < MemHack::Compound
    sizeof 104

    field(:histfigs, 0) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfigs_tg ; histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:units, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def units_tg ; units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:free_histfigs, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def free_histfigs_tg ; free_histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:free_units, 72) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def free_units_tg ; free_units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:activity_id, 96) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:event_id, 100) {
        number 32, true
    }
end

class ActivityEventPerformancest < ActivityEvent
    sizeof 376

    rtti_classname :activity_event_performancest

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:type, 176) {
        number 32, true, nil, PerformanceEventType
    }
    field(:event, 180) {
        number 32, true, -1
    }
    def event_tg ; df.world.history.events.binsearch(event) ; end
    field(:written_content_id, 184) {
        number 32, true, -1
    }
    def written_content_tg ; df.world.written_contents.all.binsearch(written_content_id) ; end
    field(:poetic_form, 188) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form) ; end
    field(:music_form, 192) {
        number 32, true, -1
    }
    def music_form_tg ; df.world.musical_forms.all.binsearch(music_form) ; end
    field(:dance_form, 196) {
        number 32, true, -1
    }
    def dance_form_tg ; df.world.dance_forms.all.binsearch(dance_form) ; end
    field(:unk_1, 200) {
        number 32, true
    }
    field(:unk_2, 204) {
        number 32, true
    }
    field(:unk_3, 208) {
        number 32, true
    }
    field(:unk_4, 212) {
        number 32, true
    }
    field(:unk_5, 216) {
        number 32, true
    }
    field(:unk_6, 220) {
        number 32, true
    }
    field(:participant_actions, 224) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventPerformancest_TParticipantActions) {
                    sizeof 48

                    field(:type, 0) {
                        number 32, true, nil, PerformanceParticipantType
                    }
                    field(:sub_type, 4) {
                        number 32, true
                    }
                    field(:unit_id, 8) {
                        number 32, true, -1
                    }
                    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
                    field(:histfig_id, 12) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:unk_act_1, 16) {
                        number 32, true
                    }
                    field(:unk_act_2, 20) {
                        number 32, true
                    }
                    field(:unk_act_3, 24) {
                        global :Coord
                    }
                    field(:unk_act_6, 32) {
                        number 32, true
                    }
                    field(:unk_act_7, 36) {
                        number 32, true
                    }
                    field(:unk_act_8, 40) {
                        number 32, true
                    }
                    field(:unk_act_9, 44) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:pos_performer_2d, 248) {
        global :Coord2d
    }
    field(:pos_performer, 252) {
        global :Coord
    }
    field(:unk_pos_1_x0, 258) {
        number 16, true
    }
    field(:unk_pos_1_y0, 260) {
        number 16, true
    }
    field(:unk_pos_1_x1, 262) {
        number 16, true
    }
    field(:unk_pos_1_y1, 264) {
        number 16, true
    }
    field(:unk_pos_1_z, 266) {
        number 16, true
    }
    field(:unk_pos_2_x0, 268) {
        number 16, true
    }
    field(:unk_pos_2_y0, 270) {
        number 16, true
    }
    field(:unk_pos_2_x1, 272) {
        number 16, true
    }
    field(:unk_pos_2_y1, 274) {
        number 16, true
    }
    field(:unk_pos_2_z, 276) {
        number 16, true
    }
    field(:play_orders, 280) {
        stl_vector(8) {
            pointer {
                global :PerformancePlayOrderst
            }
        }
    }
    field(:unk_11, 304) {
        number 32, true
    }
    field(:unk_12, 308) {
        static_array(49, 1) {
            number 8, true
        }
    }
    field(:unk_13, 358) {
        global :Coord
    }
    field(:unk_16, 364) {
        number 32, true
    }
    field(:unk_17, 368) {
        number 32, true
    }
    field(:unk_18, 372) {
        number 32, true
    }
end

class ActivityEventPlayWithToyst < ActivityEvent
    sizeof 256

    rtti_classname :activity_event_play_with_toyst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:unk_1, 176) {
        number 32, true
    }
    field(:unk_2, 180) {
        number 32, true
    }
    field(:unk_3, 184) {
        number 32, true
    }
    field(:unk, 188) {
        compound(:ActivityEventPlayWithToyst_TUnk) {
            field(:unk_1, 0) {
                static_array(49, 1) {
                    number 8, true
                }
            }
            field(:unk_2, 50) {
                global :Coord
            }
        }
    }
    field(:unk_4, 244) {
        number 32, true
    }
    field(:unk_5, 248) {
        number 32, true
    }
    field(:unk_6, 252) {
        number 32, true
    }
end

class ActivityEventPlayst < ActivityEvent
    sizeof 240

    rtti_classname :activity_event_playst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:unk_1, 176) {
        number 32, true
    }
    field(:unk_2, 180) {
        static_array(49, 1) {
            number 8, true
        }
    }
    field(:unk_3, 230) {
        global :Coord
    }
end

class ActivityEventPonderTopicst < ActivityEvent
    sizeof 208

    rtti_classname :activity_event_ponder_topicst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:site_id, 176) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 180) {
        number 32, true, -1
    }
    field(:building_id, 184) {
        number 32, true
    }
    field(:unk_1, 188) {
        number 32, true
    }
    field(:knowledge, 192) {
        global :KnowledgeScholarCategoryFlag
    }
    field(:timer, 200) {
        number 32, true
    }
end

class ActivityEventPrayerst < ActivityEvent
    sizeof 200

    rtti_classname :activity_event_prayerst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:histfig_id, 176) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:topic, 180) {
        number 16, true, nil, SphereType
    }
    field(:site_id, 184) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 188) {
        number 32, true, -1
    }
    field(:building_id, 192) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:timer, 196) {
        number 32, true
    }
end

class ActivityEventRangedPracticest < ActivityEvent
    sizeof 184

    rtti_classname :activity_event_ranged_practicest

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:uniform_lock, 180) {
        number 32, true
    }
end

class ActivityEventReadst < ActivityEvent
    sizeof 200

    rtti_classname :activity_event_readst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true
    }
    field(:site_id, 180) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 184) {
        number 32, true, -1
    }
    field(:state, 188) {
        number 32, true
    }
    field(:timer, 192) {
        number 32, true
    }
end

class ActivityEventResearchst < ActivityEvent
    sizeof 192

    rtti_classname :activity_event_researchst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:site_id, 176) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 180) {
        number 32, true, -1
    }
    field(:building_id, 184) {
        number 32, true
    }
end

class ActivityEventReunionst < ActivityEvent
    sizeof 144

    rtti_classname :activity_event_reunionst

    field(:unk_1, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 96) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 120) {
        number 32, true
    }
    field(:unk_4, 124) {
        number 32, true
    }
    field(:unk_5, 128) {
        number 32, true
    }
    field(:unk_6, 132) {
        number 32, true
    }
    field(:unk_7, 136) {
        number 32, true
    }
end

class ActivityEventSkillDemonstrationst < ActivityEvent
    sizeof 208

    rtti_classname :activity_event_skill_demonstrationst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:hist_figure_id, 180) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:unit_id, 184) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:skill, 188) {
        number 16, true, nil, JobSkill
    }
    field(:organize_counter, 192) {
        number 32, true
    }
    field(:wait_countdown, 196) {
        number 32, true, 100
    }
    field(:train_rounds, 200) {
        number 32, true, 15
    }
    field(:train_countdown, 204) {
        number 32, true, 20
    }
end

class ActivityEventSocializest < ActivityEvent
    sizeof 192

    rtti_classname :activity_event_socializest

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:site_id, 176) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 180) {
        number 32, true, -1
    }
    field(:building_id, 184) {
        number 32, true
    }
    field(:unk_1, 188) {
        number 32, true
    }
end

class ActivityEventSparringst < ActivityEvent
    sizeof 216

    rtti_classname :activity_event_sparringst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:groups, 184) {
        stl_vector(8) {
            pointer {
                compound(:ActivityEventSparringst_TGroups) {
                    sizeof 32

                    field(:units, 0) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def units_tg ; units.map { |i| df.world.units.all.binsearch(i) } ; end
                    field(:countdown, 24) {
                        number 32, true, 3000
                    }
                    field(:building_id, 28) {
                        number 32, true, -1
                    }
                    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
                }
            }
        }
    }
    field(:countdown, 208) {
        number 32, true, 3000
    }
end

class ActivityEventStoreObjectst < ActivityEvent
    sizeof 96

    rtti_classname :activity_event_store_objectst

    field(:unk_1, 72) {
        number 32, true
    }
    field(:unk_2, 76) {
        global :Coord
    }
    field(:building_id, 84) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:unk_3, 88) {
        number 32, true
    }
    field(:unk_4, 92) {
        number 32, true
    }
end

class ActivityEventTeachTopicst < ActivityEvent
    sizeof 216

    rtti_classname :activity_event_teach_topicst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:unk_1, 176) {
        number 32, true
    }
    field(:unk_2, 180) {
        number 32, true
    }
    field(:unk_3, 184) {
        number 32, true
    }
    field(:unk_4, 188) {
        number 32, true
    }
    field(:unk_5, 192) {
        number 32, true
    }
    field(:unk_6, 196) {
        number 32, true
    }
    field(:unk_7, 200) {
        number 32, true
    }
    field(:unk_8, 204) {
        number 32, true
    }
    field(:unk_9, 208) {
        number 32, true
    }
end

class ActivityEventTrainingSessionst < ActivityEvent
    sizeof 176

    rtti_classname :activity_event_training_sessionst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
end

class ActivityEventWorshipst < ActivityEvent
    sizeof 192

    rtti_classname :activity_event_worshipst

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:site_id, 176) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 180) {
        number 32, true, -1
    }
    field(:building_id, 184) {
        number 32, true
    }
    field(:unk_1, 188) {
        number 32, true
    }
end

class ActivityEventWritest < ActivityEvent
    sizeof 216

    rtti_classname :activity_event_writest

    field(:participants, 72) {
        global :ActivityEventParticipants
    }
    field(:building_id, 176) {
        number 32, true
    }
    field(:site_id, 180) {
        number 32, true
    }
    field(:location_id, 184) {
        number 32, true
    }
    field(:unk_1, 188) {
        compound(:ActivityEventWritest_TUnk1) {
            field(:_whole, 0) {
                number 32, true
            }
        }
    }
    field(:timer, 192) {
        number 32, true
    }
    field(:unk_2, 196) {
        number 32, true
    }
    field(:unk_3, 200) {
        number 32, true
    }
    field(:mode, 204) {
        class ::DFHack::ActivityEventWritest_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :WriteAboutKnowledge ; NUME[:WriteAboutKnowledge] = 0
        end

        number 32, true, nil, ActivityEventWritest_TMode
    }
    field(:knowledge, 208) {
        global :KnowledgeScholarCategoryFlag
    }
end

class ActivityInfo < MemHack::Compound
    sizeof 48

    field(:id, 0) {
        number 32, true
    }
    field(:unit_actor, 8) {
        pointer {
            global :Unit
        }
    }
    field(:unit_noble, 16) {
        pointer {
            global :Unit
        }
    }
    field(:place, 24) {
        pointer {
            global :Building
        }
    }
    field(:flags, 32) {
        compound(:ActivityInfo_TFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:next_step, 0) { bit 0 }
            field(:checked_building, 0) { bit 1 }
            field(:add_delay, 0) { bit 2 }
            field(:topic_discussed, 0) { bit 3 }
            field(:meeting_done, 0) { bit 4 }
        }
    }
    field(:unk3, 34) {
        number 8, true
    }
    field(:delay, 36) {
        number 16, true
    }
    field(:tree_quota, 40) {
        number 32, true
    }
end

class AdventureOptionst < MemHack::Compound
    sizeof 8

    rtti_classname :adventure_optionst

    def getDescription(arg0)
        DFHack.vmethod_call(self, 0, arg0) ; nil
    end
    def getIngestedItem()
        ptr = DFHack.vmethod_call(self, 16)
        class << self
            global :Item
        end._at(ptr) if ptr != 0
    end
    def performAction(arg0, arg1, arg2)
        ptr = DFHack.vmethod_call(self, 24, arg0, arg1, arg2)
        class << self
            global :Item
        end._at(ptr) if ptr != 0
    end
    def getPlayerPosX()
        val = DFHack.vmethod_call(self, 32)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getPlayerPosY()
        val = DFHack.vmethod_call(self, 40)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getPlayerPosZ()
        val = DFHack.vmethod_call(self, 48)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getTargetPosX()
        val = DFHack.vmethod_call(self, 56)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getTargetPosY()
        val = DFHack.vmethod_call(self, 64)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getTargetPosZ()
        val = DFHack.vmethod_call(self, 72)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def deleteSpatter()
        DFHack.vmethod_call(self, 80) ; nil
    end
    def getSuckBloodUnitID()
        val = DFHack.vmethod_call(self, 88)
    end
    def isIngestFromContainer()
        val = DFHack.vmethod_call(self, 96)
        (val & 1) != 0
    end
    def getBuildingContainer()
        ptr = DFHack.vmethod_call(self, 104)
        class << self
            global :Building
        end._at(ptr) if ptr != 0
    end
    def getItemContainer()
        ptr = DFHack.vmethod_call(self, 112)
        class << self
            global :Item
        end._at(ptr) if ptr != 0
    end
    def getUnitContainer()
        ptr = DFHack.vmethod_call(self, 120)
        class << self
            global :Unit
        end._at(ptr) if ptr != 0
    end
end

class AdventureEnvironmentOptionst < AdventureOptionst
    sizeof 24

    rtti_classname :adventure_environment_optionst

    field(:target_pos, 8) {
        global :Coord
    }
    field(:player_pos, 14) {
        global :Coord
    }
end

class AdventureEnvironmentIngestFromContainerst < AdventureEnvironmentOptionst
    sizeof 40

    rtti_classname :adventure_environment_ingest_from_containerst

    field(:container, 24) {
        pointer {
            global :Item
        }
    }
    field(:food, 32) {
        pointer {
            global :Item
        }
    }
end

class AdventureEnvironmentIngestMaterialst < AdventureEnvironmentOptionst
    sizeof 40

    rtti_classname :adventure_environment_ingest_materialst

    field(:mat_type, 24) {
        number 16, true
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:mat_state, 32) {
        number 16, true, nil, MatterState
    }
end

class AdventureEnvironmentPickupChopTreest < AdventureEnvironmentOptionst
    sizeof 24

    rtti_classname :adventure_environment_pickup_chop_treest

end

class AdventureEnvironmentPickupIgniteVegst < AdventureEnvironmentOptionst
    sizeof 32

    rtti_classname :adventure_environment_pickup_ignite_vegst

    field(:unk_1, 24) {
        number 32, true
    }
end

class AdventureEnvironmentPickupMakeCampfirest < AdventureEnvironmentOptionst
    sizeof 24

    rtti_classname :adventure_environment_pickup_make_campfirest

end

class AdventureEnvironmentPickupVerminEventst < AdventureEnvironmentOptionst
    sizeof 32

    rtti_classname :adventure_environment_pickup_vermin_eventst

    field(:vermin_idx, 24) {
        number 32, true
    }
end

class AdventureEnvironmentPlaceInBldContainerst < AdventureEnvironmentOptionst
    sizeof 32

    rtti_classname :adventure_environment_place_in_bld_containerst

    field(:building, 24) {
        pointer {
            global :Building
        }
    }
end

class AdventureEnvironmentPlaceInItContainerst < AdventureEnvironmentOptionst
    sizeof 32

    rtti_classname :adventure_environment_place_in_it_containerst

    field(:container, 24) {
        pointer {
            global :Item
        }
    }
end

class AdventureEnvironmentUnitSuckBloodst < AdventureEnvironmentOptionst
    sizeof 32

    rtti_classname :adventure_environment_unit_suck_bloodst

    field(:unit_id, 24) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
end

class AdventureItemInteractChoicest < MemHack::Compound
    sizeof 8

    rtti_classname :adventure_item_interact_choicest

    def getDescription(arg0)
        DFHack.vmethod_call(self, 0, arg0) ; nil
    end
    def performAction()
        DFHack.vmethod_call(self, 8) ; nil
    end
end

class AdventureItemInteractFillFromContainerst < AdventureItemInteractChoicest
    sizeof 40

    rtti_classname :adventure_item_interact_fill_from_containerst

    field(:unk_1, 8) {
        pointer {
            global :Item
        }
    }
    field(:unk_2, 16) {
        pointer {
            global :Item
        }
    }
    field(:unk_3, 24) {
        global :Coord
    }
    field(:unk_4, 30) {
        global :Coord
    }
end

class AdventureItemInteractFillWithMaterialst < AdventureItemInteractChoicest
    sizeof 40

    rtti_classname :adventure_item_interact_fill_with_materialst

    field(:unk_1, 8) {
        pointer {
            global :Item
        }
    }
    field(:unk_2, 16) {
        global :Coord
    }
    field(:unk_3, 22) {
        global :Coord
    }
    field(:unk_4, 28) {
        number 16, true
    }
    field(:unk_5, 32) {
        number 32, true
    }
    field(:unk_6, 36) {
        number 16, true
    }
end

class AdventureItemInteractGiveNamest < AdventureItemInteractChoicest
    sizeof 16

    rtti_classname :adventure_item_interact_give_namest

    field(:item, 8) {
        pointer {
            global :Item
        }
    }
end

class AdventureItemInteractHeatFromTilest < AdventureItemInteractChoicest
    sizeof 32

    rtti_classname :adventure_item_interact_heat_from_tilest

    field(:item, 8) {
        pointer {
            global :Item
        }
    }
    field(:unk_1, 16) {
        global :Coord
    }
    field(:unk_2, 22) {
        global :Coord
    }
end

class AdventureItemInteractPullOutst < AdventureItemInteractChoicest
    sizeof 8

    rtti_classname :adventure_item_interact_pull_outst

end

class AdventureItemInteractReadst < AdventureItemInteractChoicest
    sizeof 8

    rtti_classname :adventure_item_interact_readst

end

class AdventureItemInteractStrugglest < AdventureItemInteractChoicest
    sizeof 8

    rtti_classname :adventure_item_interact_strugglest

end

class AdventureLogItem < MemHack::Compound
    sizeof 232

    field(:unk_1, 0) {
        number 32, true, -1
    }
    field(:unk_2, 8) {
        pointer {
        }
    }
    field(:incident, 16) {
        pointer {
            global :Incident
        }
    }
    field(:unk_3, 24) {
        pointer {
        }
    }
    field(:year, 32) {
        number 32, true
    }
    field(:time, 36) {
        number 32, true
    }
    field(:str1, 40) {
        stl_string
    }
    field(:str2, 72) {
        stl_string
    }
    field(:str3, 104) {
        stl_string
    }
    field(:info, 136) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_4, 160) {
        stl_string
    }
    field(:unk_5, 192) {
        pointer {
        }
    }
    field(:unk_6, 200) {
        pointer {
        }
    }
    field(:unk_7, 208) {
        pointer {
        }
    }
    field(:pos_x, 216) {
        number 32, true, -1
    }
    field(:pos_y, 220) {
        number 32, true, -1
    }
    field(:unk_8, 224) {
        number 32, true
    }
    field(:unk_9, 228) {
        number 16, true
    }
    field(:unk_10, 230) {
        number 8, true
    }
end

class AdventureMovementOptionst < MemHack::Compound
    sizeof 24

    rtti_classname :adventure_movement_optionst

    field(:dest, 8) {
        global :Coord
    }
    field(:source, 14) {
        global :Coord
    }
end

class AdventureMovementAttackCreaturest < AdventureMovementOptionst
    sizeof 48

    rtti_classname :adventure_movement_attack_creaturest

    field(:targets, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def targets_tg ; targets.map { |i| df.world.units.all.binsearch(i) } ; end
end

class AdventureMovementBuildingInteractst < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_building_interactst

    field(:building_id, 24) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
end

class AdventureMovementClimbst < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_climbst

    field(:grab, 24) {
        global :Coord
    }
end

class AdventureMovementHoldItemst < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_hold_itemst

    field(:item_id, 24) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class AdventureMovementHoldTilest < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_hold_tilest

    field(:grab, 24) {
        global :Coord
    }
end

class AdventureMovementItemInteractst < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_item_interactst

    field(:item_id, 24) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class AdventureMovementItemInteractGuidest < AdventureMovementItemInteractst
    sizeof 32

    rtti_classname :adventure_movement_item_interact_guidest

end

class AdventureMovementItemInteractPushst < AdventureMovementItemInteractst
    sizeof 32

    rtti_classname :adventure_movement_item_interact_pushst

end

class AdventureMovementItemInteractRidest < AdventureMovementItemInteractst
    sizeof 32

    rtti_classname :adventure_movement_item_interact_ridest

end

class AdventureMovementMovest < AdventureMovementOptionst
    sizeof 32

    rtti_classname :adventure_movement_movest

    field(:unit_path_flags, 24) {
        number 32, true
    }
    field(:unk_bitfield, 28) {
        number 32, true
    }
end

class AdventureMovementReleaseHoldItemst < AdventureMovementOptionst
    sizeof 24

    rtti_classname :adventure_movement_release_hold_itemst

end

class AdventureMovementReleaseHoldTilest < AdventureMovementOptionst
    sizeof 24

    rtti_classname :adventure_movement_release_hold_tilest

end

class AdventureOptionEatItemContaminantst < AdventureOptionst
    sizeof 32

    rtti_classname :adventure_option_eat_item_contaminantst

    field(:unit, 8) {
        pointer {
            global :Unit
        }
    }
    field(:inv_item, 16) {
        pointer {
            global :UnitInventoryItem
        }
    }
    field(:spatter, 24) {
        pointer {
            global :Spatter
        }
    }
end

class AdventureOptionEatUnitContaminantst < AdventureOptionst
    sizeof 24

    rtti_classname :adventure_option_eat_unit_contaminantst

    field(:unit, 8) {
        pointer {
            global :Unit
        }
    }
    field(:spatter, 16) {
        pointer {
            global :Spatter
        }
    }
end

class AdventureOptionViewContaminantst < AdventureOptionst
    sizeof 24

    rtti_classname :adventure_option_view_contaminantst

    field(:unit, 8) {
        pointer {
            global :Unit
        }
    }
    field(:spatter, 16) {
        pointer {
            global :Spatter
        }
    }
end

class Agreement < MemHack::Compound
    sizeof 80

    field(:id, 0) {
        number 32, true
    }
    field(:parties, 8) {
        stl_vector(8) {
            pointer {
                global :AgreementParty
            }
        }
    }
    field(:next_party_id, 32) {
        number 32, true
    }
    field(:details, 40) {
        stl_vector(8) {
            pointer {
                global :AgreementDetails
            }
        }
    }
    field(:next_details_id, 64) {
        number 32, true
    }
    field(:unk_1, 68) {
        number 32, true
    }
    field(:unk_2, 72) {
        number 32, true
    }
    field(:flags, 76) {
        compound(:Agreement_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:petition_not_accepted, 0) { bit 0 }
            field(:convicted_accepted, 0) { bit 1 }
        }
    }
end

class AgreementDetails < MemHack::Compound
    sizeof 32

    field(:id, 0) {
        number 32, true
    }
    field(:year, 4) {
        number 32, true
    }
    field(:year_tick, 8) {
        number 32, true
    }
    field(:data, 16) {
        compound(:AgreementDetails_TData) {
            field(:JoinParty, 0) {
                pointer {
                    global :AgreementDetailsDataJoinParty
                }
            }
            field(:DemonicBinding, 0) {
                pointer {
                    global :AgreementDetailsDataDemonicBinding
                }
            }
            field(:Residency, 0) {
                pointer {
                    global :AgreementDetailsDataResidency
                }
            }
            field(:Citizenship, 0) {
                pointer {
                    global :AgreementDetailsDataCitizenship
                }
            }
            field(:Parley, 0) {
                pointer {
                    global :AgreementDetailsDataParley
                }
            }
            field(:PositionCorruption, 0) {
                pointer {
                    global :AgreementDetailsDataPositionCorruption
                }
            }
            field(:PlotStealArtifact, 0) {
                pointer {
                    global :AgreementDetailsDataPlotStealArtifact
                }
            }
            field(:PromisePosition, 0) {
                pointer {
                    global :AgreementDetailsDataPromisePosition
                }
            }
            field(:PlotAssassination, 0) {
                pointer {
                    global :AgreementDetailsDataPlotAssassination
                }
            }
            field(:PlotAbduct, 0) {
                pointer {
                    global :AgreementDetailsDataPlotAbduct
                }
            }
            field(:PlotSabotage, 0) {
                pointer {
                    global :AgreementDetailsDataPlotSabotage
                }
            }
            field(:PlotConviction, 0) {
                pointer {
                    global :AgreementDetailsDataPlotConviction
                }
            }
            field(:Location, 0) {
                pointer {
                    global :AgreementDetailsDataLocation
                }
            }
            field(:PlotInfiltrationCoup, 0) {
                pointer {
                    global :AgreementDetailsDataPlotInfiltrationCoup
                }
            }
            field(:PlotFrameTreason, 0) {
                pointer {
                    global :AgreementDetailsDataPlotFrameTreason
                }
            }
            field(:PlotInduceWar, 0) {
                pointer {
                    global :AgreementDetailsDataPlotInduceWar
                }
            }
        }
    }
    field(:type, 24) {
        number 32, true, nil, AgreementDetailsType
    }
end

class AgreementDetailsDataCitizenship < MemHack::Compound
    sizeof 12

    field(:applicant, 0) {
        number 32, true, -1
    }
    field(:government, 4) {
        number 32, true, -1
    }
    field(:site, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class AgreementDetailsDataDemonicBinding < MemHack::Compound
    sizeof 24

    field(:reason, 0) {
        number 32, true, nil, HistoryEventReason
    }
    field(:demon, 4) {
        number 32, true, -1
    }
    field(:summoner, 8) {
        number 32, true, -1
    }
    field(:site, 12) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:artifact, 16) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:sphere, 20) {
        number 16, true, nil, SphereType
    }
end

class AgreementDetailsDataJoinParty < MemHack::Compound
    sizeof 24

    field(:reason, 0) {
        number 32, true, nil, HistoryEventReason
    }
    field(:member, 4) {
        number 32, true, -1
    }
    field(:party, 8) {
        number 32, true, -1
    }
    field(:site, 12) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:entity, 16) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:figure, 20) {
        number 32, true, -1
    }
    def figure_tg ; df.world.history.figures.binsearch(figure) ; end
end

class AgreementDetailsDataLocation < MemHack::Compound
    sizeof 32

    field(:applicant, 0) {
        number 32, true, -1
    }
    field(:government, 4) {
        number 32, true, -1
    }
    field(:site, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:type, 12) {
        number 32, true, nil, AbstractBuildingType
    }
    field(:deity_type, 16) {
        number 32, true, nil, TempleDeityType
    }
    field(:deity_data, 20) {
        global :TempleDeityData
    }
    field(:profession, 24) {
        number 16, true, nil, Profession
    }
    field(:tier, 28) {
        number 32, true
    }
end

class AgreementDetailsDataParley < MemHack::Compound
    sizeof 8

    field(:unk_1, 0) {
        number 32, true
    }
    field(:party_id, 4) {
        number 32, true, -1
    }
end

class AgreementDetailsDataPlotAbduct < MemHack::Compound
    sizeof 12

    field(:actor_index, 0) {
        number 32, true
    }
    field(:intermediary_index, 4) {
        number 32, true, -1
    }
    field(:target_id, 8) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target_id) ; end
end

class AgreementDetailsDataPlotAssassination < MemHack::Compound
    sizeof 16

    field(:actor_index, 0) {
        number 32, true
    }
    field(:influencer_index, 4) {
        number 32, true
    }
    field(:intermediary_index, 8) {
        number 32, true, -1
    }
    field(:target_id, 12) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target_id) ; end
end

class AgreementDetailsDataPlotConviction < MemHack::Compound
    sizeof 32

    field(:criminal_indices, 0) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:crime, 24) {
        number 32, true, nil, CrimeType
    }
end

class AgreementDetailsDataPlotFrameTreason < MemHack::Compound
    sizeof 20

    field(:actor_index, 0) {
        number 32, true
    }
    field(:influencer_index, 4) {
        number 32, true
    }
    field(:victim_id, 8) {
        number 32, true, -1
    }
    def victim_tg ; df.world.history.figures.binsearch(victim_id) ; end
    field(:fool_id, 12) {
        number 32, true, -1
    }
    def fool_tg ; df.world.history.figures.binsearch(fool_id) ; end
    field(:unk_1, 16) {
        number 32, true, -1
    }
    def unk_1_tg ; df.world.history.figures.binsearch(unk_1) ; end
end

class AgreementDetailsDataPlotInduceWar < MemHack::Compound
    sizeof 16

    field(:actor_index, 0) {
        number 32, true
    }
    field(:influencer_index, 4) {
        number 32, true
    }
    field(:attacker, 8) {
        number 32, true, -1
    }
    def attacker_tg ; df.world.entities.all.binsearch(attacker) ; end
    field(:defender, 12) {
        number 32, true, -1
    }
    def defender_tg ; df.world.entities.all.binsearch(defender) ; end
end

class AgreementDetailsDataPlotInfiltrationCoup < MemHack::Compound
    sizeof 16

    field(:actor_index, 0) {
        number 32, true
    }
    field(:influencer_index, 4) {
        number 32, true
    }
    field(:target, 8) {
        number 32, true
    }
    field(:action, 12) {
        number 32, true
    }
end

class AgreementDetailsDataPlotSabotage < MemHack::Compound
    sizeof 24

    field(:plotter_index, 0) {
        number 32, true
    }
    field(:actor_index, 4) {
        number 32, true
    }
    field(:intermediary_index, 8) {
        number 32, true, -1
    }
    field(:victim_id, 12) {
        number 32, true, -1
    }
    def victim_tg ; df.world.history.figures.binsearch(victim_id) ; end
    field(:unk_1, 16) {
        number 32, true, -1
    }
    field(:unk_2, 20) {
        number 32, true, -1
    }
end

class AgreementDetailsDataPlotStealArtifact < MemHack::Compound
    sizeof 16

    field(:actor_index, 0) {
        number 32, true
    }
    field(:influencer_index, 4) {
        number 32, true
    }
    field(:intermediary_index, 8) {
        number 32, true, -1
    }
    field(:artifact_id, 12) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
end

class AgreementDetailsDataPositionCorruption < MemHack::Compound
    sizeof 24

    field(:unk_1, 0) {
        number 32, true
    }
    field(:actor_index, 4) {
        number 32, true
    }
    field(:influencer_index, 8) {
        number 32, true, -1
    }
    field(:intermediary_index, 12) {
        number 32, true, -1
    }
    field(:target_id, 16) {
        number 32, true, -1
    }
    def target_tg ; df.world.entities.all.binsearch(target_id) ; end
    field(:position_id, 20) {
        number 32, true
    }
end

class AgreementDetailsDataPromisePosition < MemHack::Compound
    sizeof 48

    field(:beneficiary_index, 0) {
        number 32, true
    }
    field(:actor_index, 4) {
        number 32, true
    }
    field(:promisee_index, 8) {
        number 32, true
    }
    field(:influencer_index, 12) {
        number 32, true
    }
    field(:intermediary_indices, 16) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:entity_id, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
end

class AgreementDetailsDataResidency < MemHack::Compound
    sizeof 16

    field(:reason, 0) {
        number 32, true, nil, HistoryEventReason
    }
    field(:applicant, 4) {
        number 32, true, -1
    }
    field(:government, 8) {
        number 32, true, -1
    }
    field(:site, 12) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class AgreementParty < MemHack::Compound
    sizeof 80

    field(:id, 0) {
        number 32, true
    }
    field(:histfig_ids, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfig_tgs ; histfig_ids.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:entity_ids, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def entity_tgs ; entity_ids.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:unk_1, 56) {
        stl_vector(8) {
            pointer {
                compound(:AgreementParty_TUnk1) {
                    sizeof 16

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:year, 8) {
                        number 32, true
                    }
                    field(:tick, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class AnnouncementFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:DO_MEGA, 0) { bit 0 }
    field(:PAUSE, 0) { bit 1 }
    field(:RECENTER, 0) { bit 2 }
    field(:A_DISPLAY, 0) { bit 3 }
    field(:D_DISPLAY, 0) { bit 4 }
    field(:UNIT_COMBAT_REPORT, 0) { bit 5 }
    field(:UNIT_COMBAT_REPORT_ALL_ACTIVE, 0) { bit 6 }
end

class Announcements < MemHack::Compound
    sizeof 1368

    field(:flags, 0) {
        static_array(339, 4, AnnouncementType) {
            global :AnnouncementFlags
        }
    }
    field(:unused, 1360) {
        pointer {
        }
    }
end

class ArmorProperties < MemHack::Compound
    sizeof 32

    field(:flags, 0) {
        df_flagarray(ArmorGeneralFlags)
    }
    field(:layer, 16) {
        number 32, true
    }
    field(:layer_size, 20) {
        number 16, true
    }
    field(:layer_permit, 22) {
        number 16, true
    }
    field(:coverage, 24) {
        number 16, true
    }
end

class Army < MemHack::Compound
    sizeof 328

    field(:id, 0) {
        number 32, true
    }
    field(:pos, 4) {
        global :Coord
    }
    field(:last_pos, 10) {
        global :Coord
    }
    field(:unk_10, 16) {
        number 16, true
    }
    field(:unk_14, 20) {
        number 32, true
    }
    field(:unk_18, 24) {
        number 32, true
    }
    field(:members, 32) {
        stl_vector(8) {
            pointer {
                compound(:Army_TMembers) {
                    sizeof 104

                    field(:nemesis_id, 0) {
                        number 32, true, -1
                    }
                    field(:hunger_timer, 4) {
                        number 32, true
                    }
                    field(:thirst_timer, 8) {
                        number 32, true
                    }
                    field(:sleepiness_timer, 12) {
                        number 32, true
                    }
                    field(:stored_fat, 16) {
                        number 32, true
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                    field(:unk_18, 24) {
                        number 32, true
                    }
                    field(:unk_1c, 28) {
                        number 32, true, -1000000
                    }
                    field(:unk_20, 32) {
                        number 32, true, -1000000
                    }
                    field(:unk_24, 36) {
                        number 32, true, -1000000
                    }
                    field(:unk_28, 40) {
                        number 32, true
                    }
                    field(:unk_1, 44) {
                        number 32, true
                    }
                    field(:unk_2c, 48) {
                        number 32, true, 100
                    }
                    field(:unk_30, 52) {
                        number 32, true
                    }
                    field(:unk_34, 56) {
                        number 32, true
                    }
                    field(:unk_38, 64) {
                        stl_vector(8) {
                            pointer {
                                stl_string
                            }
                        }
                    }
                    field(:unk_v42_1, 88) {
                        number 32, true
                    }
                    field(:unk_2, 92) {
                        number 32, true, -1
                    }
                    field(:unk_3, 96) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:squads, 56) {
        stl_vector(8) {
            pointer {
                global :WorldSiteInhabitant
            }
        }
    }
    field(:unk_3c, 80) {
        number 32, true
    }
    field(:unk_1, 84) {
        number 32, true
    }
    field(:unk_2, 88) {
        number 32, true
    }
    field(:controller_id, 92) {
        number 32, true, -1
    }
    def controller_tg ; df.world.army_controllers.all.binsearch(controller_id) ; end
    field(:controller, 96) {
        pointer {
            global :ArmyController
        }
    }
    field(:flags, 104) {
        df_flagarray(ArmyFlags)
    }
    field(:block_path_x, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:block_path_y, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:path_x, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:path_y, 192) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_90, 216) {
        number 32, true, -1
    }
    field(:unk_94, 220) {
        number 32, true, -1
    }
    field(:unk_98, 224) {
        number 32, true, -1
    }
    field(:min_smell_trigger, 228) {
        number 32, true
    }
    field(:max_odor_level, 232) {
        number 32, true
    }
    field(:max_low_light_vision, 236) {
        number 32, true
    }
    field(:sense_creature_classes, 240) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:creature_class, 264) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:item_type, 288) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 290) {
        number 16, true, -1
    }
    field(:mat_type, 292) {
        number 16, true, -1
    }
    field(:mat_index, 296) {
        number 32, true
    }
    field(:unk_4407_1, 304) {
        stl_vector
    }
end

class ArmyController < MemHack::Compound
    sizeof 200

    field(:id, 0) {
        number 32, true
    }
    field(:entity_id, 4) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:site_id, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:unk_1, 12) {
        number 32, true, -1
    }
    field(:pos_x, 16) {
        number 32, true
    }
    field(:pos_y, 20) {
        number 32, true
    }
    field(:unk_18, 24) {
        number 32, true
    }
    field(:unk_1c, 28) {
        number 32, true
    }
    field(:unk_20, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:year, 56) {
        number 32, true
    }
    field(:year_tick, 60) {
        number 32, true
    }
    field(:unk_34, 64) {
        number 32, true, -1
    }
    def unk_34_tg ; df.world.army_controllers.all.binsearch(unk_34) ; end
    field(:unk_38, 68) {
        number 32, true, -1
    }
    def unk_38_tg ; df.world.army_controllers.all.binsearch(unk_38) ; end
    field(:master_hf, 72) {
        number 32, true, -1
    }
    def master_hf_tg ; df.world.history.figures.binsearch(master_hf) ; end
    field(:general_hf, 76) {
        number 32, true, -1
    }
    def general_hf_tg ; df.world.history.figures.binsearch(general_hf) ; end
    field(:unk_44_1, 80) {
        number 32, true
    }
    field(:unk_44_2, 84) {
        number 32, true
    }
    field(:visitor_nemesis_id, 88) {
        number 32, true, -1
    }
    def visitor_nemesis_tg ; df.world.nemesis.all.binsearch(visitor_nemesis_id) ; end
    field(:unk_44_4, 92) {
        number 32, true
    }
    field(:unk_44_5, 96) {
        pointer {
        }
    }
    field(:unk_v47_1, 104) {
        pointer {
        }
    }
    field(:unk_v47_2, 112) {
        pointer {
        }
    }
    field(:unk_50, 120) {
        number 32, true
    }
    field(:unk_54, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_44_11v, 152) {
        stl_vector
    }
    field(:mission_report, 176) {
        pointer {
            global :MissionReport
        }
    }
    field(:data, 184) {
        compound(:ArmyController_TData) {
            field(:t1, 0) {
                pointer {
                    global :ArmyControllerSub1
                }
            }
            field(:InvasionOrder, 0) {
                pointer {
                    global :ArmyControllerInvasionOrder
                }
            }
            field(:Invasion, 0) {
                pointer {
                    global :ArmyControllerInvasion
                }
            }
            field(:t5, 0) {
                pointer {
                    global :ArmyControllerSub5
                }
            }
            field(:t6, 0) {
                pointer {
                    global :ArmyControllerSub6
                }
            }
            field(:t7, 0) {
                pointer {
                    global :ArmyControllerSub7
                }
            }
            field(:t11, 0) {
                pointer {
                    global :ArmyControllerSub11
                }
            }
            field(:Visit, 0) {
                pointer {
                    global :ArmyControllerVisit
                }
            }
            field(:t13, 0) {
                pointer {
                    global :ArmyControllerSub13
                }
            }
            field(:t14, 0) {
                pointer {
                    global :ArmyControllerSub14
                }
            }
            field(:t15, 0) {
                pointer {
                    global :ArmyControllerSub15
                }
            }
            field(:t16, 0) {
                pointer {
                    global :ArmyControllerSub16
                }
            }
            field(:Quest, 0) {
                pointer {
                    global :ArmyControllerQuest
                }
            }
            field(:t18, 0) {
                pointer {
                    global :ArmyControllerSub18
                }
            }
            field(:t19, 0) {
                pointer {
                }
            }
            field(:t20, 0) {
                pointer {
                }
            }
            field(:t21, 0) {
                pointer {
                }
            }
            field(:t22, 0) {
                pointer {
                }
            }
            field(:t23, 0) {
                pointer {
                }
            }
            field(:VillainousVisit, 0) {
                pointer {
                    global :ArmyControllerVillainousVisit
                }
            }
        }
    }
    field(:type, 192) {
        class ::DFHack::ArmyController_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :T0 ; NUME[:T0] = 0
            ENUM[1] = :T1 ; NUME[:T1] = 1
            ENUM[2] = :InvasionOrder ; NUME[:InvasionOrder] = 2
            ENUM[3] = :T3 ; NUME[:T3] = 3
            ENUM[4] = :Invasion ; NUME[:Invasion] = 4
            ENUM[5] = :T5 ; NUME[:T5] = 5
            ENUM[6] = :T6 ; NUME[:T6] = 6
            ENUM[7] = :T7 ; NUME[:T7] = 7
            ENUM[8] = :T8 ; NUME[:T8] = 8
            ENUM[9] = :T9 ; NUME[:T9] = 9
            ENUM[10] = :T10 ; NUME[:T10] = 10
            ENUM[11] = :T11 ; NUME[:T11] = 11
            ENUM[12] = :Visit ; NUME[:Visit] = 12
            ENUM[13] = :T13 ; NUME[:T13] = 13
            ENUM[14] = :T14 ; NUME[:T14] = 14
            ENUM[15] = :T15 ; NUME[:T15] = 15
            ENUM[16] = :T16 ; NUME[:T16] = 16
            ENUM[17] = :Quest ; NUME[:Quest] = 17
            ENUM[18] = :T18 ; NUME[:T18] = 18
            ENUM[19] = :T19 ; NUME[:T19] = 19
            ENUM[20] = :T20 ; NUME[:T20] = 20
            ENUM[21] = :T21 ; NUME[:T21] = 21
            ENUM[22] = :T22 ; NUME[:T22] = 22
            ENUM[23] = :T23 ; NUME[:T23] = 23
            ENUM[24] = :VillainousVisit ; NUME[:VillainousVisit] = 24
        end

        number 32, true, nil, ArmyController_TType
    }
end

class ArmyControllerInvasion < MemHack::Compound
    sizeof 8

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        compound(:ArmyControllerInvasion_TUnk2) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:not_sleeping, 0) { bit 0 }
            field(:unk_2, 0) { bit 1 }
            field(:unk_3, 0) { bit 2 }
            field(:unk_4, 0) { bit 3 }
        }
    }
end

class ArmyControllerInvasionOrder < MemHack::Compound
    sizeof 104

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 12) {
        number 32, true
    }
    field(:unk_4a, 16) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerInvasionOrder_TUnk4a) {
                    sizeof 24

                    field(:army_id, 0) {
                        number 32, true, -1
                    }
                    def army_tg ; df.world.armies.all.binsearch(army_id) ; end
                    field(:pos_x_a, 4) {
                        number 32, true
                    }
                    field(:pos_y_a, 8) {
                        number 32, true
                    }
                    field(:pos_x_b, 12) {
                        number 32, true
                    }
                    field(:pos_y_b, 16) {
                        number 32, true
                    }
                    field(:invasion_count, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_5, 40) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_6, 64) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_7, 88) {
        number 32, true
    }
    field(:unk_8, 92) {
        number 32, true
    }
    field(:unk_9, 96) {
        number 32, true
    }
end

class ArmyControllerQuest < MemHack::Compound
    sizeof 16

    field(:artifact_id, 0) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:unk_1, 4) {
        number 32, true, -1
    }
    field(:unk_2, 8) {
        number 32, true, -1
    }
    field(:unk_3, 12) {
        number 32, true
    }
end

class ArmyControllerSub1 < MemHack::Compound
    sizeof 12

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
end

class ArmyControllerSub11 < MemHack::Compound
    sizeof 32

    field(:unk_1, 0) {
        number 32, true, -1
    }
    field(:unk_2, 4) {
        number 32, true, -1
    }
    field(:unk_3, 8) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerSub11_TUnk3) {
                    sizeof 24

                    field(:army_id, 0) {
                        number 32, true, -1
                    }
                    def army_tg ; df.world.armies.all.binsearch(army_id) ; end
                    field(:pos_x_a, 4) {
                        number 32, true
                    }
                    field(:pos_y_a, 8) {
                        number 32, true
                    }
                    field(:pos_x_b, 12) {
                        number 32, true
                    }
                    field(:pos_y_b, 16) {
                        number 32, true
                    }
                    field(:invasion_count, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class ArmyControllerSub13 < MemHack::Compound
    sizeof 40

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 16) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerSub13_TUnk4) {
                    sizeof 24

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class ArmyControllerSub14 < MemHack::Compound
    sizeof 40

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 16) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerSub14_TUnk4) {
                    sizeof 24

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class ArmyControllerSub15 < MemHack::Compound
    sizeof 72

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerSub15_TUnk3) {
                    sizeof 24

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        number 32, true
    }
    field(:unk_7, 44) {
        number 32, true
    }
    field(:unk_8, 48) {
        number 32, true
    }
    field(:unk_9, 52) {
        number 32, true
    }
    field(:unk_10, 56) {
        number 32, true
    }
    field(:unk_11, 60) {
        number 32, true
    }
    field(:unk_12, 64) {
        number 32, true
    }
    field(:unk_13, 68) {
        number 32, true
    }
end

class ArmyControllerSub16 < MemHack::Compound
    sizeof 4

    field(:unk_1, 0) {
        number 32, true
    }
end

class ArmyControllerSub18 < MemHack::Compound
    sizeof 8

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
end

class ArmyControllerSub5 < MemHack::Compound
    sizeof 20

    field(:pos_x, 0) {
        number 32, true
    }
    field(:pos_y, 4) {
        number 32, true
    }
    field(:unk_1, 8) {
        number 32, true
    }
    field(:year, 12) {
        number 32, true
    }
    field(:year_tick, 16) {
        number 32, true
    }
end

class ArmyControllerSub6 < MemHack::Compound
    sizeof 36

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 12) {
        number 32, true
    }
    field(:unk_5, 16) {
        number 32, true
    }
    field(:unk_6, 20) {
        number 32, true
    }
    field(:unk_7, 24) {
        number 32, true
    }
    field(:unk_8, 28) {
        number 32, true
    }
    field(:unk_9, 32) {
        number 32, true
    }
end

class ArmyControllerSub7 < MemHack::Compound
    sizeof 64

    field(:unk_1, 0) {
        number 32, true, -1
    }
    field(:unk_2, 4) {
        number 32, true, -1
    }
    field(:unk_3, 8) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerSub7_TUnk3) {
                    sizeof 24

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:pos_x, 36) {
        number 32, true
    }
    field(:pos_y, 40) {
        number 32, true
    }
    field(:unk_5, 44) {
        number 32, true
    }
    field(:unk_6, 48) {
        number 32, true, -1
    }
    field(:unk_7, 52) {
        number 32, true, -1
    }
    field(:unk_8, 56) {
        number 32, true, -1
    }
end

class ArmyControllerVillainousVisit < MemHack::Compound
    sizeof 16

    field(:site_id, 0) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:entity_id, 4) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:abstract_building, 8) {
        number 32, true
    }
    field(:purpose, 12) {
        number 32, true, nil, HistoryEventReason
    }
end

class ArmyControllerVisit < MemHack::Compound
    sizeof 56

    field(:unk_1, 0) {
        number 32, true, -1
    }
    field(:unk_2, 4) {
        number 32, true, -1
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 16) {
        stl_vector(8) {
            pointer {
                compound(:ArmyControllerVisit_TUnk4) {
                    sizeof 24

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_5, 40) {
        number 32, true, -1
    }
    field(:unk_6, 44) {
        number 32, true, -1
    }
    field(:abstract_building, 48) {
        number 32, true, -1
    }
    field(:purpose, 52) {
        number 32, true, nil, HistoryEventReason
    }
end

class ArtImage < MemHack::Compound
    sizeof 224

    field(:elements, 0) {
        stl_vector(8) {
            pointer {
                global :ArtImageElement
            }
        }
    }
    field(:properties, 24) {
        stl_vector(8) {
            pointer {
                global :ArtImageProperty
            }
        }
    }
    field(:event, 48) {
        number 32, true, -1
    }
    def event_tg ; df.world.history.events.binsearch(event) ; end
    field(:name, 56) {
        global :LanguageName
    }
    field(:spec_ref_type, 176) {
        number 32, true, nil, SpecificRefType
    }
    field(:mat_type, 180) {
        number 16, true, -1
    }
    field(:mat_index, 184) {
        number 32, true
    }
    field(:quality, 188) {
        number 16, true, nil, ItemQuality
    }
    field(:artist, 192) {
        number 32, true, -1
    }
    def artist_tg ; df.world.history.figures.binsearch(artist) ; end
    field(:site, 196) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:ref, 200) {
        pointer {
            global :GeneralRef
        }
    }
    field(:year, 208) {
        number 32, true
    }
    field(:unk_1, 212) {
        number 32, true
    }
    field(:id, 216) {
        number 32, true, -1
    }
    def id_tg ; df.world.art_image_chunks.binsearch(id) ; end
    field(:subid, 220) {
        number 16, true, -1
    }
end

class ArtImageChunk < MemHack::Compound
    sizeof 4008

    field(:id, 0) {
        number 32, true
    }
    field(:images, 8) {
        static_array(500, 8) {
            pointer {
                global :ArtImage
            }
        }
    }
end

class ArtImageElement < MemHack::Compound
    sizeof 16

    rtti_classname :art_image_elementst

    field(:count, 8) {
        number 32, true
    }
    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
    def getType()
        ArtImageElementType.sym(DFHack.vmethod_call(self, 16))
    end
    def setID(iD)
        DFHack.vmethod_call(self, 24, iD) ; nil
    end
    def clone()
        ptr = DFHack.vmethod_call(self, 40)
        class << self
            global :ArtImageElement
        end._at(ptr) if ptr != 0
    end
    def getSymbol(sym, arg1)
        DFHack.vmethod_call(self, 48, sym, arg1) ; nil
    end
    def getName1(name, useThe, useName)
        DFHack.vmethod_call(self, 56, name, useThe, useName) ; nil
    end
    def getName2(name, arg1)
        DFHack.vmethod_call(self, 64, name, arg1) ; nil
    end
    def markDiscovered()
        DFHack.vmethod_call(self, 72) ; nil
    end
    def getColorAndShape(colors, shapes)
        DFHack.vmethod_call(self, 80, colors, shapes) ; nil
    end
end

class ArtImageElementCreaturest < ArtImageElement
    sizeof 32

    rtti_classname :art_image_element_creaturest

    field(:race, 16) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 20) {
        number 16, true
    }
    field(:histfig, 24) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
end

class ArtImageElementItemst < ArtImageElement
    sizeof 32

    rtti_classname :art_image_element_itemst

    field(:item_type, 16) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 18) {
        number 16, true, -1
    }
    field(:mat_type, 20) {
        number 16, true, -1
    }
    field(:mat_index, 22) {
        number 16, true
    }
    field(:flags, 24) {
        global :ItemFlags
    }
    field(:item_id, 28) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class ArtImageElementPlantst < ArtImageElement
    sizeof 24

    rtti_classname :art_image_element_plantst

    field(:plant_id, 16) {
        number 32, true, -1
    }
    def plant_tg ; df.world.raws.plants.all[plant_id] ; end
end

class ArtImageElementShapest < ArtImageElement
    sizeof 24

    rtti_classname :art_image_element_shapest

    field(:shape_id, 16) {
        number 32, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape_id] ; end
    field(:shape_adj, 20) {
        number 16, true
    }
end

class ArtImageElementTreest < ArtImageElement
    sizeof 24

    rtti_classname :art_image_element_treest

    field(:plant_id, 16) {
        number 32, true, -1
    }
    def plant_tg ; df.world.raws.plants.all[plant_id] ; end
end

class ArtImageProperty < MemHack::Compound
    sizeof 24

    rtti_classname :art_image_propertyst

    field(:flags, 8) {
        df_flagarray
    }
    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
    def getType()
        ArtImagePropertyType.sym(DFHack.vmethod_call(self, 16))
    end
    def clone()
        ptr = DFHack.vmethod_call(self, 32)
        class << self
            global :ArtImageElement
        end._at(ptr) if ptr != 0
    end
    def getName(arg0, arg1, useName)
        DFHack.vmethod_call(self, 40, arg0, arg1, useName) ; nil
    end
end

class ArtImagePropertyIntransitiveVerbst < ArtImageProperty
    sizeof 32

    rtti_classname :art_image_property_intransitive_verbst

    field(:subject, 24) {
        number 32, true
    }
    field(:verb, 28) {
        number 16, true, nil, ArtImagePropertyVerb
    }
end

class ArtImagePropertyTransitiveVerbst < ArtImageProperty
    sizeof 40

    rtti_classname :art_image_property_transitive_verbst

    field(:subject, 24) {
        number 32, true
    }
    field(:object, 28) {
        number 32, true
    }
    field(:verb, 32) {
        number 16, true, nil, ArtImagePropertyVerb
    }
end

class ArtImageRef < MemHack::Compound
    sizeof 16

    field(:id, 0) {
        number 32, true, -1
    }
    def id_tg ; df.world.art_image_chunks.binsearch(id) ; end
    field(:subid, 4) {
        number 16, true, -1
    }
    field(:civ_id, 8) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:site_id, 12) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
end

class ArtifactClaim < MemHack::Compound
    sizeof 88

    field(:artifact_id, 0) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:claim_type, 4) {
        number 32, true, nil, ArtifactClaimType
    }
    field(:symbol_claim_id, 8) {
        number 32, true, -1
    }
    field(:claim_year, 12) {
        number 32, true, -1
    }
    field(:claim_year_tick, 16) {
        number 32, true, -1
    }
    field(:unk_1, 20) {
        number 32, true, -1
    }
    field(:artifact, 24) {
        pointer {
            global :ArtifactRecord
        }
    }
    field(:site, 32) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure_local, 36) {
        number 32, true, -1
    }
    field(:holder_hf, 40) {
        number 32, true, -1
    }
    def holder_hf_tg ; df.world.history.figures.binsearch(holder_hf) ; end
    field(:subregion, 44) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion] ; end
    field(:feature_layer_id, 48) {
        number 32, true, -1
    }
    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer_id] ; end
    field(:unk_year, 52) {
        number 32, true, -1
    }
    field(:unk_2, 56) {
        number 32, true, -1
    }
    field(:unk_3, 60) {
        number 32, true
    }
    field(:unk_4, 64) {
        pointer {
        }
    }
    field(:unk_5, 72) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:unk_6, 80) {
        pointer {
            global :HistoricalEntity
        }
    }
end

class ArtifactRecord < MemHack::Compound
    sizeof 296

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:flags, 128) {
        df_flagarray
    }
    field(:item, 144) {
        pointer {
            global :Item
        }
    }
    field(:abs_tile_x, 152) {
        number 32, true
    }
    field(:abs_tile_y, 156) {
        number 32, true
    }
    field(:abs_tile_z, 160) {
        number 32, true
    }
    field(:unk_1, 164) {
        number 32, true
    }
    field(:site, 168) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure_local, 172) {
        number 32, true, -1
    }
    field(:unk_2, 176) {
        number 32, true, -1
    }
    field(:subregion, 180) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion] ; end
    field(:feature_layer, 184) {
        number 32, true, -1
    }
    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer] ; end
    field(:owner_hf, 188) {
        number 32, true, -1
    }
    def owner_hf_tg ; df.world.history.figures.binsearch(owner_hf) ; end
    field(:remote_claims, 192) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def remote_claims_tg ; remote_claims.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:entity_claims, 216) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def entity_claims_tg ; entity_claims.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:direct_claims, 240) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def direct_claims_tg ; direct_claims.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:storage_site, 264) {
        number 32, true, -1
    }
    def storage_site_tg ; df.world.world_data.sites.binsearch(storage_site) ; end
    field(:storage_structure_local, 268) {
        number 32, true, -1
    }
    field(:loss_region, 272) {
        number 32, true, -1
    }
    def loss_region_tg ; df.world.world_data.regions[loss_region] ; end
    field(:unk_3, 276) {
        number 32, true, -1
    }
    field(:holder_hf, 280) {
        number 32, true, -1
    }
    def holder_hf_tg ; df.world.history.figures.binsearch(holder_hf) ; end
    field(:year, 284) {
        number 32, true, -1
    }
    field(:unk_4, 288) {
        number 32, true, -1
    }
    field(:unk_5, 292) {
        number 32, true
    }
end

class AssignTradeStatus < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :Item
        }
    }
    field(:distance, 8) {
        number 32, true
    }
    field(:status, 12) {
        class ::DFHack::AssignTradeStatus_TStatus < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-2] = :RemoveTrading ; NUME[:RemoveTrading] = -2
            ENUM[-1] = :RemovePending ; NUME[:RemovePending] = -1
            ENUM[0] = :None ; NUME[:None] = 0
            ENUM[1] = :AddPending ; NUME[:AddPending] = 1
            ENUM[2] = :Pending ; NUME[:Pending] = 2
            ENUM[3] = :Trading ; NUME[:Trading] = 3
        end

        number 8, true, nil, AssignTradeStatus_TStatus
    }
    field(:unk, 13) {
        number 8, true, nil, BooleanEnum
    }
    field(:value, 16) {
        number 32, true
    }
    field(:weight, 20) {
        number 32, true
    }
end

class Battlefield < MemHack::Compound
    sizeof 104

    field(:id, 0) {
        number 32, true
    }
    field(:sapient_deaths, 8) {
        stl_vector(8) {
            pointer {
                compound(:Battlefield_TSapientDeaths) {
                    sizeof 32

                    field(:deaths, 0) {
                        number 32, true
                    }
                    field(:race, 4) {
                        number 32, true
                    }
                    field(:squad, 8) {
                        number 32, true, -1
                    }
                    field(:unk_c, 12) {
                        number 32, true, -1
                    }
                    field(:start_year, 16) {
                        number 32, true
                    }
                    field(:end_year, 20) {
                        number 32, true
                    }
                    field(:unk_18, 24) {
                        number 32, true
                    }
                    field(:unk_1c, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:hfs_killed, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def hfs_killed_tg ; hfs_killed.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:x1, 56) {
        number 32, true
    }
    field(:y1, 60) {
        number 32, true
    }
    field(:x2, 64) {
        number 32, true
    }
    field(:y2, 68) {
        number 32, true
    }
    field(:unk_34, 72) {
        number 32, true, -1
    }
    field(:event_collections, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def event_collections_tg ; event_collections.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
end

class Beat < MemHack::Compound
    sizeof 4

    field(:value, 0) {
        number 32, true, nil, BeatType
    }
end

class BeliefSystem < MemHack::Compound
    sizeof 336

    field(:id, 0) {
        number 32, true
    }
    field(:mental_pictures, 8) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        global :MentalPicture
                    }
                }
            }
        }
    }
    field(:deities, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def deities_tg ; deities.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:worship_levels, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 80) {
        number 32, true
    }
    field(:unk_2, 84) {
        number 32, true
    }
    field(:unk_3, 88) {
        number 32, true
    }
    field(:unk_4, 92) {
        number 32, true
    }
    field(:unk_5, 96) {
        number 32, true
    }
    field(:unk_6, 100) {
        number 32, true
    }
    field(:unk_7, 104) {
        number 32, true
    }
    field(:unk_8, 108) {
        number 32, true
    }
    field(:unk_9, 112) {
        number 32, true
    }
    field(:unk_10, 116) {
        number 32, true
    }
    field(:unk_11, 120) {
        number 32, true
    }
    field(:unk_12, 124) {
        number 32, true
    }
    field(:unk_13, 128) {
        number 32, true
    }
    field(:unk_14, 132) {
        number 32, true
    }
    field(:unk_15, 136) {
        number 32, true
    }
    field(:unk_16, 140) {
        number 32, true
    }
    field(:unk_17, 144) {
        number 32, true
    }
    field(:unk_18, 148) {
        number 32, true
    }
    field(:unk_19, 152) {
        number 32, true
    }
    field(:unk_20, 156) {
        number 32, true
    }
    field(:unk_21, 160) {
        number 32, true
    }
    field(:unk_22, 164) {
        number 32, true
    }
    field(:unk_23, 168) {
        number 32, true
    }
    field(:unk_24, 172) {
        number 32, true
    }
    field(:unk_25, 176) {
        number 32, true
    }
    field(:unk_26, 180) {
        number 32, true
    }
    field(:unk_27, 184) {
        number 32, true
    }
    field(:unk_28, 188) {
        number 32, true
    }
    field(:unk_29, 192) {
        number 32, true
    }
    field(:unk_30, 196) {
        number 32, true
    }
    field(:unk_31, 200) {
        number 32, true
    }
    field(:unk_32, 204) {
        number 32, true
    }
    field(:unk_33, 208) {
        number 32, true
    }
    field(:unk_34, 212) {
        number 32, true
    }
    field(:unk_35, 216) {
        number 32, true
    }
    field(:unk_36, 220) {
        number 32, true
    }
    field(:unk_37, 224) {
        number 32, true
    }
    field(:unk_38, 228) {
        number 32, true
    }
    field(:unk_39, 232) {
        number 32, true
    }
    field(:unk_40, 236) {
        number 32, true
    }
    field(:unk_41, 240) {
        number 32, true
    }
    field(:unk_42, 244) {
        number 32, true
    }
    field(:unk_43, 248) {
        number 32, true
    }
    field(:unk_44, 252) {
        number 32, true
    }
    field(:unk_45, 256) {
        number 32, true
    }
    field(:unk_46, 260) {
        number 32, true
    }
    field(:unk_47, 264) {
        number 32, true
    }
    field(:unk_48, 268) {
        number 32, true
    }
    field(:unk_49, 272) {
        number 32, true
    }
    field(:unk_50, 276) {
        number 32, true
    }
    field(:unk_51, 280) {
        number 32, true
    }
    field(:unk_52, 284) {
        number 32, true
    }
    field(:unk_53, 288) {
        number 32, true
    }
    field(:unk_54, 292) {
        number 32, true
    }
    field(:unk_55, 296) {
        number 32, true
    }
    field(:unk_56, 300) {
        number 32, true
    }
    field(:unk_57, 304) {
        number 32, true
    }
    field(:unk_58, 308) {
        number 32, true
    }
    field(:unk_59, 312) {
        number 32, true
    }
    field(:unk_60, 316) {
        number 32, true
    }
    field(:unk_61, 320) {
        number 32, true
    }
    field(:unk_62, 324) {
        number 32, true
    }
    field(:unk_63, 328) {
        number 32, true
    }
    field(:unk_64, 332) {
        number 32, true
    }
end

class BlockBurrow < MemHack::Compound
    sizeof 48

    field(:id, 0) {
        number 32, true, -1
    }
    def id_tg ; df.ui.burrows.list.binsearch(id) ; end
    field(:tile_bitmask, 4) {
        global :TileBitmask
    }
    field(:link, 40) {
        pointer {
            global :BlockBurrowLink
        }
    }
end

class BlockBurrowLink < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :BlockBurrow
        }
    }
    field(:prev, 8) {
        pointer {
            global :BlockBurrowLink
        }
    }
    field(:next, 16) {
        pointer {
            global :BlockBurrowLink
        }
    }
end

class BlockFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:designated, 0) { bit 0 }
    field(:update_temperature, 0) { bit 1 }
    field(:update_liquid, 0) { bit 2 }
    field(:update_liquid_twice, 0) { bit 3 }
    field(:repath_on_freeze, 0) { bit 4 }
    field(:repath_on_melt, 0) { bit 5 }
    field(:has_aquifer, 0) { bit 6 }
    field(:check_aquifer, 0) { bit 7 }
    field(:subterranean_water, 0) { bit 9 }
end

class BlockSquareEvent < MemHack::Compound
    sizeof 8

    rtti_classname :block_square_eventst

    def getType()
        BlockSquareEventType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def isEmpty()
        val = DFHack.vmethod_call(self, 24)
        (val & 1) != 0
    end
    def checkTemperature(x, y, temperature)
        DFHack.vmethod_call(self, 40, x, y, temperature) ; nil
    end
end

class BlockSquareEventDesignationPriorityst < BlockSquareEvent
    sizeof 1032

    rtti_classname :block_square_event_designation_priorityst

    field(:priority, 8) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true
            }
        }
    }
end

class BlockSquareEventFrozenLiquidst < BlockSquareEvent
    sizeof 776

    rtti_classname :block_square_event_frozen_liquidst

    field(:tiles, 8) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, true, nil, Tiletype
            }
        }
    }
    field(:liquid_type, 520) {
        static_array(16, 16) {
            static_array(16, 1) {
                number 8, true, nil, TileLiquid
            }
        }
    }
end

class BlockSquareEventGrassst < BlockSquareEvent
    sizeof 272

    rtti_classname :block_square_event_grassst

    field(:plant_index, 8) {
        number 32, true, -1
    }
    def plant_index_tg ; df.world.raws.plants.all[plant_index] ; end
    field(:amount, 12) {
        static_array(16, 16) {
            static_array(16, 1) {
                number 8, true
            }
        }
    }
end

class BlockSquareEventItemSpatterst < BlockSquareEvent
    sizeof 1312

    rtti_classname :block_square_event_item_spatterst

    field(:item_type, 8) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 10) {
        number 16, true, -1
    }
    field(:mattype, 12) {
        number 16, true, -1
    }
    field(:matindex, 16) {
        number 32, true
    }
    field(:unk1, 20) {
        number 32, true
    }
    field(:amount, 24) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true
            }
        }
    }
    field(:unk2, 1048) {
        static_array(16, 16) {
            static_array(16, 1) {
                number 8, true
            }
        }
    }
    field(:temp1, 1304) {
        number 16, false
    }
    field(:temp2, 1306) {
        number 16, false
    }
end

class BlockSquareEventMaterialSpatterst < BlockSquareEvent
    sizeof 280

    rtti_classname :block_square_event_material_spatterst

    field(:mat_type, 8) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true
    }
    field(:mat_state, 16) {
        number 16, true, nil, MatterState
    }
    field(:amount, 18) {
        static_array(16, 16) {
            static_array(16, 1) {
                number 8, false
            }
        }
    }
    field(:min_temperature, 274) {
        number 16, false
    }
    field(:max_temperature, 276) {
        number 16, false
    }
end

class BlockSquareEventMineralst < BlockSquareEvent
    sizeof 48

    rtti_classname :block_square_event_mineralst

    field(:inorganic_mat, 8) {
        number 32, true, -1
    }
    def inorganic_mat_tg ; df.world.raws.inorganics[inorganic_mat] ; end
    field(:tile_bitmask, 12) {
        global :TileBitmask
    }
    field(:flags, 44) {
        compound(:BlockSquareEventMineralst_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:discovered, 0) { bit 0 }
            field(:cluster, 0) { bit 1 }
            field(:vein, 0) { bit 2 }
            field(:cluster_small, 0) { bit 3 }
            field(:cluster_one, 0) { bit 4 }
        }
    }
end

class BlockSquareEventSpoorst < BlockSquareEvent
    sizeof 4880

    rtti_classname :block_square_event_spoorst

    field(:flags, 8) {
        static_array(16, 32) {
            static_array(16, 2) {
                compound(:BlockSquareEventSpoorst_TFlags) {
                    field(:_whole, 0) {
                        number 16, false
                    }
                }
            }
        }
    }
    field(:unk_2, 520) {
        static_array(16, 16) {
            static_array(16, 1) {
                class ::DFHack::BlockSquareEventSpoorst_TUnk2 < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Unk2A ; NUME[:Unk2A] = 0
                    ENUM[1] = :Unk2B ; NUME[:Unk2B] = 1
                    ENUM[2] = :Unk2C ; NUME[:Unk2C] = 2
                    ENUM[3] = :Unk2D ; NUME[:Unk2D] = 3
                end

                number 8, true, nil, BlockSquareEventSpoorst_TUnk2
            }
        }
    }
    field(:unk_3, 776) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true
            }
        }
    }
    field(:race, 1800) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true, -1
            }
        }
    }
    field(:caste, 2824) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true, -1
            }
        }
    }
    field(:age, 3848) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true
            }
        }
    }
    field(:year, 4872) {
        number 32, true, -1
    }
    field(:year_tick, 4876) {
        number 32, true, -1
    }
end

class BlockSquareEventWorldConstructionst < BlockSquareEvent
    sizeof 48

    rtti_classname :block_square_event_world_constructionst

    field(:construction_id, 8) {
        number 32, true, -1
    }
    def construction_tg ; df.world.world_data.constructions.list.binsearch(construction_id) ; end
    field(:tile_bitmask, 12) {
        global :TileBitmask
    }
end

class BodyAppearanceModifier < MemHack::Compound
    sizeof 136

    field(:type, 0) {
        number 16, true, nil, AppearanceModifierType
    }
    field(:ranges, 4) {
        static_array(7, 4) {
            number 32, true
        }
    }
    field(:desc_range, 32) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:growth_rate, 56) {
        number 32, true
    }
    field(:growth_interval, 60) {
        number 16, true, nil, AppearanceModifierGrowthInterval
    }
    field(:growth_min, 64) {
        number 32, true
    }
    field(:growth_max, 68) {
        number 32, true
    }
    field(:growth_start, 72) {
        number 32, true
    }
    field(:growth_end, 76) {
        number 32, true
    }
    field(:importance, 80) {
        number 32, true
    }
    field(:noun, 88) {
        stl_string
    }
    field(:unk_1, 120) {
        number 16, true
    }
    field(:unk_2, 122) {
        number 16, true
    }
    field(:id, 124) {
        number 32, true
    }
    field(:id2, 128) {
        number 32, true
    }
end

class BodyComponentInfo < MemHack::Compound
    sizeof 192

    field(:body_part_status, 0) {
        stl_vector(4) {
            global :BodyPartStatus
        }
    }
    field(:numbered_masks, 24) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:nonsolid_remaining, 48) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:layer_status, 72) {
        stl_vector(4) {
            global :BodyLayerStatus
        }
    }
    field(:layer_wound_area, 96) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:layer_cut_fraction, 120) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:layer_dent_fraction, 144) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:layer_effect_fraction, 168) {
        stl_vector(4) {
            number 32, false
        }
    }
end

class BodyDetailPlan < MemHack::Compound
    sizeof 632

    field(:id, 0) {
        stl_string
    }
    field(:add_material_name, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:add_material_template, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:add_tissue_name, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:add_tissue_template, 104) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk5c, 128) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk6c, 152) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk7c, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_layers_selection, 200) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:bp_layers_criteria, 224) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_layers_tissue, 248) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_layers_thickness, 272) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_layers_position, 296) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_layers_over_under, 320) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:bp_relsize_selection, 344) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_relsize_criteria, 368) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_relsize_value, 392) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:bp_position_selection, 416) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_position_criteria, 440) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_position_value, 464) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_relation_selection_1, 488) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_relation_criteria_1, 512) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_relation_value_1, 536) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_relation_selection_2, 560) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:bp_relation_criteria_2, 584) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_relation_extent, 608) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class BodyLayerStatus < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:gone, 0) { bit 0 }
    field(:leaking, 0) { bit 1 }
end

class BodyPartLayerRaw < MemHack::Compound
    sizeof 136

    field(:layer_name, 0) {
        stl_string
    }
    field(:tissue_id, 32) {
        number 32, true, -1
    }
    field(:flags, 40) {
        df_flagarray(BodyPartLayerFlags)
    }
    field(:part_fraction, 56) {
        number 32, true
    }
    field(:healing_rate, 60) {
        number 32, true
    }
    field(:vascular, 64) {
        number 32, true
    }
    field(:pain_receptors, 68) {
        number 32, true
    }
    field(:unk6, 72) {
        number 32, true
    }
    field(:unk7, 76) {
        number 16, true
    }
    field(:bp_modifiers, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:layer_id, 104) {
        number 32, true
    }
    field(:parent_idx, 108) {
        number 32, true, -1
    }
    field(:parent_layer_id, 112) {
        number 32, true
    }
    field(:layer_depth, 116) {
        number 32, true
    }
    field(:leak_barrier_id, 120) {
        number 32, true
    }
    field(:nonsolid_id, 124) {
        number 32, true
    }
    field(:styleable_id, 128) {
        number 32, true
    }
end

class BodyPartRaw < MemHack::Compound
    sizeof 240

    field(:token, 0) {
        stl_string
    }
    field(:category, 32) {
        stl_string
    }
    field(:con_part_id, 64) {
        number 16, true
    }
    field(:flags, 72) {
        df_flagarray(BodyPartRawFlags)
    }
    field(:layers, 88) {
        stl_vector(8) {
            pointer {
                global :BodyPartLayerRaw
            }
        }
    }
    field(:fraction_total, 112) {
        number 32, true
    }
    field(:fraction_base, 116) {
        number 32, true
    }
    field(:fraction_fat, 120) {
        number 32, true
    }
    field(:fraction_muscle, 124) {
        number 32, true
    }
    field(:relsize, 128) {
        number 32, true
    }
    field(:number, 132) {
        number 32, true
    }
    field(:unk7b, 136) {
        number 16, true
    }
    field(:name_singular, 144) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:name_plural, 168) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_relation_part_id, 192) {
        pointer {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:bp_relation_code, 200) {
        pointer {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:bp_relation_coverage, 208) {
        pointer {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:min_temp, 216) {
        number 16, false
    }
    field(:max_temp, 218) {
        number 16, false
    }
    field(:temp_factor, 220) {
        number 16, false
    }
    field(:numbered_idx, 224) {
        number 32, true, -1
    }
    field(:insulation_fat, 228) {
        number 16, true
    }
    field(:insulation_muscle, 230) {
        number 16, true
    }
    field(:insulation_base, 232) {
        number 16, true
    }
    field(:clothing_item_id, 236) {
        number 32, true, -1
    }
end

class BodyPartStatus < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:on_fire, 0) { bit 0 }
    field(:missing, 0) { bit 1 }
    field(:organ_loss, 0) { bit 2 }
    field(:organ_damage, 0) { bit 3 }
    field(:muscle_loss, 0) { bit 4 }
    field(:muscle_damage, 0) { bit 5 }
    field(:bone_loss, 0) { bit 6 }
    field(:bone_damage, 0) { bit 7 }
    field(:skin_damage, 0) { bit 8 }
    field(:motor_nerve_severed, 0) { bit 9 }
    field(:sensory_nerve_severed, 0) { bit 10 }
    field(:spilled_guts, 0) { bit 11 }
    field(:has_splint, 0) { bit 12 }
    field(:has_bandage, 0) { bit 13 }
    field(:has_plaster_cast, 0) { bit 14 }
    field(:grime, 0) { bits 15, 3 }
    field(:severed_or_jammed, 0) { bit 18 }
    field(:under_shell, 0) { bit 19 }
    field(:is_shell, 0) { bit 20 }
    field(:mangled, 0) { bit 21 }
    field(:unk20, 0) { bit 22 }
    field(:gelded, 0) { bit 23 }
end

class BodyPartTemplate < MemHack::Compound
    sizeof 208

    field(:id, 0) {
        stl_string
    }
    field(:con, 32) {
        stl_string
    }
    field(:category, 64) {
        stl_string
    }
    field(:con_cat, 96) {
        stl_string
    }
    field(:contype, 128) {
        number 16, true, nil, BodyPartTemplateContype
    }
    field(:flags, 136) {
        df_flagarray(BodyPartTemplateFlags)
    }
    field(:default_relsize, 152) {
        number 32, true
    }
    field(:number, 156) {
        number 32, true
    }
    field(:name_singular, 160) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:name_plural, 184) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class BodySizeInfo < MemHack::Compound
    sizeof 24

    field(:size_cur, 0) {
        number 32, true
    }
    field(:size_base, 4) {
        number 32, true
    }
    field(:area_cur, 8) {
        number 32, true
    }
    field(:area_base, 12) {
        number 32, true
    }
    field(:length_cur, 16) {
        number 32, true
    }
    field(:length_base, 20) {
        number 32, true
    }
end

class BodyTemplate < MemHack::Compound
    sizeof 56

    field(:id, 0) {
        stl_string
    }
    field(:parts, 32) {
        stl_vector(8) {
            pointer {
                global :BodyPartTemplate
            }
        }
    }
end

class BpAppearanceModifier < MemHack::Compound
    sizeof 184

    field(:type, 0) {
        number 16, true, nil, AppearanceModifierType
    }
    field(:ranges, 4) {
        static_array(7, 4) {
            number 32, true
        }
    }
    field(:desc_range, 32) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:growth_rate, 56) {
        number 32, true
    }
    field(:growth_interval, 60) {
        number 16, true, nil, AppearanceModifierGrowthInterval
    }
    field(:growth_min, 64) {
        number 32, true
    }
    field(:growth_max, 68) {
        number 32, true
    }
    field(:growth_start, 72) {
        number 32, true
    }
    field(:growth_end, 76) {
        number 32, true
    }
    field(:importance, 80) {
        number 32, true
    }
    field(:noun, 88) {
        stl_string
    }
    field(:single_plural, 120) {
        number 16, true
    }
    field(:unk1, 122) {
        number 16, true
    }
    field(:id1, 124) {
        number 32, true
    }
    field(:body_parts, 128) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:tissue_layer, 152) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:id, 176) {
        number 32, true
    }
end

class Breed < MemHack::Compound
    sizeof 80

    field(:id, 0) {
        number 32, true
    }
    field(:unk_4, 4) {
        number 32, true
    }
    field(:unk_8, 8) {
        stl_vector(8) {
            pointer {
                compound(:Breed_TUnk8) {
                    sizeof 12

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                    field(:unk_8, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_18, 32) {
        stl_vector(8) {
            pointer {
                compound(:Breed_TUnk18) {
                    sizeof 12

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                    field(:unk_8, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_28, 56) {
        stl_vector(8) {
            pointer {
                compound(:Breed_TUnk28) {
                    sizeof 8

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class BuildReqChoicest < MemHack::Compound
    sizeof 16

    rtti_classname :build_req_choicest

    field(:distance, 8) {
        number 32, true
    }
    def getType()
        BuildReqChoiceType.sym(DFHack.vmethod_call(self, 0))
    end
    def getName(str)
        DFHack.vmethod_call(self, 8, str) ; nil
    end
    def isCandidate(item_id)
        val = DFHack.vmethod_call(self, 24, item_id)
        (val & 1) != 0
    end
    def getUsedCount()
        val = DFHack.vmethod_call(self, 40)
    end
    def getNumCandidates()
        val = DFHack.vmethod_call(self, 48)
    end
end

class BuildReqChoiceGenst < BuildReqChoicest
    sizeof 64

    rtti_classname :build_req_choice_genst

    field(:item_type, 16) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 18) {
        number 16, true, -1
    }
    field(:mat_type, 20) {
        number 16, true, -1
    }
    field(:mat_index, 24) {
        number 32, true
    }
    field(:candidates, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:used_count, 56) {
        number 32, true
    }
end

class BuildReqChoiceSpecst < BuildReqChoicest
    sizeof 32

    rtti_classname :build_req_choice_specst

    field(:candidate, 16) {
        pointer {
            global :Item
        }
    }
    field(:candidate_id, 24) {
        number 32, true
    }
end

class Building < MemHack::Compound
    sizeof 336

    rtti_classname :buildingst

    field(:x1, 8) {
        number 32, true
    }
    field(:y1, 12) {
        number 32, true
    }
    field(:centerx, 16) {
        number 32, true
    }
    field(:x2, 20) {
        number 32, true
    }
    field(:y2, 24) {
        number 32, true
    }
    field(:centery, 28) {
        number 32, true
    }
    field(:z, 32) {
        number 32, true
    }
    field(:flags, 36) {
        global :BuildingFlags
    }
    field(:mat_type, 40) {
        number 16, true, -1
    }
    field(:mat_index, 44) {
        number 32, true, -1
    }
    field(:room, 48) {
        global :BuildingExtents
    }
    field(:age, 72) {
        number 32, true
    }
    field(:race, 76) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:id, 80) {
        number 32, true, -1
    }
    field(:jobs, 88) {
        stl_vector(8) {
            pointer {
                global :Job
            }
        }
    }
    field(:specific_refs, 112) {
        stl_vector(8) {
            pointer {
                global :SpecificRef
            }
        }
    }
    field(:general_refs, 136) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:is_room, 160) {
        number 8, true, nil, BooleanEnum
    }
    field(:children, 168) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:parents, 192) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:owner_id, 216) {
        number 32, true, -1
    }
    def owner_tg ; df.world.units.all.binsearch(owner_id) ; end
    field(:owner, 224) {
        pointer {
            global :Unit
        }
    }
    field(:job_claim_suppress, 232) {
        stl_vector(8) {
            pointer {
                compound(:Building_TJobClaimSuppress) {
                    sizeof 16

                    field(:unit, 0) {
                        pointer {
                            global :Unit
                        }
                    }
                    field(:timer, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:name, 256) {
        stl_string
    }
    field(:activities, 288) {
        stl_vector(8) {
            pointer {
                compound(:Building_TActivities) {
                    sizeof 8

                    field(:activity_id, 0) {
                        number 32, true, -1
                    }
                    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
                    field(:event_id, 4) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
    field(:world_data_id, 312) {
        number 32, true, -1
    }
    def world_data_tg ; df.world.world_data.object_data.binsearch(world_data_id) ; end
    field(:world_data_subid, 316) {
        number 32, true, -1
    }
    field(:unk_v40_2, 320) {
        number 32, true, -1
    }
    field(:site_id, 324) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:location_id, 328) {
        number 32, true, -1
    }
    field(:unk_v40_3, 332) {
        number 32, true, -1
    }
    def getCustomType()
        val = DFHack.vmethod_call(self, 0)
    end
    def setCustomType(type)
        DFHack.vmethod_call(self, 8, type) ; nil
    end
    def countHospitalSupplies(supplies)
        DFHack.vmethod_call(self, 16, supplies) ; nil
    end
    def countTavernSupplies(supplies)
        DFHack.vmethod_call(self, 24, supplies) ; nil
    end
    def getStockpileLinks()
        ptr = DFHack.vmethod_call(self, 32)
        class << self
            global :StockpileLinks
        end._at(ptr) if ptr != 0
    end
    def detachWorldData()
        DFHack.vmethod_call(self, 40) ; nil
    end
    def canLinkToStockpile()
        val = DFHack.vmethod_call(self, 48)
        (val & 1) != 0
    end
    def getUsers()
        ptr = DFHack.vmethod_call(self, 56)
        class << self
            global :BuildingUsers
        end._at(ptr) if ptr != 0
    end
    def moveBuilding(delta_x, delta_y, delta_z)
        DFHack.vmethod_call(self, 64, delta_x, delta_y, delta_z) ; nil
    end
    def initOccupancy(abs_x, abs_y)
        DFHack.vmethod_call(self, 72, abs_x, abs_y) ; nil
    end
    def setFillTimer(arg0, arg1)
        DFHack.vmethod_call(self, 80, JobType.int(arg0), arg1) ; nil
    end
    def isOnFire()
        val = DFHack.vmethod_call(self, 88)
        (val & 1) != 0
    end
    def isUnpowered()
        val = DFHack.vmethod_call(self, 96)
        (val & 1) != 0
    end
    def canCollapse()
        val = DFHack.vmethod_call(self, 104)
        (val & 1) != 0
    end
    def getPassableOccupancy()
        val = DFHack.vmethod_call(self, 112)
        val & ((1 << 32) - 1)
    end
    def getImpassableOccupancy()
        val = DFHack.vmethod_call(self, 120)
        val & ((1 << 32) - 1)
    end
    def isPowerSource()
        val = DFHack.vmethod_call(self, 128)
        (val & 1) != 0
    end
    def updateFromWeather()
        DFHack.vmethod_call(self, 136) ; nil
    end
    def updateTemperature()
        DFHack.vmethod_call(self, 144) ; nil
    end
    def updateItems()
        DFHack.vmethod_call(self, 152) ; nil
    end
    def updateTempFromTile(temp, arg1, arg2)
        DFHack.vmethod_call(self, 160, temp, arg1, arg2) ; nil
    end
    def isNormalFurniture()
        val = DFHack.vmethod_call(self, 168)
        (val & 1) != 0
    end
    def isFarmPlot()
        val = DFHack.vmethod_call(self, 176)
        (val & 1) != 0
    end
    def getWorkshopProfile()
        ptr = DFHack.vmethod_call(self, 184)
        class << self
            global :WorkshopProfile
        end._at(ptr) if ptr != 0
    end
    def getMachineInfo()
        ptr = DFHack.vmethod_call(self, 192)
        class << self
            global :MachineInfo
        end._at(ptr) if ptr != 0
    end
    def getPowerInfo(power_info)
        DFHack.vmethod_call(self, 200, power_info) ; nil
    end
    def canConnectToMachine(arg0)
        val = DFHack.vmethod_call(self, 208, arg0)
        (val & 1) != 0
    end
    def getType()
        BuildingType.sym(DFHack.vmethod_call(self, 216))
    end
    def getSubtype()
        val = DFHack.vmethod_call(self, 224)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def setSubtype(subtype)
        DFHack.vmethod_call(self, 232, subtype) ; nil
    end
    def isActual()
        val = DFHack.vmethod_call(self, 240)
        (val & 1) != 0
    end
    def isCoffin2()
        val = DFHack.vmethod_call(self, 248)
        (val & 1) != 0
    end
    def updateAction()
        DFHack.vmethod_call(self, 256) ; nil
    end
    def isStatueOrRestraint()
        val = DFHack.vmethod_call(self, 264)
        (val & 1) != 0
    end
    def setMaterialAmount(arg0)
        DFHack.vmethod_call(self, 272, arg0) ; nil
    end
    def setBuildStage(stage)
        DFHack.vmethod_call(self, 280, stage) ; nil
    end
    def getBuildStage()
        val = DFHack.vmethod_call(self, 288)
    end
    def getMaxBuildStage()
        val = DFHack.vmethod_call(self, 296)
    end
    def getArchitectureValue()
        val = DFHack.vmethod_call(self, 304)
    end
    def isSettingOccupancy()
        val = DFHack.vmethod_call(self, 312)
        (val & 1) != 0
    end
    def isActual2()
        val = DFHack.vmethod_call(self, 320)
        (val & 1) != 0
    end
    def isExtentShaped()
        val = DFHack.vmethod_call(self, 328)
        (val & 1) != 0
    end
    def updateOccupancy(abs_x, abs_y)
        DFHack.vmethod_call(self, 336, abs_x, abs_y) ; nil
    end
    def getRoomValue(arg0)
        val = DFHack.vmethod_call(self, 344, arg0)
    end
    def getPersonalValue(arg0)
        val = DFHack.vmethod_call(self, 352, arg0)
    end
    def canBeRoom()
        val = DFHack.vmethod_call(self, 360)
        (val & 1) != 0
    end
    def getConstructionValue()
        val = DFHack.vmethod_call(self, 368)
    end
    def queueDestroy()
        DFHack.vmethod_call(self, 376) ; nil
    end
    def isImpassableTile(rel_x, rel_y)
        val = DFHack.vmethod_call(self, 384, rel_x, rel_y)
        (val & 1) != 0
    end
    def getFreeCapacity(subtract_pending_jobs)
        val = DFHack.vmethod_call(self, 392, subtract_pending_jobs)
    end
    def canStoreItem(arg0, subtract_pending_jobs)
        val = DFHack.vmethod_call(self, 400, arg0, subtract_pending_jobs)
        (val & 1) != 0
    end
    def getName(name)
        DFHack.vmethod_call(self, 408, name) ; nil
    end
    def getNameColor()
        DFHack.vmethod_call(self, 416) ; nil
    end
    def initFarmSeasons()
        DFHack.vmethod_call(self, 424) ; nil
    end
    def initBurialFlags()
        DFHack.vmethod_call(self, 432) ; nil
    end
    def clearBurialFlags()
        DFHack.vmethod_call(self, 440) ; nil
    end
    def clearBurialFlags2()
        DFHack.vmethod_call(self, 448) ; nil
    end
    def getClutterLevel()
        val = DFHack.vmethod_call(self, 456)
    end
    def needsDesign()
        val = DFHack.vmethod_call(self, 464)
        (val & 1) != 0
    end
    def canUseForMood(arg0)
        val = DFHack.vmethod_call(self, 472, JobType.int(arg0))
        (val & 1) != 0
    end
    def canBeRoomSubset()
        val = DFHack.vmethod_call(self, 480)
        (val & 1) != 0
    end
    def isCoffin()
        val = DFHack.vmethod_call(self, 488)
        (val & 1) != 0
    end
    def canUseSpouseRoom()
        val = DFHack.vmethod_call(self, 496)
        (val & 1) != 0
    end
    def canMakeRoom()
        val = DFHack.vmethod_call(self, 504)
        (val & 1) != 0
    end
    def isJusticeRestraint()
        val = DFHack.vmethod_call(self, 512)
        (val & 1) != 0
    end
    def detachRestrainedUnit(arg0)
        DFHack.vmethod_call(self, 520, arg0) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 528, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 536, file, SaveVersion.int(loadversion)) ; nil
    end
    def isImpassableAtCreation()
        val = DFHack.vmethod_call(self, 544)
        (val & 1) != 0
    end
    def categorize(in_play)
        DFHack.vmethod_call(self, 552, in_play) ; nil
    end
    def uncategorize()
        DFHack.vmethod_call(self, 560) ; nil
    end
    def getBaseValue()
        val = DFHack.vmethod_call(self, 568)
    end
    def setTriggerState(new_state)
        DFHack.vmethod_call(self, 576, new_state) ; nil
    end
    def checkAdvmodeLocked()
        DFHack.vmethod_call(self, 584) ; nil
    end
    def drawAdvmodeUnlockUI()
        DFHack.vmethod_call(self, 592) ; nil
    end
    def advmodeUnlock(arg0)
        DFHack.vmethod_call(self, 600, arg0) ; nil
    end
    def needsMagma()
        val = DFHack.vmethod_call(self, 608)
        (val & 1) != 0
    end
    def removeUses(noscatter, lost)
        DFHack.vmethod_call(self, 616, noscatter, lost) ; nil
    end
    def deconstructItems(noscatter, lost)
        DFHack.vmethod_call(self, 624, noscatter, lost) ; nil
    end
    def cleanupMap()
        DFHack.vmethod_call(self, 632) ; nil
    end
    def isFireSafe(fire_type)
        val = DFHack.vmethod_call(self, 640, fire_type)
        (val & 1) != 0
    end
    def fillSidebarMenu()
        DFHack.vmethod_call(self, 648) ; nil
    end
    def isForbidden()
        val = DFHack.vmethod_call(self, 656)
        (val & 1) != 0
    end
    def isHidden()
        val = DFHack.vmethod_call(self, 672)
        (val & 1) != 0
    end
    def isVisibleInUI()
        val = DFHack.vmethod_call(self, 680)
        (val & 1) != 0
    end
    def isVisibleInViewport(viewport)
        val = DFHack.vmethod_call(self, 688, viewport)
        (val & 1) != 0
    end
    def getDrawExtents(buffer)
        DFHack.vmethod_call(self, 696, buffer) ; nil
    end
    def drawBuilding(buffer, z_offset)
        DFHack.vmethod_call(self, 704, buffer, z_offset) ; nil
    end
    def setSquadUse(squad, arg1)
        DFHack.vmethod_call(self, 712, squad, arg1) ; nil
    end
    def getSquads()
        ptr = DFHack.vmethod_call(self, 720)
        class << self
            stl_vector(8) {
                pointer {
                    global :BuildingSquadUse
                }
            }
        end._at(ptr) if ptr != 0
    end
    def getSpecificSquad()
        val = DFHack.vmethod_call(self, 728)
    end
    def getSpecificPosition()
        val = DFHack.vmethod_call(self, 736)
    end
    def setSpecificSquadPos(arg0, arg1)
        DFHack.vmethod_call(self, 744, arg0, arg1) ; nil
    end
    def clearSpecificSquad()
        DFHack.vmethod_call(self, 752) ; nil
    end
end

class BuildingActual < Building
    sizeof 376

    rtti_classname :building_actualst

    field(:construction_stage, 336) {
        number 16, true
    }
    field(:contained_items, 344) {
        stl_vector(8) {
            pointer {
                compound(:BuildingActual_TContainedItems) {
                    sizeof 16

                    field(:item, 0) {
                        pointer {
                            global :Item
                        }
                    }
                    field(:use_mode, 8) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:design, 368) {
        pointer {
            global :BuildingDesign
        }
    }
    def isDestroyedByItemRemoval()
        val = DFHack.vmethod_call(self, 776)
        (val & 1) != 0
    end
end

class BuildingAnimaltrapst < BuildingActual
    sizeof 384

    rtti_classname :building_animaltrapst

    field(:bait_type, 376) {
        number 16, true, -1
    }
    field(:fill_timer, 378) {
        number 16, true
    }
end

class BuildingArcherytargetst < BuildingActual
    sizeof 384

    rtti_classname :building_archerytargetst

    field(:archery_direction, 376) {
        class ::DFHack::BuildingArcherytargetst_TArcheryDirection < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :TopToBottom ; NUME[:TopToBottom] = 0
            ENUM[1] = :BottomToTop ; NUME[:BottomToTop] = 1
            ENUM[2] = :LeftToRight ; NUME[:LeftToRight] = 2
            ENUM[3] = :RightToLeft ; NUME[:RightToLeft] = 3
        end

        number 8, true, nil, BuildingArcherytargetst_TArcheryDirection
    }
end

class BuildingArmorstandst < BuildingActual
    sizeof 416

    rtti_classname :building_armorstandst

    field(:unk_c0, 376) {
        number 16, true
    }
    field(:squads, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingSquadUse
            }
        }
    }
    field(:specific_squad, 408) {
        number 32, true, -1
    }
    def specific_squad_tg ; df.world.squads.all.binsearch(specific_squad) ; end
    field(:specific_position, 412) {
        number 32, true, -1
    }
end

class BuildingAxleHorizontalst < BuildingActual
    sizeof 392

    rtti_classname :building_axle_horizontalst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:is_vertical, 384) {
        number 8, true, nil, BooleanEnum
    }
end

class BuildingAxleVerticalst < BuildingActual
    sizeof 384

    rtti_classname :building_axle_verticalst

    field(:machine, 376) {
        global :MachineInfo
    }
end

class BuildingBarsFloorst < BuildingActual
    sizeof 384

    rtti_classname :building_bars_floorst

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingBarsVerticalst < BuildingActual
    sizeof 384

    rtti_classname :building_bars_verticalst

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingBedst < BuildingActual
    sizeof 464

    rtti_classname :building_bedst

    field(:bed_flags, 376) {
        compound(:BuildingBedst_TBedFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:barracks, 0) { bit 0 }
            field(:dormitory, 0) { bit 1 }
        }
    }
    field(:squads, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingSquadUse
            }
        }
    }
    field(:specific_squad, 408) {
        number 32, true, -1
    }
    def specific_squad_tg ; df.world.squads.all.binsearch(specific_squad) ; end
    field(:specific_position, 412) {
        number 32, true, -1
    }
    field(:users, 416) {
        global :BuildingUsers
    }
end

class BuildingBookcasest < BuildingActual
    sizeof 376

    rtti_classname :building_bookcasest

end

class BuildingBoxst < BuildingActual
    sizeof 416

    rtti_classname :building_boxst

    field(:unk_1, 376) {
        number 16, true
    }
    field(:squads, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingSquadUse
            }
        }
    }
    field(:specific_squad, 408) {
        number 32, true, -1
    }
    def specific_squad_tg ; df.world.squads.all.binsearch(specific_squad) ; end
    field(:specific_position, 412) {
        number 32, true, -1
    }
end

class BuildingBridgest < BuildingActual
    sizeof 384

    rtti_classname :building_bridgest

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
    field(:direction, 379) {
        class ::DFHack::BuildingBridgest_TDirection < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :Retracting ; NUME[:Retracting] = -1
            ENUM[0] = :Left ; NUME[:Left] = 0
            ENUM[1] = :Right ; NUME[:Right] = 1
            ENUM[2] = :Up ; NUME[:Up] = 2
            ENUM[3] = :Down ; NUME[:Down] = 3
        end

        number 8, true, nil, BuildingBridgest_TDirection
    }
    field(:material_amount, 380) {
        number 32, true
    }
end

class BuildingCabinetst < BuildingActual
    sizeof 416

    rtti_classname :building_cabinetst

    field(:unk_1, 376) {
        number 16, true
    }
    field(:squads, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingSquadUse
            }
        }
    }
    field(:specific_squad, 408) {
        number 32, true, -1
    }
    def specific_squad_tg ; df.world.squads.all.binsearch(specific_squad) ; end
    field(:specific_position, 412) {
        number 32, true, -1
    }
end

class BuildingCagest < BuildingActual
    sizeof 432

    rtti_classname :building_cagest

    field(:assigned_units, 376) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_units_tg ; assigned_units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:assigned_items, 400) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_items_tg ; assigned_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:cage_flags, 424) {
        compound(:BuildingCagest_TCageFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:triggered, 0) { bit 0 }
        }
    }
    field(:fill_timer, 426) {
        number 16, true
    }
end

class BuildingChainst < BuildingActual
    sizeof 400

    rtti_classname :building_chainst

    field(:assigned, 376) {
        pointer {
            global :Unit
        }
    }
    field(:chained, 384) {
        pointer {
            global :Unit
        }
    }
    field(:chain_flags, 392) {
        compound(:BuildingChainst_TChainFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:triggered, 0) { bit 0 }
        }
    }
end

class BuildingChairst < BuildingActual
    sizeof 432

    rtti_classname :building_chairst

    field(:unk_1, 376) {
        number 16, true
    }
    field(:users, 384) {
        global :BuildingUsers
    }
end

class BuildingCivzonest < Building
    sizeof 512

    rtti_classname :building_civzonest

    field(:assigned_units, 336) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_units_tg ; assigned_units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:assigned_items, 360) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_items_tg ; assigned_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:type, 384) {
        number 32, true, nil, CivzoneType
    }
    field(:zone_flags, 388) {
        compound(:BuildingCivzonest_TZoneFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:water_source, 0) { bit 0 }
            field(:garbage_dump, 0) { bit 1 }
            field(:sand, 0) { bit 2 }
            field(:active, 0) { bit 3 }
            field(:fishing, 0) { bit 4 }
            field(:pit_pond, 0) { bit 5 }
            field(:meeting_area, 0) { bit 6 }
            field(:hospital, 0) { bit 7 }
            field(:pen_pasture, 0) { bit 8 }
            field(:clay, 0) { bit 9 }
            field(:animal_training, 0) { bit 10 }
            field(:gather, 0) { bit 11 }
        }
    }
    field(:unk_1, 392) {
        number 32, true, -1
    }
    field(:unk_2, 396) {
        number 32, true, -1
    }
    field(:zone_num, 400) {
        number 32, true, -1
    }
    field(:unk_3, 404) {
        number 32, true
    }
    field(:pit_flags, 408) {
        compound(:BuildingCivzonest_TPitFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:is_pond, 0) { bit 0 }
        }
    }
    field(:fill_timer, 412) {
        number 16, true
    }
    field(:hospital, 416) {
        global :HospitalSupplies
    }
    field(:gather_flags, 480) {
        compound(:BuildingCivzonest_TGatherFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:pick_trees, 0) { bit 0 }
            field(:pick_shrubs, 0) { bit 1 }
            field(:gather_fallen, 0) { bit 2 }
        }
    }
    field(:gather_update_cooldown, 484) {
        number 32, true
    }
    field(:unk_v43_1, 488) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_v43_1_tg ; unk_v43_1.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class BuildingCoffinst < BuildingActual
    sizeof 384

    rtti_classname :building_coffinst

    field(:burial_mode, 376) {
        compound(:BuildingCoffinst_TBurialMode) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:allow_burial, 0) { bit 0 }
            field(:no_pets, 0) { bit 1 }
            field(:no_citizens, 0) { bit 2 }
        }
    }
end

class BuildingConstructionst < BuildingActual
    sizeof 384

    rtti_classname :building_constructionst

    field(:type, 376) {
        number 16, true, nil, ConstructionType
    }
end

class BuildingDef < MemHack::Compound
    sizeof 16544

    rtti_classname :building_defst

    field(:code, 8) {
        stl_string
    }
    field(:id, 40) {
        number 32, true
    }
    field(:name, 48) {
        stl_string
    }
    field(:building_type, 80) {
        number 32, true, nil, BuildingType
    }
    field(:building_subtype, 84) {
        number 32, true
    }
    field(:name_color, 88) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:tile, 94) {
        static_array(4, 961) {
            static_array(31, 31) {
                static_array(31, 1) {
                    number 8, false
                }
            }
        }
    }
    field(:tile_color, 3938) {
        static_array(3, 3844) {
            static_array(4, 961) {
                static_array(31, 31) {
                    static_array(31, 1) {
                        number 8, false
                    }
                }
            }
        }
    }
    field(:tile_block, 15470) {
        static_array(31, 31) {
            static_array(31, 1) {
                number 8, false
            }
        }
    }
    field(:build_key, 16432) {
        number 4, true
    }
    field(:needs_magma, 16436) {
        number 8, true, nil, BooleanEnum
    }
    field(:build_items, 16440) {
        stl_vector(8) {
            pointer {
                global :BuildingDefItem
            }
        }
    }
    field(:dim_x, 16464) {
        number 32, true
    }
    field(:dim_y, 16468) {
        number 32, true
    }
    field(:workloc_x, 16472) {
        number 32, true
    }
    field(:workloc_y, 16476) {
        number 32, true
    }
    field(:build_labors, 16480) {
        stl_vector(4) {
            number 32, true, nil, UnitLabor
        }
    }
    field(:labor_description, 16504) {
        stl_string
    }
    field(:build_stages, 16536) {
        number 32, true
    }
    def parseRaws(arg0, arg1, arg2, arg3)
        DFHack.vmethod_call(self, 0, arg0, arg1, arg2, arg3) ; nil
    end
    def categorize()
        DFHack.vmethod_call(self, 8) ; nil
    end
    def finalize()
        DFHack.vmethod_call(self, 16) ; nil
    end
end

class BuildingDefFurnacest < BuildingDef
    sizeof 16544

    rtti_classname :building_def_furnacest

end

class BuildingDefItem < MemHack::Compound
    sizeof 304

    field(:item_type, 0) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 2) {
        number 16, true, -1
    }
    field(:mat_type, 4) {
        number 16, true, -1
    }
    field(:mat_index, 6) {
        number 16, true, -1
    }
    field(:reaction_class, 8) {
        stl_string
    }
    field(:has_material_reaction_product, 40) {
        stl_string
    }
    field(:flags1, 72) {
        global :JobItemFlags1
    }
    field(:flags2, 76) {
        global :JobItemFlags2
    }
    field(:flags3, 80) {
        global :JobItemFlags3
    }
    field(:flags4, 84) {
        number 32, false
    }
    field(:flags5, 88) {
        number 32, false
    }
    field(:metal_ore, 92) {
        number 32, true, -1
    }
    def metal_ore_tg ; df.world.raws.inorganics[metal_ore] ; end
    field(:min_dimension, 96) {
        number 32, true
    }
    field(:quantity, 100) {
        number 32, true
    }
    field(:has_tool_use, 104) {
        number 16, true, nil, ToolUses
    }
    field(:item_str, 112) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:material_str, 176) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:metal_ore_str, 272) {
        stl_string
    }
end

class BuildingDefWorkshopst < BuildingDef
    sizeof 16544

    rtti_classname :building_def_workshopst

end

class BuildingDesign < MemHack::Compound
    sizeof 48

    field(:architect, 0) {
        number 32, true, -1
    }
    def architect_tg ; df.world.history.figures.binsearch(architect) ; end
    field(:unk2, 4) {
        number 32, true, -1
    }
    field(:design_skill, 8) {
        number 16, true
    }
    field(:builder1, 12) {
        number 32, true, -1
    }
    def builder1_tg ; df.world.history.figures.binsearch(builder1) ; end
    field(:unk5, 16) {
        number 32, true, -1
    }
    field(:build_skill, 20) {
        number 16, true
    }
    field(:build_timer1, 22) {
        number 16, true
    }
    field(:builder2, 24) {
        number 32, true, -1
    }
    def builder2_tg ; df.world.history.figures.binsearch(builder2) ; end
    field(:build_timer2, 28) {
        number 16, true
    }
    field(:quality1, 30) {
        number 16, true, nil, ItemQuality
    }
    field(:quality2, 32) {
        number 16, true, nil, ItemQuality
    }
    field(:flags, 36) {
        compound(:BuildingDesign_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:rough, 0) { bit 0 }
            field(:built, 0) { bit 1 }
            field(:designed, 0) { bit 2 }
        }
    }
    field(:hitpoints, 40) {
        number 32, true
    }
    field(:max_hitpoints, 44) {
        number 32, true
    }
end

class BuildingDisplayFurniturest < BuildingActual
    sizeof 400

    rtti_classname :building_display_furniturest

    field(:displayed_items, 376) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def displayed_items_tg ; displayed_items.map { |i| df.world.items.all.binsearch(i) } ; end
end

class BuildingDoorst < BuildingActual
    sizeof 384

    rtti_classname :building_doorst

    field(:door_flags, 376) {
        global :DoorFlags
    }
    field(:close_timer, 378) {
        number 16, true
    }
end

class BuildingDrawbuffer < MemHack::Compound
    sizeof 3852

    field(:tile, 0) {
        static_array(31, 31) {
            static_array(31, 1) {
                number 8, false
            }
        }
    }
    field(:fore, 961) {
        static_array(31, 31) {
            static_array(31, 1) {
                number 8, true
            }
        }
    }
    field(:back, 1922) {
        static_array(31, 31) {
            static_array(31, 1) {
                number 8, true
            }
        }
    }
    field(:bright, 2883) {
        static_array(31, 31) {
            static_array(31, 1) {
                number 8, true
            }
        }
    }
    field(:x1, 3844) {
        number 16, true
    }
    field(:x2, 3846) {
        number 16, true
    }
    field(:y1, 3848) {
        number 16, true
    }
    field(:y2, 3850) {
        number 16, true
    }
end

class BuildingExtents < MemHack::Compound
    sizeof 24

    field(:extents, 0) {
        pointer_ary(1) {
            number 8, false, nil, BuildingExtentsType
        }
    }
    field(:x, 8) {
        number 32, true
    }
    field(:y, 12) {
        number 32, true
    }
    field(:width, 16) {
        number 32, true
    }
    field(:height, 20) {
        number 32, true
    }
end

class BuildingFarmplotst < BuildingActual
    sizeof 408

    rtti_classname :building_farmplotst

    field(:plant_id, 376) {
        static_array(4, 2) {
            number 16, true, -1
        }
    }
    field(:material_amount, 384) {
        number 32, true
    }
    field(:farm_flags, 388) {
        compound(:BuildingFarmplotst_TFarmFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:seasonal_fertilize, 0) { bit 0 }
        }
    }
    field(:last_season, 392) {
        number 8, true, :None, Season
    }
    field(:current_fertilization, 396) {
        number 32, true
    }
    field(:max_fertilization, 400) {
        number 32, true
    }
    field(:terrain_purge_timer, 404) {
        number 16, true, 500
    }
end

class BuildingFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:exists, 0) { bit 0 }
    field(:site_blocked, 0) { bit 1 }
    field(:room_collision, 0) { bit 2 }
    field(:justice, 0) { bit 4 }
    field(:almost_deleted, 0) { bit 5 }
    field(:in_update, 0) { bit 6 }
    field(:from_worldgen, 0) { bit 7 }
end

class BuildingFloodgatest < BuildingActual
    sizeof 384

    rtti_classname :building_floodgatest

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingFurnacest < BuildingActual
    sizeof 648

    rtti_classname :building_furnacest

    field(:melt_remainder, 376) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_108, 400) {
        number 16, true
    }
    field(:type, 402) {
        number 16, true, nil, FurnaceType
    }
    field(:profile, 408) {
        global :WorkshopProfile
    }
    field(:custom_type, 640) {
        number 32, true, -1
    }
    def custom_type_tg ; df.world.raws.buildings.all.binsearch(custom_type) ; end
end

class BuildingGearAssemblyst < BuildingActual
    sizeof 392

    rtti_classname :building_gear_assemblyst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:gear_flags, 384) {
        compound(:BuildingGearAssemblyst_TGearFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:disengaged, 0) { bit 0 }
        }
    }
end

class BuildingGrateFloorst < BuildingActual
    sizeof 384

    rtti_classname :building_grate_floorst

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingGrateWallst < BuildingActual
    sizeof 384

    rtti_classname :building_grate_wallst

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingHandler < MemHack::Compound
    sizeof 2272

    rtti_classname :building_handlerst

    field(:all, 8) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:other, 32) {
        global :BuildingsOther
    }
    field(:bad, 2240) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:check_bridge_collapse, 2264) {
        number 8, true, nil, BooleanEnum
    }
    field(:check_machine_collapse, 2265) {
        number 8, true, nil, BooleanEnum
    }
    def get_machine_hookup_list(hookups, type, subtype, x1, y1, x2, y2, z, is_vertical)
        DFHack.vmethod_call(self, 0, hookups, type, subtype, x1, y1, x2, y2, z, is_vertical) ; nil
    end
end

class BuildingHatchst < BuildingActual
    sizeof 384

    rtti_classname :building_hatchst

    field(:door_flags, 376) {
        global :DoorFlags
    }
    field(:close_timer, 378) {
        number 16, true
    }
end

class BuildingHivest < BuildingActual
    sizeof 400

    rtti_classname :building_hivest

    field(:hive_flags, 376) {
        global :HiveFlags
    }
    field(:split_timer, 380) {
        number 32, true
    }
    field(:activity_timer, 384) {
        number 32, true
    }
    field(:install_timer, 388) {
        number 32, true
    }
    field(:gather_timer, 392) {
        number 32, true
    }
end

class BuildingInstrumentst < BuildingActual
    sizeof 384

    rtti_classname :building_instrumentst

    field(:unk_1, 376) {
        number 32, true
    }
end

class BuildingNestBoxst < BuildingActual
    sizeof 384

    rtti_classname :building_nest_boxst

    field(:claimed_by, 376) {
        number 32, true, -1
    }
    def claimed_by_tg ; df.world.units.all.binsearch(claimed_by) ; end
    field(:claim_timeout, 380) {
        number 32, true
    }
end

class BuildingNestst < BuildingActual
    sizeof 376

    rtti_classname :building_nestst

end

class BuildingOfferingPlacest < BuildingActual
    sizeof 376

    rtti_classname :building_offering_placest

end

class BuildingRoadst < BuildingActual
    sizeof 376

    rtti_classname :building_roadst

end

class BuildingRoadDirtst < BuildingRoadst
    sizeof 384

    rtti_classname :building_road_dirtst

    field(:material_amount, 376) {
        number 32, true
    }
end

class BuildingRoadPavedst < BuildingRoadst
    sizeof 384

    rtti_classname :building_road_pavedst

    field(:material_amount, 376) {
        number 32, true
    }
    field(:terrain_purge_timer, 380) {
        number 16, true, 500
    }
end

class BuildingRollersst < BuildingActual
    sizeof 392

    rtti_classname :building_rollersst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:direction, 384) {
        number 32, true, nil, ScrewPumpDirection
    }
    field(:speed, 388) {
        number 32, true, 50000
    }
end

class BuildingScrewPumpst < BuildingActual
    sizeof 392

    rtti_classname :building_screw_pumpst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:pump_energy, 384) {
        number 8, false
    }
    field(:direction, 385) {
        number 8, true, nil, ScrewPumpDirection
    }
    field(:pump_manually, 386) {
        number 8, true, nil, BooleanEnum
    }
end

class BuildingShopst < BuildingActual
    sizeof 392

    rtti_classname :building_shopst

    field(:owner, 376) {
        pointer {
            global :Unit
        }
    }
    field(:timer, 384) {
        number 32, true
    }
    field(:shop_flags, 388) {
        compound(:BuildingShopst_TShopFlags) {
            field(:_whole, 0) {
                number 16, true, 1
            }
            field(:for_sale, 0) { bit 0 }
        }
    }
    field(:type, 390) {
        number 16, true, nil, ShopType
    }
end

class BuildingSiegeenginest < BuildingActual
    sizeof 384

    rtti_classname :building_siegeenginest

    field(:type, 376) {
        number 16, true, nil, SiegeengineType
    }
    field(:facing, 378) {
        class ::DFHack::BuildingSiegeenginest_TFacing < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Left ; NUME[:Left] = 0
            ENUM[1] = :Up ; NUME[:Up] = 1
            ENUM[2] = :Right ; NUME[:Right] = 2
            ENUM[3] = :Down ; NUME[:Down] = 3
        end

        number 8, true, nil, BuildingSiegeenginest_TFacing
    }
    field(:action, 379) {
        class ::DFHack::BuildingSiegeenginest_TAction < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :NotInUse ; NUME[:NotInUse] = 0
            ENUM[1] = :PrepareToFire ; NUME[:PrepareToFire] = 1
            ENUM[2] = :FireAtWill ; NUME[:FireAtWill] = 2
        end

        number 8, true, nil, BuildingSiegeenginest_TAction
    }
    field(:fire_timer, 380) {
        number 8, true
    }
    field(:fill_timer, 382) {
        number 16, true
    }
end

class BuildingSlabst < BuildingActual
    sizeof 384

    rtti_classname :building_slabst

    field(:unk_1, 376) {
        number 16, true
    }
end

class BuildingSquadUse < MemHack::Compound
    sizeof 8

    field(:squad_id, 0) {
        number 32, true, -1
    }
    def squad_tg ; df.world.squads.all.binsearch(squad_id) ; end
    field(:mode, 4) {
        global :SquadUseFlags
    }
end

class BuildingStatuest < BuildingActual
    sizeof 384

    rtti_classname :building_statuest

    field(:unk_1, 376) {
        number 16, true
    }
end

class BuildingStockpilest < Building
    sizeof 2448

    rtti_classname :building_stockpilest

    field(:settings, 336) {
        global :StockpileSettings
    }
    field(:max_barrels, 2216) {
        number 16, true
    }
    field(:max_bins, 2218) {
        number 16, true
    }
    field(:max_wheelbarrows, 2220) {
        number 16, true
    }
    field(:container_type, 2224) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:container_item_id, 2248) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def container_item_tg ; container_item_id.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:container_x, 2272) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:container_y, 2296) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:links, 2320) {
        global :StockpileLinks
    }
    field(:use_links_only, 2416) {
        number 32, true
    }
    field(:stockpile_number, 2420) {
        number 32, true, -1
    }
    field(:linked_stops, 2424) {
        stl_vector(8) {
            pointer {
                global :HaulingStop
            }
        }
    }
end

class BuildingSupportst < BuildingActual
    sizeof 384

    rtti_classname :building_supportst

    field(:support_flags, 376) {
        compound(:BuildingSupportst_TSupportFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:triggered, 0) { bit 0 }
        }
    }
end

class BuildingTablest < BuildingActual
    sizeof 432

    rtti_classname :building_tablest

    field(:table_flags, 376) {
        compound(:BuildingTablest_TTableFlags) {
            field(:_whole, 0) {
                number 16, true
            }
            field(:meeting_hall, 0) { bit 0 }
        }
    }
    field(:users, 384) {
        global :BuildingUsers
    }
end

class BuildingTractionBenchst < BuildingActual
    sizeof 432

    rtti_classname :building_traction_benchst

    field(:unk_1, 376) {
        number 16, true
    }
    field(:users, 384) {
        global :BuildingUsers
    }
end

class BuildingTradedepotst < BuildingActual
    sizeof 384

    rtti_classname :building_tradedepotst

    field(:trade_flags, 376) {
        compound(:BuildingTradedepotst_TTradeFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:trader_requested, 0) { bit 0 }
            field(:anyone_can_trade, 0) { bit 1 }
        }
    }
    field(:accessible, 380) {
        number 8, true
    }
end

class BuildingTrapst < BuildingActual
    sizeof 720

    rtti_classname :building_trapst

    field(:trap_type, 376) {
        number 16, true, nil, TrapType
    }
    field(:state, 378) {
        number 8, false
    }
    field(:ready_timeout, 380) {
        number 16, true
    }
    field(:fill_timer, 382) {
        number 16, true
    }
    field(:stop_flags, 384) {
        compound(:BuildingTrapst_TStopFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:disabled, 0) { bit 0 }
            field(:disabling, 0) { bit 1 }
            field(:enabling, 0) { bit 2 }
        }
    }
    field(:linked_mechanisms, 392) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:observed_by_civs, 416) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def observed_by_civs_tg ; observed_by_civs.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:profile, 440) {
        global :WorkshopProfile
    }
    field(:plate_info, 672) {
        global :PressurePlateInfo
    }
    field(:friction, 696) {
        number 32, true, 50000
    }
    field(:use_dump, 700) {
        number 32, true
    }
    field(:dump_x_shift, 704) {
        number 32, true
    }
    field(:dump_y_shift, 708) {
        number 32, true
    }
    field(:stop_trigger_timer, 712) {
        number 8, true
    }
end

class BuildingUsers < MemHack::Compound
    sizeof 48

    field(:unit, 0) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unit_tg ; unit.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:mode, 24) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class BuildingWagonst < BuildingActual
    sizeof 376

    rtti_classname :building_wagonst

end

class BuildingWaterWheelst < BuildingActual
    sizeof 392

    rtti_classname :building_water_wheelst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:is_vertical, 384) {
        number 8, true, nil, BooleanEnum
    }
    field(:gives_power, 385) {
        number 8, true, nil, BooleanEnum
    }
end

class BuildingWeaponrackst < BuildingActual
    sizeof 416

    rtti_classname :building_weaponrackst

    field(:unk_c0, 376) {
        number 16, true
    }
    field(:squads, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingSquadUse
            }
        }
    }
    field(:specific_squad, 408) {
        number 32, true, -1
    }
    def specific_squad_tg ; df.world.squads.all.binsearch(specific_squad) ; end
end

class BuildingWeaponst < BuildingActual
    sizeof 384

    rtti_classname :building_weaponst

    field(:gate_flags, 376) {
        global :GateFlags
    }
    field(:timer, 378) {
        number 8, true
    }
end

class BuildingWellst < BuildingActual
    sizeof 392

    rtti_classname :building_wellst

    field(:well_flags, 376) {
        compound(:BuildingWellst_TWellFlags) {
            field(:_whole, 0) {
                number 16, true
            }
            field(:lowering, 0) { bit 0 }
            field(:just_raised, 0) { bit 1 }
        }
    }
    field(:unk_1, 378) {
        number 8, true
    }
    field(:bucket_z, 380) {
        number 16, true
    }
    field(:bucket_timer, 382) {
        number 8, true
    }
    field(:check_water_timer, 384) {
        number 16, true
    }
end

class BuildingWindmillst < BuildingActual
    sizeof 400

    rtti_classname :building_windmillst

    field(:machine, 376) {
        global :MachineInfo
    }
    field(:orient_x, 384) {
        number 16, true, -1
    }
    field(:orient_y, 386) {
        number 16, true
    }
    field(:is_working, 388) {
        number 16, true
    }
    field(:visual_rotated, 390) {
        number 8, true, nil, BooleanEnum
    }
    field(:rotate_timer, 392) {
        number 16, true
    }
    field(:orient_timer, 394) {
        number 16, true
    }
end

class BuildingWindowst < BuildingActual
    sizeof 384

    rtti_classname :building_windowst

    field(:unk_1, 376) {
        number 16, true
    }
end

class BuildingWindowGemst < BuildingWindowst
    sizeof 384

    rtti_classname :building_window_gemst

end

class BuildingWindowGlassst < BuildingWindowst
    sizeof 384

    rtti_classname :building_window_glassst

end

class BuildingWorkshopst < BuildingActual
    sizeof 632

    rtti_classname :building_workshopst

    field(:type, 376) {
        number 16, true, nil, WorkshopType
    }
    field(:profile, 384) {
        global :WorkshopProfile
    }
    field(:machine, 616) {
        global :MachineInfo
    }
    field(:custom_type, 624) {
        number 32, true, -1
    }
    def custom_type_tg ; df.world.raws.buildings.all.binsearch(custom_type) ; end
end

class BuildingsOther < MemHack::OtherVectors
    sizeof 2208

    ienum BuildingsOtherId

    field(:IN_PLAY, 0) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:LOCATION_ASSIGNED, 24) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:STOCKPILE, 48) {
        stl_vector(8) {
            pointer {
                global :BuildingStockpilest
            }
        }
    }
    field(:ANY_ZONE, 72) {
        stl_vector(8) {
            pointer {
                global :BuildingCivzonest
            }
        }
    }
    field(:ACTIVITY_ZONE, 96) {
        stl_vector(8) {
            pointer {
                global :BuildingCivzonest
            }
        }
    }
    field(:ANY_ACTUAL, 120) {
        stl_vector(8) {
            pointer {
                global :BuildingActual
            }
        }
    }
    field(:ANY_MACHINE, 144) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:ANY_HOSPITAL_STORAGE, 168) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:ANY_STORAGE, 192) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:ANY_BARRACKS, 216) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:ANY_NOBLE_ROOM, 240) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:ANY_HOSPITAL, 264) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:BOX, 288) {
        stl_vector(8) {
            pointer {
                global :BuildingBoxst
            }
        }
    }
    field(:CABINET, 312) {
        stl_vector(8) {
            pointer {
                global :BuildingCabinetst
            }
        }
    }
    field(:TRAP, 336) {
        stl_vector(8) {
            pointer {
                global :BuildingTrapst
            }
        }
    }
    field(:DOOR, 360) {
        stl_vector(8) {
            pointer {
                global :BuildingDoorst
            }
        }
    }
    field(:FLOODGATE, 384) {
        stl_vector(8) {
            pointer {
                global :BuildingFloodgatest
            }
        }
    }
    field(:HATCH, 408) {
        stl_vector(8) {
            pointer {
                global :BuildingHatchst
            }
        }
    }
    field(:GRATE_WALL, 432) {
        stl_vector(8) {
            pointer {
                global :BuildingGrateWallst
            }
        }
    }
    field(:GRATE_FLOOR, 456) {
        stl_vector(8) {
            pointer {
                global :BuildingGrateFloorst
            }
        }
    }
    field(:BARS_VERTICAL, 480) {
        stl_vector(8) {
            pointer {
                global :BuildingBarsVerticalst
            }
        }
    }
    field(:BARS_FLOOR, 504) {
        stl_vector(8) {
            pointer {
                global :BuildingBarsFloorst
            }
        }
    }
    field(:WINDOW_ANY, 528) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:WELL, 552) {
        stl_vector(8) {
            pointer {
                global :BuildingWellst
            }
        }
    }
    field(:TABLE, 576) {
        stl_vector(8) {
            pointer {
                global :BuildingTablest
            }
        }
    }
    field(:BRIDGE, 600) {
        stl_vector(8) {
            pointer {
                global :BuildingBridgest
            }
        }
    }
    field(:CHAIR, 624) {
        stl_vector(8) {
            pointer {
                global :BuildingChairst
            }
        }
    }
    field(:TRADE_DEPOT, 648) {
        stl_vector(8) {
            pointer {
                global :BuildingTradedepotst
            }
        }
    }
    field(:NEST, 672) {
        stl_vector(8) {
            pointer {
                global :BuildingNestst
            }
        }
    }
    field(:NEST_BOX, 696) {
        stl_vector(8) {
            pointer {
                global :BuildingNestBoxst
            }
        }
    }
    field(:BOOKCASE, 720) {
        stl_vector(8) {
            pointer {
                global :BuildingBookcasest
            }
        }
    }
    field(:DISPLAY_CASE, 744) {
        stl_vector(8) {
            pointer {
                global :BuildingDisplayFurniturest
            }
        }
    }
    field(:HIVE, 768) {
        stl_vector(8) {
            pointer {
                global :BuildingHivest
            }
        }
    }
    field(:WAGON, 792) {
        stl_vector(8) {
            pointer {
                global :BuildingWagonst
            }
        }
    }
    field(:SHOP, 816) {
        stl_vector(8) {
            pointer {
                global :BuildingShopst
            }
        }
    }
    field(:BED, 840) {
        stl_vector(8) {
            pointer {
                global :BuildingBedst
            }
        }
    }
    field(:TRACTION_BENCH, 864) {
        stl_vector(8) {
            pointer {
                global :BuildingTractionBenchst
            }
        }
    }
    field(:ANY_ROAD, 888) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:FARM_PLOT, 912) {
        stl_vector(8) {
            pointer {
                global :BuildingFarmplotst
            }
        }
    }
    field(:GEAR_ASSEMBLY, 936) {
        stl_vector(8) {
            pointer {
                global :BuildingGearAssemblyst
            }
        }
    }
    field(:ROLLERS, 960) {
        stl_vector(8) {
            pointer {
                global :BuildingRollersst
            }
        }
    }
    field(:AXLE_HORIZONTAL, 984) {
        stl_vector(8) {
            pointer {
                global :BuildingAxleHorizontalst
            }
        }
    }
    field(:AXLE_VERTICAL, 1008) {
        stl_vector(8) {
            pointer {
                global :BuildingAxleVerticalst
            }
        }
    }
    field(:SUPPORT, 1032) {
        stl_vector(8) {
            pointer {
                global :BuildingSupportst
            }
        }
    }
    field(:ARCHERY_TARGET, 1056) {
        stl_vector(8) {
            pointer {
                global :BuildingArcherytargetst
            }
        }
    }
    field(:SCREW_PUMP, 1080) {
        stl_vector(8) {
            pointer {
                global :BuildingScrewPumpst
            }
        }
    }
    field(:WATER_WHEEL, 1104) {
        stl_vector(8) {
            pointer {
                global :BuildingWaterWheelst
            }
        }
    }
    field(:WINDMILL, 1128) {
        stl_vector(8) {
            pointer {
                global :BuildingWindmillst
            }
        }
    }
    field(:CHAIN, 1152) {
        stl_vector(8) {
            pointer {
                global :BuildingChainst
            }
        }
    }
    field(:CAGE, 1176) {
        stl_vector(8) {
            pointer {
                global :BuildingCagest
            }
        }
    }
    field(:STATUE, 1200) {
        stl_vector(8) {
            pointer {
                global :BuildingStatuest
            }
        }
    }
    field(:SLAB, 1224) {
        stl_vector(8) {
            pointer {
                global :BuildingSlabst
            }
        }
    }
    field(:COFFIN, 1248) {
        stl_vector(8) {
            pointer {
                global :BuildingCoffinst
            }
        }
    }
    field(:WEAPON_RACK, 1272) {
        stl_vector(8) {
            pointer {
                global :BuildingWeaponrackst
            }
        }
    }
    field(:ARMOR_STAND, 1296) {
        stl_vector(8) {
            pointer {
                global :BuildingArmorstandst
            }
        }
    }
    field(:FURNACE_ANY, 1320) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_WOOD, 1344) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_SMELTER_ANY, 1368) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_SMELTER_MAGMA, 1392) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_KILN_ANY, 1416) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_GLASS_ANY, 1440) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:FURNACE_CUSTOM, 1464) {
        stl_vector(8) {
            pointer {
                global :BuildingFurnacest
            }
        }
    }
    field(:WORKSHOP_ANY, 1488) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_BUTCHER, 1512) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_MASON, 1536) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_KENNEL, 1560) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_FISHERY, 1584) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_JEWELER, 1608) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_LOOM, 1632) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_TANNER, 1656) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_DYER, 1680) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_MILL_ANY, 1704) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_QUERN, 1728) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_TOOL, 1752) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_MILLSTONE, 1776) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_KITCHEN, 1800) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_STILL, 1824) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_FARMER, 1848) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_ASHERY, 1872) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_CARPENTER, 1896) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_CRAFTSDWARF, 1920) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_MECHANIC, 1944) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_SIEGE, 1968) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_CLOTHIER, 1992) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_LEATHER, 2016) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_BOWYER, 2040) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_MAGMA_FORGE, 2064) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_FORGE_ANY, 2088) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WORKSHOP_CUSTOM, 2112) {
        stl_vector(8) {
            pointer {
                global :BuildingWorkshopst
            }
        }
    }
    field(:WEAPON_UPRIGHT, 2136) {
        stl_vector(8) {
            pointer {
                global :BuildingWeaponst
            }
        }
    }
    field(:INSTRUMENT_STATIONARY, 2160) {
        stl_vector(8) {
            pointer {
                global :BuildingInstrumentst
            }
        }
    }
    field(:OFFERING_PLACE, 2184) {
        stl_vector(8) {
            pointer {
                global :BuildingOfferingPlacest
            }
        }
    }
end

class Burrow < MemHack::Compound
    sizeof 152

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        stl_string
    }
    field(:tile, 40) {
        number 8, false
    }
    field(:fg_color, 42) {
        number 16, true
    }
    field(:bg_color, 44) {
        number 16, true
    }
    field(:block_x, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:block_y, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:block_z, 96) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:units, 120) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def units_tg ; units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:limit_workshops, 144) {
        number 32, true
    }
end

class Campfire < MemHack::Compound
    sizeof 12

    field(:pos, 0) {
        global :Coord
    }
    field(:timer, 8) {
        number 32, true
    }
end

class CaravanState < MemHack::Compound
    sizeof 8512

    field(:total_capacity, 0) {
        number 32, true
    }
    field(:unk_1, 4) {
        number 32, true
    }
    field(:trade_state, 8) {
        class ::DFHack::CaravanState_TTradeState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :None ; NUME[:None] = 0
            ENUM[1] = :Approaching ; NUME[:Approaching] = 1
            ENUM[2] = :AtDepot ; NUME[:AtDepot] = 2
            ENUM[3] = :Leaving ; NUME[:Leaving] = 3
            ENUM[4] = :Stuck ; NUME[:Stuck] = 4
        end

        number 8, true, nil, CaravanState_TTradeState
    }
    field(:depot_notified, 9) {
        number 8, true
    }
    field(:time_remaining, 10) {
        number 16, true
    }
    field(:entity, 12) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:activity_stats, 16) {
        global :EntityActivityStatistics
    }
    field(:flags, 8416) {
        compound(:CaravanState_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:check_cleanup, 0) { bit 0 }
            field(:casualty, 0) { bit 1 }
            field(:hardship, 0) { bit 2 }
            field(:communicate, 0) { bit 3 }
            field(:seized, 0) { bit 4 }
            field(:offended, 0) { bit 5 }
            field(:announce, 0) { bit 6 }
            field(:greatly_offended, 0) { bit 7 }
            field(:tribute, 0) { bit 8 }
        }
    }
    field(:import_value, 8420) {
        number 32, true
    }
    field(:export_value_total, 8424) {
        number 32, true
    }
    field(:export_value_personal, 8428) {
        number 32, true
    }
    field(:offer_value, 8432) {
        number 32, true
    }
    field(:animals, 8440) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def animals_tg ; animals.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:sell_prices, 8464) {
        pointer {
            global :EntitySellPrices
        }
    }
    field(:buy_prices, 8472) {
        pointer {
            global :EntityBuyPrices
        }
    }
    field(:goods, 8480) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def goods_tg ; goods.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:mood, 8504) {
        number 32, true
    }
    field(:unk_2, 8508) {
        number 32, true
    }
end

class CasteAttack < MemHack::Compound
    sizeof 448

    field(:name, 0) {
        stl_string
    }
    field(:verb_3rd, 32) {
        stl_string
    }
    field(:verb_2nd, 64) {
        stl_string
    }
    field(:flags, 96) {
        compound(:CasteAttack_TFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:with, 0) { bit 0 }
            field(:latch, 0) { bit 1 }
            field(:main, 0) { bit 2 }
            field(:edge, 0) { bit 3 }
        }
    }
    field(:specialattack_type, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:specialattack_mat_type, 128) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:specialattack_mat_index, 152) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:specialattack_mat_state, 176) {
        stl_vector(2) {
            global :MatterState
        }
    }
    field(:specialattack_temp_mat, 200) {
        static_array(3, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:specialattack_min, 272) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:specialattack_max, 296) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:contact_perc, 320) {
        number 32, true
    }
    field(:penetration_perc, 324) {
        number 32, true
    }
    field(:unk_v40_1, 328) {
        number 16, true
    }
    field(:unk_v40_2, 330) {
        number 16, true
    }
    field(:body_part_idx, 336) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:tissue_layer_idx, 360) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:skill, 384) {
        number 16, true, nil, JobSkill
    }
    field(:velocity_modifier, 388) {
        number 32, true
    }
    field(:specialattack_interaction_tmp_name, 392) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:specialattack_interaction_id, 416) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v40_3, 440) {
        number 32, true
    }
    field(:unk_v40_4, 444) {
        number 32, true
    }
end

class CasteBodyInfo < MemHack::Compound
    sizeof 464

    field(:body_parts, 0) {
        stl_vector(8) {
            pointer {
                global :BodyPartRaw
            }
        }
    }
    field(:attacks, 24) {
        stl_vector(8) {
            pointer {
                global :CasteAttack
            }
        }
    }
    field(:interactions, 48) {
        stl_vector(8) {
            pointer {
                compound(:CasteBodyInfo_TInteractions) {
                    sizeof 752

                    field(:type, 0) {
                        class ::DFHack::CasteBodyInfo_TInteractions_TType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :RETRACT_INTO_BP ; NUME[:RETRACT_INTO_BP] = 0
                            ENUM[1] = :CAN_DO_INTERACTION ; NUME[:CAN_DO_INTERACTION] = 1
                            ENUM[2] = :ROOT_AROUND ; NUME[:ROOT_AROUND] = 2
                        end

                        number 32, true, nil, CasteBodyInfo_TInteractions_TType
                    }
                    field(:interaction, 8) {
                        global :CreatureInteraction
                    }
                }
            }
        }
    }
    field(:extra_butcher_objects, 72) {
        stl_vector(8) {
            pointer {
                compound(:CasteBodyInfo_TExtraButcherObjects) {
                    sizeof 224

                    field(:unk_1, 0) {
                        number 16, true
                    }
                    field(:unk_2, 8) {
                        stl_string
                    }
                    field(:unk_3, 40) {
                        number 32, true
                    }
                    field(:unk_4, 48) {
                        stl_string
                    }
                    field(:unk_5, 80) {
                        stl_string
                    }
                    field(:unk_6, 112) {
                        stl_string
                    }
                    field(:unk_7, 144) {
                        stl_string
                    }
                    field(:unk_8, 176) {
                        stl_string
                    }
                    field(:unk_9, 208) {
                        number 16, true
                    }
                    field(:unk_10, 210) {
                        number 16, true
                    }
                    field(:unk_11, 212) {
                        number 16, true
                    }
                    field(:unk_12, 216) {
                        number 32, true
                    }
                    field(:unk_13, 220) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:total_relsize, 96) {
        number 32, true
    }
    field(:layer_part, 104) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:layer_idx, 128) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:numbered_masks, 152) {
        stl_vector(4) {
            number 32, false
        }
    }
    field(:layer_nonsolid, 176) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:nonsolid_layers, 200) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:flags, 224) {
        compound(:CasteBodyInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:unk0, 0) { bit 0 }
        }
    }
    field(:gait_info, 232) {
        static_array(5, 24, GaitType) {
            stl_vector(8) {
                pointer {
                    global :GaitInfo
                }
            }
        }
    }
    field(:materials, 352) {
        global :MaterialVecRef
    }
    field(:fraction_total, 400) {
        number 32, true
    }
    field(:fraction_base, 404) {
        number 32, true
    }
    field(:fraction_fat, 408) {
        number 32, true
    }
    field(:fraction_muscle, 412) {
        number 32, true
    }
    field(:unk_v40_2, 416) {
        static_array(11, 4) {
            number 32, true
        }
    }
end

class CasteClothingItem < MemHack::Compound
    sizeof 80

    field(:body_part_id, 0) {
        number 16, true
    }
    field(:unk_4, 4) {
        number 32, true
    }
    field(:item, 8) {
        static_array(3, 8) {
            pointer {
                global :Item
            }
        }
    }
    field(:unk_14, 32) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:size, 44) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:permit, 56) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:unk_38, 68) {
        static_array(3, 4) {
            number 32, true
        }
    }
end

class CasteRaw < MemHack::Compound
    sizeof 17112

    field(:caste_id, 0) {
        stl_string
    }
    field(:caste_name, 32) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:vermin_bite_txt, 128) {
        stl_string
    }
    field(:gnawer_txt, 160) {
        stl_string
    }
    field(:baby_name, 192) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:child_name, 256) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:itemcorpse_str, 320) {
        static_array(5, 32) {
            stl_string
        }
    }
    field(:remains, 480) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:description, 544) {
        stl_string
    }
    field(:mannerisms, 576) {
        static_array(17, 32) {
            stl_string
        }
    }
    field(:caste_tile, 1120) {
        number 8, false
    }
    field(:caste_soldier_tile, 1121) {
        number 8, false
    }
    field(:caste_alttile, 1122) {
        number 8, false
    }
    field(:caste_soldier_alttile, 1123) {
        number 8, false
    }
    field(:caste_glowtile, 1124) {
        number 8, false
    }
    field(:homeotherm, 1126) {
        number 16, false
    }
    field(:min_temp, 1128) {
        number 16, false
    }
    field(:max_temp, 1130) {
        number 16, false
    }
    field(:fixed_temp, 1132) {
        number 16, false
    }
    field(:caste_color, 1134) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:misc, 1140) {
        compound(:CasteRaw_TMisc) {
            field(:litter_size_min, 0) {
                number 16, true
            }
            field(:litter_size_max, 2) {
                number 16, true
            }
            field(:penetratepower, 4) {
                number 16, true
            }
            field(:vermin_bite_chance, 6) {
                number 16, true
            }
            field(:grasstrample, 8) {
                number 16, true
            }
            field(:buildingdestroyer, 10) {
                number 16, true
            }
            field(:itemcorpse_itemtype, 12) {
                number 16, true, nil, ItemType
            }
            field(:itemcorpse_itemsubtype, 14) {
                number 16, true
            }
            field(:itemcorpse_materialtype, 16) {
                number 16, true, -1
            }
            field(:itemcorpse_materialindex, 18) {
                number 16, true
            }
            field(:itemcorpse_quality, 20) {
                number 16, true
            }
            field(:remains_color, 22) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:difficulty, 28) {
                number 16, true
            }
            field(:caste_glowcolor, 30) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:beach_frequency, 36) {
                number 16, true
            }
            field(:clutch_size_min, 38) {
                number 16, true
            }
            field(:clutch_size_max, 40) {
                number 16, true
            }
            field(:vision_arc_min, 42) {
                number 16, true
            }
            field(:vision_arc_max, 44) {
                number 16, true
            }
            field(:speed, 48) {
                number 32, true
            }
            field(:modvalue, 52) {
                number 32, true
            }
            field(:petvalue, 56) {
                number 32, true
            }
            field(:milkable, 60) {
                number 32, true
            }
            field(:viewrange, 64) {
                number 32, true
            }
            field(:maxage_min, 68) {
                number 32, true
            }
            field(:maxage_max, 72) {
                number 32, true
            }
            field(:baby_age, 76) {
                number 32, true
            }
            field(:child_age, 80) {
                number 32, true
            }
            field(:swim_speed, 84) {
                number 32, true
            }
            field(:trade_capacity, 88) {
                number 32, true
            }
            field(:unk4, 92) {
                number 32, true
            }
            field(:pop_ratio, 96) {
                number 32, true
            }
            field(:adult_size, 100) {
                number 32, true
            }
            field(:bone_mat, 104) {
                number 32, true, -1
            }
            field(:bone_matidx, 108) {
                number 32, true
            }
            field(:fish_mat_index, 112) {
                number 32, true, -1
            }
            field(:egg_mat_index, 116) {
                number 32, true, -1
            }
            field(:attack_trigger, 120) {
                static_array(3, 4) {
                    number 32, true
                }
            }
            field(:egg_size, 132) {
                number 32, true
            }
            field(:grazer, 136) {
                number 32, true
            }
            field(:petvalue_divisor, 140) {
                number 32, true
            }
            field(:prone_to_rage, 144) {
                number 32, true
            }
            field(:unk6, 148) {
                static_array(29, 4) {
                    number 32, true
                }
            }
        }
    }
    field(:personality, 1404) {
        compound(:CasteRaw_TPersonality) {
            field(:a, 0) {
                static_array(50, 2, PersonalityFacetType) {
                    number 16, true
                }
            }
            field(:b, 100) {
                static_array(50, 2, PersonalityFacetType) {
                    number 16, true
                }
            }
            field(:c, 200) {
                static_array(50, 2, PersonalityFacetType) {
                    number 16, true
                }
            }
        }
    }
    field(:flags, 1704) {
        df_flagarray(CasteRawFlags)
    }
    field(:index, 1720) {
        number 32, true
    }
    field(:body_info, 1728) {
        global :CasteBodyInfo
    }
    field(:caste_speech_1, 2192) {
        stl_vector
    }
    field(:caste_speech_2, 2216) {
        stl_vector
    }
    field(:skill_rates, 2240) {
        static_array(4, 588) {
            static_array(147, 4, JobSkill) {
                number 32, true
            }
        }
    }
    field(:attributes, 4592) {
        compound(:CasteRaw_TAttributes) {
            field(:phys_att_range, 0) {
                static_array(6, 28, PhysicalAttributeType) {
                    static_array(7, 4) {
                        number 32, true
                    }
                }
            }
            field(:ment_att_range, 168) {
                static_array(13, 28, MentalAttributeType) {
                    static_array(7, 4) {
                        number 32, true
                    }
                }
            }
            field(:phys_att_rates, 532) {
                static_array(6, 16, PhysicalAttributeType) {
                    static_array(4, 4) {
                        number 32, true
                    }
                }
            }
            field(:ment_att_rates, 628) {
                static_array(13, 16, MentalAttributeType) {
                    static_array(4, 4) {
                        number 32, true
                    }
                }
            }
            field(:phys_att_cap_perc, 836) {
                static_array(6, 4, PhysicalAttributeType) {
                    number 32, true
                }
            }
            field(:ment_att_cap_perc, 860) {
                static_array(13, 4, MentalAttributeType) {
                    number 32, true
                }
            }
        }
    }
    field(:sex, 5504) {
        number 8, true, nil, PronounType
    }
    field(:orientation_male, 5508) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:orientation_female, 5520) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:body_size_1, 5536) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:body_size_2, 5560) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:body_appearance_modifiers, 5584) {
        stl_vector(8) {
            pointer {
                global :BodyAppearanceModifier
            }
        }
    }
    field(:bp_appearance, 5608) {
        compound(:CasteRaw_TBpAppearance) {
            field(:modifiers, 0) {
                stl_vector(8) {
                    pointer {
                        global :BpAppearanceModifier
                    }
                }
            }
            field(:modifier_idx, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            field(:part_idx, 48) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:layer_idx, 72) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:style_part_idx, 96) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:style_layer_idx, 120) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:style_list_idx, 144) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
        }
    }
    field(:color_modifiers, 5776) {
        stl_vector(8) {
            pointer {
                global :ColorModifierRaw
            }
        }
    }
    field(:tissue_styles, 5800) {
        stl_vector(8) {
            pointer {
                global :TissueStyleRaw
            }
        }
    }
    field(:shearable_tissue_layer, 5824) {
        stl_vector(8) {
            pointer {
                compound(:CasteRaw_TShearableTissueLayer) {
                    sizeof 80

                    field(:unk_0, 0) {
                        number 8, true
                    }
                    field(:unk_1, 1) {
                        number 8, true
                    }
                    field(:length, 4) {
                        number 32, true
                    }
                    field(:part_idx, 8) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:layer_idx, 32) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:bp_modifiers_idx, 56) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:unk16a, 5848) {
        static_array(4, 24) {
            stl_vector
        }
    }
    field(:unk16b, 5944) {
        static_array(4, 24) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:appearance_gene_count, 6040) {
        number 32, true
    }
    field(:color_gene_count, 6044) {
        number 32, true
    }
    field(:natural_skill_id, 6048) {
        stl_vector(2) {
            number 16, true, nil, JobSkill
        }
    }
    field(:natural_skill_exp, 6072) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:natural_skill_lvl, 6096) {
        stl_vector(4) {
            global :SkillRating
        }
    }
    field(:caste_profession_name, 6120) {
        compound(:CasteRaw_TCasteProfessionName) {
            field(:singular, 0) {
                static_array(135, 32, Profession) {
                    stl_string
                }
            }
            field(:plural, 4320) {
                static_array(135, 32, Profession) {
                    stl_string
                }
            }
        }
    }
    field(:extracts, 14760) {
        compound(:CasteRaw_TExtracts) {
            field(:extract_mat, 0) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:extract_matidx, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:extract_str, 48) {
                static_array(3, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
            field(:milkable_mat, 120) {
                number 16, true
            }
            field(:milkable_matidx, 124) {
                number 32, true
            }
            field(:milkable_str, 128) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:webber_mat, 224) {
                number 16, true
            }
            field(:webber_matidx, 228) {
                number 32, true
            }
            field(:webber_str, 232) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:vermin_bite_mat, 328) {
                number 16, true
            }
            field(:vermin_bite_matidx, 332) {
                number 32, true
            }
            field(:vermin_bite_chance, 336) {
                number 16, true
            }
            field(:vermin_bite_str, 344) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:tendons_mat, 440) {
                number 16, true
            }
            field(:tendons_matidx, 444) {
                number 32, true
            }
            field(:tendons_str, 448) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:tendons_heal, 544) {
                number 32, true
            }
            field(:ligaments_mat, 548) {
                number 16, true
            }
            field(:ligaments_matidx, 552) {
                number 32, true
            }
            field(:ligaments_str, 560) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:ligaments_heal, 656) {
                number 32, true
            }
            field(:blood_state, 660) {
                number 16, true
            }
            field(:blood_mat, 662) {
                number 16, true
            }
            field(:blood_matidx, 664) {
                number 32, true
            }
            field(:blood_str, 672) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:pus_state, 768) {
                number 16, true
            }
            field(:pus_mat, 770) {
                number 16, true
            }
            field(:pus_matidx, 772) {
                number 32, true
            }
            field(:pus_str, 776) {
                static_array(3, 32) {
                    stl_string
                }
            }
            field(:egg_material_mattype, 872) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:egg_material_matindex, 896) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:egg_material_str, 920) {
                static_array(3, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
            field(:lays_unusual_eggs_itemtype, 992) {
                stl_vector(2) {
                    number 16, true, nil, ItemType
                }
            }
            field(:lays_unusual_eggs_itemsubtype, 1016) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:lays_unusual_eggs_mattype, 1040) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:lays_unusual_eggs_matindex, 1064) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:lays_unusual_eggs_str, 1088) {
                static_array(5, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
        }
    }
    field(:secretion, 15968) {
        stl_vector(8) {
            pointer {
                compound(:CasteRaw_TSecretion) {
                    sizeof 168

                    field(:mat_type, 0) {
                        number 16, true, -1
                    }
                    field(:mat_index, 4) {
                        number 32, true
                    }
                    field(:mat_state, 8) {
                        number 16, true, nil, MatterState
                    }
                    field(:mat_type_str, 16) {
                        stl_string
                    }
                    field(:mat_index_str, 48) {
                        stl_string
                    }
                    field(:unk_44, 80) {
                        stl_string
                    }
                    field(:body_part_id, 112) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:layer_id, 136) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:cause, 160) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:creature_class, 15992) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unknown2, 16016) {
        compound(:CasteRaw_TUnknown2) {
            field(:syndrome_dilution_identifier, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:syndrome_dilution_factor, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:gobble_vermin_class, 48) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:gobble_vermin_creature_1, 72) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:gobble_vermin_creature_2, 96) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:infect_all, 120) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def infect_all_tg ; infect_all.map { |i| df.world.raws.syndromes.all[i] } ; end
            field(:infect_local, 144) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def infect_local_tg ; infect_local.map { |i| df.world.raws.syndromes.all[i] } ; end
            field(:unk23f, 168) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk23g, 192) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk24_flags, 216) {
                df_flagarray
            }
            field(:unk25_flags, 232) {
                df_flagarray
            }
            field(:armor_sizes, 248) {
                static_array(4, 16) {
                    static_array(4, 4) {
                        number 32, true
                    }
                }
            }
            field(:pants_sizes, 312) {
                static_array(4, 4) {
                    number 32, true
                }
            }
            field(:helm_size, 328) {
                number 32, true
            }
            field(:shield_sizes, 332) {
                static_array(4, 4) {
                    number 32, true
                }
            }
            field(:shoes_sizes, 348) {
                static_array(4, 4) {
                    number 32, true
                }
            }
            field(:gloves_sizes, 364) {
                static_array(4, 4) {
                    number 32, true
                }
            }
            field(:materials, 384) {
                global :MaterialVecRef
            }
            field(:unk_2f20, 432) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_2f30, 456) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:unk_2f40, 480) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_2f50, 504) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:mat_type, 528) {
                number 16, true, -1
            }
            field(:mat_index, 532) {
                number 32, true
            }
        }
    }
    field(:habit_num, 16552) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:habit_1, 16560) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:habit_2, 16584) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:lair_1, 16608) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:lair_2, 16632) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:lair_characteristic_1, 16656) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:lair_characteristic_2, 16680) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:lair_hunter_speech, 16704) {
        compound(:CasteRaw_TLairHunterSpeech) {
            field(:unk_1, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_2, 24) {
                stl_vector
            }
        }
    }
    field(:unk29, 16752) {
        compound(:CasteRaw_TUnk29) {
            field(:unk_1, 0) {
                stl_vector
            }
            field(:unk_2, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:specific_food, 16800) {
        static_array(2, 24) {
            stl_vector
        }
    }
    field(:sound, 16848) {
        stl_vector(8) {
            pointer {
                compound(:CasteRaw_TSound) {
                    sizeof 112

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true, 100
                    }
                    field(:unk_3, 8) {
                        number 32, true, 1000
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:caption, 16) {
                        static_array(3, 32) {
                            stl_string
                        }
                    }
                }
            }
        }
    }
    field(:sound_alert, 16872) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:sound_peaceful_intermittent, 16896) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:unk_1, 16920) {
        stl_vector(8) {
            pointer {
                compound(:CasteRaw_TUnk1) {
                    sizeof 112

                    field(:unk_1, 0) {
                        stl_string
                    }
                    field(:unk_2, 32) {
                        stl_string
                    }
                    field(:unk_3, 64) {
                        stl_string
                    }
                    field(:unk_4, 96) {
                        number 16, true
                    }
                    field(:unk_5, 100) {
                        number 32, true
                    }
                    field(:unk_6, 104) {
                        number 32, true
                    }
                    field(:unk_7, 108) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:smell_trigger, 16944) {
        number 32, true
    }
    field(:odor_level, 16948) {
        number 32, true
    }
    field(:odor_string, 16952) {
        stl_string
    }
    field(:low_light_vision, 16984) {
        number 32, true
    }
    field(:sense_creature_class_1, 16992) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:sense_creature_class_2, 17016) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:sense_creature_class_3, 17040) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:sense_creature_class_4, 17064) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:sense_creature_class_5, 17088) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class CaveColumn < MemHack::Compound
    sizeof 16

    rtti_classname :cave_columnst

    field(:unk_z1, 8) {
        number 16, true
    }
    field(:unk_z2, 10) {
        number 16, true
    }
    field(:unk_3, 12) {
        number 16, true, 30000
    }
    field(:unk_4, 14) {
        compound(:CaveColumn_TUnk4) {
            field(:_whole, 0) {
                number 8, false
            }
        }
    }
    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
end

class CaveColumnLink < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :CaveColumn
        }
    }
    field(:prev, 8) {
        pointer {
            global :CaveColumnLink
        }
    }
    field(:next, 16) {
        pointer {
            global :CaveColumnLink
        }
    }
end

class CaveColumnRectangle < MemHack::Compound
    sizeof 104

    rtti_classname :cave_column_rectanglest

    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_x1, 12) {
        number 16, true
    }
    field(:unk_y1, 14) {
        number 16, true
    }
    field(:unk_x2, 16) {
        number 16, true
    }
    field(:unk_y2, 18) {
        number 16, true
    }
    field(:z_shift, 20) {
        number 16, true
    }
    field(:unk_6, 24) {
        global :CoordPath
    }
    field(:unk_7, 96) {
        compound(:CaveColumnRectangle_TUnk7) {
            field(:_whole, 0) {
                number 32, true
            }
        }
    }
    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
end

class Chord < MemHack::Compound
    sizeof 64

    field(:name, 0) {
        stl_string
    }
    field(:notes, 32) {
        static_array(5, 4) {
            number 32, true
        }
    }
    field(:chord_size, 52) {
        number 32, true
    }
    field(:unk_3, 56) {
        number 32, true
    }
end

class CieAddTagMask1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:EXTRAVISION, 0) { bit 0 }
    field(:OPPOSED_TO_LIFE, 0) { bit 1 }
    field(:NOT_LIVING, 0) { bit 2 }
    field(:NOEXERT, 0) { bit 3 }
    field(:NOPAIN, 0) { bit 4 }
    field(:NOBREATHE, 0) { bit 5 }
    field(:HAS_BLOOD, 0) { bit 6 }
    field(:NOSTUN, 0) { bit 7 }
    field(:NONAUSEA, 0) { bit 8 }
    field(:NO_DIZZINESS, 0) { bit 9 }
    field(:NO_FEVERS, 0) { bit 10 }
    field(:TRANCES, 0) { bit 11 }
    field(:NOEMOTION, 0) { bit 12 }
    field(:LIKES_FIGHTING, 0) { bit 13 }
    field(:PARALYZEIMMUNE, 0) { bit 14 }
    field(:NOFEAR, 0) { bit 15 }
    field(:NO_EAT, 0) { bit 16 }
    field(:NO_DRINK, 0) { bit 17 }
    field(:NO_SLEEP, 0) { bit 18 }
    field(:MISCHIEVOUS, 0) { bit 19 }
    field(:NO_PHYS_ATT_GAIN, 0) { bit 20 }
    field(:NO_PHYS_ATT_RUST, 0) { bit 21 }
    field(:NOTHOUGHT, 0) { bit 22 }
    field(:NO_THOUGHT_CENTER_FOR_MOVEMENT, 0) { bit 23 }
    field(:CAN_SPEAK, 0) { bit 24 }
    field(:CAN_LEARN, 0) { bit 25 }
    field(:UTTERANCES, 0) { bit 26 }
    field(:CRAZED, 0) { bit 27 }
    field(:BLOODSUCKER, 0) { bit 28 }
    field(:NO_CONNECTIONS_FOR_MOVEMENT, 0) { bit 29 }
    field(:SUPERNATURAL, 0) { bit 30 }
end

class CieAddTagMask2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:NO_AGING, 0) { bit 0 }
    field(:MORTAL, 0) { bit 1 }
    field(:STERILE, 0) { bit 2 }
    field(:FIT_FOR_ANIMATION, 0) { bit 3 }
    field(:FIT_FOR_RESURRECTION, 0) { bit 4 }
end

class CmvAttribute < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:fg, 0) { bits 0, 3, CursesColor }
    field(:bg, 0) { bits 3, 3, CursesColor }
    field(:bright, 0) { bit 6 }
end

class CoinBatch < MemHack::Compound
    sizeof 36

    field(:year, 0) {
        number 32, true
    }
    field(:mat_type, 4) {
        number 16, true, -1
    }
    field(:mat_index, 8) {
        number 32, true
    }
    field(:entity, 12) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:ruler, 16) {
        number 32, true, -1
    }
    def ruler_tg ; df.world.history.figures.binsearch(ruler) ; end
    field(:image_front, 20) {
        compound(:CoinBatch_TImageFront) {
            field(:id, 0) {
                number 32, true, -1
            }
            def id_tg ; df.world.art_image_chunks.binsearch(id) ; end
            field(:subid, 4) {
                number 16, true, -1
            }
        }
    }
    field(:image_back, 28) {
        compound(:CoinBatch_TImageBack) {
            field(:id, 0) {
                number 32, true, -1
            }
            def id_tg ; df.world.art_image_chunks.binsearch(id) ; end
            field(:subid, 4) {
                number 16, true, -1
            }
        }
    }
end

class ColorModifierRaw < MemHack::Compound
    sizeof 208

    field(:pattern_index, 0) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def pattern_index_tg ; pattern_index.map { |i| df.world.raws.descriptors.patterns[i] } ; end
    field(:pattern_frequency, 24) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:body_part_id, 48) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:tissue_layer_id, 72) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:unk5, 96) {
        number 16, true
    }
    field(:start_date, 100) {
        number 32, true
    }
    field(:end_date, 104) {
        number 32, true
    }
    field(:unk6, 108) {
        number 32, true
    }
    field(:part, 112) {
        stl_string
    }
    field(:unk_6c, 144) {
        number 16, true
    }
    field(:unk_6e, 146) {
        number 16, true
    }
    field(:unk_70, 148) {
        number 32, true
    }
    field(:id, 152) {
        number 32, true
    }
    field(:unk_78, 160) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_88, 184) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class Construction < MemHack::Compound
    sizeof 20

    field(:pos, 0) {
        global :Coord
    }
    field(:item_type, 6) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 8) {
        number 16, true, -1
    }
    field(:mat_type, 10) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true
    }
    field(:flags, 16) {
        global :ConstructionFlags
    }
    field(:original_tile, 18) {
        number 16, true, nil, Tiletype
    }
end

class ConstructionFlags < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:no_build_item, 0) { bit 0 }
    field(:top_of_wall, 0) { bit 1 }
end

class Conversation < MemHack::Compound
    sizeof 280

    field(:conv_title, 0) {
        stl_string
    }
    field(:state, 32) {
        class ::DFHack::Conversation_TState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Started ; NUME[:Started] = 0
            ENUM[1] = :Active ; NUME[:Active] = 1
            ENUM[2] = :Finished ; NUME[:Finished] = 2
            ENUM[3] = :Quit ; NUME[:Quit] = 3
        end

        number 32, true, nil, Conversation_TState
    }
    field(:talk_choices, 40) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_30, 64) {
        number 32, true, -1
    }
    def unk_30_tg ; df.world.units.all.binsearch(unk_30) ; end
    field(:unk_34, 68) {
        number 32, true, -1
    }
    def unk_34_tg ; df.world.history.figures.binsearch(unk_34) ; end
    field(:unk_38, 72) {
        number 32, true
    }
    field(:unk_3c, 76) {
        number 32, true, -1
    }
    def unk_3c_tg ; df.world.units.all.binsearch(unk_3c) ; end
    field(:unk_40, 80) {
        number 32, true, -1
    }
    def unk_40_tg ; df.world.history.figures.binsearch(unk_40) ; end
    field(:unk_44, 84) {
        number 32, true
    }
    field(:unk_48, 88) {
        number 32, true, -1
    }
    def unk_48_tg ; df.world.units.all.binsearch(unk_48) ; end
    field(:unk_4c, 92) {
        number 32, true, -1
    }
    def unk_4c_tg ; df.world.history.figures.binsearch(unk_4c) ; end
    field(:unk_50, 96) {
        number 32, true
    }
    field(:unk_54, 104) {
        stl_vector(8) {
            pointer {
                global :NemesisRecord
            }
        }
    }
    field(:unk_64, 128) {
        stl_vector(8) {
            pointer {
                global :HistoricalEntity
            }
        }
    }
    field(:unk_74, 152) {
        number 8, true
    }
    field(:unk_78, 156) {
        number 32, true
    }
    field(:unk_7c, 160) {
        number 32, true
    }
    field(:unk_80, 164) {
        number 16, true
    }
    field(:unk_84, 168) {
        stl_vector
    }
    field(:unk_94, 192) {
        stl_vector
    }
    field(:unk_a4, 216) {
        stl_vector
    }
    field(:location, 240) {
        pointer {
            global :Building
        }
    }
    field(:unk_b8, 248) {
        number 8, true
    }
    field(:unk_bc, 252) {
        number 32, true
    }
    field(:speech, 256) {
        stl_vector(8) {
            pointer {
                compound(:Conversation_TSpeech) {
                    sizeof 48

                    field(:text, 0) {
                        stl_vector(8) {
                            pointer {
                                stl_string
                            }
                        }
                    }
                    field(:speaker, 24) {
                        number 32, true, -1
                    }
                    def speaker_tg ; df.world.units.all.binsearch(speaker) ; end
                    field(:unk_14, 28) {
                        number 32, true
                    }
                    field(:unk_18, 32) {
                        number 32, true
                    }
                    field(:fg, 36) {
                        number 16, true
                    }
                    field(:bg, 38) {
                        number 16, true
                    }
                    field(:bright, 40) {
                        number 16, true
                    }
                }
            }
        }
    }
end

class Coord < MemHack::Compound
    sizeof 6

    field(:x, 0) {
        number 16, true, -30000
    }
    field(:y, 2) {
        number 16, true, -30000
    }
    field(:z, 4) {
        number 16, true, -30000
    }
end

class Coord2d < MemHack::Compound
    sizeof 4

    field(:x, 0) {
        number 16, true, -30000
    }
    field(:y, 2) {
        number 16, true, -30000
    }
end

class Coord2dPath < MemHack::Compound
    sizeof 48

    field(:x, 0) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:y, 24) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class CoordPath < MemHack::Compound
    sizeof 72

    field(:x, 0) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:y, 24) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:z, 48) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class CoordRect < MemHack::Compound
    sizeof 10

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:x2, 4) {
        number 16, true
    }
    field(:y2, 6) {
        number 16, true
    }
    field(:z, 8) {
        number 16, true
    }
end

class CreationZonePwgAlterationst < MemHack::Compound
    sizeof 16

    rtti_classname :creation_zone_pwg_alterationst

    field(:unk_0, 8) {
        number 32, true
    }
    def getType()
        CreationZonePwgAlterationType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class CreationZonePwgAlterationCampst < CreationZonePwgAlterationst
    sizeof 56

    rtti_classname :creation_zone_pwg_alteration_campst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:x1, 20) {
        number 32, true
    }
    field(:y1, 24) {
        number 32, true
    }
    field(:x2, 28) {
        number 32, true
    }
    field(:y2, 32) {
        number 32, true
    }
    field(:unk_2, 36) {
        number 32, true
    }
    field(:unk_3, 40) {
        number 16, true
    }
    field(:unk_4, 42) {
        number 16, true
    }
    field(:unk_5, 44) {
        number 16, true
    }
    field(:unk_6, 46) {
        number 16, true
    }
    field(:unk_7, 48) {
        number 32, true
    }
end

class CreationZonePwgAlterationLocationDeathst < CreationZonePwgAlterationst
    sizeof 72

    rtti_classname :creation_zone_pwg_alteration_location_deathst

    field(:unk_1, 16) {
        compound(:CreationZonePwgAlterationLocationDeathst_TUnk1) {
            field(:unk_1a, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:CreationZonePwgAlterationLocationDeathst_TUnk1_TUnk1a) {
                            sizeof 32

                            field(:unk_1, 0) {
                                number 32, true
                            }
                            field(:unk_2, 4) {
                                number 32, true
                            }
                            field(:unk_3, 8) {
                                number 32, true
                            }
                            field(:unk_4, 12) {
                                number 32, true
                            }
                            field(:unk_5, 16) {
                                number 32, true
                            }
                            field(:unk_6, 20) {
                                number 32, true
                            }
                            field(:unk_7, 24) {
                                number 32, true
                            }
                            field(:unk_8, 28) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_2a, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_2, 64) {
        number 32, true
    }
end

class CreationZonePwgAlterationSrbRuinedst < CreationZonePwgAlterationst
    sizeof 24

    rtti_classname :creation_zone_pwg_alteration_srb_ruinedst

    field(:site_id, 16) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:building_id, 20) {
        number 32, true, -1
    }
end

class CreationZonePwgAlterationSrpRuinedst < CreationZonePwgAlterationst
    sizeof 24

    rtti_classname :creation_zone_pwg_alteration_srp_ruinedst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class CreatureGraphicsAppointment < MemHack::Compound
    sizeof 88

    field(:token, 0) {
        stl_string
    }
    field(:texpos, 32) {
        static_array(6, 4, CreatureGraphicsRole) {
            number 32, true
        }
    }
    field(:texpos_gs, 56) {
        static_array(6, 4, CreatureGraphicsRole) {
            number 32, true
        }
    }
    field(:add_color, 80) {
        static_array(6, 1, CreatureGraphicsRole) {
            number 8, true, nil, BooleanEnum
        }
    }
end

class CreatureHandler < MemHack::Compound
    sizeof 136

    rtti_classname :creature_handlerst

    field(:alphabetic, 8) {
        stl_vector(8) {
            pointer {
                global :CreatureRaw
            }
        }
    }
    field(:all, 32) {
        stl_vector(8) {
            pointer {
                global :CreatureRaw
            }
        }
    }
    field(:num_caste, 56) {
        number 32, true
    }
    field(:list_creature, 64) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:list_caste, 88) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:action_strings, 112) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    def getTile(creature_index, caste_index, alt, soldier)
        val = DFHack.vmethod_call(self, 0, creature_index, caste_index, alt, soldier)
        val & ((1 << 8) - 1)
    end
    def getGlowTile(creature_index, caste_index)
        val = DFHack.vmethod_call(self, 8, creature_index, caste_index)
        val & ((1 << 8) - 1)
    end
end

class CreatureInteraction < MemHack::Compound
    sizeof 744

    field(:bp_required_type, 0) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bp_required_name, 24) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_1, 48) {
        stl_string
    }
    field(:unk_2, 80) {
        stl_string
    }
    field(:material_str0, 112) {
        stl_string
    }
    field(:material_str1, 144) {
        stl_string
    }
    field(:material_str2, 176) {
        stl_string
    }
    field(:material_breath, 208) {
        number 16, true, nil, BreathAttackType
    }
    field(:verb_2nd, 216) {
        stl_string
    }
    field(:verb_3rd, 248) {
        stl_string
    }
    field(:verb_mutual, 280) {
        stl_string
    }
    field(:verb_reverse_2nd, 312) {
        stl_string
    }
    field(:verb_reverse_3rd, 344) {
        stl_string
    }
    field(:target_verb_2nd, 376) {
        stl_string
    }
    field(:target_verb_3rd, 408) {
        stl_string
    }
    field(:interaction_type, 440) {
        stl_string
    }
    field(:type_id, 472) {
        number 32, true, -1
    }
    def type_tg ; df.world.raws.interactions.binsearch(type_id) ; end
    field(:usage_hint, 480) {
        stl_vector(4) {
            global :InteractionSourceUsageHint
        }
    }
    field(:location_hint, 504) {
        stl_vector(4) {
            global :InteractionEffectLocationHint
        }
    }
    field(:flags, 528) {
        compound(:CreatureInteraction_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:CAN_BE_MUTUAL, 0) { bit 0 }
            field(:VERBAL, 0) { bit 1 }
            field(:FREE_ACTION, 0) { bit 2 }
        }
    }
    field(:unk_3, 536) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:target_flags, 560) {
        stl_vector(4) {
            global :CreatureInteractionTargetFlags
        }
    }
    field(:target_ranges, 584) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_4, 608) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:max_target_numbers, 632) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:verbal_speeches, 656) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_5, 680) {
        stl_vector
    }
    field(:adv_name, 704) {
        stl_string
    }
    field(:wait_period, 736) {
        number 32, true
    }
end

class CreatureInteractionEffect < MemHack::Compound
    sizeof 152

    rtti_classname :creature_interaction_effectst

    field(:flags, 8) {
        global :CreatureInteractionEffectFlags
    }
    field(:prob, 12) {
        number 32, true
    }
    field(:start, 16) {
        number 32, true
    }
    field(:peak, 20) {
        number 32, true
    }
    field(:end, 24) {
        number 32, true
    }
    field(:dwf_stretch, 28) {
        number 32, true
    }
    field(:syn_id, 32) {
        number 32, true, -1
    }
    def syn_tg ; df.world.raws.syndromes.all[syn_id] ; end
    field(:id, 36) {
        number 32, true
    }
    field(:syn_index, 40) {
        number 32, true
    }
    field(:moon_phase_min, 44) {
        number 32, true
    }
    field(:moon_phase_max, 48) {
        number 32, true
    }
    field(:counter_trigger, 56) {
        compound(:CreatureInteractionEffect_TCounterTrigger) {
            field(:counter, 0) {
                stl_vector(4) {
                    number 32, true, nil, MiscTraitType
                }
            }
            field(:minval, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:maxval, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:required, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    def getType()
        CreatureInteractionEffectType.sym(DFHack.vmethod_call(self, 0))
    end
    def clone()
        ptr = DFHack.vmethod_call(self, 8)
        class << self
            global :CreatureInteractionEffect
        end._at(ptr) if ptr != 0
    end
    def doAction(arg0, arg1, arg2, intensity, bp_index, bp_layer, arg6)
        DFHack.vmethod_call(self, 24, arg0, arg1, arg2, intensity, bp_index, bp_layer, arg6) ; nil
    end
    def isUntargeted()
        val = DFHack.vmethod_call(self, 32)
        (val & 1) != 0
    end
    def getTargetModes()
        ptr = DFHack.vmethod_call(self, 40)
        class << self
            stl_vector(2) {
                number 16, true, nil, CreatureInteractionEffectTargetMode
            }
        end._at(ptr) if ptr != 0
    end
    def getTargetKeys()
        ptr = DFHack.vmethod_call(self, 48)
        class << self
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        end._at(ptr) if ptr != 0
    end
    def getTargetTissues()
        ptr = DFHack.vmethod_call(self, 56)
        class << self
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        end._at(ptr) if ptr != 0
    end
    def checkAddFlag1(arg0)
        val = DFHack.vmethod_call(self, 64, arg0)
        (val & 1) != 0
    end
    def setBodyMatInteractionName(arg0)
        DFHack.vmethod_call(self, 72, arg0) ; nil
    end
    def parseSynAcquireType(type)
        DFHack.vmethod_call(self, 80, type) ; nil
    end
    def setBodyTransform(race, caste)
        DFHack.vmethod_call(self, 88, race, caste) ; nil
    end
    def addPeriodic(arg0, arg1, arg2)
        DFHack.vmethod_call(self, 96, arg0, arg1, arg2) ; nil
    end
    def addCounterTrigger(arg0, arg1, arg2, arg3)
        DFHack.vmethod_call(self, 104, arg0, arg1, arg2, arg3) ; nil
    end
end

class CreatureInteractionEffectAddSimpleFlagst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_add_simple_flagst

    field(:tags1, 152) {
        global :CieAddTagMask1
    }
    field(:tags2, 156) {
        global :CieAddTagMask2
    }
end

class CreatureInteractionEffectBleedingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_bleedingst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectBlistersst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_blistersst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectBodyAppearanceModifierst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_body_appearance_modifierst

    field(:unk_60, 152) {
        number 16, true
    }
    field(:unk_64, 156) {
        number 32, true
    }
end

class CreatureInteractionEffectBodyMatInteractionst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_body_mat_interactionst

    field(:interaction_name, 152) {
        stl_string
    }
    field(:interaction_id, 184) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction_id) ; end
    field(:unk_8c, 188) {
        number 32, true
    }
    field(:unk_90, 192) {
        number 32, true
    }
    field(:unk_94, 200) {
        stl_string
    }
end

class CreatureInteractionEffectBodyTransformationst < CreatureInteractionEffect
    sizeof 376

    rtti_classname :creature_interaction_effect_body_transformationst

    field(:chance, 152) {
        number 32, true
    }
    field(:race_str, 160) {
        stl_string
    }
    field(:caste_str, 192) {
        stl_string
    }
    field(:race, 224) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def race_tg ; race.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:caste, 248) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:required_creature_flags, 272) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:forbidden_creature_flags, 296) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:required_caste_flags, 320) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:forbidden_caste_flags, 344) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 368) {
        number 32, true, -1
    }
    field(:unk_2, 372) {
        number 32, true, -1
    }
end

class CreatureInteractionEffectBpAppearanceModifierst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_bp_appearance_modifierst

    field(:unk_6c, 152) {
        number 16, true
    }
    field(:value, 156) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectBruisingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_bruisingst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectCanDoInteractionst < CreatureInteractionEffect
    sizeof 896

    rtti_classname :creature_interaction_effect_can_do_interactionst

    field(:interaction, 152) {
        global :CreatureInteraction
    }
end

class CreatureInteractionEffectChangePersonalityst < CreatureInteractionEffect
    sizeof 256

    rtti_classname :creature_interaction_effect_change_personalityst

    field(:facets, 152) {
        static_array(50, 2, PersonalityFacetType) {
            number 16, true
        }
    }
end

class CreatureInteractionEffectCloseOpenWoundsst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_close_open_woundsst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectCoughBloodst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_cough_bloodst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectCureInfectionsst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_cure_infectionsst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectCureInfectionst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_cure_infectionst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectDisplayNamest < CreatureInteractionEffect
    sizeof 256

    rtti_classname :creature_interaction_effect_display_namest

    field(:name, 152) {
        stl_string
    }
    field(:name_plural, 184) {
        stl_string
    }
    field(:name_adj, 216) {
        stl_string
    }
    field(:unk_1, 248) {
        number 32, true
    }
end

class CreatureInteractionEffectDisplaySymbolst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_display_symbolst

    field(:tile, 152) {
        number 32, true
    }
    field(:color, 156) {
        number 32, true
    }
end

class CreatureInteractionEffectDizzinessst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_dizzinessst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectDrowsinessst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_drowsinessst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectErraticBehaviorst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_erratic_behaviorst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectFeelEmotionst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_feel_emotionst

    field(:emotion, 152) {
        number 32, true, nil, EmotionType
    }
    field(:sev, 156) {
        number 32, true
    }
end

class CreatureInteractionEffectFeverst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_feverst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:SIZE_DELAYS, 0) { bit 0 }
    field(:SIZE_DILUTES, 0) { bit 1 }
    field(:VASCULAR_ONLY, 0) { bit 2 }
    field(:MUSCULAR_ONLY, 0) { bit 3 }
    field(:RESISTABLE, 0) { bit 4 }
    field(:LOCALIZED, 0) { bit 5 }
    field(:MOON_PHASE, 0) { bit 6 }
    field(:COUNTER_TRIGGER, 0) { bit 7 }
    field(:ABRUPT_START, 0) { bit 8 }
    field(:ABRUPT_END, 0) { bit 9 }
end

class CreatureInteractionEffectFlashSymbolst < CreatureInteractionEffect
    sizeof 168

    rtti_classname :creature_interaction_effect_flash_symbolst

    field(:sym_color, 152) {
        static_array(4, 1) {
            number 8, false
        }
    }
    field(:period, 156) {
        number 32, true
    }
    field(:time, 160) {
        number 32, true
    }
    field(:unk_78, 164) {
        number 32, true
    }
end

class CreatureInteractionEffectHealNervesst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_heal_nervesst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectHealTissuesst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_heal_tissuesst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectImpairFunctionst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_impair_functionst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectMaterialForceAdjustst < CreatureInteractionEffect
    sizeof 264

    rtti_classname :creature_interaction_effect_material_force_adjustst

    field(:unk_6c, 152) {
        stl_string
    }
    field(:unk_88, 184) {
        stl_string
    }
    field(:unk_a4, 216) {
        stl_string
    }
    field(:mat_type, 248) {
        number 16, true, -1
    }
    field(:mat_index, 252) {
        number 32, true
    }
    field(:fraction_mul, 256) {
        number 32, true
    }
    field(:fraction_div, 260) {
        number 32, true
    }
end

class CreatureInteractionEffectMentAttChangest < CreatureInteractionEffect
    sizeof 256

    rtti_classname :creature_interaction_effect_ment_att_changest

    field(:ment_att_perc, 152) {
        static_array(13, 4, MentalAttributeType) {
            number 32, true
        }
    }
    field(:ment_att_add, 204) {
        static_array(13, 4, MentalAttributeType) {
            number 32, true
        }
    }
end

class CreatureInteractionEffectNauseast < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_nauseast

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectNecrosisst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_necrosisst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectNumbnessst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_numbnessst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectOozingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_oozingst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectPainst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_painst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectParalysisst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_paralysisst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectPhysAttChangest < CreatureInteractionEffect
    sizeof 200

    rtti_classname :creature_interaction_effect_phys_att_changest

    field(:phys_att_perc, 152) {
        static_array(6, 4, PhysicalAttributeType) {
            number 32, true
        }
    }
    field(:phys_att_add, 176) {
        static_array(6, 4, PhysicalAttributeType) {
            number 32, true
        }
    }
end

class CreatureInteractionEffectReduceDizzinessst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_reduce_dizzinessst

    field(:unk_1, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectReduceFeverst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_reduce_feverst

    field(:unk_1, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectReduceNauseast < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_reduce_nauseast

    field(:unk_1, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectReducePainst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_reduce_painst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectReduceParalysisst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_reduce_paralysisst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectReduceSwellingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_reduce_swellingst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectRegrowPartsst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_regrow_partsst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectRemoveSimpleFlagst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_remove_simple_flagst

    field(:tags1, 152) {
        global :CieAddTagMask1
    }
    field(:tags2, 156) {
        global :CieAddTagMask2
    }
end

class CreatureInteractionEffectSenseCreatureClassst < CreatureInteractionEffect
    sizeof 192

    rtti_classname :creature_interaction_effect_sense_creature_classst

    field(:class_name, 152) {
        stl_string
    }
    field(:tile, 184) {
        number 8, true
    }
    field(:color_foreground, 186) {
        number 16, true
    }
    field(:color_background, 188) {
        number 16, true
    }
    field(:foreground_brightness, 190) {
        number 16, true
    }
end

class CreatureInteractionEffectSkillRollAdjustst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_skill_roll_adjustst

    field(:multiplier, 152) {
        number 32, true
    }
    field(:chance, 156) {
        number 32, true
    }
end

class CreatureInteractionEffectSpecialAttackInteractionst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_special_attack_interactionst

    field(:unk_1, 152) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_2, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_3, 200) {
        stl_string
    }
end

class CreatureInteractionEffectSpeedChangest < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_speed_changest

    field(:bonus_add, 152) {
        number 32, true
    }
    field(:bonus_perc, 156) {
        number 32, true
    }
end

class CreatureInteractionEffectStopBleedingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_stop_bleedingst

    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
end

class CreatureInteractionEffectSwellingst < CreatureInteractionEffect
    sizeof 232

    rtti_classname :creature_interaction_effect_swellingst

    field(:sev, 152) {
        number 32, true
    }
    field(:target, 160) {
        global :CreatureInteractionEffectTarget
    }
end

class CreatureInteractionEffectTarget < MemHack::Compound
    sizeof 72

    field(:mode, 0) {
        stl_vector(2) {
            number 16, true, nil, CreatureInteractionEffectTargetMode
        }
    }
    field(:key, 24) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:tissue, 48) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class CreatureInteractionEffectUnconsciousnessst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_unconsciousnessst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionEffectVomitBloodst < CreatureInteractionEffect
    sizeof 160

    rtti_classname :creature_interaction_effect_vomit_bloodst

    field(:sev, 152) {
        number 32, true
    }
end

class CreatureInteractionTargetFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:LINE_OF_SIGHT, 0) { bit 0 }
    field(:TOUCHABLE, 0) { bit 1 }
    field(:DISTURBER_ONLY, 0) { bit 2 }
    field(:SELF_ALLOWED, 0) { bit 3 }
    field(:SELF_ONLY, 0) { bit 4 }
end

class CreatureRaw < MemHack::Compound
    sizeof 18440

    field(:creature_id, 0) {
        stl_string
    }
    field(:name, 32) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:general_baby_name, 128) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:general_child_name, 192) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:unk_v43_1, 256) {
        stl_string
    }
    field(:creature_tile, 288) {
        number 8, false
    }
    field(:creature_soldier_tile, 289) {
        number 8, false
    }
    field(:alttile, 290) {
        number 8, false
    }
    field(:soldier_alttile, 291) {
        number 8, false
    }
    field(:glowtile, 292) {
        number 8, false
    }
    field(:temperature1, 294) {
        number 16, false
    }
    field(:temperature2, 296) {
        number 16, false
    }
    field(:frequency, 298) {
        number 16, true
    }
    field(:population_number, 300) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:cluster_number, 304) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:triggerable_group, 308) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:color, 312) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:glowcolor, 318) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:adultsize, 324) {
        number 32, true
    }
    field(:prefstring, 328) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:sphere, 352) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:caste, 376) {
        stl_vector(8) {
            pointer {
                global :CasteRaw
            }
        }
    }
    field(:pop_ratio, 400) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:flags, 424) {
        df_flagarray(CreatureRawFlags)
    }
    field(:graphics, 440) {
        compound(:CreatureRaw_TGraphics) {
            field(:texpos, 0) {
                static_array(6, 4, CreatureGraphicsRole) {
                    number 32, true
                }
            }
            field(:texpos_gs, 24) {
                static_array(6, 4, CreatureGraphicsRole) {
                    number 32, true
                }
            }
            field(:entity_link_texpos, 48) {
                static_array(6, 72, CreatureGraphicsRole) {
                    static_array(18, 4, HistfigEntityLinkType) {
                        number 32, true
                    }
                }
            }
            field(:entity_link_texpos_gs, 480) {
                static_array(6, 72, CreatureGraphicsRole) {
                    static_array(18, 4, HistfigEntityLinkType) {
                        number 32, true
                    }
                }
            }
            field(:site_link_texpos, 912) {
                static_array(6, 40, CreatureGraphicsRole) {
                    static_array(10, 4, HistfigSiteLinkType) {
                        number 32, true
                    }
                }
            }
            field(:site_link_texpos_gs, 1152) {
                static_array(6, 40, CreatureGraphicsRole) {
                    static_array(10, 4, HistfigSiteLinkType) {
                        number 32, true
                    }
                }
            }
            field(:profession_texpos, 1392) {
                static_array(6, 540, CreatureGraphicsRole) {
                    static_array(135, 4, Profession) {
                        number 32, true
                    }
                }
            }
            field(:profession_texpos_gs, 4632) {
                static_array(6, 540, CreatureGraphicsRole) {
                    static_array(135, 4, Profession) {
                        number 32, true
                    }
                }
            }
            field(:add_color, 7872) {
                static_array(6, 1, CreatureGraphicsRole) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:entity_link_add_color, 7878) {
                static_array(6, 18, CreatureGraphicsRole) {
                    static_array(18, 1, HistfigEntityLinkType) {
                        number 8, true, nil, BooleanEnum
                    }
                }
            }
            field(:site_link_add_color, 7986) {
                static_array(6, 10, CreatureGraphicsRole) {
                    static_array(10, 1, HistfigSiteLinkType) {
                        number 8, true, nil, BooleanEnum
                    }
                }
            }
            field(:profession_add_color, 8046) {
                static_array(6, 135, CreatureGraphicsRole) {
                    static_array(135, 1, Profession) {
                        number 8, true, nil, BooleanEnum
                    }
                }
            }
            field(:appointments, 8856) {
                stl_vector(8) {
                    pointer {
                        global :CreatureGraphicsAppointment
                    }
                }
            }
        }
    }
    field(:speech1, 9320) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:speech2, 9344) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:speech3, 9368) {
        stl_vector
    }
    field(:material, 9392) {
        stl_vector(8) {
            pointer {
                global :Material
            }
        }
    }
    field(:tissue, 9416) {
        stl_vector(8) {
            pointer {
                global :Tissue
            }
        }
    }
    field(:profession_name, 9440) {
        compound(:CreatureRaw_TProfessionName) {
            field(:singular, 0) {
                static_array(135, 32, Profession) {
                    stl_string
                }
            }
            field(:plural, 4320) {
                static_array(135, 32, Profession) {
                    stl_string
                }
            }
        }
    }
    field(:underground_layer_min, 18080) {
        number 32, true
    }
    field(:underground_layer_max, 18084) {
        number 32, true
    }
    field(:modifier_class, 18088) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:modifier_num_patterns, 18112) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:hive_product, 18136) {
        compound(:CreatureRaw_THiveProduct) {
            field(:number, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:time, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:item_type, 48) {
                stl_vector(2) {
                    number 16, true, nil, ItemType
                }
            }
            field(:item_subtype, 72) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:material, 96) {
                global :MaterialVecRef
            }
            field(:tmpstr, 144) {
                static_array(5, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
        }
    }
    field(:source_hfid, 18400) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:unk_v4201_1, 18404) {
        number 32, true, -1
    }
    field(:next_modifier_id, 18408) {
        number 32, true
    }
    field(:raws, 18416) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class CreatureVariation < MemHack::Compound
    sizeof 200

    field(:id, 0) {
        stl_string
    }
    field(:cv_convert_tag, 32) {
        stl_vector(8) {
            pointer {
                global :CreatureVariationConvertTag
            }
        }
    }
    field(:cv_new_tag, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:cv_new_unk_v40_1, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:cv_new_unk_v40_2, 104) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:cv_remove_tag, 128) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:cv_remove_unk_v40_1, 152) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:cv_remove_unk_v40_2, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class CreatureVariationConvertTag < MemHack::Compound
    sizeof 136

    field(:cvct_master, 0) {
        stl_string
    }
    field(:cvct_target, 32) {
        stl_string
    }
    field(:cvct_replacement, 64) {
        stl_string
    }
    field(:unk_v40_1, 96) {
        number 32, true, -1
    }
    field(:unk_v40_2, 104) {
        stl_string
    }
end

class Crime < MemHack::Compound
    sizeof 280

    field(:id, 0) {
        number 32, true
    }
    field(:mode, 4) {
        class ::DFHack::Crime_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :ProductionOrderViolation ; NUME[:ProductionOrderViolation] = 0
            ENUM[1] = :ExportViolation ; NUME[:ExportViolation] = 1
            ENUM[2] = :JobOrderViolation ; NUME[:JobOrderViolation] = 2
            ENUM[3] = :ConspiracyToSlowLabor ; NUME[:ConspiracyToSlowLabor] = 3
            ENUM[4] = :Murder ; NUME[:Murder] = 4
            ENUM[5] = :DisorderlyBehavior ; NUME[:DisorderlyBehavior] = 5
            ENUM[6] = :BuildingDestruction ; NUME[:BuildingDestruction] = 6
            ENUM[7] = :Vandalism ; NUME[:Vandalism] = 7
            ENUM[8] = :Theft ; NUME[:Theft] = 8
            ENUM[9] = :Robbery ; NUME[:Robbery] = 9
            ENUM[10] = :BloodDrinking ; NUME[:BloodDrinking] = 10
            ENUM[11] = :Embezzlement ; NUME[:Embezzlement] = 11
            ENUM[12] = :AttemptedMurder ; NUME[:AttemptedMurder] = 12
            ENUM[13] = :Kidnapping ; NUME[:Kidnapping] = 13
            ENUM[14] = :AttemptedKidnapping ; NUME[:AttemptedKidnapping] = 14
            ENUM[15] = :AttemptedTheft ; NUME[:AttemptedTheft] = 15
            ENUM[16] = :Treason ; NUME[:Treason] = 16
            ENUM[17] = :Espionage ; NUME[:Espionage] = 17
            ENUM[18] = :Bribery ; NUME[:Bribery] = 18
        end

        number 32, true, nil, Crime_TMode
    }
    field(:punishment, 8) {
        compound(:Crime_TPunishment) {
            field(:hammerstrikes, 0) {
                number 32, true
            }
            field(:prison_time, 4) {
                number 32, true
            }
            field(:give_beating, 8) {
                number 32, true
            }
        }
    }
    field(:criminal, 20) {
        number 32, true, -1
    }
    def criminal_tg ; df.world.units.all.binsearch(criminal) ; end
    field(:criminal_hf, 24) {
        number 32, true, -1
    }
    def criminal_hf_tg ; df.world.history.figures.binsearch(criminal_hf) ; end
    field(:criminal_hf_2, 28) {
        number 32, true, -1
    }
    def criminal_hf_2_tg ; df.world.history.figures.binsearch(criminal_hf_2) ; end
    field(:criminal_hf_3, 32) {
        number 32, true, -1
    }
    def criminal_hf_3_tg ; df.world.history.figures.binsearch(criminal_hf_3) ; end
    field(:convict_data, 40) {
        compound(:Crime_TConvictData) {
            field(:unk_v47_vector_1, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:convicted, 24) {
                number 32, true, -1
            }
            def convicted_tg ; df.world.units.all.binsearch(convicted) ; end
        }
    }
    field(:convicted_hf, 72) {
        number 32, true, -1
    }
    def convicted_hf_tg ; df.world.history.figures.binsearch(convicted_hf) ; end
    field(:convicted_hf_2, 76) {
        number 32, true, -1
    }
    def convicted_hf_2_tg ; df.world.history.figures.binsearch(convicted_hf_2) ; end
    field(:convicted_hf_3, 80) {
        number 32, true, -1
    }
    def convicted_hf_3_tg ; df.world.history.figures.binsearch(convicted_hf_3) ; end
    field(:victim_data, 88) {
        compound(:Crime_TVictimData) {
            field(:unk_v47_vector_2, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:victim, 24) {
                number 32, true, -1
            }
            def victim_tg ; df.world.units.all.binsearch(victim) ; end
        }
    }
    field(:victim_hf, 120) {
        number 32, true, -1
    }
    def victim_hf_tg ; df.world.history.figures.binsearch(victim_hf) ; end
    field(:victim_hf_2, 124) {
        number 32, true, -1
    }
    def victim_hf_2_tg ; df.world.history.figures.binsearch(victim_hf_2) ; end
    field(:victim_hf_3, 128) {
        number 32, true, -1
    }
    def victim_hf_3_tg ; df.world.history.figures.binsearch(victim_hf_3) ; end
    field(:unk_v47_vector_3, 136) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:flags, 160) {
        compound(:Crime_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:sentenced, 0) { bit 0 }
            field(:discovered, 0) { bit 1 }
            field(:needs_trial, 0) { bit 2 }
        }
    }
    field(:incident_id, 164) {
        number 32, true, -1
    }
    def incident_tg ; df.world.incidents.all.binsearch(incident_id) ; end
    field(:event_year, 168) {
        number 32, true
    }
    field(:event_time, 172) {
        number 32, true
    }
    field(:discovered_year, 176) {
        number 32, true
    }
    field(:discovered_time, 180) {
        number 32, true
    }
    field(:site, 184) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:entity, 188) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:item_id, 192) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
    field(:reports, 200) {
        stl_vector(8) {
            pointer {
                compound(:Crime_TReports) {
                    sizeof 40

                    field(:death_id, 0) {
                        number 32, true, -1
                    }
                    def death_tg ; df.world.incidents.all.binsearch(death_id) ; end
                    field(:accused_id, 4) {
                        number 32, true, -1
                    }
                    def accused_tg ; df.world.history.figures.binsearch(accused_id) ; end
                    field(:accused_id_2, 8) {
                        number 32, true, -1
                    }
                    def accused_tg_2 ; df.world.history.figures.binsearch(accused_id_2) ; end
                    field(:unk_vec, 16) {
                        stl_vector
                    }
                }
            }
        }
    }
    field(:counterintelligence, 224) {
        stl_vector(8) {
            pointer {
                compound(:Crime_TCounterintelligence) {
                    sizeof 40

                    field(:unk_1, 0) {
                        number 32, true, -1
                    }
                    field(:identified_hf, 4) {
                        number 32, true, -1
                    }
                    def identified_hf_tg ; df.world.history.figures.binsearch(identified_hf) ; end
                    field(:identified_hf_2, 8) {
                        number 32, true, -1
                    }
                    def identified_hf_2_tg ; df.world.history.figures.binsearch(identified_hf_2) ; end
                    field(:unk_vec, 16) {
                        stl_vector
                    }
                }
            }
        }
    }
    field(:witnesses, 248) {
        stl_vector(8) {
            pointer {
                global :CrimeWitness
            }
        }
    }
    field(:agreement_id, 272) {
        number 32, true, -1
    }
    def agreement_tg ; df.world.agreements.all.binsearch(agreement_id) ; end
end

class CrimeWitness < MemHack::Compound
    sizeof 120

    field(:incident_id, 0) {
        number 32, true, -1
    }
    def incident_tg ; df.world.incidents.all.binsearch(incident_id) ; end
    field(:crime_id, 4) {
        number 32, true, -1
    }
    def crime_tg ; df.world.crimes.all.binsearch(crime_id) ; end
    field(:witness_claim, 8) {
        class ::DFHack::CrimeWitness_TWitnessClaim < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :SawDisorderlyConduct ; NUME[:SawDisorderlyConduct] = 0
            ENUM[1] = :FoundTheBody ; NUME[:FoundTheBody] = 1
            ENUM[2] = :SawObjectWasMissing ; NUME[:SawObjectWasMissing] = 2
            ENUM[3] = :SawObjectWasDisturbed ; NUME[:SawObjectWasDisturbed] = 3
            ENUM[4] = :SawSomebodyAdmireObject ; NUME[:SawSomebodyAdmireObject] = 4
            ENUM[5] = :Confessed ; NUME[:Confessed] = 5
            ENUM[6] = :ImplicatesSomeone ; NUME[:ImplicatesSomeone] = 6
            ENUM[7] = :AccusesSomeone ; NUME[:AccusesSomeone] = 7
        end

        number 32, true, nil, CrimeWitness_TWitnessClaim
    }
    field(:year, 12) {
        number 32, true
    }
    field(:tick, 16) {
        number 32, true
    }
    field(:witness_id, 20) {
        number 32, true, -1
    }
    def witness_tg ; df.world.units.all.binsearch(witness_id) ; end
    field(:witness_data, 24) {
        global :IncidentHfid
    }
    field(:accused_id, 64) {
        number 32, true, -1
    }
    def accused_tg ; df.world.units.all.binsearch(accused_id) ; end
    field(:accused_identity_id, 68) {
        number 32, true, -1
    }
    def accused_identity_tg ; df.world.identities.all.binsearch(accused_identity_id) ; end
    field(:accused_data, 72) {
        global :IncidentHfid
    }
    field(:reported_year, 112) {
        number 32, true
    }
    field(:reported_tick, 116) {
        number 32, true
    }
end

class CulturalIdentity < MemHack::Compound
    sizeof 472

    field(:id, 0) {
        number 32, true
    }
    field(:site_id, 4) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:civ_id, 8) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:group_log, 16) {
        stl_vector(8) {
            pointer {
                compound(:CulturalIdentity_TGroupLog) {
                    sizeof 96

                    field(:group_id, 0) {
                        number 32, true, -1
                    }
                    def group_tg ; df.world.entities.all.binsearch(group_id) ; end
                    field(:start_year, 4) {
                        number 32, true, -1
                    }
                    field(:start_tick, 8) {
                        number 32, true, -1
                    }
                    field(:end_year, 12) {
                        number 32, true, -1
                    }
                    field(:end_tick, 16) {
                        number 32, true, -1
                    }
                    field(:unk_14, 20) {
                        number 32, true, -1
                    }
                    field(:unk_18, 24) {
                        number 32, true, -1
                    }
                    field(:join_type, 28) {
                        class ::DFHack::CulturalIdentity_TGroupLog_TJoinType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :Peaceful ; NUME[:Peaceful] = 0
                            ENUM[1] = :CompleteTakeOver ; NUME[:CompleteTakeOver] = 1
                            ENUM[2] = :TakeOver ; NUME[:TakeOver] = 2
                        end

                        number 32, true, nil, CulturalIdentity_TGroupLog_TJoinType
                    }
                    field(:unk_20, 32) {
                        number 32, true
                    }
                    field(:unk_24, 40) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_34, 64) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_44, 88) {
                        number 32, true, 100
                    }
                }
            }
        }
    }
    field(:ethic, 40) {
        static_array(22, 2, EthicType) {
            number 16, true, nil, EthicResponse
        }
    }
    field(:values, 84) {
        static_array(64, 4, ValueType) {
            number 32, true
        }
    }
    field(:events, 344) {
        stl_vector(8) {
            pointer {
                global :EntityEvent
            }
        }
    }
    field(:unk_d8, 368) {
        number 32, true, -1
    }
    field(:unk_dc, 376) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_ec, 400) {
        number 32, true, -1
    }
    field(:unk_f0, 404) {
        number 32, true, -1
    }
    field(:unk_f4, 408) {
        number 32, true
    }
    field(:unk_1, 416) {
        stl_vector(8) {
            pointer {
                compound(:CulturalIdentity_TUnk1) {
                    sizeof 12

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_2, 440) {
        stl_vector(8) {
            pointer {
                compound(:CulturalIdentity_TUnk2) {
                    sizeof 20

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_f8, 464) {
        number 32, true
    }
end

class CurseAttrChange < MemHack::Compound
    sizeof 152

    field(:phys_att_perc, 0) {
        static_array(6, 4, PhysicalAttributeType) {
            number 32, true
        }
    }
    field(:phys_att_add, 24) {
        static_array(6, 4, PhysicalAttributeType) {
            number 32, true
        }
    }
    field(:ment_att_perc, 48) {
        static_array(13, 4, MentalAttributeType) {
            number 32, true
        }
    }
    field(:ment_att_add, 100) {
        static_array(13, 4, MentalAttributeType) {
            number 32, true
        }
    }
end

class CursedTomb < MemHack::Compound
    sizeof 104

    field(:triggered, 0) {
        number 8, true
    }
    field(:coffin_skeletons, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def coffin_skeletons_tg ; coffin_skeletons.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:disturbance, 32) {
        number 32, true, -1
    }
    def disturbance_tg ; df.world.raws.interactions.binsearch(disturbance) ; end
    field(:treasures, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def treasures_tg ; treasures.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:unk_1, 64) {
        number 32, true
    }
    field(:unk_2, 68) {
        number 32, true
    }
    field(:trigger_regions, 72) {
        stl_vector(8) {
            pointer {
                compound(:CursedTomb_TTriggerRegions) {
                    sizeof 24

                    field(:x_min, 0) {
                        number 32, true
                    }
                    field(:y_min, 4) {
                        number 32, true
                    }
                    field(:z_min, 8) {
                        number 32, true
                    }
                    field(:x_max, 12) {
                        number 32, true
                    }
                    field(:y_max, 16) {
                        number 32, true
                    }
                    field(:z_max, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:coffin_pos, 96) {
        global :Coord
    }
end

class DInit < MemHack::Compound
    sizeof 1848

    field(:flags1, 0) {
        df_flagarray(DInitFlags1)
    }
    field(:nickname, 16) {
        static_array(10, 4, GameType) {
            number 32, true, nil, DInitNickname
        }
    }
    field(:sky_tile, 56) {
        number 8, false
    }
    field(:sky_color, 58) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:chasm_tile, 64) {
        number 8, false
    }
    field(:pillar_tile, 65) {
        number 8, false
    }
    field(:track_tiles, 66) {
        static_array(15, 1) {
            number 8, false
        }
    }
    field(:track_tile_invert, 81) {
        static_array(15, 1) {
            number 8, false
        }
    }
    field(:track_ramp_tiles, 96) {
        static_array(15, 1) {
            number 8, false
        }
    }
    field(:track_ramp_invert, 111) {
        static_array(15, 1) {
            number 8, false
        }
    }
    field(:tree_tiles, 126) {
        static_array(104, 1) {
            number 8, false
        }
    }
    field(:chasm_color, 230) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:wound_color, 236) {
        compound(:DInit_TWoundColor) {
            field(:none, 0) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:minor, 6) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:inhibited, 12) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:function_loss, 18) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:broken, 24) {
                static_array(3, 2) {
                    number 16, true
                }
            }
            field(:missing, 30) {
                static_array(3, 2) {
                    number 16, true
                }
            }
        }
    }
    field(:idlers, 272) {
        number 16, true, nil, DInitIdlers
    }
    field(:show_embark_tunnel, 274) {
        number 16, true, nil, DInitTunnel
    }
    field(:flags2, 280) {
        df_flagarray(DInitFlags2)
    }
    field(:display_length, 296) {
        number 32, true
    }
    field(:adventurer_z_view, 300) {
        number 32, true, nil, DInitZView
    }
    field(:adventurer_z_view_size, 304) {
        number 32, true
    }
    field(:flags3, 312) {
        df_flagarray(DInitFlags3)
    }
    field(:population_cap, 328) {
        number 32, true
    }
    field(:strict_population_cap, 332) {
        number 32, true
    }
    field(:baby_cap_absolute, 336) {
        number 32, true
    }
    field(:baby_cap_percent, 340) {
        number 32, true
    }
    field(:visitor_cap, 344) {
        number 32, true
    }
    field(:specific_seed_cap, 348) {
        number 32, true
    }
    field(:fortress_seed_cap, 352) {
        number 32, true
    }
    field(:invasion_soldier_cap, 356) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:invasion_monster_cap, 368) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:path_cost, 380) {
        static_array(4, 4) {
            number 32, true
        }
    }
    field(:embark_rect, 396) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:store_dist, 400) {
        compound(:DInit_TStoreDist) {
            field(:item_decrease, 0) {
                number 16, true
            }
            field(:seed_combine, 2) {
                number 16, true
            }
            field(:bucket_combine, 4) {
                number 16, true
            }
            field(:barrel_combine, 6) {
                number 16, true
            }
            field(:bin_combine, 8) {
                number 16, true
            }
        }
    }
    field(:set_labor_lists, 410) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:graze_coefficient, 416) {
        number 32, true
    }
    field(:temple_value_levels, 420) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:priesthood_unit_counts, 428) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:guildhall_value_levels, 436) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:guild_unit_counts, 444) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:flags4, 456) {
        df_flagarray(DInitFlags4)
    }
    field(:post_prepare_embark_confirmation, 472) {
        number 32, true, nil, DInitEmbarkConfirm
    }
    field(:announcements, 480) {
        global :Announcements
    }
end

class DanceForm < MemHack::Compound
    sizeof 376

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:musical_form_id, 128) {
        number 32, true
    }
    field(:music_written_content_id, 132) {
        number 32, true, -1
    }
    def music_written_content_tg ; df.world.written_contents.all.binsearch(music_written_content_id) ; end
    field(:context, 136) {
        number 32, true, nil, DanceFormContext
    }
    field(:originating_entity, 140) {
        number 32, true, -1
    }
    def originating_entity_tg ; df.world.entities.all.binsearch(originating_entity) ; end
    field(:original_author, 144) {
        number 32, true, -1
    }
    def original_author_tg ; df.world.history.figures.binsearch(original_author) ; end
    field(:produce_individual_dances, 148) {
        number 32, true
    }
    field(:group_size, 152) {
        number 32, true, nil, DanceFormGroupSize
    }
    field(:unk_4, 156) {
        number 32, true, -1
    }
    field(:unk_5, 160) {
        number 32, true, -1
    }
    field(:configuration, 164) {
        number 32, true, nil, DanceFormConfiguration
    }
    field(:movement_path, 168) {
        number 32, true, nil, DanceFormMovementPath
    }
    field(:unk_8, 172) {
        number 32, true, -1
    }
    field(:partner_distance, 176) {
        number 32, true, nil, DanceFormPartnerDistance
    }
    field(:partner_intent, 180) {
        number 32, true, nil, DanceFormPartnerIntent
    }
    field(:partner_cue_frequency, 184) {
        number 32, true, nil, DanceFormPartnerCueFrequency
    }
    field(:partner_changes, 192) {
        stl_vector(4) {
            number 32, true, nil, DanceFormPartnerChangeType
        }
    }
    field(:poetry_referenced, 216) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_14, 220) {
        number 32, true, -1
    }
    field(:hfid, 224) {
        number 32, true, -1
    }
    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
    field(:race, 228) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:move_type, 232) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveType
        }
    }
    field(:move_modifier, 256) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveModifier
        }
    }
    field(:move_parameter, 280) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:move_location, 304) {
        stl_vector(4) {
            global :DanceFormMoveLocation
        }
    }
    field(:sections, 328) {
        stl_vector(8) {
            pointer {
                global :DanceFormSection
            }
        }
    }
    field(:moves, 352) {
        stl_vector(8) {
            pointer {
                global :DanceFormMove
            }
        }
    }
end

class DanceFormMove < MemHack::Compound
    sizeof 136

    field(:name, 0) {
        stl_string
    }
    field(:type, 32) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveType
        }
    }
    field(:modifier, 56) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveModifier
        }
    }
    field(:parameter, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:location, 104) {
        stl_vector(4) {
            global :DanceFormMoveLocation
        }
    }
    field(:group_type, 128) {
        number 32, true, nil, DanceFormMoveGroupType
    }
end

class DanceFormMoveLocation < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:MirroredByGroupMembers, 0) { bit 2 }
    field(:InRetrogradeByGroupMembers, 0) { bit 3 }
    field(:InSuccessionByGroupMembers, 0) { bit 4 }
    field(:ShadowedByGroupMembers, 0) { bit 5 }
    field(:Lead, 0) { bit 6 }
    field(:Follower, 0) { bit 7 }
end

class DanceFormSection < MemHack::Compound
    sizeof 184

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true, 1
    }
    field(:unk_3, 8) {
        number 32, true, 1
    }
    field(:unk_4, 12) {
        number 32, true, -1
    }
    field(:movement_path, 16) {
        number 32, true, nil, DanceFormMovementPath
    }
    field(:move_id, 20) {
        number 32, true
    }
    field(:partner_distance, 24) {
        number 32, true, nil, DanceFormPartnerDistance
    }
    field(:partner_intent, 28) {
        number 32, true, nil, DanceFormPartnerIntent
    }
    field(:partner_cue_frequency, 32) {
        number 32, true, nil, DanceFormPartnerCueFrequency
    }
    field(:partner_changes, 40) {
        stl_vector(4) {
            number 32, true, nil, DanceFormPartnerChangeType
        }
    }
    field(:unk_11, 64) {
        number 32, true
    }
    field(:unk_12, 68) {
        number 32, true, -1
    }
    field(:unk_13, 72) {
        number 32, true, -1
    }
    field(:unk_14, 76) {
        number 32, true, -1
    }
    field(:type, 80) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveType
        }
    }
    field(:modifier, 104) {
        stl_vector(4) {
            number 32, true, nil, DanceFormMoveModifier
        }
    }
    field(:parameter, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:location, 152) {
        stl_vector(4) {
            global :DanceFormMoveLocation
        }
    }
    field(:id, 176) {
        number 32, true
    }
end

class DeepVeinHollow < MemHack::Compound
    sizeof 88

    field(:triggered, 0) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1, 4) {
        number 32, true
    }
    field(:tiles, 8) {
        global :CoordPath
    }
    field(:pos, 80) {
        global :Coord
    }
end

class DescriptorColor < MemHack::Compound
    sizeof 128

    field(:id, 0) {
        stl_string
    }
    field(:word_unk, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:words, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def words_tg ; words.map { |i| df.world.raws.language.words[i] } ; end
    field(:name, 80) {
        stl_string
    }
    field(:color, 112) {
        number 8, true, nil, CursesColor
    }
    field(:bold, 113) {
        number 8, true
    }
    field(:red, 116) {
        float
    }
    field(:green, 120) {
        float
    }
    field(:blue, 124) {
        float
    }
end

class DescriptorPattern < MemHack::Compound
    sizeof 88

    field(:id, 0) {
        stl_string
    }
    field(:colors, 32) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def colors_tg ; colors.map { |i| df.world.raws.descriptors.colors[i] } ; end
    field(:pattern, 56) {
        number 16, true, nil, PatternType
    }
    field(:cp_color, 64) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class DescriptorShape < MemHack::Compound
    sizeof 208

    field(:id, 0) {
        stl_string
    }
    field(:words_str, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:words, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def words_tg ; words.map { |i| df.world.raws.language.words[i] } ; end
    field(:name, 80) {
        stl_string
    }
    field(:name_plural, 112) {
        stl_string
    }
    field(:adj, 144) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:gems_use, 168) {
        compound(:DescriptorShape_TGemsUse) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:noun, 0) { bit 0 }
            field(:adj, 0) { bit 1 }
            field(:adj_noun, 0) { bit 2 }
        }
    }
    field(:category, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:faces, 200) {
        number 32, true
    }
    field(:tile, 204) {
        number 8, false
    }
end

class DfhackMaterialCategory < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:plant, 0) { bit 0 }
    field(:wood, 0) { bit 1 }
    field(:cloth, 0) { bit 2 }
    field(:silk, 0) { bit 3 }
    field(:leather, 0) { bit 4 }
    field(:bone, 0) { bit 5 }
    field(:shell, 0) { bit 6 }
    field(:wood2, 0) { bit 7 }
    field(:soap, 0) { bit 8 }
    field(:tooth, 0) { bit 9 }
    field(:horn, 0) { bit 10 }
    field(:pearl, 0) { bit 11 }
    field(:yarn, 0) { bit 12 }
    field(:strand, 0) { bit 13 }
    field(:metal, 0) { bit 14 }
    field(:stone, 0) { bit 15 }
    field(:sand, 0) { bit 16 }
    field(:glass, 0) { bit 17 }
    field(:clay, 0) { bit 18 }
    field(:milk, 0) { bit 19 }
end

class DipscriptInfo < MemHack::Compound
    sizeof 120

    field(:id, 0) {
        number 32, true
    }
    field(:script_file, 8) {
        stl_string
    }
    field(:script_steps, 40) {
        stl_vector(8) {
            pointer {
                global :ScriptStepst
            }
        }
    }
    field(:script_vars, 64) {
        stl_vector(8) {
            pointer {
                global :ScriptVarst
            }
        }
    }
    field(:code, 88) {
        stl_string
    }
end

class DipscriptPopup < MemHack::Compound
    sizeof 24

    field(:meeting_holder, 0) {
        pointer {
            global :Unit
        }
    }
    field(:activity, 8) {
        pointer {
            global :ActivityInfo
        }
    }
    field(:flags, 16) {
        compound(:DipscriptPopup_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:close_screen, 0) { bit 0 }
            field(:new_screen, 0) { bit 1 }
        }
    }
end

class DivinationSet < MemHack::Compound
    sizeof 64

    field(:id, 0) {
        number 32, true
    }
    field(:deity_id, 4) {
        number 32, true, -1
    }
    def deity_tg ; df.world.history.figures.binsearch(deity_id) ; end
    field(:owner_id, 8) {
        number 32, true, -1
    }
    def owner_tg ; df.world.entities.all.binsearch(owner_id) ; end
    field(:image_set_ids, 16) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def image_set_tgs ; image_set_ids.map { |i| df.world.image_sets.all.binsearch(i) } ; end
    field(:rolls, 40) {
        stl_vector(8) {
            pointer {
                global :DivinationSetRoll
            }
        }
    }
end

class DivinationSetRoll < MemHack::Compound
    sizeof 32

    field(:result, 0) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:effect_type, 24) {
        class ::DFHack::DivinationSetRoll_TEffectType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :MediumBlessing ; NUME[:MediumBlessing] = 0
            ENUM[1] = :MinorBlessing ; NUME[:MinorBlessing] = 1
            ENUM[2] = :MediumCurse ; NUME[:MediumCurse] = 2
            ENUM[3] = :MinorCurse ; NUME[:MinorCurse] = 3
            ENUM[4] = :Fortune ; NUME[:Fortune] = 4
        end

        number 32, true, nil, DivinationSetRoll_TEffectType
    }
    field(:effect, 28) {
        number 32, true
    }
end

class DoorFlags < MemHack::Compound
    field(:_whole, 0) {
        number 16, false
    }
    field(:forbidden, 0) { bit 0 }
    field(:internal, 0) { bit 1 }
    field(:taken_by_invaders, 0) { bit 2 }
    field(:used_by_intruder, 0) { bit 3 }
    field(:closed, 0) { bit 4 }
    field(:operated_by_mechanisms, 0) { bit 5 }
    field(:pet_passable, 0) { bit 6 }
end

class DyeInfo < MemHack::Compound
    sizeof 20

    field(:mat_type, 0) {
        number 16, true, -1
    }
    field(:mat_index, 4) {
        number 32, true
    }
    field(:dyer, 8) {
        number 32, true, -1
    }
    def dyer_tg ; df.world.history.figures.binsearch(dyer) ; end
    field(:quality, 12) {
        number 16, true, nil, ItemQuality
    }
    field(:skill_rating, 14) {
        number 16, true, nil, SkillRating
    }
    field(:unk_1, 16) {
        number 32, true
    }
end

class EffectInfo < MemHack::Compound
    sizeof 40

    field(:id, 0) {
        number 32, true
    }
    field(:job, 8) {
        pointer {
            global :Job
        }
    }
    field(:type, 16) {
        number 16, true
    }
    field(:foreground, 18) {
        number 16, true
    }
    field(:background, 20) {
        number 16, true
    }
    field(:bright, 22) {
        number 8, true
    }
    field(:pos, 24) {
        global :Coord
    }
    field(:timer, 32) {
        number 32, true
    }
end

class EmbarkFeature < MemHack::Compound
    sizeof 32

    field(:world_tile, 0) {
        global :Coord2d
    }
    field(:mid_level_tile, 4) {
        global :Coord2d
    }
    field(:local_feature_idx, 8) {
        number 16, true
    }
    field(:global_feature_idx, 12) {
        number 32, true, -1
    }
    def global_feature_tgx ; df.world.world_data.underground_regions[global_feature_idx] ; end
    field(:unk10, 16) {
        number 32, true
    }
    field(:layer, 20) {
        number 16, true, nil, LayerType
    }
    field(:local, 22) {
        global :Coord2d
    }
    field(:z_min, 26) {
        number 16, true
    }
    field(:z_max, 28) {
        number 16, true
    }
end

class EmbarkItemChoice < MemHack::Compound
    sizeof 2568

    field(:list, 0) {
        static_array(107, 24, EntitySellCategory) {
            stl_vector(8) {
                pointer {
                    compound(:EmbarkItemChoice_TList) {
                        sizeof 16

                        field(:item_type, 0) {
                            number 16, true, nil, ItemType
                        }
                        field(:item_subtype, 2) {
                            number 16, true, -1
                        }
                        field(:mattype, 4) {
                            number 16, true, -1
                        }
                        field(:matindex, 8) {
                            number 32, true
                        }
                        field(:unk_c, 12) {
                            number 8, true
                        }
                    }
                }
            }
        }
    }
end

class EmbarkLocation < MemHack::Compound
    sizeof 72

    field(:region_pos, 0) {
        global :Coord2d
    }
    field(:reclaim_site, 4) {
        number 16, true, -1
    }
    def reclaim_site_tg ; df.world.world_data.sites.binsearch(reclaim_site) ; end
    field(:reclaim_idx, 6) {
        number 16, true
    }
    field(:biome_rgn, 8) {
        global :Coord2dPath
    }
    field(:embark_pos_min, 56) {
        global :Coord2d
    }
    field(:embark_pos_max, 60) {
        global :Coord2d
    }
    field(:embark_biome_rgn, 64) {
        global :Coord2d
    }
end

class EmbarkNote < MemHack::Compound
    sizeof 56

    field(:tile, 0) {
        number 8, true
    }
    field(:fg_color, 2) {
        number 16, true
    }
    field(:bg_color, 4) {
        number 16, true
    }
    field(:name, 8) {
        stl_string
    }
    field(:pos, 40) {
        global :Coord2d
    }
    field(:left, 44) {
        number 16, true
    }
    field(:right, 46) {
        number 16, true
    }
    field(:top, 48) {
        number 16, true
    }
    field(:bottom, 50) {
        number 16, true
    }
end

class EmbarkProfile < MemHack::Compound
    sizeof 392

    field(:name, 0) {
        stl_string
    }
    field(:skill_type, 32) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:skill_dwarf_idx, 56) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:skill_level, 80) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:reclaim_dwarf_idx, 104) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:reclaim_prof1, 128) {
        stl_vector(2) {
            global :Profession
        }
    }
    field(:reclaim_prof2, 152) {
        stl_vector(2) {
            global :Profession
        }
    }
    field(:item_type, 176) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:item_subtype, 200) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:mat_type, 224) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:mat_index, 248) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:item_count, 272) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:pet_race, 296) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def pet_race_tg ; pet_race.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:pet_caste, 320) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:pet_profession, 344) {
        stl_vector(2) {
            global :Profession
        }
    }
    field(:pet_count, 368) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class EmbarkSymbol < MemHack::Compound
    sizeof 224

    field(:unk_v43_1, 0) {
        stl_vector
    }
    field(:unk_v43_2, 24) {
        stl_vector
    }
    field(:unk_v43_3, 48) {
        number 32, true
    }
    field(:unk_v43_4, 56) {
        global :LanguageName
    }
    field(:unk_v43_sub9, 176) {
        compound(:EmbarkSymbol_TUnkV43Sub9) {
            field(:unk_s1, 0) {
                number 32, true
            }
            field(:unk_s2, 4) {
                number 16, true
            }
            field(:unk_s3, 8) {
                number 32, true
            }
            field(:unk_s4, 12) {
                number 16, true
            }
            field(:unk_s5, 16) {
                number 32, true
            }
            field(:unk_s6, 20) {
                number 32, true
            }
            field(:unk_s7, 24) {
                pointer {
                }
            }
        }
    }
    field(:unk_v43_10, 208) {
        static_array(4, 4) {
            number 32, true
        }
    }
end

class Enabler < MemHack::Compound
    sizeof 736

    rtti_classname :enablerst

    field(:fullscreen, 8) {
        number 8, true, nil, BooleanEnum
    }
    field(:overridden_grid_sizes, 16) {
        stl_deque(8) {
            compound(:Enabler_TOverriddenGridSizes) {
                field(:x, 0) {
                    number 32, true
                }
                field(:y, 4) {
                    number 32, true
                }
            }
        }
    }
    field(:renderer, 56) {
        pointer {
            global :Renderer
        }
    }
    field(:calculated_fps, 64) {
        number 32, true
    }
    field(:calculated_gfps, 68) {
        number 32, true
    }
    field(:frame_timings, 72) {
        stl_deque(4) {
            number 32, true
        }
    }
    field(:gframe_timings, 112) {
        stl_deque(4) {
            number 32, true
        }
    }
    field(:frame_sum, 152) {
        number 32, true
    }
    field(:gframe_sum, 156) {
        number 32, true
    }
    field(:frame_last, 160) {
        number 32, true
    }
    field(:gframe_last, 164) {
        number 32, true
    }
    field(:fps, 168) {
        float
    }
    field(:gfps, 172) {
        float
    }
    field(:fps_per_gfps, 176) {
        float
    }
    field(:last_tick, 180) {
        number 32, false
    }
    field(:outstanding_frames, 184) {
        float
    }
    field(:outstanding_gframes, 188) {
        float
    }
    field(:async_frames, 192) {
        number 32, false
    }
    field(:async_paused, 196) {
        number 8, true, nil, BooleanEnum
    }
    field(:async_tobox, 200) {
        compound(:Enabler_TAsyncTobox) {
            field(:sem, 0) {
                pointer {
                }
            }
            field(:queue, 8) {
                stl_deque(8) {
                    compound(:Enabler_TAsyncTobox_TQueue) {
                        field(:cmd, 0) {
                            class ::DFHack::Enabler_TAsyncTobox_TQueue_TCmd < MemHack::Enum
                                ENUM = Hash.new
                                NUME = Hash.new
                                ENUM[0] = :Pause ; NUME[:Pause] = 0
                                ENUM[1] = :Start ; NUME[:Start] = 1
                                ENUM[2] = :Render ; NUME[:Render] = 2
                                ENUM[3] = :Inc ; NUME[:Inc] = 3
                                ENUM[4] = :SetFps ; NUME[:SetFps] = 4
                            end

                            number 32, true, nil, Enabler_TAsyncTobox_TQueue_TCmd
                        }
                        field(:val, 4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:sem_fill, 48) {
                pointer {
                }
            }
        }
    }
    field(:async_frombox, 256) {
        compound(:Enabler_TAsyncFrombox) {
            field(:sem, 0) {
                pointer {
                }
            }
            field(:queue, 8) {
                stl_deque(12) {
                    compound(:Enabler_TAsyncFrombox_TQueue) {
                        field(:msg, 0) {
                            class ::DFHack::Enabler_TAsyncFrombox_TQueue_TMsg < MemHack::Enum
                                ENUM = Hash.new
                                NUME = Hash.new
                                ENUM[0] = :Quit ; NUME[:Quit] = 0
                                ENUM[1] = :Complete ; NUME[:Complete] = 1
                                ENUM[2] = :SetFps ; NUME[:SetFps] = 2
                                ENUM[3] = :SetGfps ; NUME[:SetGfps] = 3
                                ENUM[4] = :PushResize ; NUME[:PushResize] = 4
                                ENUM[5] = :PopResize ; NUME[:PopResize] = 5
                                ENUM[6] = :ResetTextures ; NUME[:ResetTextures] = 6
                            end

                            number 32, true, nil, Enabler_TAsyncFrombox_TQueue_TMsg
                        }
                        field(:fps, 4) {
                            number 32, true
                        }
                        field(:x, 4) {
                            number 32, true
                        }
                        field(:y, 8) {
                            number 32, true
                        }
                    }
                }
            }
            field(:sem_fill, 48) {
                pointer {
                }
            }
        }
    }
    field(:async_zoom, 312) {
        compound(:Enabler_TAsyncZoom) {
            field(:sem, 0) {
                pointer {
                }
            }
            field(:queue, 8) {
                stl_deque(4) {
                    number 32, true, nil, ZoomCommands
                }
            }
            field(:sem_fill, 48) {
                pointer {
                }
            }
        }
    }
    field(:async_fromcomplete, 368) {
        pointer {
        }
    }
    field(:renderer_threadid, 376) {
        number 32, false
    }
    field(:command_line, 384) {
        stl_string
    }
    field(:ccolor, 416) {
        static_array(16, 12) {
            static_array(3, 4) {
                float
            }
        }
    }
    field(:flag, 608) {
        compound(:Enabler_TFlag) {
            field(:_whole, 0) {
                number 4, true
            }
            field(:render, 0) { bit 0 }
            field(:maxfps, 0) { bit 1 }
        }
    }
    field(:mouse_lbut, 612) {
        number 8, true
    }
    field(:mouse_rbut, 613) {
        number 8, true
    }
    field(:mouse_lbut_down, 614) {
        number 8, true
    }
    field(:mouse_rbut_down, 615) {
        number 8, true
    }
    field(:mouse_lbut_lift, 616) {
        number 8, true
    }
    field(:mouse_rbut_lift, 617) {
        number 8, true
    }
    field(:tracking_on, 618) {
        number 8, true
    }
    field(:textures, 624) {
        compound(:Enabler_TTextures) {
            field(:raws, 0) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:uploaded, 24) {
                number 8, true, nil, BooleanEnum
            }
            field(:gl_catalog, 28) {
                number 32, false
            }
            field(:gl_texpos, 32) {
                pointer {
                }
            }
        }
    }
    field(:sync, 664) {
        number 32, true
    }
    field(:text_system, 672) {
        compound(:Enabler_TTextSystem) {
            field(:file_info, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:Enabler_TTextSystem_TFileInfo) {
                            sizeof 48

                            field(:index, 0) {
                                number 4, true
                            }
                            field(:filename, 8) {
                                stl_string
                            }
                            field(:file_token, 40) {
                                number 8, true
                            }
                            field(:number, 44) {
                                number 4, true
                            }
                        }
                    }
                }
            }
        }
    }
    field(:simticks, 696) {
        compound(:Enabler_TSimticks) {
            field(:sem, 0) {
                pointer {
                }
            }
            field(:value, 8) {
                number 32, true
            }
        }
    }
    field(:gputicks, 712) {
        compound(:Enabler_TGputicks) {
            field(:sem, 0) {
                pointer {
                }
            }
            field(:value, 8) {
                number 32, true
            }
        }
    }
    field(:clock, 728) {
        number 32, false
    }
    def GetKeyDisplay(arg0)
        rv = DFHack::StlString.cpp_new
        DFHack.vmethod_call_mem_return(self, 0, rv, InterfaceKey.int(arg0))
        rv
    end
end

class Engraving < MemHack::Compound
    sizeof 44

    field(:artist, 0) {
        number 32, true, -1
    }
    def artist_tg ; df.world.history.figures.binsearch(artist) ; end
    field(:masterpiece_event, 4) {
        number 32, true, -1
    }
    def masterpiece_event_tg ; df.world.history.events.binsearch(masterpiece_event) ; end
    field(:skill_rating, 8) {
        number 32, true, nil, SkillRating
    }
    field(:pos, 12) {
        global :Coord
    }
    field(:flags, 20) {
        global :EngravingFlags
    }
    field(:tile, 24) {
        number 8, true
    }
    field(:art_id, 28) {
        number 32, true, -1
    }
    def art_tg ; df.world.art_image_chunks.binsearch(art_id) ; end
    field(:art_subid, 32) {
        number 16, true, -1
    }
    field(:quality, 34) {
        number 16, true, nil, ItemQuality
    }
    field(:unk1, 36) {
        number 32, true, -1
    }
    field(:unk2, 40) {
        number 32, true, -1
    }
end

class EngravingFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:floor, 0) { bit 0 }
    field(:west, 0) { bit 1 }
    field(:east, 0) { bit 2 }
    field(:north, 0) { bit 3 }
    field(:south, 0) { bit 4 }
    field(:hidden, 0) { bit 5 }
    field(:northwest, 0) { bit 6 }
    field(:northeast, 0) { bit 7 }
    field(:southwest, 0) { bit 8 }
    field(:southeast, 0) { bit 9 }
end

class EntityActivityStatistics < MemHack::Compound
    sizeof 8400

    field(:food, 0) {
        compound(:EntityActivityStatistics_TFood) {
            field(:total, 0) {
                number 32, true
            }
            field(:meat, 4) {
                number 32, true
            }
            field(:fish, 8) {
                number 32, true
            }
            field(:other, 12) {
                number 32, true
            }
            field(:seeds, 16) {
                number 32, true
            }
            field(:plant, 20) {
                number 32, true
            }
            field(:drink, 24) {
                number 32, true
            }
        }
    }
    field(:unit_counts, 28) {
        static_array(152, 2, Profession) {
            number 16, true
        }
    }
    field(:population, 332) {
        number 16, true
    }
    field(:unk_1, 334) {
        number 16, true
    }
    field(:unk_2, 336) {
        number 16, true
    }
    field(:unk_3, 338) {
        number 16, true
    }
    field(:trained_animals, 340) {
        number 16, true
    }
    field(:other_animals, 342) {
        number 16, true
    }
    field(:unk_4, 344) {
        number 16, true
    }
    field(:unk_5, 348) {
        number 32, true
    }
    field(:item_counts, 352) {
        static_array(112, 4, ItemType) {
            number 32, true
        }
    }
    field(:created_weapons, 800) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:wealth, 824) {
        compound(:EntityActivityStatistics_TWealth) {
            field(:total, 0) {
                number 32, true
            }
            field(:weapons, 4) {
                number 32, true
            }
            field(:armor, 8) {
                number 32, true
            }
            field(:furniture, 12) {
                number 32, true
            }
            field(:other, 16) {
                number 32, true
            }
            field(:architecture, 20) {
                number 32, true
            }
            field(:displayed, 24) {
                number 32, true
            }
            field(:held, 28) {
                number 32, true
            }
            field(:imported, 32) {
                number 32, true
            }
            field(:unk_1, 36) {
                number 32, true
            }
            field(:exported, 40) {
                number 32, true
            }
        }
    }
    field(:recent_jobs, 868) {
        static_array(7, 1040) {
            static_array(260, 4, JobType) {
                number 32, true
            }
        }
    }
    field(:excavated_tiles, 8148) {
        number 32, true
    }
    field(:death_history, 8152) {
        static_array(5, 4) {
            number 32, true
        }
    }
    field(:insanity_history, 8172) {
        static_array(5, 4) {
            number 32, true
        }
    }
    field(:execution_history, 8192) {
        static_array(5, 4) {
            number 32, true
        }
    }
    field(:noble_death_history, 8212) {
        static_array(5, 4) {
            number 32, true
        }
    }
    field(:total_deaths, 8232) {
        number 32, true
    }
    field(:total_insanities, 8236) {
        number 32, true
    }
    field(:total_executions, 8240) {
        number 32, true
    }
    field(:num_artifacts, 8244) {
        number 32, true
    }
    field(:unk_6, 8248) {
        number 32, true
    }
    field(:discovered_creature_foods, 8256) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:discovered_creatures, 8280) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:discovered_plant_foods, 8304) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:discovered_plants, 8328) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:discovered_water_features, 8352) {
        number 16, true
    }
    field(:discovered_subterranean_features, 8354) {
        number 16, true
    }
    field(:discovered_chasm_features, 8356) {
        number 16, true
    }
    field(:discovered_magma_features, 8358) {
        number 16, true
    }
    field(:discovered_feature_layers, 8360) {
        number 16, true
    }
    field(:migrant_wave_idx, 8364) {
        number 32, true
    }
    field(:found_minerals, 8368) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def found_minerals_tg ; found_minerals.map { |i| df.world.raws.inorganics[i] } ; end
    field(:found_misc, 8392) {
        compound(:EntityActivityStatistics_TFoundMisc) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:deep_special, 0) { bit 0 }
        }
    }
end

class EntityAnimalRaw < MemHack::Compound
    sizeof 112

    field(:token, 0) {
        stl_string
    }
    field(:caste_token, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:animal_class, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:forbidden_class, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:flags, 104) {
        compound(:EntityAnimalRaw_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:ALWAYS_PRESENT, 0) { bit 0 }
            field(:NEVER_MOUNT, 0) { bit 1 }
            field(:ALWAYS_MOUNT, 0) { bit 2 }
            field(:NEVER_WAGON_PULLER, 0) { bit 3 }
            field(:ALWAYS_WAGON_PULLER, 0) { bit 4 }
            field(:NEVER_SIEGE, 0) { bit 5 }
            field(:ALWAYS_SIEGE, 0) { bit 6 }
            field(:NEVER_PET, 0) { bit 7 }
            field(:ALWAYS_PET, 0) { bit 8 }
            field(:NEVER_PACK_ANIMAL, 0) { bit 9 }
            field(:ALWAYS_PACK_ANIMAL, 0) { bit 10 }
        }
    }
end

class EntityBuyPrices < MemHack::Compound
    sizeof 32

    field(:items, 0) {
        pointer {
            global :EntityBuyRequests
        }
    }
    field(:price, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class EntityBuyRequests < MemHack::Compound
    sizeof 144

    field(:item_type, 0) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:item_subtype, 24) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_types, 48) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_indices, 72) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:mat_cats, 96) {
        stl_vector(4) {
            global :JobMaterialCategory
        }
    }
    field(:priority, 120) {
        stl_vector(1) {
            number 8, true
        }
    }
end

class EntityClaimMask < MemHack::Compound
    sizeof 16

    field(:map, 0) {
        pointer_ary(8) {
            pointer_ary(48) {
                compound(:EntityClaimMask_TMap) {
                    sizeof 48

                    field(:entities, 0) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def entities_tg ; entities.map { |i| df.world.entities.all.binsearch(i) } ; end
                    field(:region_masks, 24) {
                        stl_vector(8) {
                            pointer {
                                static_array(16, 16) {
                                    static_array(16, 1) {
                                        number 8, false
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    field(:width, 8) {
        number 16, true
    }
    field(:height, 10) {
        number 16, true
    }
end

class EntityEntityLink < MemHack::Compound
    sizeof 12

    field(:type, 0) {
        number 16, true, nil, EntityEntityLinkType
    }
    field(:target, 4) {
        number 32, true, -1
    }
    def target_tg ; df.world.entities.all.binsearch(target) ; end
    field(:strength, 8) {
        number 16, true
    }
end

class EntityEvent < MemHack::Compound
    sizeof 40

    field(:data, 0) {
        compound(:EntityEvent_TData) {
            field(:invasion, 0) {
                compound(:EntityEvent_TData_TInvasion) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:attack_leader_hf, 12) {
                        number 32, true, -1
                    }
                    def attack_leader_hf_tg ; df.world.history.figures.binsearch(attack_leader_hf) ; end
                }
            }
            field(:abduction, 0) {
                compound(:EntityEvent_TData_TAbduction) {
                    field(:histfig_id, 0) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:abductor_id, 8) {
                        number 32, true, -1
                    }
                    def abductor_tg ; df.world.history.figures.binsearch(abductor_id) ; end
                    field(:event, 12) {
                        number 32, true, -1
                    }
                    def event_tg ; df.world.history.events.binsearch(event) ; end
                }
            }
            field(:incident, 0) {
                compound(:EntityEvent_TData_TIncident) {
                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:incident_id, 4) {
                        number 32, true, -1
                    }
                    def incident_tg ; df.world.incidents.all.binsearch(incident_id) ; end
                }
            }
            field(:occupation, 0) {
                compound(:EntityEvent_TData_TOccupation) {
                    field(:site_id, 0) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:entity_id, 4) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:beast, 0) {
                compound(:EntityEvent_TData_TBeast) {
                    field(:histfig_id, 0) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:region_id, 8) {
                        number 32, true, -1
                    }
                    def region_tg ; df.world.world_data.regions[region_id] ; end
                }
            }
            field(:group, 0) {
                compound(:EntityEvent_TData_TGroup) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                }
            }
            field(:harass, 0) {
                compound(:EntityEvent_TData_THarass) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                }
            }
            field(:flee, 0) {
                compound(:EntityEvent_TData_TFlee) {
                    field(:refugee_entity_id, 0) {
                        number 32, true, -1
                    }
                    def refugee_entity_tg ; df.world.entities.all.binsearch(refugee_entity_id) ; end
                    field(:from_site_id, 4) {
                        number 32, true, -1
                    }
                    def from_site_tg ; df.world.world_data.sites.binsearch(from_site_id) ; end
                    field(:army_entity_id, 8) {
                        number 32, true, -1
                    }
                    def army_entity_tg ; df.world.entities.all.binsearch(army_entity_id) ; end
                    field(:army_leader_hf_id, 12) {
                        number 32, true, -1
                    }
                    def army_leader_hf_tg ; df.world.history.figures.binsearch(army_leader_hf_id) ; end
                }
            }
            field(:abandon, 0) {
                compound(:EntityEvent_TData_TAbandon) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:parent_entity_id, 8) {
                        number 32, true, -1
                    }
                    def parent_entity_tg ; df.world.entities.all.binsearch(parent_entity_id) ; end
                }
            }
            field(:reclaimed, 0) {
                compound(:EntityEvent_TData_TReclaimed) {
                    field(:behalf_entity_id, 0) {
                        number 32, true, -1
                    }
                    def behalf_entity_tg ; df.world.entities.all.binsearch(behalf_entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:reclaimer_entity_id, 8) {
                        number 32, true, -1
                    }
                    def reclaimer_entity_tg ; df.world.entities.all.binsearch(reclaimer_entity_id) ; end
                    field(:leader_hf, 12) {
                        number 32, true, -1
                    }
                    def leader_hf_tg ; df.world.history.figures.binsearch(leader_hf) ; end
                }
            }
            field(:founded, 0) {
                compound(:EntityEvent_TData_TFounded) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:parent_entity_id, 8) {
                        number 32, true, -1
                    }
                    def parent_entity_tg ; df.world.entities.all.binsearch(parent_entity_id) ; end
                    field(:unk_1, 12) {
                        number 32, true
                    }
                }
            }
            field(:reclaiming, 0) {
                compound(:EntityEvent_TData_TReclaiming) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:first_settler_hf, 12) {
                        number 32, true, -1
                    }
                    def first_settler_hf_tg ; df.world.history.figures.binsearch(first_settler_hf) ; end
                }
            }
            field(:founding, 0) {
                compound(:EntityEvent_TData_TFounding) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:region_id, 4) {
                        number 32, true, -1
                    }
                    def region_tg ; df.world.world_data.regions[region_id] ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:leave, 0) {
                compound(:EntityEvent_TData_TLeave) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                }
            }
            field(:insurrection, 0) {
                compound(:EntityEvent_TData_TInsurrection) {
                    field(:site_id, 0) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:entity_id, 4) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                }
            }
            field(:insurrection_end, 0) {
                compound(:EntityEvent_TData_TInsurrectionEnd) {
                    field(:site_id, 0) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:entity_id, 4) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:result, 8) {
                        class ::DFHack::EntityEvent_TData_TInsurrectionEnd_TResult < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :Overthrow ; NUME[:Overthrow] = 0
                            ENUM[1] = :Failure ; NUME[:Failure] = 1
                            ENUM[2] = :Crushing ; NUME[:Crushing] = 2
                        end

                        number 32, true, nil, EntityEvent_TData_TInsurrectionEnd_TResult
                    }
                }
            }
            field(:succession, 0) {
                compound(:EntityEvent_TData_TSuccession) {
                    field(:histfig_id, 0) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:former_histfig_id, 4) {
                        number 32, true, -1
                    }
                    def former_histfig_tg ; df.world.history.figures.binsearch(former_histfig_id) ; end
                    field(:entity_id, 8) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:position_assignment_id, 12) {
                        number 32, true, -1
                    }
                }
            }
            field(:claim, 0) {
                compound(:EntityEvent_TData_TClaim) {
                    field(:entity_id, 0) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:histfig_id, 8) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                }
            }
            field(:accept_tribute_offer, 0) {
                compound(:EntityEvent_TData_TAcceptTributeOffer) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:refuse_tribute_offer, 0) {
                compound(:EntityEvent_TData_TRefuseTributeOffer) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:accept_tribute_demand, 0) {
                compound(:EntityEvent_TData_TAcceptTributeDemand) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:refuse_tribute_demand, 0) {
                compound(:EntityEvent_TData_TRefuseTributeDemand) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:accept_peace_offer, 0) {
                compound(:EntityEvent_TData_TAcceptPeaceOffer) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:refuse_peace_offer, 0) {
                compound(:EntityEvent_TData_TRefusePeaceOffer) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:cease_tribute_offer, 0) {
                compound(:EntityEvent_TData_TCeaseTributeOffer) {
                    field(:entity1_id, 0) {
                        number 32, true, -1
                    }
                    def entity1_tg ; df.world.entities.all.binsearch(entity1_id) ; end
                    field(:histfig1_id, 4) {
                        number 32, true, -1
                    }
                    def histfig1_tg ; df.world.history.figures.binsearch(histfig1_id) ; end
                    field(:entity2_id, 8) {
                        number 32, true, -1
                    }
                    def entity2_tg ; df.world.entities.all.binsearch(entity2_id) ; end
                    field(:histfig2_id, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2_id) ; end
                }
            }
            field(:artifact_in_site, 0) {
                compound(:EntityEvent_TData_TArtifactInSite) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:structure_id, 8) {
                        number 32, true, -1
                    }
                    field(:unk_1, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_in_subregion, 0) {
                compound(:EntityEvent_TData_TArtifactInSubregion) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:subregion_id, 4) {
                        number 32, true, -1
                    }
                    def subregion_tg ; df.world.world_data.regions[subregion_id] ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_in_feature_layer, 0) {
                compound(:EntityEvent_TData_TArtifactInFeatureLayer) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:feature_layer_id, 4) {
                        number 32, true, -1
                    }
                    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer_id] ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_in_inventory, 0) {
                compound(:EntityEvent_TData_TArtifactInInventory) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:hist_figure_id, 4) {
                        number 32, true, -1
                    }
                    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_not_in_site, 0) {
                compound(:EntityEvent_TData_TArtifactNotInSite) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:site_id, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                    field(:structure_id, 8) {
                        number 32, true, -1
                    }
                    field(:unk_1, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_not_in_subregion, 0) {
                compound(:EntityEvent_TData_TArtifactNotInSubregion) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:subregion_id, 4) {
                        number 32, true, -1
                    }
                    def subregion_tg ; df.world.world_data.regions[subregion_id] ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_not_in_feature_layer, 0) {
                compound(:EntityEvent_TData_TArtifactNotInFeatureLayer) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:feature_layer_id, 4) {
                        number 32, true, -1
                    }
                    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer_id] ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_not_in_inventory, 0) {
                compound(:EntityEvent_TData_TArtifactNotInInventory) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:hist_figure_id, 4) {
                        number 32, true, -1
                    }
                    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:unk_2, 12) {
                        number 32, true
                    }
                }
            }
            field(:artifact_destroyed, 0) {
                compound(:EntityEvent_TData_TArtifactDestroyed) {
                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:unk_1, 4) {
                        number 32, true
                    }
                    field(:unk_2, 8) {
                        number 32, true
                    }
                    field(:unk_3, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_year, 16) {
        number 32, true
    }
    field(:unk_year_tick, 20) {
        number 32, true
    }
    field(:year, 24) {
        number 32, true
    }
    field(:year_tick, 28) {
        number 32, true
    }
    field(:unk_1, 32) {
        number 32, true
    }
    field(:type, 36) {
        number 32, true, nil, EntityEventType
    }
end

class EntityOccasion < MemHack::Compound
    sizeof 192

    field(:id, 0) {
        number 32, true
    }
    field(:unk_1, 4) {
        number 32, true
    }
    field(:site, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:unk_2, 12) {
        number 32, true, -1
    }
    field(:name, 16) {
        global :LanguageName
    }
    field(:start_year_tick, 136) {
        number 32, true
    }
    field(:end_year_tick, 140) {
        number 32, true
    }
    field(:unk_3, 144) {
        number 32, true
    }
    field(:event, 148) {
        number 32, true, -1
    }
    def event_tg ; df.world.history.events.binsearch(event) ; end
    field(:unk_4, 152) {
        number 32, true, -1
    }
    field(:schedule, 160) {
        stl_vector(8) {
            pointer {
                global :EntityOccasionSchedule
            }
        }
    }
    field(:unk_5, 184) {
        number 32, true
    }
end

class EntityOccasionInfo < MemHack::Compound
    sizeof 72

    field(:occasions, 0) {
        stl_vector(8) {
            pointer {
                global :EntityOccasion
            }
        }
    }
    field(:next_occasion_id, 24) {
        number 32, true
    }
    field(:events, 28) {
        static_array(10, 4) {
            number 32, true, -1
        }
    }
    def events_tg ; df.world.history.events.binsearch(events) ; end
    field(:count, 68) {
        number 32, true
    }
end

class EntityOccasionSchedule < MemHack::Compound
    sizeof 56

    field(:type, 0) {
        number 32, true, nil, OccasionScheduleType
    }
    field(:reference, 4) {
        number 32, true
    }
    field(:reference2, 8) {
        number 32, true
    }
    field(:unk_1, 12) {
        number 32, true
    }
    field(:unk_2, 16) {
        number 32, true
    }
    field(:unk_3, 20) {
        number 32, true
    }
    field(:features, 24) {
        stl_vector(8) {
            pointer {
                global :EntityOccasionScheduleFeature
            }
        }
    }
    field(:start_year_tick, 48) {
        number 32, true
    }
    field(:end_year_tick, 52) {
        number 32, true
    }
end

class EntityOccasionScheduleFeature < MemHack::Compound
    sizeof 20

    field(:feature, 0) {
        number 32, true, nil, OccasionScheduleFeature
    }
    field(:reference, 4) {
        number 32, true
    }
    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_2, 12) {
        number 32, true
    }
    field(:unk_3, 16) {
        number 32, true
    }
end

class EntityPopulation < MemHack::Compound
    sizeof 240

    field(:name, 0) {
        global :LanguageName
    }
    field(:races, 120) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def races_tg ; races.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:counts, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk3, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk4, 192) {
        stl_vector(8) {
            pointer {
                global :EntityPopulationUnk4
            }
        }
    }
    field(:unk5, 216) {
        number 32, true
    }
    field(:layer_id, 220) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer_id] ; end
    field(:id, 224) {
        number 32, true
    }
    field(:flags, 228) {
        number 32, true
    }
    field(:civ_id, 232) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
end

class EntityPopulationUnk4 < MemHack::Compound
    sizeof 72

    field(:unk_1, 0) {
        stl_vector(8) {
            pointer {
                compound(:EntityPopulationUnk4_TUnk1) {
                    sizeof 12

                    field(:idx, 0) {
                        number 32, true
                    }
                    field(:unk1, 4) {
                        number 32, true
                    }
                    field(:unk2, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_2, 24) {
        stl_vector(8) {
            pointer {
                compound(:EntityPopulationUnk4_TUnk2) {
                    sizeof 12

                    field(:idx, 0) {
                        number 32, true
                    }
                    field(:unk1, 4) {
                        number 32, true
                    }
                    field(:unk2, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_3, 48) {
        stl_vector(8) {
            pointer {
                compound(:EntityPopulationUnk4_TUnk3) {
                    sizeof 8

                    field(:idx, 0) {
                        number 32, true
                    }
                    field(:unk1, 4) {
                        number 32, true
                    }
                }
            }
        }
    }
end

class EntityPosition < MemHack::Compound
    sizeof 904

    field(:code, 0) {
        stl_string
    }
    field(:id, 32) {
        number 32, true
    }
    field(:flags, 40) {
        df_flagarray(EntityPositionFlags)
    }
    field(:allowed_creature, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def allowed_creature_tg ; allowed_creature.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:allowed_class, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:rejected_creature, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def rejected_creature_tg ; rejected_creature.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:rejected_class, 128) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:name, 152) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:name_female, 216) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:name_male, 280) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse, 344) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse_female, 408) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse_male, 472) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:squad, 536) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:land_name, 600) {
        stl_string
    }
    field(:squad_size, 632) {
        number 16, true
    }
    field(:commander_id, 640) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:commander_civ, 664) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def commander_civ_tg ; commander_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:commander_types, 688) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:land_holder, 712) {
        number 16, true
    }
    field(:requires_population, 714) {
        number 16, true
    }
    field(:unk_1, 716) {
        number 16, true
    }
    field(:precedence, 720) {
        number 32, true, 30001
    }
    field(:replaced_by, 724) {
        number 32, true, -1
    }
    field(:number, 728) {
        number 16, true, 1
    }
    field(:appointed_by, 736) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:appointed_by_civ, 760) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def appointed_by_civ_tg ; appointed_by_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:succession_by_position, 784) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:responsibilities, 808) {
        static_array(42, 1, EntityPositionResponsibility) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:color, 850) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:required_boxes, 856) {
        number 32, true
    }
    field(:required_cabinets, 860) {
        number 32, true
    }
    field(:required_racks, 864) {
        number 32, true
    }
    field(:required_stands, 868) {
        number 32, true
    }
    field(:required_office, 872) {
        number 32, true
    }
    field(:required_bedroom, 876) {
        number 32, true
    }
    field(:required_dining, 880) {
        number 32, true
    }
    field(:required_tomb, 884) {
        number 32, true
    }
    field(:mandate_max, 888) {
        number 32, true
    }
    field(:demand_max, 892) {
        number 32, true
    }
    field(:unk_2, 896) {
        number 32, true, 30001
    }
end

class EntityPositionAssignment < MemHack::Compound
    sizeof 88

    field(:id, 0) {
        number 32, true
    }
    field(:histfig, 4) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:histfig2, 8) {
        number 32, true, -1
    }
    def histfig2_tg ; df.world.history.figures.binsearch(histfig2) ; end
    field(:position_id, 12) {
        number 32, true, -1
    }
    field(:flags, 16) {
        df_flagarray
    }
    field(:squad_id, 32) {
        number 32, true, -1
    }
    def squad_tg ; df.world.squads.all.binsearch(squad_id) ; end
    field(:unk_1, 36) {
        number 32, true, -1
    }
    field(:unk_2, 40) {
        number 32, true, -1
    }
    field(:unk_3, 44) {
        number 32, true, -1
    }
    field(:unk_4, 48) {
        number 32, true, -1
    }
    field(:unk_5, 56) {
        stl_vector
    }
    field(:unk_6, 80) {
        number 32, true
    }
end

class EntityPositionRaw < MemHack::Compound
    sizeof 1048

    field(:code, 0) {
        stl_string
    }
    field(:id, 32) {
        number 32, true
    }
    field(:flags, 40) {
        df_flagarray(EntityPositionRawFlags)
    }
    field(:allowed_creature_str, 56) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:allowed_creature, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def allowed_creature_tg ; allowed_creature.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:allowed_class, 128) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:rejected_creature_str, 152) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:rejected_creature, 200) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def rejected_creature_tg ; rejected_creature.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:rejected_class, 224) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:name, 248) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:name_female, 312) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:name_male, 376) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse, 440) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse_female, 504) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:spouse_male, 568) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:squad, 632) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:land_name, 696) {
        stl_string
    }
    field(:squad_size, 728) {
        number 16, true
    }
    field(:commander_str, 736) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:commander_id, 760) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:commander_types, 784) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:land_holder, 808) {
        number 16, true
    }
    field(:number, 810) {
        number 16, true
    }
    field(:requires_population, 812) {
        number 16, true
    }
    field(:execution_skill, 814) {
        number 16, true, nil, JobSkill
    }
    field(:precedence, 816) {
        number 32, true
    }
    field(:replaced_by_str, 824) {
        stl_string
    }
    field(:replaced_by, 856) {
        number 32, true
    }
    field(:appointed_by_str, 864) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:appointed_by, 888) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:succession_by_position_str, 912) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:succession_by_position, 936) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:responsibilities, 960) {
        static_array(42, 1, EntityPositionResponsibility) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:color, 1002) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:required_boxes, 1008) {
        number 32, true
    }
    field(:required_cabinets, 1012) {
        number 32, true
    }
    field(:required_racks, 1016) {
        number 32, true
    }
    field(:required_stands, 1020) {
        number 32, true
    }
    field(:required_office, 1024) {
        number 32, true
    }
    field(:required_bedroom, 1028) {
        number 32, true
    }
    field(:required_dining, 1032) {
        number 32, true
    }
    field(:required_tomb, 1036) {
        number 32, true
    }
    field(:mandate_max, 1040) {
        number 32, true
    }
    field(:demand_max, 1044) {
        number 32, true
    }
end

class EntityRaw < MemHack::Compound
    sizeof 15264

    field(:code, 0) {
        stl_string
    }
    field(:index, 32) {
        number 32, true
    }
    field(:raws, 40) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:creature_ids, 64) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def creature_tgs ; creature_ids.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:creatures, 88) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:equipment, 112) {
        compound(:EntityRaw_TEquipment) {
            field(:digger_id, 0) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def digger_tg ; digger_id.map { |i| df.world.raws.itemdefs.weapons[i] } ; end
            field(:weapon_id, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def weapon_tg ; weapon_id.map { |i| df.world.raws.itemdefs.weapons[i] } ; end
            field(:armor_id, 48) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_tg ; armor_id.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:ammo_id, 72) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def ammo_tg ; ammo_id.map { |i| df.world.raws.itemdefs.ammo[i] } ; end
            field(:helm_id, 96) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_tg ; helm_id.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:gloves_id, 120) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_tg ; gloves_id.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:shoes_id, 144) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_tg ; shoes_id.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:pants_id, 168) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_tg ; pants_id.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:shield_id, 192) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shield_tg ; shield_id.map { |i| df.world.raws.itemdefs.shields[i] } ; end
            field(:trapcomp_id, 216) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def trapcomp_tg ; trapcomp_id.map { |i| df.world.raws.itemdefs.trapcomps[i] } ; end
            field(:toy_id, 240) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def toy_tg ; toy_id.map { |i| df.world.raws.itemdefs.toys[i] } ; end
            field(:instrument_id, 264) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def instrument_tg ; instrument_id.map { |i| df.world.raws.itemdefs.instruments[i] } ; end
            field(:tool_id, 288) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def tool_tg ; tool_id.map { |i| df.world.raws.itemdefs.tools[i] } ; end
            field(:siegeammo_id, 312) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def siegeammo_tg ; siegeammo_id.map { |i| df.world.raws.itemdefs.siege_ammo[i] } ; end
            field(:armor_rarity, 336) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:helm_rarity, 360) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:gloves_rarity, 384) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:shoes_rarity, 408) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:pants_rarity, 432) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:digger_str, 456) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:weapon_str, 480) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:armor_str, 504) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:ammo_str, 528) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:helm_str, 552) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:gloves_str, 576) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:shoes_str, 600) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:pants_str, 624) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:shield_str, 648) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:trapcomp_str, 672) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:toy_str, 696) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:instrument_str, 720) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:siegeammo_str, 744) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:tool_str, 768) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:currency_value, 904) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:flags, 928) {
        df_flagarray(EntityRawFlags)
    }
    field(:translation, 944) {
        stl_string
    }
    field(:symbols, 976) {
        compound(:EntityRaw_TSymbols) {
            field(:symbols1, 0) {
                static_array(18, 288, EntityNameType) {
                    global :LanguageWordTable
                }
            }
            field(:symbols2, 5184) {
                static_array(18, 288, EntityNameType) {
                    global :LanguageWordTable
                }
            }
            field(:select_symbol, 10368) {
                static_array(18, 24, EntityNameType) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
            field(:subselect_symbol, 10800) {
                static_array(18, 24, EntityNameType) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
            field(:cull_symbol, 11232) {
                static_array(18, 24, EntityNameType) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
        }
    }
    field(:sphere_alignment, 12640) {
        static_array(130, 4, SphereType) {
            number 32, true
        }
    }
    field(:art_facet_modifier, 13160) {
        static_array(4, 4, ArtFacetType) {
            number 32, true
        }
    }
    field(:art_image_element_modifier, 13176) {
        static_array(5, 4, ArtImageElementType) {
            number 32, true
        }
    }
    field(:item_improvement_modifier, 13196) {
        static_array(14, 4, ImprovementType) {
            number 32, true
        }
    }
    field(:friendly_color, 13252) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:default_site_type, 13260) {
        number 32, true, nil, WorldSiteType
    }
    field(:likes_site, 13264) {
        static_array(11, 1, SiteType) {
            number 8, true
        }
    }
    field(:tolerates_site, 13275) {
        static_array(11, 1, SiteType) {
            number 8, true
        }
    }
    field(:biome_support, 13288) {
        static_array(51, 4, BiomeType) {
            number 32, true
        }
    }
    field(:start_biome, 13492) {
        static_array(51, 1, BiomeType) {
            number 8, true
        }
    }
    field(:settlement_biome, 13543) {
        static_array(51, 1, BiomeType) {
            number 8, true
        }
    }
    field(:active_season, 13594) {
        static_array(4, 1, Season) {
            number 8, true
        }
    }
    field(:progress_trigger, 13598) {
        compound(:EntityRaw_TProgressTrigger) {
            field(:population, 0) {
                number 16, true
            }
            field(:production, 2) {
                number 16, true
            }
            field(:trade, 4) {
                number 16, true
            }
            field(:pop_siege, 6) {
                number 16, true
            }
            field(:prod_siege, 8) {
                number 16, true
            }
            field(:trade_siege, 10) {
                number 16, true
            }
        }
    }
    field(:ethic, 13610) {
        static_array(22, 2, EthicType) {
            number 16, true, nil, EthicResponse
        }
    }
    field(:values, 13656) {
        static_array(64, 4, ValueType) {
            number 32, true
        }
    }
    field(:variable_value_min, 13912) {
        static_array(64, 4, ValueType) {
            number 32, true
        }
    }
    field(:variable_value_max, 14168) {
        static_array(64, 4, ValueType) {
            number 32, true
        }
    }
    field(:scholar, 14424) {
        compound(:EntityRaw_TScholar) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:PHILOSOPHER, 0) { bit 0 }
            field(:MATHEMATICIAN, 0) { bit 1 }
            field(:HISTORIAN, 0) { bit 2 }
            field(:ASTRONOMER, 0) { bit 3 }
            field(:NATURALIST, 0) { bit 4 }
            field(:CHEMIST, 0) { bit 5 }
            field(:GEOGRAPHER, 0) { bit 6 }
            field(:DOCTOR, 0) { bit 7 }
            field(:ENGINEER, 0) { bit 8 }
        }
    }
    field(:max_site_pop_number, 14428) {
        number 32, true
    }
    field(:max_pop_number, 14432) {
        number 32, true
    }
    field(:max_starting_civ_number, 14436) {
        number 32, true
    }
    field(:religion, 14440) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:religion_sphere, 14464) {
        stl_vector(2) {
            number 16, true, nil, SphereType
        }
    }
    field(:jobs, 14488) {
        compound(:EntityRaw_TJobs) {
            field(:permitted_job, 0) {
                static_array(135, 1, Profession) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:permitted_labor, 135) {
                static_array(94, 1, UnitLabor) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:world_construction, 229) {
                static_array(4, 1, WorldConstructionType) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:positions, 14728) {
        stl_vector(8) {
            pointer {
                global :EntityPositionRaw
            }
        }
    }
    field(:variable_positions, 14752) {
        static_array(42, 1, EntityPositionResponsibility) {
            number 8, true
        }
    }
    field(:site_variable_positions, 14794) {
        static_array(42, 1, EntityPositionResponsibility) {
            number 8, true
        }
    }
    field(:tissue_styles, 14840) {
        stl_vector(8) {
            pointer {
                compound(:EntityRaw_TTissueStyles) {
                    sizeof 64

                    field(:name, 0) {
                        stl_string
                    }
                    field(:preferred_shapings, 32) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:maintain_length_min, 56) {
                        number 32, true
                    }
                    field(:maintain_length_max, 60) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:workshops, 14864) {
        compound(:EntityRaw_TWorkshops) {
            field(:permitted_building_str, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:permitted_building_id, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def permitted_building_tg ; permitted_building_id.map { |i| df.world.raws.buildings.all.binsearch(i) } ; end
            field(:permitted_reaction_str, 48) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:permitted_reaction_id, 72) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def permitted_reaction_tg ; permitted_reaction_id.map { |i| df.world.raws.reactions.reactions[i] } ; end
        }
    }
    field(:land_holder_trigger, 14960) {
        compound(:EntityRaw_TLandHolderTrigger) {
            field(:num, 0) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:population, 40) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:wealth, 80) {
                static_array(10, 4) {
                    number 32, true
                }
            }
        }
    }
    field(:banditry, 15080) {
        number 32, true
    }
    field(:gem_shapes_str, 15088) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:stone_shapes_str, 15112) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:gem_shapes, 15136) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def gem_shapes_tg ; gem_shapes.map { |i| df.world.raws.descriptors.shapes[i] } ; end
    field(:stone_shapes, 15160) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def stone_shapes_tg ; stone_shapes.map { |i| df.world.raws.descriptors.shapes[i] } ; end
    field(:source_hfid, 15184) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:unk_v4201_1, 15188) {
        number 32, true, -1
    }
    field(:currency_str1, 15192) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:currency_str2, 15216) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:animal, 15240) {
        stl_vector(8) {
            pointer {
                global :EntityAnimalRaw
            }
        }
    }
end

class EntityRecipe < MemHack::Compound
    sizeof 104

    field(:subtype, 0) {
        number 16, true, -1
    }
    def subtype_tg ; df.world.raws.itemdefs.food[subtype] ; end
    field(:item_types, 8) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:item_subtypes, 32) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_types, 56) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_indices, 80) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class EntitySellPrices < MemHack::Compound
    sizeof 2576

    field(:items, 0) {
        pointer {
            global :EntitySellRequests
        }
    }
    field(:price, 8) {
        static_array(107, 24, EntitySellCategory) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
end

class EntitySellRequests < MemHack::Compound
    sizeof 2568

    field(:priority, 0) {
        static_array(107, 24, EntitySellCategory) {
            stl_vector(1) {
                number 8, true
            }
        }
    }
end

class EntitySiteLink < MemHack::Compound
    sizeof 88

    field(:target, 0) {
        number 32, true, -1
    }
    def target_tg ; df.world.world_data.sites.binsearch(target) ; end
    field(:entity_id, 4) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:land_holder, 8) {
        number 32, true, -1
    }
    field(:type, 12) {
        number 32, true, nil, EntitySiteLinkType
    }
    field(:unk_2, 16) {
        number 32, true, -1
    }
    field(:unk_3, 20) {
        number 32, true, -1
    }
    field(:flags, 24) {
        global :EntitySiteLinkFlags
    }
    field(:status, 28) {
        global :EntitySiteLinkStatusFlags
    }
    field(:link_strength, 32) {
        number 32, true, 100
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        number 32, true
    }
    field(:unk_7, 48) {
        stl_vector(8) {
            pointer {
                compound(:EntitySiteLink_TUnk7) {
                    sizeof 8

                    field(:unk_1, 0) {
                        number 32, true, -1
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:target_site_x, 72) {
        number 32, true
    }
    field(:target_site_y, 76) {
        number 32, true
    }
    field(:unk_v43_1, 80) {
        number 32, true, -1
    }
    field(:unk_v43_2, 84) {
        number 32, true, -1
    }
end

class EntitySiteLinkFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:residence, 0) { bit 0 }
    field(:capital, 0) { bit 1 }
    field(:fortress, 0) { bit 2 }
    field(:local_market, 0) { bit 3 }
    field(:trade_partner, 0) { bit 4 }
    field(:monument, 0) { bit 5 }
    field(:primary_criminal_gang, 0) { bit 6 }
    field(:criminal_gang, 0) { bit 7 }
    field(:invasion_marked, 0) { bit 8 }
    field(:land_for_holding, 0) { bit 9 }
    field(:central_holding_land, 0) { bit 10 }
    field(:land_holder_residence, 0) { bit 11 }
    field(:invasion_push_out, 0) { bit 12 }
    field(:reclaim, 0) { bit 13 }
    field(:occupation_failed, 0) { bit 14 }
    field(:base_of_operation, 0) { bit 15 }
    field(:holy_city, 0) { bit 16 }
end

class EntitySiteLinkStatusFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:failure_1, 0) { bit 0 }
    field(:failure_2, 0) { bit 1 }
    field(:unk_4, 0) { bit 2 }
    field(:unk_8, 0) { bit 3 }
    field(:unk_16, 0) { bit 4 }
    field(:unk_32, 0) { bit 5 }
    field(:unk_64, 0) { bit 6 }
    field(:unk_128, 0) { bit 7 }
    field(:unk_256, 0) { bit 8 }
    field(:unk_512, 0) { bit 9 }
    field(:unk_1024, 0) { bit 10 }
    field(:unk_2048, 0) { bit 11 }
    field(:unk_4096, 0) { bit 12 }
    field(:unk_8192, 0) { bit 13 }
end

class EntityTissueStyle < MemHack::Compound
    sizeof 96

    field(:name, 0) {
        stl_string
    }
    field(:preferred_shapings, 32) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_1, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:maintain_length_min, 80) {
        number 32, true
    }
    field(:maintain_length_max, 84) {
        number 32, true
    }
    field(:id, 88) {
        number 32, true
    }
end

class EntityUniform < MemHack::Compound
    sizeof 552

    field(:id, 0) {
        number 32, true
    }
    field(:unk_4, 4) {
        number 16, true
    }
    field(:uniform_item_types, 8) {
        static_array(7, 24, UniformCategory) {
            stl_vector(2) {
                number 16, true, nil, ItemType
            }
        }
    }
    field(:uniform_item_subtypes, 176) {
        static_array(7, 24, UniformCategory) {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    }
    field(:uniform_item_info, 344) {
        static_array(7, 24, UniformCategory) {
            stl_vector(8) {
                pointer {
                    global :EntityUniformItem
                }
            }
        }
    }
    field(:name, 512) {
        stl_string
    }
    field(:flags, 544) {
        global :UniformFlags
    }
end

class EntityUniformItem < MemHack::Compound
    sizeof 32

    field(:random_dye, 0) {
        number 8, true
    }
    field(:armorlevel, 1) {
        number 8, true
    }
    field(:item_color, 2) {
        number 16, true, -1
    }
    def item_color_tg ; df.world.raws.descriptors.colors[item_color] ; end
    field(:art_image_id, 4) {
        number 32, true
    }
    field(:art_image_subid, 8) {
        number 16, true
    }
    field(:image_thread_color, 10) {
        number 16, true, -1
    }
    def image_thread_color_tg ; df.world.raws.descriptors.colors[image_thread_color] ; end
    field(:image_material_class, 12) {
        number 16, true, nil, EntityMaterialCategory
    }
    field(:maker_race, 14) {
        number 16, true
    }
    field(:indiv_choice, 16) {
        global :UniformIndivChoice
    }
    field(:mattype, 20) {
        number 16, true, -1
    }
    field(:matindex, 24) {
        number 32, true
    }
    field(:material_class, 28) {
        number 16, true, nil, EntityMaterialCategory
    }
end

class EntityUnkV471 < MemHack::Compound
    sizeof 160

    field(:unk_v47_1, 0) {
        number 32, true, -1
    }
    def unk_v47_1_tg ; df.world.history.figures.binsearch(unk_v47_1) ; end
    field(:unk_v47_2, 4) {
        number 32, true
    }
    field(:unk_v47_3, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:agreement, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def agreement_tg ; agreement.map { |i| df.world.agreements.all.binsearch(i) } ; end
    field(:unk_v47_5, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_6, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_7, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_8, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_9, 152) {
        number 32, true
    }
end

class Feature < MemHack::Compound
    sizeof 136

    rtti_classname :featurest

    field(:population, 8) {
        stl_vector(8) {
            pointer {
                global :WorldPopulation
            }
        }
    }
    field(:irritation_level, 32) {
        number 32, true
    }
    field(:irritation_attacks, 36) {
        number 16, true
    }
    field(:embark_pos, 40) {
        global :Coord2dPath
    }
    field(:min_map_z, 88) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:max_map_z, 112) {
        stl_vector(2) {
            number 16, true
        }
    }
    def getType()
        FeatureType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def shiftCoords(x, y, z)
        DFHack.vmethod_call(self, 24, x, y, z) ; nil
    end
end

class FeatureAlteration < MemHack::Compound
    sizeof 8

    rtti_classname :feature_alterationst

    def getType()
        FeatureAlterationType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class FeatureAlterationNewLavaFillZst < FeatureAlteration
    sizeof 16

    rtti_classname :feature_alteration_new_lava_fill_zst

    field(:magma_fill_z, 8) {
        number 32, true
    }
end

class FeatureAlterationNewPopMaxst < FeatureAlteration
    sizeof 16

    rtti_classname :feature_alteration_new_pop_maxst

    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_2, 12) {
        number 32, true
    }
end

class FeatureCavest < Feature
    sizeof 136

    rtti_classname :feature_cavest

end

class FeatureDeepSpecialTubest < Feature
    sizeof 136

    rtti_classname :feature_deep_special_tubest

end

class FeatureDeepSurfacePortalst < Feature
    sizeof 136

    rtti_classname :feature_deep_surface_portalst

end

class FeatureInit < MemHack::Compound
    sizeof 64

    rtti_classname :feature_initst

    field(:flags, 8) {
        df_flagarray(FeatureInitFlags)
    }
    field(:alterations, 24) {
        stl_vector(8) {
            pointer {
                global :FeatureAlteration
            }
        }
    }
    field(:start_x, 48) {
        number 16, true
    }
    field(:start_y, 50) {
        number 16, true
    }
    field(:end_x, 52) {
        number 16, true
    }
    field(:end_y, 54) {
        number 16, true
    }
    field(:start_depth, 56) {
        number 16, true, nil, LayerType
    }
    field(:end_depth, 58) {
        number 16, true, nil, LayerType
    }
    def getType()
        FeatureType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file, include_feature)
        DFHack.vmethod_call(self, 8, file, include_feature) ; nil
    end
    def read_file(file, loadversion, include_feature)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion), include_feature) ; nil
    end
    def createFeature()
        ptr = DFHack.vmethod_call(self, 24)
        class << self
            global :Feature
        end._at(ptr) if ptr != 0
    end
    def recreateFeature()
        ptr = DFHack.vmethod_call(self, 32)
        class << self
            global :Feature
        end._at(ptr) if ptr != 0
    end
    def destroyFeature()
        DFHack.vmethod_call(self, 40) ; nil
    end
    def getFeature()
        ptr = DFHack.vmethod_call(self, 48)
        class << self
            global :Feature
        end._at(ptr) if ptr != 0
    end
    def getMaterial(mat_type, mat_index)
        DFHack.vmethod_call(self, 64, mat_type, mat_index) ; nil
    end
    def getColor(foreground, background, bright)
        DFHack.vmethod_call(self, 104, foreground, background, bright) ; nil
    end
    def getName(name)
        DFHack.vmethod_call(self, 112, name) ; nil
    end
    def isWater()
        val = DFHack.vmethod_call(self, 120)
        (val & 1) != 0
    end
    def isSubterranean()
        val = DFHack.vmethod_call(self, 128)
        (val & 1) != 0
    end
    def isMagma()
        val = DFHack.vmethod_call(self, 136)
        (val & 1) != 0
    end
    def isChasm()
        val = DFHack.vmethod_call(self, 144)
        (val & 1) != 0
    end
    def isLayer()
        val = DFHack.vmethod_call(self, 152)
        (val & 1) != 0
    end
    def getLayer()
        val = DFHack.vmethod_call(self, 168)
    end
end

class FeatureInitCavest < FeatureInit
    sizeof 72

    rtti_classname :feature_init_cavest

    field(:feature, 64) {
        pointer {
            global :FeatureCavest
        }
    }
end

class FeatureInitDeepSpecialTubest < FeatureInit
    sizeof 80

    rtti_classname :feature_init_deep_special_tubest

    field(:mat_type, 64) {
        number 16, true, -1
    }
    field(:mat_index, 68) {
        number 32, true
    }
    field(:feature, 72) {
        pointer {
            global :FeatureDeepSpecialTubest
        }
    }
end

class FeatureInitDeepSurfacePortalst < FeatureInit
    sizeof 80

    rtti_classname :feature_init_deep_surface_portalst

    field(:mat_type, 64) {
        number 16, true, -1
    }
    field(:mat_index, 68) {
        number 32, true
    }
    field(:feature, 72) {
        pointer {
            global :FeatureDeepSurfacePortalst
        }
    }
end

class FeatureInitMagmaCoreFromLayerst < FeatureInit
    sizeof 80

    rtti_classname :feature_init_magma_core_from_layerst

    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:feature, 72) {
        pointer {
            global :FeatureMagmaCoreFromLayerst
        }
    }
end

class FeatureInitMagmaPoolst < FeatureInit
    sizeof 72

    rtti_classname :feature_init_magma_poolst

    field(:feature, 64) {
        pointer {
            global :FeatureMagmaPoolst
        }
    }
end

class FeatureInitOutdoorRiverst < FeatureInit
    sizeof 72

    rtti_classname :feature_init_outdoor_riverst

    field(:feature, 64) {
        pointer {
            global :FeatureOutdoorRiverst
        }
    }
end

class FeatureInitPitst < FeatureInit
    sizeof 72

    rtti_classname :feature_init_pitst

    field(:feature, 64) {
        pointer {
            global :FeaturePitst
        }
    }
end

class FeatureInitSubterraneanFromLayerst < FeatureInit
    sizeof 80

    rtti_classname :feature_init_subterranean_from_layerst

    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:feature, 72) {
        pointer {
            global :FeatureSubterraneanFromLayerst
        }
    }
end

class FeatureInitUnderworldFromLayerst < FeatureInit
    sizeof 88

    rtti_classname :feature_init_underworld_from_layerst

    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:mat_type, 68) {
        number 16, true, -1
    }
    field(:mat_index, 72) {
        number 32, true
    }
    field(:feature, 80) {
        pointer {
            global :FeatureUnderworldFromLayerst
        }
    }
end

class FeatureInitVolcanost < FeatureInit
    sizeof 72

    rtti_classname :feature_init_volcanost

    field(:feature, 64) {
        pointer {
            global :FeatureVolcanost
        }
    }
end

class FeatureMagmaCoreFromLayerst < Feature
    sizeof 136

    rtti_classname :feature_magma_core_from_layerst

end

class FeatureMagmaPoolst < Feature
    sizeof 144

    rtti_classname :feature_magma_poolst

    field(:magma_fill_z, 136) {
        number 32, true
    }
end

class FeatureOutdoorRiverst < Feature
    sizeof 136

    rtti_classname :feature_outdoor_riverst

end

class FeaturePitst < Feature
    sizeof 136

    rtti_classname :feature_pitst

end

class FeatureSubterraneanFromLayerst < Feature
    sizeof 136

    rtti_classname :feature_subterranean_from_layerst

end

class FeatureUnderworldFromLayerst < Feature
    sizeof 136

    rtti_classname :feature_underworld_from_layerst

end

class FeatureVolcanost < Feature
    sizeof 144

    rtti_classname :feature_volcanost

    field(:magma_fill_z, 136) {
        number 32, true
    }
end

class FileCompressorst < MemHack::Compound
    sizeof 328

    field(:compressed, 0) {
        number 8, true, nil, BooleanEnum
    }
    field(:f, 8) {
    }
    field(:in_buffer, 288) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:in_buffersize, 296) {
        number 4, true
    }
    field(:in_buffer_amount_loaded, 300) {
        number 4, true
    }
    field(:in_buffer_position, 304) {
        number 4, true
    }
    field(:out_buffer, 312) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:out_buffersize, 320) {
        number 4, true
    }
    field(:out_buffer_amount_written, 324) {
        number 32, true
    }
end

class Fire < MemHack::Compound
    sizeof 16

    field(:pos, 0) {
        global :Coord
    }
    field(:timer, 6) {
        number 16, true
    }
    field(:inner_temp_cur, 8) {
        number 16, false, 10508
    }
    field(:outer_temp_cur, 10) {
        number 16, false, 10000
    }
    field(:inner_temp_max, 12) {
        number 16, false, 10708
    }
    field(:outer_temp_max, 14) {
        number 16, false, 10708
    }
end

class FlowGuide < MemHack::Compound
    sizeof 16

    rtti_classname :flow_guidest

    field(:id, 8) {
        number 32, true
    }
    field(:unk_8, 12) {
        number 8, true
    }
    def getType()
        FlowGuideType.sym(DFHack.vmethod_call(self, 0))
    end
    def shiftCoords(x, y, z)
        DFHack.vmethod_call(self, 8, x, y, z) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
end

class FlowGuideItemCloudst < FlowGuide
    sizeof 128

    rtti_classname :flow_guide_item_cloudst

    field(:item_type, 16) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 18) {
        number 16, true, -1
    }
    field(:mattype, 20) {
        number 16, true, -1
    }
    field(:matindex, 24) {
        number 32, true
    }
    field(:unk_18, 28) {
        number 32, true
    }
    field(:unk_1c, 32) {
        number 32, true
    }
    field(:unk_1, 36) {
        static_array(15, 6) {
            global :Coord
        }
    }
end

class FlowGuideTrailingFlowst < FlowGuide
    sizeof 112

    rtti_classname :flow_guide_trailing_flowst

    field(:unk_1, 16) {
        static_array(15, 6) {
            global :Coord
        }
    }
end

class FlowInfo < MemHack::Compound
    sizeof 28

    field(:type, 0) {
        number 16, true, nil, FlowType
    }
    field(:mat_type, 2) {
        number 16, true, -1
    }
    field(:mat_index, 4) {
        number 32, true, -1
    }
    field(:density, 8) {
        number 16, true
    }
    field(:pos, 10) {
        global :Coord
    }
    field(:dest, 16) {
        global :Coord
    }
    field(:expanding, 22) {
        number 8, true, 1, BooleanEnum
    }
    field(:reuse, 23) {
        number 8, true, nil, BooleanEnum
    }
    field(:guide_id, 24) {
        number 32, true, -1
    }
    def guide_tg ; df.world.flow_guides.all.binsearch(guide_id) ; end
end

class FlowReusePool < MemHack::Compound
    sizeof 8

    field(:reuse_idx, 0) {
        number 32, true, -1
    }
    field(:flags, 4) {
        compound(:FlowReusePool_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:active, 0) { bit 0 }
        }
    }
end

class FmodSound < MemHack::Compound
    sizeof 16

    field(:sound, 0) {
        pointer {
        }
    }
    field(:channel, 8) {
        pointer {
        }
    }
end

class GaitInfo < MemHack::Compound
    sizeof 32

    field(:action_string_idx, 0) {
        number 32, true, -1
    }
    field(:full_speed, 4) {
        number 32, true
    }
    field(:buildup_time, 8) {
        number 32, true
    }
    field(:turn_max, 12) {
        number 32, true
    }
    field(:start_speed, 16) {
        number 32, true
    }
    field(:energy_use, 20) {
        number 32, true
    }
    field(:flags, 24) {
        compound(:GaitInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:layers_slow, 0) { bit 0 }
            field(:strength, 0) { bit 1 }
            field(:agility, 0) { bit 2 }
        }
    }
    field(:stealth_slows, 28) {
        number 32, true
    }
end

class GateFlags < MemHack::Compound
    field(:_whole, 0) {
        number 16, false
    }
    field(:closed, 0) { bit 0 }
    field(:closing, 0) { bit 1 }
    field(:opening, 0) { bit 2 }
    field(:collapsing, 0) { bit 3 }
    field(:has_support, 0) { bit 4 }
end

class GeneralRef < MemHack::Compound
    sizeof 8

    rtti_classname :general_refst

    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
    def getType()
        GeneralRefType.sym(DFHack.vmethod_call(self, 16))
    end
    def getItem()
        ptr = DFHack.vmethod_call(self, 24)
        class << self
            global :Item
        end._at(ptr) if ptr != 0
    end
    def getUnit()
        ptr = DFHack.vmethod_call(self, 32)
        class << self
            global :Unit
        end._at(ptr) if ptr != 0
    end
    def getProjectile()
        ptr = DFHack.vmethod_call(self, 40)
        class << self
            global :Projectile
        end._at(ptr) if ptr != 0
    end
    def getBuilding()
        ptr = DFHack.vmethod_call(self, 48)
        class << self
            global :Building
        end._at(ptr) if ptr != 0
    end
    def getEntity()
        ptr = DFHack.vmethod_call(self, 56)
        class << self
            global :HistoricalEntity
        end._at(ptr) if ptr != 0
    end
    def getArtifact()
        ptr = DFHack.vmethod_call(self, 64)
        class << self
            global :ArtifactRecord
        end._at(ptr) if ptr != 0
    end
    def getNemesis()
        ptr = DFHack.vmethod_call(self, 72)
        class << self
            global :NemesisRecord
        end._at(ptr) if ptr != 0
    end
    def getEvent()
        ptr = DFHack.vmethod_call(self, 80)
        class << self
            global :ActivityEvent
        end._at(ptr) if ptr != 0
    end
    def setID(arg0)
        DFHack.vmethod_call(self, 88, arg0) ; nil
    end
    def getID()
        val = DFHack.vmethod_call(self, 96)
    end
    def setLocation(x, y, z)
        DFHack.vmethod_call(self, 104, x, y, z) ; nil
    end
    def getLocation(out_x, out_y, out_z)
        DFHack.vmethod_call(self, 112, out_x, out_y, out_z) ; nil
    end
    def clone()
        ptr = DFHack.vmethod_call(self, 128)
        class << self
            global :GeneralRef
        end._at(ptr) if ptr != 0
    end
    def getDescription(str)
        DFHack.vmethod_call(self, 144, str) ; nil
    end
    def getDescription2(str)
        DFHack.vmethod_call(self, 152, str) ; nil
    end
    def getDescription3(str)
        DFHack.vmethod_call(self, 160, str) ; nil
    end
end

class GeneralRefAbstractBuildingst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_abstract_buildingst

    field(:site_id, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:building_id, 12) {
        number 32, true, -1
    }
end

class GeneralRefActivityEventst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_activity_eventst

    field(:activity_id, 8) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:event_id, 12) {
        number 32, true
    }
end

class GeneralRefArtifact < GeneralRef
    sizeof 16

    rtti_classname :general_ref_artifactst

    field(:artifact_id, 8) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
end

class GeneralRefBuilding < GeneralRef
    sizeof 16

    rtti_classname :general_ref_buildingst

    field(:building_id, 8) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
end

class GeneralRefBuildingCagedst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_cagedst

end

class GeneralRefBuildingChainst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_chainst

end

class GeneralRefBuildingCivzoneAssignedst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_civzone_assignedst

end

class GeneralRefBuildingDestinationst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_destinationst

end

class GeneralRefBuildingDisplayFurniturest < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_display_furniturest

end

class GeneralRefBuildingHolderst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_holderst

end

class GeneralRefBuildingNestBoxst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_nest_boxst

end

class GeneralRefBuildingTriggerst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_triggerst

end

class GeneralRefBuildingTriggertargetst < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_triggertargetst

end

class GeneralRefBuildingUseTarget1st < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_use_target_1st

end

class GeneralRefBuildingUseTarget2st < GeneralRefBuilding
    sizeof 16

    rtti_classname :general_ref_building_use_target_2st

end

class GeneralRefBuildingWellTag < GeneralRefBuilding
    sizeof 24

    rtti_classname :general_ref_building_well_tagst

    field(:direction, 16) {
        number 8, true
    }
end

class GeneralRefCoinbatch < GeneralRef
    sizeof 16

    rtti_classname :general_ref_coinbatchst

    field(:batch, 8) {
        number 32, true
    }
end

class GeneralRefItem < GeneralRef
    sizeof 16

    rtti_classname :general_ref_itemst

    field(:item_id, 8) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
    field(:cached_index, 12) {
        number 32, true, -1
    }
end

class GeneralRefContainedInItemst < GeneralRefItem
    sizeof 16

    rtti_classname :general_ref_contained_in_itemst

end

class GeneralRefContainsItemst < GeneralRefItem
    sizeof 16

    rtti_classname :general_ref_contains_itemst

end

class GeneralRefUnit < GeneralRef
    sizeof 16

    rtti_classname :general_ref_unitst

    field(:unit_id, 8) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:cached_index, 12) {
        number 32, true, -1
    }
end

class GeneralRefContainsUnitst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_contains_unitst

end

class GeneralRefCreaturest < GeneralRef
    sizeof 32

    rtti_classname :general_ref_creaturest

    field(:race, 8) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 12) {
        number 32, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:flags, 24) {
        global :UndeadFlags
    }
end

class GeneralRefDanceFormst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_dance_formst

    field(:dance_form_id, 8) {
        number 32, true, -1
    }
    def dance_form_tg ; df.world.dance_forms.all.binsearch(dance_form_id) ; end
end

class GeneralRefEntity < GeneralRef
    sizeof 16

    rtti_classname :general_ref_entityst

    field(:entity_id, 8) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
end

class GeneralRefEntityArtImage < GeneralRef
    sizeof 16

    rtti_classname :general_ref_entity_art_imagest

    field(:entity_id, 8) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:index, 12) {
        number 32, true
    }
end

class GeneralRefEntityItemownerst < GeneralRefEntity
    sizeof 16

    rtti_classname :general_ref_entity_itemownerst

end

class GeneralRefEntityOfferedst < GeneralRefEntity
    sizeof 16

    rtti_classname :general_ref_entity_offeredst

end

class GeneralRefEntityPopst < GeneralRef
    sizeof 24

    rtti_classname :general_ref_entity_popst

    field(:unk_1, 8) {
        number 32, true
    }
    field(:race, 12) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:unk_2, 16) {
        number 32, true
    }
    field(:flags, 20) {
        global :UndeadFlags
    }
end

class GeneralRefEntityStolenst < GeneralRefEntity
    sizeof 16

    rtti_classname :general_ref_entity_stolenst

end

class GeneralRefFeatureLayerst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_feature_layerst

    field(:underground_region_id, 8) {
        number 32, true, -1
    }
    def underground_region_tg ; df.world.world_data.underground_regions[underground_region_id] ; end
end

class GeneralRefHistoricalEventst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_historical_eventst

    field(:event_id, 8) {
        number 32, true, -1
    }
    def event_tg ; df.world.history.events.binsearch(event_id) ; end
end

class GeneralRefHistoricalFigurest < GeneralRef
    sizeof 16

    rtti_classname :general_ref_historical_figurest

    field(:hist_figure_id, 8) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
end

class GeneralRefInteractionst < GeneralRef
    sizeof 24

    rtti_classname :general_ref_interactionst

    field(:interaction_id, 8) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction_id) ; end
    field(:source_id, 12) {
        number 32, true, -1
    }
    field(:unk_08, 16) {
        number 32, true
    }
    field(:unk_0c, 20) {
        number 32, true
    }
end

class GeneralRefIsArtifactst < GeneralRefArtifact
    sizeof 16

    rtti_classname :general_ref_is_artifactst

end

class GeneralRefNemesis < GeneralRef
    sizeof 16

    rtti_classname :general_ref_nemesisst

    field(:nemesis_id, 8) {
        number 32, true, -1
    }
    def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis_id) ; end
end

class GeneralRefIsNemesisst < GeneralRefNemesis
    sizeof 16

    rtti_classname :general_ref_is_nemesisst

end

class GeneralRefItemType < GeneralRef
    sizeof 24

    rtti_classname :general_ref_item_typest

    field(:type, 8) {
        number 32, true, nil, ItemType
    }
    field(:subtype, 12) {
        number 32, true, -1
    }
    field(:mat_type, 16) {
        number 16, true, -1
    }
    field(:mat_index, 18) {
        number 16, true, -1
    }
end

class GeneralRefKnowledgeScholarFlagst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_knowledge_scholar_flagst

    field(:knowledge, 8) {
        global :KnowledgeScholarCategoryFlag
    }
end

class GeneralRefLanguagest < GeneralRef
    sizeof 16

    rtti_classname :general_ref_languagest

    field(:unk_1, 8) {
        number 32, true
    }
end

class GeneralRefLocationst < GeneralRef
    sizeof 24

    rtti_classname :general_ref_locationst

    field(:x, 8) {
        number 32, true
    }
    field(:y, 12) {
        number 32, true
    }
    field(:z, 16) {
        number 32, true
    }
end

class GeneralRefMapsquare < GeneralRef
    sizeof 16

    rtti_classname :general_ref_mapsquarest

    field(:tiletype, 8) {
        number 16, true, nil, Tiletype
    }
    field(:mat_type, 10) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true, -1
    }
end

class GeneralRefMusicalFormst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_musical_formst

    field(:musical_form_id, 8) {
        number 32, true, -1
    }
    def musical_form_tg ; df.world.musical_forms.all.binsearch(musical_form_id) ; end
end

class GeneralRefPoeticFormst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_poetic_formst

    field(:poetic_form_id, 8) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
end

class GeneralRefProjectile < GeneralRef
    sizeof 16

    rtti_classname :general_ref_projectilest

    field(:projectile_id, 8) {
        number 32, true, -1
    }
end

class GeneralRefSitest < GeneralRef
    sizeof 16

    rtti_classname :general_ref_sitest

    field(:site_id, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
end

class GeneralRefSpherest < GeneralRef
    sizeof 16

    rtti_classname :general_ref_spherest

    field(:sphere_type, 8) {
        number 16, true, nil, SphereType
    }
end

class GeneralRefSubregionst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_subregionst

    field(:region_id, 8) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region_id] ; end
end

class GeneralRefUnitBeateest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_beateest

end

class GeneralRefUnitCageest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_cageest

end

class GeneralRefUnitClimberst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_climberst

end

class GeneralRefUnitFoodreceiverst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_foodreceiverst

end

class GeneralRefUnitGeldeest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_geldeest

end

class GeneralRefUnitHolderst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_holderst

end

class GeneralRefUnitInfantst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_infantst

end

class GeneralRefUnitInterrogateest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_interrogateest

end

class GeneralRefUnitItemownerst < GeneralRefUnit
    sizeof 24

    rtti_classname :general_ref_unit_itemownerst

    field(:flags, 16) {
        compound(:GeneralRefUnitItemownerst_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:litter, 0) { bit 0 }
        }
    }
end

class GeneralRefUnitKidnapeest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_kidnapeest

end

class GeneralRefUnitMilkeest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_milkeest

end

class GeneralRefUnitPatientst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_patientst

end

class GeneralRefUnitReporteest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_reporteest

end

class GeneralRefUnitRiderst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_riderst

end

class GeneralRefUnitSheareest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_sheareest

end

class GeneralRefUnitSlaughtereest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_slaughtereest

end

class GeneralRefUnitSuckeest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_suckeest

end

class GeneralRefUnitTradebringerst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_tradebringerst

end

class GeneralRefUnitTraineest < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_traineest

end

class GeneralRefUnitWorkerst < GeneralRefUnit
    sizeof 16

    rtti_classname :general_ref_unit_workerst

end

class GeneralRefValueLevelst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_value_levelst

    field(:value, 8) {
        number 32, true, nil, ValueType
    }
    field(:level, 12) {
        number 32, true
    }
end

class GeneralRefWrittenContentst < GeneralRef
    sizeof 16

    rtti_classname :general_ref_written_contentst

    field(:written_content_id, 8) {
        number 32, true, -1
    }
    def written_content_tg ; df.world.written_contents.all.binsearch(written_content_id) ; end
end

class GlowingBarrier < MemHack::Compound
    sizeof 40

    field(:triggered, 0) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1, 4) {
        number 32, true
    }
    field(:buildings, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def buildings_tg ; buildings.map { |i| df.world.buildings.all.binsearch(i) } ; end
    field(:pos, 32) {
        global :Coord
    }
end

class Graphic < MemHack::Compound
    sizeof 928

    field(:screenx, 0) {
        number 4, true
    }
    field(:screeny, 4) {
        number 4, true
    }
    field(:screenf, 8) {
        number 8, false, nil, CursesColor
    }
    field(:screenb, 9) {
        number 8, false, nil, CursesColor
    }
    field(:screenbright, 10) {
        number 8, true, nil, BooleanEnum
    }
    field(:screen, 16) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos, 24) {
        pointer_ary(4) {
            number 4, true
        }
    }
    field(:screentexpos_addcolor, 32) {
        pointer_ary(1) {
            number 8, true
        }
    }
    field(:screentexpos_grayscale, 40) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cf, 48) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cbr, 56) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:clipx, 64) {
        static_array(2, 4) {
            number 4, true
        }
    }
    field(:clipy, 72) {
        static_array(2, 4) {
            number 4, true
        }
    }
    field(:tex_pos, 80) {
        static_array(1, 4) {
            number 4, true
        }
    }
    field(:rect_id, 84) {
        number 4, true
    }
    field(:print_time, 88) {
        static_array(100, 8) {
            global :LargeInteger
        }
    }
    field(:print_index, 888) {
        number 4, true
    }
    field(:display_frames, 892) {
        number 8, true
    }
    field(:force_full_display_count, 894) {
        number 16, true
    }
    field(:original_rect, 896) {
        number 8, true
    }
    field(:dimx, 900) {
        number 32, true
    }
    field(:dimy, 904) {
        number 32, true
    }
    field(:mouse_x, 908) {
        number 32, true
    }
    field(:mouse_y, 912) {
        number 32, true
    }
    field(:screen_limit, 920) {
        pointer {
            number 8, false
        }
    }
end

class HaulingRoute < MemHack::Compound
    sizeof 112

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        stl_string
    }
    field(:stops, 40) {
        stl_vector(8) {
            pointer {
                global :HaulingStop
            }
        }
    }
    field(:vehicle_ids, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def vehicle_tgs ; vehicle_ids.map { |i| df.world.vehicles.all.binsearch(i) } ; end
    field(:vehicle_stops, 88) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
end

class HaulingStop < MemHack::Compound
    sizeof 1984

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        stl_string
    }
    field(:pos, 40) {
        global :Coord
    }
    field(:settings, 48) {
        global :StockpileSettings
    }
    field(:conditions, 1928) {
        stl_vector(8) {
            pointer {
                global :StopDepartCondition
            }
        }
    }
    field(:stockpiles, 1952) {
        stl_vector(8) {
            pointer {
                global :RouteStockpileLink
            }
        }
    }
    field(:time_waiting, 1976) {
        number 32, true
    }
    field(:cart_id, 1980) {
        number 32, true, -1
    }
    def cart_tg ; df.world.items.all.binsearch(cart_id) ; end
end

class HealthViewBits1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:bleeding_heavy, 0) { bit 0 }
    field(:bleeding, 0) { bit 1 }
    field(:pale, 0) { bit 2 }
    field(:blood_loss_severe, 0) { bit 3 }
    field(:faint, 0) { bit 4 }
    field(:blood_loss, 0) { bit 5 }
    field(:paralyzed, 0) { bit 6 }
    field(:paralyzed_partially, 0) { bit 7 }
    field(:sluggish, 0) { bit 8 }
    field(:numb_completely, 0) { bit 9 }
    field(:numb_partially, 0) { bit 10 }
    field(:numb_slightly, 0) { bit 11 }
    field(:fever_serious, 0) { bit 12 }
    field(:fever_moderate, 0) { bit 13 }
    field(:fever_slight, 0) { bit 14 }
    field(:pain_extreme, 0) { bit 15 }
    field(:pain_moderate, 0) { bit 16 }
    field(:pain_slight, 0) { bit 17 }
    field(:exhausted, 0) { bit 18 }
    field(:overexerted, 0) { bit 19 }
    field(:tired, 0) { bit 20 }
    field(:stunned, 0) { bit 21 }
    field(:dizzy, 0) { bit 22 }
    field(:drowning, 0) { bit 23 }
    field(:winded, 0) { bit 24 }
    field(:nauseous, 0) { bit 25 }
    field(:drowsy_very, 0) { bit 26 }
    field(:drowsy, 0) { bit 27 }
    field(:dehydrated, 0) { bit 28 }
    field(:thirsty, 0) { bit 29 }
    field(:starving, 0) { bit 30 }
    field(:hungry, 0) { bit 31 }
end

class HealthViewBits2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:breathe_cant, 0) { bit 0 }
    field(:breathe_trouble, 0) { bit 1 }
    field(:vision_lost, 0) { bit 2 }
    field(:vision_impaired, 0) { bit 3 }
    field(:vision_impaired2, 0) { bit 4 }
    field(:stand_cant, 0) { bit 5 }
    field(:stand_impaired, 0) { bit 6 }
    field(:grasp_cant, 0) { bit 7 }
    field(:grasp_impaired, 0) { bit 8 }
    field(:fly_cant, 0) { bit 9 }
    field(:fly_impaired, 0) { bit 10 }
    field(:motor_nerve, 0) { bit 11 }
    field(:sensory_nerve, 0) { bit 12 }
    field(:spilled, 0) { bit 13 }
    field(:artery_major, 0) { bit 14 }
    field(:artery, 0) { bit 15 }
    field(:tendon_torn, 0) { bit 16 }
    field(:tendon_strain, 0) { bit 17 }
    field(:tendon_bruise, 0) { bit 18 }
    field(:ligament_torn, 0) { bit 19 }
    field(:ligament_sprain, 0) { bit 20 }
    field(:ligament_bruise, 0) { bit 21 }
    field(:fracture_compound, 0) { bit 22 }
    field(:fracture_overlap, 0) { bit 23 }
    field(:need_setting, 0) { bit 24 }
    field(:tissue_broken, 0) { bit 25 }
    field(:tissue_part_broken, 0) { bit 26 }
    field(:damage_heavy, 0) { bit 27 }
    field(:damage_moderate, 0) { bit 28 }
    field(:damage_light, 0) { bit 29 }
    field(:pain_extreme, 0) { bit 30 }
    field(:pain_moderate, 0) { bit 31 }
end

class HealthViewBits3 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:pain_minor, 0) { bit 0 }
    field(:swell_extreme, 0) { bit 1 }
    field(:swell_medium, 0) { bit 2 }
    field(:swell_minor, 0) { bit 3 }
    field(:infection, 0) { bit 4 }
    field(:rq_diagnosis, 0) { bit 5 }
    field(:rq_crutch, 0) { bit 6 }
    field(:inoperable_rot, 0) { bit 7 }
    field(:rq_cleaning, 0) { bit 8 }
    field(:rq_surgery, 0) { bit 9 }
    field(:rq_suture, 0) { bit 10 }
    field(:rq_setting, 0) { bit 11 }
    field(:rq_dressing, 0) { bit 12 }
    field(:rq_traction, 0) { bit 13 }
    field(:rq_immobilize, 0) { bit 14 }
end

class HistfigEntityLink < MemHack::Compound
    sizeof 16

    rtti_classname :histfig_entity_linkst

    field(:entity_id, 8) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:link_strength, 12) {
        number 16, true
    }
    def getType()
        HistfigEntityLinkType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
    def getPosition()
        val = DFHack.vmethod_call(self, 48)
    end
    def getOccupation()
        val = DFHack.vmethod_call(self, 56)
    end
    def getPositionStartYear()
        val = DFHack.vmethod_call(self, 64)
    end
    def getPositionEndYear()
        val = DFHack.vmethod_call(self, 72)
    end
    def generate_xml(arg0, indent)
        DFHack.vmethod_call(self, 80, arg0, indent) ; nil
    end
end

class HistfigEntityLinkCriminalst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_criminalst

end

class HistfigEntityLinkEnemyst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_enemyst

end

class HistfigEntityLinkFormerMemberst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_former_memberst

end

class HistfigEntityLinkFormerMercenaryst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_former_mercenaryst

end

class HistfigEntityLinkFormerOccupationst < HistfigEntityLink
    sizeof 32

    rtti_classname :histfig_entity_link_former_occupationst

    field(:occupation_id, 16) {
        number 32, true
    }
    field(:start_year, 20) {
        number 32, true
    }
    field(:end_year, 24) {
        number 32, true
    }
end

class HistfigEntityLinkFormerPositionst < HistfigEntityLink
    sizeof 32

    rtti_classname :histfig_entity_link_former_positionst

    field(:assignment_id, 16) {
        number 32, true, -1
    }
    field(:start_year, 20) {
        number 32, true
    }
    field(:end_year, 24) {
        number 32, true
    }
end

class HistfigEntityLinkFormerPrisonerst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_former_prisonerst

end

class HistfigEntityLinkFormerSlavest < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_former_slavest

end

class HistfigEntityLinkFormerSquadst < HistfigEntityLink
    sizeof 32

    rtti_classname :histfig_entity_link_former_squadst

    field(:squad_id, 16) {
        number 32, true
    }
    field(:start_year, 20) {
        number 32, true
    }
    field(:end_year, 24) {
        number 32, true
    }
end

class HistfigEntityLinkMemberst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_memberst

end

class HistfigEntityLinkMercenaryst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_mercenaryst

end

class HistfigEntityLinkOccupationst < HistfigEntityLink
    sizeof 24

    rtti_classname :histfig_entity_link_occupationst

    field(:occupation_id, 16) {
        number 32, true
    }
    field(:start_year, 20) {
        number 32, true
    }
end

class HistfigEntityLinkPositionClaimst < HistfigEntityLink
    sizeof 24

    rtti_classname :histfig_entity_link_position_claimst

    field(:assignment_id, 16) {
        number 32, true, -1
    }
    field(:start_year, 20) {
        number 32, true
    }
end

class HistfigEntityLinkPositionst < HistfigEntityLink
    sizeof 24

    rtti_classname :histfig_entity_link_positionst

    field(:assignment_id, 16) {
        number 32, true, -1
    }
    field(:start_year, 20) {
        number 32, true
    }
end

class HistfigEntityLinkPrisonerst < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_prisonerst

end

class HistfigEntityLinkSlavest < HistfigEntityLink
    sizeof 16

    rtti_classname :histfig_entity_link_slavest

end

class HistfigEntityLinkSquadst < HistfigEntityLink
    sizeof 32

    rtti_classname :histfig_entity_link_squadst

    field(:squad_id, 16) {
        number 32, true
    }
    field(:squad_position, 20) {
        number 32, true
    }
    field(:start_year, 24) {
        number 32, true
    }
end

class HistfigHfLink < MemHack::Compound
    sizeof 16

    rtti_classname :histfig_hf_linkst

    field(:target_hf, 8) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:link_strength, 12) {
        number 16, true
    }
    def getType()
        HistfigHfLinkType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
end

class HistfigHfLinkApprenticest < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_apprenticest

end

class HistfigHfLinkChildst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_childst

end

class HistfigHfLinkCompanionst < HistfigHfLink
    sizeof 24

    rtti_classname :histfig_hf_link_companionst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class HistfigHfLinkDeceasedSpousest < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_deceased_spousest

end

class HistfigHfLinkDeityst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_deityst

end

class HistfigHfLinkFatherst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_fatherst

end

class HistfigHfLinkFormerApprenticest < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_former_apprenticest

end

class HistfigHfLinkFormerMasterst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_former_masterst

end

class HistfigHfLinkFormerSpousest < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_former_spousest

end

class HistfigHfLinkImprisonerst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_imprisonerst

end

class HistfigHfLinkLoverst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_loverst

end

class HistfigHfLinkMasterst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_masterst

end

class HistfigHfLinkMotherst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_motherst

end

class HistfigHfLinkPetOwnerst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_pet_ownerst

end

class HistfigHfLinkPrisonerst < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_prisonerst

end

class HistfigHfLinkSpousest < HistfigHfLink
    sizeof 16

    rtti_classname :histfig_hf_link_spousest

end

class HistfigSiteLink < MemHack::Compound
    sizeof 24

    rtti_classname :histfig_site_linkst

    field(:site, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:sub_id, 12) {
        number 32, true
    }
    field(:entity, 16) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    def getType()
        HistfigSiteLinkType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
end

class HistfigSiteLinkHangoutst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_hangoutst

end

class HistfigSiteLinkHomeSiteAbstractBuildingst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_home_site_abstract_buildingst

end

class HistfigSiteLinkHomeSiteRealizationBuildingst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_home_site_realization_buildingst

end

class HistfigSiteLinkHomeSiteRealizationSulst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_home_site_realization_sulst

end

class HistfigSiteLinkHomeSiteSavedCivzonest < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_home_site_saved_civzonest

end

class HistfigSiteLinkLairst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_lairst

end

class HistfigSiteLinkOccupationst < HistfigSiteLink
    sizeof 32

    rtti_classname :histfig_site_link_occupationst

    field(:unk_1, 24) {
        number 32, true
    }
end

class HistfigSiteLinkPrisonAbstractBuildingst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_prison_abstract_buildingst

end

class HistfigSiteLinkPrisonSiteBuildingProfilest < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_prison_site_building_profilest

end

class HistfigSiteLinkSeatOfPowerst < HistfigSiteLink
    sizeof 24

    rtti_classname :histfig_site_link_seat_of_powerst

end

class HistoricalEntity < MemHack::Compound
    sizeof 8248

    field(:type, 0) {
        number 16, true, nil, HistoricalEntityType
    }
    field(:id, 4) {
        number 32, true
    }
    field(:entity_raw, 8) {
        pointer {
            global :EntityRaw
        }
    }
    field(:save_file_id, 16) {
        number 32, true
    }
    field(:next_member_idx, 20) {
        number 16, true
    }
    field(:name, 24) {
        global :LanguageName
    }
    field(:race, 144) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:flags, 148) {
        compound(:HistoricalEntity_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:neighbor, 0) { bit 0 }
            field(:player_civ, 0) { bit 1 }
            field(:unk2, 0) { bit 2 }
            field(:unk3, 0) { bit 3 }
            field(:unreliable_lost_last_site, 0) { bit 4 }
            field(:worshipping, 0) { bit 5 }
            field(:unk6, 0) { bit 6 }
            field(:unk7, 0) { bit 7 }
            field(:player_government, 0) { bit 8 }
            field(:unk9, 0) { bit 9 }
            field(:unspecific_race, 0) { bit 10 }
            field(:unk11, 0) { bit 11 }
            field(:unk12, 0) { bit 12 }
            field(:unk13, 0) { bit 13 }
            field(:unk14, 0) { bit 14 }
            field(:unk15, 0) { bit 15 }
            field(:unk16, 0) { bit 16 }
            field(:unk17, 0) { bit 17 }
            field(:unk18, 0) { bit 18 }
            field(:unk19, 0) { bit 19 }
            field(:unk20, 0) { bit 20 }
            field(:unk21, 0) { bit 21 }
            field(:unk22, 0) { bit 22 }
            field(:unk23, 0) { bit 23 }
            field(:unk24, 0) { bit 24 }
            field(:military_unit_property, 0) { bit 25 }
            field(:unk26, 0) { bit 26 }
        }
    }
    field(:guild_professions, 152) {
        stl_vector(8) {
            pointer {
                compound(:HistoricalEntity_TGuildProfessions) {
                    sizeof 8

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:profession, 4) {
                        number 16, true, nil, Profession
                    }
                }
            }
        }
    }
    field(:entity_links, 176) {
        stl_vector(8) {
            pointer {
                global :EntityEntityLink
            }
        }
    }
    field(:site_links, 200) {
        stl_vector(8) {
            pointer {
                global :EntitySiteLink
            }
        }
    }
    field(:histfig_ids, 224) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfig_tgs ; histfig_ids.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:populations, 248) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def populations_tg ; populations.map { |i| df.world.entity_populations.binsearch(i) } ; end
    field(:nemesis_ids, 272) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def nemesis_tgs ; nemesis_ids.map { |i| df.world.nemesis.all.binsearch(i) } ; end
    field(:resources, 296) {
        compound(:HistoricalEntity_TResources) {
            field(:digger_type, 0) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def digger_type_tg ; digger_type.map { |i| df.world.raws.itemdefs.weapons[i] } ; end
            field(:weapon_type, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def weapon_type_tg ; weapon_type.map { |i| df.world.raws.itemdefs.weapons[i] } ; end
            field(:training_weapon_type, 48) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def training_weapon_type_tg ; training_weapon_type.map { |i| df.world.raws.itemdefs.weapons[i] } ; end
            field(:armor_type, 72) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_type_tg ; armor_type.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:ammo_type, 96) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def ammo_type_tg ; ammo_type.map { |i| df.world.raws.itemdefs.ammo[i] } ; end
            field(:helm_type, 120) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_type_tg ; helm_type.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:gloves_type, 144) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_type_tg ; gloves_type.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:shoes_type, 168) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_type_tg ; shoes_type.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:pants_type, 192) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_type_tg ; pants_type.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:shield_type, 216) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shield_type_tg ; shield_type.map { |i| df.world.raws.itemdefs.shields[i] } ; end
            field(:trapcomp_type, 240) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def trapcomp_type_tg ; trapcomp_type.map { |i| df.world.raws.itemdefs.trapcomps[i] } ; end
            field(:toy_type, 264) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def toy_type_tg ; toy_type.map { |i| df.world.raws.itemdefs.toys[i] } ; end
            field(:instrument_type, 288) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def instrument_type_tg ; instrument_type.map { |i| df.world.raws.itemdefs.instruments[i] } ; end
            field(:siegeammo_type, 312) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def siegeammo_type_tg ; siegeammo_type.map { |i| df.world.raws.itemdefs.siege_ammo[i] } ; end
            field(:tool_type, 336) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def tool_type_tg ; tool_type.map { |i| df.world.raws.itemdefs.tools[i] } ; end
            field(:unk_1, 360) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:metal, 384) {
                compound(:HistoricalEntity_TResources_TMetal) {
                    field(:pick, 0) {
                        global :MaterialVecRef
                    }
                    field(:weapon, 48) {
                        global :MaterialVecRef
                    }
                    field(:ranged, 96) {
                        global :MaterialVecRef
                    }
                    field(:ammo, 144) {
                        global :MaterialVecRef
                    }
                    field(:ammo2, 192) {
                        global :MaterialVecRef
                    }
                    field(:armor, 240) {
                        global :MaterialVecRef
                    }
                    field(:anvil, 288) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:organic, 720) {
                compound(:HistoricalEntity_TResources_TOrganic) {
                    field(:leather, 0) {
                        global :MaterialVecRef
                    }
                    field(:parchment, 48) {
                        global :MaterialVecRef
                    }
                    field(:fiber, 96) {
                        global :MaterialVecRef
                    }
                    field(:silk, 144) {
                        global :MaterialVecRef
                    }
                    field(:wool, 192) {
                        global :MaterialVecRef
                    }
                    field(:wood, 240) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:metals, 1008) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def metals_tg ; metals.map { |i| df.world.raws.inorganics[i] } ; end
            field(:stones, 1032) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def stones_tg ; stones.map { |i| df.world.raws.inorganics[i] } ; end
            field(:gems, 1056) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def gems_tg ; gems.map { |i| df.world.raws.inorganics[i] } ; end
            field(:refuse, 1080) {
                compound(:HistoricalEntity_TResources_TRefuse) {
                    field(:bone, 0) {
                        global :MaterialVecRef
                    }
                    field(:shell, 48) {
                        global :MaterialVecRef
                    }
                    field(:pearl, 96) {
                        global :MaterialVecRef
                    }
                    field(:ivory, 144) {
                        global :MaterialVecRef
                    }
                    field(:horn, 192) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:misc_mat, 1320) {
                compound(:HistoricalEntity_TResources_TMiscMat) {
                    field(:others, 0) {
                        global :MaterialVecRef
                    }
                    field(:glass, 48) {
                        global :MaterialVecRef
                    }
                    field(:sand, 96) {
                        global :MaterialVecRef
                    }
                    field(:clay, 144) {
                        global :MaterialVecRef
                    }
                    field(:crafts, 192) {
                        global :MaterialVecRef
                    }
                    field(:glass_unused, 240) {
                        global :MaterialVecRef
                    }
                    field(:barrels, 288) {
                        global :MaterialVecRef
                    }
                    field(:flasks, 336) {
                        global :MaterialVecRef
                    }
                    field(:quivers, 384) {
                        global :MaterialVecRef
                    }
                    field(:backpacks, 432) {
                        global :MaterialVecRef
                    }
                    field(:cages, 480) {
                        global :MaterialVecRef
                    }
                    field(:wood2, 528) {
                        global :MaterialVecRef
                    }
                    field(:rock_metal, 576) {
                        global :MaterialVecRef
                    }
                    field(:booze, 624) {
                        global :MaterialVecRef
                    }
                    field(:cheese, 672) {
                        global :MaterialVecRef
                    }
                    field(:powders, 720) {
                        global :MaterialVecRef
                    }
                    field(:extracts, 768) {
                        global :MaterialVecRef
                    }
                    field(:meat, 816) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:fish_races, 2184) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def fish_races_tg ; fish_races.map { |i| df.world.raws.creatures.all[i] } ; end
            field(:fish_castes, 2208) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:egg_races, 2232) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def egg_races_tg ; egg_races.map { |i| df.world.raws.creatures.all[i] } ; end
            field(:egg_castes, 2256) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:plants, 2280) {
                global :MaterialVecRef
            }
            field(:tree_fruit_plants, 2328) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def tree_fruit_plants_tg ; tree_fruit_plants.map { |i| df.world.raws.plants.all[i] } ; end
            field(:tree_fruit_growths, 2352) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:shrub_fruit_plants, 2376) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def shrub_fruit_plants_tg ; shrub_fruit_plants.map { |i| df.world.raws.plants.all[i] } ; end
            field(:shrub_fruit_growths, 2400) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:seeds, 2424) {
                global :MaterialVecRef
            }
            field(:wood_products, 2472) {
                compound(:HistoricalEntity_TResources_TWoodProducts) {
                    field(:item_type, 0) {
                        stl_vector(2) {
                            number 16, true, nil, ItemType
                        }
                    }
                    field(:item_subtype, 24) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:material, 48) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:animals, 2568) {
                compound(:HistoricalEntity_TResources_TAnimals) {
                    field(:pet_races, 0) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def pet_races_tg ; pet_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:wagon_races, 24) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def wagon_races_tg ; wagon_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:pack_animal_races, 48) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def pack_animal_races_tg ; pack_animal_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:wagon_puller_races, 72) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def wagon_puller_races_tg ; wagon_puller_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:mount_races, 96) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def mount_races_tg ; mount_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:minion_races, 120) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def minion_races_tg ; minion_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:exotic_pet_races, 144) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def exotic_pet_races_tg ; exotic_pet_races.map { |i| df.world.raws.creatures.all[i] } ; end
                    field(:pet_castes, 168) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:wagon_castes, 192) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:pack_animal_castes, 216) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:wagon_puller_castes, 240) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:mount_castes, 264) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:minion_castes, 288) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:exotic_pet_castes, 312) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                }
            }
            field(:meat_fish_recipes, 2904) {
                stl_vector(8) {
                    pointer {
                        global :EntityRecipe
                    }
                }
            }
            field(:other_recipes, 2928) {
                stl_vector(8) {
                    pointer {
                        global :EntityRecipe
                    }
                }
            }
            field(:unk13, 2952) {
                static_array(3, 8) {
                    compound(:HistoricalEntity_TResources_TUnk13) {
                        field(:unk1, 0) {
                            number 16, true, -1
                        }
                        field(:unk2, 4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:unk14, 2976) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:unk15a, 3000) {
                number 16, true
            }
            field(:unk15b, 3002) {
                number 16, true
            }
            field(:ethic, 3004) {
                static_array(22, 2, EthicType) {
                    number 16, true, nil, EthicResponse
                }
            }
            field(:values, 3048) {
                static_array(64, 4, ValueType) {
                    number 32, true
                }
            }
            field(:unk_2, 3304) {
                number 32, true
            }
            field(:permitted_skill, 3308) {
                static_array(147, 1, JobSkill) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:art_image_types, 3456) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:art_image_ids, 3480) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:art_image_subids, 3504) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:color_ref_type, 3528) {
                stl_vector(1) {
                    number 8, true, nil, GeneralRefType
                }
            }
            field(:foreground_color_curses, 3552) {
                stl_vector(1) {
                    number 8, true, nil, CursesColor
                }
            }
            field(:foreground_color_curses_bright, 3576) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:background_color_curses, 3600) {
                stl_vector(1) {
                    number 8, true, nil, CursesColor
                }
            }
            field(:foreground_color, 3624) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def foreground_color_tg ; foreground_color.map { |i| df.world.raws.descriptors.colors[i] } ; end
            field(:background_color, 3648) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def background_color_tg ; background_color.map { |i| df.world.raws.descriptors.colors[i] } ; end
        }
    }
    field(:uniforms, 3968) {
        stl_vector(8) {
            pointer {
                global :EntityUniform
            }
        }
    }
    field(:next_uniform_id, 3992) {
        number 32, true
    }
    field(:relations, 4000) {
        compound(:HistoricalEntity_TRelations) {
            field(:known_sites, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def known_sites_tg ; known_sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
            field(:deities, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def deities_tg ; deities.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:worship, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:belief_systems, 72) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def belief_systems_tg ; belief_systems.map { |i| df.world.belief_systems.all.binsearch(i) } ; end
            field(:constructions, 96) {
                stl_vector(8) {
                    pointer {
                        compound(:HistoricalEntity_TRelations_TConstructions) {
                            sizeof 88

                            field(:path, 0) {
                                global :Coord2dPath
                            }
                            field(:source_site, 48) {
                                number 32, true, -1
                            }
                            def source_site_tg ; df.world.world_data.sites.binsearch(source_site) ; end
                            field(:destination_site, 52) {
                                number 32, true, -1
                            }
                            def destination_site_tg ; df.world.world_data.sites.binsearch(destination_site) ; end
                            field(:construction, 56) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def construction_tg ; construction.map { |i| df.world.constructions.binsearch(i, :pos) } ; end
                            field(:unk_1, 80) {
                                number 16, true
                            }
                            field(:unk_2, 82) {
                                number 16, true
                            }
                        }
                    }
                }
            }
            field(:diplomacy, 120) {
                stl_vector(8) {
                    pointer {
                        compound(:HistoricalEntity_TRelations_TDiplomacy) {
                            sizeof 72

                            field(:group_id, 0) {
                                number 32, true, -1
                            }
                            def group_tg ; df.world.entities.all.binsearch(group_id) ; end
                            field(:relation, 4) {
                                number 16, true
                            }
                            field(:war_event_collection, 8) {
                                number 32, true, -1
                            }
                            def war_event_collection_tg ; df.world.history.event_collections.all.binsearch(war_event_collection) ; end
                            field(:historic_events, 16) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def historic_events_tg ; historic_events.map { |i| df.world.history.events.binsearch(i) } ; end
                            field(:historic_events_collection, 40) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def historic_events_collection_tg ; historic_events_collection.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
                            field(:unk_1, 64) {
                                number 32, true
                            }
                            field(:tribute_season, 68) {
                                number 32, true, nil, Season
                            }
                        }
                    }
                }
            }
            field(:unk33, 144) {
                number 16, true
            }
            field(:unk34a, 152) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk34b, 176) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk34c, 200) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:position, 224) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:official, 248) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def official_tg ; official.map { |i| df.world.history.figures.binsearch(i) } ; end
        }
    }
    field(:positions, 4272) {
        compound(:HistoricalEntity_TPositions) {
            field(:own, 0) {
                stl_vector(8) {
                    pointer {
                        global :EntityPosition
                    }
                }
            }
            field(:site, 24) {
                stl_vector(8) {
                    pointer {
                        global :EntityPosition
                    }
                }
            }
            field(:conquered_site, 48) {
                stl_vector(8) {
                    pointer {
                        global :EntityPosition
                    }
                }
            }
            field(:next_position_id, 72) {
                number 32, true
            }
            field(:assignments, 80) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:next_assignment_id, 104) {
                number 32, true
            }
            field(:unk_v40_1, 112) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:unk_v40_2, 136) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:unk_v40_3, 160) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:unk_v40_4, 184) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:unk_v40_5, 208) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
        }
    }
    field(:tissue_styles, 4504) {
        compound(:HistoricalEntity_TTissueStyles) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :EntityTissueStyle
                    }
                }
            }
            field(:next_style_id, 24) {
                number 32, true
            }
        }
    }
    field(:squads, 4536) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def squads_tg ; squads.map { |i| df.world.squads.all.binsearch(i) } ; end
    field(:unknown1d, 4560) {
        compound(:HistoricalEntity_TUnknown1d) {
            field(:year, 0) {
                number 32, true, -1
            }
            field(:unk43, 8) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk44, 32) {
                number 32, true
            }
            field(:unk44a, 36) {
                number 32, true
            }
            field(:unk44b, 40) {
                static_array(15, 4) {
                    number 32, true
                }
            }
        }
    }
    field(:training_knowledge, 4664) {
        pointer {
            compound(:HistoricalEntity_TTrainingKnowledge) {
                sizeof 48

                field(:level, 0) {
                    stl_vector(4) {
                        number 32, true, nil, TrainingKnowledgeLevel
                    }
                }
                field(:unk_10, 24) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:events, 4672) {
        stl_vector(8) {
            pointer {
                global :EntityEvent
            }
        }
    }
    field(:unk_v40_1a, 4696) {
        number 32, true
    }
    field(:unk_v40_1b, 4700) {
        number 32, true
    }
    field(:unk_v40_1c, 4704) {
        number 32, true
    }
    field(:unk_v40_1d, 4708) {
        number 32, true
    }
    field(:unk_v40_1e, 4712) {
        number 32, true
    }
    field(:performed_poetic_forms, 4720) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def performed_poetic_forms_tg ; performed_poetic_forms.map { |i| df.world.poetic_forms.all.binsearch(i) } ; end
    field(:performed_musical_forms, 4744) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def performed_musical_forms_tg ; performed_musical_forms.map { |i| df.world.musical_forms.all.binsearch(i) } ; end
    field(:performed_dance_forms, 4768) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def performed_dance_forms_tg ; performed_dance_forms.map { |i| df.world.dance_forms.all.binsearch(i) } ; end
    field(:major_civ_number, 4792) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:major_civ_number_2, 4816) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 4840) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:occasion_info, 4864) {
        pointer {
            global :EntityOccasionInfo
        }
    }
    field(:artifact_claims, 4872) {
        stl_vector(8) {
            pointer {
                global :ArtifactClaim
            }
        }
    }
    field(:honors, 4896) {
        stl_vector(8) {
            pointer {
                global :HonorsType
            }
        }
    }
    field(:next_honors_index, 4920) {
        number 32, true
    }
    field(:equipment_purchases, 4924) {
        number 32, true
    }
    field(:attack, 4928) {
        number 32, true
    }
    field(:total_battles, 4932) {
        number 32, true
    }
    field(:unk_v47_1, 4936) {
        pointer {
            compound(:HistoricalEntity_TUnkV471) {
                sizeof 80

                field(:unk_v47_1, 0) {
                    stl_vector(8) {
                        pointer {
                            global :EntityUnkV471
                        }
                    }
                }
                field(:foiled_plot_agreements, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def foiled_plot_agreements_tg ; foiled_plot_agreements.map { |i| df.world.agreements.all.binsearch(i) } ; end
                field(:unk_v47_3, 48) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_v47_4, 72) {
                    number 32, true
                }
            }
        }
    }
    field(:divination_sets, 4944) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:founding_site_government, 4968) {
        number 32, true, -1
    }
    def founding_site_government_tg ; df.world.entities.all.binsearch(founding_site_government) ; end
    field(:meeting_events, 4976) {
        stl_vector(8) {
            pointer {
                global :MeetingEvent
            }
        }
    }
    field(:activity_stats, 5000) {
        pointer {
            global :EntityActivityStatistics
        }
    }
    field(:unknown1e, 5008) {
        compound(:HistoricalEntity_TUnknown1e) {
            field(:unk47, 0) {
                number 16, true
            }
            field(:unk48, 4) {
                number 32, true
            }
            field(:imports_from, 8) {
                number 32, true
            }
            field(:offerings_from, 12) {
                number 32, true
            }
            field(:offerings_recent, 16) {
                number 32, true
            }
            field(:offerings_history, 20) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:hostility_level, 60) {
                number 32, true
            }
            field(:siege_tier, 64) {
                number 32, true
            }
            field(:unk_1, 68) {
                number 32, true
            }
            field(:unk_2, 72) {
                number 32, true
            }
            field(:unk_3, 76) {
                number 32, true
            }
        }
    }
    field(:armies, 5088) {
        stl_vector(8) {
            pointer {
                global :Army
            }
        }
    }
    field(:army_controllers, 5112) {
        stl_vector(8) {
            pointer {
                global :ArmyController
            }
        }
    }
    field(:hist_figures, 5136) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:nemesis, 5160) {
        stl_vector(8) {
            pointer {
                global :NemesisRecord
            }
        }
    }
    field(:derived_resources, 5184) {
        compound(:HistoricalEntity_TDerivedResources) {
            field(:mill_cookable, 0) {
                global :MaterialVecRef
            }
            field(:mill_dye, 48) {
                global :MaterialVecRef
            }
            field(:armor_leather, 96) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_leather_tg ; armor_leather.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:armor_chain, 120) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_chain_tg ; armor_chain.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:armor_plate, 144) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_plate_tg ; armor_plate.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:armor_under, 168) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_under_tg ; armor_under.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:armor_over, 192) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_over_tg ; armor_over.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:armor_cover, 216) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def armor_cover_tg ; armor_cover.map { |i| df.world.raws.itemdefs.armor[i] } ; end
            field(:pants_leather, 240) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_leather_tg ; pants_leather.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:pants_chain, 264) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_chain_tg ; pants_chain.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:pants_plate, 288) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_plate_tg ; pants_plate.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:pants_under, 312) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_under_tg ; pants_under.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:pants_over, 336) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_over_tg ; pants_over.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:pants_cover, 360) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def pants_cover_tg ; pants_cover.map { |i| df.world.raws.itemdefs.pants[i] } ; end
            field(:helm_leather, 384) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_leather_tg ; helm_leather.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:helm_chain, 408) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_chain_tg ; helm_chain.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:helm_plate, 432) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_plate_tg ; helm_plate.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:helm_under, 456) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_under_tg ; helm_under.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:helm_over, 480) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_over_tg ; helm_over.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:helm_cover, 504) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def helm_cover_tg ; helm_cover.map { |i| df.world.raws.itemdefs.helms[i] } ; end
            field(:shoes_leather, 528) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_leather_tg ; shoes_leather.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:shoes_chain, 552) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_chain_tg ; shoes_chain.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:shoes_plate, 576) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_plate_tg ; shoes_plate.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:shoes_under, 600) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_under_tg ; shoes_under.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:shoes_over, 624) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_over_tg ; shoes_over.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:shoes_cover, 648) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def shoes_cover_tg ; shoes_cover.map { |i| df.world.raws.itemdefs.shoes[i] } ; end
            field(:gloves_leather, 672) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_leather_tg ; gloves_leather.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:gloves_chain, 696) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_chain_tg ; gloves_chain.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:gloves_plate, 720) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_plate_tg ; gloves_plate.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:gloves_under, 744) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_under_tg ; gloves_under.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:gloves_over, 768) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_over_tg ; gloves_over.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
            field(:gloves_cover, 792) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def gloves_cover_tg ; gloves_cover.map { |i| df.world.raws.itemdefs.gloves[i] } ; end
        }
    }
    field(:assignments_by_type, 6000) {
        static_array(42, 24, EntityPositionResponsibility) {
            stl_vector(8) {
                pointer {
                    global :EntityPositionAssignment
                }
            }
        }
    }
    field(:claims, 7008) {
        compound(:HistoricalEntity_TClaims) {
            field(:areas, 0) {
                global :Coord2dPath
            }
            field(:unk1, 48) {
                global :Coord2dPath
            }
            field(:border, 96) {
                global :Coord2dPath
            }
        }
    }
    field(:children, 7152) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def children_tg ; children.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:unknown2, 7176) {
        compound(:HistoricalEntity_TUnknown2) {
            field(:metal_proficiency, 0) {
                number 32, true
            }
            field(:weapon_proficiencies, 8) {
                stl_vector(2) {
                    global :JobSkill
                }
            }
            field(:resource_allotment, 32) {
                pointer {
                    global :ResourceAllotmentData
                }
            }
            field(:unk_1, 40) {
                stl_vector(8) {
                    pointer {
                        global :PoeticForm
                    }
                }
            }
            field(:unk_2, 64) {
                stl_vector(8) {
                    pointer {
                        global :MusicalForm
                    }
                }
            }
            field(:unk_3, 88) {
                stl_vector(8) {
                    pointer {
                        global :DanceForm
                    }
                }
            }
            field(:unk_4, 112) {
                stl_vector(8) {
                    pointer {
                        global :WrittenContent
                    }
                }
            }
            field(:unk12a, 136) {
                number 16, true, -1
            }
            field(:unk12b, 138) {
                number 16, true
            }
            field(:unk13, 140) {
                number 8, true, nil, BooleanEnum
            }
            field(:landmass, 144) {
                pointer {
                    global :WorldLandmass
                }
            }
            field(:region, 152) {
                pointer {
                    global :WorldRegion
                }
            }
            field(:unk16, 160) {
                number 32, true
            }
            field(:unk17, 164) {
                number 16, true
            }
            field(:unk18, 168) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk19, 192) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk20, 216) {
                number 16, true
            }
            field(:unk21, 220) {
                number 32, true
            }
            field(:unk22, 224) {
                number 32, true
            }
            field(:unk23, 228) {
                number 32, true
            }
            field(:unk24, 232) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk25, 256) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_9C, 280) {
                number 32, true
            }
            field(:unk_A0, 284) {
                number 32, true
            }
            field(:unk_A4, 288) {
                number 32, true
            }
            field(:unk_A8, 292) {
                number 32, true
            }
            field(:unk_AC, 296) {
                number 32, true
            }
            field(:unk_B0, 300) {
                number 32, true
            }
            field(:unk_B4, 304) {
                number 32, true
            }
            field(:unk_B8, 308) {
                number 32, true
            }
            field(:unk_BC, 312) {
                number 32, true
            }
            field(:unk_C0, 316) {
                number 32, true
            }
            field(:unk_5, 320) {
                number 32, true
            }
            field(:unk_6, 324) {
                number 32, true
            }
            field(:unk_7, 328) {
                number 32, true
            }
            field(:unk26a, 332) {
                static_array(38, 4) {
                    number 32, true
                }
            }
            field(:unk26b, 484) {
                static_array(38, 4) {
                    number 32, true
                }
            }
            field(:unk26c, 636) {
                static_array(38, 4) {
                    number 32, true
                }
            }
            field(:unk26d, 788) {
                static_array(38, 4) {
                    number 32, true
                }
            }
            field(:unk26e, 940) {
                static_array(15, 4) {
                    number 32, true
                }
            }
            field(:unk28, 1000) {
                stl_vector(8) {
                    pointer {
                        compound(:HistoricalEntity_TUnknown2_TUnk28) {
                            sizeof 12

                            field(:unk_1, 0) {
                                number 32, true
                            }
                            field(:unk_2, 4) {
                                number 32, true
                            }
                            field(:unk_3, 8) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_8, 1024) {
                number 32, true
            }
            field(:unk29, 1032) {
                stl_vector(8) {
                    pointer {
                        compound(:HistoricalEntity_TUnknown2_TUnk29) {
                            sizeof 40

                            field(:unk_1, 0) {
                                number 32, true
                            }
                            field(:unk_2, 8) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                            field(:unk_3, 32) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_9, 1056) {
                number 32, true
            }
            field(:unk_10, 1060) {
                number 32, true
            }
            field(:unk_11, 1064) {
                number 32, true
            }
        }
    }
end

class HistoricalFigure < MemHack::Compound
    sizeof 376

    field(:profession, 0) {
        number 16, true, nil, Profession
    }
    field(:race, 2) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 4) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:sex, 6) {
        number 8, true, nil, PronounType
    }
    field(:orientation_flags, 8) {
        global :OrientationFlags
    }
    field(:appeared_year, 12) {
        number 32, true
    }
    field(:born_year, 16) {
        number 32, true
    }
    field(:born_seconds, 20) {
        number 32, true
    }
    field(:curse_year, 24) {
        number 32, true
    }
    field(:curse_seconds, 28) {
        number 32, true
    }
    field(:birth_year_bias, 32) {
        number 32, true
    }
    field(:birth_time_bias, 36) {
        number 32, true
    }
    field(:old_year, 40) {
        number 32, true
    }
    field(:old_seconds, 44) {
        number 32, true
    }
    field(:died_year, 48) {
        number 32, true
    }
    field(:died_seconds, 52) {
        number 32, true
    }
    field(:name, 56) {
        global :LanguageName
    }
    field(:civ_id, 176) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:population_id, 180) {
        number 32, true, -1
    }
    def population_tg ; df.world.entity_populations.binsearch(population_id) ; end
    field(:breed_id, 184) {
        number 32, true
    }
    field(:cultural_identity, 188) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity) ; end
    field(:family_head_id, 192) {
        number 32, true, -1
    }
    def family_head_tg ; df.world.history.figures.binsearch(family_head_id) ; end
    field(:flags, 200) {
        df_flagarray(HistfigFlags)
    }
    field(:unit_id, 216) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:nemesis_id, 220) {
        number 32, true, -1
    }
    def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis_id) ; end
    field(:id, 224) {
        number 32, true
    }
    field(:unk4, 228) {
        number 32, true
    }
    field(:entity_links, 232) {
        stl_vector(8) {
            pointer {
                global :HistfigEntityLink
            }
        }
    }
    field(:site_links, 256) {
        stl_vector(8) {
            pointer {
                global :HistfigSiteLink
            }
        }
    }
    field(:histfig_links, 280) {
        stl_vector(8) {
            pointer {
                global :HistfigHfLink
            }
        }
    }
    field(:info, 304) {
        pointer {
            global :HistoricalFigureInfo
        }
    }
    field(:vague_relationships, 312) {
        pointer {
            compound(:HistoricalFigure_TVagueRelationships) {
                sizeof 40

                field(:hfid, 0) {
                    static_array(6, 4) {
                        number 32, true, -1
                    }
                }
                def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
                field(:relationship, 24) {
                    static_array(6, 2) {
                        global :VagueRelationshipType
                    }
                }
                field(:count, 36) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_f0, 320) {
        pointer {
            global :WorldSite
        }
    }
    field(:unk_f4, 328) {
        pointer {
            global :WorldRegion
        }
    }
    field(:unk_f8, 336) {
        pointer {
            global :WorldUndergroundRegion
        }
    }
    field(:unk_fc, 344) {
        pointer {
            compound(:HistoricalFigure_TUnkFc) {
                sizeof 32

                field(:unk_0, 0) {
                    df_array(1) {
                        number 8, false
                    }
                }
                field(:unk_8, 16) {
                    df_array(2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:unk_v47_2, 352) {
        pointer {
            compound(:HistoricalFigure_TUnkV472) {
                sizeof 88

                field(:unk_1, 0) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_2, 8) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_3, 16) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_4, 24) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_5, 32) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_6, 40) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_7, 48) {
                    number 16, true
                }
                field(:unk_8, 50) {
                    number 16, true
                }
                field(:unk_9, 52) {
                    number 16, true
                }
                field(:unk_10, 54) {
                    number 16, true
                }
                field(:unk_11, 56) {
                    number 16, true
                }
                field(:unk_12, 58) {
                    number 16, true
                }
                field(:unk_13, 60) {
                    number 32, true
                }
                field(:unk_14, 64) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_15, 72) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
                field(:unk_16, 80) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
            }
        }
    }
    field(:unk_v47_3, 360) {
        number 32, true
    }
    field(:unk_v47_4, 364) {
        number 32, true
    }
    field(:unk_v4019_1, 368) {
        number 32, true, -1
    }
    field(:unk_5, 372) {
        number 32, true, -1
    }
end

class HistoricalFigureInfo < MemHack::Compound
    sizeof 104

    field(:spheres, 0) {
        pointer {
            compound(:HistoricalFigureInfo_TSpheres) {
                sizeof 48

                field(:spheres, 0) {
                    stl_vector(2) {
                        number 16, true, nil, SphereType
                    }
                }
                field(:unk_1, 24) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:skills, 8) {
        pointer {
            compound(:HistoricalFigureInfo_TSkills) {
                sizeof 120

                field(:skills, 0) {
                    stl_vector(2) {
                        number 16, true, nil, JobSkill
                    }
                }
                field(:points, 24) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:professions_held, 48) {
                    stl_vector(2) {
                        number 16, true, nil, Profession
                    }
                }
                field(:profession_years, 72) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:profession, 96) {
                    number 16, true, nil, Profession
                }
                field(:unk_1, 100) {
                    number 32, true
                }
                field(:account_balance, 104) {
                    number 32, true
                }
                field(:employment_held, 112) {
                    pointer {
                        compound(:HistoricalFigureInfo_TSkills_TEmploymentHeld) {
                            sizeof 32

                            field(:employment, 0) {
                                stl_vector(8) {
                                    pointer {
                                        compound(:HistoricalFigureInfo_TSkills_TEmploymentHeld_TEmployment) {
                                            sizeof 48

                                            field(:employer, 0) {
                                                number 32, true, -1
                                            }
                                            def employer_tg ; df.world.entities.all.binsearch(employer) ; end
                                            field(:held_honors, 8) {
                                                stl_vector(4) {
                                                    number 32, true, -1
                                                }
                                            }
                                            field(:battle_count, 32) {
                                                number 32, true
                                            }
                                            field(:kill_count, 36) {
                                                number 32, true
                                            }
                                            field(:employment_year, 40) {
                                                number 32, true
                                            }
                                            field(:employment_year_tick, 44) {
                                                number 32, true
                                            }
                                        }
                                    }
                                }
                            }
                            field(:resignment_year, 24) {
                                number 32, true
                            }
                            field(:resignment_year_tick, 28) {
                                number 32, true
                            }
                        }
                    }
                }
            }
        }
    }
    field(:pets, 16) {
        pointer {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    }
    field(:personality, 24) {
        pointer {
            compound(:HistoricalFigureInfo_TPersonality) {
                sizeof 400

                field(:personality, 0) {
                    global :UnitPersonality
                }
                field(:unk_1, 392) {
                    number 16, true
                }
            }
        }
    }
    field(:masterpieces, 32) {
        pointer {
            compound(:HistoricalFigureInfo_TMasterpieces) {
                sizeof 96

                field(:events, 0) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def events_tg ; events.map { |i| df.world.history.events.binsearch(i) } ; end
                field(:events2, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def events2_tg ; events2.map { |i| df.world.history.events.binsearch(i) } ; end
                field(:unk_v43_1, 48) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_v43_2, 72) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:whereabouts, 40) {
        pointer {
            compound(:HistoricalFigureInfo_TWhereabouts) {
                sizeof 60

                field(:whereabouts_type, 0) {
                    number 16, true, nil, WhereaboutsType
                }
                field(:site, 4) {
                    number 32, true, -1
                }
                def site_tg ; df.world.world_data.sites.binsearch(site) ; end
                field(:region_id, 8) {
                    number 32, true, -1
                }
                def region_tg ; df.world.world_data.regions[region_id] ; end
                field(:underground_region_id, 12) {
                    number 32, true, -1
                }
                def underground_region_tg ; df.world.world_data.underground_regions[underground_region_id] ; end
                field(:army_id, 16) {
                    number 32, true, -1
                }
                def army_tg ; df.world.armies.all.binsearch(army_id) ; end
                field(:unk_1, 20) {
                    number 32, true, -1
                }
                field(:unk_2, 24) {
                    number 32, true, -1
                }
                field(:pos_x, 28) {
                    number 32, true, -1
                }
                field(:pos_y, 32) {
                    number 32, true, -1
                }
                field(:flags, 36) {
                    compound(:HistoricalFigureInfo_TWhereabouts_TFlags) {
                        field(:_whole, 0) {
                            number 32, true
                        }
                    }
                }
                field(:death_condition, 40) {
                    number 8, true, nil, DeathConditionType
                }
                field(:death_condition_parameter_1, 44) {
                    number 32, true, -1
                }
                field(:death_condition_parameter_2, 48) {
                    number 32, true, -1
                }
                field(:year, 52) {
                    number 32, true, -1
                }
                field(:year_tick, 56) {
                    number 32, true, -1
                }
            }
        }
    }
    field(:kills, 48) {
        pointer {
            global :HistoricalKills
        }
    }
    field(:wounds, 56) {
        pointer {
            compound(:HistoricalFigureInfo_TWounds) {
                sizeof 72

                field(:events, 0) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def events_tg ; events.map { |i| df.world.history.events.binsearch(i) } ; end
                field(:status, 24) {
                    stl_bit_vector
                }
                field(:childbirth_year, 56) {
                    number 32, true
                }
                field(:childbirth_tick, 60) {
                    number 32, true
                }
                field(:unk_flags, 64) {
                    compound(:HistoricalFigureInfo_TWounds_TUnkFlags) {
                        field(:_whole, 0) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:known_info, 64) {
        pointer {
            compound(:HistoricalFigureInfo_TKnownInfo) {
                sizeof 368

                field(:known_secrets, 0) {
                    stl_vector(8) {
                        pointer {
                            global :Interaction
                        }
                    }
                }
                field(:unk_10, 24) {
                    number 32, true, -1
                }
                field(:known_written_contents, 32) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def known_written_contents_tg ; known_written_contents.map { |i| df.world.written_contents.all.binsearch(i) } ; end
                field(:known_identities, 56) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def known_identities_tg ; known_identities.map { |i| df.world.identities.all.binsearch(i) } ; end
                field(:known_witness_reports, 80) {
                    stl_vector(8) {
                        pointer {
                            global :WitnessReport
                        }
                    }
                }
                field(:known_events, 104) {
                    stl_vector(8) {
                        pointer {
                            global :EntityEvent
                        }
                    }
                }
                field(:unk_4, 128) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_5, 152) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_6, 176) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_7, 200) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_8, 224) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureInfo_TKnownInfo_TUnk8) {
                                sizeof 88

                                field(:unk_1, 0) {
                                    number 32, true
                                }
                                field(:unk_2, 4) {
                                    number 32, true
                                }
                                field(:unk_3, 8) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_4, 32) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_5, 56) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_6, 80) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
                field(:known_poetic_forms, 248) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def known_poetic_forms_tg ; known_poetic_forms.map { |i| df.world.poetic_forms.all.binsearch(i) } ; end
                field(:known_musical_forms, 272) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def known_musical_forms_tg ; known_musical_forms.map { |i| df.world.musical_forms.all.binsearch(i) } ; end
                field(:known_dance_forms, 296) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def known_dance_forms_tg ; known_dance_forms.map { |i| df.world.dance_forms.all.binsearch(i) } ; end
                field(:knowledge, 320) {
                    pointer {
                        compound(:HistoricalFigureInfo_TKnownInfo_TKnowledge) {
                            sizeof 84

                            field(:philosophy, 0) {
                                global :KnowledgeScholarFlags0
                            }
                            field(:philosophy2, 4) {
                                global :KnowledgeScholarFlags1
                            }
                            field(:math, 8) {
                                global :KnowledgeScholarFlags2
                            }
                            field(:math2, 12) {
                                global :KnowledgeScholarFlags3
                            }
                            field(:history, 16) {
                                global :KnowledgeScholarFlags4
                            }
                            field(:astronomy, 20) {
                                global :KnowledgeScholarFlags5
                            }
                            field(:naturalist, 24) {
                                global :KnowledgeScholarFlags6
                            }
                            field(:chemistry, 28) {
                                global :KnowledgeScholarFlags7
                            }
                            field(:geography, 32) {
                                global :KnowledgeScholarFlags8
                            }
                            field(:medicine, 36) {
                                global :KnowledgeScholarFlags9
                            }
                            field(:medicine2, 40) {
                                global :KnowledgeScholarFlags10
                            }
                            field(:medicine3, 44) {
                                global :KnowledgeScholarFlags11
                            }
                            field(:engineering, 48) {
                                global :KnowledgeScholarFlags12
                            }
                            field(:engineering2, 52) {
                                global :KnowledgeScholarFlags13
                            }
                            field(:knowledge_goal_category, 56) {
                                number 32, false
                            }
                            field(:unk_1, 60) {
                                number 32, false
                            }
                            field(:unk_2, 64) {
                                number 32, false
                            }
                            field(:unk_3, 68) {
                                number 32, false
                            }
                            field(:knowledge_goal, 72) {
                                compound(:HistoricalFigureInfo_TKnownInfo_TKnowledge_TKnowledgeGoal) {
                                    field(:_whole, 0) {
                                        number 32, true
                                    }
                                    field(:unk0, 0) { bit 0 }
                                }
                            }
                            field(:research_points, 76) {
                                number 32, false
                            }
                            field(:times_pondered, 80) {
                                number 32, false
                            }
                        }
                    }
                }
                field(:belief_systems, 328) {
                    pointer {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                }
                field(:known_locations, 336) {
                    pointer {
                        stl_vector(8) {
                            pointer {
                                compound(:HistoricalFigureInfo_TKnownInfo_TKnownLocations) {
                                    sizeof 56

                                    field(:site_id, 0) {
                                        number 32, true, -1
                                    }
                                    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                                    field(:location_id, 4) {
                                        number 32, true, -1
                                    }
                                    field(:unk_2, 8) {
                                        number 32, true, -1
                                    }
                                    field(:unk_3, 12) {
                                        number 32, true, -1
                                    }
                                    field(:unk_4, 16) {
                                        number 32, true, -1
                                    }
                                    field(:unk_5, 20) {
                                        number 32, true, -1
                                    }
                                    field(:unk_6, 24) {
                                        number 32, true
                                    }
                                    field(:room_quality, 28) {
                                        number 32, true
                                    }
                                    field(:unk_8, 32) {
                                        number 32, true
                                    }
                                    field(:unk_9, 36) {
                                        number 32, true
                                    }
                                    field(:unk_10, 40) {
                                        number 32, true
                                    }
                                    field(:used_as_temple, 44) {
                                        number 32, true
                                    }
                                    field(:used_as_library, 48) {
                                        number 32, true
                                    }
                                    field(:used_as_tavern, 52) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                }
                field(:unk_3, 344) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:curse, 72) {
        pointer {
            compound(:HistoricalFigureInfo_TCurse) {
                sizeof 344

                field(:active_interactions, 0) {
                    stl_vector(8) {
                        pointer {
                            global :Interaction
                        }
                    }
                }
                field(:active_effects, 24) {
                    stl_vector(8) {
                        pointer {
                            global :InteractionEffect
                        }
                    }
                }
                field(:can_do, 48) {
                    stl_vector(8) {
                        pointer {
                            global :Interaction
                        }
                    }
                }
                field(:unk_30, 72) {
                    number 32, true
                }
                field(:unk_34, 76) {
                    number 32, true
                }
                field(:unk_38, 80) {
                    compound(:HistoricalFigureInfo_TCurse_TUnk38) {
                        field(:_whole, 0) {
                            number 32, true
                        }
                    }
                }
                field(:unk_3c, 84) {
                    compound(:HistoricalFigureInfo_TCurse_TUnk3c) {
                        field(:_whole, 0) {
                            number 32, true
                        }
                    }
                }
                field(:unk_40, 88) {
                    number 8, true
                }
                field(:name, 96) {
                    stl_string
                }
                field(:name_plural, 128) {
                    stl_string
                }
                field(:name_adjective, 160) {
                    stl_string
                }
                field(:race, 192) {
                    number 32, true, -1
                }
                def race_tg ; df.world.raws.creatures.all[race] ; end
                field(:caste, 196) {
                    number 16, true, -1
                }
                def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
                field(:body_transformation_effects, 200) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def body_transformation_effects_tg ; body_transformation_effects.map { |i| df.world.raws.effects.all[i] } ; end
                field(:unk_b0, 224) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:body_mat_interaction_effects, 248) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def body_mat_interaction_effects_tg ; body_mat_interaction_effects.map { |i| df.world.raws.effects.all[i] } ; end
                field(:original_histfig_id, 272) {
                    number 32, true, -1
                }
                def original_histfig_tg ; df.world.history.figures.binsearch(original_histfig_id) ; end
                field(:original_race, 276) {
                    number 32, true, -1
                }
                def original_race_tg ; df.world.raws.creatures.all[original_race] ; end
                field(:original_caste, 280) {
                    number 32, true, -1
                }
                def original_caste_tg ; df.world.raws.creatures.all[original_race].caste[original_caste] ; end
                field(:root_body_part_id, 284) {
                    number 32, true
                }
                field(:undead_name, 288) {
                    stl_string
                }
                field(:unk_fc, 320) {
                    number 32, true
                }
                field(:divination, 328) {
                    pointer {
                        compound(:HistoricalFigureInfo_TCurse_TDivination) {
                            sizeof 128

                            field(:deities, 0) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def deities_tg ; deities.map { |i| df.world.history.figures.binsearch(i) } ; end
                            field(:divination_sets, 24) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def divination_sets_tg ; divination_sets.map { |i| df.world.divination_sets.all.binsearch(i) } ; end
                            field(:roll_results, 48) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                            field(:year_rolled, 72) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                            field(:year_tick_rolled, 96) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                            field(:fate_sealed, 120) {
                                number 32, true
                            }
                        }
                    }
                }
                field(:experiments, 336) {
                    pointer {
                        compound(:HistoricalFigureInfo_TCurse_TExperiments) {
                            sizeof 48

                            field(:unk_1, 0) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                            field(:races, 24) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    field(:books, 80) {
        pointer {
            compound(:HistoricalFigureInfo_TBooks) {
                sizeof 152

                field(:artifacts_held, 0) {
                    stl_vector(8) {
                        pointer {
                            global :ArtifactRecord
                        }
                    }
                }
                field(:unk_1, 24) {
                    number 32, true
                }
                field(:unk_2, 28) {
                    number 32, true
                }
                field(:unk_3, 32) {
                    static_array(13, 4) {
                        number 32, true
                    }
                }
                field(:unk_4, 84) {
                    static_array(13, 4) {
                        number 32, true
                    }
                }
                field(:flags, 136) {
                    compound(:HistoricalFigureInfo_TBooks_TFlags) {
                        field(:_whole, 0) {
                            number 32, false
                        }
                    }
                }
                field(:unk_5, 140) {
                    number 16, true
                }
                field(:unk_6, 144) {
                    pointer {
                        compound(:HistoricalFigureInfo_TBooks_TUnk6) {
                            sizeof 32

                            field(:unk_1, 0) {
                                stl_vector(8) {
                                    pointer {
                                        compound(:HistoricalFigureInfo_TBooks_TUnk6_TUnk1) {
                                            sizeof 8

                                            field(:unk_1, 0) {
                                                number 32, true
                                            }
                                            field(:unk_2, 4) {
                                                number 32, true
                                            }
                                        }
                                    }
                                }
                            }
                            field(:unk_2, 24) {
                                number 32, true
                            }
                        }
                    }
                }
            }
        }
    }
    field(:reputation, 88) {
        pointer {
            compound(:HistoricalFigureInfo_TReputation) {
                sizeof 96

                field(:wanted, 0) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureInfo_TReputation_TWanted) {
                                sizeof 88

                                field(:unk, 0) {
                                    compound(:HistoricalFigureInfo_TReputation_TWanted_TUnk) {
                                        field(:entity_id, 0) {
                                            number 32, true, -1
                                        }
                                        def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                                        field(:types, 8) {
                                            stl_vector(4) {
                                                number 32, true, nil, ReputationType
                                            }
                                        }
                                        field(:levels, 32) {
                                            stl_vector(4) {
                                                number 32, true
                                            }
                                        }
                                        field(:discovered_year, 56) {
                                            number 32, true
                                        }
                                        field(:discovered_time, 60) {
                                            number 32, true
                                        }
                                        field(:unsolved_murders, 64) {
                                            number 32, true
                                        }
                                    }
                                }
                                field(:unk_1, 72) {
                                    number 32, true
                                }
                                field(:unk_2, 76) {
                                    number 32, true, -1
                                }
                                field(:unk_3, 80) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
                field(:unk_1, 24) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureInfo_TReputation_TUnk1) {
                                sizeof 72

                                field(:entity_id, 0) {
                                    number 32, true, -1
                                }
                                def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                                field(:unk_1, 8) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_2, 32) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:discovered_year, 56) {
                                    number 32, true
                                }
                                field(:discovered_time, 60) {
                                    number 32, true
                                }
                                field(:unsolved_murders, 64) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
                field(:cur_identity, 48) {
                    number 32, true, -1
                }
                def cur_identity_tg ; df.world.identities.all.binsearch(cur_identity) ; end
                field(:all_identities, 56) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
                def all_identities_tg ; all_identities.map { |i| df.world.identities.all.binsearch(i) } ; end
                field(:next_identity_idx, 80) {
                    number 32, true
                }
                field(:unk_2c, 88) {
                    pointer {
                        compound(:HistoricalFigureInfo_TReputation_TUnk2c) {
                            sizeof 96

                            field(:unk_1, 0) {
                                number 32, true
                            }
                            field(:unk_2, 4) {
                                number 32, true
                            }
                            field(:unk_3, 8) {
                                number 32, true
                            }
                            field(:unk_4, 12) {
                                number 32, true
                            }
                            field(:unk_5, 16) {
                                number 32, true
                            }
                            field(:unk_6, 20) {
                                number 32, true
                            }
                            field(:unk_7, 24) {
                                number 32, true
                            }
                            field(:unk_8, 28) {
                                number 32, true
                            }
                            field(:unk_9, 32) {
                                number 32, true
                            }
                            field(:unk_10, 36) {
                                number 32, true
                            }
                            field(:unk_11, 40) {
                                number 32, true
                            }
                            field(:unk_12, 48) {
                                stl_vector(8) {
                                    pointer {
                                        compound(:HistoricalFigureInfo_TReputation_TUnk2c_TUnk12) {
                                            sizeof 24

                                            field(:unk_1, 0) {
                                                number 32, true
                                            }
                                            field(:unk_2, 4) {
                                                number 32, true
                                            }
                                            field(:unk_3, 8) {
                                                number 32, true
                                            }
                                            field(:unk_4, 12) {
                                                number 32, true
                                            }
                                            field(:unk_5, 16) {
                                                number 32, true
                                            }
                                            field(:unk_6, 20) {
                                                number 32, true
                                            }
                                        }
                                    }
                                }
                            }
                            field(:unk_13, 72) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    field(:relationships, 96) {
        pointer {
            global :HistoricalFigureRelationships
        }
    }
end

class HistoricalFigureRelationships < MemHack::Compound
    sizeof 136

    field(:hf_visual, 0) {
        stl_vector(8) {
            pointer {
                compound(:HistoricalFigureRelationships_THfVisual) {
                    sizeof 160

                    field(:histfig_id, 0) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:flags, 4) {
                        compound(:HistoricalFigureRelationships_THfVisual_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                            field(:information_source, 0) { bit 0 }
                            field(:believes_false_identity, 0) { bit 2 }
                        }
                    }
                    field(:unk_2v, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:attitude, 32) {
                        stl_vector(4) {
                            number 32, true, nil, ReputationType
                        }
                    }
                    field(:counter, 56) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:rank, 80) {
                        number 16, true, -1
                    }
                    field(:loyalty, 84) {
                        number 32, true
                    }
                    field(:respect, 88) {
                        number 32, true
                    }
                    field(:fear, 92) {
                        number 32, true
                    }
                    field(:love, 96) {
                        number 32, true
                    }
                    field(:trust, 100) {
                        number 32, true
                    }
                    field(:familiarity, 104) {
                        number 32, true
                    }
                    field(:last_meet_year, 108) {
                        number 32, true
                    }
                    field(:last_meet_seconds72, 112) {
                        number 32, true
                    }
                    field(:meet_count, 116) {
                        number 32, true
                    }
                    field(:unk_2, 120) {
                        number 32, true
                    }
                    field(:unk_3, 124) {
                        number 32, true
                    }
                    field(:unk_4, 128) {
                        number 32, true
                    }
                    field(:unk_5, 132) {
                        number 32, true
                    }
                    field(:unk_6, 136) {
                        number 32, true
                    }
                    field(:unk_7, 140) {
                        number 32, true
                    }
                    field(:unk_8, 144) {
                        number 32, true
                    }
                    field(:unk_9, 148) {
                        number 32, true
                    }
                    field(:first_year, 152) {
                        number 32, true
                    }
                    field(:first_year_tick, 156) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:hf_historical, 24) {
        stl_vector(8) {
            pointer {
                compound(:HistoricalFigureRelationships_THfHistorical) {
                    sizeof 104

                    field(:histfig_id, 0) {
                        number 32, true, -1
                    }
                    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                    field(:unk_1, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_2, 32) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_3, 56) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:loyalty, 80) {
                        number 32, true
                    }
                    field(:respect, 84) {
                        number 32, true
                    }
                    field(:fear, 88) {
                        number 32, true
                    }
                    field(:love, 92) {
                        number 32, true
                    }
                    field(:trust, 96) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_1, 48) {
        stl_vector(8) {
            pointer {
                compound(:HistoricalFigureRelationships_TUnk1) {
                    sizeof 80

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_3, 32) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:loyalty, 56) {
                        number 32, true
                    }
                    field(:respect, 60) {
                        number 32, true
                    }
                    field(:fear, 64) {
                        number 32, true
                    }
                    field(:love, 68) {
                        number 32, true
                    }
                    field(:trust, 72) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:identities, 72) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def identities_tg ; identities.map { |i| df.world.cultural_identities.all.binsearch(i) } ; end
    field(:artifact_claims, 96) {
        stl_vector(8) {
            pointer {
                compound(:HistoricalFigureRelationships_TArtifactClaims) {
                    sizeof 20

                    field(:artifact_id, 0) {
                        number 32, true, -1
                    }
                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                    field(:unk_1, 4) {
                        number 32, true
                    }
                    field(:year, 8) {
                        number 32, true
                    }
                    field(:year_tick, 12) {
                        number 32, true
                    }
                    field(:unk_2, 16) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
    field(:unk_2, 120) {
        number 32, true
    }
    field(:intrigues, 128) {
        pointer {
            compound(:HistoricalFigureRelationships_TIntrigues) {
                sizeof 304

                field(:potential_corrupt_skill, 0) {
                    stl_vector(4) {
                        number 32, true, nil, JobSkill
                    }
                }
                field(:potential_corrupt_target, 24) {
                    stl_vector(4) {
                        compound(:HistoricalFigureRelationships_TIntrigues_TPotentialCorruptTarget) {
                            field(:LYING, 0) {
                                number 32, true, -1
                            }
                            field(:INTIMIDATION, 0) {
                                number 32, true, -1
                            }
                            def INTIMIDATION_tg ; df.world.entities.all.binsearch(INTIMIDATION) ; end
                            field(:CONVERSATION, 0) {
                                number 32, true, nil, ValueType
                            }
                        }
                    }
                }
                field(:potential_corrupt_circumstance, 48) {
                    stl_vector(4) {
                        number 32, true, nil, UnitThoughtType
                    }
                }
                field(:potential_corrupt_unk4, 72) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:plots, 96) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureRelationships_TIntrigues_TPlots) {
                                sizeof 88

                                field(:id, 0) {
                                    number 32, true
                                }
                                field(:plot_type, 4) {
                                    class ::DFHack::HistoricalFigureRelationships_TIntrigues_TPlots_TPlotType < MemHack::Enum
                                        ENUM = Hash.new
                                        NUME = Hash.new
                                        ENUM[-1] = :None ; NUME[:None] = -1
                                        ENUM[0] = :GrowFundingNetwork ; NUME[:GrowFundingNetwork] = 0
                                        ENUM[1] = :GrowAssetNetwork ; NUME[:GrowAssetNetwork] = 1
                                        ENUM[2] = :AcquireArtifact ; NUME[:AcquireArtifact] = 2
                                        ENUM[3] = :GrowCorruptionNetwork ; NUME[:GrowCorruptionNetwork] = 3
                                        ENUM[4] = :AttainRank ; NUME[:AttainRank] = 4
                                        ENUM[5] = :AssassinateActor ; NUME[:AssassinateActor] = 5
                                        ENUM[6] = :CorruptlyPunishActor ; NUME[:CorruptlyPunishActor] = 6
                                        ENUM[7] = :FrameActor ; NUME[:FrameActor] = 7
                                        ENUM[8] = :KidnapActor ; NUME[:KidnapActor] = 8
                                        ENUM[9] = :SabotageActor ; NUME[:SabotageActor] = 9
                                        ENUM[10] = :DirectWarToActor ; NUME[:DirectWarToActor] = 10
                                        ENUM[11] = :CorruptActorsGovernment ; NUME[:CorruptActorsGovernment] = 11
                                        ENUM[12] = :Counterintelligence ; NUME[:Counterintelligence] = 12
                                        ENUM[13] = :BecomeImmortal ; NUME[:BecomeImmortal] = 13
                                        ENUM[14] = :UndeadWorldConquest ; NUME[:UndeadWorldConquest] = 14
                                        ENUM[15] = :InfiltrateSociety ; NUME[:InfiltrateSociety] = 15
                                    end

                                    number 32, true, nil, HistoricalFigureRelationships_TIntrigues_TPlots_TPlotType
                                }
                                field(:parameter, 8) {
                                    number 32, true, -1
                                }
                                field(:on_hold, 12) {
                                    number 32, true
                                }
                                field(:plot_agreements, 16) {
                                    stl_vector(8) {
                                        pointer {
                                            global :PlotAgreement
                                        }
                                    }
                                }
                                field(:plot_data, 40) {
                                    compound(:HistoricalFigureRelationships_TIntrigues_TPlots_TPlotData) {
                                        field(:None, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Grow_Funding_Network, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Grow_Asset_Network, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Acquire_Artifact, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Grow_Corruption_Network, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Attain_Rank, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Assassinate_Actor, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Corruptly_Punish_Actor, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Frame_Actor, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Kidnap_Actor, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Sabotage_Actor, 0) {
                                            pointer {
                                                compound(:HistoricalFigureRelationships_TIntrigues_TPlots_TPlotData_TSabotageActor) {
                                                    sizeof 8

                                                    field(:unk_1, 0) {
                                                        number 32, true, -1
                                                    }
                                                    field(:unk_2, 4) {
                                                        number 32, true, -1
                                                    }
                                                }
                                            }
                                        }
                                        field(:Direct_War_To_Actor, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Corrupt_Actors_Government, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Counterintelligence, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Become_Immortal, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:Undead_World_Conquest, 0) {
                                            pointer {
                                                stl_vector(4) {
                                                    number 32, true
                                                }
                                            }
                                        }
                                        field(:Infiltrate_Society, 0) {
                                            pointer {
                                                compound(:HistoricalFigureRelationships_TIntrigues_TPlots_TPlotData_TInfiltrateSociety) {
                                                    sizeof 12

                                                    field(:action, 0) {
                                                        number 32, true
                                                    }
                                                    field(:unk5_t15_2, 4) {
                                                        number 32, true, -1
                                                    }
                                                    field(:unk5_t15_3, 8) {
                                                        number 32, true
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                field(:delegated_plot_id, 48) {
                                    number 32, true, -1
                                }
                                field(:delegated_plot_hfid, 52) {
                                    number 32, true, -1
                                }
                                def delegated_plot_hfid_tg ; df.world.history.figures.binsearch(delegated_plot_hfid) ; end
                                field(:parent_plot, 56) {
                                    number 32, true, -1
                                }
                                field(:parent_plot_hfid, 60) {
                                    number 32, true, -1
                                }
                                def parent_plot_hfid_tg ; df.world.history.figures.binsearch(parent_plot_hfid) ; end
                                field(:agreement, 64) {
                                    number 32, true, -1
                                }
                                def agreement_tg ; df.world.agreements.all.binsearch(agreement) ; end
                                field(:actor_nemesis_id, 68) {
                                    number 32, true, -1
                                }
                                def actor_nemesis_tg ; df.world.nemesis.all.binsearch(actor_nemesis_id) ; end
                                field(:unk5_13, 72) {
                                    number 32, true, -1
                                }
                                field(:plotter_nemesis_id, 76) {
                                    number 32, true, -1
                                }
                                def plotter_nemesis_tg ; df.world.nemesis.all.binsearch(plotter_nemesis_id) ; end
                                field(:unk5_15, 80) {
                                    number 32, true, -1
                                }
                            }
                        }
                    }
                }
                field(:next_plot_id, 120) {
                    number 32, true
                }
                field(:revealed_agreements, 128) {
                    stl_vector(8) {
                        pointer {
                            global :Agreement
                        }
                    }
                }
                field(:agreemeents, 152) {
                    stl_vector(8) {
                        pointer {
                            global :Agreement
                        }
                    }
                }
                field(:intrigue, 176) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureRelationships_TIntrigues_TIntrigue) {
                                sizeof 72

                                field(:id, 0) {
                                    number 32, true
                                }
                                field(:unk9_2, 4) {
                                    number 32, true
                                }
                                field(:hf_1, 8) {
                                    number 32, true, -1
                                }
                                def hf_1_tg ; df.world.history.figures.binsearch(hf_1) ; end
                                field(:hf_2, 12) {
                                    number 32, true, -1
                                }
                                def hf_2_tg ; df.world.history.figures.binsearch(hf_2) ; end
                                field(:unk9_5, 16) {
                                    number 32, true, -1
                                }
                                field(:unk9_6, 20) {
                                    number 32, true, -1
                                }
                                def unk9_6_tg ; df.world.entities.all.binsearch(unk9_6) ; end
                                field(:handle_actor_id, 24) {
                                    number 32, true, -1
                                }
                                field(:role, 28) {
                                    number 32, true, nil, PlotRoleType
                                }
                                field(:strategy, 32) {
                                    number 32, true, nil, PlotStrategyType
                                }
                                field(:unk9_10, 36) {
                                    number 32, true, -1
                                }
                                def unk9_10_tg ; df.world.entities.all.binsearch(unk9_10) ; end
                                field(:unk9_11, 40) {
                                    number 32, true, -1
                                }
                                field(:unk9_12, 48) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                }
                field(:next_intrigue_id, 200) {
                    number 32, true
                }
                field(:unk11, 208) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk12, 232) {
                    stl_vector(8) {
                        pointer {
                            compound(:HistoricalFigureRelationships_TIntrigues_TUnk12) {
                                sizeof 24

                                field(:unk_1, 0) {
                                    number 32, true
                                }
                                field(:unk_4, 4) {
                                    number 32, true
                                }
                                field(:unk_2, 8) {
                                    number 32, true
                                }
                                field(:unk_data, 16) {
                                    compound(:HistoricalFigureRelationships_TIntrigues_TUnk12_TUnkData) {
                                        field(:ptr_0, 0) {
                                            pointer {
                                                compound(:HistoricalFigureRelationships_TIntrigues_TUnk12_TUnkData_TPtr0) {
                                                    sizeof 16

                                                    field(:unk_1, 0) {
                                                        number 32, true
                                                    }
                                                    field(:unk_2, 4) {
                                                        number 32, true
                                                    }
                                                    field(:unk_3, 8) {
                                                        number 32, true
                                                    }
                                                    field(:unk_4, 12) {
                                                        number 32, true
                                                    }
                                                }
                                            }
                                        }
                                        field(:ptr_1, 0) {
                                            pointer {
                                                compound(:HistoricalFigureRelationships_TIntrigues_TUnk12_TUnkData_TPtr1) {
                                                    sizeof 12

                                                    field(:unk_1, 0) {
                                                        number 32, true
                                                    }
                                                    field(:unk_2, 4) {
                                                        number 32, true
                                                    }
                                                    field(:unk_3, 8) {
                                                        number 32, true
                                                    }
                                                }
                                            }
                                        }
                                        field(:ptr_2, 0) {
                                            pointer {
                                            }
                                        }
                                        field(:ptr_3, 0) {
                                            pointer {
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                field(:unk13, 256) {
                    number 32, true
                }
                field(:unk14, 264) {
                    stl_vector(8) {
                        pointer {
                        }
                    }
                }
                field(:unk15, 288) {
                    number 32, true
                }
                field(:unk16, 292) {
                    number 32, true, -1
                }
                field(:unk17, 296) {
                    number 32, true, -1
                }
            }
        }
    }
end

class HistoricalKills < MemHack::Compound
    sizeof 192

    field(:events, 0) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def events_tg ; events.map { |i| df.world.history.events.binsearch(i) } ; end
    field(:killed_race, 24) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def killed_race_tg ; killed_race.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:killed_caste, 48) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:killed_underground_region, 72) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def killed_underground_region_tg ; killed_underground_region.map { |i| df.world.world_data.underground_regions[i] } ; end
    field(:killed_region, 96) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def killed_region_tg ; killed_region.map { |i| df.world.world_data.regions[i] } ; end
    field(:killed_site, 120) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def killed_site_tg ; killed_site.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:killed_undead, 144) {
        stl_vector(2) {
            global :UndeadFlags
        }
    }
    field(:killed_count, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class HistoryEra < MemHack::Compound
    sizeof 120

    field(:year, 0) {
        number 32, true
    }
    field(:title, 8) {
        compound(:HistoryEra_TTitle) {
            field(:type, 0) {
                number 16, true, nil, EraType
            }
            field(:histfig_1, 4) {
                number 32, true, -1
            }
            def histfig_1_tg ; df.world.history.figures.binsearch(histfig_1) ; end
            field(:histfig_2, 8) {
                number 32, true, -1
            }
            def histfig_2_tg ; df.world.history.figures.binsearch(histfig_2) ; end
            field(:ordinal, 12) {
                number 32, true
            }
            field(:name, 16) {
                stl_string
            }
            field(:percent, 48) {
                number 32, true
            }
        }
    }
    field(:details, 64) {
        compound(:HistoryEra_TDetails) {
            field(:living_powers, 0) {
                number 32, true
            }
            field(:living_megabeasts, 4) {
                number 32, true
            }
            field(:living_semimegabeasts, 8) {
                number 32, true
            }
            field(:power_hf1, 12) {
                number 32, true, -1
            }
            def power_hf1_tg ; df.world.history.figures.binsearch(power_hf1) ; end
            field(:power_hf2, 16) {
                number 32, true, -1
            }
            def power_hf2_tg ; df.world.history.figures.binsearch(power_hf2) ; end
            field(:power_hf3, 20) {
                number 32, true, -1
            }
            def power_hf3_tg ; df.world.history.figures.binsearch(power_hf3) ; end
            field(:civilized_races, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:civilized_total, 48) {
                number 32, true
            }
            field(:civilized_mundane, 52) {
                number 32, true
            }
        }
    }
end

class HistoryEvent < MemHack::Compound
    sizeof 40

    rtti_classname :history_eventst

    field(:year, 8) {
        number 32, true
    }
    field(:seconds, 12) {
        number 32, true
    }
    field(:flags, 16) {
        df_flagarray(HistoryEventFlags)
    }
    field(:id, 32) {
        number 32, true
    }
    def getType()
        HistoryEventType.sym(DFHack.vmethod_call(self, 0))
    end
    def getWarStatus(entity1, entity2)
        val = DFHack.vmethod_call(self, 8, entity1, entity2)
    end
    def getAngerModifier(entity1, entity2)
        val = DFHack.vmethod_call(self, 16, entity1, entity2)
    end
    def getHappinessModifier(entity1, entity2)
        val = DFHack.vmethod_call(self, 24, entity1, entity2)
    end
    def madeFirstContact(entity1, entity2, site)
        val = DFHack.vmethod_call(self, 32, entity1, entity2, site)
        (val & 1) != 0
    end
    def getKilledHistfigID(killer)
        val = DFHack.vmethod_call(self, 40, killer)
    end
    def wasHistfigKilled(victim)
        val = DFHack.vmethod_call(self, 48, victim)
        (val & 1) != 0
    end
    def wasHistfigRevived(histfig)
        val = DFHack.vmethod_call(self, 56, histfig)
        (val & 1) != 0
    end
    def getRelatedHistfigIDs(vec)
        DFHack.vmethod_call(self, 80, vec) ; nil
    end
    def getRelatedSiteIDs(vec)
        DFHack.vmethod_call(self, 88, vec) ; nil
    end
    def getRelatedSiteStructureIDs(vec1, vec2)
        DFHack.vmethod_call(self, 96, vec1, vec2) ; nil
    end
    def getRelatedArtifactIDs(vec)
        DFHack.vmethod_call(self, 104, vec) ; nil
    end
    def getRelatedRegionIDs(vec)
        DFHack.vmethod_call(self, 112, vec) ; nil
    end
    def getRelatedLayerIDs(vec)
        DFHack.vmethod_call(self, 120, vec) ; nil
    end
    def getRelatedEntityIDs(vec)
        DFHack.vmethod_call(self, 128, vec) ; nil
    end
    def isRelatedToHistfigID(histfig)
        val = DFHack.vmethod_call(self, 136, histfig)
        (val & 1) != 0
    end
    def isRelatedToSiteID(site)
        val = DFHack.vmethod_call(self, 144, site)
        (val & 1) != 0
    end
    def isRelatedToSiteStructure(site, structure)
        val = DFHack.vmethod_call(self, 152, site, structure)
        (val & 1) != 0
    end
    def isRelatedToArtifactID(artifact)
        val = DFHack.vmethod_call(self, 160, artifact)
        (val & 1) != 0
    end
    def isRelatedToRegionID(region)
        val = DFHack.vmethod_call(self, 168, region)
        (val & 1) != 0
    end
    def isRelatedToLayerID(region)
        val = DFHack.vmethod_call(self, 176, region)
        (val & 1) != 0
    end
    def isRelatedToAgreementID(agreement)
        val = DFHack.vmethod_call(self, 184, agreement)
        (val & 1) != 0
    end
    def isRelatedToEntityID(entity)
        val = DFHack.vmethod_call(self, 192, entity)
        (val & 1) != 0
    end
    def getSentence(str, context)
        DFHack.vmethod_call(self, 208, str, context) ; nil
    end
    def getPhrase(str, context)
        DFHack.vmethod_call(self, 216, str, context) ; nil
    end
    def populateArtImage(image)
        DFHack.vmethod_call(self, 224, image) ; nil
    end
    def isChangedHistfigID(histfig)
        val = DFHack.vmethod_call(self, 248, histfig)
        (val & 1) != 0
    end
    def categorize()
        DFHack.vmethod_call(self, 256) ; nil
    end
    def uncategorize()
        DFHack.vmethod_call(self, 264) ; nil
    end
    def generate_xml(arg0, indent)
        DFHack.vmethod_call(self, 272, arg0, indent) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 280, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 288, file, SaveVersion.int(loadversion)) ; nil
    end
end

class HistoryEventAddEntitySiteProfileFlagst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_add_entity_site_profile_flagst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:added_flags, 48) {
        global :EntitySiteLinkFlags
    }
end

class HistoryEventAddHfEntityHonorst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_add_hf_entity_honorst

    field(:entity_id, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:hfid, 44) {
        number 32, true, -1
    }
    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
    field(:honor_id, 48) {
        number 32, true
    }
end

class HistoryEventAddHfEntityLinkst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_add_hf_entity_linkst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:link_type, 48) {
        number 32, true, nil, HistfigEntityLinkType
    }
    field(:position_id, 52) {
        number 32, true
    }
    field(:appointer_hfid, 56) {
        number 32, true, -1
    }
    def appointer_hfid_tg ; df.world.history.figures.binsearch(appointer_hfid) ; end
    field(:promise_to_hfid, 60) {
        number 32, true, -1
    }
    def promise_to_hfid_tg ; df.world.history.figures.binsearch(promise_to_hfid) ; end
end

class HistoryEventAddHfHfLinkst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_add_hf_hf_linkst

    field(:hf, 40) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:hf_target, 44) {
        number 32, true, -1
    }
    def hf_target_tg ; df.world.history.figures.binsearch(hf_target) ; end
    field(:type, 48) {
        number 32, true, nil, HistfigHfLinkType
    }
end

class HistoryEventAddHfSiteLinkst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_add_hf_site_linkst

    field(:site, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 44) {
        number 32, true, -1
    }
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:civ, 52) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:type, 56) {
        number 32, true, nil, HistfigSiteLinkType
    }
end

class HistoryEventAgreementConcludedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_agreement_concludedst

    field(:agreement_id, 40) {
        number 32, true, -1
    }
    def agreement_tg ; df.world.agreements.all.binsearch(agreement_id) ; end
    field(:subject_id, 44) {
        number 32, true
    }
    field(:reason, 48) {
        number 32, true, nil, HistoryEventReason
    }
    field(:concluder_hf, 52) {
        number 32, true, -1
    }
    def concluder_hf_tg ; df.world.history.figures.binsearch(concluder_hf) ; end
end

class HistoryEventAgreementFormedst < HistoryEvent
    sizeof 48

    rtti_classname :history_event_agreement_formedst

    field(:agreement_id, 40) {
        number 32, true, -1
    }
    def agreement_tg ; df.world.agreements.all.binsearch(agreement_id) ; end
    field(:delegated, 44) {
        number 8, true, nil, BooleanEnum
    }
end

class HistoryEventAgreementsVoidedst < HistoryEvent
    sizeof 48

    rtti_classname :history_event_agreements_voidedst

    field(:source, 40) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 44) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
end

class HistoryEventArtifactClaimFormedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_artifact_claim_formedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:entity, 48) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:position_profile, 52) {
        number 32, true
    }
    field(:claim_type, 56) {
        number 32, true, nil, ArtifactClaimType
    }
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventArtifactCopiedst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_artifact_copiedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:entity_dest, 44) {
        number 32, true, -1
    }
    def entity_dest_tg ; df.world.entities.all.binsearch(entity_dest) ; end
    field(:entity_src, 48) {
        number 32, true, -1
    }
    def entity_src_tg ; df.world.entities.all.binsearch(entity_src) ; end
    field(:site_dest, 52) {
        number 32, true, -1
    }
    def site_dest_tg ; df.world.world_data.sites.binsearch(site_dest) ; end
    field(:site_src, 56) {
        number 32, true, -1
    }
    def site_src_tg ; df.world.world_data.sites.binsearch(site_src) ; end
    field(:structure_dest, 60) {
        number 32, true, -1
    }
    field(:structure_src, 64) {
        number 32, true, -1
    }
    field(:flags2, 68) {
        compound(:HistoryEventArtifactCopiedst_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:from_original, 0) { bit 0 }
        }
    }
end

class HistoryEventArtifactCreatedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_artifact_createdst

    field(:artifact_id, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:creator_unit_id, 44) {
        number 32, true, -1
    }
    def creator_unit_tg ; df.world.units.all.binsearch(creator_unit_id) ; end
    field(:creator_hfid, 48) {
        number 32, true, -1
    }
    def creator_hfid_tg ; df.world.history.figures.binsearch(creator_hfid) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 56) {
        compound(:HistoryEventArtifactCreatedst_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:name_only, 0) { bit 0 }
        }
    }
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventArtifactDestroyedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_artifact_destroyedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:destroyer_hf, 48) {
        number 32, true, -1
    }
    def destroyer_hf_tg ; df.world.history.figures.binsearch(destroyer_hf) ; end
    field(:destroyer_civ, 52) {
        number 32, true, -1
    }
    def destroyer_civ_tg ; df.world.entities.all.binsearch(destroyer_civ) ; end
end

class HistoryEventArtifactDroppedst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_artifact_droppedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 56) {
        df_flagarray
    }
end

class HistoryEventArtifactFoundst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_artifact_foundst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:site_property_id, 56) {
        number 32, true, -1
    }
    field(:unk_1, 60) {
        number 32, true, -1
    }
    field(:unk_2, 64) {
        number 32, true, -1
    }
end

class HistoryEventArtifactGivenst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_artifact_givenst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:giver_hf, 44) {
        number 32, true, -1
    }
    def giver_hf_tg ; df.world.history.figures.binsearch(giver_hf) ; end
    field(:giver_entity, 48) {
        number 32, true, -1
    }
    def giver_entity_tg ; df.world.entities.all.binsearch(giver_entity) ; end
    field(:receiver_hf, 52) {
        number 32, true, -1
    }
    def receiver_hf_tg ; df.world.history.figures.binsearch(receiver_hf) ; end
    field(:receiver_entity, 56) {
        number 32, true, -1
    }
    def receiver_entity_tg ; df.world.entities.all.binsearch(receiver_entity) ; end
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
    field(:inherited, 76) {
        number 8, true, nil, BooleanEnum
    }
end

class HistoryEventArtifactHiddenst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_artifact_hiddenst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventArtifactLostst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_artifact_lostst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:site_property_id, 48) {
        number 32, true
    }
    field(:subregion_id, 52) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion_id] ; end
    field(:unk_1, 56) {
        number 32, true, -1
    }
end

class HistoryEventArtifactPossessedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_artifact_possessedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:subregion_id, 56) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion_id] ; end
    field(:feature_layer_id, 60) {
        number 32, true
    }
    field(:circumstance, 64) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 72) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventArtifactRecoveredst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_artifact_recoveredst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 56) {
        number 32, true, -1
    }
    field(:region, 60) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventArtifactStoredst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_artifact_storedst

    field(:artifact, 40) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:unit, 44) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:building, 56) {
        number 32, true
    }
end

class HistoryEventArtifactTransformedst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_artifact_transformedst

    field(:new_artifact, 40) {
        number 32, true, -1
    }
    def new_artifact_tg ; df.world.artifacts.all.binsearch(new_artifact) ; end
    field(:old_artifact, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def old_artifact_tg ; old_artifact.map { |i| df.world.artifacts.all.binsearch(i) } ; end
    field(:unit, 72) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:histfig, 76) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 80) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventAssumeIdentityst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_assume_identityst

    field(:trickster, 40) {
        number 32, true, -1
    }
    def trickster_tg ; df.world.history.figures.binsearch(trickster) ; end
    field(:identity, 44) {
        number 32, true, -1
    }
    def identity_tg ; df.world.identities.all.binsearch(identity) ; end
    field(:target, 48) {
        number 32, true, -1
    }
    def target_tg ; df.world.entities.all.binsearch(target) ; end
end

class HistoryEventBodyAbusedst < HistoryEvent
    sizeof 112

    rtti_classname :history_event_body_abusedst

    field(:bodies, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def bodies_tg ; bodies.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:victim_entity, 64) {
        number 32, true, -1
    }
    def victim_entity_tg ; df.world.entities.all.binsearch(victim_entity) ; end
    field(:civ, 68) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:histfig, 72) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 76) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 80) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 84) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 88) {
        global :Coord2d
    }
    field(:abuse_type, 92) {
        class ::DFHack::HistoryEventBodyAbusedst_TAbuseType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Impaled ; NUME[:Impaled] = 0
            ENUM[1] = :Piled ; NUME[:Piled] = 1
            ENUM[2] = :Flayed ; NUME[:Flayed] = 2
            ENUM[3] = :Hung ; NUME[:Hung] = 3
            ENUM[4] = :Mutilated ; NUME[:Mutilated] = 4
            ENUM[5] = :Animated ; NUME[:Animated] = 5
        end

        number 16, true, nil, HistoryEventBodyAbusedst_TAbuseType
    }
    field(:abuse_data, 96) {
        compound(:HistoryEventBodyAbusedst_TAbuseData) {
            field(:Impaled, 0) {
                compound(:HistoryEventBodyAbusedst_TAbuseData_TImpaled) {
                    field(:item_type, 0) {
                        number 16, true, nil, ItemType
                    }
                    field(:item_subtype, 4) {
                        number 32, true, -1
                    }
                    field(:mat_type, 8) {
                        number 16, true, -1
                    }
                    field(:mat_index, 12) {
                        number 32, true
                    }
                }
            }
            field(:Piled, 0) {
                compound(:HistoryEventBodyAbusedst_TAbuseData_TPiled) {
                    field(:pile_type, 0) {
                        class ::DFHack::HistoryEventBodyAbusedst_TAbuseData_TPiled_TPileType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :GrislyMound ; NUME[:GrislyMound] = 0
                            ENUM[1] = :GrotesquePillar ; NUME[:GrotesquePillar] = 1
                            ENUM[2] = :GruesomeSculpture ; NUME[:GruesomeSculpture] = 2
                        end

                        number 32, true, nil, HistoryEventBodyAbusedst_TAbuseData_TPiled_TPileType
                    }
                }
            }
            field(:Flayed, 0) {
                compound(:HistoryEventBodyAbusedst_TAbuseData_TFlayed) {
                    field(:structure, 0) {
                        number 32, true, -1
                    }
                }
            }
            field(:Hung, 0) {
                compound(:HistoryEventBodyAbusedst_TAbuseData_THung) {
                    field(:tree, 0) {
                        number 32, true, -1
                    }
                    def tree_tg ; df.world.raws.plants.all[tree] ; end
                    field(:mat_type, 4) {
                        number 16, true, -1
                    }
                    field(:mat_index, 8) {
                        number 32, true
                    }
                }
            }
            field(:Animated, 0) {
                compound(:HistoryEventBodyAbusedst_TAbuseData_TAnimated) {
                    field(:interaction, 0) {
                        number 32, true, -1
                    }
                    def interaction_tg ; df.world.raws.interactions.binsearch(interaction) ; end
                    field(:unk_1, 4) {
                        number 32, true
                    }
                    field(:unk_2, 8) {
                        number 32, true, -1
                    }
                    field(:unk_3, 12) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
end

class HistoryEventBuildingProfileAcquiredst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_building_profile_acquiredst

    field(:site, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:building_profile, 44) {
        number 32, true
    }
    field(:acquirer_hf, 48) {
        number 32, true, -1
    }
    def acquirer_hf_tg ; df.world.history.figures.binsearch(acquirer_hf) ; end
    field(:acquirer_entity, 52) {
        number 32, true, -1
    }
    def acquirer_entity_tg ; df.world.entities.all.binsearch(acquirer_entity) ; end
    field(:acquisition_type, 56) {
        number 32, true
    }
    field(:previous_owner_hf, 60) {
        number 32, true, -1
    }
    def previous_owner_hf_tg ; df.world.history.figures.binsearch(previous_owner_hf) ; end
    field(:unk_1, 64) {
        number 32, true, -1
    }
end

class HistoryEventCeremonyst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_ceremonyst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:occasion, 44) {
        number 32, true
    }
    field(:schedule, 48) {
        number 32, true
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventChangeCreatureTypest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_change_creature_typest

    field(:changee, 40) {
        number 32, true, -1
    }
    def changee_tg ; df.world.history.figures.binsearch(changee) ; end
    field(:changer, 44) {
        number 32, true, -1
    }
    def changer_tg ; df.world.history.figures.binsearch(changer) ; end
    field(:old_race, 48) {
        number 32, true, -1
    }
    def old_race_tg ; df.world.raws.creatures.all[old_race] ; end
    field(:old_caste, 52) {
        number 32, true, -1
    }
    def old_caste_tg ; df.world.raws.creatures.all[race_from].caste[old_caste] ; end
    field(:new_race, 56) {
        number 32, true, -1
    }
    def new_race_tg ; df.world.raws.creatures.all[new_race] ; end
    field(:new_caste, 60) {
        number 32, true, -1
    }
    def new_caste_tg ; df.world.raws.creatures.all[race_to].caste[new_caste] ; end
end

class HistoryEventChangeHfBodyStatest < HistoryEvent
    sizeof 72

    rtti_classname :history_event_change_hf_body_statest

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:body_state, 44) {
        number 8, true, nil, HistfigBodyState
    }
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 52) {
        number 32, true, -1
    }
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 64) {
        global :Coord2d
    }
end

class HistoryEventChangeHfJobst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_change_hf_jobst

    field(:hfid, 40) {
        number 32, true, -1
    }
    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
    field(:new_job, 44) {
        number 16, true, nil, Profession
    }
    field(:old_job, 46) {
        number 16, true, nil, Profession
    }
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventChangeHfMoodst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_change_hf_moodst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:mood, 44) {
        number 16, true, nil, MoodType
    }
    field(:reason, 48) {
        number 32, true, nil, HistoryEventReason
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 64) {
        global :Coord2d
    }
end

class HistoryEventChangeHfStatest < HistoryEvent
    sizeof 72

    rtti_classname :history_event_change_hf_statest

    field(:hfid, 40) {
        number 32, true, -1
    }
    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
    field(:state, 44) {
        number 16, true, nil, WhereaboutsType
    }
    field(:reason, 48) {
        number 32, true, nil, HistoryEventReason
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 64) {
        global :Coord2d
    }
end

class HistoryEventCircumstanceInfo < MemHack::Compound
    sizeof 8

    field(:type, 0) {
        number 32, true, nil, UnitThoughtType
    }
    field(:data, 4) {
        compound(:HistoryEventCircumstanceInfo_TData) {
            field(:Death, 0) {
                number 32, true, -1
            }
            def Death_tg ; df.world.history.figures.binsearch(Death) ; end
            field(:Prayer, 0) {
                number 32, true, -1
            }
            def Prayer_tg ; df.world.history.figures.binsearch(Prayer) ; end
            field(:DreamAbout, 0) {
                number 32, true, -1
            }
            def DreamAbout_tg ; df.world.history.figures.binsearch(DreamAbout) ; end
            field(:Defeated, 0) {
                number 32, true, -1
            }
            def Defeated_tg ; df.world.history.figures.binsearch(Defeated) ; end
            field(:Murdered, 0) {
                number 32, true, -1
            }
            def Murdered_tg ; df.world.history.figures.binsearch(Murdered) ; end
            field(:HistEventCollection, 0) {
                number 32, true, -1
            }
            def HistEventCollection_tg ; df.world.history.event_collections.all.binsearch(HistEventCollection) ; end
            field(:AfterAbducting, 0) {
                number 32, true, -1
            }
            def AfterAbducting_tg ; df.world.history.figures.binsearch(AfterAbducting) ; end
        }
    }
end

class HistoryEventCollection < MemHack::Compound
    sizeof 96

    rtti_classname :history_event_collectionst

    field(:events, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def events_tg ; events.map { |i| df.world.history.events.binsearch(i) } ; end
    field(:collections, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def collections_tg ; collections.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
    field(:start_year, 56) {
        number 32, true
    }
    field(:end_year, 60) {
        number 32, true
    }
    field(:start_seconds, 64) {
        number 32, true
    }
    field(:end_seconds, 68) {
        number 32, true
    }
    field(:flags, 72) {
        df_flagarray
    }
    field(:id, 88) {
        number 32, true
    }
    def getType()
        HistoryEventCollectionType.sym(DFHack.vmethod_call(self, 0))
    end
    def generate_xml(arg0, indent)
        DFHack.vmethod_call(self, 8, arg0, indent) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
    def categorize()
        DFHack.vmethod_call(self, 32) ; nil
    end
    def uncategorize()
        DFHack.vmethod_call(self, 40) ; nil
    end
    def getName(string)
        DFHack.vmethod_call(self, 48, string) ; nil
    end
    def getRegionCoords(x, y)
        DFHack.vmethod_call(self, 56, x, y) ; nil
    end
    def getParent()
        val = DFHack.vmethod_call(self, 64)
    end
    def isBetweenEntities(defender_civ, attacker_civ)
        val = DFHack.vmethod_call(self, 80, defender_civ, attacker_civ)
    end
    def updateEndTime()
        DFHack.vmethod_call(self, 88) ; nil
    end
end

class HistoryEventCollectionAbductionst < HistoryEventCollection
    sizeof 208

    rtti_classname :history_event_collection_abductionst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 100) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 104) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 108) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 112) {
        global :Coord2d
    }
    field(:attacker_civ, 116) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 120) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:snatcher_hf, 128) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def snatcher_hf_tg ; snatcher_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:victim_hf, 152) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def victim_hf_tg ; victim_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:unk_1, 176) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:ordinal, 200) {
        number 32, true
    }
end

class HistoryEventCollectionBattlest < HistoryEventCollection
    sizeof 768

    rtti_classname :history_event_collection_battlest

    field(:name, 96) {
        global :LanguageName
    }
    field(:parent_collection, 216) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 220) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 224) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 228) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 232) {
        global :Coord2d
    }
    field(:attacker_civ, 240) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_civ_tg ; attacker_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:defender_civ, 264) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_civ_tg ; defender_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:attacker_hf, 288) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_hf_tg ; attacker_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:attacker_role, 312) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:defender_hf, 336) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_hf_tg ; defender_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:defender_role, 360) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:noncombat_hf, 384) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def noncombat_hf_tg ; noncombat_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:merc_roles, 408) {
        global :MercRoleType
    }
    field(:attacker_mercs, 412) {
        number 32, true, -1
    }
    def attacker_mercs_tg ; df.world.entities.all.binsearch(attacker_mercs) ; end
    field(:defender_mercs, 416) {
        number 32, true, -1
    }
    def defender_mercs_tg ; df.world.entities.all.binsearch(defender_mercs) ; end
    field(:attacker_merc_hfs, 424) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_merc_hfs_tg ; attacker_merc_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:defender_merc_hfs, 448) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_merc_hfs_tg ; defender_merc_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:attacker_squad_entity_pop, 472) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_squad_entity_pop_tg ; attacker_squad_entity_pop.map { |i| df.world.entity_populations.binsearch(i) } ; end
    field(:attacker_squad_counts, 496) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:attacker_squad_deaths, 520) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:attacker_squad_races, 544) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_squad_races_tg ; attacker_squad_races.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:attacker_squad_sites, 568) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_squad_sites_tg ; attacker_squad_sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:unk_3, 592) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:defender_squad_entity_pops, 616) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_squad_entity_pops_tg ; defender_squad_entity_pops.map { |i| df.world.entity_populations.binsearch(i) } ; end
    field(:defender_squad_counts, 640) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:defender_squad_deaths, 664) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:defender_squad_races, 688) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_squad_races_tg ; defender_squad_races.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:defender_squad_sites, 712) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_squad_sites_tg ; defender_squad_sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:unk_4, 736) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:outcome, 760) {
        number 16, true
    }
end

class HistoryEventCollectionBeastAttackst < HistoryEventCollection
    sizeof 152

    rtti_classname :history_event_collection_beast_attackst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 100) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 104) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 108) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 112) {
        global :Coord2d
    }
    field(:defender_civ, 116) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:attacker_hf, 120) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_hf_tg ; attacker_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:ordinal, 144) {
        number 32, true
    }
end

class HistoryEventCollectionCeremonyst < HistoryEventCollection
    sizeof 120

    rtti_classname :history_event_collection_ceremonyst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:civ, 100) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:unk_1, 104) {
        number 32, true
    }
    field(:unk_2, 108) {
        number 32, true
    }
    field(:ordinal, 112) {
        number 32, true
    }
end

class HistoryEventCollectionCompetitionst < HistoryEventCollection
    sizeof 120

    rtti_classname :history_event_collection_competitionst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:civ, 100) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:unk_1, 104) {
        number 32, true
    }
    field(:unk_2, 108) {
        number 32, true
    }
    field(:ordinal, 112) {
        number 32, true
    }
end

class HistoryEventCollectionDuelst < HistoryEventCollection
    sizeof 136

    rtti_classname :history_event_collection_duelst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 100) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 104) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 108) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 112) {
        global :Coord2d
    }
    field(:attacker_hf, 116) {
        number 32, true, -1
    }
    def attacker_hf_tg ; df.world.history.figures.binsearch(attacker_hf) ; end
    field(:defender_hf, 120) {
        number 32, true, -1
    }
    def defender_hf_tg ; df.world.history.figures.binsearch(defender_hf) ; end
    field(:ordinal, 124) {
        number 32, true
    }
    field(:unk_1, 128) {
        number 8, true
    }
end

class HistoryEventCollectionEntityOverthrownst < HistoryEventCollection
    sizeof 112

    rtti_classname :history_event_collection_entity_overthrownst

    field(:site, 96) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:entity, 100) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:ordinal, 104) {
        number 32, true
    }
end

class HistoryEventCollectionInsurrectionst < HistoryEventCollection
    sizeof 112

    rtti_classname :history_event_collection_insurrectionst

    field(:site, 96) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:target_civ, 100) {
        number 32, true, -1
    }
    def target_civ_tg ; df.world.entities.all.binsearch(target_civ) ; end
    field(:ordinal, 104) {
        number 32, true
    }
end

class HistoryEventCollectionJourneyst < HistoryEventCollection
    sizeof 128

    rtti_classname :history_event_collection_journeyst

    field(:traveler_hf, 96) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def traveler_hf_tg ; traveler_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:ordinal, 120) {
        number 32, true
    }
end

class HistoryEventCollectionOccasionst < HistoryEventCollection
    sizeof 112

    rtti_classname :history_event_collection_occasionst

    field(:civ, 96) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:occasion, 100) {
        number 32, true
    }
    field(:ordinal, 104) {
        number 32, true
    }
end

class HistoryEventCollectionPerformancest < HistoryEventCollection
    sizeof 120

    rtti_classname :history_event_collection_performancest

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:civ, 100) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:unk_1, 104) {
        number 32, true
    }
    field(:unk_2, 108) {
        number 32, true
    }
    field(:ordinal, 112) {
        number 32, true
    }
end

class HistoryEventCollectionPersecutionst < HistoryEventCollection
    sizeof 112

    rtti_classname :history_event_collection_persecutionst

    field(:site, 96) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:entity, 100) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:ordinal, 104) {
        number 32, true
    }
end

class HistoryEventCollectionProcessionst < HistoryEventCollection
    sizeof 120

    rtti_classname :history_event_collection_processionst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:civ, 100) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:unk_1, 104) {
        number 32, true
    }
    field(:unk_2, 108) {
        number 32, true
    }
    field(:ordinal, 112) {
        number 32, true
    }
end

class HistoryEventCollectionPurgest < HistoryEventCollection
    sizeof 144

    rtti_classname :history_event_collection_purgest

    field(:site, 96) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:adjective, 104) {
        stl_string
    }
    field(:ordinal, 136) {
        number 32, true
    }
end

class HistoryEventCollectionRaidst < HistoryEventCollection
    sizeof 160

    rtti_classname :history_event_collection_raidst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 100) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 104) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 108) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 112) {
        global :Coord2d
    }
    field(:attacker_civ, 116) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 120) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:thieves, 128) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def thieves_tg ; thieves.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:ordinal, 152) {
        number 32, true
    }
end

class HistoryEventCollectionSiteConqueredst < HistoryEventCollection
    sizeof 160

    rtti_classname :history_event_collection_site_conqueredst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:site, 100) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:attacker_civ, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_civ_tg ; attacker_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:defender_civ, 128) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_civ_tg ; defender_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:unk_1, 152) {
        number 16, true
    }
    field(:ordinal, 156) {
        number 32, true
    }
end

class HistoryEventCollectionTheftst < HistoryEventCollection
    sizeof 448

    rtti_classname :history_event_collection_theftst

    field(:parent_collection, 96) {
        number 32, true, -1
    }
    def parent_collection_tg ; df.world.history.event_collections.all.binsearch(parent_collection) ; end
    field(:region, 100) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 104) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:site, 108) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region_pos, 112) {
        global :Coord2d
    }
    field(:thief_civ, 116) {
        number 32, true, -1
    }
    def thief_civ_tg ; df.world.entities.all.binsearch(thief_civ) ; end
    field(:victim_civ, 120) {
        number 32, true, -1
    }
    def victim_civ_tg ; df.world.entities.all.binsearch(victim_civ) ; end
    field(:thief_hf, 128) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def thief_hf_tg ; thief_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:stolen_item_types, 152) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:stolen_item_subtypes, 176) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:stolen_mat_types, 200) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:stolen_mat_indices, 224) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:stolen_item_ids, 248) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def stolen_item_tgs ; stolen_item_ids.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:unk_1, 272) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 296) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_3, 320) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_4, 344) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_5, 368) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_6, 392) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_7, 416) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:ordinal, 440) {
        number 32, true
    }
end

class HistoryEventCollectionWarst < HistoryEventCollection
    sizeof 600

    rtti_classname :history_event_collection_warst

    field(:name, 96) {
        global :LanguageName
    }
    field(:attacker_civ, 216) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def attacker_civ_tg ; attacker_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:defender_civ, 240) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def defender_civ_tg ; defender_civ.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:unk_1, 264) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_1_tg ; unk_1.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:unk, 288) {
        compound(:HistoryEventCollectionWarst_TUnk) {
            field(:unk_1, 0) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:attacker_entity_leader, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def attacker_entity_leader_tg ; attacker_entity_leader.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:unk_2, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_3, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_4, 96) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_5, 120) {
                number 32, true
            }
            field(:ethics_unk1, 128) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:disputed_ethics, 152) {
                stl_vector(4) {
                    global :EthicType
                }
            }
            field(:ethics_unk3, 176) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:dispute_severities, 200) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:accumulated_ethics_severity, 224) {
                number 32, true
            }
            field(:event_unk, 232) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:negative_events, 256) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def negative_events_tg ; negative_events.map { |i| df.world.history.events.binsearch(i) } ; end
            field(:event_severities, 280) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:accumulated_event_severity, 304) {
                number 32, true
            }
        }
    }
end

class HistoryEventCompetitionst < HistoryEvent
    sizeof 112

    rtti_classname :history_event_competitionst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:occasion, 44) {
        number 32, true
    }
    field(:schedule, 48) {
        number 32, true
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:competitor_hf, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def competitor_hf_tg ; competitor_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:winner_hf, 88) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def winner_hf_tg ; winner_hf.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class HistoryEventContext < MemHack::Compound
    sizeof 200

    field(:flags, 0) {
        compound(:HistoryEventContext_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:is_interrogation_report, 0) { bit 0 }
        }
    }
    field(:interrogator_relationships, 8) {
        pointer {
            global :HistoricalFigureRelationships
        }
    }
    field(:interrogation, 16) {
        pointer {
            compound(:HistoryEventContext_TInterrogation) {
                sizeof 16

                field(:unk_00, 0) {
                    number 32, true, -1
                }
                field(:unk_04, 4) {
                    number 32, true, -1
                }
                field(:interrogator_id, 8) {
                    number 32, true, -1
                }
                def interrogator_tg ; df.world.history.figures.binsearch(interrogator_id) ; end
                field(:subject_id, 12) {
                    number 32, true, -1
                }
                def subject_tg ; df.world.history.figures.binsearch(subject_id) ; end
            }
        }
    }
    field(:artifact_id, 24) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:entity_id, 28) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:histfig_id, 32) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:speaker_id, 36) {
        number 32, true, -1
    }
    def speaker_tg ; df.world.history.figures.binsearch(speaker_id) ; end
    field(:site_id, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:region_id, 44) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region_id] ; end
    field(:layer_id, 48) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer_id] ; end
    field(:unk_34, 52) {
        number 32, true, -1
    }
    field(:abstract_building_id, 56) {
        number 32, true, -1
    }
    field(:sphere, 60) {
        number 16, true, nil, SphereType
    }
    field(:architectural_element, 62) {
        number 16, true, nil, ArchitecturalElement
    }
    field(:unk_40, 64) {
        number 16, true, -1
    }
    field(:family_relationship, 66) {
        number 16, true, nil, HistfigRelationshipType
    }
    field(:number, 68) {
        number 32, true, 1
    }
    field(:unk_48, 72) {
        number 16, true, -1
    }
    field(:race, 74) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:unk_4c, 76) {
        number 16, true, -1
    }
    field(:unk_50, 80) {
        number 32, true, -1
    }
    field(:unk_54, 84) {
        number 8, true, -1
    }
    field(:caste, 86) {
        number 16, true, -1
    }
    field(:undead_flags, 88) {
        global :UndeadFlags
    }
    field(:unk_5a, 90) {
        number 16, true, -1
    }
    field(:squad_id, 92) {
        number 32, true, -1
    }
    def squad_tg ; df.world.squads.all.binsearch(squad_id) ; end
    field(:formation_id, 96) {
        number 32, true, -1
    }
    field(:activity_id, 100) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:breed_id, 104) {
        number 32, true, -1
    }
    def breed_tg ; df.world.world_data.breeds.binsearch(breed_id) ; end
    field(:battlefield_id, 108) {
        number 32, true, -1
    }
    def battlefield_tg ; df.world.world_data.battlefields.binsearch(battlefield_id) ; end
    field(:interaction_instance_id, 112) {
        number 32, true, -1
    }
    def interaction_instance_tg ; df.world.interaction_instances.all.binsearch(interaction_instance_id) ; end
    field(:written_content_id, 116) {
        number 32, true, -1
    }
    def written_content_tg ; df.world.written_contents.all.binsearch(written_content_id) ; end
    field(:identity_id, 120) {
        number 32, true, -1
    }
    def identity_tg ; df.world.identities.all.binsearch(identity_id) ; end
    field(:incident_id, 124) {
        number 32, true, -1
    }
    def incident_tg ; df.world.incidents.all.binsearch(incident_id) ; end
    field(:crime_id, 128) {
        number 32, true, -1
    }
    def crime_tg ; df.world.crimes.all.binsearch(crime_id) ; end
    field(:region_weather_id, 132) {
        number 32, true, -1
    }
    def region_weather_tg ; df.world.world_data.region_weather.binsearch(region_weather_id) ; end
    field(:creation_zone_id, 136) {
        number 32, true, -1
    }
    def creation_zone_tg ; df.world.world_data.object_data.binsearch(creation_zone_id) ; end
    field(:vehicle_id, 140) {
        number 32, true, -1
    }
    def vehicle_tg ; df.world.vehicles.all.binsearch(vehicle_id) ; end
    field(:army_id, 144) {
        number 32, true, -1
    }
    def army_tg ; df.world.armies.all.binsearch(army_id) ; end
    field(:army_controller_id, 148) {
        number 32, true, -1
    }
    def army_controller_tg ; df.world.army_controllers.all.binsearch(army_controller_id) ; end
    field(:army_tracking_info_id, 152) {
        number 32, true, -1
    }
    field(:cultural_identity_id, 156) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity_id) ; end
    field(:agreement_id, 160) {
        number 32, true, -1
    }
    def agreement_tg ; df.world.agreements.all.binsearch(agreement_id) ; end
    field(:poetic_form_id, 164) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
    field(:musical_form_id, 168) {
        number 32, true, -1
    }
    def musical_form_tg ; df.world.musical_forms.all.binsearch(musical_form_id) ; end
    field(:dance_form_id, 172) {
        number 32, true, -1
    }
    def dance_form_tg ; df.world.dance_forms.all.binsearch(dance_form_id) ; end
    field(:scale_id, 176) {
        number 32, true, -1
    }
    def scale_tg ; df.world.scales.all.binsearch(scale_id) ; end
    field(:rhythm_id, 180) {
        number 32, true, -1
    }
    def rhythm_tg ; df.world.rhythms.all.binsearch(rhythm_id) ; end
    field(:occupation_id, 184) {
        number 32, true, -1
    }
    def occupation_tg ; df.world.occupations.all.binsearch(occupation_id) ; end
    field(:belief_system_id, 188) {
        number 32, true, -1
    }
    def belief_system_tg ; df.world.belief_systems.all.binsearch(belief_system_id) ; end
    field(:image_set_id, 192) {
        number 32, true, -1
    }
    def image_set_tg ; df.world.image_sets.all.binsearch(image_set_id) ; end
    field(:divination_set_id, 196) {
        number 32, true, -1
    }
    def divination_set_tg ; df.world.divination_sets.all.binsearch(divination_set_id) ; end
end

class HistoryEventCreateEntityPositionst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_create_entity_positionst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:civ, 44) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:position, 52) {
        number 32, true
    }
    field(:reason, 56) {
        number 16, true, nil, PositionCreationReasonType
    }
end

class HistoryEventCreatedBuildingst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_created_buildingst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 52) {
        number 32, true, -1
    }
    field(:builder_hf, 56) {
        number 32, true, -1
    }
    def builder_hf_tg ; df.world.history.figures.binsearch(builder_hf) ; end
    field(:rebuild, 60) {
        number 8, true, nil, BooleanEnum
    }
end

class HistoryEventCreatedSitest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_created_sitest

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:resident_civ_id, 48) {
        number 32, true, -1
    }
    def resident_civ_tg ; df.world.entities.all.binsearch(resident_civ_id) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:builder_hf, 56) {
        number 32, true, -1
    }
    def builder_hf_tg ; df.world.history.figures.binsearch(builder_hf) ; end
end

class HistoryEventCreatedWorldConstructionst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_created_world_constructionst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:construction, 48) {
        number 32, true
    }
    field(:master_construction, 52) {
        number 32, true
    }
    field(:site1, 56) {
        number 32, true, -1
    }
    def site1_tg ; df.world.world_data.sites.binsearch(site1) ; end
    field(:site2, 60) {
        number 32, true, -1
    }
    def site2_tg ; df.world.world_data.sites.binsearch(site2) ; end
end

class HistoryEventCreatureDevouredst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_creature_devouredst

    field(:victim, 40) {
        number 32, true, -1
    }
    def victim_tg ; df.world.history.figures.binsearch(victim) ; end
    field(:race, 44) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 48) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:eater, 52) {
        number 32, true, -1
    }
    def eater_tg ; df.world.history.figures.binsearch(eater) ; end
    field(:entity, 56) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:site, 60) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 64) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 68) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventDanceFormCreatedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_dance_form_createdst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:form, 44) {
        number 32, true, -1
    }
    def form_tg ; df.world.dance_forms.all.binsearch(form) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventDiplomatLostst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_diplomat_lostst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:involved, 44) {
        number 32, true, -1
    }
    def involved_tg ; df.world.entities.all.binsearch(involved) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventEntityActionst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_actionst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 48) {
        number 32, true, -1
    }
    field(:action, 52) {
        number 32, true, nil, EntityActionType
    }
end

class HistoryEventEntityAllianceFormedst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_entity_alliance_formedst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:joining_entities, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def joining_entities_tg ; joining_entities.map { |i| df.world.entities.all.binsearch(i) } ; end
end

class HistoryEventEntityBreachFeatureLayerst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_breach_feature_layerst

    field(:site, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:site_entity, 44) {
        number 32, true, -1
    }
    def site_entity_tg ; df.world.entities.all.binsearch(site_entity) ; end
    field(:civ_entity, 48) {
        number 32, true, -1
    }
    def civ_entity_tg ; df.world.entities.all.binsearch(civ_entity) ; end
    field(:layer, 52) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventEntityCreatedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_createdst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 48) {
        number 32, true, -1
    }
    field(:creator_hfid, 52) {
        number 32, true, -1
    }
    def creator_hfid_tg ; df.world.history.figures.binsearch(creator_hfid) ; end
end

class HistoryEventEntityDissolvedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_entity_dissolvedst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:circumstance, 44) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 52) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventEntityEquipmentPurchasest < HistoryEvent
    sizeof 72

    rtti_classname :history_event_entity_equipment_purchasest

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:quality, 44) {
        number 32, true, nil, ItemQuality
    }
    field(:hfs, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def hfs_tg ; hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class HistoryEventEntityExpelsHfst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_expels_hfst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:expelled, 44) {
        number 32, true, -1
    }
    def expelled_tg ; df.world.history.figures.binsearch(expelled) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventEntityFledSitest < HistoryEvent
    sizeof 48

    rtti_classname :history_event_entity_fled_sitest

    field(:fled_civ_id, 40) {
        number 32, true, -1
    }
    def fled_civ_tg ; df.world.entities.all.binsearch(fled_civ_id) ; end
    field(:site_id, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
end

class HistoryEventEntityIncorporatedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_entity_incorporatedst

    field(:migrant_entity, 40) {
        number 32, true, -1
    }
    def migrant_entity_tg ; df.world.entities.all.binsearch(migrant_entity) ; end
    field(:join_entity, 44) {
        number 32, true, -1
    }
    def join_entity_tg ; df.world.entities.all.binsearch(join_entity) ; end
    field(:leader_hfid, 48) {
        number 32, true, -1
    }
    def leader_hfid_tg ; df.world.history.figures.binsearch(leader_hfid) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:partial, 56) {
        number 8, true, nil, BooleanEnum
    }
end

class HistoryEventEntityLawst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_lawst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:add_flags, 48) {
        compound(:HistoryEventEntityLawst_TAddFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:harsh, 0) { bit 0 }
        }
    }
    field(:remove_flags, 52) {
        compound(:HistoryEventEntityLawst_TRemoveFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:harsh, 0) { bit 0 }
        }
    }
end

class HistoryEventEntityOverthrownst < HistoryEvent
    sizeof 96

    rtti_classname :history_event_entity_overthrownst

    field(:overthrown_hf, 40) {
        number 32, true, -1
    }
    def overthrown_hf_tg ; df.world.history.figures.binsearch(overthrown_hf) ; end
    field(:position_taker_hf, 44) {
        number 32, true, -1
    }
    def position_taker_hf_tg ; df.world.history.figures.binsearch(position_taker_hf) ; end
    field(:instigator_hf, 48) {
        number 32, true, -1
    }
    def instigator_hf_tg ; df.world.history.figures.binsearch(instigator_hf) ; end
    field(:entity, 52) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:position_profile_id, 56) {
        number 32, true
    }
    field(:conspirator_hfs, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def conspirator_hfs_tg ; conspirator_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:site, 88) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventEntityPersecutedst < HistoryEvent
    sizeof 208

    rtti_classname :history_event_entity_persecutedst

    field(:persecuting_hf, 40) {
        number 32, true, -1
    }
    def persecuting_hf_tg ; df.world.history.figures.binsearch(persecuting_hf) ; end
    field(:persecuting_entity, 44) {
        number 32, true, -1
    }
    def persecuting_entity_tg ; df.world.entities.all.binsearch(persecuting_entity) ; end
    field(:target_entity, 48) {
        number 32, true, -1
    }
    def target_entity_tg ; df.world.entities.all.binsearch(target_entity) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:property_confiscated_from_hfs, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def property_confiscated_from_hfs_tg ; property_confiscated_from_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:destroyed_structures, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:shrines_destroyed, 104) {
        number 32, true
    }
    field(:expelled_hfs, 112) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def expelled_hfs_tg ; expelled_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:expelled_populations, 136) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:expelled_races, 160) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:expelled_counts, 184) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class HistoryEventEntityRampagedInSitest < HistoryEvent
    sizeof 48

    rtti_classname :history_event_entity_rampaged_in_sitest

    field(:rampage_civ_id, 40) {
        number 32, true, -1
    }
    def rampage_civ_tg ; df.world.entities.all.binsearch(rampage_civ_id) ; end
    field(:site_id, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
end

class HistoryEventEntityRazedBuildingst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_razed_buildingst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 48) {
        number 32, true, -1
    }
end

class HistoryEventEntitySearchedSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_entity_searched_sitest

    field(:searcher_civ, 40) {
        number 32, true, -1
    }
    def searcher_civ_tg ; df.world.entities.all.binsearch(searcher_civ) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:result, 48) {
        number 32, true
    }
end

class HistoryEventFailedFrameAttemptst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_failed_frame_attemptst

    field(:target_hf, 40) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:convicter_entity, 44) {
        number 32, true, -1
    }
    def convicter_entity_tg ; df.world.entities.all.binsearch(convicter_entity) ; end
    field(:plotter_hf, 48) {
        number 32, true, -1
    }
    def plotter_hf_tg ; df.world.history.figures.binsearch(plotter_hf) ; end
    field(:fooled_hf, 52) {
        number 32, true, -1
    }
    def fooled_hf_tg ; df.world.history.figures.binsearch(fooled_hf) ; end
    field(:framer_hf, 56) {
        number 32, true, -1
    }
    def framer_hf_tg ; df.world.history.figures.binsearch(framer_hf) ; end
    field(:crime, 60) {
        number 32, true
    }
end

class HistoryEventFailedIntrigueCorruptionst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_failed_intrigue_corruptionst

    field(:corruptor_hf, 40) {
        number 32, true, -1
    }
    def corruptor_hf_tg ; df.world.history.figures.binsearch(corruptor_hf) ; end
    field(:corruptor_identity, 44) {
        number 32, true
    }
    field(:target_hf, 48) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:target_identity, 52) {
        number 32, true
    }
    field(:site, 56) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 60) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventFirstContactFailedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_first_contact_failedst

    field(:contactor, 40) {
        number 32, true, -1
    }
    def contactor_tg ; df.world.entities.all.binsearch(contactor) ; end
    field(:rejector, 44) {
        number 32, true, -1
    }
    def rejector_tg ; df.world.entities.all.binsearch(rejector) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventFirstContactst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_first_contactst

    field(:contactor, 40) {
        number 32, true, -1
    }
    def contactor_tg ; df.world.entities.all.binsearch(contactor) ; end
    field(:contacted, 44) {
        number 32, true, -1
    }
    def contacted_tg ; df.world.entities.all.binsearch(contacted) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventGamblest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_gamblest

    field(:hf, 40) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 48) {
        number 32, true
    }
    field(:account_before, 52) {
        number 32, true
    }
    field(:account_after, 56) {
        number 32, true
    }
end

class HistoryEventHfActOnArtifactst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_act_on_artifactst

    field(:action, 40) {
        class ::DFHack::HistoryEventHfActOnArtifactst_TAction < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :View ; NUME[:View] = 0
            ENUM[1] = :AskAbout ; NUME[:AskAbout] = 1
        end

        number 32, true, nil, HistoryEventHfActOnArtifactst_TAction
    }
    field(:artifact, 44) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 56) {
        number 32, true, -1
    }
end

class HistoryEventHfActOnBuildingst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_hf_act_on_buildingst

    field(:action, 40) {
        class ::DFHack::HistoryEventHfActOnBuildingst_TAction < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Profane ; NUME[:Profane] = 0
            ENUM[1] = :Disturb ; NUME[:Disturb] = 1
            ENUM[2] = :PrayedInside ; NUME[:PrayedInside] = 2
        end

        number 32, true, nil, HistoryEventHfActOnBuildingst_TAction
    }
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 52) {
        number 32, true, -1
    }
end

class HistoryEventHfAttackedSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_hf_attacked_sitest

    field(:attacker_hf, 40) {
        number 32, true, -1
    }
    def attacker_hf_tg ; df.world.history.figures.binsearch(attacker_hf) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventHfConfrontedst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_hf_confrontedst

    field(:target, 40) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target) ; end
    field(:accuser, 44) {
        number 32, true, -1
    }
    def accuser_tg ; df.world.history.figures.binsearch(accuser) ; end
    field(:reasons, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:site, 72) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 76) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 80) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 84) {
        global :Coord2d
    }
end

class HistoryEventHfConvictedst < HistoryEvent
    sizeof 128

    rtti_classname :history_event_hf_convictedst

    field(:convicted_hf, 40) {
        number 32, true, -1
    }
    def convicted_hf_tg ; df.world.history.figures.binsearch(convicted_hf) ; end
    field(:convicter_entity, 44) {
        number 32, true, -1
    }
    def convicter_entity_tg ; df.world.entities.all.binsearch(convicter_entity) ; end
    field(:recognized_by_entity, 48) {
        number 32, true, -1
    }
    def recognized_by_entity_tg ; df.world.entities.all.binsearch(recognized_by_entity) ; end
    field(:recognized_by_hf, 52) {
        number 32, true, -1
    }
    def recognized_by_hf_tg ; df.world.history.figures.binsearch(recognized_by_hf) ; end
    field(:implicated_hfs, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def implicated_hfs_tg ; implicated_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:corrupt_hf, 80) {
        number 32, true, -1
    }
    def corrupt_hf_tg ; df.world.history.figures.binsearch(corrupt_hf) ; end
    field(:behest_of_hf, 84) {
        number 32, true, -1
    }
    def behest_of_hf_tg ; df.world.history.figures.binsearch(behest_of_hf) ; end
    field(:fooled_hf, 88) {
        number 32, true, -1
    }
    def fooled_hf_tg ; df.world.history.figures.binsearch(fooled_hf) ; end
    field(:framer_hf, 92) {
        number 32, true, -1
    }
    def framer_hf_tg ; df.world.history.figures.binsearch(framer_hf) ; end
    field(:surveillance_hf, 96) {
        number 32, true, -1
    }
    def surveillance_hf_tg ; df.world.history.figures.binsearch(surveillance_hf) ; end
    field(:co_conspirator_hf, 100) {
        number 32, true, -1
    }
    def co_conspirator_hf_tg ; df.world.history.figures.binsearch(co_conspirator_hf) ; end
    field(:target_hf, 104) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:crime, 108) {
        number 32, true
    }
    field(:hammerstrokes, 112) {
        number 32, true
    }
    field(:prison_months, 116) {
        number 32, true
    }
    field(:punishment_flags, 120) {
        compound(:HistoryEventHfConvictedst_TPunishmentFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:beaten, 0) { bit 0 }
            field(:exiled, 0) { bit 1 }
            field(:death_sentence, 0) { bit 2 }
            field(:no_prison_available, 0) { bit 3 }
        }
    }
    field(:plot_flags, 124) {
        compound(:HistoryEventHfConvictedst_TPlotFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:wrongful, 0) { bit 0 }
            field(:plot_surveillance, 0) { bit 1 }
            field(:target_surveillance, 0) { bit 2 }
            field(:implicated_others, 0) { bit 3 }
            field(:co_conspirator_surveillance, 0) { bit 4 }
            field(:go_between, 0) { bit 5 }
            field(:revealed_nothing, 0) { bit 6 }
        }
    }
end

class HistoryEventHfDestroyedSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_hf_destroyed_sitest

    field(:attacker_hf, 40) {
        number 32, true, -1
    }
    def attacker_hf_tg ; df.world.history.figures.binsearch(attacker_hf) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventHfDoesInteractionst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_hf_does_interactionst

    field(:doer, 40) {
        number 32, true, -1
    }
    def doer_tg ; df.world.history.figures.binsearch(doer) ; end
    field(:target, 44) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target) ; end
    field(:interaction, 48) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction) ; end
    field(:source, 52) {
        number 32, true, -1
    }
    field(:site, 56) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 60) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 64) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHfEnslavedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_hf_enslavedst

    field(:enslaved_hf, 40) {
        number 32, true, -1
    }
    def enslaved_hf_tg ; df.world.history.figures.binsearch(enslaved_hf) ; end
    field(:seller_hf, 44) {
        number 32, true, -1
    }
    def seller_hf_tg ; df.world.history.figures.binsearch(seller_hf) ; end
    field(:payer_entity, 48) {
        number 32, true, -1
    }
    def payer_entity_tg ; df.world.entities.all.binsearch(payer_entity) ; end
    field(:moved_to_site, 52) {
        number 32, true, -1
    }
    def moved_to_site_tg ; df.world.world_data.sites.binsearch(moved_to_site) ; end
end

class HistoryEventHfFreedst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_hf_freedst

    field(:freeing_civ, 40) {
        number 32, true, -1
    }
    def freeing_civ_tg ; df.world.entities.all.binsearch(freeing_civ) ; end
    field(:freeing_hf, 44) {
        number 32, true, -1
    }
    def freeing_hf_tg ; df.world.history.figures.binsearch(freeing_hf) ; end
    field(:holding_civ, 48) {
        number 32, true, -1
    }
    def holding_civ_tg ; df.world.entities.all.binsearch(holding_civ) ; end
    field(:site_civ, 52) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 56) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:rescued_hfs, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def rescued_hfs_tg ; rescued_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class HistoryEventHfGainsSecretGoalst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_gains_secret_goalst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:goal, 44) {
        number 32, true, nil, GoalType
    }
    field(:unk_1, 48) {
        number 32, true, -1
    }
    field(:unk_2, 52) {
        number 32, true, -1
    }
    field(:reason, 56) {
        number 32, true, nil, HistoryEventReason
    }
    field(:unk_3, 60) {
        number 32, true, -1
    }
end

class HistoryEventHfInterrogatedst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_hf_interrogatedst

    field(:target_hf, 40) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:arresting_entity, 44) {
        number 32, true, -1
    }
    def arresting_entity_tg ; df.world.entities.all.binsearch(arresting_entity) ; end
    field(:interrogator_hf, 48) {
        number 32, true, -1
    }
    def interrogator_hf_tg ; df.world.history.figures.binsearch(interrogator_hf) ; end
    field(:implicated_hfs, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def implicated_hfs_tg ; implicated_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:interrogation_flags, 80) {
        compound(:HistoryEventHfInterrogatedst_TInterrogationFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:recognized, 0) { bit 0 }
            field(:refused_to_reveal, 0) { bit 1 }
        }
    }
end

class HistoryEventHfLearnsSecretst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_learns_secretst

    field(:student, 40) {
        number 32, true, -1
    }
    def student_tg ; df.world.history.figures.binsearch(student) ; end
    field(:teacher, 44) {
        number 32, true, -1
    }
    def teacher_tg ; df.world.history.figures.binsearch(teacher) ; end
    field(:artifact, 48) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
    field(:interaction, 52) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction) ; end
    field(:unk_1, 56) {
        number 32, true
    }
end

class HistoryEventHfPreachst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_preachst

    field(:speaker_hf, 40) {
        number 32, true, -1
    }
    def speaker_hf_tg ; df.world.history.figures.binsearch(speaker_hf) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:topic, 48) {
        number 16, true, nil, ReputationType
    }
    field(:entity1, 52) {
        number 32, true, -1
    }
    def entity1_tg ; df.world.entities.all.binsearch(entity1) ; end
    field(:entity2, 56) {
        number 32, true, -1
    }
    def entity2_tg ; df.world.entities.all.binsearch(entity2) ; end
end

class HistoryEventHfRansomedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_ransomedst

    field(:ransomed_hf, 40) {
        number 32, true, -1
    }
    def ransomed_hf_tg ; df.world.history.figures.binsearch(ransomed_hf) ; end
    field(:ransomer_hf, 44) {
        number 32, true, -1
    }
    def ransomer_hf_tg ; df.world.history.figures.binsearch(ransomer_hf) ; end
    field(:payer_hf, 48) {
        number 32, true, -1
    }
    def payer_hf_tg ; df.world.history.figures.binsearch(payer_hf) ; end
    field(:payer_entity, 52) {
        number 32, true, -1
    }
    def payer_entity_tg ; df.world.entities.all.binsearch(payer_entity) ; end
    field(:moved_to_site, 56) {
        number 32, true, -1
    }
    def moved_to_site_tg ; df.world.world_data.sites.binsearch(moved_to_site) ; end
end

class HistoryEventHfRazedBuildingst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_hf_razed_buildingst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 48) {
        number 32, true, -1
    }
end

class HistoryEventHfRecruitedUnitTypeForEntityst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hf_recruited_unit_type_for_entityst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:profession, 48) {
        number 16, true, nil, Profession
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHfRelationshipDeniedst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_hf_relationship_deniedst

    field(:seeker_hf, 40) {
        number 32, true, -1
    }
    def seeker_hf_tg ; df.world.history.figures.binsearch(seeker_hf) ; end
    field(:target_hf, 44) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:type, 48) {
        number 32, true, nil, UnitRelationshipType
    }
    field(:reason, 52) {
        number 32, true, nil, HistoryEventReason
    }
    field(:reason_id, 56) {
        number 32, true, -1
    }
    def reason_tg ; df.world.history.figures.binsearch(reason_id) ; end
    field(:site, 60) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 64) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 68) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHfsFormedIntrigueRelationshipst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_hfs_formed_intrigue_relationshipst

    field(:corruptor_hf, 40) {
        number 32, true, -1
    }
    def corruptor_hf_tg ; df.world.history.figures.binsearch(corruptor_hf) ; end
    field(:corruptor_identity, 44) {
        number 32, true
    }
    field(:target_hf, 48) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:target_identity, 52) {
        number 32, true
    }
    field(:target_role, 56) {
        number 32, true, -1
    }
    field(:corruptor_role, 60) {
        number 32, true, -1
    }
    field(:site, 64) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 68) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 72) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHfsFormedReputationRelationshipst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_hfs_formed_reputation_relationshipst

    field(:histfig1, 40) {
        number 32, true, -1
    }
    def histfig1_tg ; df.world.history.figures.binsearch(histfig1) ; end
    field(:identity1, 44) {
        number 32, true, -1
    }
    def identity1_tg ; df.world.identities.all.binsearch(identity1) ; end
    field(:histfig2, 48) {
        number 32, true, -1
    }
    def histfig2_tg ; df.world.history.figures.binsearch(histfig2) ; end
    field(:identity2, 52) {
        number 32, true, -1
    }
    def identity2_tg ; df.world.identities.all.binsearch(identity2) ; end
    field(:rep1, 56) {
        number 32, true, nil, ReputationType
    }
    field(:rep2, 60) {
        number 32, true, nil, ReputationType
    }
    field(:site, 64) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 68) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 72) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHistFigureAbductedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_hist_figure_abductedst

    field(:target, 40) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target) ; end
    field(:snatcher, 44) {
        number 32, true, -1
    }
    def snatcher_tg ; df.world.history.figures.binsearch(snatcher) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHistFigureDiedst < HistoryEvent
    sizeof 104

    rtti_classname :history_event_hist_figure_diedst

    field(:victim_hf, 40) {
        number 32, true, -1
    }
    def victim_hf_tg ; df.world.history.figures.binsearch(victim_hf) ; end
    field(:slayer_hf, 44) {
        number 32, true, -1
    }
    def slayer_hf_tg ; df.world.history.figures.binsearch(slayer_hf) ; end
    field(:slayer_race, 48) {
        number 32, true, -1
    }
    def slayer_race_tg ; df.world.raws.creatures.all[slayer_race] ; end
    field(:slayer_caste, 52) {
        number 32, true, -1
    }
    def slayer_caste_tg ; df.world.raws.creatures.all[slayer_race].caste[slayer_caste] ; end
    field(:weapon, 56) {
        global :HistoryHitItem
    }
    field(:site, 88) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:subregion, 92) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion] ; end
    field(:feature_layer, 96) {
        number 32, true, -1
    }
    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer] ; end
    field(:death_cause, 100) {
        number 16, true, nil, DeathType
    }
end

class HistoryEventHistFigureNewPetst < HistoryEvent
    sizeof 104

    rtti_classname :history_event_hist_figure_new_petst

    field(:group, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group_tg ; group.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:pets, 64) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def pets_tg ; pets.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:site, 88) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 92) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 96) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 100) {
        global :Coord2d
    }
end

class HistoryEventHistFigureReachSummitst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_hist_figure_reach_summitst

    field(:group, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group_tg ; group.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:region, 64) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 68) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 72) {
        global :Coord2d
    }
end

class HistoryEventHistFigureReunionst < HistoryEvent
    sizeof 104

    rtti_classname :history_event_hist_figure_reunionst

    field(:missing, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def missing_tg ; missing.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:reunited_with, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def reunited_with_tg ; reunited_with.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:assistant, 88) {
        number 32, true, -1
    }
    def assistant_tg ; df.world.history.figures.binsearch(assistant) ; end
    field(:site, 92) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 96) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 100) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHistFigureRevivedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_hist_figure_revivedst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 48) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 52) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:ghost_type, 56) {
        number 16, true, nil, GhostType
    }
    field(:flags2, 60) {
        compound(:HistoryEventHistFigureRevivedst_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:again, 0) { bit 0 }
        }
    }
    field(:actor_hfid, 64) {
        number 32, true, -1
    }
    def actor_hfid_tg ; df.world.history.figures.binsearch(actor_hfid) ; end
    field(:interaction, 68) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction) ; end
    field(:unk_1, 72) {
        number 32, true
    }
end

class HistoryEventHistFigureSimpleActionst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_hist_figure_simple_actionst

    field(:group_hfs, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group_hfs_tg ; group_hfs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:type, 64) {
        number 32, true, nil, SimpleActionType
    }
    field(:site, 68) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 72) {
        number 32, true, -1
    }
    field(:region, 76) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 80) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventHistFigureSimpleBattleEventst < HistoryEvent
    sizeof 104

    rtti_classname :history_event_hist_figure_simple_battle_eventst

    field(:group1, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group1_tg ; group1.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:group2, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group2_tg ; group2.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:site, 88) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 92) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 96) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:subtype, 100) {
        number 16, true, nil, HistoryEventSimpleBattleSubtype
    }
end

class HistoryEventHistFigureTravelst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_hist_figure_travelst

    field(:group, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def group_tg ; group.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:site, 64) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 68) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 72) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:reason, 76) {
        class ::DFHack::HistoryEventHistFigureTravelst_TReason < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Journey ; NUME[:Journey] = 0
            ENUM[1] = :Return ; NUME[:Return] = 1
            ENUM[2] = :Escape ; NUME[:Escape] = 2
        end

        number 32, true, nil, HistoryEventHistFigureTravelst_TReason
    }
    field(:region_pos, 80) {
        global :Coord2d
    }
end

class HistoryEventHistFigureWoundedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_hist_figure_woundedst

    field(:woundee, 40) {
        number 32, true, -1
    }
    def woundee_tg ; df.world.history.figures.binsearch(woundee) ; end
    field(:wounder, 44) {
        number 32, true, -1
    }
    def wounder_tg ; df.world.history.figures.binsearch(wounder) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:woundee_race, 60) {
        number 32, true, -1
    }
    def woundee_race_tg ; df.world.raws.creatures.all[woundee_race] ; end
    field(:woundee_caste, 64) {
        number 16, true, -1
    }
    def woundee_caste_tg ; df.world.raws.creatures.all[woundee_race].caste[woundee_caste] ; end
    field(:body_part, 66) {
        number 16, true
    }
    field(:injury_type, 68) {
        class ::DFHack::HistoryEventHistFigureWoundedst_TInjuryType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Smash ; NUME[:Smash] = 0
            ENUM[1] = :Slash ; NUME[:Slash] = 1
            ENUM[2] = :Stab ; NUME[:Stab] = 2
            ENUM[3] = :Rip ; NUME[:Rip] = 3
            ENUM[4] = :Burn ; NUME[:Burn] = 4
        end

        number 16, true, nil, HistoryEventHistFigureWoundedst_TInjuryType
    }
    field(:part_lost, 70) {
        number 8, true, nil, BooleanEnum
    }
    field(:flags2, 72) {
        compound(:HistoryEventHistFigureWoundedst_TFlags2) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:torture, 0) { bit 0 }
        }
    }
end

class HistoryEventInsurrectionEndedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_insurrection_endedst

    field(:target_civ, 40) {
        number 32, true, -1
    }
    def target_civ_tg ; df.world.entities.all.binsearch(target_civ) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:outcome, 48) {
        number 32, true, nil, InsurrectionOutcome
    }
end

class HistoryEventInsurrectionStartedst < HistoryEvent
    sizeof 48

    rtti_classname :history_event_insurrection_startedst

    field(:target_civ, 40) {
        number 32, true, -1
    }
    def target_civ_tg ; df.world.entities.all.binsearch(target_civ) ; end
    field(:site, 44) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventItemStolenst < HistoryEvent
    sizeof 112

    rtti_classname :history_event_item_stolenst

    field(:item_type, 40) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 42) {
        number 16, true, -1
    }
    field(:mattype, 44) {
        number 16, true, -1
    }
    field(:matindex, 48) {
        number 32, true
    }
    field(:item, 52) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item) ; end
    field(:entity, 56) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:histfig, 60) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 64) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 68) {
        number 32, true, -1
    }
    field(:region, 72) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 76) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 80) {
        global :Coord2d
    }
    field(:stash_site, 84) {
        number 32, true, -1
    }
    def stash_site_tg ; df.world.world_data.sites.binsearch(stash_site) ; end
    field(:circumstance, 88) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 96) {
        global :HistoryEventReasonInfo
    }
    field(:theft_method, 104) {
        number 32, true, nil, TheftMethodType
    }
end

class HistoryEventKnowledgeDiscoveredst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_knowledge_discoveredst

    field(:hf, 40) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:knowledge, 44) {
        global :KnowledgeScholarCategoryFlag
    }
    field(:first, 52) {
        number 8, true
    }
end

class HistoryEventMasterpieceCreatedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_masterpiece_createdst

    field(:maker, 40) {
        number 32, true, -1
    }
    def maker_tg ; df.world.history.figures.binsearch(maker) ; end
    field(:maker_entity, 44) {
        number 32, true, -1
    }
    def maker_entity_tg ; df.world.entities.all.binsearch(maker_entity) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:skill_at_time, 52) {
        number 32, true, nil, SkillRating
    }
end

class HistoryEventMasterpieceCreatedArchConstructst < HistoryEventMasterpieceCreatedst
    sizeof 72

    rtti_classname :history_event_masterpiece_created_arch_constructst

    field(:building_type, 56) {
        number 16, true
    }
    field(:building_subtype, 58) {
        number 16, true
    }
    field(:building_custom, 60) {
        number 32, true
    }
    field(:unk_2, 64) {
        number 32, true
    }
end

class HistoryEventMasterpieceCreatedArchDesignst < HistoryEventMasterpieceCreatedst
    sizeof 72

    rtti_classname :history_event_masterpiece_created_arch_designst

    field(:building_type, 56) {
        number 16, true
    }
    field(:building_subtype, 58) {
        number 16, true
    }
    field(:building_custom, 60) {
        number 32, true
    }
    field(:unk_2, 64) {
        number 32, true
    }
end

class HistoryEventMasterpieceCreatedDyeItemst < HistoryEventMasterpieceCreatedst
    sizeof 80

    rtti_classname :history_event_masterpiece_created_dye_itemst

    field(:item_type, 56) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 58) {
        number 16, true, -1
    }
    field(:mat_type, 60) {
        number 16, true, -1
    }
    field(:mat_index, 64) {
        number 32, true
    }
    field(:unk_2, 68) {
        number 32, true
    }
    field(:dye_mat_type, 72) {
        number 16, true, -1
    }
    field(:dye_mat_index, 76) {
        number 32, true
    }
end

class HistoryEventMasterpieceCreatedEngravingst < HistoryEventMasterpieceCreatedst
    sizeof 64

    rtti_classname :history_event_masterpiece_created_engravingst

    field(:art_id, 56) {
        number 32, true, -1
    }
    def art_tg ; df.world.art_image_chunks.binsearch(art_id) ; end
    field(:art_subid, 60) {
        number 16, true, -1
    }
end

class HistoryEventMasterpieceCreatedFoodst < HistoryEventMasterpieceCreatedst
    sizeof 64

    rtti_classname :history_event_masterpiece_created_foodst

    field(:item_subtype, 56) {
        number 16, true, -1
    }
    def item_subtype_tg ; df.world.raws.itemdefs.food[item_subtype] ; end
    field(:item_id, 60) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class HistoryEventMasterpieceCreatedItemImprovementst < HistoryEventMasterpieceCreatedst
    sizeof 96

    rtti_classname :history_event_masterpiece_created_item_improvementst

    field(:item_type, 56) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 58) {
        number 16, true, -1
    }
    field(:mat_type, 60) {
        number 16, true, -1
    }
    field(:mat_index, 64) {
        number 32, true
    }
    field(:unk_2, 68) {
        number 32, true
    }
    field(:improvement_type, 72) {
        number 16, true, nil, ImprovementType
    }
    field(:improvement_subtype, 76) {
        number 32, true
    }
    field(:imp_mat_type, 80) {
        number 16, true, -1
    }
    field(:imp_mat_index, 84) {
        number 32, true
    }
    field(:art_id, 88) {
        number 32, true, -1
    }
    def art_tg ; df.world.art_image_chunks.binsearch(art_id) ; end
    field(:art_subid, 92) {
        number 16, true, -1
    }
end

class HistoryEventMasterpieceCreatedItemst < HistoryEventMasterpieceCreatedst
    sizeof 72

    rtti_classname :history_event_masterpiece_created_itemst

    field(:item_type, 56) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 58) {
        number 16, true, -1
    }
    field(:mat_type, 60) {
        number 16, true, -1
    }
    field(:mat_index, 62) {
        number 16, true
    }
    field(:item_id, 64) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class HistoryEventMasterpieceLostst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_masterpiece_lostst

    field(:creation_event, 40) {
        number 32, true, -1
    }
    def creation_event_tg ; df.world.history.events.binsearch(creation_event) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:method, 52) {
        number 16, true, nil, MasterpieceLossType
    }
end

class HistoryEventMerchantst < HistoryEvent
    sizeof 72

    rtti_classname :history_event_merchantst

    field(:source, 40) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 44) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 56) {
        df_flagarray(HistoryEventMerchantFlags)
    }
end

class HistoryEventModifiedBuildingst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_modified_buildingst

    field(:site, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 44) {
        number 32, true
    }
    field(:hf, 48) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:unk_1, 52) {
        number 32, true
    }
    field(:modification, 56) {
        compound(:HistoryEventModifiedBuildingst_TModification) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:dungeon, 0) { bit 0 }
            field(:fortifications, 0) { bit 1 }
            field(:courtyard, 0) { bit 2 }
            field(:feast_hall, 0) { bit 3 }
        }
    }
end

class HistoryEventMusicalFormCreatedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_musical_form_createdst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:form, 44) {
        number 32, true, -1
    }
    def form_tg ; df.world.musical_forms.all.binsearch(form) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventPerformancest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_performancest

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:occasion, 44) {
        number 32, true
    }
    field(:schedule, 48) {
        number 32, true
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventPoeticFormCreatedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_poetic_form_createdst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:form, 44) {
        number 32, true, -1
    }
    def form_tg ; df.world.poetic_forms.all.binsearch(form) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryEventProcessionst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_processionst

    field(:entity, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:occasion, 44) {
        number 32, true
    }
    field(:schedule, 48) {
        number 32, true
    }
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 56) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 60) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
end

class HistoryEventReasonInfo < MemHack::Compound
    sizeof 8

    field(:type, 0) {
        number 32, true, nil, HistoryEventReason
    }
    field(:data, 4) {
        compound(:HistoryEventReasonInfo_TData) {
            field(:glorify_hf, 0) {
                number 32, true, -1
            }
            def glorify_hf_tg ; df.world.history.figures.binsearch(glorify_hf) ; end
            field(:sanctify_hf, 0) {
                number 32, true, -1
            }
            def sanctify_hf_tg ; df.world.history.figures.binsearch(sanctify_hf) ; end
            field(:artifact_is_heirloom_of_family_hfid, 0) {
                number 32, true, -1
            }
            def artifact_is_heirloom_of_family_hfid_tg ; df.world.history.figures.binsearch(artifact_is_heirloom_of_family_hfid) ; end
            field(:artifact_is_symbol_of_entity_position, 0) {
                number 32, true, -1
            }
            def artifact_is_symbol_of_entity_position_tg ; df.world.entities.all.binsearch(artifact_is_symbol_of_entity_position) ; end
        }
    }
end

class HistoryEventReclaimSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_reclaim_sitest

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 52) {
        compound(:HistoryEventReclaimSitest_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:unretire, 0) { bit 0 }
        }
    }
end

class HistoryEventRegionpopIncorporatedIntoEntityst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_regionpop_incorporated_into_entityst

    field(:pop_race, 40) {
        number 32, true, -1
    }
    def pop_race_tg ; df.world.raws.creatures.all[pop_race] ; end
    field(:number_moved, 44) {
        number 32, true
    }
    field(:pop_region, 48) {
        number 32, true, -1
    }
    def pop_region_tg ; df.world.world_data.regions[pop_region] ; end
    field(:pop_layer, 52) {
        number 32, true, -1
    }
    def pop_layer_tg ; df.world.world_data.underground_regions[pop_layer] ; end
    field(:join_entity, 56) {
        number 32, true, -1
    }
    def join_entity_tg ; df.world.entities.all.binsearch(join_entity) ; end
    field(:site, 60) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventRemoveHfEntityLinkst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_remove_hf_entity_linkst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:histfig, 44) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:link_type, 48) {
        number 32, true, nil, HistfigEntityLinkType
    }
    field(:position_id, 52) {
        number 32, true
    }
end

class HistoryEventRemoveHfHfLinkst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_remove_hf_hf_linkst

    field(:hf, 40) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:hf_target, 44) {
        number 32, true, -1
    }
    def hf_target_tg ; df.world.history.figures.binsearch(hf_target) ; end
    field(:type, 48) {
        number 32, true, nil, HistfigHfLinkType
    }
end

class HistoryEventRemoveHfSiteLinkst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_remove_hf_site_linkst

    field(:site, 40) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 44) {
        number 32, true, -1
    }
    field(:histfig, 48) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:civ, 52) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:type, 56) {
        number 32, true, nil, HistfigSiteLinkType
    }
end

class HistoryEventReplacedBuildingst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_replaced_buildingst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:old_structure, 52) {
        number 32, true, -1
    }
    field(:new_structure, 56) {
        number 32, true, -1
    }
end

class HistoryEventSabotagest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_sabotagest

    field(:saboteur_hf, 40) {
        number 32, true, -1
    }
    def saboteur_hf_tg ; df.world.history.figures.binsearch(saboteur_hf) ; end
    field(:target_hf, 44) {
        number 32, true, -1
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:target_entity, 48) {
        number 32, true, -1
    }
    def target_entity_tg ; df.world.entities.all.binsearch(target_entity) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventSiteDiedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_site_diedst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 52) {
        compound(:HistoryEventSiteDiedst_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:abandoned, 0) { bit 0 }
        }
    }
end

class HistoryEventSiteDisputest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_site_disputest

    field(:dispute_type, 40) {
        number 32, true, nil, SiteDisputeType
    }
    field(:entity_1, 44) {
        number 32, true, -1
    }
    def entity_1_tg ; df.world.entities.all.binsearch(entity_1) ; end
    field(:entity_2, 48) {
        number 32, true, -1
    }
    def entity_2_tg ; df.world.entities.all.binsearch(entity_2) ; end
    field(:site_1, 52) {
        number 32, true, -1
    }
    def site_1_tg ; df.world.world_data.sites.binsearch(site_1) ; end
    field(:site_2, 56) {
        number 32, true, -1
    }
    def site_2_tg ; df.world.world_data.sites.binsearch(site_2) ; end
end

class HistoryEventSiteRetiredst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_site_retiredst

    field(:civ, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ) ; end
    field(:site_civ, 44) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:flags2, 52) {
        compound(:HistoryEventSiteRetiredst_TFlags2) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:first_time, 0) { bit 0 }
        }
    }
end

class HistoryEventSiteSurrenderedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_site_surrenderedst

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventSneakIntoSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_sneak_into_sitest

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventSpottedLeavingSitest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_spotted_leaving_sitest

    field(:spotter_hf, 40) {
        number 32, true, -1
    }
    def spotter_hf_tg ; df.world.history.figures.binsearch(spotter_hf) ; end
    field(:leaver_civ, 44) {
        number 32, true, -1
    }
    def leaver_civ_tg ; df.world.entities.all.binsearch(leaver_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventSquadVsSquadst < HistoryEvent
    sizeof 168

    rtti_classname :history_event_squad_vs_squadst

    field(:a_leader_hfid, 40) {
        number 32, true, -1
    }
    def a_leader_hfid_tg ; df.world.history.figures.binsearch(a_leader_hfid) ; end
    field(:a_leadership_roll, 44) {
        number 32, true
    }
    field(:a_hfid, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def a_hfid_tg ; a_hfid.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:a_squad_id, 72) {
        number 32, true
    }
    field(:a_race, 76) {
        number 32, true, -1
    }
    def a_race_tg ; df.world.raws.creatures.all[a_race] ; end
    field(:a_interaction, 80) {
        number 32, true
    }
    field(:a_effect, 84) {
        number 32, true
    }
    field(:a_number, 88) {
        number 32, true
    }
    field(:a_slain, 92) {
        number 32, true
    }
    field(:d_leader_hfid, 96) {
        number 32, true, -1
    }
    def d_leader_hfid_tg ; df.world.history.figures.binsearch(d_leader_hfid) ; end
    field(:d_leadership_roll, 100) {
        number 32, true
    }
    field(:d_hfid, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def d_hfid_tg ; d_hfid.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:d_squad_id, 128) {
        number 32, true
    }
    field(:d_race, 132) {
        number 32, true, -1
    }
    def d_race_tg ; df.world.raws.creatures.all[d_race] ; end
    field(:d_interaction, 136) {
        number 32, true
    }
    field(:d_effect, 140) {
        number 32, true
    }
    field(:d_number, 144) {
        number 32, true
    }
    field(:d_slain, 148) {
        number 32, true
    }
    field(:site, 152) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 156) {
        number 32, true, -1
    }
    field(:subregion, 160) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion] ; end
    field(:feature_layer, 164) {
        number 32, true, -1
    }
    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer] ; end
end

class HistoryEventTacticalSituationst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_tactical_situationst

    field(:a_tactician_hfid, 40) {
        number 32, true, -1
    }
    def a_tactician_hfid_tg ; df.world.history.figures.binsearch(a_tactician_hfid) ; end
    field(:d_tactician_hfid, 44) {
        number 32, true, -1
    }
    def d_tactician_hfid_tg ; df.world.history.figures.binsearch(d_tactician_hfid) ; end
    field(:a_tactics_roll, 48) {
        number 32, true
    }
    field(:d_tactics_roll, 52) {
        number 32, true
    }
    field(:situation, 56) {
        number 32, true, nil, TacticalSituation
    }
    field(:site, 60) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:structure, 64) {
        number 32, true, -1
    }
    field(:subregion, 68) {
        number 32, true, -1
    }
    def subregion_tg ; df.world.world_data.regions[subregion] ; end
    field(:feature_layer, 72) {
        number 32, true, -1
    }
    def feature_layer_tg ; df.world.world_data.underground_regions[feature_layer] ; end
    field(:tactics_flags, 76) {
        compound(:HistoryEventTacticalSituationst_TTacticsFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:start, 0) { bit 0 }
        }
    }
end

class HistoryEventTopicagreementConcludedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_topicagreement_concludedst

    field(:source, 40) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 44) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:topic, 52) {
        number 16, true, nil, MeetingTopic
    }
    field(:result, 56) {
        number 32, true
    }
end

class HistoryEventTopicagreementMadest < HistoryEvent
    sizeof 56

    rtti_classname :history_event_topicagreement_madest

    field(:topic, 40) {
        number 16, true, nil, MeetingTopic
    }
    field(:source, 44) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 48) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventTopicagreementRejectedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_topicagreement_rejectedst

    field(:topic, 40) {
        number 16, true, nil, MeetingTopic
    }
    field(:source, 44) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 48) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventTradest < HistoryEvent
    sizeof 72

    rtti_classname :history_event_tradest

    field(:hf, 40) {
        number 32, true, -1
    }
    def hf_tg ; df.world.history.figures.binsearch(hf) ; end
    field(:entity, 44) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:source_site, 48) {
        number 32, true, -1
    }
    def source_site_tg ; df.world.world_data.sites.binsearch(source_site) ; end
    field(:dest_site, 52) {
        number 32, true, -1
    }
    def dest_site_tg ; df.world.world_data.sites.binsearch(dest_site) ; end
    field(:production_zone, 56) {
        number 32, true
    }
    field(:allotment, 60) {
        number 32, true
    }
    field(:allotment_index, 64) {
        number 32, true
    }
    field(:account_shift, 68) {
        number 32, true
    }
end

class HistoryEventWarAttackedSitest < HistoryEvent
    sizeof 80

    rtti_classname :history_event_war_attacked_sitest

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:attacker_general_hf, 56) {
        number 32, true, -1
    }
    def attacker_general_hf_tg ; df.world.history.figures.binsearch(attacker_general_hf) ; end
    field(:defender_general_hf, 60) {
        number 32, true, -1
    }
    def defender_general_hf_tg ; df.world.history.figures.binsearch(defender_general_hf) ; end
    field(:attacker_merc_enid, 64) {
        number 32, true, -1
    }
    def attacker_merc_enid_tg ; df.world.entities.all.binsearch(attacker_merc_enid) ; end
    field(:defender_merc_enid, 68) {
        number 32, true, -1
    }
    def defender_merc_enid_tg ; df.world.entities.all.binsearch(defender_merc_enid) ; end
    field(:merc_roles, 72) {
        global :MercRoleType
    }
end

class HistoryEventWarDestroyedSitest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_war_destroyed_sitest

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:unk_1, 56) {
        number 32, true
    }
end

class HistoryEventWarFieldBattlest < HistoryEvent
    sizeof 80

    rtti_classname :history_event_war_field_battlest

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:region, 48) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 52) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_pos, 56) {
        global :Coord2d
    }
    field(:attacker_general_hf, 60) {
        number 32, true, -1
    }
    def attacker_general_hf_tg ; df.world.history.figures.binsearch(attacker_general_hf) ; end
    field(:defender_general_hf, 64) {
        number 32, true, -1
    }
    def defender_general_hf_tg ; df.world.history.figures.binsearch(defender_general_hf) ; end
    field(:attacker_merc_enid, 68) {
        number 32, true, -1
    }
    def attacker_merc_enid_tg ; df.world.entities.all.binsearch(attacker_merc_enid) ; end
    field(:defender_merc_enid, 72) {
        number 32, true, -1
    }
    def defender_merc_enid_tg ; df.world.entities.all.binsearch(defender_merc_enid) ; end
    field(:merc_roles, 76) {
        global :MercRoleType
    }
end

class HistoryEventWarPeaceAcceptedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_war_peace_acceptedst

    field(:topic, 40) {
        number 16, true, nil, MeetingTopic
    }
    field(:source, 44) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 48) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventWarPeaceRejectedst < HistoryEvent
    sizeof 56

    rtti_classname :history_event_war_peace_rejectedst

    field(:topic, 40) {
        number 16, true, nil, MeetingTopic
    }
    field(:source, 44) {
        number 32, true, -1
    }
    def source_tg ; df.world.entities.all.binsearch(source) ; end
    field(:destination, 48) {
        number 32, true, -1
    }
    def destination_tg ; df.world.entities.all.binsearch(destination) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventWarPlunderedSitest < HistoryEvent
    sizeof 64

    rtti_classname :history_event_war_plundered_sitest

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:unk_1, 56) {
        number 32, true, -1
    }
end

class HistoryEventWarSiteNewLeaderst < HistoryEvent
    sizeof 88

    rtti_classname :history_event_war_site_new_leaderst

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:new_site_civ, 44) {
        number 32, true, -1
    }
    def new_site_civ_tg ; df.world.entities.all.binsearch(new_site_civ) ; end
    field(:defender_civ, 48) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 52) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 56) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:new_leaders, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def new_leaders_tg ; new_leaders.map { |i| df.world.history.figures.binsearch(i) } ; end
end

class HistoryEventWarSiteTakenOverst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_war_site_taken_overst

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:new_site_civ, 44) {
        number 32, true, -1
    }
    def new_site_civ_tg ; df.world.entities.all.binsearch(new_site_civ) ; end
    field(:defender_civ, 48) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 52) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 56) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
end

class HistoryEventWarSiteTributeForcedst < HistoryEvent
    sizeof 64

    rtti_classname :history_event_war_site_tribute_forcedst

    field(:attacker_civ, 40) {
        number 32, true, -1
    }
    def attacker_civ_tg ; df.world.entities.all.binsearch(attacker_civ) ; end
    field(:defender_civ, 44) {
        number 32, true, -1
    }
    def defender_civ_tg ; df.world.entities.all.binsearch(defender_civ) ; end
    field(:site_civ, 48) {
        number 32, true, -1
    }
    def site_civ_tg ; df.world.entities.all.binsearch(site_civ) ; end
    field(:site, 52) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:season, 56) {
        number 32, true, nil, Season
    }
    field(:tribute_flags, 60) {
        compound(:HistoryEventWarSiteTributeForcedst_TTributeFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:bled_dry, 0) { bit 0 }
        }
    }
end

class HistoryEventWrittenContentComposedst < HistoryEvent
    sizeof 80

    rtti_classname :history_event_written_content_composedst

    field(:histfig, 40) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:content, 44) {
        number 32, true, -1
    }
    def content_tg ; df.world.written_contents.all.binsearch(content) ; end
    field(:site, 48) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:region, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region] ; end
    field(:layer, 56) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:circumstance, 60) {
        global :HistoryEventCircumstanceInfo
    }
    field(:reason, 68) {
        global :HistoryEventReasonInfo
    }
end

class HistoryHitItem < MemHack::Compound
    sizeof 32

    field(:item, 0) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item) ; end
    field(:item_type, 4) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 6) {
        number 16, true, -1
    }
    field(:mattype, 8) {
        number 16, true, -1
    }
    field(:matindex, 12) {
        number 32, true
    }
    field(:shooter_item, 16) {
        number 32, true, -1
    }
    def shooter_item_tg ; df.world.items.all.binsearch(shooter_item) ; end
    field(:shooter_item_type, 20) {
        number 16, true, nil, ItemType
    }
    field(:shooter_item_subtype, 22) {
        number 16, true, -1
    }
    field(:shooter_mattype, 24) {
        number 16, true, -1
    }
    field(:shooter_matindex, 28) {
        number 32, true
    }
end

class HiveFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:do_install, 0) { bit 0 }
    field(:do_gather, 0) { bit 1 }
    field(:ready_split, 0) { bit 2 }
end

class HonorsType < MemHack::Compound
    sizeof 144

    field(:id, 0) {
        number 32, true
    }
    field(:flags, 4) {
        compound(:HonorsType_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:granted_to_all_new_members, 0) { bit 0 }
        }
    }
    field(:name, 8) {
        stl_string
    }
    field(:precedence_awarded, 40) {
        number 32, true
    }
    field(:required_skill, 44) {
        number 16, true, nil, JobSkill
    }
    field(:required_skill_type, 48) {
        compound(:HonorsType_TRequiredSkillType) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:melee_weapon, 0) { bit 0 }
            field(:ranged_weapon, 0) { bit 1 }
        }
    }
    field(:required_skill_points, 52) {
        number 32, true
    }
    field(:required_kills, 56) {
        number 32, true
    }
    field(:required_battles, 60) {
        number 32, true
    }
    field(:required_years_of_membership, 64) {
        number 32, true
    }
    field(:honored, 72) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def honored_tg ; honored.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:required_position, 96) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:required_former_position, 120) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
end

class HospitalSupplies < MemHack::Compound
    sizeof 64

    field(:supplies_needed, 0) {
        compound(:HospitalSupplies_TSuppliesNeeded) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:splints, 0) { bit 0 }
            field(:thread, 0) { bit 1 }
            field(:cloth, 0) { bit 2 }
            field(:crutches, 0) { bit 3 }
            field(:plaster, 0) { bit 4 }
            field(:buckets, 0) { bit 5 }
            field(:soap, 0) { bit 6 }
        }
    }
    field(:max_splints, 4) {
        number 32, true, 5
    }
    field(:max_thread, 8) {
        number 32, true, 75000
    }
    field(:max_cloth, 12) {
        number 32, true, 50000
    }
    field(:max_crutches, 16) {
        number 32, true, 5
    }
    field(:max_plaster, 20) {
        number 32, true, 750
    }
    field(:max_buckets, 24) {
        number 32, true, 2
    }
    field(:max_soap, 28) {
        number 32, true, 750
    }
    field(:cur_splints, 32) {
        number 32, true
    }
    field(:cur_thread, 36) {
        number 32, true
    }
    field(:cur_cloth, 40) {
        number 32, true
    }
    field(:cur_crutches, 44) {
        number 32, true
    }
    field(:cur_plaster, 48) {
        number 32, true
    }
    field(:cur_buckets, 52) {
        number 32, true
    }
    field(:cur_soap, 56) {
        number 32, true
    }
    field(:supply_recheck_timer, 60) {
        number 32, true
    }
end

class Identity < MemHack::Compound
    sizeof 232

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:race, 128) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 132) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:impersonated_hf, 136) {
        number 32, true, -1
    }
    def impersonated_hf_tg ; df.world.history.figures.binsearch(impersonated_hf) ; end
    field(:histfig_id, 140) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:nemesis_id, 140) {
        number 32, true, -1
    }
    def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis_id) ; end
    field(:type, 144) {
        number 32, true, nil, IdentityType
    }
    field(:birth_year, 148) {
        number 32, true
    }
    field(:birth_second, 152) {
        number 32, true
    }
    field(:unk_2, 156) {
        number 32, true
    }
    field(:unk_3, 160) {
        number 32, true
    }
    field(:unk_v47_1, 164) {
        number 16, true, -1
    }
    field(:unk_v47_2, 168) {
        number 32, true, -1
    }
    field(:profession, 172) {
        number 16, true, nil, Profession
    }
    field(:entity_id, 176) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:unk_4, 184) {
        stl_vector(8) {
            pointer {
                global :IdentityUnk94
            }
        }
    }
    field(:unk_5, 208) {
        stl_vector(8) {
            pointer {
                global :IdentityUnk95
            }
        }
    }
end

class IdentityUnk94 < MemHack::Compound
    sizeof 88

    field(:unk_0, 0) {
        number 32, true
    }
    field(:unk_1, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 56) {
        number 32, true, -1
    }
    field(:unk_4, 60) {
        number 32, true, -1
    }
    field(:unk_5, 64) {
        number 32, true
    }
    field(:unk_6, 68) {
        number 32, true
    }
    field(:unk_7, 72) {
        number 32, true
    }
    field(:unk_8, 76) {
        number 32, true, -1
    }
    field(:unk_9, 80) {
        number 32, true
    }
end

class IdentityUnk95 < MemHack::Compound
    sizeof 72

    field(:unk_0, 0) {
        number 32, true, -1
    }
    field(:unk_1, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 56) {
        number 32, true, -1
    }
    field(:unk_4, 60) {
        number 32, true, -1
    }
    field(:unk_5, 64) {
        number 32, true
    }
end

class ImageSet < MemHack::Compound
    sizeof 56

    field(:id, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_vec1, 8) {
        stl_vector(8) {
            pointer {
                compound(:ImageSet_TUnkVec1) {
                    sizeof 16

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true, -1
                    }
                    field(:unk_3, 8) {
                        number 32, true, -1
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_vec2, 32) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class Incident < MemHack::Compound
    sizeof 280

    field(:id, 0) {
        number 32, true
    }
    field(:type, 4) {
        class ::DFHack::Incident_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Death ; NUME[:Death] = 0
            ENUM[1] = :Crime ; NUME[:Crime] = 1
            ENUM[2] = :Attack ; NUME[:Attack] = 2
            ENUM[3] = :Escalation ; NUME[:Escalation] = 3
            ENUM[4] = :Reunion ; NUME[:Reunion] = 4
            ENUM[5] = :YieldDemand ; NUME[:YieldDemand] = 5
            ENUM[6] = :Performance ; NUME[:Performance] = 6
            ENUM[7] = :Artifact ; NUME[:Artifact] = 7
            ENUM[8] = :Writing ; NUME[:Writing] = 8
            ENUM[9] = :SelfID ; NUME[:SelfID] = 9
            ENUM[10] = :RefusedID ; NUME[:RefusedID] = 10
        end

        number 32, true, nil, Incident_TType
    }
    field(:witnesses, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def witnesses_tg ; witnesses.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:unk_year, 32) {
        number 32, true
    }
    field(:unk_year_tick, 36) {
        number 32, true
    }
    field(:victim, 40) {
        number 32, true, -1
    }
    def victim_tg ; df.world.units.all.binsearch(victim) ; end
    field(:victim_hf, 48) {
        global :IncidentHfid
    }
    field(:victim_race, 88) {
        number 32, true, -1
    }
    def victim_race_tg ; df.world.raws.creatures.all[victim_race] ; end
    field(:victim_caste, 92) {
        number 32, true, -1
    }
    def victim_caste_tg ; df.world.raws.creatures.all[victim_race].caste[victim_caste] ; end
    field(:entity2, 96) {
        number 32, true, -1
    }
    def entity2_tg ; df.world.entities.all.binsearch(entity2) ; end
    field(:unk_v40_1c, 100) {
        number 32, true, -1
    }
    field(:criminal, 104) {
        number 32, true, -1
    }
    def criminal_tg ; df.world.units.all.binsearch(criminal) ; end
    field(:criminal_hf, 112) {
        global :IncidentHfid
    }
    field(:criminal_race, 152) {
        number 32, true, -1
    }
    def criminal_race_tg ; df.world.raws.creatures.all[criminal_race] ; end
    field(:criminal_caste, 156) {
        number 32, true, -1
    }
    def criminal_caste_tg ; df.world.raws.creatures.all[killer_race].caste[criminal_caste] ; end
    field(:entity1, 160) {
        number 32, true, -1
    }
    def entity1_tg ; df.world.entities.all.binsearch(entity1) ; end
    field(:unk_v40_2c, 168) {
        global :IncidentHfid
    }
    field(:crime_id, 208) {
        number 32, true, -1
    }
    def crime_tg ; df.world.crimes.all.binsearch(crime_id) ; end
    field(:site, 212) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:unk_v40_3a, 216) {
        number 32, true, -1
    }
    field(:unk_v40_3b, 220) {
        number 32, true, -1
    }
    field(:entity, 224) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:event_year, 228) {
        number 32, true
    }
    field(:event_time, 232) {
        number 32, true
    }
    field(:flags, 236) {
        compound(:Incident_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:announced_missing, 0) { bit 0 }
            field(:discovered, 0) { bit 1 }
            field(:unk2, 0) { bit 2 }
        }
    }
    field(:death_cause, 240) {
        number 16, true, nil, DeathType
    }
    field(:conflict_level, 244) {
        number 32, true, nil, ConflictLevel
    }
    field(:activity_id, 248) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:world_x, 252) {
        number 32, true
    }
    field(:world_y, 256) {
        number 32, true
    }
    field(:world_z, 260) {
        number 32, true
    }
    field(:unk_80, 264) {
        number 32, true
    }
    field(:unk_10c, 268) {
        number 32, true
    }
    field(:data, 272) {
        compound(:Incident_TData) {
            field(:Performance, 0) {
                pointer {
                    global :IncidentDataPerformance
                }
            }
            field(:Artifact, 0) {
                pointer {
                    global :IncidentDataArtifact
                }
            }
            field(:Writing, 0) {
                pointer {
                    global :IncidentDataWriting
                }
            }
            field(:SelfID, 0) {
                pointer {
                    global :IncidentDataIdentity
                }
            }
            field(:RefusedID, 0) {
                pointer {
                    global :IncidentDataIdentity
                }
            }
        }
    }
end

class IncidentDataArtifact < MemHack::Compound
    sizeof 136

    field(:state, 0) {
        class ::DFHack::IncidentDataArtifact_TState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Held ; NUME[:Held] = 0
            ENUM[1] = :Dropped ; NUME[:Dropped] = 1
            ENUM[2] = :Gained ; NUME[:Gained] = 2
            ENUM[3] = :Given ; NUME[:Given] = 3
            ENUM[4] = :Denied ; NUME[:Denied] = 4
            ENUM[5] = :Destroyed ; NUME[:Destroyed] = 5
        end

        number 32, true, nil, IncidentDataArtifact_TState
    }
    field(:artifact_id, 4) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:unk_3, 8) {
        global :IncidentHfid
    }
    field(:unk_4, 48) {
        global :IncidentHfid
    }
    field(:site_id, 88) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:unk_5, 92) {
        number 32, true
    }
    field(:unk_6, 96) {
        number 32, true
    }
    field(:unk_7, 100) {
        number 32, true
    }
    field(:unk_8, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_9, 128) {
        number 32, true
    }
end

class IncidentDataIdentity < MemHack::Compound
    sizeof 24

    field(:unk_1, 0) {
        stl_vector(8) {
            pointer {
                global :IncidentHfid
            }
        }
    }
end

class IncidentDataPerformance < MemHack::Compound
    sizeof 56

    field(:performance_event, 0) {
        number 32, true, nil, PerformanceEventType
    }
    field(:participants, 8) {
        stl_vector(8) {
            pointer {
                compound(:IncidentDataPerformance_TParticipants) {
                    sizeof 56

                    field(:performance_event, 0) {
                        number 32, true, nil, PerformanceEventType
                    }
                    field(:role_index, 4) {
                        number 32, true
                    }
                    field(:unk_1, 8) {
                        global :IncidentHfid
                    }
                    field(:unk_2, 48) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:reference_id, 32) {
        number 32, true
    }
    field(:written_content_id, 36) {
        number 32, true
    }
    field(:abstract_location, 40) {
        number 32, true
    }
    field(:poetic_form_id, 44) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
    field(:musical_form_id, 48) {
        number 32, true, -1
    }
    def musical_form_tg ; df.world.musical_forms.all.binsearch(musical_form_id) ; end
    field(:dance_form_id, 52) {
        number 32, true, -1
    }
    def dance_form_tg ; df.world.dance_forms.all.binsearch(dance_form_id) ; end
end

class IncidentDataWriting < MemHack::Compound
    sizeof 136

    field(:state, 0) {
        class ::DFHack::IncidentDataWriting_TState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Dropped ; NUME[:Dropped] = 0
            ENUM[1] = :Given ; NUME[:Given] = 1
        end

        number 32, true, nil, IncidentDataWriting_TState
    }
    field(:content_id, 4) {
        number 32, true, -1
    }
    def content_tg ; df.world.written_contents.all.binsearch(content_id) ; end
    field(:unk_1, 8) {
        global :IncidentHfid
    }
    field(:unk_2, 48) {
        global :IncidentHfid
    }
    field(:unk_3, 88) {
        number 32, true
    }
    field(:unk_4, 92) {
        number 32, true
    }
    field(:unk_5, 96) {
        number 32, true
    }
    field(:unk_6, 100) {
        number 32, true
    }
    field(:unk_7, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_8, 128) {
        number 32, true
    }
end

class IncidentHfid < MemHack::Compound
    sizeof 40

    field(:hfid, 0) {
        number 32, true, -1
    }
    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
    field(:unk_hfid, 4) {
        number 32, true, -1
    }
    def unk_hfid_tg ; df.world.history.figures.binsearch(unk_hfid) ; end
    field(:unk_hfid2, 8) {
        number 32, true, -1
    }
    def unk_hfid2_tg ; df.world.history.figures.binsearch(unk_hfid2) ; end
    field(:unk_3, 16) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_3_tg ; unk_3.map { |i| df.world.identities.all.binsearch(i) } ; end
end

class Init < MemHack::Compound
    sizeof 4272

    field(:display, 0) {
        global :InitDisplay
    }
    field(:media, 48) {
        global :InitMedia
    }
    field(:input, 72) {
        global :InitInput
    }
    field(:font, 120) {
        global :InitFont
    }
    field(:window, 4256) {
        global :InitWindow
    }
end

class InitDisplay < MemHack::Compound
    sizeof 48

    field(:flag, 0) {
        df_flagarray(InitDisplayFlags)
    }
    field(:windowed, 16) {
        class ::DFHack::InitDisplay_TWindowed < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :True ; NUME[:True] = 0
            ENUM[1] = :False ; NUME[:False] = 1
            ENUM[2] = :Prompt ; NUME[:Prompt] = 2
        end

        number 32, true, nil, InitDisplay_TWindowed
    }
    field(:grid_x, 20) {
        number 32, true
    }
    field(:grid_y, 24) {
        number 32, true
    }
    field(:desired_fullscreen_width, 28) {
        number 32, true
    }
    field(:desired_fullscreen_height, 32) {
        number 32, true
    }
    field(:desired_windowed_width, 36) {
        number 32, true
    }
    field(:desired_windowed_height, 40) {
        number 32, true
    }
    field(:partial_print_count, 44) {
        number 8, true
    }
end

class InitFont < MemHack::Compound
    sizeof 4136

    field(:small_font_texpos, 0) {
        static_array(256, 4) {
            number 4, true
        }
    }
    field(:large_font_texpos, 1024) {
        static_array(256, 4) {
            number 4, true
        }
    }
    field(:small_font_datapos, 2048) {
        static_array(256, 4) {
            number 4, true
        }
    }
    field(:large_font_datapos, 3072) {
        static_array(256, 4) {
            number 4, true
        }
    }
    field(:small_font_adjx, 4096) {
        float
    }
    field(:small_font_adjy, 4100) {
        float
    }
    field(:large_font_adjx, 4104) {
        float
    }
    field(:large_font_adjy, 4108) {
        float
    }
    field(:small_font_dispx, 4112) {
        number 4, true
    }
    field(:small_font_dispy, 4116) {
        number 4, true
    }
    field(:large_font_dispx, 4120) {
        number 4, true
    }
    field(:large_font_dispy, 4124) {
        number 4, true
    }
    field(:use_ttf, 4128) {
        class ::DFHack::InitFont_TUseTtf < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :TTF_OFF ; NUME[:TTF_OFF] = 0
            ENUM[1] = :TTF_ON ; NUME[:TTF_ON] = 1
            ENUM[2] = :TTF_AUTO ; NUME[:TTF_AUTO] = 2
        end

        number 32, true, nil, InitFont_TUseTtf
    }
    field(:ttf_limit, 4132) {
        number 32, true
    }
end

class InitInput < MemHack::Compound
    sizeof 48

    field(:hold_time, 0) {
        number 4, true
    }
    field(:repeat_time, 4) {
        number 4, true
    }
    field(:macro_time, 8) {
        number 4, true
    }
    field(:pause_zoom_no_interface_ms, 12) {
        number 4, true
    }
    field(:flag, 16) {
        df_flagarray(InitInputFlags)
    }
    field(:zoom_speed, 32) {
        number 4, true
    }
    field(:repeat_accel_start, 36) {
        number 32, true
    }
    field(:repeat_accel_limit, 40) {
        number 32, true
    }
end

class InitMedia < MemHack::Compound
    sizeof 24

    field(:flag, 0) {
        df_flagarray(InitMediaFlags)
    }
    field(:volume, 16) {
        number 32, true
    }
end

class InitWindow < MemHack::Compound
    sizeof 16

    field(:flag, 0) {
        df_flagarray(InitWindowFlags)
    }
end

class InorganicRaw < MemHack::Compound
    sizeof 2128

    field(:id, 0) {
        stl_string
    }
    field(:str, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:flags, 56) {
        df_flagarray(InorganicFlags)
    }
    field(:source_hfid, 72) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:unk_v4201_1, 76) {
        number 32, true, -1
    }
    field(:metal_ore, 80) {
        compound(:InorganicRaw_TMetalOre) {
            field(:str, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:mat_index, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def mat_index_tg ; mat_index.map { |i| df.world.raws.inorganics[i] } ; end
            field(:probability, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:thread_metal, 152) {
        compound(:InorganicRaw_TThreadMetal) {
            field(:str, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:mat_index, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def mat_index_tg ; mat_index.map { |i| df.world.raws.inorganics[i] } ; end
            field(:probability, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:economic_uses, 224) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def economic_uses_tg ; economic_uses.map { |i| df.world.raws.reactions.reactions[i] } ; end
    field(:environment_spec, 248) {
        compound(:InorganicRaw_TEnvironmentSpec) {
            field(:str, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:mat_index, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def mat_index_tg ; mat_index.map { |i| df.world.raws.inorganics[i] } ; end
            field(:inclusion_type, 48) {
                stl_vector(2) {
                    number 16, true, nil, InclusionType
                }
            }
            field(:probability, 72) {
                stl_vector(1) {
                    number 8, true
                }
            }
        }
    }
    field(:environment, 344) {
        compound(:InorganicRaw_TEnvironment) {
            field(:location, 0) {
                stl_vector(2) {
                    number 16, true, nil, EnvironmentType
                }
            }
            field(:type, 24) {
                stl_vector(2) {
                    number 16, true, nil, InclusionType
                }
            }
            field(:probability, 48) {
                stl_vector(1) {
                    number 8, true
                }
            }
        }
    }
    field(:times_used_land, 416) {
        number 16, false
    }
    field(:times_used_ocean, 418) {
        number 16, false
    }
    field(:material, 424) {
        global :Material
    }
end

class InstrumentPiece < MemHack::Compound
    sizeof 144

    field(:type, 0) {
        stl_string
    }
    field(:id, 32) {
        stl_string
    }
    field(:index, 64) {
        number 32, true
    }
    field(:name, 72) {
        stl_string
    }
    field(:name_plural, 104) {
        stl_string
    }
    field(:flags, 136) {
        compound(:InstrumentPiece_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:always_singular, 0) { bit 0 }
            field(:always_plural, 0) { bit 1 }
        }
    }
end

class InstrumentRegister < MemHack::Compound
    sizeof 32

    field(:pitch_range_min, 0) {
        number 32, true
    }
    field(:pitch_range_max, 4) {
        number 32, true
    }
    field(:timbres, 8) {
        stl_vector(4) {
            global :TimbreType
        }
    }
end

class Interaction < MemHack::Compound
    sizeof 160

    field(:name, 0) {
        stl_string
    }
    field(:id, 32) {
        number 32, true
    }
    field(:str, 40) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:flags, 64) {
        df_flagarray(InteractionFlags)
    }
    field(:sources, 80) {
        stl_vector(8) {
            pointer {
                global :InteractionSource
            }
        }
    }
    field(:targets, 104) {
        stl_vector(8) {
            pointer {
                global :InteractionTarget
            }
        }
    }
    field(:effects, 128) {
        stl_vector(8) {
            pointer {
                global :InteractionEffect
            }
        }
    }
    field(:source_hfid, 152) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:source_enid, 156) {
        number 32, true, -1
    }
    def source_enid_tg ; df.world.entities.all.binsearch(source_enid) ; end
end

class InteractionEffect < MemHack::Compound
    sizeof 136

    rtti_classname :interaction_effectst

    field(:index, 8) {
        number 32, true
    }
    field(:targets, 16) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:targets_index, 40) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:intermittent, 64) {
        number 32, true
    }
    field(:locations, 72) {
        stl_vector(4) {
            global :InteractionEffectLocationHint
        }
    }
    field(:flags, 96) {
        compound(:InteractionEffect_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:IMMEDIATE, 0) { bit 0 }
        }
    }
    field(:interaction_id, 100) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction_id) ; end
    field(:arena_name, 104) {
        stl_string
    }
    def getType()
        InteractionEffectType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def activateOnUnit(target, arg1, arg2)
        DFHack.vmethod_call(self, 32, target, arg1, arg2) ; nil
    end
    def activateOnItem(target)
        DFHack.vmethod_call(self, 40, target) ; nil
    end
    def parseRaws(arg0, arg1, arg2, arg3, arg4)
        DFHack.vmethod_call(self, 48, arg0, arg1, arg2, arg3, arg4) ; nil
    end
    def finalize(arg0)
        DFHack.vmethod_call(self, 56, arg0) ; nil
    end
    def applySyndromes()
        DFHack.vmethod_call(self, 64) ; nil
    end
    def hasSyndrome(arg0)
        val = DFHack.vmethod_call(self, 80, arg0)
        (val & 1) != 0
    end
end

class InteractionEffectAddSyndromest < InteractionEffect
    sizeof 168

    rtti_classname :interaction_effect_add_syndromest

    field(:unk_1, 136) {
        number 32, true
    }
    field(:syndrome, 144) {
        stl_vector(8) {
            pointer {
                global :Syndrome
            }
        }
    }
end

class InteractionEffectAnimatest < InteractionEffect
    sizeof 168

    rtti_classname :interaction_effect_animatest

    field(:unk_1, 136) {
        number 32, true
    }
    field(:syndrome, 144) {
        stl_vector(8) {
            pointer {
                global :Syndrome
            }
        }
    }
end

class InteractionEffectChangeItemQualityst < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_change_item_qualityst

    field(:quality_added, 136) {
        number 32, true
    }
    field(:quality_set, 140) {
        number 32, true
    }
end

class InteractionEffectChangeWeatherst < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_change_weatherst

    field(:unk_1, 136) {
        number 32, true
    }
    field(:unk_2, 140) {
        number 32, true
    }
end

class InteractionEffectCleanst < InteractionEffect
    sizeof 152

    rtti_classname :interaction_effect_cleanst

    field(:grime_level, 136) {
        number 32, true
    }
    field(:syndrome_tag, 140) {
        global :SyndromeFlags
    }
    field(:unk_1, 144) {
        number 32, true
    }
end

class InteractionEffectContactst < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_contactst

    field(:unk_1, 136) {
        number 32, true
    }
end

class InteractionEffectCreateItemst < InteractionEffect
    sizeof 328

    rtti_classname :interaction_effect_create_itemst

    field(:item_type, 136) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 138) {
        number 16, true
    }
    field(:mat_type, 140) {
        number 16, true
    }
    field(:mat_index, 144) {
        number 32, true, -1
    }
    field(:probability, 148) {
        number 16, true
    }
    field(:quantity, 150) {
        number 16, true
    }
    field(:quality_min, 152) {
        number 32, true
    }
    field(:quality_max, 156) {
        number 32, true
    }
    field(:create_artifact, 160) {
        number 32, true
    }
    field(:unk_1, 168) {
        stl_string
    }
    field(:unk_2, 200) {
        stl_string
    }
    field(:unk_3, 232) {
        stl_string
    }
    field(:unk_4, 264) {
        stl_string
    }
    field(:unk_5, 296) {
        stl_string
    }
end

class InteractionEffectHidest < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_hidest

    field(:unk_1, 136) {
        number 32, true
    }
end

class InteractionEffectMaterialEmissionst < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_material_emissionst

    field(:unk_1, 136) {
        number 32, true
    }
end

class InteractionEffectPropelUnitst < InteractionEffect
    sizeof 144

    rtti_classname :interaction_effect_propel_unitst

    field(:unk_1, 136) {
        number 32, true
    }
    field(:propel_force, 140) {
        number 32, true
    }
end

class InteractionEffectRaiseGhostst < InteractionEffect
    sizeof 168

    rtti_classname :interaction_effect_raise_ghostst

    field(:unk_1, 136) {
        number 32, true
    }
    field(:syndrome, 144) {
        stl_vector(8) {
            pointer {
                global :Syndrome
            }
        }
    }
end

class InteractionEffectResurrectst < InteractionEffect
    sizeof 168

    rtti_classname :interaction_effect_resurrectst

    field(:unk_1, 136) {
        number 32, true
    }
    field(:syndrome, 144) {
        stl_vector(8) {
            pointer {
                global :Syndrome
            }
        }
    }
end

class InteractionEffectSummonUnitst < InteractionEffect
    sizeof 368

    rtti_classname :interaction_effect_summon_unitst

    field(:make_pet, 136) {
        number 32, true
    }
    field(:race_str, 144) {
        stl_string
    }
    field(:caste_str, 176) {
        stl_string
    }
    field(:unk_1, 208) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 232) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:required_creature_flags, 256) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:forbidden_creature_flags, 280) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:required_caste_flags, 304) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:forbidden_caste_flags, 328) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 352) {
        number 32, true, -1
    }
    field(:unk_4, 356) {
        number 32, true, -1
    }
    field(:time_range_min, 360) {
        number 32, true
    }
    field(:time_range_max, 364) {
        number 32, true
    }
end

class InteractionInstance < MemHack::Compound
    sizeof 40

    field(:id, 0) {
        number 32, true
    }
    field(:interaction_id, 4) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction_id) ; end
    field(:unk_1, 8) {
        number 32, true
    }
    field(:region_index, 12) {
        number 32, true
    }
    field(:affected_units, 16) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def affected_units_tg ; affected_units.map { |i| df.world.units.all.binsearch(i) } ; end
end

class InteractionSource < MemHack::Compound
    sizeof 208

    rtti_classname :interaction_sourcest

    field(:id, 8) {
        number 32, true
    }
    field(:frequency, 12) {
        number 32, true
    }
    field(:name, 16) {
        stl_string
    }
    field(:hist_string_1, 48) {
        stl_string
    }
    field(:hist_string_2, 80) {
        stl_string
    }
    field(:trigger_string_second, 112) {
        stl_string
    }
    field(:trigger_string_third, 144) {
        stl_string
    }
    field(:trigger_string, 176) {
        stl_string
    }
    def getType()
        InteractionSourceType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def parseRaws(arg0, arg1, arg2, arg3, arg4)
        DFHack.vmethod_call(self, 32, arg0, arg1, arg2, arg3, arg4) ; nil
    end
end

class InteractionSourceAttackst < InteractionSource
    sizeof 216

    rtti_classname :interaction_source_attackst

    field(:unk_1, 208) {
        number 32, true
    }
end

class InteractionSourceCreatureActionst < InteractionSource
    sizeof 216

    rtti_classname :interaction_source_creature_actionst

    field(:unk_1, 208) {
        number 32, true
    }
end

class InteractionSourceDeityst < InteractionSource
    sizeof 240

    rtti_classname :interaction_source_deityst

    field(:unk_1, 208) {
        number 32, true
    }
    field(:usage_hint, 216) {
        stl_vector(4) {
            global :InteractionSourceUsageHint
        }
    }
end

class InteractionSourceDisturbancest < InteractionSource
    sizeof 216

    rtti_classname :interaction_source_disturbancest

    field(:unk_1, 208) {
        number 32, true
    }
end

class InteractionSourceExperimentst < InteractionSource
    sizeof 216

    rtti_classname :interaction_source_experimentst

    field(:unk_1, 208) {
        number 32, true
    }
end

class InteractionSourceIngestionst < InteractionSource
    sizeof 216

    rtti_classname :interaction_source_ingestionst

    field(:unk_1, 208) {
        number 32, true
    }
end

class InteractionSourceRegionst < InteractionSource
    sizeof 224

    rtti_classname :interaction_source_regionst

    field(:region_flags, 208) {
        compound(:InteractionSourceRegionst_TRegionFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:NORMAL_ALLOWED, 0) { bit 0 }
            field(:EVIL_ALLOWED, 0) { bit 1 }
            field(:GOOD_ALLOWED, 0) { bit 2 }
            field(:SAVAGE_ALLOWED, 0) { bit 3 }
            field(:EVIL_ONLY, 0) { bit 4 }
            field(:GOOD_ONLY, 0) { bit 5 }
            field(:SAVAGE_ONLY, 0) { bit 6 }
        }
    }
    field(:regions, 212) {
        static_array(10, 1, WorldgenRegionType) {
            number 8, true
        }
    }
end

class InteractionSourceSecretst < InteractionSource
    sizeof 336

    rtti_classname :interaction_source_secretst

    field(:learn_flags, 208) {
        compound(:InteractionSourceSecretst_TLearnFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:SUPERNATURAL_LEARNING_POSSIBLE, 0) { bit 0 }
            field(:MUNDANE_RESEARCH_POSSIBLE, 0) { bit 1 }
            field(:MUNDANE_RECORDING_POSSIBLE, 0) { bit 2 }
            field(:MUNDANE_TEACHING_POSSIBLE, 0) { bit 3 }
        }
    }
    field(:spheres, 216) {
        stl_vector(2) {
            number 16, true, nil, SphereType
        }
    }
    field(:goals, 240) {
        stl_vector(4) {
            global :GoalType
        }
    }
    field(:book_title_filename, 264) {
        stl_string
    }
    field(:book_name_filename, 296) {
        stl_string
    }
    field(:unk_1, 328) {
        number 32, true
    }
    field(:unk_2, 332) {
        number 32, true
    }
end

class InteractionSourceUndergroundSpecialst < InteractionSource
    sizeof 208

    rtti_classname :interaction_source_underground_specialst

end

class InteractionTarget < MemHack::Compound
    sizeof 128

    rtti_classname :interaction_targetst

    field(:index, 8) {
        number 32, true
    }
    field(:name, 16) {
        stl_string
    }
    field(:manual_input, 48) {
        stl_string
    }
    field(:location, 80) {
        number 32, true, nil, InteractionTargetLocationType
    }
    field(:reference_name, 88) {
        stl_string
    }
    field(:reference_distance, 120) {
        number 32, true
    }
    def getType()
        InteractionTargetType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def parseRaws(arg0, arg1, arg2, arg3, arg4)
        DFHack.vmethod_call(self, 32, arg0, arg1, arg2, arg3, arg4) ; nil
    end
end

class InteractionTargetCorpsest < InteractionTarget
    sizeof 368

    rtti_classname :interaction_target_corpsest

    field(:target_info, 128) {
        global :InteractionTargetInfo
    }
end

class InteractionTargetCreaturest < InteractionTarget
    sizeof 368

    rtti_classname :interaction_target_creaturest

    field(:target_info, 128) {
        global :InteractionTargetInfo
    }
end

class InteractionTargetInfo < MemHack::Compound
    sizeof 240

    field(:affected_creature_str, 0) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:affected_creature, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:affected_class, 72) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:immune_creature_str, 96) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:immune_creature, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:immune_class, 168) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:forbidden_syndrome_class, 192) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:requires_1, 216) {
        number 32, true
    }
    field(:requires_2, 220) {
        number 32, true
    }
    field(:forbidden_1, 224) {
        number 32, true
    }
    field(:forbidden_2, 228) {
        number 32, true
    }
    field(:restrictions, 232) {
        compound(:InteractionTargetInfo_TRestrictions) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:CANNOT_TARGET_IF_ALREADY_AFFECTED, 0) { bit 0 }
        }
    }
end

class InteractionTargetLocationst < InteractionTarget
    sizeof 128

    rtti_classname :interaction_target_locationst

end

class InteractionTargetMaterialst < InteractionTarget
    sizeof 240

    rtti_classname :interaction_target_materialst

    field(:material_str, 128) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:mat_type, 224) {
        number 16, true, -1
    }
    field(:mat_index, 228) {
        number 32, true
    }
    field(:parent_interaction_index, 232) {
        number 16, true
    }
    field(:breath_attack_type, 234) {
        number 16, true, nil, BreathAttackType
    }
    field(:restrictions, 236) {
        compound(:InteractionTargetMaterialst_TRestrictions) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:CONTEXT_MATERIAL, 0) { bit 0 }
        }
    }
end

class InterfaceButton < MemHack::Compound
    sizeof 24

    rtti_classname :interface_buttonst

    field(:hotkey_id, 8) {
        number 32, true, nil, InterfaceKey
    }
    field(:is_hidden, 12) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1, 16) {
        number 32, true
    }
    def printSlabStatus(x, y, unused)
        DFHack.vmethod_call(self, 0, x, y, unused) ; nil
    end
    def getLabel(str)
        DFHack.vmethod_call(self, 8, str) ; nil
    end
    def click()
        DFHack.vmethod_call(self, 16) ; nil
    end
    def setColor(selected)
        DFHack.vmethod_call(self, 24, selected) ; nil
    end
    def makeHidden()
        DFHack.vmethod_call(self, 32) ; nil
    end
    def getTrackGlyph()
        val = DFHack.vmethod_call(self, 40)
        val & ((1 << 8) - 1)
    end
    def setTrackGlyphColor()
        DFHack.vmethod_call(self, 48) ; nil
    end
    def getReactionLabel(arg0)
        DFHack.vmethod_call(self, 56, arg0) ; nil
    end
    def isBuiltinJob()
        val = DFHack.vmethod_call(self, 64)
        (val & 1) != 0
    end
    def isValidCustomReaction()
        val = DFHack.vmethod_call(self, 72)
        (val & 1) != 0
    end
end

class InterfaceButtonBuildingst < InterfaceButton
    sizeof 32

    rtti_classname :interface_button_buildingst

    field(:building, 24) {
        pointer {
            global :Building
        }
    }
end

class InterfaceButtonBuildingCategorySelectorst < InterfaceButtonBuildingst
    sizeof 40

    rtti_classname :interface_button_building_category_selectorst

    field(:category_id, 32) {
        number 32, true
    }
    field(:unk_14, 36) {
        number 8, true
    }
end

class InterfaceButtonBuildingCustomCategorySelectorst < InterfaceButtonBuildingst
    sizeof 64

    rtti_classname :interface_button_building_custom_category_selectorst

    field(:category, 32) {
        stl_string
    }
end

class InterfaceButtonBuildingMaterialSelectorst < InterfaceButtonBuildingst
    sizeof 48

    rtti_classname :interface_button_building_material_selectorst

    field(:mat_type, 32) {
        number 16, true, -1
    }
    field(:mat_index, 36) {
        number 32, true
    }
    field(:material_category, 40) {
        global :JobMaterialCategory
    }
    field(:unk_1c, 44) {
        number 8, true
    }
end

class InterfaceButtonBuildingNewJobst < InterfaceButtonBuildingst
    sizeof 104

    rtti_classname :interface_button_building_new_jobst

    field(:job_type, 32) {
        number 16, true, nil, JobType
    }
    field(:reaction_name, 40) {
        stl_string
    }
    field(:item_type, 72) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 74) {
        number 16, true
    }
    field(:mat_type, 76) {
        number 16, true, -1
    }
    field(:mat_index, 80) {
        number 32, true
    }
    field(:item_category, 84) {
        global :StockpileGroupSet
    }
    field(:hist_figure_id, 88) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:material_category, 92) {
        global :JobMaterialCategory
    }
    field(:unk_48, 96) {
        number 8, true, nil, BooleanEnum
    }
    field(:is_custom, 97) {
        number 8, true, nil, BooleanEnum
    }
end

class InterfaceButtonConstructionst < InterfaceButton
    sizeof 32

    rtti_classname :interface_button_constructionst

    field(:unused_c, 24) {
        pointer {
        }
    }
end

class InterfaceButtonConstructionBuildingSelectorst < InterfaceButtonConstructionst
    sizeof 48

    rtti_classname :interface_button_construction_building_selectorst

    field(:building_type, 32) {
        number 16, true
    }
    field(:building_subtype, 34) {
        number 16, true
    }
    field(:custom_type, 36) {
        number 32, true, -1
    }
    def custom_type_tg ; df.world.raws.buildings.all.binsearch(custom_type) ; end
    field(:existing_count, 40) {
        number 32, true
    }
end

class InterfaceButtonConstructionCategorySelectorst < InterfaceButtonConstructionst
    sizeof 40

    rtti_classname :interface_button_construction_category_selectorst

    field(:category_id, 32) {
        class ::DFHack::InterfaceButtonConstructionCategorySelectorst_TCategoryId < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[1] = :SiegeEngines ; NUME[:SiegeEngines] = 1
            ENUM[2] = :Traps ; NUME[:Traps] = 2
            ENUM[3] = :Workshops ; NUME[:Workshops] = 3
            ENUM[4] = :Furnaces ; NUME[:Furnaces] = 4
            ENUM[5] = :Constructions ; NUME[:Constructions] = 5
            ENUM[6] = :MachineComponents ; NUME[:MachineComponents] = 6
            ENUM[7] = :Track ; NUME[:Track] = 7
        end

        number 32, true, nil, InterfaceButtonConstructionCategorySelectorst_TCategoryId
    }
end

class InterfaceButtonConstructionDonest < InterfaceButtonConstructionst
    sizeof 32

    rtti_classname :interface_button_construction_donest

end

class Interfacest < MemHack::Compound
    sizeof 1812944

    field(:original_fps, 0) {
        number 32, true
    }
    field(:view, 8) {
        global :Viewscreen
    }
    field(:flag, 40) {
        number 32, false
    }
    field(:shutdown_interface_tickcount, 44) {
        number 32, true
    }
    field(:shutdown_interface_for_ms, 48) {
        number 32, true
    }
    field(:supermovie_on, 52) {
        number 8, true
    }
    field(:supermovie_pos, 56) {
        number 32, true
    }
    field(:supermovie_delayrate, 60) {
        number 32, true
    }
    field(:supermovie_delaystep, 64) {
        number 32, true
    }
    field(:supermovie_sound, 72) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:supermovie_sound_time, 96) {
        static_array(16, 800) {
            static_array(200, 4) {
                number 32, true
            }
        }
    }
    field(:supermoviebuffer, 12896) {
        static_array(800000, 1) {
            number 8, false
        }
    }
    field(:supermoviebuffer_comp, 812896) {
        static_array(1000000, 1) {
            number 8, false
        }
    }
    field(:currentblocksize, 1812896) {
        number 32, true
    }
    field(:nextfilepos, 1812900) {
        number 32, true
    }
    field(:first_movie_write, 1812904) {
        number 8, true
    }
    field(:movie_file, 1812912) {
        stl_string
    }
end

class InterrogationReport < MemHack::Compound
    sizeof 296

    field(:title, 0) {
        stl_string
    }
    field(:officer_hf, 32) {
        number 32, true, -1
    }
    def officer_hf_tg ; df.world.history.figures.binsearch(officer_hf) ; end
    field(:subject_hf, 36) {
        number 32, true, -1
    }
    def subject_hf_tg ; df.world.history.figures.binsearch(subject_hf) ; end
    field(:officer_name, 40) {
        stl_string
    }
    field(:unk_3, 72) {
        number 32, true
    }
    field(:year, 76) {
        number 32, true
    }
    field(:tick, 80) {
        number 32, true
    }
    field(:unk, 84) {
        compound(:InterrogationReport_TUnk) {
            field(:officer_hf2, 0) {
                number 32, true, -1
            }
            def officer_hf2_tg ; df.world.history.figures.binsearch(officer_hf2) ; end
            field(:subject_hf2, 4) {
                number 32, true, -1
            }
            def subject_hf2_tg ; df.world.history.figures.binsearch(subject_hf2) ; end
            field(:unk_8, 8) {
                number 16, true
            }
            field(:unk_9, 12) {
                number 32, true
            }
            field(:unk_10, 16) {
                number 32, true, -1
            }
            field(:unk_11, 20) {
                number 32, true, -1000000
            }
            field(:unk_12, 24) {
                number 32, true, -1000000
            }
            field(:unk_13, 28) {
                number 32, true
            }
            field(:unk_14, 32) {
                number 16, true
            }
            field(:unk_15, 36) {
                number 32, true
            }
            field(:unk_16, 40) {
                number 32, true
            }
            field(:unk_17, 44) {
                number 32, true
            }
            field(:unk_18, 48) {
                number 32, true
            }
            field(:unk_19, 52) {
                number 32, true
            }
            field(:unk_20, 56) {
                number 32, true
            }
            field(:unk_21, 60) {
                number 32, true
            }
            field(:flags, 64) {
                compound(:InterrogationReport_TUnk_TFlags) {
                    field(:_whole, 0) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_23, 152) {
        number 32, true
    }
    field(:unk_24, 156) {
        number 32, true
    }
    field(:unk_25, 160) {
        number 32, true
    }
    field(:unk_26, 164) {
        number 32, true
    }
    field(:unk_27, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:subject_identity_id, 192) {
        number 32, true, -1
    }
    def subject_identity_tg ; df.world.identities.all.binsearch(subject_identity_id) ; end
    field(:unk_29, 200) {
        stl_vector
    }
    field(:unk_30, 224) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_31, 248) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_31_tg ; unk_31.map { |i| df.world.history.events.binsearch(i) } ; end
    field(:details, 272) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class Intrigue < MemHack::Compound
    sizeof 32

    field(:event_id, 0) {
        number 32, true, -1
    }
    def event_tg ; df.world.history.events.binsearch(event_id) ; end
    field(:corruption, 8) {
        pointer {
            global :IntrigueCorruption
        }
    }
    field(:reason, 16) {
        global :HistoryEventReasonInfo
    }
    field(:circumstance, 24) {
        global :HistoryEventCircumstanceInfo
    }
end

class IntrigueCorruption < MemHack::Compound
    sizeof 100

    field(:crime, 0) {
        number 32, true, nil, CrimeType
    }
    field(:corruptor_id, 4) {
        number 32, true, -1
    }
    def corruptor_tg ; df.world.history.figures.binsearch(corruptor_id) ; end
    field(:target_id, 8) {
        number 32, true, -1
    }
    def target_tg ; df.world.history.figures.binsearch(target_id) ; end
    field(:target_relationship, 12) {
        number 16, true, nil, VagueRelationshipType
    }
    field(:target_relationship_entity_id, 16) {
        number 32, true, -1
    }
    def target_relationship_entity_tg ; df.world.entities.all.binsearch(target_relationship_entity_id) ; end
    field(:lurer_id, 20) {
        number 32, true, -1
    }
    def lurer_tg ; df.world.history.figures.binsearch(lurer_id) ; end
    field(:manipulation_type, 24) {
        class ::DFHack::IntrigueCorruption_TManipulationType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Threat ; NUME[:Threat] = 0
            ENUM[1] = :Flattery ; NUME[:Flattery] = 1
            ENUM[2] = :Authority ; NUME[:Authority] = 2
            ENUM[3] = :BlackmailForEmbezzlement ; NUME[:BlackmailForEmbezzlement] = 3
            ENUM[4] = :Bribery ; NUME[:Bribery] = 4
            ENUM[5] = :Sympathy ; NUME[:Sympathy] = 5
            ENUM[6] = :Revenge ; NUME[:Revenge] = 6
            ENUM[7] = :Immortality ; NUME[:Immortality] = 7
        end

        number 32, true, nil, IntrigueCorruption_TManipulationType
    }
    field(:unk_4, 28) {
        number 32, true
    }
    field(:unk_5, 32) {
        number 32, true
    }
    field(:manipulated_facet, 36) {
        number 32, true, nil, PersonalityFacetType
    }
    field(:facet_rating, 40) {
        number 32, true
    }
    field(:facet_roll, 44) {
        number 32, true
    }
    field(:manipulated_value, 48) {
        number 32, true, nil, ValueType
    }
    field(:value_rating, 52) {
        number 32, true
    }
    field(:value_roll, 56) {
        number 32, true
    }
    field(:manipulated_emotion, 60) {
        class ::DFHack::IntrigueCorruption_TManipulatedEmotion < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Trust ; NUME[:Trust] = 0
            ENUM[1] = :Loyalty ; NUME[:Loyalty] = 1
            ENUM[2] = :Love ; NUME[:Love] = 2
            ENUM[3] = :Fear ; NUME[:Fear] = 3
            ENUM[4] = :Respect ; NUME[:Respect] = 4
        end

        number 32, true, nil, IntrigueCorruption_TManipulatedEmotion
    }
    field(:emotion_rating, 64) {
        number 32, true
    }
    field(:emotion_roll, 68) {
        number 32, true
    }
    field(:flags, 72) {
        compound(:IntrigueCorruption_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:succeeded, 0) { bit 0 }
            field(:misread_target, 0) { bit 1 }
        }
    }
    field(:position_entity_id, 76) {
        number 32, true, -1
    }
    def position_entity_tg ; df.world.entities.all.binsearch(position_entity_id) ; end
    field(:position_assignment_id, 80) {
        number 32, true, -1
    }
    field(:offered_id, 84) {
        number 32, true, -1
    }
    def offered_tg ; df.world.history.figures.binsearch(offered_id) ; end
    field(:offered_relationship, 88) {
        number 32, true, nil, VagueRelationshipType
    }
    field(:corruptor_ally_roll, 92) {
        number 32, true
    }
    field(:target_ally_roll, 96) {
        number 32, true
    }
end

class InvasionInfo < MemHack::Compound
    sizeof 48

    field(:id, 0) {
        number 32, true
    }
    field(:civ_id, 4) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:active_size1, 8) {
        number 32, true
    }
    field(:active_size2, 12) {
        number 32, true
    }
    field(:size, 16) {
        number 32, true
    }
    field(:duration_counter, 20) {
        number 32, true
    }
    field(:flags, 24) {
        compound(:InvasionInfo_TFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:active, 0) { bit 0 }
            field(:siege, 0) { bit 1 }
            field(:parley, 0) { bit 5 }
        }
    }
    field(:unk4b, 26) {
        number 16, true
    }
    field(:unk_1, 28) {
        number 32, true
    }
    field(:unk_2, 32) {
        number 32, true
    }
    field(:unk_3, 36) {
        number 32, true
    }
    field(:unk_4, 40) {
        number 32, true
    }
    field(:unk_5, 44) {
        number 32, true
    }
end

class Item < MemHack::Compound
    sizeof 120

    rtti_classname :itemst

    field(:pos, 8) {
        global :Coord
    }
    field(:flags, 16) {
        global :ItemFlags
    }
    field(:flags2, 20) {
        global :ItemFlags2
    }
    field(:age, 24) {
        number 32, false
    }
    field(:id, 28) {
        number 32, true
    }
    field(:specific_refs, 32) {
        stl_vector(8) {
            pointer {
                global :SpecificRef
            }
        }
    }
    field(:general_refs, 56) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:world_data_id, 80) {
        number 32, true, -1
    }
    def world_data_tg ; df.world.world_data.object_data.binsearch(world_data_id) ; end
    field(:world_data_subid, 84) {
        number 32, true, -1
    }
    field(:stockpile_countdown, 88) {
        number 8, false
    }
    field(:stockpile_delay, 89) {
        number 8, false
    }
    field(:unk2, 90) {
        number 16, true
    }
    field(:base_uniform_score, 92) {
        number 32, true
    }
    field(:walkable_id, 96) {
        number 16, true
    }
    field(:spec_heat, 98) {
        number 16, false
    }
    field(:ignite_point, 100) {
        number 16, false
    }
    field(:heatdam_point, 102) {
        number 16, false
    }
    field(:colddam_point, 104) {
        number 16, false
    }
    field(:boiling_point, 106) {
        number 16, false
    }
    field(:melting_point, 108) {
        number 16, false
    }
    field(:fixed_temp, 110) {
        number 16, false
    }
    field(:weight, 112) {
        number 32, true
    }
    field(:weight_fraction, 116) {
        number 32, true
    }
    def getType()
        ItemType.sym(DFHack.vmethod_call(self, 0))
    end
    def getSubtype()
        val = DFHack.vmethod_call(self, 8)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getMaterial()
        val = DFHack.vmethod_call(self, 16)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getMaterialIndex()
        val = DFHack.vmethod_call(self, 24)
    end
    def setSubtype(arg0)
        DFHack.vmethod_call(self, 32, arg0) ; nil
    end
    def setMaterial(arg0)
        DFHack.vmethod_call(self, 40, arg0) ; nil
    end
    def setMaterialIndex(arg0)
        DFHack.vmethod_call(self, 48, arg0) ; nil
    end
    def getActualMaterial()
        val = DFHack.vmethod_call(self, 56)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getActualMaterialIndex()
        val = DFHack.vmethod_call(self, 64)
    end
    def getRace()
        val = DFHack.vmethod_call(self, 72)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getCaste()
        val = DFHack.vmethod_call(self, 80)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getPlantID()
        val = DFHack.vmethod_call(self, 88)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getGrowthPrint()
        val = DFHack.vmethod_call(self, 96)
    end
    def setGrowthPrint(print)
        DFHack.vmethod_call(self, 104, print) ; nil
    end
    def getDimension()
        val = DFHack.vmethod_call(self, 112)
    end
    def getTotalDimension()
        val = DFHack.vmethod_call(self, 120)
    end
    def setDimension(amount)
        DFHack.vmethod_call(self, 128, amount) ; nil
    end
    def subtractDimension(amount)
        val = DFHack.vmethod_call(self, 136, amount)
        (val & 1) != 0
    end
    def isFoodStorage()
        val = DFHack.vmethod_call(self, 144)
        (val & 1) != 0
    end
    def isTrackCart()
        val = DFHack.vmethod_call(self, 152)
        (val & 1) != 0
    end
    def isWheelbarrow()
        val = DFHack.vmethod_call(self, 160)
        (val & 1) != 0
    end
    def getVehicleID()
        val = DFHack.vmethod_call(self, 168)
    end
    def isAmmo()
        val = DFHack.vmethod_call(self, 176)
        (val & 1) != 0
    end
    def getStockpile()
        ptr = DFHack.vmethod_call(self, 184)
        class << self
            global :ItemStockpileRef
        end._at(ptr) if ptr != 0
    end
    def containsPlaster()
        val = DFHack.vmethod_call(self, 192)
        (val & 1) != 0
    end
    def isPlaster()
        val = DFHack.vmethod_call(self, 200)
        (val & 1) != 0
    end
    def getColorOverride(arg0)
        val = DFHack.vmethod_call(self, 208, arg0)
        (val & 1) != 0
    end
    def getHistoryInfo()
        ptr = DFHack.vmethod_call(self, 216)
        class << self
            pointer {
                global :ItemHistoryInfo
            }
        end._at(ptr) if ptr != 0
    end
    def hasToolUse(use)
        val = DFHack.vmethod_call(self, 224, ToolUses.int(use))
        (val & 1) != 0
    end
    def hasInvertedTile()
        val = DFHack.vmethod_call(self, 232)
        (val & 1) != 0
    end
    def becomePaste()
        DFHack.vmethod_call(self, 240) ; nil
    end
    def becomePressed()
        DFHack.vmethod_call(self, 248) ; nil
    end
    def calculateWeight()
        DFHack.vmethod_call(self, 256) ; nil
    end
    def isSharpStone()
        val = DFHack.vmethod_call(self, 264)
        (val & 1) != 0
    end
    def isCrystalGlassable()
        val = DFHack.vmethod_call(self, 272)
        (val & 1) != 0
    end
    def isMetalOre(matIndex)
        val = DFHack.vmethod_call(self, 280, matIndex)
        (val & 1) != 0
    end
    def clearLastTempUpdateTS()
        DFHack.vmethod_call(self, 288) ; nil
    end
    def listNotableKills(string_ptr)
        DFHack.vmethod_call(self, 296, string_ptr) ; nil
    end
    def getSpecHeat()
        val = DFHack.vmethod_call(self, 304)
        val & ((1 << 16) - 1)
    end
    def getIgnitePoint()
        val = DFHack.vmethod_call(self, 312)
        val & ((1 << 16) - 1)
    end
    def getHeatdamPoint()
        val = DFHack.vmethod_call(self, 320)
        val & ((1 << 16) - 1)
    end
    def getColddamPoint()
        val = DFHack.vmethod_call(self, 328)
        val & ((1 << 16) - 1)
    end
    def getBoilingPoint()
        val = DFHack.vmethod_call(self, 336)
        val & ((1 << 16) - 1)
    end
    def getMeltingPoint()
        val = DFHack.vmethod_call(self, 344)
        val & ((1 << 16) - 1)
    end
    def getFixedTemp()
        val = DFHack.vmethod_call(self, 352)
        val & ((1 << 16) - 1)
    end
    def getSolidDensity()
        val = DFHack.vmethod_call(self, 360)
    end
    def materialRots()
        val = DFHack.vmethod_call(self, 368)
        (val & 1) != 0
    end
    def getTemperature()
        val = DFHack.vmethod_call(self, 376)
        val & ((1 << 16) - 1)
    end
    def adjustTemperature(target, unk)
        val = DFHack.vmethod_call(self, 384, target, unk)
        (val & 1) != 0
    end
    def extinguish()
        DFHack.vmethod_call(self, 400) ; nil
    end
    def getGloveHandedness()
        val = DFHack.vmethod_call(self, 408)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def setGloveHandedness(arg0)
        DFHack.vmethod_call(self, 416, arg0) ; nil
    end
    def isSpike()
        val = DFHack.vmethod_call(self, 424)
        (val & 1) != 0
    end
    def isScrew()
        val = DFHack.vmethod_call(self, 432)
        (val & 1) != 0
    end
    def isBuildMat()
        val = DFHack.vmethod_call(self, 440)
        (val & 1) != 0
    end
    def isTemperatureSafe(arg0)
        val = DFHack.vmethod_call(self, 448, arg0)
        (val & 1) != 0
    end
    def setRandSubtype(entity_id)
        DFHack.vmethod_call(self, 456, entity_id) ; nil
    end
    def getWeaponSize()
        val = DFHack.vmethod_call(self, 464)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def getWear()
        val = DFHack.vmethod_call(self, 472)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def setWear(arg0)
        DFHack.vmethod_call(self, 480, arg0) ; nil
    end
    def getMaker()
        val = DFHack.vmethod_call(self, 488)
    end
    def setMaker(unit_id)
        DFHack.vmethod_call(self, 496, unit_id) ; nil
    end
    def getCorpseInfo(prace, pcaste, phfig, punit)
        DFHack.vmethod_call(self, 504, prace, pcaste, phfig, punit) ; nil
    end
    def getGloveFlags()
        ptr = DFHack.vmethod_call(self, 520)
        class << self
            df_flagarray
        end._at(ptr) if ptr != 0
    end
    def getItemShapeDesc()
        ptr = DFHack.vmethod_call(self, 528)
        class << self
            stl_string
        end._at(ptr) if ptr != 0
    end
    def isMatchingAmmoItem(arg0)
        val = DFHack.vmethod_call(self, 536, arg0)
        (val & 1) != 0
    end
    def getImageRef(id, subid)
        DFHack.vmethod_call(self, 544, id, subid) ; nil
    end
    def getImageCivSite(civ_id, site_id)
        DFHack.vmethod_call(self, 552, civ_id, site_id) ; nil
    end
    def setImageCivSite(civ_id, site_id)
        DFHack.vmethod_call(self, 560, civ_id, site_id) ; nil
    end
    def setSeedsPlantSkillLevel(level)
        DFHack.vmethod_call(self, 568, level) ; nil
    end
    def getCorpseSize()
        val = DFHack.vmethod_call(self, 576)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def ageItem(amount)
        val = DFHack.vmethod_call(self, 584, amount)
        (val & 1) != 0
    end
    def getCritterAirdrownTimer()
        val = DFHack.vmethod_call(self, 592)
    end
    def setCritterAirdrownTimer(arg0)
        DFHack.vmethod_call(self, 600, arg0) ; nil
    end
    def incrementCritterAirdrownTimer()
        DFHack.vmethod_call(self, 608) ; nil
    end
    def getRotTimer()
        val = DFHack.vmethod_call(self, 616)
    end
    def setRotTimer(val)
        DFHack.vmethod_call(self, 624, val) ; nil
    end
    def incrementRotTimer()
        DFHack.vmethod_call(self, 632) ; nil
    end
    def isBogeymanCorpse()
        val = DFHack.vmethod_call(self, 640)
        (val & 1) != 0
    end
    def getAmmoType(arg0)
        ptr = DFHack.vmethod_call(self, 656, arg0)
        class << self
            stl_string
        end._at(ptr) if ptr != 0
    end
    def isLiquidPowder()
        val = DFHack.vmethod_call(self, 664)
        (val & 1) != 0
    end
    def isLiquid()
        val = DFHack.vmethod_call(self, 672)
        (val & 1) != 0
    end
    def isLiveAnimal()
        val = DFHack.vmethod_call(self, 680)
        (val & 1) != 0
    end
    def getVolume()
        val = DFHack.vmethod_call(self, 688)
    end
    def addImprovementFromJob(imp_type, job, unit, mat_type, mat_index, shape, forced_quality, entity, site, unk, unshaped, arg11, arg12)
        ptr = DFHack.vmethod_call(self, 696, ImprovementType.int(imp_type), job, unit, mat_type, mat_index, shape, forced_quality, entity, site, unk, unshaped, arg11, arg12)
        class << self
            global :Itemimprovement
        end._at(ptr) if ptr != 0
    end
    def isWeapon()
        val = DFHack.vmethod_call(self, 704)
        (val & 1) != 0
    end
    def isArmorNotClothing()
        val = DFHack.vmethod_call(self, 712)
        (val & 1) != 0
    end
    def isMillable()
        val = DFHack.vmethod_call(self, 720)
        (val & 1) != 0
    end
    def isProcessableThread()
        val = DFHack.vmethod_call(self, 728)
        (val & 1) != 0
    end
    def isProcessableVial()
        val = DFHack.vmethod_call(self, 736)
        (val & 1) != 0
    end
    def isProcessableBarrel()
        val = DFHack.vmethod_call(self, 744)
        (val & 1) != 0
    end
    def isEdiblePlant()
        val = DFHack.vmethod_call(self, 752)
        (val & 1) != 0
    end
    def isEdibleRaw(hunger)
        val = DFHack.vmethod_call(self, 760, hunger)
        (val & 1) != 0
    end
    def isEdibleCarnivore(hunger)
        val = DFHack.vmethod_call(self, 768, hunger)
        (val & 1) != 0
    end
    def isEdibleBonecarn(hunger)
        val = DFHack.vmethod_call(self, 776, hunger)
        (val & 1) != 0
    end
    def moveToGround(x, y, z)
        val = DFHack.vmethod_call(self, 784, x, y, z)
        (val & 1) != 0
    end
    def categorize(in_play)
        DFHack.vmethod_call(self, 792, in_play) ; nil
    end
    def uncategorize()
        DFHack.vmethod_call(self, 800) ; nil
    end
    def isFurniture(empty)
        val = DFHack.vmethod_call(self, 808, empty)
        (val & 1) != 0
    end
    def isPressed()
        val = DFHack.vmethod_call(self, 816)
        (val & 1) != 0
    end
    def isAnimal()
        val = DFHack.vmethod_call(self, 824)
        (val & 1) != 0
    end
    def assignQuality(maker, job_skill)
        DFHack.vmethod_call(self, 832, maker, JobSkill.int(job_skill)) ; nil
    end
    def notifyCreatedMasterwork(maker, arg1, arg2)
        DFHack.vmethod_call(self, 848, maker, arg1, arg2) ; nil
    end
    def notifyLostMasterwork()
        DFHack.vmethod_call(self, 856) ; nil
    end
    def addMagic(arg0, arg1, arg2)
        DFHack.vmethod_call(self, 864, arg0, arg1, arg2) ; nil
    end
    def magic_unk1(arg0, arg1)
        DFHack.vmethod_call(self, 872, arg0, arg1) ; nil
    end
    def magic_unk2(arg0, arg1)
        DFHack.vmethod_call(self, 880, arg0, arg1) ; nil
    end
    def magic_unk3(arg0)
        DFHack.vmethod_call(self, 888, arg0) ; nil
    end
    def magic_unk4(arg0, arg1, arg2)
        DFHack.vmethod_call(self, 896, arg0, arg1, arg2) ; nil
    end
    def setDisplayColor(arg0)
        DFHack.vmethod_call(self, 904, arg0) ; nil
    end
    def isDamagedByHeat()
        val = DFHack.vmethod_call(self, 912)
        (val & 1) != 0
    end
    def needTwoHandedWield(arg0)
        val = DFHack.vmethod_call(self, 920, arg0)
        (val & 1) != 0
    end
    def splitStack(stack_size, preserve_containment)
        ptr = DFHack.vmethod_call(self, 928, stack_size, preserve_containment)
        class << self
            global :Item
        end._at(ptr) if ptr != 0
    end
    def isTameableVermin()
        val = DFHack.vmethod_call(self, 936)
        (val & 1) != 0
    end
    def isDye()
        val = DFHack.vmethod_call(self, 944)
        (val & 1) != 0
    end
    def isMilkable(arg0, arg1)
        val = DFHack.vmethod_call(self, 952, arg0, arg1)
        (val & 1) != 0
    end
    def isSandBearing()
        val = DFHack.vmethod_call(self, 960)
        (val & 1) != 0
    end
    def isLyeBearing()
        val = DFHack.vmethod_call(self, 968)
        (val & 1) != 0
    end
    def isAnimalProduct()
        val = DFHack.vmethod_call(self, 976)
        (val & 1) != 0
    end
    def getStorageInfo(item_type, material_category)
        DFHack.vmethod_call(self, 984, item_type, material_category) ; nil
    end
    def addWear(delta, simple, lose_masterwork)
        val = DFHack.vmethod_call(self, 992, delta, simple, lose_masterwork)
        (val & 1) != 0
    end
    def incWearTimer(delta)
        val = DFHack.vmethod_call(self, 1000, delta)
        (val & 1) != 0
    end
    def checkWearDestroy(simple, lose_masterwork)
        val = DFHack.vmethod_call(self, 1008, simple, lose_masterwork)
        (val & 1) != 0
    end
    def addContaminant(mat_type, mat_index, mat_state, temp, size, body_part_id, flags)
        DFHack.vmethod_call(self, 1016, mat_type, mat_index, MatterState.int(mat_state), temp, size, body_part_id, flags) ; nil
    end
    def removeContaminantByIdx(index, amount)
        DFHack.vmethod_call(self, 1024, index, amount) ; nil
    end
    def removeContaminant(mat_type, mat_index, amount)
        DFHack.vmethod_call(self, 1032, mat_type, mat_index, amount) ; nil
    end
    def tradeUnitContaminants(arg0, body_part_id)
        DFHack.vmethod_call(self, 1040, arg0, body_part_id) ; nil
    end
    def tradeItemContaminants(arg0)
        DFHack.vmethod_call(self, 1048, arg0) ; nil
    end
    def tradeItemContaminants2(arg0)
        DFHack.vmethod_call(self, 1056, arg0) ; nil
    end
    def contaminateWound(arg0, arg1, shift, body_part_id)
        DFHack.vmethod_call(self, 1064, arg0, arg1, shift, body_part_id) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 1072, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 1080, file, SaveVersion.int(loadversion)) ; nil
    end
    def getWeaponAttacks()
        ptr = DFHack.vmethod_call(self, 1088)
        class << self
            stl_vector(8) {
                pointer {
                }
            }
        end._at(ptr) if ptr != 0
    end
    def isSplittable()
        val = DFHack.vmethod_call(self, 1104)
        (val & 1) != 0
    end
    def propagateUnitRefs()
        DFHack.vmethod_call(self, 1128) ; nil
    end
    def isBag()
        val = DFHack.vmethod_call(self, 1136)
        (val & 1) != 0
    end
    def isSand()
        val = DFHack.vmethod_call(self, 1144)
        (val & 1) != 0
    end
    def getStackSize()
        val = DFHack.vmethod_call(self, 1160)
    end
    def addStackSize(amount)
        DFHack.vmethod_call(self, 1168, amount) ; nil
    end
    def setStackSize(amount)
        DFHack.vmethod_call(self, 1176, amount) ; nil
    end
    def isAmmoClass(arg0)
        val = DFHack.vmethod_call(self, 1184, arg0)
        (val & 1) != 0
    end
    def isAutoClean()
        val = DFHack.vmethod_call(self, 1192)
        (val & 1) != 0
    end
    def setTemperatureFromMapTile(x, y, z, local, contained)
        val = DFHack.vmethod_call(self, 1200, x, y, z, local, contained)
        (val & 1) != 0
    end
    def setTemperatureFromMap(local, contained)
        val = DFHack.vmethod_call(self, 1208, local, contained)
        (val & 1) != 0
    end
    def setTemperature(temp, local, contained)
        val = DFHack.vmethod_call(self, 1216, temp, local, contained)
        (val & 1) != 0
    end
    def updateTempFromMap(local, contained, adjust, multiplier)
        val = DFHack.vmethod_call(self, 1224, local, contained, adjust, multiplier)
        (val & 1) != 0
    end
    def updateTemperature(temp, local, contained, adjust, multiplier)
        val = DFHack.vmethod_call(self, 1232, temp, local, contained, adjust, multiplier)
        (val & 1) != 0
    end
    def updateFromWeather()
        val = DFHack.vmethod_call(self, 1240)
        (val & 1) != 0
    end
    def updateContaminants()
        val = DFHack.vmethod_call(self, 1248)
        (val & 1) != 0
    end
    def checkTemperatureDamage()
        val = DFHack.vmethod_call(self, 1256)
        (val & 1) != 0
    end
    def checkHeatColdDamage()
        val = DFHack.vmethod_call(self, 1264)
        (val & 1) != 0
    end
    def checkMeltBoil()
        val = DFHack.vmethod_call(self, 1272)
        (val & 1) != 0
    end
    def getMeleeSkill()
        val = DFHack.vmethod_call(self, 1280)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getRangedSkill()
        val = DFHack.vmethod_call(self, 1288)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def setQuality(quality)
        DFHack.vmethod_call(self, 1296, quality) ; nil
    end
    def getQuality()
        val = DFHack.vmethod_call(self, 1304)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getOverallQuality()
        val = DFHack.vmethod_call(self, 1312)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getImprovementQuality()
        val = DFHack.vmethod_call(self, 1320)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getProjectileSize()
        val = DFHack.vmethod_call(self, 1328)
    end
    def isImprovable(arg0, mat_type, mat_index)
        val = DFHack.vmethod_call(self, 1336, arg0, mat_type, mat_index)
        (val & 1) != 0
    end
    def setSharpness(unk1, unk2)
        DFHack.vmethod_call(self, 1344, unk1, unk2) ; nil
    end
    def getSharpness()
        val = DFHack.vmethod_call(self, 1352)
    end
    def isTotemable()
        val = DFHack.vmethod_call(self, 1360)
        (val & 1) != 0
    end
    def isDyeable()
        val = DFHack.vmethod_call(self, 1368)
        (val & 1) != 0
    end
    def isNotDyed()
        val = DFHack.vmethod_call(self, 1376)
        (val & 1) != 0
    end
    def isDyed()
        val = DFHack.vmethod_call(self, 1384)
        (val & 1) != 0
    end
    def canSewImage()
        val = DFHack.vmethod_call(self, 1392)
        (val & 1) != 0
    end
    def isProcessableVialAtStill()
        val = DFHack.vmethod_call(self, 1408)
        (val & 1) != 0
    end
    def isSimilarToItem(item_type, item_subtype, mat_type, mat_index)
        val = DFHack.vmethod_call(self, 1416, ItemType.int(item_type), item_subtype, mat_type, mat_index)
        (val & 1) != 0
    end
    def getBlockChance()
        val = DFHack.vmethod_call(self, 1424)
    end
    def getMakerRace()
        val = DFHack.vmethod_call(self, 1440)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def setMakerRace(arg0)
        DFHack.vmethod_call(self, 1448, arg0) ; nil
    end
    def getEffectiveArmorLevel()
        val = DFHack.vmethod_call(self, 1456)
        val &= ((1 << 8) - 1)
        ((val >> (8-1)) & 1) == 0 ? val : val - (1 << 8)
    end
    def isItemOrganicCloth()
        val = DFHack.vmethod_call(self, 1472)
        (val & 1) != 0
    end
    def isMadeOfOrganicCloth()
        val = DFHack.vmethod_call(self, 1480)
        (val & 1) != 0
    end
    def coverWithContaminant(mat_type, mat_index, mat_state, temperature)
        DFHack.vmethod_call(self, 1488, mat_type, mat_index, MatterState.int(mat_state), temperature) ; nil
    end
    def hasSpecificImprovements(imp_type)
        val = DFHack.vmethod_call(self, 1496, ImprovementType.int(imp_type))
        (val & 1) != 0
    end
    def hasImprovements()
        val = DFHack.vmethod_call(self, 1504)
        (val & 1) != 0
    end
    def isImproved()
        val = DFHack.vmethod_call(self, 1512)
        (val & 1) != 0
    end
    def getMagic()
        ptr = DFHack.vmethod_call(self, 1520)
        class << self
            stl_vector(8) {
                pointer {
                    global :ItemMagicness
                }
            }
        end._at(ptr) if ptr != 0
    end
    def getItemDescription(arg0, plurality)
        DFHack.vmethod_call(self, 1528, arg0, plurality) ; nil
    end
    def getItemDescriptionPrefix(arg0, mode)
        DFHack.vmethod_call(self, 1536, arg0, mode) ; nil
    end
    def getItemBasicName(arg0)
        DFHack.vmethod_call(self, 1544, arg0) ; nil
    end
    def getImprovementsValue(caravan)
        val = DFHack.vmethod_call(self, 1552, caravan)
    end
    def isExtractBearingFish()
        val = DFHack.vmethod_call(self, 1560)
        (val & 1) != 0
    end
    def isExtractBearingVermin()
        val = DFHack.vmethod_call(self, 1568)
        (val & 1) != 0
    end
    def getBaseWeight()
        val = DFHack.vmethod_call(self, 1584)
    end
    def getWeightShiftBits()
        val = DFHack.vmethod_call(self, 1592)
    end
    def isCollected()
        val = DFHack.vmethod_call(self, 1600)
        (val & 1) != 0
    end
    def isEdibleVermin()
        val = DFHack.vmethod_call(self, 1608)
        (val & 1) != 0
    end
    def drawSelf()
        val = DFHack.vmethod_call(self, 1616)
        val & ((1 << 8) - 1)
    end
    def isRangedWeapon()
        val = DFHack.vmethod_call(self, 1624)
        (val & 1) != 0
    end
    def isClothing()
        val = DFHack.vmethod_call(self, 1632)
        (val & 1) != 0
    end
    def isWet()
        val = DFHack.vmethod_call(self, 1640)
        (val & 1) != 0
    end
    def getCurrencyValue(appraiser)
        val = DFHack.vmethod_call(self, 1648, appraiser)
    end
    def isAssignedToStockpile()
        val = DFHack.vmethod_call(self, 1656)
        (val & 1) != 0
    end
    def isAssignedToThisStockpile(arg0)
        val = DFHack.vmethod_call(self, 1664, arg0)
        (val & 1) != 0
    end
    def detachStockpileAssignment()
        DFHack.vmethod_call(self, 1672) ; nil
    end
    def removeStockpileAssignment()
        DFHack.vmethod_call(self, 1680) ; nil
    end
    def getStockpile2()
        ptr = DFHack.vmethod_call(self, 1688)
        class << self
            global :ItemStockpileRef
        end._at(ptr) if ptr != 0
    end
    def getThreadDyeValue(caravan)
        val = DFHack.vmethod_call(self, 1720, caravan)
    end
    def getColorAndShape(colors, shapes)
        DFHack.vmethod_call(self, 1728, colors, shapes) ; nil
    end
    def isArmor()
        val = DFHack.vmethod_call(self, 1744)
        (val & 1) != 0
    end
    def calcUniformScore(arg0, exact_match, best_any, best_melee, best_ranged)
        val = DFHack.vmethod_call(self, 1752, arg0, exact_match, JobSkill.int(best_any), JobSkill.int(best_melee), JobSkill.int(best_ranged))
    end
    def calcBaseUniformScore()
        val = DFHack.vmethod_call(self, 1760)
    end
    def getSlabEngravingType()
        SlabEngravingType.sym(DFHack.vmethod_call(self, 1824))
    end
    def getAbsorption()
        val = DFHack.vmethod_call(self, 1832)
    end
    def isGemMaterial()
        val = DFHack.vmethod_call(self, 1848)
        (val & 1) != 0
    end
    def setGemShape(shape)
        DFHack.vmethod_call(self, 1856, shape) ; nil
    end
    def hasGemShape()
        val = DFHack.vmethod_call(self, 1864)
        (val & 1) != 0
    end
    def getGemShape()
        val = DFHack.vmethod_call(self, 1872)
    end
    def hasWriting()
        val = DFHack.vmethod_call(self, 1888)
        (val & 1) != 0
    end
end

class ItemActual < Item
    sizeof 176

    rtti_classname :item_actualst

    field(:stack_size, 120) {
        number 32, true, 1
    }
    field(:history_info, 128) {
        pointer {
            pointer {
                global :ItemHistoryInfo
            }
        }
    }
    field(:magic, 136) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :ItemMagicness
                }
            }
        }
    }
    field(:contaminants, 144) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :Spatter
                }
            }
        }
    }
    field(:temperature, 152) {
        global :Temperaturest
    }
    field(:wear, 156) {
        number 16, true
    }
    field(:wear_timer, 160) {
        number 32, true
    }
    field(:unk_1, 164) {
        number 32, true, -1
    }
    field(:temp_updated_frame, 168) {
        number 32, true, -1
    }
end

class ItemCrafted < ItemActual
    sizeof 200

    rtti_classname :item_craftedst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:maker_race, 184) {
        number 16, true, -1
    }
    def maker_race_tg ; df.world.raws.creatures.all[maker_race] ; end
    field(:quality, 186) {
        number 16, true, nil, ItemQuality
    }
    field(:skill_rating, 188) {
        number 32, true, nil, SkillRating
    }
    field(:maker, 192) {
        number 32, true, -1
    }
    def maker_tg ; df.world.history.figures.binsearch(maker) ; end
    field(:masterpiece_event, 196) {
        number 32, true, -1
    }
    def masterpiece_event_tg ; df.world.history.events.binsearch(masterpiece_event) ; end
end

class ItemConstructed < ItemCrafted
    sizeof 224

    rtti_classname :item_constructedst

    field(:improvements, 200) {
        stl_vector(8) {
            pointer {
                global :Itemimprovement
            }
        }
    }
end

class ItemAmmost < ItemConstructed
    sizeof 240

    rtti_classname :item_ammost

    field(:subtype, 224) {
        pointer {
            global :ItemdefAmmost
        }
    }
    field(:sharpness, 232) {
        number 32, true
    }
end

class ItemAmuletst < ItemConstructed
    sizeof 224

    rtti_classname :item_amuletst

end

class ItemAnimaltrapst < ItemConstructed
    sizeof 224

    rtti_classname :item_animaltrapst

end

class ItemAnvilst < ItemConstructed
    sizeof 224

    rtti_classname :item_anvilst

end

class ItemArmorst < ItemConstructed
    sizeof 232

    rtti_classname :item_armorst

    field(:subtype, 224) {
        pointer {
            global :ItemdefArmorst
        }
    }
end

class ItemArmorstandst < ItemConstructed
    sizeof 224

    rtti_classname :item_armorstandst

end

class ItemBackpackst < ItemConstructed
    sizeof 224

    rtti_classname :item_backpackst

end

class ItemBallistaarrowheadst < ItemActual
    sizeof 192

    rtti_classname :item_ballistaarrowheadst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:sharpness, 184) {
        number 32, true, 10000
    }
end

class ItemBallistapartsst < ItemConstructed
    sizeof 224

    rtti_classname :item_ballistapartsst

end

class ItemBarrelst < ItemConstructed
    sizeof 232

    rtti_classname :item_barrelst

    field(:stockpile, 224) {
        global :ItemStockpileRef
    }
end

class ItemBarst < ItemActual
    sizeof 192

    rtti_classname :item_barst

    field(:subtype, 176) {
        number 16, true
    }
    field(:mat_type, 178) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:dimension, 184) {
        number 32, true, 150
    }
end

class ItemBedst < ItemConstructed
    sizeof 224

    rtti_classname :item_bedst

end

class ItemBinst < ItemConstructed
    sizeof 232

    rtti_classname :item_binst

    field(:stockpile, 224) {
        global :ItemStockpileRef
    }
end

class ItemBlocksst < ItemActual
    sizeof 184

    rtti_classname :item_blocksst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
end

class ItemBodyComponent < ItemActual
    sizeof 896

    rtti_classname :item_body_componentst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:hist_figure_id, 180) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:unit_id, 184) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:caste, 188) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:sex, 190) {
        number 8, true, nil, PronounType
    }
    field(:normal_race, 192) {
        number 16, true, -1
    }
    def normal_race_tg ; df.world.raws.creatures.all[normal_race] ; end
    field(:normal_caste, 194) {
        number 16, true, -1
    }
    def normal_caste_tg ; df.world.raws.creatures.all[normal_race].caste[normal_caste] ; end
    field(:rot_timer, 196) {
        number 32, true
    }
    field(:unk_8c, 200) {
        number 8, true
    }
    field(:body, 208) {
        compound(:ItemBodyComponent_TBody) {
            field(:wounds, 0) {
                stl_vector(8) {
                    pointer {
                        global :UnitWound
                    }
                }
            }
            field(:unk_100, 24) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:wound_next_id, 64) {
                number 32, true
            }
            field(:components, 72) {
                global :BodyComponentInfo
            }
            field(:physical_attr_value, 264) {
                static_array(6, 4, PhysicalAttributeType) {
                    number 32, true
                }
            }
            field(:physical_attr_soft_demotion, 288) {
                static_array(6, 4, PhysicalAttributeType) {
                    number 32, true
                }
            }
            field(:size_info, 312) {
                global :BodySizeInfo
            }
            field(:body_part_relsize, 336) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:body_modifiers, 360) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:bp_modifiers, 384) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:size_modifier, 616) {
        number 32, true
    }
    field(:birth_year, 620) {
        number 32, true
    }
    field(:birth_time, 624) {
        number 32, true
    }
    field(:curse_year, 628) {
        number 32, true
    }
    field(:curse_time, 632) {
        number 32, true
    }
    field(:birth_year_bias, 636) {
        number 32, true
    }
    field(:birth_time_bias, 640) {
        number 32, true
    }
    field(:death_year, 644) {
        number 32, true
    }
    field(:death_time, 648) {
        number 32, true
    }
    field(:appearance, 656) {
        compound(:ItemBodyComponent_TAppearance) {
            field(:colors, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:tissue_style, 24) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:tissue_style_civ_id, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:tissue_style_id, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:tissue_style_type, 96) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:blood_count, 776) {
        number 32, true
    }
    field(:stored_fat, 780) {
        number 32, true
    }
    field(:hist_figure_id2, 784) {
        number 32, true, -1
    }
    def hist_figure_tg2 ; df.world.history.figures.binsearch(hist_figure_id2) ; end
    field(:undead_unit_id, 788) {
        number 32, true, -1
    }
    def undead_unit_tg ; df.world.units.all.binsearch(undead_unit_id) ; end
    field(:unit_id2, 792) {
        number 32, true, -1
    }
    def unit_tg2 ; df.world.units.all.binsearch(unit_id2) ; end
    field(:corpse_flags, 796) {
        compound(:ItemBodyComponent_TCorpseFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:unbutchered, 0) { bit 0 }
            field(:plant, 0) { bit 1 }
            field(:silk, 0) { bit 2 }
            field(:leather, 0) { bit 3 }
            field(:bone, 0) { bit 4 }
            field(:shell, 0) { bit 5 }
            field(:soap, 0) { bit 7 }
            field(:tooth, 0) { bit 8 }
            field(:horn, 0) { bit 9 }
            field(:pearl, 0) { bit 10 }
            field(:skull1, 0) { bit 11 }
            field(:skull2, 0) { bit 12 }
            field(:separated_part, 0) { bit 13 }
            field(:hair_wool, 0) { bit 14 }
            field(:yarn, 0) { bit 15 }
        }
    }
    field(:material_amount, 800) {
        static_array(19, 4, CorpseMaterialType) {
            number 32, true
        }
    }
    field(:bone1, 876) {
        compound(:ItemBodyComponent_TBone1) {
            field(:mat_type, 0) {
                number 16, true, -1
            }
            field(:mat_index, 4) {
                number 32, true
            }
        }
    }
    field(:bone2, 884) {
        compound(:ItemBodyComponent_TBone2) {
            field(:mat_type, 0) {
                number 16, true, -1
            }
            field(:mat_index, 4) {
                number 32, true
            }
        }
    }
end

class ItemBookst < ItemConstructed
    sizeof 256

    rtti_classname :item_bookst

    field(:title, 224) {
        stl_string
    }
end

class ItemBoulderst < ItemActual
    sizeof 184

    rtti_classname :item_boulderst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
end

class ItemBoxst < ItemConstructed
    sizeof 224

    rtti_classname :item_boxst

end

class ItemBraceletst < ItemConstructed
    sizeof 224

    rtti_classname :item_braceletst

end

class ItemBranchst < ItemActual
    sizeof 184

    rtti_classname :item_branchst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
end

class ItemBucketst < ItemConstructed
    sizeof 224

    rtti_classname :item_bucketst

end

class ItemCabinetst < ItemConstructed
    sizeof 224

    rtti_classname :item_cabinetst

end

class ItemCagest < ItemConstructed
    sizeof 224

    rtti_classname :item_cagest

end

class ItemCatapultpartsst < ItemConstructed
    sizeof 224

    rtti_classname :item_catapultpartsst

end

class ItemChainst < ItemConstructed
    sizeof 224

    rtti_classname :item_chainst

end

class ItemChairst < ItemConstructed
    sizeof 224

    rtti_classname :item_chairst

end

class ItemCheesest < ItemActual
    sizeof 192

    rtti_classname :item_cheesest

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:rot_timer, 184) {
        number 32, true
    }
end

class ItemClothst < ItemConstructed
    sizeof 232

    rtti_classname :item_clothst

    field(:dimension, 224) {
        number 32, true, 10000
    }
end

class ItemCoffinst < ItemConstructed
    sizeof 224

    rtti_classname :item_coffinst

end

class ItemCoinst < ItemConstructed
    sizeof 232

    rtti_classname :item_coinst

    field(:coin_batch, 224) {
        number 16, true, -1
    }
    def coin_batch_tg ; df.world.coin_batches[coin_batch] ; end
end

class ItemCorpsepiecest < ItemBodyComponent
    sizeof 896

    rtti_classname :item_corpsepiecest

end

class ItemCorpsest < ItemBodyComponent
    sizeof 896

    rtti_classname :item_corpsest

end

class ItemCritter < ItemActual
    sizeof 312

    rtti_classname :item_critterst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 178) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:milk_timer, 180) {
        number 32, true
    }
    field(:airdrown_timer, 184) {
        number 32, true
    }
    field(:name, 192) {
        global :LanguageName
    }
end

class ItemCrownst < ItemConstructed
    sizeof 224

    rtti_classname :item_crownst

end

class ItemCrutchst < ItemConstructed
    sizeof 224

    rtti_classname :item_crutchst

end

class ItemDoorst < ItemConstructed
    sizeof 224

    rtti_classname :item_doorst

end

class ItemLiquipowder < ItemActual
    sizeof 184

    rtti_classname :item_liquipowderst

    field(:mat_state, 176) {
        global :ItemMatstate
    }
    field(:dimension, 180) {
        number 32, true, 150
    }
end

class ItemLiquid < ItemLiquipowder
    sizeof 192

    rtti_classname :item_liquidst

    field(:mat_type, 184) {
        number 16, true, -1
    }
    field(:mat_index, 188) {
        number 32, true
    }
end

class ItemDrinkst < ItemLiquid
    sizeof 192

    rtti_classname :item_drinkst

end

class ItemEarringst < ItemConstructed
    sizeof 224

    rtti_classname :item_earringst

end

class ItemEggst < ItemActual
    sizeof 344

    rtti_classname :item_eggst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 178) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:unk_7c, 180) {
        number 32, true
    }
    field(:egg_materials, 184) {
        global :MaterialVecRef
    }
    field(:egg_flags, 232) {
        compound(:ItemEggst_TEggFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:fertile, 0) { bit 0 }
        }
    }
    field(:incubation_counter, 236) {
        number 32, true
    }
    field(:hatchling_civ_id, 240) {
        number 32, true, -1
    }
    def hatchling_civ_tg ; df.world.entities.all.binsearch(hatchling_civ_id) ; end
    field(:hatchling_population_id, 244) {
        number 32, true, -1
    }
    def hatchling_population_tg ; df.world.entity_populations.binsearch(hatchling_population_id) ; end
    field(:hatchling_unit_unk_c0, 248) {
        number 32, true, -1
    }
    field(:unk_2, 252) {
        number 32, true
    }
    field(:mothers_genes, 256) {
        pointer {
            global :UnitGenes
        }
    }
    field(:mothers_caste, 264) {
        number 16, true, -1
    }
    def mothers_caste_tg ; df.world.raws.creatures.all[race].caste[mothers_caste] ; end
    field(:unk_3, 268) {
        number 32, true
    }
    field(:fathers_genes, 272) {
        pointer {
            global :UnitGenes
        }
    }
    field(:fathers_caste, 280) {
        number 16, true, -1
    }
    def fathers_caste_tg ; df.world.raws.creatures.all[race].caste[fathers_caste] ; end
    field(:unk_4, 284) {
        number 32, true
    }
    field(:hatchling_flags1, 288) {
        global :UnitFlags1
    }
    field(:hatchling_flags2, 292) {
        global :UnitFlags2
    }
    field(:hatchling_flags3, 296) {
        global :UnitFlags3
    }
    field(:unk_v42_1, 300) {
        number 32, true
    }
    field(:hatchling_training_level, 304) {
        number 32, true, :WildUntamed, AnimalTrainingLevel
    }
    field(:hatchling_animal_population, 308) {
        global :WorldPopulationRef
    }
    field(:hatchling_mother_id, 332) {
        number 32, true, -1
    }
    def hatchling_mother_tg ; df.world.units.all.binsearch(hatchling_mother_id) ; end
    field(:size, 336) {
        number 32, true
    }
end

class ItemFigurinest < ItemConstructed
    sizeof 272

    rtti_classname :item_figurinest

    field(:image, 224) {
        global :ArtImageRef
    }
    field(:description, 240) {
        stl_string
    }
end

class ItemFilterSpec < MemHack::Compound
    sizeof 12

    field(:item_type, 0) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 2) {
        number 16, true, -1
    }
    field(:material_class, 4) {
        number 16, true, nil, EntityMaterialCategory
    }
    field(:mattype, 6) {
        number 16, true, -1
    }
    field(:matindex, 8) {
        number 32, true
    }
end

class ItemFishRawst < ItemActual
    sizeof 184

    rtti_classname :item_fish_rawst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 178) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:rot_timer, 180) {
        number 32, true
    }
end

class ItemFishst < ItemActual
    sizeof 184

    rtti_classname :item_fishst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 178) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:rot_timer, 180) {
        number 32, true
    }
end

class ItemFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:on_ground, 0) { bit 0 }
    field(:in_job, 0) { bit 1 }
    field(:hostile, 0) { bit 2 }
    field(:in_inventory, 0) { bit 3 }
    field(:removed, 0) { bit 4 }
    field(:in_building, 0) { bit 5 }
    field(:container, 0) { bit 6 }
    field(:dead_dwarf, 0) { bit 7 }
    field(:rotten, 0) { bit 8 }
    field(:spider_web, 0) { bit 9 }
    field(:construction, 0) { bit 10 }
    field(:encased, 0) { bit 11 }
    field(:unk12, 0) { bit 12 }
    field(:murder, 0) { bit 13 }
    field(:foreign, 0) { bit 14 }
    field(:trader, 0) { bit 15 }
    field(:owned, 0) { bit 16 }
    field(:garbage_collect, 0) { bit 17 }
    field(:artifact, 0) { bit 18 }
    field(:forbid, 0) { bit 19 }
    field(:already_uncategorized, 0) { bit 20 }
    field(:dump, 0) { bit 21 }
    field(:on_fire, 0) { bit 22 }
    field(:melt, 0) { bit 23 }
    field(:hidden, 0) { bit 24 }
    field(:in_chest, 0) { bit 25 }
    field(:use_recorded, 0) { bit 26 }
    field(:artifact_mood, 0) { bit 27 }
    field(:temps_computed, 0) { bit 28 }
    field(:weight_computed, 0) { bit 29 }
    field(:unk30, 0) { bit 30 }
    field(:from_worldgen, 0) { bit 31 }
end

class ItemFlags2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:has_rider, 0) { bit 0 }
    field(:unk1, 0) { bit 1 }
    field(:grown, 0) { bit 2 }
    field(:unk_book, 0) { bit 3 }
end

class ItemFlaskst < ItemConstructed
    sizeof 224

    rtti_classname :item_flaskst

end

class ItemFloodgatest < ItemConstructed
    sizeof 224

    rtti_classname :item_floodgatest

end

class ItemFoodst < ItemCrafted
    sizeof 248

    rtti_classname :item_foodst

    field(:subtype, 200) {
        pointer {
            global :ItemdefFoodst
        }
    }
    field(:entity, 208) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:recipe_id, 212) {
        number 16, true
    }
    field(:ingredients, 216) {
        stl_vector(8) {
            pointer {
                compound(:ItemFoodst_TIngredients) {
                    sizeof 28

                    field(:unk_1, 0) {
                        number 16, true
                    }
                    field(:item_type, 2) {
                        number 16, true, nil, ItemType
                    }
                    field(:unk_4, 4) {
                        number 16, true, -1
                    }
                    field(:mat_type, 6) {
                        number 16, true, -1
                    }
                    field(:mat_index, 8) {
                        number 32, true, -1
                    }
                    field(:maker, 12) {
                        number 32, true, -1
                    }
                    def maker_tg ; df.world.history.figures.binsearch(maker) ; end
                    field(:quality, 16) {
                        number 16, true, nil, ItemQuality
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                    field(:unk_18, 24) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:rot_timer, 240) {
        number 32, true
    }
end

class ItemGemst < ItemConstructed
    sizeof 232

    rtti_classname :item_gemst

    field(:shape, 224) {
        number 32, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape] ; end
end

class ItemGlobst < ItemActual
    sizeof 200

    rtti_classname :item_globst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:rot_timer, 184) {
        number 32, true
    }
    field(:mat_state, 188) {
        global :ItemMatstate
    }
    field(:dimension, 192) {
        number 32, true
    }
end

class ItemGlovesst < ItemConstructed
    sizeof 248

    rtti_classname :item_glovesst

    field(:subtype, 224) {
        pointer {
            global :ItemdefGlovesst
        }
    }
    field(:handedness, 232) {
        df_flagarray
    }
end

class ItemGobletst < ItemConstructed
    sizeof 224

    rtti_classname :item_gobletst

end

class ItemGratest < ItemConstructed
    sizeof 224

    rtti_classname :item_gratest

end

class ItemHatchCoverst < ItemConstructed
    sizeof 224

    rtti_classname :item_hatch_coverst

end

class ItemHelmst < ItemConstructed
    sizeof 232

    rtti_classname :item_helmst

    field(:subtype, 224) {
        pointer {
            global :ItemdefHelmst
        }
    }
end

class ItemHistoryInfo < MemHack::Compound
    sizeof 16

    field(:kills, 0) {
        pointer {
            global :ItemKillInfo
        }
    }
    field(:attack_counter, 8) {
        number 32, true
    }
    field(:defence_counter, 12) {
        number 32, true
    }
end

class ItemInstrumentst < ItemConstructed
    sizeof 232

    rtti_classname :item_instrumentst

    field(:subtype, 224) {
        pointer {
            global :ItemdefInstrumentst
        }
    }
end

class ItemKillInfo < MemHack::Compound
    sizeof 240

    field(:targets, 0) {
        global :HistoricalKills
    }
    field(:slayers, 192) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def slayers_tg ; slayers.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:slayer_kill_counts, 216) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class ItemLiquidMiscst < ItemLiquid
    sizeof 200

    rtti_classname :item_liquid_miscst

    field(:unk_88, 192) {
        number 32, true
    }
end

class ItemMagicness < MemHack::Compound
    sizeof 12

    field(:type, 0) {
        number 16, true, nil, ItemMagicnessType
    }
    field(:value, 2) {
        number 16, true
    }
    field(:unk_1, 4) {
        number 16, true
    }
    field(:flags, 8) {
        number 32, true
    }
end

class ItemMatstate < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:no_auto_clean, 0) { bit 0 }
    field(:pressed, 0) { bit 1 }
    field(:paste, 0) { bit 2 }
end

class ItemMeatst < ItemActual
    sizeof 192

    rtti_classname :item_meatst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:rot_timer, 184) {
        number 32, true
    }
end

class ItemMillstonest < ItemConstructed
    sizeof 224

    rtti_classname :item_millstonest

end

class ItemOrthopedicCastst < ItemConstructed
    sizeof 288

    rtti_classname :item_orthopedic_castst

    field(:body_part, 224) {
        stl_string
    }
    field(:material, 256) {
        stl_string
    }
end

class ItemPantsst < ItemConstructed
    sizeof 232

    rtti_classname :item_pantsst

    field(:subtype, 224) {
        pointer {
            global :ItemdefPantsst
        }
    }
end

class ItemPetst < ItemCritter
    sizeof 320

    rtti_classname :item_petst

    field(:owner_id, 312) {
        number 32, true, -1
    }
    def owner_tg ; df.world.units.all.binsearch(owner_id) ; end
    field(:pet_flags, 316) {
        compound(:ItemPetst_TPetFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:available_for_adoption, 0) { bit 0 }
        }
    }
end

class ItemPipeSectionst < ItemConstructed
    sizeof 224

    rtti_classname :item_pipe_sectionst

end

class ItemPlantGrowthst < ItemActual
    sizeof 200

    rtti_classname :item_plant_growthst

    field(:subtype, 176) {
        number 16, true
    }
    field(:growth_print, 180) {
        number 32, true
    }
    field(:mat_type, 184) {
        number 16, true, -1
    }
    field(:mat_index, 188) {
        number 32, true
    }
    field(:rot_timer, 192) {
        number 32, true
    }
end

class ItemPlantst < ItemActual
    sizeof 192

    rtti_classname :item_plantst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:rot_timer, 184) {
        number 32, true
    }
end

class ItemPowder < ItemLiquipowder
    sizeof 192

    rtti_classname :item_powderst

    field(:mat_type, 184) {
        number 16, true, -1
    }
    field(:mat_index, 188) {
        number 32, true
    }
end

class ItemPowderMiscst < ItemPowder
    sizeof 192

    rtti_classname :item_powder_miscst

end

class ItemQuernst < ItemConstructed
    sizeof 224

    rtti_classname :item_quernst

end

class ItemQuiverst < ItemConstructed
    sizeof 224

    rtti_classname :item_quiverst

end

class ItemRemainsst < ItemActual
    sizeof 184

    rtti_classname :item_remainsst

    field(:race, 176) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 178) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:rot_timer, 180) {
        number 32, true
    }
end

class ItemRingst < ItemConstructed
    sizeof 224

    rtti_classname :item_ringst

end

class ItemRockst < ItemActual
    sizeof 192

    rtti_classname :item_rockst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:sharpness, 184) {
        number 32, true
    }
    field(:unk_84, 188) {
        number 32, true
    }
end

class ItemRoughst < ItemActual
    sizeof 184

    rtti_classname :item_roughst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
end

class ItemScepterst < ItemConstructed
    sizeof 224

    rtti_classname :item_scepterst

end

class ItemSeedsst < ItemActual
    sizeof 192

    rtti_classname :item_seedsst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:grow_counter, 184) {
        number 32, true
    }
    field(:planting_skill, 188) {
        number 32, true
    }
end

class ItemSheetst < ItemConstructed
    sizeof 232

    rtti_classname :item_sheetst

    field(:dimension, 224) {
        number 32, true
    }
    field(:unk_2, 228) {
        number 32, true
    }
end

class ItemShieldst < ItemConstructed
    sizeof 232

    rtti_classname :item_shieldst

    field(:subtype, 224) {
        pointer {
            global :ItemdefShieldst
        }
    }
end

class ItemShoesst < ItemConstructed
    sizeof 232

    rtti_classname :item_shoesst

    field(:subtype, 224) {
        pointer {
            global :ItemdefShoesst
        }
    }
end

class ItemSiegeammost < ItemConstructed
    sizeof 240

    rtti_classname :item_siegeammost

    field(:subtype, 224) {
        pointer {
            global :ItemdefSiegeammost
        }
    }
    field(:sharpness, 232) {
        number 32, true, 10000
    }
end

class ItemSkinTannedst < ItemActual
    sizeof 192

    rtti_classname :item_skin_tannedst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:unk_80, 184) {
        number 32, true
    }
end

class ItemSlabst < ItemConstructed
    sizeof 264

    rtti_classname :item_slabst

    field(:description, 224) {
        stl_string
    }
    field(:topic, 256) {
        number 32, true, -1
    }
    def topic_tg ; df.world.history.figures.binsearch(topic) ; end
    field(:engraving_type, 260) {
        number 16, true, nil, SlabEngravingType
    }
end

class ItemSmallgemst < ItemActual
    sizeof 192

    rtti_classname :item_smallgemst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:shape, 184) {
        number 32, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape] ; end
end

class ItemSplintst < ItemConstructed
    sizeof 224

    rtti_classname :item_splintst

end

class ItemStatuest < ItemConstructed
    sizeof 272

    rtti_classname :item_statuest

    field(:image, 224) {
        global :ArtImageRef
    }
    field(:description, 240) {
        stl_string
    }
end

class ItemStockpileRef < MemHack::Compound
    sizeof 8

    field(:id, 0) {
        number 32, true, -1
    }
    def id_tg ; df.world.buildings.all.binsearch(id) ; end
    field(:x, 4) {
        number 16, true
    }
    field(:y, 6) {
        number 16, true
    }
end

class ItemTablest < ItemConstructed
    sizeof 224

    rtti_classname :item_tablest

end

class ItemThreadst < ItemActual
    sizeof 216

    rtti_classname :item_threadst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
    field(:dye_mat_type, 184) {
        number 16, true, -1
    }
    field(:dye_mat_index, 188) {
        number 32, true
    }
    field(:dyer, 192) {
        number 32, true, -1
    }
    def dyer_tg ; df.world.history.figures.binsearch(dyer) ; end
    field(:dye_masterpiece_event, 196) {
        number 32, true, -1
    }
    def dye_masterpiece_event_tg ; df.world.history.events.binsearch(dye_masterpiece_event) ; end
    field(:dye_quality, 200) {
        number 16, true
    }
    field(:unk_92, 202) {
        number 16, true
    }
    field(:unk_94, 204) {
        number 32, true
    }
    field(:unk_98, 208) {
        number 8, true
    }
    field(:dimension, 212) {
        number 32, true, 15000
    }
end

class ItemToolst < ItemConstructed
    sizeof 256

    rtti_classname :item_toolst

    field(:subtype, 224) {
        pointer {
            global :ItemdefToolst
        }
    }
    field(:sharpness, 232) {
        number 32, true
    }
    field(:stockpile, 236) {
        global :ItemStockpileRef
    }
    field(:vehicle_id, 244) {
        number 32, true, -1
    }
    def vehicle_tg ; df.world.vehicles.all.binsearch(vehicle_id) ; end
    field(:unk_2, 248) {
        number 32, true, -1
    }
    field(:unk_3, 252) {
        number 32, true, -1
    }
end

class ItemTotemst < ItemConstructed
    sizeof 232

    rtti_classname :item_totemst

    field(:race, 224) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 226) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:body_part_idx, 228) {
        number 16, true
    }
end

class ItemToyst < ItemConstructed
    sizeof 232

    rtti_classname :item_toyst

    field(:subtype, 224) {
        pointer {
            global :ItemdefToyst
        }
    }
end

class ItemTractionBenchst < ItemConstructed
    sizeof 224

    rtti_classname :item_traction_benchst

end

class ItemTrapcompst < ItemConstructed
    sizeof 240

    rtti_classname :item_trapcompst

    field(:subtype, 224) {
        pointer {
            global :ItemdefTrapcompst
        }
    }
    field(:sharpness, 232) {
        number 32, true
    }
end

class ItemTrappartsst < ItemConstructed
    sizeof 224

    rtti_classname :item_trappartsst

end

class ItemVerminst < ItemCritter
    sizeof 312

    rtti_classname :item_verminst

end

class ItemWeaponrackst < ItemConstructed
    sizeof 224

    rtti_classname :item_weaponrackst

end

class ItemWeaponst < ItemConstructed
    sizeof 240

    rtti_classname :item_weaponst

    field(:subtype, 224) {
        pointer {
            global :ItemdefWeaponst
        }
    }
    field(:sharpness, 232) {
        number 32, true
    }
end

class ItemWindowst < ItemConstructed
    sizeof 224

    rtti_classname :item_windowst

end

class ItemWoodst < ItemActual
    sizeof 184

    rtti_classname :item_woodst

    field(:mat_type, 176) {
        number 16, true, -1
    }
    field(:mat_index, 180) {
        number 32, true
    }
end

class Itemdef < MemHack::Compound
    sizeof 96

    rtti_classname :itemdefst

    field(:id, 8) {
        stl_string
    }
    field(:subtype, 40) {
        number 16, true
    }
    field(:base_flags, 48) {
        df_flagarray(ItemdefFlags)
    }
    field(:source_hfid, 64) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:source_enid, 68) {
        number 32, true, -1
    }
    def source_enid_tg ; df.world.entities.all.binsearch(source_enid) ; end
    field(:raw_strings, 72) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    def parseRaws(arg0, arg1, arg2, arg3, arg4)
        DFHack.vmethod_call(self, 8, arg0, arg1, arg2, arg3, arg4) ; nil
    end
    def categorize()
        DFHack.vmethod_call(self, 16) ; nil
    end
    def finalize()
        DFHack.vmethod_call(self, 24) ; nil
    end
end

class ItemdefAmmost < Itemdef
    sizeof 272

    rtti_classname :itemdef_ammost

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:ammo_class, 192) {
        stl_string
    }
    field(:flags, 224) {
        df_flagarray(AmmoFlags)
    }
    field(:size, 240) {
        number 32, true
    }
    field(:value, 244) {
        number 32, true
    }
    field(:attacks, 248) {
        stl_vector(8) {
            pointer {
                global :WeaponAttack
            }
        }
    }
end

class ItemdefArmorst < Itemdef
    sizeof 320

    rtti_classname :itemdef_armorst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:name_preplural, 160) {
        stl_string
    }
    field(:material_placeholder, 192) {
        stl_string
    }
    field(:adjective, 224) {
        stl_string
    }
    field(:value, 256) {
        number 32, true
    }
    field(:armorlevel, 260) {
        number 8, true
    }
    field(:ubstep, 262) {
        number 16, true
    }
    field(:lbstep, 264) {
        number 16, true
    }
    field(:material_size, 268) {
        number 32, true
    }
    field(:props, 272) {
        global :ArmorProperties
    }
    field(:flags, 304) {
        df_flagarray(ArmorFlags)
    }
end

class ItemdefFoodst < Itemdef
    sizeof 136

    rtti_classname :itemdef_foodst

    field(:name, 96) {
        stl_string
    }
    field(:level, 128) {
        number 16, true
    }
end

class ItemdefGlovesst < Itemdef
    sizeof 256

    rtti_classname :itemdef_glovesst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:value, 192) {
        number 32, true
    }
    field(:armorlevel, 196) {
        number 8, true
    }
    field(:upstep, 198) {
        number 16, true
    }
    field(:flags, 200) {
        df_flagarray(GlovesFlags)
    }
    field(:material_size, 216) {
        number 32, true
    }
    field(:props, 224) {
        global :ArmorProperties
    }
end

class ItemdefHelmst < Itemdef
    sizeof 256

    rtti_classname :itemdef_helmst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:value, 192) {
        number 32, true
    }
    field(:armorlevel, 196) {
        number 8, true
    }
    field(:flags, 200) {
        df_flagarray(HelmFlags)
    }
    field(:material_size, 216) {
        number 32, true
    }
    field(:props, 224) {
        global :ArmorProperties
    }
end

class ItemdefInstrumentst < Itemdef
    sizeof 656

    rtti_classname :itemdef_instrumentst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:flags, 160) {
        df_flagarray(InstrumentFlags)
    }
    field(:music_skill, 176) {
        number 16, true, nil, JobSkill
    }
    field(:size, 180) {
        number 32, true
    }
    field(:value, 184) {
        number 32, true
    }
    field(:material_size, 188) {
        number 32, true
    }
    field(:pieces, 192) {
        stl_vector(8) {
            pointer {
                global :InstrumentPiece
            }
        }
    }
    field(:dominant_instrument_piece, 216) {
        stl_string
    }
    field(:pitch_range_min, 248) {
        number 32, true
    }
    field(:pitch_range_max, 252) {
        number 32, true
    }
    field(:volume_mb_min, 256) {
        number 32, true
    }
    field(:volume_mb_max, 260) {
        number 32, true
    }
    field(:sound_production, 264) {
        stl_vector(4) {
            global :SoundProductionType
        }
    }
    field(:sound_production_parm1, 288) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:sound_production_parm2, 312) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_100, 336) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_110, 360) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:pitch_choice, 384) {
        stl_vector(4) {
            global :PitchChoiceType
        }
    }
    field(:pitch_choice_parm1, 408) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:pitch_choice_parm2, 432) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_150, 456) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_160, 480) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:tuning, 504) {
        stl_vector(4) {
            global :TuningType
        }
    }
    field(:tuning_parm, 528) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_190, 552) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:registers, 576) {
        stl_vector(8) {
            pointer {
                global :InstrumentRegister
            }
        }
    }
    field(:timbre, 600) {
        stl_vector(4) {
            global :TimbreType
        }
    }
    field(:description, 624) {
        stl_string
    }
end

class ItemdefPantsst < Itemdef
    sizeof 320

    rtti_classname :itemdef_pantsst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:name_preplural, 160) {
        stl_string
    }
    field(:material_placeholder, 192) {
        stl_string
    }
    field(:adjective, 224) {
        stl_string
    }
    field(:value, 256) {
        number 32, true
    }
    field(:armorlevel, 260) {
        number 8, true
    }
    field(:flags, 264) {
        df_flagarray(PantsFlags)
    }
    field(:material_size, 280) {
        number 32, true
    }
    field(:lbstep, 284) {
        number 16, true
    }
    field(:props, 288) {
        global :ArmorProperties
    }
end

class ItemdefShieldst < Itemdef
    sizeof 208

    rtti_classname :itemdef_shieldst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:value, 192) {
        number 32, true
    }
    field(:blockchance, 196) {
        number 32, true
    }
    field(:armorlevel, 200) {
        number 8, true
    }
    field(:upstep, 202) {
        number 16, true
    }
    field(:material_size, 204) {
        number 32, true
    }
end

class ItemdefShoesst < Itemdef
    sizeof 256

    rtti_classname :itemdef_shoesst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:value, 192) {
        number 32, true
    }
    field(:armorlevel, 196) {
        number 8, true
    }
    field(:upstep, 198) {
        number 16, true
    }
    field(:flags, 200) {
        df_flagarray(ShoesFlags)
    }
    field(:material_size, 216) {
        number 32, true
    }
    field(:props, 224) {
        global :ArmorProperties
    }
end

class ItemdefSiegeammost < Itemdef
    sizeof 192

    rtti_classname :itemdef_siegeammost

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:ammo_class, 160) {
        stl_string
    }
end

class ItemdefToolst < Itemdef
    sizeof 440

    rtti_classname :itemdef_toolst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:flags, 160) {
        df_flagarray(ToolFlags)
    }
    field(:value, 176) {
        number 32, true
    }
    field(:tile, 180) {
        number 8, false
    }
    field(:tool_use, 184) {
        stl_vector(2) {
            number 16, true, nil, ToolUses
        }
    }
    field(:adjective, 208) {
        stl_string
    }
    field(:size, 240) {
        number 32, true
    }
    field(:skill_melee, 244) {
        number 16, true, nil, JobSkill
    }
    field(:skill_ranged, 246) {
        number 16, true, nil, JobSkill
    }
    field(:ranged_ammo, 248) {
        stl_string
    }
    field(:two_handed, 280) {
        number 32, true
    }
    field(:minimum_size, 284) {
        number 32, true
    }
    field(:material_size, 288) {
        number 32, true
    }
    field(:attacks, 296) {
        stl_vector(8) {
            pointer {
                global :WeaponAttack
            }
        }
    }
    field(:shoot_force, 320) {
        number 32, true
    }
    field(:shoot_maxvel, 324) {
        number 32, true
    }
    field(:container_capacity, 328) {
        number 32, true
    }
    field(:shape_category_str, 336) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:shape_category, 360) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def shape_category_tg ; shape_category.map { |i| df.world.raws.descriptors.shapes[i] } ; end
    field(:description, 384) {
        stl_string
    }
    field(:default_improvements, 416) {
        stl_vector(8) {
            pointer {
                compound(:ItemdefToolst_TDefaultImprovements) {
                    sizeof 48

                    field(:type, 0) {
                        number 32, true, nil, ImprovementType
                    }
                    field(:specific_type, 4) {
                        number 32, true, nil, ItemimprovementSpecificType
                    }
                    field(:instrument_part, 8) {
                        stl_string
                    }
                    field(:restriction, 40) {
                        number 32, true, nil, ToolFlags
                    }
                }
            }
        }
    }
end

class ItemdefToyst < Itemdef
    sizeof 176

    rtti_classname :itemdef_toyst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:flags, 160) {
        df_flagarray(ToyFlags)
    }
end

class ItemdefTrapcompst < Itemdef
    sizeof 248

    rtti_classname :itemdef_trapcompst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:size, 192) {
        number 32, true
    }
    field(:value, 196) {
        number 32, true
    }
    field(:hits, 200) {
        number 32, true
    }
    field(:material_size, 204) {
        number 32, true
    }
    field(:flags, 208) {
        df_flagarray(TrapcompFlags)
    }
    field(:attacks, 224) {
        stl_vector(8) {
            pointer {
                global :WeaponAttack
            }
        }
    }
end

class ItemdefWeaponst < Itemdef
    sizeof 304

    rtti_classname :itemdef_weaponst

    field(:name, 96) {
        stl_string
    }
    field(:name_plural, 128) {
        stl_string
    }
    field(:adjective, 160) {
        stl_string
    }
    field(:size, 192) {
        number 32, true
    }
    field(:value, 196) {
        number 32, true
    }
    field(:skill_melee, 200) {
        number 16, true, nil, JobSkill
    }
    field(:skill_ranged, 202) {
        number 16, true, nil, JobSkill
    }
    field(:ranged_ammo, 208) {
        stl_string
    }
    field(:two_handed, 240) {
        number 32, true
    }
    field(:minimum_size, 244) {
        number 32, true
    }
    field(:material_size, 248) {
        number 32, true
    }
    field(:flags, 256) {
        df_flagarray(WeaponFlags)
    }
    field(:attacks, 272) {
        stl_vector(8) {
            pointer {
                global :WeaponAttack
            }
        }
    }
    field(:shoot_force, 296) {
        number 32, true
    }
    field(:shoot_maxvel, 300) {
        number 32, true
    }
end

class Itemimprovement < MemHack::Compound
    sizeof 40

    rtti_classname :itemimprovementst

    field(:mat_type, 8) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true
    }
    field(:maker, 16) {
        number 32, true, -1
    }
    def maker_tg ; df.world.history.figures.binsearch(maker) ; end
    field(:masterpiece_event, 20) {
        number 32, true, -1
    }
    def masterpiece_event_tg ; df.world.history.events.binsearch(masterpiece_event) ; end
    field(:quality, 24) {
        number 16, true, nil, ItemQuality
    }
    field(:skill_rating, 28) {
        number 32, true, nil, SkillRating
    }
    field(:unk_1, 32) {
        number 32, true
    }
    def getImage(arg0)
        ptr = DFHack.vmethod_call(self, 0, arg0)
        class << self
            global :ArtImage
        end._at(ptr) if ptr != 0
    end
    def getColorAndShape(colors, shapes, arg2)
        DFHack.vmethod_call(self, 8, colors, shapes, arg2) ; nil
    end
    def clone()
        ptr = DFHack.vmethod_call(self, 16)
        class << self
            global :Itemimprovement
        end._at(ptr) if ptr != 0
    end
    def write_file(file)
        DFHack.vmethod_call(self, 24, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 32, file, SaveVersion.int(loadversion)) ; nil
    end
    def getType()
        ImprovementType.sym(DFHack.vmethod_call(self, 40))
    end
    def isDecoration()
        val = DFHack.vmethod_call(self, 48)
        (val & 1) != 0
    end
    def getDyeValue(caravan)
        val = DFHack.vmethod_call(self, 64, caravan)
    end
    def setShape(shape)
        DFHack.vmethod_call(self, 72, shape) ; nil
    end
end

class ItemimprovementArtImagest < Itemimprovement
    sizeof 56

    rtti_classname :itemimprovement_art_imagest

    field(:image, 40) {
        global :ArtImageRef
    }
end

class ItemimprovementBandsst < Itemimprovement
    sizeof 48

    rtti_classname :itemimprovement_bandsst

    field(:shape, 40) {
        number 32, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape] ; end
end

class ItemimprovementClothst < Itemimprovement
    sizeof 40

    rtti_classname :itemimprovement_clothst

end

class ItemimprovementCoveredst < Itemimprovement
    sizeof 48

    rtti_classname :itemimprovement_coveredst

    field(:cover_flags, 40) {
        compound(:ItemimprovementCoveredst_TCoverFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:glazed, 0) { bit 0 }
        }
    }
    field(:shape, 44) {
        number 32, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape] ; end
end

class ItemimprovementIllustrationst < Itemimprovement
    sizeof 64

    rtti_classname :itemimprovement_illustrationst

    field(:image, 40) {
        global :ArtImageRef
    }
    field(:unk_2, 56) {
        number 32, true
    }
end

class ItemimprovementImageSetst < Itemimprovement
    sizeof 48

    rtti_classname :itemimprovement_image_setst

    field(:image_set_id, 40) {
        number 32, true, -1
    }
    def image_set_tg ; df.world.image_sets.all.binsearch(image_set_id) ; end
end

class ItemimprovementInstrumentPiecest < Itemimprovement
    sizeof 72

    rtti_classname :itemimprovement_instrument_piecest

    field(:unk_2, 40) {
        stl_string
    }
end

class ItemimprovementItemspecificst < Itemimprovement
    sizeof 48

    rtti_classname :itemimprovement_itemspecificst

    field(:type, 40) {
        number 32, true, nil, ItemimprovementSpecificType
    }
end

class ItemimprovementPagesst < Itemimprovement
    sizeof 72

    rtti_classname :itemimprovement_pagesst

    field(:count, 40) {
        number 32, true
    }
    field(:contents, 48) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def contents_tg ; contents.map { |i| df.world.written_contents.all.binsearch(i) } ; end
end

class ItemimprovementRingsHangingst < Itemimprovement
    sizeof 40

    rtti_classname :itemimprovement_rings_hangingst

end

class ItemimprovementSewnImagest < Itemimprovement
    sizeof 88

    rtti_classname :itemimprovement_sewn_imagest

    field(:image, 40) {
        global :ArtImageRef
    }
    field(:cloth, 56) {
        compound(:ItemimprovementSewnImagest_TCloth) {
            field(:unit_id, 0) {
                number 32, true, -1
            }
            def unit_tg ; df.world.history.figures.binsearch(unit_id) ; end
            field(:quality, 4) {
                number 16, true
            }
            field(:unk_1, 6) {
                number 16, true
            }
        }
    }
    field(:dye, 64) {
        global :DyeInfo
    }
end

class ItemimprovementSpikesst < Itemimprovement
    sizeof 40

    rtti_classname :itemimprovement_spikesst

end

class ItemimprovementThreadst < Itemimprovement
    sizeof 64

    rtti_classname :itemimprovement_threadst

    field(:dye, 40) {
        global :DyeInfo
    }
end

class ItemimprovementWritingst < Itemimprovement
    sizeof 64

    rtti_classname :itemimprovement_writingst

    field(:contents, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def contents_tg ; contents.map { |i| df.world.written_contents.all.binsearch(i) } ; end
end

class ItemsOther < MemHack::OtherVectors
    sizeof 3168

    ienum ItemsOtherId

    field(:IN_PLAY, 0) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_ARTIFACT, 24) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:WEAPON, 48) {
        stl_vector(8) {
            pointer {
                global :ItemWeaponst
            }
        }
    }
    field(:ANY_WEAPON, 72) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_SPIKE, 96) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_TRUE_ARMOR, 120) {
        stl_vector(8) {
            pointer {
                global :ItemArmorst
            }
        }
    }
    field(:ANY_ARMOR_HELM, 144) {
        stl_vector(8) {
            pointer {
                global :ItemHelmst
            }
        }
    }
    field(:ANY_ARMOR_SHOES, 168) {
        stl_vector(8) {
            pointer {
                global :ItemShoesst
            }
        }
    }
    field(:SHIELD, 192) {
        stl_vector(8) {
            pointer {
                global :ItemShieldst
            }
        }
    }
    field(:ANY_ARMOR_GLOVES, 216) {
        stl_vector(8) {
            pointer {
                global :ItemGlovesst
            }
        }
    }
    field(:ANY_ARMOR_PANTS, 240) {
        stl_vector(8) {
            pointer {
                global :ItemPantsst
            }
        }
    }
    field(:QUIVER, 264) {
        stl_vector(8) {
            pointer {
                global :ItemQuiverst
            }
        }
    }
    field(:SPLINT, 288) {
        stl_vector(8) {
            pointer {
                global :ItemSplintst
            }
        }
    }
    field(:ORTHOPEDIC_CAST, 312) {
        stl_vector(8) {
            pointer {
                global :ItemOrthopedicCastst
            }
        }
    }
    field(:CRUTCH, 336) {
        stl_vector(8) {
            pointer {
                global :ItemCrutchst
            }
        }
    }
    field(:BACKPACK, 360) {
        stl_vector(8) {
            pointer {
                global :ItemBackpackst
            }
        }
    }
    field(:AMMO, 384) {
        stl_vector(8) {
            pointer {
                global :ItemAmmost
            }
        }
    }
    field(:WOOD, 408) {
        stl_vector(8) {
            pointer {
                global :ItemWoodst
            }
        }
    }
    field(:BRANCH, 432) {
        stl_vector(8) {
            pointer {
                global :ItemBranchst
            }
        }
    }
    field(:BOULDER, 456) {
        stl_vector(8) {
            pointer {
                global :ItemBoulderst
            }
        }
    }
    field(:ROCK, 480) {
        stl_vector(8) {
            pointer {
                global :ItemRockst
            }
        }
    }
    field(:ANY_REFUSE, 504) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GOOD_FOOD, 528) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_AUTO_CLEAN, 552) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC24, 576) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_BUTCHERABLE, 600) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_FURNITURE, 624) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_CAGE_OR_TRAP, 648) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_EDIBLE_RAW, 672) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_EDIBLE_CARNIVORE, 696) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_EDIBLE_BONECARN, 720) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_EDIBLE_VERMIN, 744) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_EDIBLE_VERMIN_BOX, 768) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_CAN_ROT, 792) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_MURDERED, 816) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_DEAD_DWARF, 840) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC36, 864) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC37, 888) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC38, 912) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC39, 936) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:DOOR, 960) {
        stl_vector(8) {
            pointer {
                global :ItemDoorst
            }
        }
    }
    field(:FLOODGATE, 984) {
        stl_vector(8) {
            pointer {
                global :ItemFloodgatest
            }
        }
    }
    field(:HATCH_COVER, 1008) {
        stl_vector(8) {
            pointer {
                global :ItemHatchCoverst
            }
        }
    }
    field(:GRATE, 1032) {
        stl_vector(8) {
            pointer {
                global :ItemGratest
            }
        }
    }
    field(:CAGE, 1056) {
        stl_vector(8) {
            pointer {
                global :ItemCagest
            }
        }
    }
    field(:FLASK, 1080) {
        stl_vector(8) {
            pointer {
                global :ItemFlaskst
            }
        }
    }
    field(:WINDOW, 1104) {
        stl_vector(8) {
            pointer {
                global :ItemWindowst
            }
        }
    }
    field(:GOBLET, 1128) {
        stl_vector(8) {
            pointer {
                global :ItemGobletst
            }
        }
    }
    field(:INSTRUMENT, 1152) {
        stl_vector(8) {
            pointer {
                global :ItemInstrumentst
            }
        }
    }
    field(:INSTRUMENT_STATIONARY, 1176) {
        stl_vector(8) {
            pointer {
                global :ItemInstrumentst
            }
        }
    }
    field(:TOY, 1200) {
        stl_vector(8) {
            pointer {
                global :ItemToyst
            }
        }
    }
    field(:TOOL, 1224) {
        stl_vector(8) {
            pointer {
                global :ItemToolst
            }
        }
    }
    field(:BUCKET, 1248) {
        stl_vector(8) {
            pointer {
                global :ItemBucketst
            }
        }
    }
    field(:BARREL, 1272) {
        stl_vector(8) {
            pointer {
                global :ItemBarrelst
            }
        }
    }
    field(:CHAIN, 1296) {
        stl_vector(8) {
            pointer {
                global :ItemChainst
            }
        }
    }
    field(:ANIMALTRAP, 1320) {
        stl_vector(8) {
            pointer {
                global :ItemAnimaltrapst
            }
        }
    }
    field(:BED, 1344) {
        stl_vector(8) {
            pointer {
                global :ItemBedst
            }
        }
    }
    field(:TRACTION_BENCH, 1368) {
        stl_vector(8) {
            pointer {
                global :ItemTractionBenchst
            }
        }
    }
    field(:CHAIR, 1392) {
        stl_vector(8) {
            pointer {
                global :ItemChairst
            }
        }
    }
    field(:COFFIN, 1416) {
        stl_vector(8) {
            pointer {
                global :ItemCoffinst
            }
        }
    }
    field(:TABLE, 1440) {
        stl_vector(8) {
            pointer {
                global :ItemTablest
            }
        }
    }
    field(:STATUE, 1464) {
        stl_vector(8) {
            pointer {
                global :ItemStatuest
            }
        }
    }
    field(:SLAB, 1488) {
        stl_vector(8) {
            pointer {
                global :ItemSlabst
            }
        }
    }
    field(:QUERN, 1512) {
        stl_vector(8) {
            pointer {
                global :ItemQuernst
            }
        }
    }
    field(:MILLSTONE, 1536) {
        stl_vector(8) {
            pointer {
                global :ItemMillstonest
            }
        }
    }
    field(:BOX, 1560) {
        stl_vector(8) {
            pointer {
                global :ItemBoxst
            }
        }
    }
    field(:BIN, 1584) {
        stl_vector(8) {
            pointer {
                global :ItemBinst
            }
        }
    }
    field(:ARMORSTAND, 1608) {
        stl_vector(8) {
            pointer {
                global :ItemArmorstandst
            }
        }
    }
    field(:WEAPONRACK, 1632) {
        stl_vector(8) {
            pointer {
                global :ItemWeaponrackst
            }
        }
    }
    field(:CABINET, 1656) {
        stl_vector(8) {
            pointer {
                global :ItemCabinetst
            }
        }
    }
    field(:ANVIL, 1680) {
        stl_vector(8) {
            pointer {
                global :ItemAnvilst
            }
        }
    }
    field(:CATAPULTPARTS, 1704) {
        stl_vector(8) {
            pointer {
                global :ItemCatapultpartsst
            }
        }
    }
    field(:BALLISTAPARTS, 1728) {
        stl_vector(8) {
            pointer {
                global :ItemBallistapartsst
            }
        }
    }
    field(:SIEGEAMMO, 1752) {
        stl_vector(8) {
            pointer {
                global :ItemSiegeammost
            }
        }
    }
    field(:TRAPPARTS, 1776) {
        stl_vector(8) {
            pointer {
                global :ItemTrappartsst
            }
        }
    }
    field(:ANY_WEBS, 1800) {
        stl_vector(8) {
            pointer {
                global :ItemThreadst
            }
        }
    }
    field(:PIPE_SECTION, 1824) {
        stl_vector(8) {
            pointer {
                global :ItemPipeSectionst
            }
        }
    }
    field(:ANY_ENCASED, 1848) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_IN_CONSTRUCTION, 1872) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:DRINK, 1896) {
        stl_vector(8) {
            pointer {
                global :ItemDrinkst
            }
        }
    }
    field(:ANY_DRINK, 1920) {
        stl_vector(8) {
            pointer {
                global :ItemDrinkst
            }
        }
    }
    field(:LIQUID_MISC, 1944) {
        stl_vector(8) {
            pointer {
                global :ItemLiquidMiscst
            }
        }
    }
    field(:POWDER_MISC, 1968) {
        stl_vector(8) {
            pointer {
                global :ItemPowderMiscst
            }
        }
    }
    field(:ANY_COOKABLE, 1992) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_GENERIC84, 2016) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:VERMIN, 2040) {
        stl_vector(8) {
            pointer {
                global :ItemVerminst
            }
        }
    }
    field(:PET, 2064) {
        stl_vector(8) {
            pointer {
                global :ItemPetst
            }
        }
    }
    field(:ANY_CRITTER, 2088) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:COIN, 2112) {
        stl_vector(8) {
            pointer {
                global :ItemCoinst
            }
        }
    }
    field(:GLOB, 2136) {
        stl_vector(8) {
            pointer {
                global :ItemGlobst
            }
        }
    }
    field(:TRAPCOMP, 2160) {
        stl_vector(8) {
            pointer {
                global :ItemTrapcompst
            }
        }
    }
    field(:BAR, 2184) {
        stl_vector(8) {
            pointer {
                global :ItemBarst
            }
        }
    }
    field(:SMALLGEM, 2208) {
        stl_vector(8) {
            pointer {
                global :ItemSmallgemst
            }
        }
    }
    field(:BLOCKS, 2232) {
        stl_vector(8) {
            pointer {
                global :ItemBlocksst
            }
        }
    }
    field(:ROUGH, 2256) {
        stl_vector(8) {
            pointer {
                global :ItemRoughst
            }
        }
    }
    field(:ANY_CORPSE, 2280) {
        stl_vector(8) {
            pointer {
                global :ItemBodyComponent
            }
        }
    }
    field(:CORPSE, 2304) {
        stl_vector(8) {
            pointer {
                global :ItemCorpsest
            }
        }
    }
    field(:BOOK, 2328) {
        stl_vector(8) {
            pointer {
                global :ItemBookst
            }
        }
    }
    field(:FIGURINE, 2352) {
        stl_vector(8) {
            pointer {
                global :ItemFigurinest
            }
        }
    }
    field(:AMULET, 2376) {
        stl_vector(8) {
            pointer {
                global :ItemAmuletst
            }
        }
    }
    field(:SCEPTER, 2400) {
        stl_vector(8) {
            pointer {
                global :ItemScepterst
            }
        }
    }
    field(:CROWN, 2424) {
        stl_vector(8) {
            pointer {
                global :ItemCrownst
            }
        }
    }
    field(:RING, 2448) {
        stl_vector(8) {
            pointer {
                global :ItemRingst
            }
        }
    }
    field(:EARRING, 2472) {
        stl_vector(8) {
            pointer {
                global :ItemEarringst
            }
        }
    }
    field(:BRACELET, 2496) {
        stl_vector(8) {
            pointer {
                global :ItemBraceletst
            }
        }
    }
    field(:GEM, 2520) {
        stl_vector(8) {
            pointer {
                global :ItemGemst
            }
        }
    }
    field(:CORPSEPIECE, 2544) {
        stl_vector(8) {
            pointer {
                global :ItemCorpsepiecest
            }
        }
    }
    field(:REMAINS, 2568) {
        stl_vector(8) {
            pointer {
                global :ItemRemainsst
            }
        }
    }
    field(:MEAT, 2592) {
        stl_vector(8) {
            pointer {
                global :ItemMeatst
            }
        }
    }
    field(:FISH, 2616) {
        stl_vector(8) {
            pointer {
                global :ItemFishst
            }
        }
    }
    field(:FISH_RAW, 2640) {
        stl_vector(8) {
            pointer {
                global :ItemFishRawst
            }
        }
    }
    field(:EGG, 2664) {
        stl_vector(8) {
            pointer {
                global :ItemEggst
            }
        }
    }
    field(:SEEDS, 2688) {
        stl_vector(8) {
            pointer {
                global :ItemSeedsst
            }
        }
    }
    field(:PLANT, 2712) {
        stl_vector(8) {
            pointer {
                global :ItemPlantst
            }
        }
    }
    field(:SKIN_TANNED, 2736) {
        stl_vector(8) {
            pointer {
                global :ItemSkinTannedst
            }
        }
    }
    field(:PLANT_GROWTH, 2760) {
        stl_vector(8) {
            pointer {
                global :ItemPlantGrowthst
            }
        }
    }
    field(:THREAD, 2784) {
        stl_vector(8) {
            pointer {
                global :ItemThreadst
            }
        }
    }
    field(:CLOTH, 2808) {
        stl_vector(8) {
            pointer {
                global :ItemClothst
            }
        }
    }
    field(:SHEET, 2832) {
        stl_vector(8) {
            pointer {
                global :ItemSheetst
            }
        }
    }
    field(:TOTEM, 2856) {
        stl_vector(8) {
            pointer {
                global :ItemTotemst
            }
        }
    }
    field(:PANTS, 2880) {
        stl_vector(8) {
            pointer {
                global :ItemPantsst
            }
        }
    }
    field(:CHEESE, 2904) {
        stl_vector(8) {
            pointer {
                global :ItemCheesest
            }
        }
    }
    field(:FOOD, 2928) {
        stl_vector(8) {
            pointer {
                global :ItemFoodst
            }
        }
    }
    field(:BALLISTAARROWHEAD, 2952) {
        stl_vector(8) {
            pointer {
                global :ItemBallistaarrowheadst
            }
        }
    }
    field(:ARMOR, 2976) {
        stl_vector(8) {
            pointer {
                global :ItemArmorst
            }
        }
    }
    field(:SHOES, 3000) {
        stl_vector(8) {
            pointer {
                global :ItemShoesst
            }
        }
    }
    field(:HELM, 3024) {
        stl_vector(8) {
            pointer {
                global :ItemHelmst
            }
        }
    }
    field(:GLOVES, 3048) {
        stl_vector(8) {
            pointer {
                global :ItemGlovesst
            }
        }
    }
    field(:ANY_GENERIC128, 3072) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:FOOD_STORAGE, 3096) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_RECENTLY_DROPPED, 3120) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:ANY_MELT_DESIGNATED, 3144) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
end

class Job < MemHack::Compound
    sizeof 328

    field(:id, 0) {
        number 32, true, -1
    }
    field(:list_link, 8) {
        pointer {
            global :JobListLink
        }
    }
    field(:posting_index, 16) {
        number 32, true, -1
    }
    field(:job_type, 20) {
        number 16, true, nil, JobType
    }
    field(:job_subtype, 24) {
        number 32, true, -1
    }
    field(:pos, 28) {
        global :Coord
    }
    field(:completion_timer, 36) {
        number 32, true, -1
    }
    field(:unk4, 40) {
        number 32, false
    }
    field(:flags, 44) {
        global :JobFlags
    }
    field(:mat_type, 48) {
        number 16, true, -1
    }
    field(:mat_index, 52) {
        number 32, true, -1
    }
    field(:unk5, 56) {
        number 16, true, -1
    }
    field(:item_type, 58) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 60) {
        number 16, true, -1
    }
    field(:item_category, 64) {
        global :StockpileGroupSet
    }
    field(:hist_figure_id, 68) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:race, 68) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:improvement, 68) {
        number 32, true, nil, ImprovementType
    }
    field(:material_category, 72) {
        global :JobMaterialCategory
    }
    field(:reaction_name, 80) {
        stl_string
    }
    field(:expire_timer, 112) {
        number 32, true
    }
    field(:recheck_cntdn, 116) {
        number 16, true
    }
    field(:wait_timer, 118) {
        number 16, true
    }
    field(:unk11, 120) {
        number 32, true, -1
    }
    field(:items, 128) {
        stl_vector(8) {
            pointer {
                global :JobItemRef
            }
        }
    }
    field(:specific_refs, 152) {
        stl_vector(8) {
            pointer {
                global :SpecificRef
            }
        }
    }
    field(:general_refs, 176) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:job_items, 200) {
        stl_vector(8) {
            pointer {
                global :JobItem
            }
        }
    }
    field(:guide_path, 224) {
        global :CoordPath
    }
    field(:cur_path_index, 296) {
        number 32, true
    }
    field(:unk_v4020_2, 300) {
        global :Coord
    }
    field(:art_spec, 308) {
        global :JobArtSpecification
    }
    field(:order_id, 320) {
        number 32, true, -1
    }
end

class JobArtSpecification < MemHack::Compound
    sizeof 12

    field(:type, 0) {
        class ::DFHack::JobArtSpecification_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :None ; NUME[:None] = -1
            ENUM[0] = :HistoricalFigure ; NUME[:HistoricalFigure] = 0
            ENUM[1] = :Site ; NUME[:Site] = 1
            ENUM[2] = :Entity ; NUME[:Entity] = 2
            ENUM[3] = :ArtImage ; NUME[:ArtImage] = 3
        end

        number 32, true, nil, JobArtSpecification_TType
    }
    field(:id, 4) {
        number 32, true, -1
    }
    field(:subid, 8) {
        number 32, true, -1
    }
end

class JobFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:repeat, 0) { bit 0 }
    field(:suspend, 0) { bit 1 }
    field(:working, 0) { bit 2 }
    field(:fetching, 0) { bit 3 }
    field(:special, 0) { bit 4 }
    field(:bringing, 0) { bit 5 }
    field(:item_lost, 0) { bit 6 }
    field(:noise, 0) { bits 7, 2 }
    field(:by_manager, 0) { bit 9 }
    field(:store_item, 0) { bit 10 }
    field(:quality, 0) { bits 11, 3 }
    field(:specific_dropoff, 0) { bit 14 }
    field(:on_break, 0) { bit 16 }
    field(:do_now, 0) { bit 18 }
end

class JobHandler < MemHack::Compound
    sizeof 32064

    rtti_classname :job_handlerst

    field(:list, 8) {
        df_linked_list {
            global :JobListLink
        }
    }
    field(:postings, 32) {
        stl_vector(8) {
            pointer {
                compound(:JobHandler_TPostings) {
                    sizeof 24

                    field(:idx, 0) {
                        number 32, true
                    }
                    field(:job, 8) {
                        pointer {
                            global :Job
                        }
                    }
                    field(:flags, 16) {
                        compound(:JobHandler_TPostings_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                            field(:dead, 0) { bit 0 }
                        }
                    }
                    field(:unk_1, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_1, 56) {
        static_array(2000, 16) {
            compound(:JobHandler_TUnk1) {
                field(:unk_1, 0) {
                    pointer {
                        global :Unit
                    }
                }
                field(:unk_2, 8) {
                    number 32, true
                }
                field(:unk_3, 12) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_2, 32056) {
        number 32, true
    }
    def cancel_job(arg0)
        DFHack.vmethod_call(self, 0, arg0) ; nil
    end
end

class JobItem < MemHack::Compound
    sizeof 168

    field(:item_type, 0) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 2) {
        number 16, true, -1
    }
    field(:mat_type, 4) {
        number 16, true, -1
    }
    field(:mat_index, 8) {
        number 32, true, -1
    }
    field(:flags1, 12) {
        global :JobItemFlags1
    }
    field(:quantity, 16) {
        number 32, true, 1
    }
    field(:vector_id, 20) {
        number 16, true, :IN_PLAY, JobItemVectorId
    }
    field(:flags2, 24) {
        global :JobItemFlags2
    }
    field(:flags3, 28) {
        global :JobItemFlags3
    }
    field(:flags4, 32) {
        number 32, false
    }
    field(:flags5, 36) {
        number 32, false
    }
    field(:metal_ore, 40) {
        number 32, true, -1
    }
    def metal_ore_tg ; df.world.raws.inorganics[metal_ore] ; end
    field(:reaction_class, 48) {
        stl_string
    }
    field(:has_material_reaction_product, 80) {
        stl_string
    }
    field(:min_dimension, 112) {
        number 32, true, -1
    }
    field(:reagent_index, 116) {
        number 32, true, -1
    }
    field(:contains, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:reaction_id, 144) {
        number 32, true, -1
    }
    def reaction_tg ; df.world.raws.reactions.reactions[reaction_id] ; end
    field(:has_tool_use, 148) {
        number 16, true, nil, ToolUses
    }
    field(:unk_v43_1, 152) {
        number 32, true
    }
    field(:unk_v43_2, 156) {
        number 16, true, -1
    }
    field(:unk_v43_3, 160) {
        number 32, true, -1
    }
    field(:unk_v43_4, 164) {
        number 32, true
    }
end

class JobItemFilter < MemHack::Compound
    sizeof 264

    field(:item_type, 0) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 2) {
        number 16, true, -1
    }
    field(:mat_type, 4) {
        number 16, true, -1
    }
    field(:mat_index, 8) {
        number 32, true, -1
    }
    field(:flags1, 12) {
        global :JobItemFlags1
    }
    field(:item_vector, 16) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :Item
                }
            }
        }
    }
    field(:use_mat_index, 24) {
        number 8, true, nil, BooleanEnum
    }
    field(:flags2, 28) {
        global :JobItemFlags2
    }
    field(:use_flags2, 32) {
        number 8, true, nil, BooleanEnum
    }
    field(:flags3, 36) {
        global :JobItemFlags3
    }
    field(:use_flags3, 40) {
        number 8, true, nil, BooleanEnum
    }
    field(:flags4, 44) {
        number 32, false
    }
    field(:use_flags4, 48) {
        number 8, true, nil, BooleanEnum
    }
    field(:flags5, 52) {
        number 32, false
    }
    field(:use_flags5, 56) {
        number 8, true, nil, BooleanEnum
    }
    field(:reaction_class, 64) {
        stl_string
    }
    field(:has_material_reaction_product, 96) {
        stl_string
    }
    field(:metal_ore, 128) {
        number 32, true, -1
    }
    def metal_ore_tg ; df.world.raws.inorganics[metal_ore] ; end
    field(:use_metal_ore, 132) {
        number 8, true, nil, BooleanEnum
    }
    field(:use_reaction_class, 133) {
        number 8, true, nil, BooleanEnum
    }
    field(:use_reaction_product, 134) {
        number 8, true, nil, BooleanEnum
    }
    field(:min_dimension, 136) {
        number 32, true, -1
    }
    field(:reaction_id, 140) {
        number 32, true, -1
    }
    def reaction_tg ; df.world.raws.reactions.reactions[reaction_id] ; end
    field(:contains, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:use_contains, 168) {
        number 8, true, nil, BooleanEnum
    }
    field(:has_tool_use, 170) {
        number 16, true, nil, ToolUses
    }
    field(:has_melee_skill, 172) {
        number 16, true, nil, JobSkill
    }
    field(:unk_v40_1, 174) {
        number 8, true
    }
    field(:pos, 176) {
        global :Coord
    }
    field(:unit, 184) {
        pointer {
            global :Unit
        }
    }
    field(:job, 192) {
        pointer {
            global :Job
        }
    }
    field(:building, 200) {
        pointer {
            global :Building
        }
    }
    field(:unk_74, 208) {
        pointer {
        }
    }
    field(:unk_v4305_1, 216) {
        number 32, true
    }
    field(:burrows, 224) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def burrows_tg ; burrows.map { |i| df.ui.burrows.list.binsearch(i) } ; end
    field(:use_burrows, 248) {
        number 8, true, nil, BooleanEnum
    }
    field(:take_from, 256) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :Building
                }
            }
        }
    }
end

class JobItemFlags1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:improvable, 0) { bit 0 }
    field(:butcherable, 0) { bit 1 }
    field(:millable, 0) { bit 2 }
    field(:allow_buryable, 0) { bit 3 }
    field(:unrotten, 0) { bit 4 }
    field(:undisturbed, 0) { bit 5 }
    field(:collected, 0) { bit 6 }
    field(:sharpenable, 0) { bit 7 }
    field(:murdered, 0) { bit 8 }
    field(:distillable, 0) { bit 9 }
    field(:empty, 0) { bit 10 }
    field(:processable, 0) { bit 11 }
    field(:bag, 0) { bit 12 }
    field(:cookable, 0) { bit 13 }
    field(:extract_bearing_plant, 0) { bit 14 }
    field(:extract_bearing_fish, 0) { bit 15 }
    field(:extract_bearing_vermin, 0) { bit 16 }
    field(:processable_to_vial, 0) { bit 17 }
    field(:processable_to_bag, 0) { bit 18 }
    field(:processable_to_barrel, 0) { bit 19 }
    field(:solid, 0) { bit 20 }
    field(:tameable_vermin, 0) { bit 21 }
    field(:nearby, 0) { bit 22 }
    field(:sand_bearing, 0) { bit 23 }
    field(:glass, 0) { bit 24 }
    field(:milk, 0) { bit 25 }
    field(:milkable, 0) { bit 26 }
    field(:finished_goods, 0) { bit 27 }
    field(:ammo, 0) { bit 28 }
    field(:furniture, 0) { bit 29 }
    field(:not_bin, 0) { bit 30 }
    field(:lye_bearing, 0) { bit 31 }
end

class JobItemFlags2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:dye, 0) { bit 0 }
    field(:dyeable, 0) { bit 1 }
    field(:dyed, 0) { bit 2 }
    field(:sewn_imageless, 0) { bit 3 }
    field(:glass_making, 0) { bit 4 }
    field(:screw, 0) { bit 5 }
    field(:building_material, 0) { bit 6 }
    field(:fire_safe, 0) { bit 7 }
    field(:magma_safe, 0) { bit 8 }
    field(:deep_material, 0) { bit 9 }
    field(:melt_designated, 0) { bit 10 }
    field(:non_economic, 0) { bit 11 }
    field(:allow_melt_dump, 0) { bit 12 }
    field(:allow_artifact, 0) { bit 13 }
    field(:plant, 0) { bit 14 }
    field(:silk, 0) { bit 15 }
    field(:leather, 0) { bit 16 }
    field(:bone, 0) { bit 17 }
    field(:shell, 0) { bit 18 }
    field(:totemable, 0) { bit 19 }
    field(:horn, 0) { bit 20 }
    field(:pearl, 0) { bit 21 }
    field(:plaster_containing, 0) { bit 22 }
    field(:soap, 0) { bit 24 }
    field(:body_part, 0) { bit 25 }
    field(:ivory_tooth, 0) { bit 26 }
    field(:lye_milk_free, 0) { bit 27 }
    field(:blunt, 0) { bit 28 }
    field(:unengraved, 0) { bit 29 }
    field(:hair_wool, 0) { bit 30 }
    field(:yarn, 0) { bit 31 }
end

class JobItemFlags3 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:unimproved, 0) { bit 0 }
    field(:any_raw_material, 0) { bit 1 }
    field(:non_absorbent, 0) { bit 2 }
    field(:non_pressed, 0) { bit 3 }
    field(:allow_liquid_powder, 0) { bit 4 }
    field(:any_craft, 0) { bit 5 }
    field(:hard, 0) { bit 6 }
    field(:food_storage, 0) { bit 7 }
    field(:metal, 0) { bit 8 }
    field(:sand, 0) { bit 9 }
    field(:written_on, 0) { bit 11 }
    field(:edged, 0) { bit 12 }
end

class JobItemRef < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :Item
        }
    }
    field(:role, 8) {
        class ::DFHack::JobItemRef_TRole < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Other ; NUME[:Other] = 0
            ENUM[1] = :Reagent ; NUME[:Reagent] = 1
            ENUM[2] = :Hauled ; NUME[:Hauled] = 2
            ENUM[3] = :LinkToTarget ; NUME[:LinkToTarget] = 3
            ENUM[4] = :LinkToTrigger ; NUME[:LinkToTrigger] = 4
            ENUM[6] = :TargetContainer ; NUME[:TargetContainer] = 6
            ENUM[7] = :QueuedContainer ; NUME[:QueuedContainer] = 7
            ENUM[8] = :PushHaulVehicle ; NUME[:PushHaulVehicle] = 8
        end

        number 32, true, nil, JobItemRef_TRole
    }
    field(:is_fetching, 12) {
        number 32, true
    }
    field(:job_item_idx, 16) {
        number 32, true
    }
end

class JobListLink < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :Job
        }
    }
    field(:prev, 8) {
        pointer {
            global :JobListLink
        }
    }
    field(:next, 16) {
        pointer {
            global :JobListLink
        }
    }
end

class JobMaterialCategory < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:plant, 0) { bit 0 }
    field(:wood, 0) { bit 1 }
    field(:cloth, 0) { bit 2 }
    field(:silk, 0) { bit 3 }
    field(:leather, 0) { bit 4 }
    field(:bone, 0) { bit 5 }
    field(:shell, 0) { bit 6 }
    field(:wood2, 0) { bit 7 }
    field(:soap, 0) { bit 8 }
    field(:tooth, 0) { bit 9 }
    field(:horn, 0) { bit 10 }
    field(:pearl, 0) { bit 11 }
    field(:yarn, 0) { bit 12 }
    field(:strand, 0) { bit 13 }
end

class KitchenPrefFlag < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:Cook, 0) { bit 0 }
    field(:Brew, 0) { bit 1 }
end

class KnowledgeScholarCategoryFlag < MemHack::Compound
    sizeof 8

    field(:flag_type, 0) {
        class ::DFHack::KnowledgeScholarCategoryFlag_TFlagType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Flags0 ; NUME[:Flags0] = 0
            ENUM[1] = :Flags1 ; NUME[:Flags1] = 1
            ENUM[2] = :Flags2 ; NUME[:Flags2] = 2
            ENUM[3] = :Flags3 ; NUME[:Flags3] = 3
            ENUM[4] = :Flags4 ; NUME[:Flags4] = 4
            ENUM[5] = :Flags5 ; NUME[:Flags5] = 5
            ENUM[6] = :Flags6 ; NUME[:Flags6] = 6
            ENUM[7] = :Flags7 ; NUME[:Flags7] = 7
            ENUM[8] = :Flags8 ; NUME[:Flags8] = 8
            ENUM[9] = :Flags9 ; NUME[:Flags9] = 9
            ENUM[10] = :Flags10 ; NUME[:Flags10] = 10
            ENUM[11] = :Flags11 ; NUME[:Flags11] = 11
            ENUM[12] = :Flags12 ; NUME[:Flags12] = 12
            ENUM[13] = :Flags13 ; NUME[:Flags13] = 13
        end

        number 32, true, nil, KnowledgeScholarCategoryFlag_TFlagType
    }
    field(:flag_data, 4) {
        compound(:KnowledgeScholarCategoryFlag_TFlagData) {
            field(:flags_0, 0) {
                global :KnowledgeScholarFlags0
            }
            field(:flags_1, 0) {
                global :KnowledgeScholarFlags1
            }
            field(:flags_2, 0) {
                global :KnowledgeScholarFlags2
            }
            field(:flags_3, 0) {
                global :KnowledgeScholarFlags3
            }
            field(:flags_4, 0) {
                global :KnowledgeScholarFlags4
            }
            field(:flags_5, 0) {
                global :KnowledgeScholarFlags5
            }
            field(:flags_6, 0) {
                global :KnowledgeScholarFlags6
            }
            field(:flags_7, 0) {
                global :KnowledgeScholarFlags7
            }
            field(:flags_8, 0) {
                global :KnowledgeScholarFlags8
            }
            field(:flags_9, 0) {
                global :KnowledgeScholarFlags9
            }
            field(:flags_10, 0) {
                global :KnowledgeScholarFlags10
            }
            field(:flags_11, 0) {
                global :KnowledgeScholarFlags11
            }
            field(:flags_12, 0) {
                global :KnowledgeScholarFlags12
            }
            field(:flags_13, 0) {
                global :KnowledgeScholarFlags13
            }
            field(:whole, 0) {
                number 32, false
            }
        }
    }
end

class KnowledgeScholarFlags0 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:philosophy_logic_formal_reasoning, 0) { bit 0 }
    field(:philosophy_logic_deductive_reasoning, 0) { bit 1 }
    field(:philosophy_logic_syllogistic_logic, 0) { bit 2 }
    field(:philosophy_logic_hypothetical_syllogisms, 0) { bit 3 }
    field(:philosophy_logic_propositional_logic, 0) { bit 4 }
    field(:philosophy_logic_dialectic_reasoning, 0) { bit 5 }
    field(:philosophy_logic_analogical_inference, 0) { bit 6 }
    field(:philosophy_ethics_applied_medical, 0) { bit 7 }
    field(:philosophy_ethics_individual_value, 0) { bit 8 }
    field(:philosophy_ethics_state_consequentialism, 0) { bit 9 }
    field(:philosophy_epistemology_truth, 0) { bit 10 }
    field(:philosophy_epistemology_perception, 0) { bit 11 }
    field(:philosophy_epistemology_justification, 0) { bit 12 }
    field(:philosophy_epistemology_belief, 0) { bit 13 }
    field(:philosophy_metaphysics_existence, 0) { bit 14 }
    field(:philosophy_metaphysics_time, 0) { bit 15 }
    field(:philosophy_metaphysics_mind_body, 0) { bit 16 }
    field(:philosophy_metaphysics_objects_and_properties, 0) { bit 17 }
    field(:philosophy_metaphysics_wholes_and_parts, 0) { bit 18 }
    field(:philosophy_metaphysics_events, 0) { bit 19 }
    field(:philosophy_metaphysics_processes, 0) { bit 20 }
    field(:philosophy_metaphysics_causation, 0) { bit 21 }
    field(:philosophy_ethics_applied_military, 0) { bit 22 }
    field(:philosophy_ethics_applied_interpersonal_conduct, 0) { bit 23 }
    field(:philosophy_specialized_law, 0) { bit 24 }
    field(:philosophy_specialized_education, 0) { bit 25 }
    field(:philosophy_specialized_language_grammar, 0) { bit 26 }
    field(:philosophy_specialized_language_etymology, 0) { bit 27 }
    field(:philosophy_specialized_politics_diplomacy, 0) { bit 28 }
    field(:philosophy_specialized_politics_government_forms, 0) { bit 29 }
    field(:philosophy_specialized_politics_economic_policy, 0) { bit 30 }
    field(:philosophy_specialized_politics_social_welfare, 0) { bit 31 }
end

class KnowledgeScholarFlags1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:philosophy_logic_inductive_reasoning, 0) { bit 0 }
    field(:philosophy_logic_direct_inference, 0) { bit 1 }
    field(:philosophy_aesthetics_nature_of_beauty, 0) { bit 2 }
    field(:philosophy_aesthetics_value_of_art, 0) { bit 3 }
    field(:philosophy_specialized_language_dictionary, 0) { bit 4 }
end

class KnowledgeScholarFlags10 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:medicine_method_surgery_ligature, 0) { bit 0 }
    field(:medicine_theory_surgical_models, 0) { bit 1 }
    field(:medicine_tool_mud_bags_as_surgical_models, 0) { bit 2 }
    field(:medicine_tool_plants_as_surgical_models, 0) { bit 3 }
    field(:medicine_tool_animals_as_surgical_models, 0) { bit 4 }
    field(:medicine_theory_specialized_surgical_instruments, 0) { bit 5 }
    field(:medicine_tool_forceps, 0) { bit 6 }
    field(:medicine_tool_scalpel, 0) { bit 7 }
    field(:medicine_tool_surgical_scissors, 0) { bit 8 }
    field(:medicine_tool_surgical_needles, 0) { bit 9 }
    field(:medicine_method_cataract_surgery, 0) { bit 10 }
    field(:medicine_method_cauterization, 0) { bit 11 }
    field(:medicine_method_anesthesia, 0) { bit 12 }
    field(:medicine_theory_pulmonary_medicine, 0) { bit 13 }
    field(:medicine_theory_anatomical_studies, 0) { bit 14 }
    field(:medicine_theory_classification_of_bodily_fluids, 0) { bit 15 }
    field(:medicine_theory_eye_anatomy, 0) { bit 16 }
    field(:medicine_theory_motor_vs_sensory_nerves, 0) { bit 17 }
    field(:medicine_theory_nervous_system_function, 0) { bit 18 }
    field(:medicine_theory_reaction_time, 0) { bit 19 }
    field(:medicine_theory_blood_vessels, 0) { bit 20 }
    field(:medicine_theory_pulmonary_circulation, 0) { bit 21 }
    field(:medicine_theory_comparative_anatomy, 0) { bit 22 }
    field(:medicine_theory_the_voice, 0) { bit 23 }
    field(:medicine_theory_classification_of_muscles, 0) { bit 24 }
    field(:medicine_theory_classification_of_mental_illnesses, 0) { bit 25 }
    field(:medicine_theory_treatment_of_mental_illnesses, 0) { bit 26 }
    field(:medicine_tool_dedicated_hospitals, 0) { bit 27 }
    field(:medicine_method_professional_hospital_staff, 0) { bit 28 }
    field(:medicine_method_specialized_wards, 0) { bit 29 }
    field(:medicine_method_hospital_lab, 0) { bit 30 }
    field(:medicine_method_medical_school, 0) { bit 31 }
end

class KnowledgeScholarFlags11 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:medicine_method_asylum_for_mentally_ill, 0) { bit 0 }
end

class KnowledgeScholarFlags12 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:engineering_horology_shadow_clock, 0) { bit 0 }
    field(:engineering_horology_water_clock, 0) { bit 1 }
    field(:engineering_horology_conical_water_clock, 0) { bit 2 }
    field(:engineering_horology_water_clock_reservoir, 0) { bit 3 }
    field(:engineering_horology_astrarium, 0) { bit 4 }
    field(:engineering_horology_hourglass, 0) { bit 5 }
    field(:engineering_horology_mechanical_clock, 0) { bit 6 }
    field(:engineering_machine_theory_of_pulley, 0) { bit 7 }
    field(:engineering_machine_pulley, 0) { bit 8 }
    field(:engineering_machine_theory_of_screw, 0) { bit 9 }
    field(:engineering_machine_screw, 0) { bit 10 }
    field(:engineering_machine_theory_of_wheel_and_axle, 0) { bit 11 }
    field(:engineering_machine_windlass, 0) { bit 12 }
    field(:engineering_machine_theory_of_wedge, 0) { bit 13 }
    field(:engineering_machine_theory_of_lever, 0) { bit 14 }
    field(:engineering_machine_lever, 0) { bit 15 }
    field(:engineering_machine_straight_beam_balance, 0) { bit 16 }
    field(:engineering_machine_theory_of_gears, 0) { bit 17 }
    field(:engineering_machine_warded_lock, 0) { bit 18 }
    field(:engineering_machine_tumbler_lock, 0) { bit 19 }
    field(:engineering_machine_padlock, 0) { bit 20 }
    field(:engineering_machine_camshaft, 0) { bit 21 }
    field(:engineering_machine_crankshaft, 0) { bit 22 }
    field(:engineering_machine_water_powered_sawmill, 0) { bit 23 }
    field(:engineering_machine_chariot_odometer, 0) { bit 24 }
    field(:engineering_machine_chain_drive, 0) { bit 25 }
    field(:engineering_machine_mechanical_compass, 0) { bit 26 }
    field(:engineering_machine_differential_gear, 0) { bit 27 }
    field(:engineering_machine_combination_lock, 0) { bit 28 }
    field(:engineering_machine_verge_escapement, 0) { bit 29 }
    field(:engineering_machine_balance_wheel, 0) { bit 30 }
    field(:engineering_fluid_theory_of_siphon, 0) { bit 31 }
end

class KnowledgeScholarFlags13 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:engineering_fluid_valves, 0) { bit 0 }
    field(:engineering_fluid_force_pump, 0) { bit 1 }
    field(:engineering_optics_crystal_lens, 0) { bit 2 }
    field(:engineering_optics_water_filled_spheres, 0) { bit 3 }
    field(:engineering_optics_glass_lens, 0) { bit 4 }
    field(:engineering_optics_camera_obscura, 0) { bit 5 }
    field(:engineering_optics_parabolic_mirror, 0) { bit 6 }
    field(:engineering_optics_theory_of_color, 0) { bit 7 }
    field(:engineering_optics_theory_of_rainbows, 0) { bit 8 }
    field(:engineering_optics_law_of_refraction, 0) { bit 9 }
    field(:engineering_design_models_and_templates, 0) { bit 10 }
    field(:engineering_construction_wood_lamination, 0) { bit 11 }
    field(:engineering_astronomy_dioptra, 0) { bit 12 }
    field(:engineering_astronomy_astrolabe, 0) { bit 13 }
    field(:engineering_astronomy_armillary_sphere, 0) { bit 14 }
    field(:engineering_astronomy_spherical_astrolabe, 0) { bit 15 }
    field(:engineering_astronomy_mural_instrument, 0) { bit 16 }
    field(:engineering_astronomy_orrery, 0) { bit 17 }
    field(:engineering_machine_water_powered_trip_hammer, 0) { bit 18 }
    field(:engineering_machine_double_acting_piston_bellows, 0) { bit 19 }
    field(:engineering_fluid_archimedes_principle, 0) { bit 20 }
    field(:engineering_optics_atmospheric_refraction, 0) { bit 21 }
    field(:engineering_optics_cause_of_twilight, 0) { bit 22 }
    field(:engineering_optics_height_of_atmosphere, 0) { bit 23 }
    field(:engineering_machine_piston, 0) { bit 24 }
    field(:engineering_machine_crank, 0) { bit 25 }
    field(:engineering_machine_bellows, 0) { bit 26 }
    field(:engineering_machine_water_powered_piston_bellows, 0) { bit 27 }
    field(:engineering_machine_water_wheel, 0) { bit 28 }
    field(:engineering_machine_trip_hammer, 0) { bit 29 }
end

class KnowledgeScholarFlags2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:mathematics_method_proof_by_contradiction, 0) { bit 0 }
    field(:mathematics_notation_zero, 0) { bit 1 }
    field(:mathematics_notation_negative_numbers, 0) { bit 2 }
    field(:mathematics_notation_large_numbers, 0) { bit 3 }
    field(:mathematics_notation_positional, 0) { bit 4 }
    field(:mathematics_geometry_basic_objects, 0) { bit 5 }
    field(:mathematics_method_exhaustion, 0) { bit 6 }
    field(:mathematics_geometry_similar_and_congruent_triangles, 0) { bit 7 }
    field(:mathematics_geometry_geometric_mean_theorem, 0) { bit 8 }
    field(:mathematics_geometry_isosceles_base_angles_equal, 0) { bit 9 }
    field(:mathematics_geometry_inscribed_triangle_on_diameter_is_right, 0) { bit 10 }
    field(:mathematics_geometry_pythagorean_theorem, 0) { bit 11 }
    field(:mathematics_geometry_pythagorean_triples_small, 0) { bit 12 }
    field(:mathematics_geometry_pythagorean_triples_3_digit, 0) { bit 13 }
    field(:mathematics_geometry_pythagorean_triples_4_digit, 0) { bit 14 }
    field(:mathematics_geometry_existence_of_incommensurable_ratios, 0) { bit 15 }
    field(:mathematics_method_axiomatic_reasoning, 0) { bit 16 }
    field(:mathematics_numbers_unique_prime_factorization, 0) { bit 17 }
    field(:mathematics_numbers_algorithm_for_computing_gcd, 0) { bit 18 }
    field(:mathematics_geometry_volume_of_pyramid, 0) { bit 19 }
    field(:mathematics_geometry_volume_of_cone, 0) { bit 20 }
    field(:mathematics_geometry_volume_of_sphere, 0) { bit 21 }
    field(:mathematics_geometry_pi_to_4_digits, 0) { bit 22 }
    field(:mathematics_numbers_division_algorithm, 0) { bit 23 }
    field(:mathematics_geometry_table_of_chord_values, 0) { bit 24 }
    field(:mathematics_geometry_area_of_triangle_from_side_lengths, 0) { bit 25 }
    field(:mathematics_geometry_area_of_circle, 0) { bit 26 }
    field(:mathematics_geometry_pi_to_6_digits, 0) { bit 27 }
    field(:mathematics_geometry_definitions_and_basic_properties_of_conic_sections, 0) { bit 28 }
    field(:mathematics_numbers_chinese_remainder_algorithm, 0) { bit 29 }
    field(:mathematics_geometry_area_enclosed_by_line_and_parabola, 0) { bit 30 }
    field(:mathematics_numbers_sieve_algorithm_for_primes, 0) { bit 31 }
end

class KnowledgeScholarFlags3 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:mathematics_numbers_root_2_to_5_digits, 0) { bit 0 }
    field(:mathematics_numbers_infinite_primes, 0) { bit 1 }
    field(:mathematics_numbers_root_2_irrational, 0) { bit 2 }
    field(:mathematics_geometry_surface_area_of_sphere, 0) { bit 3 }
    field(:mathematics_algebra_finite_summation_formulas, 0) { bit 4 }
    field(:mathematics_algebra_solving_linear_systems, 0) { bit 5 }
    field(:mathematics_algebra_balancing_and_completion, 0) { bit 6 }
    field(:mathematics_algebra_quadratic_by_completing_square, 0) { bit 7 }
    field(:mathematics_algebra_quadratic_formula, 0) { bit 8 }
    field(:mathematics_notation_syncopated_algebra, 0) { bit 9 }
    field(:mathematics_geometry_law_of_sines, 0) { bit 10 }
    field(:mathematics_geometry_angle_sum_difference_trig_identities, 0) { bit 11 }
    field(:mathematics_algebra_pascals_triangle, 0) { bit 12 }
    field(:mathematics_algebra_solving_higher_order_polynomials, 0) { bit 13 }
    field(:mathematics_notation_early_symbols_for_operations, 0) { bit 14 }
    field(:mathematics_algebra_divergence_of_harmonic_series, 0) { bit 15 }
    field(:mathematics_geometry_properties_of_chords, 0) { bit 16 }
end

class KnowledgeScholarFlags4 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:history_sourcing_basic_reliability, 0) { bit 0 }
    field(:history_sourcing_role_of_systemic_bias, 0) { bit 1 }
    field(:history_sourcing_role_of_state_bias_and_propaganda, 0) { bit 2 }
    field(:history_sourcing_personal_interviews, 0) { bit 3 }
    field(:history_theory_historical_causation, 0) { bit 4 }
    field(:history_theory_historical_cycles, 0) { bit 5 }
    field(:history_theory_social_cohesion, 0) { bit 6 }
    field(:history_theory_social_conflict, 0) { bit 7 }
    field(:history_form_biography, 0) { bit 8 }
    field(:history_form_comparative_biography, 0) { bit 9 }
    field(:history_form_biographical_dictionaries, 0) { bit 10 }
    field(:history_form_autobiographical_adventure, 0) { bit 11 }
    field(:history_form_genealogy, 0) { bit 12 }
    field(:history_form_encyclopedia, 0) { bit 13 }
    field(:history_form_cultural_history, 0) { bit 14 }
    field(:history_form_cultural_comparison, 0) { bit 15 }
    field(:history_sourcing_role_of_cultural_differences, 0) { bit 16 }
    field(:history_form_alternate_history, 0) { bit 17 }
    field(:history_sourcing_basic_archaeology, 0) { bit 18 }
    field(:history_form_treatise_on_tech_evolution, 0) { bit 19 }
end

class KnowledgeScholarFlags5 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:astronomy_phases_of_the_moon, 0) { bit 0 }
    field(:astronomy_summer_winter_moon, 0) { bit 1 }
    field(:astronomy_path_of_the_moon, 0) { bit 2 }
    field(:astronomy_tides_and_the_moon, 0) { bit 3 }
    field(:astronomy_height_of_tides_vs_moon_and_sun, 0) { bit 4 }
    field(:astronomy_summer_winter_sun, 0) { bit 5 }
    field(:astronomy_relationship_between_lunar_solar_year, 0) { bit 6 }
    field(:astronomy_daylight_variation_with_solar_year, 0) { bit 7 }
    field(:astronomy_geocentric_model, 0) { bit 8 }
    field(:astronomy_heliocentric_model, 0) { bit 9 }
    field(:astronomy_dates_of_lunar_and_solar_eclipses, 0) { bit 10 }
    field(:astronomy_star_charts, 0) { bit 11 }
    field(:astronomy_star_catalogues_100, 0) { bit 12 }
    field(:astronomy_star_catalogues_1000, 0) { bit 13 }
    field(:astronomy_star_color_classification, 0) { bit 14 }
    field(:astronomy_star_magnitude_classification, 0) { bit 15 }
    field(:astronomy_shape_of_the_world, 0) { bit 16 }
    field(:astronomy_precession_of_equinoxes, 0) { bit 17 }
    field(:astronomy_method_empirical_observation, 0) { bit 18 }
    field(:astronomy_method_path_models, 0) { bit 19 }
end

class KnowledgeScholarFlags6 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:naturalist_method_dissection, 0) { bit 0 }
    field(:naturalist_observation_anatomy, 0) { bit 1 }
    field(:naturalist_theory_comparative_anatomy, 0) { bit 2 }
    field(:naturalist_theory_classification_by_physical_features, 0) { bit 3 }
    field(:naturalist_observation_migration_patterns, 0) { bit 4 }
    field(:naturalist_observation_reproductive_behavior, 0) { bit 5 }
    field(:naturalist_observation_foraging_behavior_and_diet, 0) { bit 6 }
    field(:naturalist_theory_food_chain, 0) { bit 7 }
    field(:naturalist_observation_social_behavior, 0) { bit 8 }
    field(:naturalist_observation_diseases, 0) { bit 9 }
    field(:naturalist_theory_climactic_adaptation, 0) { bit 10 }
    field(:naturalist_observation_embriological_development, 0) { bit 11 }
    field(:naturalist_theory_struggle_for_existence, 0) { bit 12 }
end

class KnowledgeScholarFlags7 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:chemistry_classification_combustibles, 0) { bit 0 }
    field(:chemistry_classification_ores, 0) { bit 1 }
    field(:chemistry_metallurgy_alloys, 0) { bit 2 }
    field(:chemistry_classification_scratch_test, 0) { bit 3 }
    field(:chemistry_classification_elemental_theory, 0) { bit 4 }
    field(:chemistry_chemicals_adhesives, 0) { bit 5 }
    field(:chemistry_laboratory_blast_furnace, 0) { bit 6 }
    field(:chemistry_laboratory_alembic, 0) { bit 7 }
    field(:chemistry_laboratory_theory_of_liquid_liquid_extraction, 0) { bit 8 }
    field(:chemistry_laboratory_theory_of_distillation, 0) { bit 9 }
    field(:chemistry_laboratory_theory_of_evaporation, 0) { bit 10 }
    field(:chemistry_classification_alkali_and_acids, 0) { bit 11 }
    field(:chemistry_laboratory_systematic_experiments, 0) { bit 12 }
    field(:chemistry_laboratory_glass_flask, 0) { bit 13 }
    field(:chemistry_laboratory_glass_beaker, 0) { bit 14 }
    field(:chemistry_laboratory_glass_vial, 0) { bit 15 }
    field(:chemistry_laboratory_glass_funnel, 0) { bit 16 }
    field(:chemistry_laboratory_crucible, 0) { bit 17 }
    field(:chemistry_chemicals_nitric_acid, 0) { bit 18 }
    field(:chemistry_chemicals_sulfuric_acid, 0) { bit 19 }
    field(:chemistry_chemicals_aqua_regia, 0) { bit 20 }
    field(:chemistry_laboratory_glass_ampoule, 0) { bit 21 }
    field(:chemistry_laboratory_glass_retort, 0) { bit 22 }
    field(:chemistry_laboratory_lab_ovens, 0) { bit 23 }
end

class KnowledgeScholarFlags8 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:geography_surveying_basic, 0) { bit 0 }
    field(:geography_surveying_staff, 0) { bit 1 }
    field(:geography_cartography_basic, 0) { bit 2 }
    field(:geography_surveying_triangulation, 0) { bit 3 }
    field(:geography_surveying_cartographical, 0) { bit 4 }
    field(:geography_surveying_land, 0) { bit 5 }
    field(:geography_surveying_military, 0) { bit 6 }
    field(:geography_surveying_engineering, 0) { bit 7 }
    field(:geography_cartography_geological, 0) { bit 8 }
    field(:geography_cartography_grid_system, 0) { bit 9 }
    field(:geography_cartography_distance_scale, 0) { bit 10 }
    field(:geography_cartography_height_measurements, 0) { bit 11 }
    field(:geography_method_economic_data_collection, 0) { bit 12 }
    field(:geography_cartography_economic, 0) { bit 13 }
    field(:geography_form_atlas, 0) { bit 14 }
    field(:geography_theory_delta_formation, 0) { bit 15 }
    field(:geography_theory_wind_patterns, 0) { bit 16 }
    field(:geography_theory_origin_of_rainfall_from_evap_condense, 0) { bit 17 }
    field(:geography_theory_water_cycle, 0) { bit 18 }
    field(:geography_theory_latitude_climate_zones, 0) { bit 19 }
    field(:geography_cartography_accurate_maps, 0) { bit 20 }
    field(:geography_cartography_map_projections, 0) { bit 21 }
end

class KnowledgeScholarFlags9 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:medicine_theory_disease_and_fouled_water, 0) { bit 0 }
    field(:medicine_method_physical_examination, 0) { bit 1 }
    field(:medicine_method_autopsy, 0) { bit 2 }
    field(:medicine_theory_prognosis, 0) { bit 3 }
    field(:medicine_tool_herbal_remedies, 0) { bit 4 }
    field(:medicine_tool_animal_remedies, 0) { bit 5 }
    field(:medicine_tool_mineral_remedies, 0) { bit 6 }
    field(:medicine_tool_bandages, 0) { bit 7 }
    field(:medicine_theory_disease_classification, 0) { bit 8 }
    field(:medicine_theory_toxicology, 0) { bit 9 }
    field(:medicine_theory_acute_and_chronic_conditions, 0) { bit 10 }
    field(:medicine_theory_endemic_disease, 0) { bit 11 }
    field(:medicine_theory_epidemic_disease, 0) { bit 12 }
    field(:medicine_theory_exacerbation, 0) { bit 13 }
    field(:medicine_theory_paroxysm, 0) { bit 14 }
    field(:medicine_theory_relapse, 0) { bit 15 }
    field(:medicine_theory_convalescence, 0) { bit 16 }
    field(:medicine_method_treatment_of_traumatic_injuries, 0) { bit 17 }
    field(:medicine_method_fracture_treatment, 0) { bit 18 }
    field(:medicine_theory_fracture_classification, 0) { bit 19 }
    field(:medicine_tool_traction_bench, 0) { bit 20 }
    field(:medicine_method_fracture_immobilization, 0) { bit 21 }
    field(:medicine_tool_orthopedic_cast, 0) { bit 22 }
    field(:medicine_method_surgery_excision, 0) { bit 23 }
    field(:medicine_method_surgery_incision, 0) { bit 24 }
    field(:medicine_method_hernia_surgery, 0) { bit 25 }
    field(:medicine_method_tracheotomy_surgery, 0) { bit 26 }
    field(:medicine_method_lithotomy_surgery, 0) { bit 27 }
    field(:medicine_method_surgery_scraping, 0) { bit 28 }
    field(:medicine_method_surgery_draining, 0) { bit 29 }
    field(:medicine_method_surgery_probing, 0) { bit 30 }
    field(:medicine_method_surgery_suturing, 0) { bit 31 }
end

class LanguageName < MemHack::Compound
    sizeof 120

    field(:first_name, 0) {
        stl_string
    }
    field(:nickname, 32) {
        stl_string
    }
    field(:words, 64) {
        static_array(7, 4, LanguageNameComponent) {
            number 32, true, -1
        }
    }
    field(:parts_of_speech, 92) {
        static_array(7, 2, LanguageNameComponent) {
            number 16, true, nil, PartOfSpeech
        }
    }
    field(:language, 108) {
        number 32, true, -1
    }
    def language_tg ; df.world.raws.language.translations[language] ; end
    field(:type, 112) {
        number 16, true, nil, LanguageNameType
    }
    field(:has_name, 114) {
        number 8, true, nil, BooleanEnum
    }
end

class LanguageSymbol < MemHack::Compound
    sizeof 112

    field(:name, 0) {
        stl_string
    }
    field(:unknown, 32) {
        stl_vector
    }
    field(:words, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def words_tg ; words.map { |i| df.world.raws.language.words[i] } ; end
    field(:flags, 80) {
        number 32, true
    }
    field(:str, 88) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class LanguageTranslation < MemHack::Compound
    sizeof 136

    field(:name, 0) {
        stl_string
    }
    field(:unknown1, 32) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unknown2, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:words, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:flags, 104) {
        number 32, true
    }
    field(:str, 112) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class LanguageWord < MemHack::Compound
    sizeof 360

    field(:word, 0) {
        stl_string
    }
    field(:forms, 32) {
        static_array(9, 32, PartOfSpeech) {
            stl_string
        }
    }
    field(:adj_dist, 320) {
        number 8, false
    }
    field(:pad_1, 321) {
    }
    field(:flags, 328) {
        global :LanguageWordFlags
    }
    field(:str, 336) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class LanguageWordFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:front_compound_noun_sing, 0) { bit 0 }
    field(:front_compound_noun_plur, 0) { bit 1 }
    field(:front_compound_adj, 0) { bit 2 }
    field(:front_compound_prefix, 0) { bit 3 }
    field(:rear_compound_noun_sing, 0) { bit 4 }
    field(:rear_compound_noun_plur, 0) { bit 5 }
    field(:rear_compound_adj, 0) { bit 6 }
    field(:the_noun_sing, 0) { bit 7 }
    field(:the_noun_plur, 0) { bit 8 }
    field(:the_compound_noun_sing, 0) { bit 9 }
    field(:the_compound_noun_plur, 0) { bit 10 }
    field(:the_compound_adj, 0) { bit 11 }
    field(:the_compound_prefix, 0) { bit 12 }
    field(:of_noun_sing, 0) { bit 13 }
    field(:of_noun_plur, 0) { bit 14 }
    field(:standard_verb, 0) { bit 15 }
end

class LanguageWordTable < MemHack::Compound
    sizeof 288

    field(:words, 0) {
        static_array(6, 24) {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:parts, 144) {
        static_array(6, 24) {
            stl_vector(4) {
                number 32, true, nil, PartOfSpeech
            }
        }
    }
end

class LargeInteger < MemHack::Compound
    sizeof 8

    field(:low_part, 0) {
        number 4, true
    }
    field(:high_part, 4) {
        number 4, true
    }
    field(:u, 8) {
        compound(:LargeInteger_TU) {
            field(:low_part, 0) {
                number 4, true
            }
            field(:high_part, 4) {
                number 4, true
            }
        }
    }
    field(:quad_part, 8) {
        number 64, true
    }
end

class LayerObject < MemHack::Compound
    sizeof 16

    rtti_classname :layer_objectst

    field(:enabled, 8) {
        number 8, true, nil, BooleanEnum
    }
    field(:active, 9) {
        number 8, true, nil, BooleanEnum
    }
    def getFirstVisible()
        val = DFHack.vmethod_call(self, 0)
    end
    def getLastVisible()
        val = DFHack.vmethod_call(self, 8)
    end
    def getX1()
        val = DFHack.vmethod_call(self, 16)
    end
    def getY1()
        val = DFHack.vmethod_call(self, 24)
    end
    def getX2()
        val = DFHack.vmethod_call(self, 32)
    end
    def getY2()
        val = DFHack.vmethod_call(self, 40)
    end
    def getListCursor()
        val = DFHack.vmethod_call(self, 56)
    end
    def setListCursor(arg0)
        DFHack.vmethod_call(self, 64, arg0) ; nil
    end
    def feed(events)
        DFHack.vmethod_call(self, 72, events) ; nil
    end
    def isSetMouseLRCur()
        val = DFHack.vmethod_call(self, 80)
        (val & 1) != 0
    end
    def isSetMouseLCur()
        val = DFHack.vmethod_call(self, 88)
        (val & 1) != 0
    end
    def isSetMouseRCur()
        val = DFHack.vmethod_call(self, 96)
        (val & 1) != 0
    end
    def getMouseLCur()
        val = DFHack.vmethod_call(self, 104)
    end
    def getMouseRCur()
        val = DFHack.vmethod_call(self, 112)
    end
    def getMouseLClickPos(x, y)
        DFHack.vmethod_call(self, 120, x, y) ; nil
    end
    def getMouseRClickPos(x, y)
        DFHack.vmethod_call(self, 128, x, y) ; nil
    end
    def getListLength()
        val = DFHack.vmethod_call(self, 136)
    end
    def setListLength(arg0)
        DFHack.vmethod_call(self, 144, arg0) ; nil
    end
    def getMouseX()
        val = DFHack.vmethod_call(self, 152)
    end
    def getMouseY()
        val = DFHack.vmethod_call(self, 160)
    end
    def getMouseXOld()
        val = DFHack.vmethod_call(self, 168)
    end
    def getMouseYOld()
        val = DFHack.vmethod_call(self, 176)
    end
end

class LayerObjectButtonst < LayerObject
    sizeof 80

    rtti_classname :layer_object_buttonst

    field(:x1, 16) {
        number 32, true
    }
    field(:y1, 20) {
        number 32, true
    }
    field(:x2, 24) {
        number 32, true
    }
    field(:y2, 28) {
        number 32, true
    }
    field(:has_mouse_lclick, 32) {
        number 32, true
    }
    field(:has_mouse_rclick, 36) {
        number 32, true
    }
    field(:mouse_lclick_x, 40) {
        number 32, true
    }
    field(:mouse_lclick_y, 44) {
        number 32, true
    }
    field(:mouse_rclick_x, 48) {
        number 32, true
    }
    field(:mouse_rclick_y, 52) {
        number 32, true
    }
    field(:mouse_x, 56) {
        number 32, true
    }
    field(:mouse_y, 60) {
        number 32, true
    }
    field(:mouse_x_old, 64) {
        number 32, true
    }
    field(:mouse_y_old, 68) {
        number 32, true
    }
    field(:handle_mouselbtndown, 72) {
        number 8, true
    }
    field(:handle_mouserbtndown, 73) {
        number 8, true
    }
end

class LayerObjectListst < LayerObject
    sizeof 72

    rtti_classname :layer_object_listst

    field(:cursor, 16) {
        number 32, true
    }
    field(:num_entries, 20) {
        number 32, true
    }
    field(:x1, 24) {
        number 32, true
    }
    field(:y1, 28) {
        number 32, true
    }
    field(:page_size, 32) {
        number 32, true
    }
    field(:x2, 36) {
        number 32, true
    }
    field(:y2, 40) {
        number 32, true
    }
    field(:mouse_l_cur, 44) {
        number 32, true
    }
    field(:mouse_r_cur, 48) {
        number 32, true
    }
    field(:rclick_scrolls, 52) {
        number 8, true, nil, BooleanEnum
    }
    field(:flag, 56) {
        number 32, true
    }
    field(:key_lclick, 60) {
        number 32, true, nil, InterfaceKey
    }
    field(:key_rclick, 64) {
        number 32, true, nil, InterfaceKey
    }
end

class LoadgameSaveInfo < MemHack::Compound
    sizeof 272

    field(:next_ids, 0) {
        static_array(41, 4, NextGlobalId) {
            number 32, true
        }
    }
    field(:game_type, 164) {
        number 16, true, nil, GameType
    }
    field(:fort_name, 168) {
        stl_string
    }
    field(:world_name, 200) {
        stl_string
    }
    field(:year, 232) {
        number 32, true
    }
    field(:folder_name, 240) {
        stl_string
    }
end

class LocalPopulation < MemHack::Compound
    sizeof 56

    field(:type, 0) {
        number 8, true, nil, WorldPopulationType
    }
    field(:race, 2) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:plant, 2) {
        number 16, true, -1
    }
    def plant_tg ; df.world.raws.plants.all[plant] ; end
    field(:quantity, 4) {
        number 32, true
    }
    field(:quantity2, 8) {
        number 32, true
    }
    field(:flags, 12) {
        compound(:LocalPopulation_TFlags) {
            field(:_whole, 0) {
                number 8, false
            }
            field(:discovered, 0) { bit 0 }
            field(:extinct, 0) { bit 1 }
            field(:already_removed, 0) { bit 2 }
            field(:unk3, 0) { bit 3 }
        }
    }
    field(:population, 16) {
        global :WorldPopulationRef
    }
    field(:wp_unk_10, 40) {
        number 32, true, -1
    }
    field(:wp_unk_18, 44) {
        number 32, true, -1
    }
    field(:wp_unk_1c, 48) {
        number 32, true, -1
    }
    field(:unk_v47_1, 52) {
        number 32, true, -1
    }
end

class LocationScribeJobs < MemHack::Compound
    sizeof 48

    field(:scribejobs, 0) {
        stl_vector(8) {
            pointer {
                global :Scribejob
            }
        }
    }
    field(:nextidmaybe, 24) {
        number 32, true
    }
    field(:year, 28) {
        number 32, true
    }
    field(:unk_1, 32) {
        number 16, false
    }
    field(:unk_2, 34) {
        number 16, true
    }
    field(:unk_3, 36) {
        number 32, true
    }
    field(:unk_4, 40) {
        number 32, true
    }
    field(:unk_5, 44) {
        number 32, true
    }
end

class Machine < MemHack::Compound
    sizeof 64

    rtti_classname :machinest

    field(:x, 8) {
        number 32, true
    }
    field(:y, 12) {
        number 32, true
    }
    field(:z, 16) {
        number 32, true
    }
    field(:id, 20) {
        number 32, true
    }
    field(:components, 24) {
        stl_vector(8) {
            pointer {
                compound(:Machine_TComponents) {
                    sizeof 32

                    field(:building_id, 0) {
                        number 32, true, -1
                    }
                    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
                    field(:connections, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:cur_power, 48) {
        number 32, true
    }
    field(:min_power, 52) {
        number 32, true
    }
    field(:visual_phase, 56) {
        number 8, true
    }
    field(:phase_timer, 58) {
        number 16, true
    }
    field(:flags, 60) {
        compound(:Machine_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:active, 0) { bit 0 }
            field(:frozen, 0) { bit 1 }
            field(:unfreeze, 0) { bit 2 }
        }
    }
    def getType()
        MachineType.sym(DFHack.vmethod_call(self, 0))
    end
    def moveMachine(x, y, z)
        DFHack.vmethod_call(self, 8, x, y, z) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
end

class MachineConnModes < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:up, 0) { bit 0 }
    field(:down, 0) { bit 1 }
    field(:right, 0) { bit 2 }
    field(:left, 0) { bit 3 }
    field(:z_up, 0) { bit 4 }
    field(:z_down, 0) { bit 5 }
end

class MachineHandler < MemHack::Compound
    sizeof 56

    rtti_classname :machine_handlerst

    field(:all, 8) {
        stl_vector(8) {
            pointer {
                global :Machine
            }
        }
    }
    field(:bad, 32) {
        stl_vector(8) {
            pointer {
                global :Machine
            }
        }
    }
end

class MachineInfo < MemHack::Compound
    sizeof 8

    field(:machine_id, 0) {
        number 32, true, -1
    }
    def machine_tg ; df.world.machines.all.binsearch(machine_id) ; end
    field(:flags, 4) {
        compound(:MachineInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:frozen, 0) { bit 0 }
        }
    }
end

class MachineStandardst < Machine
    sizeof 64

    rtti_classname :machine_standardst

end

class MachineTileSet < MemHack::Compound
    sizeof 96

    field(:tiles, 0) {
        global :CoordPath
    }
    field(:can_connect, 72) {
        stl_vector(1) {
            global :MachineConnModes
        }
    }
end

class ManagerOrder < MemHack::Compound
    sizeof 168

    field(:id, 0) {
        number 32, true
    }
    field(:job_type, 4) {
        number 16, true, nil, JobType
    }
    field(:item_type, 6) {
        number 16, true, :NONE, ItemType
    }
    field(:item_subtype, 8) {
        number 16, true, -1
    }
    field(:reaction_name, 16) {
        stl_string
    }
    field(:mat_type, 48) {
        number 16, true, -1
    }
    field(:mat_index, 52) {
        number 32, true, -1
    }
    field(:item_category, 56) {
        global :StockpileGroupSet
    }
    field(:hist_figure_id, 60) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:material_category, 64) {
        global :JobMaterialCategory
    }
    field(:art_spec, 68) {
        global :JobArtSpecification
    }
    field(:amount_left, 80) {
        number 16, true
    }
    field(:amount_total, 82) {
        number 16, true
    }
    field(:status, 84) {
        global :ManagerOrderStatus
    }
    field(:frequency, 88) {
        class ::DFHack::ManagerOrder_TFrequency < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :OneTime ; NUME[:OneTime] = 0
            ENUM[1] = :Daily ; NUME[:Daily] = 1
            ENUM[2] = :Monthly ; NUME[:Monthly] = 2
            ENUM[3] = :Seasonally ; NUME[:Seasonally] = 3
            ENUM[4] = :Yearly ; NUME[:Yearly] = 4
        end

        number 32, true, nil, ManagerOrder_TFrequency
    }
    field(:finished_year, 92) {
        number 32, true, -1
    }
    field(:finished_year_tick, 96) {
        number 32, true, -1
    }
    field(:workshop_id, 100) {
        number 32, true, -1
    }
    def workshop_tg ; df.world.buildings.all.binsearch(workshop_id) ; end
    field(:max_workshops, 104) {
        number 32, true
    }
    field(:item_conditions, 112) {
        stl_vector(8) {
            pointer {
                global :ManagerOrderConditionItem
            }
        }
    }
    field(:order_conditions, 136) {
        stl_vector(8) {
            pointer {
                global :ManagerOrderConditionOrder
            }
        }
    }
    field(:items, 160) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :JobItem
                }
            }
        }
    }
end

class ManagerOrderConditionItem < MemHack::Compound
    sizeof 144

    field(:compare_type, 0) {
        class ::DFHack::ManagerOrderConditionItem_TCompareType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :AtLeast ; NUME[:AtLeast] = 0
            ENUM[1] = :AtMost ; NUME[:AtMost] = 1
            ENUM[2] = :GreaterThan ; NUME[:GreaterThan] = 2
            ENUM[3] = :LessThan ; NUME[:LessThan] = 3
            ENUM[4] = :Exactly ; NUME[:Exactly] = 4
            ENUM[5] = :Not ; NUME[:Not] = 5
        end

        number 32, true, nil, ManagerOrderConditionItem_TCompareType
    }
    field(:compare_val, 4) {
        number 32, true
    }
    field(:item_type, 8) {
        number 16, true, :NONE, ItemType
    }
    field(:item_subtype, 10) {
        number 16, true, -1
    }
    field(:mat_type, 12) {
        number 16, true, -1
    }
    field(:mat_index, 16) {
        number 32, true, -1
    }
    field(:flags1, 20) {
        global :JobItemFlags1
    }
    field(:flags2, 24) {
        global :JobItemFlags2
    }
    field(:flags3, 28) {
        global :JobItemFlags3
    }
    field(:flags4, 32) {
        number 32, false
    }
    field(:flags5, 36) {
        number 32, false
    }
    field(:reaction_class, 40) {
        stl_string
    }
    field(:has_material_reaction_product, 72) {
        stl_string
    }
    field(:inorganic_bearing, 104) {
        number 32, true, -1
    }
    def inorganic_bearing_tg ; df.world.raws.inorganics[inorganic_bearing] ; end
    field(:min_dimension, 108) {
        number 32, true, -1
    }
    field(:contains, 112) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:reaction_id, 136) {
        number 32, true, -1
    }
    def reaction_tg ; df.world.raws.reactions.reactions[reaction_id] ; end
    field(:has_tool_use, 140) {
        number 16, true, nil, ToolUses
    }
end

class ManagerOrderConditionOrder < MemHack::Compound
    sizeof 12

    field(:order_id, 0) {
        number 32, true, -1
    }
    field(:condition, 4) {
        class ::DFHack::ManagerOrderConditionOrder_TCondition < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Activated ; NUME[:Activated] = 0
            ENUM[1] = :Completed ; NUME[:Completed] = 1
        end

        number 32, true, :Completed, ManagerOrderConditionOrder_TCondition
    }
    field(:unk_1, 8) {
        number 32, true
    }
end

class ManagerOrderStatus < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:validated, 0) { bit 0 }
    field(:active, 0) { bit 1 }
end

class ManagerOrderTemplate < MemHack::Compound
    sizeof 72

    field(:job_type, 0) {
        number 16, true, nil, JobType
    }
    field(:reaction_name, 8) {
        stl_string
    }
    field(:item_type, 40) {
        number 16, true, :NONE, ItemType
    }
    field(:item_subtype, 42) {
        number 16, true, -1
    }
    field(:mat_type, 44) {
        number 16, true, -1
    }
    field(:mat_index, 48) {
        number 32, true
    }
    field(:item_category, 52) {
        global :StockpileGroupSet
    }
    field(:hist_figure_id, 56) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:material_category, 60) {
        global :JobMaterialCategory
    }
    field(:unk_1, 64) {
        number 32, true, 1
    }
end

class Mandate < MemHack::Compound
    sizeof 56

    field(:unit, 0) {
        pointer {
            global :Unit
        }
    }
    field(:mode, 8) {
        class ::DFHack::Mandate_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Export ; NUME[:Export] = 0
            ENUM[1] = :Make ; NUME[:Make] = 1
            ENUM[2] = :Guild ; NUME[:Guild] = 2
        end

        number 16, true, nil, Mandate_TMode
    }
    field(:item_type, 10) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 12) {
        number 16, true, -1
    }
    field(:mat_type, 14) {
        number 16, true, -1
    }
    field(:mat_index, 16) {
        number 32, true
    }
    field(:amount_total, 20) {
        number 16, true
    }
    field(:amount_remaining, 22) {
        number 16, true
    }
    field(:timeout_counter, 24) {
        number 32, true
    }
    field(:timeout_limit, 28) {
        number 32, true
    }
    field(:punishment, 32) {
        compound(:Mandate_TPunishment) {
            field(:hammerstrikes, 0) {
                number 32, true
            }
            field(:prison_time, 4) {
                number 32, true
            }
            field(:give_beating, 8) {
                number 32, true
            }
        }
    }
    field(:punish_multiple, 44) {
        number 8, false
    }
    field(:unk4, 48) {
        number 32, true
    }
end

class MapBlock < MemHack::Compound
    sizeof 7584

    field(:flags, 0) {
        global :BlockFlags
    }
    field(:block_events, 8) {
        stl_vector(8) {
            pointer {
                global :BlockSquareEvent
            }
        }
    }
    field(:block_burrows, 32) {
        df_linked_list {
            global :BlockBurrowLink
        }
    }
    field(:local_feature, 56) {
        number 32, true, -1
    }
    field(:global_feature, 60) {
        number 32, true, -1
    }
    def global_feature_tg ; df.world.world_data.underground_regions[global_feature] ; end
    field(:unk2, 64) {
        number 32, true, -1
    }
    field(:layer_depth, 68) {
        number 16, true
    }
    field(:dsgn_check_cooldown, 72) {
        number 32, true
    }
    field(:default_liquid, 76) {
        global :TileDesignation
    }
    field(:items, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def items_tg ; items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:flows, 104) {
        stl_vector(8) {
            pointer {
                global :FlowInfo
            }
        }
    }
    field(:flow_pool, 128) {
        global :FlowReusePool
    }
    field(:map_pos, 136) {
        global :Coord
    }
    field(:region_pos, 142) {
        global :Coord2d
    }
    field(:tiletype, 146) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, true, :OpenSpace, Tiletype
            }
        }
    }
    field(:designation, 660) {
        static_array(16, 64) {
            static_array(16, 4) {
                global :TileDesignation
            }
        }
    }
    field(:occupancy, 1684) {
        static_array(16, 64) {
            static_array(16, 4) {
                global :TileOccupancy
            }
        }
    }
    field(:fog_of_war, 2708) {
        static_array(16, 16) {
            static_array(16, 1) {
                number 8, false
            }
        }
    }
    field(:path_cost, 2964) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, true
            }
        }
    }
    field(:path_tag, 3988) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:walkable, 4500) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:map_edge_distance, 5012) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:temperature_1, 5524) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:temperature_2, 6036) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:unk13, 6548) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, false
            }
        }
    }
    field(:liquid_flow, 7060) {
        static_array(16, 32) {
            static_array(16, 2) {
                global :TileLiquidFlow
            }
        }
    }
    field(:region_offset, 7572) {
        static_array(9, 1) {
            number 8, false
        }
    }
end

class MapBlockColumn < MemHack::Compound
    sizeof 6784

    field(:sink_level, 0) {
        number 16, true
    }
    field(:beach_level, 2) {
        number 16, true
    }
    field(:ground_level, 4) {
        number 16, true
    }
    field(:unmined_glyphs, 8) {
        stl_vector(8) {
            pointer {
                compound(:MapBlockColumn_TUnminedGlyphs) {
                    sizeof 20

                    field(:x, 0) {
                        static_array(4, 2) {
                            number 16, true
                        }
                    }
                    field(:y, 8) {
                        static_array(4, 2) {
                            number 16, true
                        }
                    }
                    field(:tile, 16) {
                        static_array(4, 1) {
                            number 8, false
                        }
                    }
                }
            }
        }
    }
    field(:z_base, 32) {
        number 16, true
    }
    field(:cave_columns, 40) {
        static_array(16, 384) {
            static_array(16, 24) {
                df_linked_list {
                    global :CaveColumnLink
                }
            }
        }
    }
    field(:column_rectangles, 6184) {
        stl_vector(8) {
            pointer {
                global :CaveColumnRectangle
            }
        }
    }
    field(:z_shift, 6208) {
        number 16, true
    }
    field(:flags, 6216) {
        df_flagarray
    }
    field(:elevation, 6232) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, true
            }
        }
    }
    field(:map_pos, 6744) {
        global :Coord2d
    }
    field(:unk_c3c, 6748) {
        number 16, true
    }
    field(:region_pos, 6750) {
        global :Coord2d
    }
    field(:plants, 6760) {
        stl_vector(8) {
            pointer {
                global :Plant
            }
        }
    }
end

class MapRenderer < MemHack::Compound
    sizeof 74160

    field(:entity, 0) {
        static_array(256, 256) {
            static_array(256, 1) {
                number 8, false
            }
        }
    }
    field(:cursor_units, 65536) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:cursor_guts, 65560) {
        pointer {
            global :Unit
        }
    }
    field(:multiple_guts, 65568) {
        number 8, true, nil, BooleanEnum
    }
    field(:cursor_corpse, 65576) {
        pointer {
            global :Item
        }
    }
    field(:cursor_corpse_cnt, 65584) {
        number 32, true
    }
    field(:cursor_corpsepiece, 65592) {
        pointer {
            global :Item
        }
    }
    field(:cursor_corpsepiece_cnt, 65600) {
        number 32, true
    }
    field(:cursor_bones, 65608) {
        pointer {
            global :Item
        }
    }
    field(:cursor_bones_cnt, 65616) {
        number 32, true
    }
    field(:cursor_other, 65624) {
        pointer {
            global :Item
        }
    }
    field(:cursor_other_cnt, 65632) {
        number 32, true
    }
    field(:unk_10034, 65636) {
        number 8, true
    }
    field(:unk_10035, 65637) {
        number 8, true
    }
    field(:cur_tick_count, 65640) {
        number 32, true
    }
    field(:tick_phase, 65644) {
        number 16, true
    }
    field(:dim_colors, 65646) {
        number 8, true
    }
    field(:unk_1, 65647) {
        number 8, true
    }
    field(:unk_2, 65648) {
        static_array(500, 4) {
            number 32, true
        }
    }
    field(:unk_3, 67648) {
        static_array(500, 1) {
            number 8, true
        }
    }
    field(:unk_4, 68148) {
        static_array(500, 8) {
            compound(:MapRenderer_TUnk4) {
                field(:x, 0) {
                    number 32, true
                }
                field(:y, 4) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_5, 72148) {
        static_array(500, 4) {
            number 32, true
        }
    }
    field(:unk_6, 74148) {
        number 32, true
    }
    field(:unk_7, 74152) {
        number 32, true
    }
end

class MapViewport < MemHack::Compound
    sizeof 18

    field(:adv_mode, 0) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk1, 1) {
        number 8, true, nil, BooleanEnum
    }
    field(:map_rotation, 2) {
        number 8, false
    }
    field(:min_x, 4) {
        number 16, true
    }
    field(:min_y, 6) {
        number 16, true
    }
    field(:max_x, 8) {
        number 16, true
    }
    field(:max_y, 10) {
        number 16, true
    }
    field(:window_x, 12) {
        number 16, true
    }
    field(:window_y, 14) {
        number 16, true
    }
    field(:window_z, 16) {
        number 16, true
    }
end

class MaterialCommon < MemHack::Compound
    sizeof 1288

    field(:id, 0) {
        stl_string
    }
    field(:gem_name1, 32) {
        stl_string
    }
    field(:gem_name2, 64) {
        stl_string
    }
    field(:stone_name, 96) {
        stl_string
    }
    field(:heat, 128) {
        compound(:MaterialCommon_THeat) {
            field(:spec_heat, 0) {
                number 16, false
            }
            field(:heatdam_point, 2) {
                number 16, false
            }
            field(:colddam_point, 4) {
                number 16, false
            }
            field(:ignite_point, 6) {
                number 16, false
            }
            field(:melting_point, 8) {
                number 16, false
            }
            field(:boiling_point, 10) {
                number 16, false
            }
            field(:mat_fixed_temp, 12) {
                number 16, false
            }
        }
    }
    field(:solid_density, 144) {
        number 32, true
    }
    field(:liquid_density, 148) {
        number 32, true
    }
    field(:molar_mass, 152) {
        number 32, true
    }
    field(:state_color, 156) {
        static_array(6, 4, MatterState) {
            number 32, true
        }
    }
    field(:state_name, 184) {
        static_array(6, 32, MatterState) {
            stl_string
        }
    }
    field(:state_adj, 376) {
        static_array(6, 32, MatterState) {
            stl_string
        }
    }
    field(:strength, 568) {
        compound(:MaterialCommon_TStrength) {
            field(:absorption, 0) {
                number 32, true
            }
            field(:yield, 4) {
                static_array(6, 4, StrainType) {
                    number 32, true
                }
            }
            field(:fracture, 28) {
                static_array(6, 4, StrainType) {
                    number 32, true
                }
            }
            field(:strain_at_yield, 52) {
                static_array(6, 4, StrainType) {
                    number 32, true
                }
            }
            field(:max_edge, 76) {
                number 32, true
            }
        }
    }
    field(:material_value, 648) {
        number 32, true
    }
    field(:flags, 656) {
        df_flagarray(MaterialFlags)
    }
    field(:extract_storage, 672) {
        number 16, true, nil, ItemType
    }
    field(:butcher_special_type, 674) {
        number 16, true, nil, ItemType
    }
    field(:butcher_special_subtype, 676) {
        number 16, true, -1
    }
    field(:meat_name, 680) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:block_name, 776) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:reaction_product, 840) {
        compound(:MaterialCommon_TReactionProduct) {
            field(:id, 0) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:item_type, 24) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:item_subtype, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:material, 72) {
                global :MaterialVecRef
            }
            field(:str, 120) {
                static_array(5, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
        }
    }
    field(:hardens_with_water, 1080) {
        compound(:MaterialCommon_THardensWithWater) {
            field(:mat_type, 0) {
                number 16, true, -1
            }
            field(:mat_index, 4) {
                number 32, true
            }
            field(:str, 8) {
                static_array(3, 32) {
                    stl_string
                }
            }
        }
    }
    field(:reaction_class, 1184) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:tile, 1208) {
        number 8, false
    }
    field(:basic_color, 1210) {
        static_array(2, 2) {
            number 16, true
        }
    }
    field(:build_color, 1214) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:tile_color, 1220) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:item_symbol, 1226) {
        number 8, false
    }
    field(:powder_dye, 1228) {
        number 16, true
    }
    field(:temp_diet_info, 1230) {
        number 16, true
    }
    field(:syndrome, 1232) {
        stl_vector(8) {
            pointer {
                global :Syndrome
            }
        }
    }
    field(:soap_level, 1256) {
        number 32, true
    }
    field(:unk_41c, 1264) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class Material < MaterialCommon
    sizeof 1704

    field(:prefix, 1288) {
        stl_string
    }
    field(:food_mat_index, 1320) {
        static_array(39, 4, OrganicMatCategory) {
            number 32, true, -1
        }
    }
    field(:powder_dye_str, 1480) {
        stl_string
    }
    field(:state_color_str, 1512) {
        static_array(6, 32, MatterState) {
            stl_string
        }
    }
end

class MaterialTemplate < MaterialCommon
    sizeof 1512

    field(:powder_dye_str, 1288) {
        stl_string
    }
    field(:state_color_str, 1320) {
        static_array(6, 32, MatterState) {
            stl_string
        }
    }
end

class MaterialVecRef < MemHack::Compound
    sizeof 48

    field(:mat_type, 0) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_index, 24) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class MatglossList < MemHack::Compound
    sizeof 696

    field(:unk_0, 0) {
        stl_vector(8) {
            pointer {
                compound(:MatglossList_TUnk0) {
                    sizeof 64

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        number 32, true
                    }
                    field(:unk_8, 28) {
                        number 32, true
                    }
                    field(:unk_9, 32) {
                        number 32, true
                    }
                    field(:unk_10, 36) {
                        number 32, true
                    }
                    field(:unk_11, 40) {
                        number 32, true
                    }
                    field(:unk_12, 44) {
                        number 32, true
                    }
                    field(:unk_13, 48) {
                        number 32, true
                    }
                    field(:unk_14, 52) {
                        number 32, true
                    }
                    field(:unk_15, 56) {
                        number 32, true
                    }
                    field(:unk_16, 60) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:generated_inorganics, 24) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_plants, 48) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_items, 72) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_creatures, 96) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_entities, 120) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_reactions, 144) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_interactions, 168) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:generated_languages, 192) {
        stl_vector(8) {
            pointer {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:inorganics, 216) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:plants, 240) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bodies, 264) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:bodyglosses, 288) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:creatures, 312) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:items, 336) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:buildings, 360) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:entities, 384) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:words, 408) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:symbols, 432) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:translations, 456) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:colors, 480) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:shapes, 504) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:patterns, 528) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:reactions, 552) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:material_templates, 576) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:tissue_templates, 600) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:body_detail_plans, 624) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:creature_variations, 648) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:interactions, 672) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class MeetingContext < MemHack::Compound
    sizeof 32

    field(:meeting, 0) {
        pointer {
            global :MeetingDiplomatInfo
        }
    }
    field(:popup, 8) {
        pointer {
            global :DipscriptPopup
        }
    }
    field(:unk_2, 16) {
        pointer {
        }
    }
    field(:unk_3, 24) {
        pointer {
        }
    }
end

class MeetingDiplomatInfo < MemHack::Compound
    sizeof 408

    field(:civ_id, 0) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:unk1, 4) {
        number 16, true
    }
    field(:diplomat_id, 8) {
        number 32, true, -1
    }
    def diplomat_tg ; df.world.history.figures.binsearch(diplomat_id) ; end
    field(:associate_id, 12) {
        number 32, true, -1
    }
    def associate_tg ; df.world.history.figures.binsearch(associate_id) ; end
    field(:topic_list, 16) {
        stl_vector(4) {
            number 32, true, nil, MeetingTopic
        }
    }
    field(:topic_parms, 40) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:sell_requests, 64) {
        pointer {
            global :EntitySellRequests
        }
    }
    field(:buy_requests, 72) {
        pointer {
            global :EntityBuyRequests
        }
    }
    field(:dipscript, 80) {
        pointer {
            global :DipscriptInfo
        }
    }
    field(:cur_step, 88) {
        number 32, true
    }
    field(:active_script_vars, 96) {
        stl_vector(8) {
            pointer {
                global :ActiveScriptVarst
            }
        }
    }
    field(:unk_50, 120) {
        stl_string
    }
    field(:unk_6c, 152) {
        stl_string
    }
    field(:flags, 184) {
        compound(:MeetingDiplomatInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:dynamic_load, 0) { bit 0 }
            field(:failure, 0) { bit 1 }
            field(:success, 0) { bit 2 }
        }
    }
    field(:events, 192) {
        stl_vector(8) {
            pointer {
                global :MeetingEvent
            }
        }
    }
    field(:agreement_entity, 216) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def agreement_entity_tg ; agreement_entity.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:agreement_topic, 240) {
        stl_vector(2) {
            global :MeetingTopic
        }
    }
    field(:agreement_year, 264) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:agreement_tick, 288) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:agreement_outcome, 312) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:contact_entity, 336) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def contact_entity_tg ; contact_entity.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:contact_year, 360) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:contact_tick, 384) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class MeetingEvent < MemHack::Compound
    sizeof 88

    field(:type, 0) {
        number 16, true, nil, MeetingEventType
    }
    field(:topic, 2) {
        number 16, true, nil, MeetingTopic
    }
    field(:topic_parm, 4) {
        number 16, true
    }
    field(:unk_1, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:quota_total, 56) {
        number 32, true
    }
    field(:quota_remaining, 60) {
        number 32, true
    }
    field(:year, 64) {
        number 32, true
    }
    field(:ticks, 68) {
        number 32, true
    }
    field(:sell_prices, 72) {
        pointer {
            global :EntitySellPrices
        }
    }
    field(:buy_prices, 80) {
        pointer {
            global :EntityBuyPrices
        }
    }
end

class MeetingVariable < MemHack::Compound
    sizeof 40

    field(:value, 0) {
        number 32, true
    }
    field(:ref, 8) {
        global :SpecificRef
    }
    field(:active_var, 32) {
        pointer {
            global :ActiveScriptVarst
        }
    }
end

class MentalPicture < MemHack::Compound
    sizeof 72

    field(:unk, 0) {
        compound(:MentalPicture_TUnk) {
            field(:elements, 0) {
                stl_vector(8) {
                    pointer {
                        global :MentalPictureElementst
                    }
                }
            }
            field(:unk_1, 24) {
                number 32, true
            }
            field(:properties, 32) {
                stl_vector(8) {
                    pointer {
                        global :MentalPicturePropertyst
                    }
                }
            }
            field(:unk_2, 56) {
                number 32, true
            }
        }
    }
    field(:unk_1, 64) {
        number 32, true, -1
    }
    field(:unk_2, 68) {
        number 32, true, -1
    }
end

class MentalPictureElementst < MemHack::Compound
    sizeof 16

    rtti_classname :mental_picture_elementst

    field(:unk_1, 8) {
        number 32, true
    }
    def getType()
        MentalPictureElementType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class MentalPictureElementHfst < MentalPictureElementst
    sizeof 24

    rtti_classname :mental_picture_element_hfst

    field(:unk_1, 16) {
        number 32, true
    }
end

class MentalPictureElementRegionst < MentalPictureElementst
    sizeof 24

    rtti_classname :mental_picture_element_regionst

    field(:unk_1, 16) {
        number 32, true
    }
end

class MentalPictureElementSitest < MentalPictureElementst
    sizeof 24

    rtti_classname :mental_picture_element_sitest

    field(:unk_1, 16) {
        number 32, true
    }
end

class MentalPicturePropertyst < MemHack::Compound
    sizeof 16

    rtti_classname :mental_picture_propertyst

    field(:unk_0, 8) {
        number 32, true
    }
    def getType()
        MentalPicturePropertyType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class MentalPicturePropertyActionst < MentalPicturePropertyst
    sizeof 32

    rtti_classname :mental_picture_property_actionst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
    field(:unk_4, 28) {
        number 32, true
    }
end

class MentalPicturePropertyAdjectivest < MentalPicturePropertyst
    sizeof 24

    rtti_classname :mental_picture_property_adjectivest

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class MentalPicturePropertyColorPatternst < MentalPicturePropertyst
    sizeof 24

    rtti_classname :mental_picture_property_color_patternst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class MentalPicturePropertyDatest < MentalPicturePropertyst
    sizeof 24

    rtti_classname :mental_picture_property_datest

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class MentalPicturePropertyEmotionst < MentalPicturePropertyst
    sizeof 24

    rtti_classname :mental_picture_property_emotionst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class MentalPicturePropertyPositionst < MentalPicturePropertyst
    sizeof 32

    rtti_classname :mental_picture_property_positionst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
end

class MentalPicturePropertyShapest < MentalPicturePropertyst
    sizeof 24

    rtti_classname :mental_picture_property_shapest

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
end

class MentalPicturePropertyTimest < MentalPicturePropertyst
    sizeof 32

    rtti_classname :mental_picture_property_timest

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
end

class MentalPicturePropertyToolst < MentalPicturePropertyst
    sizeof 32

    rtti_classname :mental_picture_property_toolst

    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
end

class MercRoleType < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:attacker_scout, 0) { bit 0 }
    field(:defender_scout, 0) { bit 1 }
end

class Mission < MemHack::Compound
    sizeof 184

    field(:army_controller, 0) {
        number 32, true, -1
    }
    def army_controller_tg ; df.world.army_controllers.all.binsearch(army_controller) ; end
    field(:entity, 4) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:target_site, 8) {
        number 32, true, -1
    }
    def target_site_tg ; df.world.world_data.sites.binsearch(target_site) ; end
    field(:unk_2, 12) {
        number 32, true
    }
    field(:target_x, 16) {
        number 32, true
    }
    field(:target_y, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
    field(:unk_4, 28) {
        number 32, true
    }
    field(:unk_5, 32) {
        number 32, true
    }
    field(:unk_6, 36) {
        number 32, true
    }
    field(:unk_7, 40) {
        number 32, true
    }
    field(:unk_8, 44) {
        number 32, true
    }
    field(:unk_9, 48) {
        number 32, true
    }
    field(:unk_10, 52) {
        number 32, true
    }
    field(:year, 56) {
        number 32, true
    }
    field(:year_tick, 60) {
        number 32, true
    }
    field(:unk_12, 64) {
        number 32, true
    }
    field(:army_controller2, 68) {
        number 32, true, -1
    }
    def army_controller2_tg ; df.world.army_controllers.all.binsearch(army_controller2) ; end
    field(:histfig, 72) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:unk_14, 76) {
        number 32, true
    }
    field(:unk_16, 80) {
        number 32, true
    }
    field(:unk_17, 84) {
        number 32, true
    }
    field(:unk_18, 88) {
        number 32, true
    }
    field(:unk_19, 92) {
        number 32, true
    }
    field(:unk_20, 96) {
        number 32, true
    }
    field(:unk_21, 100) {
        number 32, true
    }
    field(:unk_15, 104) {
        number 32, true
    }
    field(:unk_22, 108) {
        number 32, true
    }
    field(:squads, 112) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def squads_tg ; squads.map { |i| df.world.squads.all.binsearch(i) } ; end
    field(:messengers, 136) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def messengers_tg ; messengers.map { |i| df.world.occupations.all.binsearch(i) } ; end
    field(:unk_23, 160) {
        number 32, true
    }
    field(:unk_24, 164) {
        number 32, true
    }
    field(:details, 168) {
        compound(:Mission_TDetails) {
            field(:raid, 0) {
                pointer {
                    compound(:Mission_TDetails_TRaid) {
                        sizeof 128

                        field(:raid_type, 0) {
                            class ::DFHack::Mission_TDetails_TRaid_TRaidType < MemHack::Enum
                                ENUM = Hash.new
                                NUME = Hash.new
                                ENUM[0] = :Raze ; NUME[:Raze] = 0
                                ENUM[1] = :TakeOver ; NUME[:TakeOver] = 1
                                ENUM[2] = :Occupy ; NUME[:Occupy] = 2
                                ENUM[3] = :DemandTribute ; NUME[:DemandTribute] = 3
                                ENUM[4] = :Raid ; NUME[:Raid] = 4
                                ENUM[5] = :Explore ; NUME[:Explore] = 5
                                ENUM[6] = :Pillage ; NUME[:Pillage] = 6
                            end

                            number 32, true, nil, Mission_TDetails_TRaid_TRaidType
                        }
                        field(:unk_2, 4) {
                            number 32, true
                        }
                        field(:unk_5, 8) {
                            number 32, true
                        }
                        field(:unk_6, 12) {
                            number 32, true
                        }
                        field(:unk_7, 16) {
                            number 32, true
                        }
                        field(:unk_8, 20) {
                            number 32, true
                        }
                        field(:unk_9, 24) {
                            number 32, true
                        }
                        field(:unk_10, 28) {
                            number 32, true
                        }
                        field(:unk_11, 32) {
                            number 32, true
                        }
                        field(:unk_12, 36) {
                            number 32, true
                        }
                        field(:unk_13, 40) {
                            number 32, true
                        }
                        field(:unk_14, 44) {
                            number 32, true
                        }
                        field(:unk_15, 48) {
                            number 32, true
                        }
                        field(:unk_16, 52) {
                            number 32, true
                        }
                        field(:unk_17, 56) {
                            number 32, true
                        }
                        field(:unk_18, 60) {
                            number 32, true
                        }
                        field(:unk_19, 64) {
                            number 32, true
                        }
                        field(:unk_20, 68) {
                            number 32, true
                        }
                        field(:unk_21, 72) {
                            number 32, true
                        }
                        field(:unk_22, 76) {
                            number 32, true
                        }
                        field(:unk_23, 80) {
                            number 32, true
                        }
                        field(:unk_24, 84) {
                            number 32, true
                        }
                        field(:raid_flags, 88) {
                            compound(:Mission_TDetails_TRaid_TRaidFlags) {
                                field(:_whole, 0) {
                                    number 32, false
                                }
                                field(:Unknown1, 0) { bit 0 }
                                field(:OneTimeTribute, 0) { bit 1 }
                                field(:OngoingTribute, 0) { bit 2 }
                                field(:FreeCaptives, 0) { bit 3 }
                                field(:ReleaseOtherPrisoners, 0) { bit 4 }
                                field(:TakeImportantTreasures, 0) { bit 5 }
                                field(:LootOtherItems, 0) { bit 6 }
                                field(:StealLivestock, 0) { bit 7 }
                                field(:Unknown256, 0) { bit 8 }
                                field(:DemandSurrender, 0) { bit 9 }
                            }
                        }
                        field(:unk_3, 92) {
                            number 32, true
                        }
                        field(:unk_4, 96) {
                            number 32, true
                        }
                        field(:unk_25, 100) {
                            number 32, true
                        }
                        field(:unk_26, 104) {
                            number 32, true
                        }
                        field(:unk_27, 108) {
                            number 32, true
                        }
                        field(:unk_28, 112) {
                            number 32, true
                        }
                        field(:unk_29, 116) {
                            number 32, true
                        }
                        field(:unk_30, 120) {
                            number 32, true
                        }
                        field(:unk_31, 124) {
                            number 32, true
                        }
                    }
                }
            }
            field(:recovery, 0) {
                pointer {
                    compound(:Mission_TDetails_TRecovery) {
                        sizeof 8

                        field(:artifact, 0) {
                            number 32, true, -1
                        }
                        def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
                        field(:unk_2, 4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:rescue, 0) {
                pointer {
                    compound(:Mission_TDetails_TRescue) {
                        sizeof 8

                        field(:histfig, 0) {
                            number 32, true, -1
                        }
                        def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
                        field(:unk_2, 4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:request, 0) {
                pointer {
                    compound(:Mission_TDetails_TRequest) {
                        sizeof 40

                        field(:workers, 0) {
                            stl_vector(4) {
                                number 32, true, -1
                            }
                        }
                        def workers_tg ; workers.map { |i| df.world.history.figures.binsearch(i) } ; end
                        field(:unk_1, 24) {
                            number 32, true
                        }
                        field(:unk_2, 28) {
                            number 32, true
                        }
                        field(:unk_3, 32) {
                            number 32, true
                        }
                        field(:unk_4, 36) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:type, 176) {
        class ::DFHack::Mission_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[2] = :Raid ; NUME[:Raid] = 2
            ENUM[17] = :RecoverArtifact ; NUME[:RecoverArtifact] = 17
            ENUM[18] = :RescuePerson ; NUME[:RescuePerson] = 18
            ENUM[19] = :RequestWorkers ; NUME[:RequestWorkers] = 19
        end

        number 32, true, nil, Mission_TType
    }
    field(:unk_25, 180) {
        number 32, true
    }
end

class MissionCampaignReport < MemHack::Compound
    sizeof 1800

    field(:travel_x, 0) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:travel_y, 256) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:travel_year, 512) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:travel_year_tick, 768) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:travel_count, 1024) {
        number 32, true
    }
    field(:event_id, 1028) {
        static_array(64, 4) {
            number 32, true, -1
        }
    }
    def event_tg ; df.world.history.events.binsearch(event_id) ; end
    field(:event_year, 1284) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:event_year_tick, 1540) {
        static_array(64, 4) {
            number 32, true
        }
    }
    field(:events_count, 1796) {
        number 32, true
    }
end

class MissionReport < MemHack::Compound
    sizeof 120

    field(:campaigns, 0) {
        stl_vector(8) {
            pointer {
                global :MissionCampaignReport
            }
        }
    }
    field(:current_campaign, 24) {
        number 32, true
    }
    field(:origin_x, 28) {
        number 32, true
    }
    field(:origin_y, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:title, 40) {
        stl_string
    }
    field(:unk_7, 72) {
        number 32, true
    }
    field(:year, 76) {
        number 32, true
    }
    field(:year_tick, 80) {
        number 32, true
    }
    field(:unk_10, 88) {
        stl_vector
    }
    field(:unk_11, 112) {
        number 32, true
    }
    field(:unk_12, 116) {
        number 32, true
    }
end

class MovingParty < MemHack::Compound
    sizeof 136

    field(:pos, 0) {
        global :Coord2d
    }
    field(:unk_4, 4) {
        number 16, true
    }
    field(:unk_c, 8) {
        number 32, true
    }
    field(:unk_10, 12) {
        number 32, true
    }
    field(:members, 16) {
        stl_vector(8) {
            pointer {
                compound(:MovingParty_TMembers) {
                    sizeof 40

                    field(:nemesis_id, 0) {
                        number 32, true, -1
                    }
                    def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis_id) ; end
                    field(:hunger, 4) {
                        number 32, true
                    }
                    field(:thirst, 8) {
                        number 32, true
                    }
                    field(:sleepiness, 12) {
                        number 32, true
                    }
                    field(:stored_fat, 16) {
                        number 32, true
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                    field(:unk_18, 24) {
                        number 32, true, 1
                    }
                    field(:unk_1c, 28) {
                        number 32, true, -1000000
                    }
                    field(:unk_20, 32) {
                        number 32, true, -1000000
                    }
                    field(:unk_24, 36) {
                        number 32, true, -1000000
                    }
                }
            }
        }
    }
    field(:entity_id, 40) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:flags, 48) {
        df_flagarray
    }
    field(:unk_30, 64) {
        stl_vector
    }
    field(:unk_40, 88) {
        stl_vector
    }
    field(:unk_70, 112) {
        number 16, true
    }
    field(:unk_72, 114) {
        number 16, true, -1
    }
    field(:unk_74, 116) {
        number 16, true, -1
    }
    field(:unk_7c, 120) {
        number 32, true, -1
    }
    field(:region_id, 124) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region_id] ; end
    field(:beast_id, 128) {
        number 32, true, -1
    }
end

class MusicalForm < MemHack::Compound
    sizeof 296

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:originating_entity, 128) {
        number 32, true, -1
    }
    def originating_entity_tg ; df.world.entities.all.binsearch(originating_entity) ; end
    field(:original_author, 132) {
        number 32, true, -1
    }
    def original_author_tg ; df.world.history.figures.binsearch(original_author) ; end
    field(:passages, 136) {
        stl_vector(8) {
            pointer {
                global :MusicalFormPassage
            }
        }
    }
    field(:instruments, 160) {
        stl_vector(8) {
            pointer {
                global :MusicalFormInstruments
            }
        }
    }
    field(:melodies, 184) {
        stl_vector(8) {
            pointer {
                global :MusicalFormMelodies
            }
        }
    }
    field(:unk_1, 208) {
        stl_vector(8) {
            pointer {
                global :MusicalFormSub4
            }
        }
    }
    field(:tempo_style, 232) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:dynamic_style, 236) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:overall_style, 240) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:poetic_form_id, 244) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
    field(:written_content_id, 248) {
        number 32, true, -1
    }
    def written_content_tg ; df.world.written_contents.all.binsearch(written_content_id) ; end
    field(:scale_id, 252) {
        number 32, true, -1
    }
    def scale_tg ; df.world.scales.all.binsearch(scale_id) ; end
    field(:scale_subid, 256) {
        number 32, true
    }
    field(:rhythm_id, 260) {
        number 32, true, -1
    }
    def rhythm_tg ; df.world.rhythms.all.binsearch(rhythm_id) ; end
    field(:sub_rhythm, 264) {
        number 32, true
    }
    field(:rhythm_pattern, 268) {
        number 32, true
    }
    field(:features, 272) {
        global :MusicalFormFeature
    }
    field(:pitch_style, 276) {
        number 32, true, nil, MusicalFormPitchStyle
    }
    field(:purpose, 280) {
        number 32, true, nil, MusicalFormPurpose
    }
    field(:devotion_target, 284) {
        number 32, true, -1
    }
    def devotion_target_tg ; df.world.history.figures.binsearch(devotion_target) ; end
    field(:flags, 288) {
        compound(:MusicalForm_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:produces_individual_songs, 0) { bit 0 }
            field(:repeats_as_necessary, 0) { bit 1 }
        }
    }
end

class MusicalFormFeature < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:GlideFromNoteToNote, 0) { bit 0 }
    field(:UseGraceNotes, 0) { bit 1 }
    field(:UseMordents, 0) { bit 2 }
    field(:MakeTrills, 0) { bit 3 }
    field(:PlayRapidRuns, 0) { bit 4 }
    field(:LocallyImprovise, 0) { bit 5 }
    field(:SpreadSyllablesOverManyNotes, 0) { bit 6 }
    field(:MatchNotesAndSyllables, 0) { bit 7 }
    field(:Syncopate, 0) { bit 8 }
    field(:AddFills, 0) { bit 9 }
    field(:AlternateTensionAndRepose, 0) { bit 10 }
    field(:ModulateFrequently, 0) { bit 11 }
    field(:PlayArpeggios, 0) { bit 12 }
    field(:PlayStaccato, 0) { bit 13 }
    field(:PlayLegato, 0) { bit 14 }
    field(:FreelyAdjustBeats, 0) { bit 15 }
end

class MusicalFormInstruments < MemHack::Compound
    sizeof 28

    field(:instrument_subtype, 0) {
        number 32, true, -1
    }
    def instrument_subtype_tg ; df.world.raws.itemdefs.instruments[instrument_subtype] ; end
    field(:substitutions, 4) {
        compound(:MusicalFormInstruments_TSubstitutions) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:singer, 0) { bit 0 }
            field(:speaker, 0) { bit 1 }
            field(:chanter, 0) { bit 2 }
        }
    }
    field(:features, 8) {
        global :MusicalFormFeature
    }
    field(:minimum_required, 12) {
        number 32, true
    }
    field(:maximum_permitted, 16) {
        number 32, true
    }
    field(:dynamic_style, 20) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:overall_style, 24) {
        number 32, true, nil, MusicalFormStyle
    }
end

class MusicalFormInterval < MemHack::Compound
    sizeof 8

    field(:degree, 0) {
        number 32, true
    }
    field(:flags, 4) {
        compound(:MusicalFormInterval_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:rising, 0) { bit 0 }
            field(:flattened, 0) { bit 1 }
            field(:sharpened, 0) { bit 2 }
        }
    }
end

class MusicalFormMelodies < MemHack::Compound
    sizeof 40

    field(:style, 0) {
        number 32, true, nil, MusicalFormMelodyStyle
    }
    field(:frequency, 4) {
        number 32, true, nil, MusicalFormMelodyFrequency
    }
    field(:intervals, 8) {
        stl_vector(8) {
            pointer {
                global :MusicalFormInterval
            }
        }
    }
    field(:features, 32) {
        global :MusicalFormFeature
    }
end

class MusicalFormPassage < MemHack::Compound
    sizeof 224

    field(:type, 0) {
        number 32, true, nil, MusicalFormPassageType
    }
    field(:passage_reference, 4) {
        number 32, true, -1
    }
    field(:passage_range_end, 8) {
        number 32, true, -1
    }
    field(:unk_4, 12) {
        number 32, true
    }
    field(:unk_5, 16) {
        number 32, true
    }
    field(:poetic_form_id, 20) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
    field(:written_content_id, 24) {
        number 32, true, -1
    }
    def written_content_tg ; df.world.written_contents.all.binsearch(written_content_id) ; end
    field(:scale_id, 28) {
        number 32, true, -1
    }
    def scale_tg ; df.world.scales.all.binsearch(scale_id) ; end
    field(:scale_sub_id, 32) {
        number 32, true
    }
    field(:rhythm_id, 36) {
        number 32, true, -1
    }
    def rhythm_tg ; df.world.rhythms.all.binsearch(rhythm_id) ; end
    field(:sub_rhythm, 40) {
        number 32, true
    }
    field(:rhythm_pattern, 44) {
        number 32, true
    }
    field(:instruments, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:components, 72) {
        stl_vector(4) {
            number 32, true, nil, MusicalFormPassageComponentType
        }
    }
    field(:passage_lengths, 96) {
        stl_vector(4) {
            number 32, true, nil, MusicalFormPassageLengthType
        }
    }
    field(:lowest_register_range, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:highest_register_range, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:tempo_style, 168) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:dynamic_style, 172) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:overall_style, 176) {
        number 32, true, nil, MusicalFormStyle
    }
    field(:features, 180) {
        global :MusicalFormFeature
    }
    field(:pitch_style, 184) {
        number 32, true, nil, MusicalFormPitchStyle
    }
    field(:melodies, 192) {
        stl_vector(8) {
            pointer {
                global :MusicalFormMelodies
            }
        }
    }
    field(:unk_22, 216) {
        number 32, true, -1
    }
    field(:unk_23, 220) {
        number 32, true, -1
    }
end

class MusicalFormSub4 < MemHack::Compound
    sizeof 24

    field(:passage, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:unk_4, 12) {
        number 32, true
    }
    field(:unk_5, 16) {
        number 32, true
    }
    field(:unk_6, 20) {
        number 32, true
    }
end

class Musicsoundst < MemHack::Compound
    sizeof 32048

    field(:soft_channel_number, 0) {
        number 32, true
    }
    field(:song, 4) {
        number 32, true, -1
    }
    field(:music_active, 8) {
        number 8, true, nil, BooleanEnum
    }
    field(:sound_priority, 9) {
        number 8, true, nil, BooleanEnum
    }
    field(:sound_playing, 12) {
        number 32, true
    }
    field(:on, 16) {
        number 8, true, nil, BooleanEnum
    }
    field(:fmod_system, 24) {
        pointer {
        }
    }
    field(:fmod_master_channel_group, 32) {
        pointer {
        }
    }
    field(:mod, 40) {
        static_array(1000, 16) {
            global :FmodSound
        }
    }
    field(:samp, 16040) {
        static_array(1000, 16) {
            global :FmodSound
        }
    }
    field(:linux_sound_system, 32040) {
        class ::DFHack::Musicsoundst_TLinuxSoundSystem < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :ALSA ; NUME[:ALSA] = 0
            ENUM[1] = :OSS ; NUME[:OSS] = 1
            ENUM[2] = :ESD ; NUME[:ESD] = 2
        end

        number 32, true, nil, Musicsoundst_TLinuxSoundSystem
    }
end

class NamedScale < MemHack::Compound
    sizeof 80

    field(:unk_1, 0) {
        number 32, true
    }
    field(:name, 8) {
        stl_string
    }
    field(:degrees, 40) {
        static_array(7, 4) {
            number 32, true
        }
    }
    field(:degrees_used, 68) {
        number 32, true
    }
    field(:first_chord, 72) {
        number 32, true, -1
    }
    field(:second_chord, 76) {
        number 32, true, -1
    }
end

class NemesisOffload < MemHack::Compound
    sizeof 88

    field(:nemesis_save_file_id, 0) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:nemesis_member_idx, 24) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:units, 48) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:cur_unit_chunk, 72) {
        pointer {
            global :UnitChunk
        }
    }
    field(:cur_unit_chunk_num, 80) {
        number 32, true, -1
    }
    field(:units_offloaded, 84) {
        number 32, true, -1
    }
end

class NemesisRecord < MemHack::Compound
    sizeof 104

    field(:id, 0) {
        number 32, true
    }
    field(:unit_id, 4) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:save_file_id, 8) {
        number 32, true, -1
    }
    def save_file_tg ; df.world.unit_chunks.binsearch(save_file_id) ; end
    field(:member_idx, 12) {
        number 16, true
    }
    field(:figure, 16) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unit, 24) {
        pointer {
            global :Unit
        }
    }
    field(:group_leader_id, 32) {
        number 32, true, -1
    }
    def group_leader_tg ; df.world.nemesis.all.binsearch(group_leader_id) ; end
    field(:companions, 40) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def companions_tg ; companions.map { |i| df.world.nemesis.all.binsearch(i) } ; end
    field(:unk10, 64) {
        number 16, true, -1
    }
    field(:unk11, 68) {
        number 32, true, -1
    }
    field(:unk12, 72) {
        number 32, true, -1
    }
    field(:unk_v47_1, 76) {
        number 32, true
    }
    field(:unk_v47_2, 80) {
        number 32, true
    }
    field(:flags, 88) {
        df_flagarray(NemesisFlags)
    }
end

class Occupation < MemHack::Compound
    sizeof 80

    field(:id, 0) {
        number 32, true
    }
    field(:type, 4) {
        number 32, true, nil, OccupationType
    }
    field(:histfig_id, 8) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:unit_id, 12) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:location_id, 16) {
        number 32, true, -1
    }
    field(:site_id, 20) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:group_id, 24) {
        number 32, true, -1
    }
    def group_tg ; df.world.entities.all.binsearch(group_id) ; end
    field(:unk_1, 32) {
        stl_vector(8) {
            pointer {
                global :OccupationSub1
            }
        }
    }
    field(:unk_2, 56) {
        number 32, true
    }
    field(:army_controller_id, 60) {
        number 32, true, -1
    }
    def army_controller_tg ; df.world.army_controllers.all.binsearch(army_controller_id) ; end
    field(:unk_4, 64) {
        pointer {
            global :WorldSite
        }
    }
    field(:unk_5, 72) {
        pointer {
            global :AbstractBuilding
        }
    }
end

class OccupationSub1 < MemHack::Compound
    sizeof 72

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 16, true
    }
    field(:unk_4, 10) {
        number 16, true
    }
    field(:unk_5, 12) {
        number 16, true
    }
    field(:unk_6, 16) {
        number 32, true
    }
    field(:unk_7, 20) {
        number 32, true
    }
    field(:unk_8, 24) {
        number 32, true
    }
    field(:unk_9, 28) {
        number 32, true
    }
    field(:unk_10, 32) {
        number 32, true
    }
    field(:unk_11, 36) {
        number 32, true
    }
    field(:unk_12, 40) {
        number 32, true
    }
    field(:unk_13, 44) {
        number 32, true
    }
    field(:unk_14, 48) {
        number 32, true
    }
    field(:unk_15, 52) {
        number 32, true
    }
    field(:unk_16, 56) {
        number 32, true
    }
    field(:unk_17, 60) {
        number 32, true
    }
    field(:unk_18, 64) {
        number 32, true
    }
    field(:unk_19, 68) {
        number 32, true
    }
end

class OceanWave < MemHack::Compound
    sizeof 14

    field(:dest, 0) {
        global :Coord2d
    }
    field(:cur, 4) {
        global :Coord2d
    }
    field(:z, 8) {
        number 16, true
    }
    field(:spawn_flows, 10) {
        number 8, true, nil, BooleanEnum
    }
    field(:move_timer, 11) {
        number 8, true
    }
    field(:unk_timer, 12) {
        number 8, true
    }
end

class OceanWaveMaker < MemHack::Compound
    sizeof 104

    field(:pos, 0) {
        global :Coord
    }
    field(:interval, 6) {
        number 8, true
    }
    field(:coastline, 8) {
        global :Coord2dPath
    }
    field(:wave_origin, 56) {
        global :Coord2dPath
    }
end

class OrientationFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:indeterminate, 0) { bit 0 }
    field(:romance_male, 0) { bit 1 }
    field(:marry_male, 0) { bit 2 }
    field(:romance_female, 0) { bit 3 }
    field(:marry_female, 0) { bit 4 }
end

class PartyInfo < MemHack::Compound
    sizeof 40

    field(:units, 0) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:location, 24) {
        pointer {
            global :Building
        }
    }
    field(:timer, 32) {
        number 32, true
    }
    field(:id, 36) {
        number 32, true
    }
end

class PerformancePlayOrderst < MemHack::Compound
    sizeof 56

    rtti_classname :performance_play_orderst

    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_2, 12) {
        number 32, true
    }
    field(:unk_3, 16) {
        number 32, true
    }
    field(:unk_4, 24) {
        stl_vector(8) {
            pointer {
                compound(:PerformancePlayOrderst_TUnk4) {
                    sizeof 112

                    field(:unk_1, 0) {
                        static_array(28, 2) {
                            number 16, true
                        }
                    }
                    field(:unk_2, 56) {
                        static_array(28, 2) {
                            number 16, true
                        }
                    }
                }
            }
        }
    }
    field(:unk_5, 48) {
        number 32, true
    }
    def write_file(file)
        DFHack.vmethod_call(self, 0, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 8, file, SaveVersion.int(loadversion)) ; nil
    end
end

class Plant < MemHack::Compound
    sizeof 72

    field(:flags, 0) {
        global :PlantFlags
    }
    field(:material, 2) {
        number 16, true, -1
    }
    def material_tg ; df.world.raws.plants.all[material] ; end
    field(:pos, 4) {
        global :Coord
    }
    field(:grow_counter, 12) {
        number 32, true
    }
    field(:damage_flags, 16) {
        compound(:Plant_TDamageFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:is_burning, 0) { bit 0 }
            field(:is_drowning, 0) { bit 1 }
            field(:is_dead, 0) { bit 2 }
        }
    }
    field(:hitpoints, 20) {
        number 32, true
    }
    field(:update_order, 24) {
        number 16, true
    }
    field(:site_id, 28) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:srb_id, 32) {
        number 32, true, -1
    }
    field(:contaminants, 40) {
        stl_vector(8) {
            pointer {
                global :SpatterCommon
            }
        }
    }
    field(:tree_info, 64) {
        pointer {
            global :PlantTreeInfo
        }
    }
end

class PlantFlags < MemHack::Compound
    field(:_whole, 0) {
        number 16, false
    }
    field(:watery, 0) { bit 0 }
    field(:is_shrub, 0) { bit 1 }
end

class PlantGrowth < MemHack::Compound
    sizeof 328

    field(:id, 0) {
        stl_string
    }
    field(:name, 32) {
        stl_string
    }
    field(:name_plural, 64) {
        stl_string
    }
    field(:str_growth_item, 96) {
        static_array(5, 32) {
            stl_string
        }
    }
    field(:item_type, 256) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 258) {
        number 16, true
    }
    field(:mat_type, 260) {
        number 16, true, -1
    }
    field(:mat_index, 264) {
        number 32, true
    }
    field(:prints, 272) {
        stl_vector(8) {
            pointer {
                global :PlantGrowthPrint
            }
        }
    }
    field(:timing_1, 296) {
        number 32, true
    }
    field(:timing_2, 300) {
        number 32, true
    }
    field(:locations, 304) {
        compound(:PlantGrowth_TLocations) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:twigs, 0) { bit 0 }
            field(:light_branches, 0) { bit 1 }
            field(:heavy_branches, 0) { bit 2 }
            field(:trunk, 0) { bit 3 }
            field(:roots, 0) { bit 4 }
            field(:cap, 0) { bit 5 }
            field(:sapling, 0) { bit 6 }
        }
    }
    field(:density, 308) {
        number 32, true
    }
    field(:behavior, 312) {
        compound(:PlantGrowth_TBehavior) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:drops_off, 0) { bit 0 }
            field(:no_cloud, 0) { bit 1 }
            field(:has_seed, 0) { bit 2 }
        }
    }
    field(:trunk_height_perc_1, 316) {
        number 32, true
    }
    field(:trunk_height_perc_2, 320) {
        number 32, true
    }
end

class PlantGrowthPrint < MemHack::Compound
    sizeof 20

    field(:priority, 0) {
        number 32, true
    }
    field(:tile_growth, 4) {
        number 8, false
    }
    field(:tile_item, 5) {
        number 8, false
    }
    field(:color, 6) {
        static_array(3, 2) {
            number 16, true
        }
    }
    field(:timing_start, 12) {
        number 32, true
    }
    field(:timing_end, 16) {
        number 32, true
    }
end

class PlantRaw < MemHack::Compound
    sizeof 1864

    field(:id, 0) {
        stl_string
    }
    field(:index, 32) {
        number 32, true
    }
    field(:raws, 40) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:flags, 64) {
        df_flagarray(PlantRawFlags)
    }
    field(:name, 80) {
        stl_string
    }
    field(:name_plural, 112) {
        stl_string
    }
    field(:adj, 144) {
        stl_string
    }
    field(:seed_singular, 176) {
        stl_string
    }
    field(:seed_plural, 208) {
        stl_string
    }
    field(:leaves_singular, 240) {
        stl_string
    }
    field(:leaves_plural, 272) {
        stl_string
    }
    field(:source_hfid, 304) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:unk_v4201_1, 308) {
        number 32, true, -1
    }
    field(:unk1, 312) {
        number 8, false
    }
    field(:unk2, 313) {
        number 8, false
    }
    field(:tiles, 314) {
        compound(:PlantRaw_TTiles) {
            field(:picked_tile, 0) {
                number 8, false
            }
            field(:dead_picked_tile, 1) {
                number 8, false
            }
            field(:shrub_tile, 2) {
                number 8, false
            }
            field(:dead_shrub_tile, 3) {
                number 8, false
            }
            field(:tree_tile, 4) {
                number 8, false
            }
            field(:dead_tree_tile, 5) {
                number 8, false
            }
            field(:sapling_tile, 6) {
                number 8, false
            }
            field(:dead_sapling_tile, 7) {
                number 8, false
            }
            field(:grass_tiles, 8) {
                static_array(16, 1) {
                    number 8, false
                }
            }
            field(:alt_grass_tiles, 24) {
                static_array(12, 1) {
                    number 8, false
                }
            }
            field(:tree_tiles, 36) {
                static_array(104, 1) {
                    number 8, false
                }
            }
        }
    }
    field(:growdur, 456) {
        number 32, true
    }
    field(:value, 460) {
        number 32, true
    }
    field(:colors, 464) {
        compound(:PlantRaw_TColors) {
            field(:picked_color, 0) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:dead_picked_color, 3) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:shrub_color, 6) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:dead_shrub_color, 9) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:seed_color, 12) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:tree_color, 15) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:dead_tree_color, 18) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:sapling_color, 21) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:dead_sapling_color, 24) {
                static_array(3, 1) {
                    number 8, true
                }
            }
            field(:grass_colors_0, 27) {
                static_array(20, 1) {
                    number 8, true
                }
            }
            field(:grass_colors_1, 47) {
                static_array(20, 1) {
                    number 8, true
                }
            }
            field(:grass_colors_2, 67) {
                static_array(20, 1) {
                    number 8, true
                }
            }
        }
    }
    field(:alt_period, 552) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:shrub_drown_level, 560) {
        number 8, true
    }
    field(:tree_drown_level, 561) {
        number 8, true
    }
    field(:sapling_drown_level, 562) {
        number 8, true
    }
    field(:frequency, 564) {
        number 16, true
    }
    field(:clustersize, 566) {
        number 16, true
    }
    field(:prefstring, 568) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:material, 592) {
        stl_vector(8) {
            pointer {
                global :Material
            }
        }
    }
    field(:material_defs, 616) {
        compound(:PlantRaw_TMaterialDefs) {
            field(:type, 0) {
                static_array(9, 2, PlantMaterialDef) {
                    number 16, true, -1
                }
            }
            field(:idx, 20) {
                static_array(9, 4, PlantMaterialDef) {
                    number 32, true
                }
            }
            field(:str, 56) {
                static_array(9, 96, PlantMaterialDef) {
                    static_array(3, 32) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:underground_depth_min, 1536) {
        number 32, true
    }
    field(:underground_depth_max, 1540) {
        number 32, true
    }
    field(:growths, 1544) {
        stl_vector(8) {
            pointer {
                global :PlantGrowth
            }
        }
    }
    field(:root_name, 1568) {
        stl_string
    }
    field(:trunk_name, 1600) {
        stl_string
    }
    field(:heavy_branch_name, 1632) {
        stl_string
    }
    field(:light_branch_name, 1664) {
        stl_string
    }
    field(:twig_name, 1696) {
        stl_string
    }
    field(:cap_name, 1728) {
        stl_string
    }
    field(:trunk_period, 1760) {
        number 32, true
    }
    field(:heavy_branch_density, 1764) {
        number 32, true
    }
    field(:light_branch_density, 1768) {
        number 32, true
    }
    field(:max_trunk_height, 1772) {
        number 32, true
    }
    field(:heavy_branch_radius, 1776) {
        number 32, true
    }
    field(:light_branch_radius, 1780) {
        number 32, true
    }
    field(:trunk_branching, 1784) {
        number 32, true
    }
    field(:max_trunk_diameter, 1788) {
        number 32, true
    }
    field(:trunk_width_period, 1792) {
        number 32, true
    }
    field(:cap_period, 1796) {
        number 32, true
    }
    field(:cap_radius, 1800) {
        number 32, true
    }
    field(:root_density, 1804) {
        number 32, true
    }
    field(:root_radius, 1808) {
        number 32, true
    }
    field(:stockpile_growths, 1816) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:stockpile_growth_flags, 1840) {
        stl_vector(4) {
            compound(:PlantRaw_TStockpileGrowthFlags) {
                field(:_whole, 0) {
                    number 32, false
                }
                field(:EDIBLE_RAW, 0) { bit 0 }
                field(:EDIBLE_COOKED, 0) { bit 1 }
            }
        }
    }
end

class PlantTreeInfo < MemHack::Compound
    sizeof 72

    field(:body, 0) {
        pointer_ary(8) {
            pointer_ary(1) {
                global :PlantTreeTile
            }
        }
    }
    field(:extent_east, 8) {
        pointer_ary(2) {
            number 16, true
        }
    }
    field(:extent_south, 16) {
        pointer_ary(2) {
            number 16, true
        }
    }
    field(:extent_west, 24) {
        pointer_ary(2) {
            number 16, true
        }
    }
    field(:extent_north, 32) {
        pointer_ary(2) {
            number 16, true
        }
    }
    field(:body_height, 40) {
        number 32, true
    }
    field(:dim_x, 44) {
        number 32, true
    }
    field(:dim_y, 48) {
        number 32, true
    }
    field(:roots, 56) {
        pointer_ary(8) {
            pointer_ary(1) {
                global :PlantTreeTile
            }
        }
    }
    field(:roots_depth, 64) {
        number 32, true
    }
    field(:unk6, 68) {
        number 16, true
    }
end

class PlantTreeTile < MemHack::Compound
    field(:_whole, 0) {
        number 8, false
    }
    field(:trunk, 0) { bit 0 }
    field(:connection_east, 0) { bit 1 }
    field(:connection_south, 0) { bit 2 }
    field(:connection_west, 0) { bit 3 }
    field(:connection_north, 0) { bit 4 }
    field(:branches, 0) { bit 5 }
    field(:twigs, 0) { bit 6 }
    field(:blocked, 0) { bit 7 }
end

class PlotAgreement < MemHack::Compound
    sizeof 16

    field(:actor_id, 0) {
        number 32, true, -1
    }
    def actor_tg ; df.world.history.figures.binsearch(actor_id) ; end
    field(:plot_role, 4) {
        number 32, true, nil, PlotRoleType
    }
    field(:agreement_id, 8) {
        number 32, true, -1
    }
    def agreement_tg ; df.world.agreements.all.binsearch(agreement_id) ; end
    field(:agreement_has_messenger, 12) {
        number 8, true, nil, BooleanEnum
    }
end

class PoeticForm < MemHack::Compound
    sizeof 256

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:originating_entity, 128) {
        number 32, true, -1
    }
    def originating_entity_tg ; df.world.entities.all.binsearch(originating_entity) ; end
    field(:original_author, 132) {
        number 32, true, -1
    }
    def original_author_tg ; df.world.history.figures.binsearch(original_author) ; end
    field(:subject_hf, 136) {
        number 32, true, -1
    }
    def subject_hf_tg ; df.world.history.figures.binsearch(subject_hf) ; end
    field(:flags, 140) {
        compound(:PoeticForm_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:tone_patterns, 0) { bit 0 }
            field(:produces_individual_poems, 0) { bit 1 }
        }
    }
    field(:parts, 144) {
        stl_vector(8) {
            pointer {
                global :PoeticFormPart
            }
        }
    }
    field(:each_line_feet, 168) {
        number 32, true
    }
    field(:each_line_pattern, 172) {
        number 32, true, nil, PoeticFormPattern
    }
    field(:every_line_caesura_position, 176) {
        number 32, true, nil, PoeticFormCaesuraPosition
    }
    field(:common_features, 184) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormAdditionalFeature
        }
    }
    field(:mood, 208) {
        number 32, true, nil, PoeticFormMood
    }
    field(:subject, 212) {
        number 32, true, nil, PoeticFormSubject
    }
    field(:subject_target, 216) {
        global :PoeticFormSubjectTarget
    }
    field(:action, 220) {
        number 32, true, nil, PoeticFormAction
    }
    field(:preferred_perspective, 224) {
        number 32, true
    }
    field(:features, 228) {
        global :PoeticFormFeature
    }
    field(:perspectives, 232) {
        stl_vector(8) {
            pointer {
                global :PoeticFormPerspective
            }
        }
    }
end

class PoeticFormFeature < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:InternalRhyme, 0) { bit 0 }
    field(:EndRhymesDontMatch, 0) { bit 1 }
    field(:Alliteration, 0) { bit 2 }
    field(:Onomatopoeia, 0) { bit 3 }
    field(:Antanaclasis, 0) { bit 4 }
    field(:DifferentReadings, 0) { bit 5 }
    field(:ReadBackwards, 0) { bit 6 }
    field(:ReadOrthogonally, 0) { bit 7 }
    field(:Emerge, 0) { bit 8 }
    field(:Assonance, 0) { bit 9 }
    field(:Consonance, 0) { bit 10 }
    field(:Elision, 0) { bit 11 }
    field(:Epenthesis, 0) { bit 12 }
    field(:Synchysis, 0) { bit 13 }
    field(:Allegory, 0) { bit 14 }
    field(:Ambiguity, 0) { bit 15 }
    field(:Symbolism, 0) { bit 16 }
    field(:Metaphor, 0) { bit 17 }
    field(:Simile, 0) { bit 18 }
    field(:Metonymy, 0) { bit 19 }
    field(:VividImagery, 0) { bit 20 }
    field(:Juxtaposision, 0) { bit 21 }
end

class PoeticFormPart < MemHack::Compound
    sizeof 408

    field(:flags, 0) {
        compound(:PoeticFormPart_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:size_in_lines, 0) { bit 0 }
        }
    }
    field(:count_min, 4) {
        number 32, true
    }
    field(:count_max, 8) {
        number 32, true
    }
    field(:size, 12) {
        number 32, true
    }
    field(:unk_1, 16) {
        number 32, true
    }
    field(:unk_2, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        number 32, true
    }
    field(:unk_4, 28) {
        number 32, true
    }
    field(:line_endings, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:line_feet, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:line_patterns, 80) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormPattern
        }
    }
    field(:line_caesura_positions, 104) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormCaesuraPosition
        }
    }
    field(:line_features, 128) {
        stl_vector(4) {
            global :PoeticFormFeature
        }
    }
    field(:additional_features, 152) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormAdditionalFeature
        }
    }
    field(:additional_targets, 176) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:additional_lines, 200) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:line_mood, 224) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormMood
        }
    }
    field(:line_subject, 248) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormSubject
        }
    }
    field(:line_subject_target, 272) {
        stl_vector(4) {
            global :PoeticFormSubjectTarget
        }
    }
    field(:line_action, 296) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormAction
        }
    }
    field(:unk_5, 320) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:some_lines_syllables, 344) {
        number 32, true
    }
    field(:some_lines_pattern, 348) {
        number 32, true
    }
    field(:each_line_caesura_position, 352) {
        number 32, true, nil, PoeticFormCaesuraPosition
    }
    field(:certain_lines_additional_features, 360) {
        stl_vector(4) {
            number 32, true, nil, PoeticFormAdditionalFeature
        }
    }
    field(:mood, 384) {
        number 32, true, nil, PoeticFormMood
    }
    field(:unk_6, 388) {
        number 32, true
    }
    field(:unk_7, 392) {
        number 32, true
    }
    field(:action, 396) {
        number 32, true, nil, PoeticFormAction
    }
    field(:unk_8, 400) {
        number 32, true
    }
    field(:unk_9, 404) {
        number 32, true
    }
end

class PoeticFormPerspective < MemHack::Compound
    sizeof 12

    field(:type, 0) {
        class ::DFHack::PoeticFormPerspective_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Author ; NUME[:Author] = 0
            ENUM[1] = :Soldier ; NUME[:Soldier] = 1
            ENUM[2] = :Traveller ; NUME[:Traveller] = 2
            ENUM[3] = :RelativeOfAuthor ; NUME[:RelativeOfAuthor] = 3
            ENUM[4] = :PartyOfDebate ; NUME[:PartyOfDebate] = 4
            ENUM[5] = :FictionalPoet ; NUME[:FictionalPoet] = 5
            ENUM[6] = :Histfig ; NUME[:Histfig] = 6
            ENUM[7] = :Animal ; NUME[:Animal] = 7
        end

        number 32, true, nil, PoeticFormPerspective_TType
    }
    field(:histfig, 4) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig) ; end
    field(:unk_1, 8) {
        number 32, true
    }
end

class PoeticFormSubjectTarget < MemHack::Compound
    sizeof 4

    field(:Histfig, 0) {
        compound(:PoeticFormSubjectTarget_THistfig) {
            field(:subject_histfig, 0) {
                number 32, true, -1
            }
            def subject_histfig_tg ; df.world.history.figures.binsearch(subject_histfig) ; end
        }
    }
    field(:Concept, 0) {
        compound(:PoeticFormSubjectTarget_TConcept) {
            field(:subject_topic, 0) {
                number 32, true, nil, SphereType
            }
        }
    }
end

class PopupMessage < MemHack::Compound
    sizeof 40

    field(:text, 0) {
        stl_string
    }
    field(:color, 32) {
        number 16, true, 7
    }
    field(:bright, 34) {
        number 8, true, 1, BooleanEnum
    }
end

class PowerInfo < MemHack::Compound
    sizeof 8

    field(:produced, 0) {
        number 32, true
    }
    field(:consumed, 4) {
        number 32, true
    }
end

class PressurePlateInfo < MemHack::Compound
    sizeof 24

    field(:unit_min, 0) {
        number 32, true, 50000
    }
    field(:unit_max, 4) {
        number 32, true, 200000
    }
    field(:water_min, 8) {
        number 8, true, 1
    }
    field(:water_max, 9) {
        number 8, true, 7
    }
    field(:magma_min, 10) {
        number 8, true, 1
    }
    field(:magma_max, 11) {
        number 8, true, 7
    }
    field(:track_min, 12) {
        number 32, true, 1
    }
    field(:track_max, 16) {
        number 32, true, 2000
    }
    field(:flags, 20) {
        compound(:PressurePlateInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true, 0x10
            }
            field(:units, 0) { bit 0 }
            field(:water, 0) { bit 1 }
            field(:magma, 0) { bit 2 }
            field(:citizens, 0) { bit 3 }
            field(:resets, 0) { bit 4 }
            field(:track, 0) { bit 5 }
        }
    }
end

class Projectile < MemHack::Compound
    sizeof 144

    rtti_classname :projst

    field(:link, 8) {
        pointer {
            global :ProjListLink
        }
    }
    field(:id, 16) {
        number 32, true
    }
    field(:firer, 24) {
        pointer {
            global :Unit
        }
    }
    field(:origin_pos, 32) {
        global :Coord
    }
    field(:target_pos, 38) {
        global :Coord
    }
    field(:cur_pos, 44) {
        global :Coord
    }
    field(:prev_pos, 50) {
        global :Coord
    }
    field(:distance_flown, 56) {
        number 32, true
    }
    field(:fall_threshold, 60) {
        number 32, true
    }
    field(:min_hit_distance, 64) {
        number 32, true
    }
    field(:min_ground_distance, 68) {
        number 32, true
    }
    field(:flags, 72) {
        global :ProjectileFlags
    }
    field(:fall_counter, 76) {
        number 16, true
    }
    field(:fall_delay, 78) {
        number 16, true
    }
    field(:hit_rating, 80) {
        number 32, true
    }
    field(:unk21, 84) {
        number 32, true
    }
    field(:unk22, 88) {
        number 32, true
    }
    field(:bow_id, 92) {
        number 32, true, -1
    }
    def bow_tg ; df.world.items.all.binsearch(bow_id) ; end
    field(:unk_item_id, 96) {
        number 32, true, -1
    }
    def unk_item_tg ; df.world.items.all.binsearch(unk_item_id) ; end
    field(:unk_unit_id, 100) {
        number 32, true, -1
    }
    def unk_unit_tg ; df.world.units.all.binsearch(unk_unit_id) ; end
    field(:unk_v40_1, 104) {
        number 32, true
    }
    field(:pos_x, 108) {
        number 32, true
    }
    field(:pos_y, 112) {
        number 32, true
    }
    field(:pos_z, 116) {
        number 32, true
    }
    field(:speed_x, 120) {
        number 32, true
    }
    field(:speed_y, 124) {
        number 32, true
    }
    field(:speed_z, 128) {
        number 32, true
    }
    field(:accel_x, 132) {
        number 32, true
    }
    field(:accel_y, 136) {
        number 32, true
    }
    field(:accel_z, 140) {
        number 32, true
    }
    def getType()
        ProjectileType.sym(DFHack.vmethod_call(self, 0))
    end
    def checkImpact(noDamageFloor)
        val = DFHack.vmethod_call(self, 8, noDamageFloor)
        (val & 1) != 0
    end
    def checkMovement()
        val = DFHack.vmethod_call(self, 16)
        (val & 1) != 0
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
    def write_file(file)
        DFHack.vmethod_call(self, 32, file) ; nil
    end
    def isObjectLost()
        val = DFHack.vmethod_call(self, 48)
        (val & 1) != 0
    end
end

class ProjItemst < Projectile
    sizeof 152

    rtti_classname :proj_itemst

    field(:item, 144) {
        pointer {
            global :Item
        }
    }
end

class ProjListLink < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :Projectile
        }
    }
    field(:prev, 8) {
        pointer {
            global :ProjListLink
        }
    }
    field(:next, 16) {
        pointer {
            global :ProjListLink
        }
    }
end

class ProjMagicst < Projectile
    sizeof 152

    rtti_classname :proj_magicst

    field(:unk, 144) {
        pointer {
        }
    }
end

class ProjUnitst < Projectile
    sizeof 152

    rtti_classname :proj_unitst

    field(:unit, 144) {
        pointer {
            global :Unit
        }
    }
end

class ProjectileFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:no_impact_destroy, 0) { bit 0 }
    field(:has_hit_ground, 0) { bit 1 }
    field(:bouncing, 0) { bit 2 }
    field(:high_flying, 0) { bit 3 }
    field(:piercing, 0) { bit 4 }
    field(:to_be_deleted, 0) { bit 5 }
    field(:unk6, 0) { bit 6 }
    field(:unk7, 0) { bit 7 }
    field(:parabolic, 0) { bit 8 }
    field(:unk9, 0) { bit 9 }
    field(:unk10, 0) { bit 10 }
    field(:no_collide, 0) { bit 11 }
    field(:safe_landing, 0) { bit 12 }
end

class PropertyOwnership < MemHack::Compound
    sizeof 28

    field(:index, 0) {
        number 32, true
    }
    field(:is_concrete_property, 4) {
        number 8, true, nil, BooleanEnum
    }
    field(:pad_1, 5) {
    }
    field(:property_index, 8) {
        number 32, true
    }
    field(:unk_hfid, 12) {
        number 32, true, -1
    }
    def unk_hfid_tg ; df.world.history.figures.binsearch(unk_hfid) ; end
    field(:owner_entity_id, 16) {
        number 32, true, -1
    }
    def owner_entity_tg ; df.world.entities.all.binsearch(owner_entity_id) ; end
    field(:owner_hfid, 20) {
        number 32, true, -1
    }
    def owner_hfid_tg ; df.world.history.figures.binsearch(owner_hfid) ; end
    field(:unk_owner_entity_id, 24) {
        number 32, true, -1
    }
    def unk_owner_entity_tg ; df.world.entities.all.binsearch(unk_owner_entity_id) ; end
end

class Punishment < MemHack::Compound
    sizeof 48

    field(:criminal, 0) {
        number 32, true, -1
    }
    def criminal_tg ; df.world.units.all.binsearch(criminal) ; end
    field(:officer, 4) {
        number 32, true, -1
    }
    def officer_tg ; df.world.units.all.binsearch(officer) ; end
    field(:beating, 8) {
        number 16, true
    }
    field(:hammer_strikes, 10) {
        number 16, true
    }
    field(:prison_counter, 12) {
        number 32, true
    }
    field(:unk_10, 16) {
        number 16, true
    }
    field(:chain, 20) {
        number 32, true, -1
    }
    def chain_tg ; df.world.buildings.all.binsearch(chain) ; end
    field(:victims, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def victims_tg ; victims.map { |i| df.world.units.all.binsearch(i) } ; end
end

class Reaction < MemHack::Compound
    sizeof 392

    field(:code, 0) {
        stl_string
    }
    field(:name, 32) {
        stl_string
    }
    field(:flags, 64) {
        df_flagarray(ReactionFlags)
    }
    field(:reagents, 80) {
        stl_vector(8) {
            pointer {
                global :ReactionReagent
            }
        }
    }
    field(:products, 104) {
        stl_vector(8) {
            pointer {
                global :ReactionProduct
            }
        }
    }
    field(:skill, 128) {
        number 16, true, nil, JobSkill
    }
    field(:max_multiplier, 132) {
        number 32, true, -1
    }
    field(:building, 136) {
        compound(:Reaction_TBuilding) {
            field(:str, 0) {
                static_array(2, 24) {
                    stl_vector(8) {
                        pointer {
                            stl_string
                        }
                    }
                }
            }
            field(:type, 48) {
                stl_vector(4) {
                    number 32, true, nil, BuildingType
                }
            }
            field(:subtype, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:custom, 96) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:hotkey, 120) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:index, 280) {
        number 32, true
    }
    field(:source_hfid, 284) {
        number 32, true, -1
    }
    def source_hfid_tg ; df.world.history.figures.binsearch(source_hfid) ; end
    field(:source_enid, 288) {
        number 32, true, -1
    }
    def source_enid_tg ; df.world.entities.all.binsearch(source_enid) ; end
    field(:raw_strings, 296) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:category, 320) {
        stl_string
    }
    field(:descriptions, 352) {
        stl_vector(8) {
            pointer {
                global :ReactionDescription
            }
        }
    }
    field(:quality_adj1, 376) {
        number 32, true, 11
    }
    field(:quality_adj2, 380) {
        number 32, true, 5
    }
    field(:unk_1, 384) {
        number 32, true, 10
    }
    field(:exp_gain, 388) {
        number 32, true, 30
    }
end

class ReactionCategory < MemHack::Compound
    sizeof 136

    field(:id, 0) {
        stl_string
    }
    field(:parent, 32) {
        stl_string
    }
    field(:name, 64) {
        stl_string
    }
    field(:key, 96) {
        number 32, true
    }
    field(:description, 104) {
        stl_string
    }
end

class ReactionDescription < MemHack::Compound
    sizeof 72

    field(:unk_1, 0) {
        stl_string
    }
    field(:item_type, 32) {
        number 16, true, nil, ItemType
    }
    field(:unk_2, 40) {
        stl_string
    }
end

class ReactionProduct < MemHack::Compound
    sizeof 72

    rtti_classname :reaction_productst

    field(:product_token, 8) {
        stl_string
    }
    field(:product_to_container, 40) {
        stl_string
    }
    def getType()
        ReactionProductType.sym(DFHack.vmethod_call(self, 0))
    end
    def resolveTokens(reactionID)
        DFHack.vmethod_call(self, 8, reactionID) ; nil
    end
    def produce(maker, out_products, out_items, in_reag, in_items, quantity, skill, job_quality, entity, site, unk4)
        DFHack.vmethod_call(self, 16, maker, out_products, out_items, in_reag, in_items, quantity, JobSkill.int(skill), job_quality, entity, site, unk4) ; nil
    end
    def getDescription(desc)
        DFHack.vmethod_call(self, 24, desc) ; nil
    end
end

class ReactionProductItemImprovementst < ReactionProduct
    sizeof 336

    rtti_classname :reaction_product_item_improvementst

    field(:target_reagent, 72) {
        stl_string
    }
    field(:improvement_type, 104) {
        number 32, true, nil, ImprovementType
    }
    field(:improvement_specific_type, 108) {
        number 32, true, nil, ItemimprovementSpecificType
    }
    field(:mat_type, 112) {
        number 16, true, -1
    }
    field(:mat_index, 116) {
        number 32, true
    }
    field(:probability, 120) {
        number 16, true
    }
    field(:flags, 128) {
        df_flagarray(ReactionProductImprovementFlags)
    }
    field(:get_material, 144) {
        compound(:ReactionProductItemImprovementst_TGetMaterial) {
            field(:reagent_code, 0) {
                stl_string
            }
            field(:product_code, 32) {
                stl_string
            }
        }
    }
    field(:material_str, 208) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:unk_v4201_2, 304) {
        stl_string
    }
end

class ReactionProductItemst < ReactionProduct
    sizeof 336

    rtti_classname :reaction_product_itemst

    field(:item_type, 72) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 74) {
        number 16, true, -1
    }
    field(:mat_type, 76) {
        number 16, true, -1
    }
    field(:mat_index, 80) {
        number 32, true
    }
    field(:probability, 84) {
        number 16, true
    }
    field(:count, 86) {
        number 16, true
    }
    field(:product_dimension, 88) {
        number 32, true
    }
    field(:flags, 96) {
        df_flagarray(ReactionProductItemFlags)
    }
    field(:get_material, 112) {
        compound(:ReactionProductItemst_TGetMaterial) {
            field(:reagent_code, 0) {
                stl_string
            }
            field(:product_code, 32) {
                stl_string
            }
        }
    }
    field(:item_str, 176) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:material_str, 240) {
        static_array(3, 32) {
            stl_string
        }
    }
end

class ReactionReagent < MemHack::Compound
    sizeof 48

    rtti_classname :reaction_reagentst

    field(:code, 8) {
        stl_string
    }
    field(:quantity, 40) {
        number 32, true
    }
    field(:flags, 44) {
        global :ReactionReagentFlags
    }
    def getType()
        ReactionReagentType.sym(DFHack.vmethod_call(self, 0))
    end
    def resolveTokens(reactionID)
        DFHack.vmethod_call(self, 24, reactionID) ; nil
    end
    def matchesRoot(arg0, index)
        val = DFHack.vmethod_call(self, 40, arg0, index)
        (val & 1) != 0
    end
    def matchesChild(arg0, arg1, index)
        val = DFHack.vmethod_call(self, 48, arg0, arg1, index)
        (val & 1) != 0
    end
    def getDescription(arg0, index)
        DFHack.vmethod_call(self, 56, arg0, index) ; nil
    end
    def isLyeBearing()
        val = DFHack.vmethod_call(self, 64)
        (val & 1) != 0
    end
end

class ReactionReagentFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:PRESERVE_REAGENT, 0) { bit 0 }
    field(:IN_CONTAINER, 0) { bit 1 }
    field(:DOES_NOT_DETERMINE_PRODUCT_AMOUNT, 0) { bit 2 }
end

class ReactionReagentItemst < ReactionReagent
    sizeof 400

    rtti_classname :reaction_reagent_itemst

    field(:item_type, 48) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 50) {
        number 16, true, -1
    }
    field(:mat_type, 52) {
        number 16, true, -1
    }
    field(:mat_index, 54) {
        number 16, true
    }
    field(:reaction_class, 56) {
        stl_string
    }
    field(:has_material_reaction_product, 88) {
        stl_string
    }
    field(:flags1, 120) {
        global :JobItemFlags1
    }
    field(:flags2, 124) {
        global :JobItemFlags2
    }
    field(:flags3, 128) {
        global :JobItemFlags3
    }
    field(:flags4, 132) {
        number 32, false
    }
    field(:flags5, 136) {
        number 32, false
    }
    field(:metal_ore, 140) {
        number 32, true, -1
    }
    def metal_ore_tg ; df.world.raws.inorganics[metal_ore] ; end
    field(:min_dimension, 144) {
        number 32, true
    }
    field(:contains, 152) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:has_tool_use, 176) {
        number 16, true, nil, ToolUses
    }
    field(:item_str, 184) {
        static_array(2, 32) {
            stl_string
        }
    }
    field(:material_str, 248) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:metal_ore_str, 344) {
        stl_string
    }
    field(:contains_str, 376) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class RegionBlockEventst < MemHack::Compound
    sizeof 8

    rtti_classname :region_block_eventst

    def getType()
        RegionBlockEventType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class RegionBlockEventSphereFieldst < RegionBlockEventst
    sizeof 40

    rtti_classname :region_block_event_sphere_fieldst

    field(:unk_1, 8) {
        static_array(16, 2) {
            number 16, true
        }
    }
end

class RegionMapEntry < MemHack::Compound
    sizeof 112

    field(:unk_0, 0) {
        number 32, true
    }
    field(:finder_rank, 4) {
        number 32, true, -1
    }
    field(:sites, 8) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:flags, 32) {
        df_flagarray(RegionMapEntryFlags)
    }
    field(:elevation, 48) {
        number 16, true
    }
    field(:rainfall, 50) {
        number 16, true
    }
    field(:vegetation, 52) {
        number 16, true
    }
    field(:temperature, 54) {
        number 16, true
    }
    field(:evilness, 56) {
        number 16, true
    }
    field(:drainage, 58) {
        number 16, true
    }
    field(:volcanism, 60) {
        number 16, true
    }
    field(:savagery, 62) {
        number 16, true
    }
    field(:air_temp, 64) {
        number 16, true
    }
    field(:air_x, 66) {
        number 16, true
    }
    field(:air_y, 68) {
        number 16, true
    }
    field(:clouds, 70) {
        compound(:RegionMapEntry_TClouds) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:front, 0) { bits 0, 2, FrontType }
            field(:cumulus, 0) { bits 2, 2, CumulusType }
            field(:cirrus, 0) { bit 4 }
            field(:stratus, 0) { bits 5, 2, StratusType }
            field(:fog, 0) { bits 7, 2, FogType }
            field(:countdown, 0) { bits 9, 4 }
        }
    }
    field(:wind, 72) {
        compound(:RegionMapEntry_TWind) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:north_1, 0) { bit 0 }
            field(:south_1, 0) { bit 1 }
            field(:east_1, 0) { bit 2 }
            field(:west_1, 0) { bit 3 }
            field(:north_2, 0) { bit 4 }
            field(:south_2, 0) { bit 5 }
            field(:east_2, 0) { bit 6 }
            field(:west_2, 0) { bit 7 }
        }
    }
    field(:snowfall, 74) {
        number 16, true
    }
    field(:salinity, 76) {
        number 16, true
    }
    field(:unk_3e, 78) {
        global :Coord
    }
    field(:unk_44, 84) {
        global :Coord
    }
    field(:unk_4a, 90) {
        global :Coord
    }
    field(:region_id, 96) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region_id] ; end
    field(:landmass_id, 100) {
        number 32, true, -1
    }
    def landmass_tg ; df.world.world_data.landmasses[landmass_id] ; end
    field(:geo_index, 104) {
        number 16, true, -1
    }
    def geo_index_tg ; df.world.world_data.geo_biomes[geo_index] ; end
end

class RegionWeather < MemHack::Compound
    sizeof 56

    field(:id, 0) {
        number 32, true
    }
    field(:type, 4) {
        number 32, true, nil, RegionWeatherType
    }
    field(:mat_type, 8) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true
    }
    field(:announcement, 16) {
        number 8, true, nil, BooleanEnum
    }
    field(:region_x, 20) {
        number 32, true
    }
    field(:region_y, 24) {
        number 32, true
    }
    field(:world_in_game_x, 28) {
        number 32, true, -30000
    }
    field(:world_in_game_y, 32) {
        number 32, true, -30000
    }
    field(:world_in_game_z, 36) {
        number 32, true, -30000
    }
    field(:cloud_x_movement, 40) {
        number 32, true
    }
    field(:cloud_y_movement, 44) {
        number 32, true
    }
    field(:remaining_duration, 48) {
        number 32, true
    }
    field(:region_id, 52) {
        number 32, true, -1
    }
    def region_tg ; df.world.world_data.regions[region_id] ; end
end

class RelationshipEvent < MemHack::Compound
    sizeof 18440

    field(:event, 0) {
        static_array(1024, 4) {
            number 32, true
        }
    }
    field(:relationship, 4096) {
        static_array(1024, 2) {
            global :VagueRelationshipType
        }
    }
    field(:source_hf, 6144) {
        static_array(1024, 4) {
            number 32, true, -1
        }
    }
    def source_hf_tg ; df.world.history.figures.binsearch(source_hf) ; end
    field(:target_hf, 10240) {
        static_array(1024, 4) {
            number 32, true, -1
        }
    }
    def target_hf_tg ; df.world.history.figures.binsearch(target_hf) ; end
    field(:year, 14336) {
        static_array(1024, 4) {
            number 32, true
        }
    }
    field(:next_element, 18432) {
        number 32, true
    }
    field(:start_year, 18436) {
        number 32, true
    }
end

class RelationshipEventSupplement < MemHack::Compound
    sizeof 20

    field(:event, 0) {
        number 32, true
    }
    field(:occasion_type, 4) {
        number 32, true
    }
    field(:site, 8) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
    field(:unk_1, 12) {
        number 32, true
    }
    field(:profession, 16) {
        number 16, true, nil, Profession
    }
end

class Renderer < MemHack::Compound
    sizeof 104

    rtti_classname :renderer

    field(:screen, 8) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos, 16) {
        pointer_ary(4) {
            number 4, true
        }
    }
    field(:screentexpos_addcolor, 24) {
        pointer_ary(1) {
            number 8, true
        }
    }
    field(:screentexpos_grayscale, 32) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cf, 40) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cbr, 48) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screen_old, 56) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_old, 64) {
        pointer_ary(4) {
            number 4, true
        }
    }
    field(:screentexpos_addcolor_old, 72) {
        pointer_ary(1) {
            number 8, true
        }
    }
    field(:screentexpos_grayscale_old, 80) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cf_old, 88) {
        pointer_ary(1) {
            number 8, false
        }
    }
    field(:screentexpos_cbr_old, 96) {
        pointer_ary(1) {
            number 8, false
        }
    }
    def update_tile(x, y)
        DFHack.vmethod_call(self, 0, x, y) ; nil
    end
    def update_all()
        DFHack.vmethod_call(self, 8) ; nil
    end
    def render()
        DFHack.vmethod_call(self, 16) ; nil
    end
    def set_fullscreen()
        DFHack.vmethod_call(self, 24) ; nil
    end
    def zoom(arg0)
        DFHack.vmethod_call(self, 32, ZoomCommands.int(arg0)) ; nil
    end
    def resize(w, h)
        DFHack.vmethod_call(self, 40, w, h) ; nil
    end
    def grid_resize(w, h)
        DFHack.vmethod_call(self, 48, w, h) ; nil
    end
    def get_mouse_coords(x, y)
        val = DFHack.vmethod_call(self, 64, x, y)
        (val & 1) != 0
    end
    def uses_opengl()
        val = DFHack.vmethod_call(self, 72)
        (val & 1) != 0
    end
end

class Report < MemHack::Compound
    sizeof 104

    field(:type, 0) {
        number 16, true, nil, AnnouncementType
    }
    field(:text, 8) {
        stl_string
    }
    field(:color, 40) {
        number 16, true, 7
    }
    field(:bright, 42) {
        number 8, true, 1, BooleanEnum
    }
    field(:duration, 44) {
        number 32, true, 100
    }
    field(:flags, 48) {
        compound(:Report_TFlags) {
            field(:_whole, 0) {
                number 8, false
            }
            field(:continuation, 0) { bit 0 }
            field(:unconscious, 0) { bit 1 }
            field(:announcement, 0) { bit 2 }
        }
    }
    field(:repeat_count, 52) {
        number 32, true
    }
    field(:zoom_type, 56) {
        number 32, true, nil, ReportZoomType
    }
    field(:pos, 60) {
        global :Coord
    }
    field(:zoom_type2, 68) {
        number 32, true, nil, ReportZoomType
    }
    field(:pos2, 72) {
        global :Coord
    }
    field(:id, 80) {
        number 32, true
    }
    field(:year, 84) {
        number 32, true
    }
    field(:time, 88) {
        number 32, true
    }
    field(:unk_v40_1, 92) {
        number 32, true, -1
    }
    field(:unk_v40_2, 96) {
        number 32, true, -1
    }
    field(:speaker_id, 100) {
        number 32, true, -1
    }
    def speaker_tg ; df.world.units.all.binsearch(speaker_id) ; end
end

class ReportInit < MemHack::Compound
    sizeof 64

    field(:type, 0) {
        number 16, true, nil, AnnouncementType
    }
    field(:color, 2) {
        number 16, true
    }
    field(:bright, 4) {
        number 8, true, nil, BooleanEnum
    }
    field(:pos, 6) {
        global :Coord
    }
    field(:zoom_type, 12) {
        number 32, true, nil, ReportZoomType
    }
    field(:pos2, 16) {
        global :Coord
    }
    field(:zoom_type2, 24) {
        number 32, true, nil, ReportZoomType
    }
    field(:display_timer, 28) {
        number 16, true, 2000
    }
    field(:unit1, 32) {
        pointer {
            global :Unit
        }
    }
    field(:unit2, 40) {
        pointer {
            global :Unit
        }
    }
    field(:unk_v40_1, 48) {
        number 32, true, -1
    }
    field(:unk_v40_2, 52) {
        number 32, true, -1
    }
    field(:speaker_id, 56) {
        number 32, true, -1
    }
    def speaker_tg ; df.world.units.all.binsearch(speaker_id) ; end
    field(:flags, 60) {
        compound(:ReportInit_TFlags) {
            field(:_whole, 0) {
                number 8, false
            }
            field(:hostile_combat, 0) { bit 0 }
        }
    }
end

class ResourceAllotmentData < MemHack::Compound
    sizeof 2448

    field(:index, 0) {
        number 32, true
    }
    field(:resource_allotments, 8) {
        static_array(100, 24) {
            stl_vector(8) {
                pointer {
                    global :ResourceAllotmentSpecifier
                }
            }
        }
    }
    field(:unk1, 2408) {
        number 32, true
    }
    field(:unk2, 2412) {
        number 32, true
    }
    field(:unk3, 2416) {
        number 32, true
    }
    field(:unk_650, 2420) {
        number 32, true
    }
    field(:unk_654, 2424) {
        stl_vector(8) {
            pointer {
                compound(:ResourceAllotmentData_TUnk654) {
                    sizeof 80

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:unk_4, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_14, 32) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_24, 56) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
end

class ResourceAllotmentSpecifier < MemHack::Compound
    sizeof 24

    rtti_classname :resource_allotment_specifierst

    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_2, 12) {
        number 32, true
    }
    field(:unk_3, 16) {
        number 32, true
    }
    def getType()
        ResourceAllotmentSpecifierType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class ResourceAllotmentSpecifierAmmost < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_ammost

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierAnvilst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_anvilst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierArmorBodyst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_armor_bodyst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierArmorBootsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_armor_bootsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierArmorGlovesst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_armor_glovesst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierArmorHelmst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_armor_helmst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierArmorPantsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_armor_pantsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierBackpackst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_backpackst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierBagst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_bagst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierBedst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_bedst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierBonest < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_bonest

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierBoxst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_boxst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierCabinetst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_cabinetst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierChairst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_chairst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierCheesest < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_cheesest

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothingBodyst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_clothing_bodyst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothingBootsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_clothing_bootsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothingGlovesst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_clothing_glovesst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothingHelmst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_clothing_helmst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothingPantsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_clothing_pantsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierClothst < ResourceAllotmentSpecifier
    sizeof 56

    rtti_classname :resource_allotment_specifier_clothst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        number 32, true
    }
    field(:unk_7, 44) {
        number 32, true
    }
    field(:unk_8, 48) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierCraftsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_craftsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierCropst < ResourceAllotmentSpecifier
    sizeof 56

    rtti_classname :resource_allotment_specifier_cropst

    field(:mat_type, 24) {
        number 32, true, -1
    }
    field(:unk_4, 28) {
        number 32, true
    }
    field(:unk_v40_01, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        static_array(5, 4) {
            number 32, true
        }
    }
end

class ResourceAllotmentSpecifierExtractst < ResourceAllotmentSpecifier
    sizeof 48

    rtti_classname :resource_allotment_specifier_extractst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:mat_type2, 36) {
        number 16, true, -1
    }
    field(:mat_index2, 40) {
        number 32, true
    }
    field(:unk_5, 44) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierFlaskst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_flaskst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierGemsst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_gemsst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierHornst < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_hornst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierLeatherst < ResourceAllotmentSpecifier
    sizeof 72

    rtti_classname :resource_allotment_specifier_leatherst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        number 32, true
    }
    field(:unk_7, 44) {
        number 32, true
    }
    field(:unk_8, 48) {
        number 32, true
    }
    field(:unk_9, 52) {
        number 32, true
    }
    field(:unk_10, 56) {
        number 32, true
    }
    field(:unk_11, 60) {
        number 32, true
    }
    field(:unk_12, 64) {
        number 32, true
    }
    field(:unk_13, 68) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierMeatst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_meatst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierMetalst < ResourceAllotmentSpecifier
    sizeof 88

    rtti_classname :resource_allotment_specifier_metalst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        static_array(12, 4) {
            number 32, true
        }
    }
end

class ResourceAllotmentSpecifierPearlst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_pearlst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierPowderst < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_powderst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierQuiverst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_quiverst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierShellst < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_shellst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierSkinst < ResourceAllotmentSpecifier
    sizeof 48

    rtti_classname :resource_allotment_specifier_skinst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:mat_type2, 32) {
        number 16, true, -1
    }
    field(:mat_index2, 36) {
        number 32, true
    }
    field(:unk_4, 40) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierSoapst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_soapst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierStonest < ResourceAllotmentSpecifier
    sizeof 64

    rtti_classname :resource_allotment_specifier_stonest

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        static_array(5, 4) {
            number 32, true
        }
    }
end

class ResourceAllotmentSpecifierTablest < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_tablest

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierTallowst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_tallowst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierThreadst < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_threadst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierToothst < ResourceAllotmentSpecifier
    sizeof 40

    rtti_classname :resource_allotment_specifier_toothst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierWeaponMeleest < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_weapon_meleest

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierWeaponRangedst < ResourceAllotmentSpecifier
    sizeof 32

    rtti_classname :resource_allotment_specifier_weapon_rangedst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
end

class ResourceAllotmentSpecifierWoodst < ResourceAllotmentSpecifier
    sizeof 56

    rtti_classname :resource_allotment_specifier_woodst

    field(:mat_type, 24) {
        number 16, true, -1
    }
    field(:mat_index, 28) {
        number 32, true
    }
    field(:unk_4, 32) {
        number 32, true
    }
    field(:unk_5, 36) {
        number 32, true
    }
    field(:unk_6, 40) {
        number 32, true
    }
    field(:unk_7, 44) {
        number 32, true
    }
    field(:unk_8, 48) {
        number 32, true
    }
    field(:unk_9, 52) {
        number 32, true
    }
end

class Rhythm < MemHack::Compound
    sizeof 64

    field(:id, 0) {
        number 32, true
    }
    field(:patterns, 8) {
        stl_vector(8) {
            pointer {
                global :RhythmPattern
            }
        }
    }
    field(:sub_rhythms, 32) {
        stl_vector(8) {
            pointer {
                global :SubRhythm
            }
        }
    }
    field(:unk_2, 56) {
        number 32, true
    }
end

class RhythmPattern < MemHack::Compound
    sizeof 80

    field(:name, 0) {
        stl_string
    }
    field(:bars, 32) {
        stl_vector(8) {
            pointer {
                compound(:RhythmPattern_TBars) {
                    sizeof 16

                    field(:beat, 0) {
                        pointer_ary(4) {
                            global :Beat
                        }
                    }
                    field(:length, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:beat_name, 56) {
        pointer_ary(32) {
            stl_string
        }
    }
    field(:beat_abbreviation, 64) {
        pointer_ary(32) {
            stl_string
        }
    }
    field(:length, 72) {
        number 32, true
    }
end

class RoomRentInfo < MemHack::Compound
    sizeof 32

    field(:elements, 0) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:rent_value, 24) {
        number 32, true
    }
    field(:flags, 28) {
        compound(:RoomRentInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:eviction_underway, 0) { bit 0 }
            field(:move_underway, 0) { bit 1 }
        }
    }
end

class RouteStockpileLink < MemHack::Compound
    sizeof 8

    field(:building_id, 0) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:mode, 4) {
        compound(:RouteStockpileLink_TMode) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:take, 0) { bit 0 }
            field(:give, 0) { bit 1 }
        }
    }
end

class Scale < MemHack::Compound
    sizeof 1880

    field(:id, 0) {
        number 32, true
    }
    field(:flags, 4) {
        compound(:Scale_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:tonic_note_fixed_at_performance, 0) { bit 0 }
        }
    }
    field(:type, 8) {
        number 32, true, nil, ScaleType
    }
    field(:quartertones_used, 12) {
        static_array(25, 4) {
            number 32, true
        }
    }
    field(:scale_length, 112) {
        number 32, true
    }
    field(:chords, 120) {
        stl_vector(8) {
            pointer {
                global :Chord
            }
        }
    }
    field(:scales, 144) {
        stl_vector(8) {
            pointer {
                global :NamedScale
            }
        }
    }
    field(:notes, 168) {
        compound(:Scale_TNotes) {
            field(:unk_1, 0) {
                number 32, true
            }
            field(:name, 8) {
                static_array(25, 32) {
                    stl_string
                }
            }
            field(:abreviation, 808) {
                static_array(25, 32) {
                    stl_string
                }
            }
            field(:number, 1608) {
                static_array(25, 4) {
                    number 32, true
                }
            }
            field(:length, 1708) {
                number 32, true
            }
        }
    }
end

class ScheduleInfo < MemHack::Compound
    sizeof 32

    field(:id, 0) {
        number 32, true
    }
    field(:unk_1, 4) {
        number 16, true
    }
    field(:slots, 8) {
        stl_vector(8) {
            pointer {
                global :ScheduleSlot
            }
        }
    }
end

class ScheduleSlot < MemHack::Compound
    sizeof 10

    field(:type, 0) {
        number 16, true
    }
    field(:start_time, 2) {
        number 16, true
    }
    field(:end_time, 4) {
        number 16, true
    }
    field(:unk_1, 6) {
        number 16, true
    }
    field(:processed, 8) {
        number 8, true
    }
end

class Scribejob < MemHack::Compound
    sizeof 28

    field(:idmaybe, 0) {
        number 32, true
    }
    field(:unk_1, 4) {
        number 32, true
    }
    field(:item_id, 8) {
        number 32, true
    }
    field(:written_content_id, 12) {
        number 32, true
    }
    field(:unit_id, 16) {
        number 32, true
    }
    field(:activity_entry_id, 20) {
        number 32, true
    }
    field(:unk_2, 24) {
        number 32, true
    }
end

class ScriptStepst < MemHack::Compound
    sizeof 16

    rtti_classname :script_stepst

    field(:next_step_idx, 8) {
        number 32, true
    }
    def setNextStep(idx)
        val = DFHack.vmethod_call(self, 0, idx)
        (val & 1) != 0
    end
    def execute(context)
        val = DFHack.vmethod_call(self, 8, context)
    end
    def skip(context)
        val = DFHack.vmethod_call(self, 16, context)
    end
end

class ScriptStepConditionalst < ScriptStepst
    sizeof 184

    rtti_classname :script_step_conditionalst

    field(:condition, 16) {
        compound(:ScriptStepConditionalst_TCondition) {
            field(:var1_type, 0) {
                stl_string
            }
            field(:var1_name, 32) {
                stl_string
            }
            field(:comparison, 64) {
                stl_string
            }
            field(:var2_type, 96) {
                stl_string
            }
            field(:var2_name, 128) {
                stl_string
            }
        }
    }
    field(:conditional_next_step_idx, 176) {
        number 32, true
    }
end

class ScriptStepConstructtopiclistst < ScriptStepst
    sizeof 16

    rtti_classname :script_step_constructtopiclistst

end

class ScriptStepEventst < ScriptStepst
    sizeof 16

    rtti_classname :script_step_eventst

end

class ScriptStepDipeventst < ScriptStepEventst
    sizeof 176

    rtti_classname :script_step_dipeventst

    field(:parm1, 16) {
        stl_string
    }
    field(:parm2, 48) {
        stl_string
    }
    field(:parm3, 80) {
        stl_string
    }
    field(:parm4, 112) {
        stl_string
    }
    field(:parm5, 144) {
        stl_string
    }
end

class ScriptStepDiphistoryst < ScriptStepst
    sizeof 48

    rtti_classname :script_step_diphistoryst

    field(:event, 16) {
        stl_string
    }
end

class ScriptStepDiscussst < ScriptStepst
    sizeof 48

    rtti_classname :script_step_discussst

    field(:event, 16) {
        stl_string
    }
end

class ScriptStepInvasionst < ScriptStepEventst
    sizeof 48

    rtti_classname :script_step_invasionst

    field(:parm, 16) {
        stl_string
    }
end

class ScriptStepSetvarst < ScriptStepst
    sizeof 144

    rtti_classname :script_step_setvarst

    field(:dest_type, 16) {
        stl_string
    }
    field(:dest_name, 48) {
        stl_string
    }
    field(:src_type, 80) {
        stl_string
    }
    field(:src_name, 112) {
        stl_string
    }
end

class ScriptStepSimpleactionst < ScriptStepst
    sizeof 80

    rtti_classname :script_step_simpleactionst

    field(:type, 16) {
        stl_string
    }
    field(:subtype, 48) {
        stl_string
    }
end

class ScriptStepTextviewerst < ScriptStepst
    sizeof 80

    rtti_classname :script_step_textviewerst

    field(:filename, 16) {
        stl_string
    }
    field(:outvar_name, 48) {
        stl_string
    }
end

class ScriptStepTopicdiscussionst < ScriptStepst
    sizeof 16

    rtti_classname :script_step_topicdiscussionst

end

class ScriptVarst < MemHack::Compound
    sizeof 40

    rtti_classname :script_varst

    field(:name, 8) {
        stl_string
    }
    def instantiate()
        ptr = DFHack.vmethod_call(self, 0)
        class << self
            global :ActiveScriptVarst
        end._at(ptr) if ptr != 0
    end
end

class ScriptVarLongst < ScriptVarst
    sizeof 40

    rtti_classname :script_var_longst

end

class ScriptVarUnitst < ScriptVarst
    sizeof 40

    rtti_classname :script_var_unitst

end

class SetupCharacterInfo < MemHack::Compound
    sizeof 5824

    field(:name, 0) {
        global :LanguageName
    }
    field(:race, 120) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 122) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:skills, 124) {
        static_array(147, 4, JobSkill) {
            number 32, true, nil, SkillRating
        }
    }
    field(:entity, 712) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity) ; end
    field(:histfig, 716) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.nemesis.all[histfig] ; end
    field(:unk_284, 720) {
        number 32, true
    }
    field(:cultural_identity, 724) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity) ; end
    field(:nemesis, 728) {
        number 32, true, -1
    }
    def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis) ; end
    field(:unk_290, 732) {
        number 32, true
    }
    field(:unk_294, 736) {
        number 32, true
    }
    field(:skill_points_remaining, 740) {
        number 16, true
    }
    field(:physical_levels, 744) {
        static_array(6, 4, PhysicalAttributeType) {
            number 32, true, nil, AdventurerAttributeLevel
        }
    }
    field(:mental_levels, 768) {
        static_array(13, 4, MentalAttributeType) {
            number 32, true, nil, AdventurerAttributeLevel
        }
    }
    field(:status, 820) {
        class ::DFHack::SetupCharacterInfo_TStatus < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Peasant ; NUME[:Peasant] = 0
            ENUM[1] = :Hero ; NUME[:Hero] = 1
            ENUM[2] = :Demigod ; NUME[:Demigod] = 2
        end

        number 16, true, nil, SetupCharacterInfo_TStatus
    }
    field(:home_site_id, 824) {
        number 32, true, -1
    }
    def home_site_tg ; df.world.world_data.sites.binsearch(home_site_id) ; end
    field(:unk_1, 828) {
        number 32, true
    }
    field(:civilian_occupation, 832) {
        number 16, true
    }
    field(:civilian_skill, 836) {
        static_array(147, 4, JobSkill) {
            number 32, true
        }
    }
    field(:deity_id, 1424) {
        number 32, true, -1
    }
    def deity_tg ; df.world.history.figures.binsearch(deity_id) ; end
    field(:site_id, 1428) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:belief_strength, 1432) {
        number 32, true
    }
    field(:unk_v47_000, 1440) {
        pointer {
        }
    }
    field(:unk_v47_001, 1448) {
        number 32, true
    }
    field(:unk_v47_002, 1452) {
        number 32, true
    }
    field(:unk_v47_003, 1456) {
        number 32, true
    }
    field(:unk_v47_004, 1460) {
        number 32, true
    }
    field(:unk_v47_005, 1464) {
        number 32, true
    }
    field(:unk_v47_006, 1468) {
        number 32, true
    }
    field(:unk_v47_007, 1472) {
        number 32, true
    }
    field(:unk_v47_008, 1476) {
        number 32, true
    }
    field(:unk_v47_009, 1480) {
        number 32, true
    }
    field(:unk_v47_010, 1484) {
        number 32, true
    }
    field(:unk_v47_011, 1488) {
        number 32, true
    }
    field(:unk_v47_012, 1492) {
        number 32, true
    }
    field(:unk_v47_013, 1496) {
        number 32, true
    }
    field(:unk_v47_014, 1500) {
        number 32, true
    }
    field(:unk_v47_015, 1504) {
        number 32, true
    }
    field(:unk_v47_016, 1508) {
        number 32, true
    }
    field(:unk_v47_017, 1512) {
        number 32, true
    }
    field(:unk_v47_018, 1516) {
        number 32, true
    }
    field(:unk_v47_019, 1520) {
        number 32, true
    }
    field(:unk_v47_020, 1524) {
        number 32, true
    }
    field(:unk_v47_021, 1528) {
        number 32, true
    }
    field(:unk_v47_022, 1532) {
        number 32, true
    }
    field(:unk_v47_023, 1536) {
        number 32, true
    }
    field(:unk_v47_024, 1540) {
        number 32, true
    }
    field(:unk_v47_025, 1544) {
        number 32, true
    }
    field(:unk_v47_026, 1548) {
        number 32, true
    }
    field(:unk_v47_027, 1552) {
        number 32, true
    }
    field(:unk_v47_028, 1556) {
        number 32, true
    }
    field(:unk_v47_029, 1560) {
        number 32, true
    }
    field(:unk_v47_030, 1564) {
        number 32, true
    }
    field(:unk_v47_031, 1568) {
        number 32, true
    }
    field(:unk_v47_032, 1572) {
        number 32, true
    }
    field(:unk_v47_033, 1576) {
        number 32, true
    }
    field(:unk_v47_034, 1580) {
        number 32, true
    }
    field(:unk_v47_035, 1584) {
        number 32, true
    }
    field(:unk_v47_036, 1588) {
        number 32, true
    }
    field(:unk_v47_037, 1592) {
        number 32, true
    }
    field(:unk_v47_038, 1596) {
        number 32, true
    }
    field(:unk_v47_039, 1600) {
        number 32, true
    }
    field(:unk_v47_040, 1604) {
        number 32, true
    }
    field(:unk_v47_041, 1608) {
        number 32, true
    }
    field(:unk_v47_042, 1612) {
        number 32, true
    }
    field(:unk_v47_043, 1616) {
        number 32, true
    }
    field(:unk_v47_044, 1620) {
        number 32, true
    }
    field(:unk_v47_045, 1624) {
        number 32, true
    }
    field(:unk_v47_046, 1632) {
        pointer {
        }
    }
    field(:unk_v47_047, 1640) {
        pointer {
        }
    }
    field(:unk_v47_048, 1648) {
        pointer {
        }
    }
    field(:unk_v47_049, 1656) {
        pointer {
        }
    }
    field(:unk_v47_050, 1664) {
        pointer {
        }
    }
    field(:unk_v47_051, 1672) {
        pointer {
        }
    }
    field(:unk_v47_052, 1680) {
        number 32, true
    }
    field(:unk_v47_053, 1688) {
        pointer {
        }
    }
    field(:unk_v47_054, 1696) {
        pointer {
        }
    }
    field(:unk_v47_055, 1704) {
        pointer {
        }
    }
    field(:unk_v47_056, 1712) {
        pointer {
        }
    }
    field(:unk_v47_057, 1720) {
        pointer {
        }
    }
    field(:unk_v47_058, 1728) {
        pointer {
        }
    }
    field(:unk_v47_059, 1736) {
        pointer {
        }
    }
    field(:unk_v47_060, 1744) {
        pointer {
        }
    }
    field(:unk_v47_061, 1752) {
        pointer {
        }
    }
    field(:unk_v47_062, 1760) {
        pointer {
        }
    }
    field(:unk_v47_063, 1768) {
        pointer {
        }
    }
    field(:unk_v47_064, 1776) {
        pointer {
        }
    }
    field(:unk_v47_065, 1784) {
        pointer {
        }
    }
    field(:unk_v47_066, 1792) {
        pointer {
        }
    }
    field(:unk_v47_067, 1800) {
        number 32, true
    }
    field(:unk_v47_068, 1804) {
        number 32, true
    }
    field(:unk_v47_069, 1808) {
        number 16, true
    }
    field(:unk_v47_070, 1816) {
        pointer {
        }
    }
    field(:unk_v47_071, 1824) {
        number 16, true
    }
    field(:unk_v47_072, 1832) {
        stl_vector
    }
    field(:unk_v47_073, 1856) {
        number 32, true
    }
    field(:unk_v47_074, 1860) {
        number 32, true
    }
    field(:unk_v47_075, 1864) {
        number 32, true
    }
    field(:unk_v47_076, 1868) {
        number 32, true
    }
    field(:unk_v47_077, 1872) {
        number 32, true
    }
    field(:unk_v47_078, 1876) {
        number 32, true
    }
    field(:unk_v47_079, 1880) {
        stl_vector
    }
    field(:unk_v47_080, 1904) {
        stl_vector
    }
    field(:unk_v47_081, 1928) {
        stl_vector
    }
    field(:unk_v47_082, 1952) {
        stl_vector
    }
    field(:unk_v47_083, 1976) {
        number 32, true
    }
    field(:unk_v47_084, 1984) {
        stl_vector
    }
    field(:unk_v47_085, 2008) {
        static_array(50, 2) {
            number 16, true, 50
        }
    }
    field(:unk_v47_086, 2108) {
        number 32, true, -1
    }
    field(:unk_v47_087, 2112) {
        number 32, true, -1
    }
    field(:unk_v47_088, 2120) {
        stl_vector
    }
    field(:unk_v47_089, 2144) {
        stl_vector
    }
    field(:unk_v47_090, 2168) {
        number 32, true
    }
    field(:unk_v47_091, 2172) {
        number 32, true
    }
    field(:unk_v47_092, 2176) {
        number 32, true
    }
    field(:unk_v47_093, 2180) {
        number 32, true
    }
    field(:unk_v47_094, 2184) {
        number 32, true
    }
    field(:unk_v47_095, 2192) {
        stl_vector
    }
    field(:unk_v47_096, 2216) {
        number 32, true
    }
    field(:unk_v47_097, 2224) {
        pointer {
        }
    }
    field(:unk_v47_098, 2232) {
        number 32, true, -1
    }
    field(:unk_v47_099, 2236) {
        number 32, true, -1
    }
    field(:unk_v47_100, 2240) {
        pointer {
        }
    }
    field(:unk_v47_101, 2248) {
        number 32, true
    }
    field(:unk_v47_102, 2252) {
        number 32, true
    }
    field(:unk_v47_103, 2256) {
        number 32, true
    }
    field(:unk_v47_104, 2260) {
        number 32, true
    }
    field(:unk_v47_105, 2264) {
        number 32, true
    }
    field(:unk_v47_106, 2268) {
        number 32, true
    }
    field(:unk_v47_107, 2272) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_v47_108, 2276) {
        number 32, true
    }
    field(:page, 2280) {
        class ::DFHack::SetupCharacterInfo_TPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[5] = :Skills ; NUME[:Skills] = 5
            ENUM[6] = :Appearance ; NUME[:Appearance] = 6
            ENUM[7] = :Personality ; NUME[:Personality] = 7
            ENUM[8] = :Background ; NUME[:Background] = 8
            ENUM[9] = :Equipment ; NUME[:Equipment] = 9
            ENUM[10] = :MountsAndPets ; NUME[:MountsAndPets] = 10
        end

        number 32, true, nil, SetupCharacterInfo_TPage
    }
    field(:unk_v47_110, 2284) {
        number 32, true
    }
    field(:unk_v47_111, 2288) {
        number 32, true
    }
    field(:unk_v47_112, 2292) {
        number 32, true
    }
    field(:sel_trait_column, 2296) {
        class ::DFHack::SetupCharacterInfo_TSelTraitColumn < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :SkillsColumn ; NUME[:SkillsColumn] = 0
            ENUM[1] = :AttributesColumn ; NUME[:AttributesColumn] = 1
        end

        number 8, true, nil, SetupCharacterInfo_TSelTraitColumn
    }
    field(:attribute_idx, 2300) {
        number 32, true
    }
    field(:attribute_points_remaining, 2304) {
        number 32, true
    }
    field(:skill_list, 2312) {
        stl_vector(2) {
            number 16, true, nil, JobSkill
        }
    }
    field(:unk_8f0, 2336) {
        number 32, true
    }
    field(:unk_8f4, 2340) {
        number 32, true
    }
    field(:unk_v47_121, 2344) {
        number 8, true, nil, BooleanEnum
    }
    field(:saved_first_name, 2352) {
        stl_string
    }
    field(:description_lines, 2384) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_v47_123, 2408) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:unk_v47_124, 2432) {
        number 32, true
    }
    field(:unk_v47_125, 2440) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_126, 2464) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:unk_v47_127, 2488) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_128, 2512) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_129, 2536) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_130, 2560) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_131, 2584) {
        number 32, true
    }
    field(:unk_v47_132, 2588) {
        number 32, true
    }
    field(:unk_v47_133, 2592) {
        number 32, true
    }
    field(:home_description_lines, 2600) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_v47_135, 2624) {
        stl_vector
    }
    field(:unk_v47_136, 2648) {
        number 16, true
    }
    field(:unk_v47_137, 2652) {
        number 32, true
    }
    field(:unk_v47_138, 2656) {
        stl_vector
    }
    field(:unk_v47_139, 2680) {
        stl_vector
    }
    field(:unk_v47_140, 2704) {
        stl_vector
    }
    field(:pad_1, 2728) {
    }
    field(:equip_points_remaining, 3068) {
        number 32, true
    }
    field(:unk_v47_142, 3072) {
        stl_vector
    }
    field(:unk_v47_143, 3096) {
        number 32, true
    }
    field(:available_embark_items, 3104) {
        static_array(107, 24, EntitySellCategory) {
            stl_vector(8) {
                pointer {
                    compound(:SetupCharacterInfo_TAvailableEmbarkItems) {
                        sizeof 16

                        field(:item_type, 0) {
                            number 16, true, nil, ItemType
                        }
                        field(:item_subtype, 2) {
                            number 16, true
                        }
                        field(:mat_type, 4) {
                            number 16, true
                        }
                        field(:mat_index, 8) {
                            number 32, true
                        }
                        field(:unk_1, 12) {
                            number 8, true, nil, BooleanEnum
                        }
                    }
                }
            }
        }
    }
    field(:unk_v47_251, 5672) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_v47_252, 5696) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_v47_253, 5720) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_v47_254, 5744) {
        number 16, true
    }
    field(:unk_v47_255, 5748) {
        number 32, true
    }
    field(:unk_v47_256, 5752) {
        number 32, true
    }
    field(:unk_v47_257, 5760) {
        stl_vector
    }
    field(:unk_v47_258, 5784) {
        number 32, true
    }
    field(:unk_v47_259, 5788) {
        number 32, true
    }
    field(:unk_v47_260, 5792) {
        number 32, true
    }
    field(:unk_v47_261, 5800) {
        stl_vector
    }
end

class SiteBuildingItem < MemHack::Compound
    sizeof 16

    field(:race, 0) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:item_type, 4) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 6) {
        number 16, true, -1
    }
    field(:mat_type, 8) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true
    }
end

class SiteRealizationBuilding < MemHack::Compound
    sizeof 160

    field(:id, 0) {
        number 32, true
    }
    field(:type, 4) {
        number 32, true, nil, SiteRealizationBuildingType
    }
    field(:min_x, 8) {
        number 32, true
    }
    field(:min_y, 12) {
        number 32, true
    }
    field(:max_x, 16) {
        number 32, true
    }
    field(:max_y, 20) {
        number 32, true
    }
    field(:unk_18, 24) {
        number 32, true
    }
    field(:inhabitants, 32) {
        stl_vector(8) {
            pointer {
                global :WorldSiteInhabitant
            }
        }
    }
    field(:unk_2c, 56) {
        number 32, true
    }
    field(:item, 60) {
        global :SiteBuildingItem
    }
    field(:abstract_building_id, 76) {
        number 32, true
    }
    field(:unk_44, 80) {
        number 32, true
    }
    field(:building_info, 88) {
        pointer {
            global :SiteRealizationBuildingInfost
        }
    }
    field(:unk_4c, 96) {
        stl_vector(8) {
            pointer {
                compound(:SiteRealizationBuilding_TUnk4c) {
                    sizeof 24

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                    field(:owner, 8) {
                        number 32, true, -1
                    }
                    def owner_tg ; df.world.entities.all.binsearch(owner) ; end
                    field(:unk_c, 12) {
                        number 32, true
                    }
                    field(:unk_10, 16) {
                        number 32, true
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_5c, 120) {
        number 32, true
    }
    field(:unk_60, 128) {
        stl_vector
    }
    field(:unk_v40_1, 152) {
        number 32, true, -1000000
    }
end

class SiteRealizationBuildingInfost < MemHack::Compound
    sizeof 8

    rtti_classname :site_realization_building_infost

    def getType()
        SiteRealizationBuildingType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class SiteRealizationBuildingInfoCastleCourtyardst < SiteRealizationBuildingInfost
    sizeof 8

    rtti_classname :site_realization_building_info_castle_courtyardst

end

class SiteRealizationBuildingInfoCastleTowerst < SiteRealizationBuildingInfost
    sizeof 80

    rtti_classname :site_realization_building_info_castle_towerst

    field(:roof_z, 8) {
        number 32, true
    }
    field(:base_z, 12) {
        number 32, true
    }
    field(:door_n_elevation, 16) {
        number 32, true
    }
    field(:door_s_elevation, 20) {
        number 32, true
    }
    field(:door_e_elevation, 24) {
        number 32, true
    }
    field(:door_w_elevation, 28) {
        number 32, true
    }
    field(:door_item, 32) {
        global :SiteBuildingItem
    }
    field(:wall_item, 48) {
        global :SiteBuildingItem
    }
    field(:shape, 64) {
        global :TowerShape
    }
    field(:unk_40, 68) {
        number 32, true
    }
    field(:unk_44, 72) {
        number 32, true
    }
end

class SiteRealizationBuildingInfoCastleWallst < SiteRealizationBuildingInfost
    sizeof 72

    rtti_classname :site_realization_building_info_castle_wallst

    field(:length, 8) {
        number 32, true
    }
    field(:door_pos, 12) {
        number 32, true
    }
    field(:start_x, 16) {
        number 32, true
    }
    field(:start_y, 20) {
        number 32, true
    }
    field(:start_z, 24) {
        number 32, true
    }
    field(:end_x, 28) {
        number 32, true
    }
    field(:end_y, 32) {
        number 32, true
    }
    field(:end_z, 36) {
        number 32, true
    }
    field(:wall_item, 40) {
        global :SiteBuildingItem
    }
    field(:door_item, 56) {
        global :SiteBuildingItem
    }
end

class SiteRealizationBuildingInfoHillockHousest < SiteRealizationBuildingInfost
    sizeof 16

    rtti_classname :site_realization_building_info_hillock_housest

    field(:type, 8) {
        number 32, true, nil, HillockHouseType
    }
end

class SiteRealizationBuildingInfoMarketSquarest < SiteRealizationBuildingInfost
    sizeof 16

    rtti_classname :site_realization_building_info_market_squarest

    field(:type, 8) {
        number 32, true, nil, SiteShopType
    }
end

class SiteRealizationBuildingInfoShopHousest < SiteRealizationBuildingInfost
    sizeof 136

    rtti_classname :site_realization_building_info_shop_housest

    field(:type, 8) {
        number 32, true, nil, SiteShopType
    }
    field(:name, 16) {
        global :LanguageName
    }
end

class SiteRealizationBuildingInfoShrinest < SiteRealizationBuildingInfost
    sizeof 16

    rtti_classname :site_realization_building_info_shrinest

    field(:unk_1, 8) {
        number 32, true, -1
    }
    field(:unk_2, 12) {
        number 32, true, -1
    }
end

class SiteRealizationBuildingInfoTreeHousest < SiteRealizationBuildingInfost
    sizeof 136

    rtti_classname :site_realization_building_info_tree_housest

    field(:type, 8) {
        number 32, true, nil, TreeHouseType
    }
    field(:unk_8, 12) {
        number 32, true
    }
    field(:name, 16) {
        global :LanguageName
    }
end

class SiteRealizationBuildingInfoTrenchesst < SiteRealizationBuildingInfost
    sizeof 80

    rtti_classname :site_realization_building_info_trenchesst

    field(:unk_4, 8) {
        number 32, true
    }
    field(:spokes, 12) {
        static_array(4, 16) {
            compound(:SiteRealizationBuildingInfoTrenchesst_TSpokes) {
                field(:mound_min, 0) {
                    number 32, true
                }
                field(:trench_min, 4) {
                    number 32, true
                }
                field(:trench_max, 8) {
                    number 32, true
                }
                field(:mound_max, 12) {
                    number 32, true
                }
            }
        }
    }
end

class SiteRealizationCrossroads < MemHack::Compound
    sizeof 1072

    field(:road_min_y, 0) {
        static_array(48, 4) {
            number 32, true
        }
    }
    field(:road_max_y, 192) {
        static_array(48, 4) {
            number 32, true
        }
    }
    field(:road_min_x, 384) {
        static_array(48, 4) {
            number 32, true
        }
    }
    field(:road_max_x, 576) {
        static_array(48, 4) {
            number 32, true
        }
    }
    field(:idx_x, 768) {
        number 32, true
    }
    field(:idx_y, 772) {
        number 32, true
    }
    field(:tile_width, 776) {
        number 32, true
    }
    field(:tile_height, 780) {
        number 32, true
    }
    field(:unk_310, 784) {
        number 32, true
    }
    field(:unk_314, 788) {
        number 32, true
    }
    field(:unk_318, 792) {
        number 32, true
    }
    field(:unk_31c, 796) {
        number 32, true
    }
    field(:unk_320, 800) {
        number 32, true
    }
    field(:unk_324, 804) {
        number 32, true
    }
    field(:unk_328, 808) {
        number 32, true
    }
    field(:unk_32c, 812) {
        number 32, true
    }
    field(:center_x_tile, 816) {
        number 32, true
    }
    field(:center_y_tile, 820) {
        number 32, true
    }
    field(:up, 824) {
        pointer {
            global :SiteRealizationCrossroads
        }
    }
    field(:down, 832) {
        pointer {
            global :SiteRealizationCrossroads
        }
    }
    field(:right, 840) {
        pointer {
            global :SiteRealizationCrossroads
        }
    }
    field(:left, 848) {
        pointer {
            global :SiteRealizationCrossroads
        }
    }
    field(:unk_348, 856) {
        number 8, true
    }
    field(:unk_349, 857) {
        number 8, true
    }
    field(:unk_34c, 860) {
        number 32, true
    }
    field(:unk_1, 864) {
        number 8, true
    }
    field(:unk_2, 865) {
        number 8, true
    }
    field(:unk_3, 866) {
        number 8, true
    }
    field(:unk_4, 867) {
        number 8, true
    }
    field(:unk_5, 868) {
        number 8, true
    }
    field(:unk_6, 869) {
        number 8, true
    }
    field(:unk_7, 872) {
        number 32, true
    }
    field(:unk_8, 876) {
        number 32, true
    }
    field(:unk_370, 880) {
        static_array(48, 2) {
            number 16, true
        }
    }
    field(:unk_3d0, 976) {
        static_array(48, 2) {
            number 16, true
        }
    }
end

class SiteReputationInfo < MemHack::Compound
    sizeof 24

    field(:reports, 0) {
        stl_vector(8) {
            pointer {
                global :SiteReputationReport
            }
        }
    }
end

class SiteReputationReport < MemHack::Compound
    sizeof 56

    field(:site_id, 0) {
        number 32, true
    }
    field(:location_id, 4) {
        number 32, true
    }
    field(:unk_1, 8) {
        number 32, true
    }
    field(:unk_2, 12) {
        number 32, true
    }
    field(:year, 16) {
        number 32, true
    }
    field(:tickmaybe, 20) {
        number 32, true
    }
    field(:unk_3, 24) {
        static_array(8, 4) {
            number 32, true
        }
    }
end

class SpatterCommon < MemHack::Compound
    sizeof 24

    field(:mat_type, 0) {
        number 16, true, -1
    }
    field(:mat_index, 4) {
        number 32, true
    }
    field(:mat_state, 8) {
        number 16, true, nil, MatterState
    }
    field(:temperature, 10) {
        global :Temperaturest
    }
    field(:size, 16) {
        number 32, true
    }
    field(:base_flags, 20) {
        compound(:SpatterCommon_TBaseFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:evaporates, 0) { bit 0 }
        }
    }
    field(:pad_1, 22) {
    }
end

class Spatter < SpatterCommon
    sizeof 28

    field(:body_part_id, 24) {
        number 16, true, -1
    }
    field(:flags, 26) {
        compound(:Spatter_TFlags) {
            field(:_whole, 0) {
                number 16, false
            }
            field(:water_soluble, 0) { bit 0 }
        }
    }
end

class SpecialMatTable < MemHack::Compound
    sizeof 8080

    field(:organic_types, 0) {
        static_array(39, 24, OrganicMatCategory) {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:organic_indexes, 936) {
        static_array(39, 24, OrganicMatCategory) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:organic_unknown, 1872) {
        static_array(39, 24, OrganicMatCategory) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:builtin, 2808) {
        static_array(659, 8, BuiltinMats) {
            pointer {
                global :Material
            }
        }
    }
end

class SpecificRef < MemHack::Compound
    sizeof 24

    field(:type, 0) {
        number 32, true, nil, SpecificRefType
    }
    field(:data, 8) {
        compound(:SpecificRef_TData) {
            field(:object, 0) {
                pointer {
                }
            }
            field(:unit, 0) {
                pointer {
                    global :Unit
                }
            }
            field(:activity, 0) {
                pointer {
                    global :ActivityInfo
                }
            }
            field(:screen, 0) {
                pointer {
                    global :Viewscreen
                }
            }
            field(:effect, 0) {
                pointer {
                    global :EffectInfo
                }
            }
            field(:vermin, 0) {
                pointer {
                    global :Vermin
                }
            }
            field(:job, 0) {
                pointer {
                    global :Job
                }
            }
            field(:histfig, 0) {
                pointer {
                    global :HistoricalFigure
                }
            }
            field(:entity, 0) {
                pointer {
                    global :HistoricalEntity
                }
            }
            field(:wrestle, 0) {
                compound(:SpecificRef_TData_TWrestle) {
                    field(:unk_1, 0) {
                        pointer {
                        }
                    }
                    field(:item, 8) {
                        pointer {
                            global :UnitItemWrestle
                        }
                    }
                }
            }
        }
    }
end

class SpoilsReport < MemHack::Compound
    sizeof 240

    field(:title, 0) {
        stl_string
    }
    field(:unk_1, 32) {
        number 32, true
    }
    field(:year, 36) {
        number 32, true
    }
    field(:year_tick, 40) {
        number 32, true
    }
    field(:item_types, 48) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:item_subtypes, 72) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_types, 96) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:mat_indices, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:item_counts, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:creature_races, 168) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def creature_races_tg ; creature_races.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:creature_castes, 192) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:creature_counts, 216) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class Squad < MemHack::Compound
    sizeof 464

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:alias, 128) {
        stl_string
    }
    field(:positions, 160) {
        stl_vector(8) {
            pointer {
                global :SquadPosition
            }
        }
    }
    field(:orders, 184) {
        stl_vector(8) {
            pointer {
                global :SquadOrder
            }
        }
    }
    field(:schedule, 208) {
        stl_vector(8) {
            pointer {
                static_array(12, 88) {
                    global :SquadScheduleEntry
                }
            }
        }
    }
    field(:cur_alert_idx, 232) {
        number 32, true, -1
    }
    field(:rooms, 240) {
        stl_vector(8) {
            pointer {
                compound(:Squad_TRooms) {
                    sizeof 8

                    field(:building_id, 0) {
                        number 32, true, -1
                    }
                    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
                    field(:mode, 4) {
                        global :SquadUseFlags
                    }
                }
            }
        }
    }
    field(:rack_combat, 264) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def rack_combat_tg ; rack_combat.map { |i| df.world.buildings.all.binsearch(i) } ; end
    field(:rack_training, 288) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def rack_training_tg ; rack_training.map { |i| df.world.buildings.all.binsearch(i) } ; end
    field(:uniform_priority, 312) {
        number 32, true
    }
    field(:activity, 316) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity) ; end
    field(:ammunition, 320) {
        stl_vector(8) {
            pointer {
                global :SquadAmmoSpec
            }
        }
    }
    field(:train_weapon_free, 344) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def train_weapon_free_tg ; train_weapon_free.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:train_weapon_inuse, 368) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def train_weapon_inuse_tg ; train_weapon_inuse.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:ammo_items, 392) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def ammo_items_tg ; ammo_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:ammo_units, 416) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def ammo_units_tg ; ammo_units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:carry_food, 440) {
        number 16, true
    }
    field(:carry_water, 442) {
        number 16, true
    }
    field(:entity_id, 444) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:leader_position, 448) {
        number 32, true, -1
    }
    field(:leader_assignment, 452) {
        number 32, true, -1
    }
    field(:unk_1, 456) {
        number 32, true
    }
end

class SquadAmmoSpec < MemHack::Compound
    sizeof 48

    field(:item_filter, 0) {
        global :ItemFilterSpec
    }
    field(:amount, 12) {
        number 32, true
    }
    field(:flags, 16) {
        compound(:SquadAmmoSpec_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:use_combat, 0) { bit 0 }
            field(:use_training, 0) { bit 1 }
        }
    }
    field(:assigned, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_tg ; assigned.map { |i| df.world.items.all.binsearch(i) } ; end
end

class SquadOrder < MemHack::Compound
    sizeof 32

    rtti_classname :squad_orderst

    field(:unk_v40_1, 8) {
        number 32, true, -1
    }
    field(:unk_v40_2, 12) {
        number 32, true, -1
    }
    field(:year, 16) {
        number 32, true
    }
    field(:year_tick, 20) {
        number 32, true
    }
    field(:unk_v40_3, 24) {
        number 32, true
    }
    field(:unk_1, 28) {
        number 32, true
    }
    def clone()
        ptr = DFHack.vmethod_call(self, 0)
        class << self
            global :SquadOrder
        end._at(ptr) if ptr != 0
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
    def getType()
        SquadOrderType.sym(DFHack.vmethod_call(self, 24))
    end
    def isPatrol()
        val = DFHack.vmethod_call(self, 32)
        (val & 1) != 0
    end
    def offsetPosition(x, y, z)
        DFHack.vmethod_call(self, 48, x, y, z) ; nil
    end
    def process(arg0, arg1, soldier)
        val = DFHack.vmethod_call(self, 56, arg0, arg1, soldier)
        (val & 1) != 0
    end
    def reasonCannot(soldier)
        SquadOrderCannotReason.sym(DFHack.vmethod_call(self, 64, soldier))
    end
    def decUniformLock(soldier)
        val = DFHack.vmethod_call(self, 72, soldier)
        (val & 1) != 0
    end
    def isFulfilled()
        val = DFHack.vmethod_call(self, 80)
        (val & 1) != 0
    end
    def getTargetUnits()
        ptr = DFHack.vmethod_call(self, 88)
        class << self
            stl_vector(4) {
                number 32, true
            }
        end._at(ptr) if ptr != 0
    end
    def getUniformType(soldier)
        val = DFHack.vmethod_call(self, 96, soldier)
        val &= ((1 << 16) - 1)
        ((val >> (16-1)) & 1) == 0 ? val : val - (1 << 16)
    end
    def getDescription(arg0)
        DFHack.vmethod_call(self, 104, arg0) ; nil
    end
    def isInactive(arg0)
        val = DFHack.vmethod_call(self, 112, arg0)
        (val & 1) != 0
    end
    def isCombat()
        val = DFHack.vmethod_call(self, 120)
        (val & 1) != 0
    end
end

class SquadOrderCauseTroubleForEntityst < SquadOrder
    sizeof 72

    rtti_classname :squad_order_cause_trouble_for_entityst

    field(:entity_id, 32) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:override_name, 40) {
        stl_string
    }
end

class SquadOrderDefendBurrowsst < SquadOrder
    sizeof 56

    rtti_classname :squad_order_defend_burrowsst

    field(:burrows, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def burrows_tg ; burrows.map { |i| df.ui.burrows.list.binsearch(i) } ; end
end

class SquadOrderDriveArmiesFromSitest < SquadOrder
    sizeof 72

    rtti_classname :squad_order_drive_armies_from_sitest

    field(:unk_2, 32) {
        number 32, true
    }
    field(:unk_3, 36) {
        number 32, true
    }
    field(:unk_4, 40) {
        stl_string
    }
end

class SquadOrderDriveEntityOffSitest < SquadOrder
    sizeof 72

    rtti_classname :squad_order_drive_entity_off_sitest

    field(:unk_2, 32) {
        number 32, true
    }
    field(:unk_3, 36) {
        number 32, true
    }
    field(:unk_4, 40) {
        stl_string
    }
end

class SquadOrderKillHfst < SquadOrder
    sizeof 72

    rtti_classname :squad_order_kill_hfst

    field(:histfig_id, 32) {
        number 32, true, -1
    }
    def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
    field(:title, 40) {
        stl_string
    }
end

class SquadOrderKillListst < SquadOrder
    sizeof 112

    rtti_classname :squad_order_kill_listst

    field(:units, 32) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def units_tg ; units.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:histfigs, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfigs_tg ; histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:title, 80) {
        stl_string
    }
end

class SquadOrderMovest < SquadOrder
    sizeof 48

    rtti_classname :squad_order_movest

    field(:pos, 32) {
        global :Coord
    }
    field(:point_id, 40) {
        number 32, true
    }
end

class SquadOrderPatrolRoutest < SquadOrder
    sizeof 40

    rtti_classname :squad_order_patrol_routest

    field(:route_id, 32) {
        number 32, true
    }
end

class SquadOrderRaidSitest < SquadOrder
    sizeof 48

    rtti_classname :squad_order_raid_sitest

    field(:unk_2, 32) {
        number 32, true
    }
    field(:unk_3, 36) {
        global :Coord
    }
end

class SquadOrderRescueHfst < SquadOrder
    sizeof 48

    rtti_classname :squad_order_rescue_hfst

    field(:unk_2, 32) {
        number 32, true
    }
    field(:unk_3, 36) {
        global :Coord
    }
end

class SquadOrderRetrieveArtifactst < SquadOrder
    sizeof 48

    rtti_classname :squad_order_retrieve_artifactst

    field(:artifact_id, 32) {
        number 32, true, -1
    }
    def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
    field(:unk_2, 36) {
        global :Coord
    }
end

class SquadOrderTrainst < SquadOrder
    sizeof 32

    rtti_classname :squad_order_trainst

end

class SquadPosition < MemHack::Compound
    sizeof 408

    field(:occupant, 0) {
        number 32, true, -1
    }
    def occupant_tg ; df.world.history.figures.binsearch(occupant) ; end
    field(:orders, 8) {
        stl_vector(8) {
            pointer {
                global :SquadOrder
            }
        }
    }
    field(:preferences, 32) {
        static_array(4, 24, BarrackPreferenceCategory) {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:uniform, 128) {
        static_array(7, 24, UniformCategory) {
            stl_vector(8) {
                pointer {
                    global :SquadUniformSpec
                }
            }
        }
    }
    field(:unk_c4, 296) {
        stl_string
    }
    field(:flags, 328) {
        global :UniformFlags
    }
    field(:assigned_items, 336) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_items_tg ; assigned_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:quiver, 360) {
        number 32, true, -1
    }
    def quiver_tg ; df.world.items.all.binsearch(quiver) ; end
    field(:backpack, 364) {
        number 32, true, -1
    }
    def backpack_tg ; df.world.items.all.binsearch(backpack) ; end
    field(:flask, 368) {
        number 32, true, -1
    }
    def flask_tg ; df.world.items.all.binsearch(flask) ; end
    field(:unk_1, 372) {
        number 32, true
    }
    field(:activities, 376) {
        static_array(3, 4, SquadEventType) {
            number 32, true, -1
        }
    }
    def activities_tg ; df.world.activities.all.binsearch(activities) ; end
    field(:events, 388) {
        static_array(3, 4, SquadEventType) {
            number 32, true, -1
        }
    }
    field(:unk_2, 400) {
        number 32, true
    }
end

class SquadScheduleEntry < MemHack::Compound
    sizeof 88

    field(:name, 0) {
        stl_string
    }
    field(:sleep_mode, 32) {
        number 16, true
    }
    field(:uniform_mode, 34) {
        number 16, true
    }
    field(:orders, 40) {
        stl_vector(8) {
            pointer {
                global :SquadScheduleOrder
            }
        }
    }
    field(:order_assignments, 64) {
        stl_vector(8) {
            pointer {
                number 32, true, -1
            }
        }
    }
end

class SquadScheduleOrder < MemHack::Compound
    sizeof 48

    field(:order, 0) {
        pointer {
            global :SquadOrder
        }
    }
    field(:min_count, 8) {
        number 32, true
    }
    field(:positions, 16) {
        stl_bit_vector
    }
end

class SquadUniformSpec < MemHack::Compound
    sizeof 56

    field(:item, 0) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item) ; end
    field(:item_filter, 4) {
        global :ItemFilterSpec
    }
    field(:color, 16) {
        number 32, true
    }
    field(:assigned, 24) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def assigned_tg ; assigned.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:indiv_choice, 48) {
        global :UniformIndivChoice
    }
end

class SquadUseFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:sleep, 0) { bit 0 }
    field(:train, 0) { bit 1 }
    field(:indiv_eq, 0) { bit 2 }
    field(:squad_eq, 0) { bit 3 }
end

class StockpileGroupSet < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:animals, 0) { bit 0 }
    field(:food, 0) { bit 1 }
    field(:furniture, 0) { bit 2 }
    field(:corpses, 0) { bit 3 }
    field(:refuse, 0) { bit 4 }
    field(:stone, 0) { bit 5 }
    field(:ammo, 0) { bit 6 }
    field(:coins, 0) { bit 7 }
    field(:bars_blocks, 0) { bit 8 }
    field(:gems, 0) { bit 9 }
    field(:finished_goods, 0) { bit 10 }
    field(:leather, 0) { bit 11 }
    field(:cloth, 0) { bit 12 }
    field(:wood, 0) { bit 13 }
    field(:weapons, 0) { bit 14 }
    field(:armor, 0) { bit 15 }
    field(:sheet, 0) { bit 16 }
end

class StockpileLinks < MemHack::Compound
    sizeof 96

    field(:give_to_pile, 0) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:take_from_pile, 24) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:give_to_workshop, 48) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:take_from_workshop, 72) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
end

class StockpileSettings < MemHack::Compound
    sizeof 1880

    field(:flags, 0) {
        global :StockpileGroupSet
    }
    field(:animals, 8) {
        compound(:StockpileSettings_TAnimals) {
            field(:empty_cages, 0) {
                number 8, true, nil, BooleanEnum
            }
            field(:empty_traps, 1) {
                number 8, true, nil, BooleanEnum
            }
            field(:enabled, 8) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:food, 40) {
        compound(:StockpileSettings_TFood) {
            field(:meat, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:fish, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:unprepared_fish, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:egg, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:plants, 96) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:drink_plant, 120) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:drink_animal, 144) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cheese_plant, 168) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cheese_animal, 192) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:seeds, 216) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:leaves, 240) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:powder_plant, 264) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:powder_creature, 288) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:glob, 312) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:glob_paste, 336) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:glob_pressed, 360) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:liquid_plant, 384) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:liquid_animal, 408) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:liquid_misc, 432) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:prepared_meals, 456) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:furniture, 504) {
        compound(:StockpileSettings_TFurniture) {
            field(:type, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:other_mats, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_core, 72) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_total, 79) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:unk1, 592) {
        number 32, true
    }
    field(:refuse, 600) {
        compound(:StockpileSettings_TRefuse) {
            field(:type, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:corpses, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:body_parts, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:skulls, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:bones, 96) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:hair, 120) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:shells, 144) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:teeth, 168) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:horns, 192) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:fresh_raw_hide, 216) {
                number 8, true, nil, BooleanEnum
            }
            field(:rotten_raw_hide, 217) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:stone, 824) {
        compound(:StockpileSettings_TStone) {
            field(:mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:ore, 848) {
        compound(:StockpileSettings_TOre) {
            field(:mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:ammo, 872) {
        compound(:StockpileSettings_TAmmo) {
            field(:type, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:other_mats, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_core, 72) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_total, 79) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:coins, 960) {
        compound(:StockpileSettings_TCoins) {
            field(:mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:bars_blocks, 984) {
        compound(:StockpileSettings_TBarsBlocks) {
            field(:bars_other_mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:blocks_other_mats, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:bars_mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:blocks_mats, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:gems, 1080) {
        compound(:StockpileSettings_TGems) {
            field(:rough_other_mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cut_other_mats, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:rough_mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cut_mats, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:finished_goods, 1176) {
        compound(:StockpileSettings_TFinishedGoods) {
            field(:type, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:other_mats, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_core, 72) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_total, 79) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:leather, 1264) {
        compound(:StockpileSettings_TLeather) {
            field(:mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:cloth, 1288) {
        compound(:StockpileSettings_TCloth) {
            field(:thread_silk, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:thread_plant, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:thread_yarn, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:thread_metal, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cloth_silk, 96) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cloth_plant, 120) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cloth_yarn, 144) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:cloth_metal, 168) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:wood, 1480) {
        compound(:StockpileSettings_TWood) {
            field(:mats, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:weapons, 1504) {
        compound(:StockpileSettings_TWeapons) {
            field(:weapon_type, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:trapcomp_type, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:other_mats, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:mats, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_core, 96) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_total, 103) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:usable, 110) {
                number 8, true, nil, BooleanEnum
            }
            field(:unusable, 111) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:armor, 1616) {
        compound(:StockpileSettings_TArmor) {
            field(:body, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:head, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:feet, 48) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:hands, 72) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:legs, 96) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:shield, 120) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:other_mats, 144) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:mats, 168) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_core, 192) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:quality_total, 199) {
                static_array(7, 1, ItemQuality) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:usable, 206) {
                number 8, true, nil, BooleanEnum
            }
            field(:unusable, 207) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:sheet, 1824) {
        compound(:StockpileSettings_TSheet) {
            field(:paper, 0) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:parchment, 24) {
                stl_vector(1) {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:allow_organic, 1872) {
        number 8, true, 1, BooleanEnum
    }
    field(:allow_inorganic, 1873) {
        number 8, true, 1, BooleanEnum
    }
end

class StopDepartCondition < MemHack::Compound
    sizeof 96

    field(:timeout, 0) {
        number 32, true
    }
    field(:direction, 4) {
        class ::DFHack::StopDepartCondition_TDirection < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :North ; NUME[:North] = 0
            ENUM[1] = :South ; NUME[:South] = 1
            ENUM[2] = :East ; NUME[:East] = 2
            ENUM[3] = :West ; NUME[:West] = 3
        end

        number 32, true, nil, StopDepartCondition_TDirection
    }
    field(:mode, 8) {
        class ::DFHack::StopDepartCondition_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Push ; NUME[:Push] = 0
            ENUM[1] = :Ride ; NUME[:Ride] = 1
            ENUM[2] = :Guide ; NUME[:Guide] = 2
        end

        number 32, true, nil, StopDepartCondition_TMode
    }
    field(:load_percent, 12) {
        number 32, true
    }
    field(:flags, 16) {
        compound(:StopDepartCondition_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:at_most, 0) { bit 0 }
            field(:desired, 0) { bit 1 }
        }
    }
    field(:guide_path, 24) {
        global :CoordPath
    }
end

class SubRhythm < MemHack::Compound
    sizeof 88

    field(:name, 0) {
        stl_string
    }
    field(:patterns, 32) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_2, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 80) {
        number 32, true
    }
end

class Syndrome < MemHack::Compound
    sizeof 272

    field(:syn_name, 0) {
        stl_string
    }
    field(:ce, 32) {
        stl_vector(8) {
            pointer {
                global :CreatureInteractionEffect
            }
        }
    }
    field(:syn_affected_class, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_affected_creature, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_affected_caste, 104) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_immune_class, 128) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_immune_creature, 152) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_immune_caste, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_class, 200) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:syn_identifier, 224) {
        stl_string
    }
    field(:flags, 256) {
        global :SyndromeFlags
    }
    field(:syn_concentration_added, 260) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:id, 268) {
        number 32, true
    }
end

class SyndromeFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:SYN_INJECTED, 0) { bit 0 }
    field(:SYN_CONTACT, 0) { bit 1 }
    field(:SYN_INHALED, 0) { bit 2 }
    field(:SYN_INGESTED, 0) { bit 4 }
    field(:SYN_NO_HOSPITAL, 0) { bit 5 }
end

class TalkChoice < MemHack::Compound
    sizeof 48

    field(:type, 0) {
        number 32, true, nil, TalkChoiceType
    }
    field(:unk, 8) {
        compound(:TalkChoice_TUnk) {
            field(:event, 0) {
                pointer {
                    global :EntityEvent
                }
            }
            field(:unk_1, 8) {
                pointer {
                }
            }
            field(:unk_2, 16) {
                number 32, true
            }
        }
    }
    field(:unk_1, 32) {
        number 32, true
    }
    field(:unk_2, 36) {
        number 32, true
    }
    field(:unk_3, 40) {
        number 32, true
    }
    field(:unk_4, 44) {
        number 32, true, -1
    }
end

class Temperaturest < MemHack::Compound
    sizeof 4

    field(:whole, 0) {
        number 16, false, 10050
    }
    field(:fraction, 2) {
        number 16, true
    }
end

class TempleDeityData < MemHack::Compound
    sizeof 4

    field(:Deity, 0) {
        number 32, true, -1
    }
    def Deity_tg ; df.world.history.figures.binsearch(Deity) ; end
    field(:Religion, 0) {
        number 32, true, -1
    }
    def Religion_tg ; df.world.entities.all.binsearch(Religion) ; end
end

class TextInfoElementst < MemHack::Compound
    sizeof 8

    rtti_classname :text_info_elementst

    def getString(val)
        DFHack.vmethod_call(self, 0, val) ; nil
    end
    def getLong()
        val = DFHack.vmethod_call(self, 8)
    end
end

class TextInfoElementLongst < TextInfoElementst
    sizeof 16

    rtti_classname :text_info_element_longst

    field(:val, 8) {
        number 32, true
    }
end

class TextInfoElementStringst < TextInfoElementst
    sizeof 40

    rtti_classname :text_info_element_stringst

    field(:val, 8) {
        stl_string
    }
end

class TextureHandler < MemHack::Compound
    sizeof 72

    field(:page, 0) {
        stl_vector(8) {
            pointer {
                global :TilePage
            }
        }
    }
    field(:texpos, 24) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:datapos, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class TileBitmask < MemHack::Compound
    sizeof 32

    field(:bits, 0) {
        static_array(16, 2) {
            number 16, false
        }
    }
end

class TileDesignation < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:flow_size, 0) { bits 0, 3 }
    field(:pile, 0) { bit 3 }
    field(:dig, 0) { bits 4, 3, TileDigDesignation }
    field(:smooth, 0) { bits 7, 2 }
    field(:hidden, 0) { bit 9 }
    field(:geolayer_index, 0) { bits 10, 4 }
    field(:light, 0) { bit 14 }
    field(:subterranean, 0) { bit 15 }
    field(:outside, 0) { bit 16 }
    field(:biome, 0) { bits 17, 4 }
    field(:liquid_type, 0) { bits 21, 1, TileLiquid }
    field(:water_table, 0) { bit 22 }
    field(:rained, 0) { bit 23 }
    field(:traffic, 0) { bits 24, 2, TileTraffic }
    field(:flow_forbid, 0) { bit 26 }
    field(:liquid_static, 0) { bit 27 }
    field(:feature_local, 0) { bit 28 }
    field(:feature_global, 0) { bit 29 }
    field(:water_stagnant, 0) { bit 30 }
    field(:water_salt, 0) { bit 31 }
end

class TileLiquidFlow < MemHack::Compound
    field(:_whole, 0) {
        number 16, false
    }
    field(:temp_flow_timer, 0) { bits 0, 3 }
    field(:unk_1, 0) { bits 3, 3 }
    field(:perm_flow_dir, 0) { bits 6, 4, TileLiquidFlowDir }
    field(:unk_2, 0) { bits 10, 6 }
end

class TileOccupancy < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:building, 0) { bits 0, 3, TileBuildingOcc }
    field(:unit, 0) { bit 3 }
    field(:unit_grounded, 0) { bit 4 }
    field(:item, 0) { bit 5 }
    field(:edge_flow_in, 0) { bit 6 }
    field(:moss, 0) { bit 7 }
    field(:arrow_color, 0) { bits 8, 4 }
    field(:arrow_variant, 0) { bit 12 }
    field(:unk13_noncitizen_unit, 0) { bit 13 }
    field(:monster_lair, 0) { bit 14 }
    field(:no_grow, 0) { bit 15 }
    field(:unk16, 0) { bit 16 }
    field(:unk17, 0) { bit 17 }
    field(:carve_track_north, 0) { bit 18 }
    field(:carve_track_south, 0) { bit 19 }
    field(:carve_track_east, 0) { bit 20 }
    field(:carve_track_west, 0) { bit 21 }
    field(:spoor, 0) { bit 22 }
    field(:unk23, 0) { bit 23 }
    field(:dig_marked, 0) { bit 24 }
    field(:dig_auto, 0) { bit 25 }
    field(:heavy_aquifer, 0) { bit 26 }
end

class TilePage < MemHack::Compound
    sizeof 176

    field(:token, 0) {
        stl_string
    }
    field(:filename, 32) {
        stl_string
    }
    field(:tile_dim_x, 64) {
        number 16, true
    }
    field(:tile_dim_y, 66) {
        number 16, true
    }
    field(:page_dim_x, 68) {
        number 16, true
    }
    field(:page_dim_y, 70) {
        number 16, true
    }
    field(:texpos, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:datapos, 96) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:texpos_gs, 120) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:datapos_gs, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:loaded, 168) {
        number 8, true, nil, BooleanEnum
    }
end

class TimedEvent < MemHack::Compound
    sizeof 32

    field(:type, 0) {
        number 16, true, nil, TimedEventType
    }
    field(:season, 2) {
        number 8, true, nil, Season
    }
    field(:season_ticks, 4) {
        number 16, true
    }
    field(:entity, 8) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:unk_1, 16) {
        number 16, true
    }
    field(:layer_id, 20) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer_id] ; end
    field(:unk_3, 24) {
        number 16, true
    }
    field(:unk_4, 26) {
        number 16, true
    }
end

class Tissue < MemHack::Compound
    sizeof 336

    field(:id, 0) {
        stl_string
    }
    field(:flags, 32) {
        df_flagarray(TissueFlags)
    }
    field(:tissue_name_singular, 48) {
        stl_string
    }
    field(:tissue_name_plural, 80) {
        stl_string
    }
    field(:tissue_material_str, 112) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:mat_type, 208) {
        number 16, true, -1
    }
    field(:mat_index, 212) {
        number 32, true
    }
    field(:relative_thickness, 216) {
        number 32, true
    }
    field(:healing_rate, 220) {
        number 32, true
    }
    field(:vascular, 224) {
        number 32, true
    }
    field(:pain_receptors, 228) {
        number 32, true
    }
    field(:tissue_shape, 232) {
        number 16, true
    }
    field(:unk1, 236) {
        number 32, true, -1
    }
    field(:insulation, 240) {
        number 16, true
    }
    field(:subordinate_to_tissue, 248) {
        stl_string
    }
    field(:parent_tissue, 280) {
        number 32, true, -1
    }
    field(:tissue_mat_state, 284) {
        number 16, true, nil, MatterState
    }
    field(:heatdam_point, 286) {
        number 16, false
    }
    field(:colddam_point, 288) {
        number 16, false
    }
    field(:ignite_point, 290) {
        number 16, false
    }
    field(:melting_point, 292) {
        number 16, false
    }
    field(:boiling_point, 294) {
        number 16, false
    }
    field(:spec_heat, 296) {
        number 16, false
    }
    field(:tissue_shape_str, 304) {
        stl_string
    }
end

class TissueStyleRaw < MemHack::Compound
    sizeof 176

    field(:token, 0) {
        stl_string
    }
    field(:part_idx, 32) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:layer_idx, 56) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:styles, 80) {
        stl_vector(2) {
            global :TissueStyleType
        }
    }
    field(:list_idx, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:id, 128) {
        number 32, true
    }
    field(:noun, 136) {
        stl_string
    }
    field(:word_type, 168) {
        number 16, true, nil, PartOfSpeech
    }
end

class TissueTemplate < MemHack::Compound
    sizeof 320

    field(:id, 0) {
        stl_string
    }
    field(:flags, 32) {
        df_flagarray(TissueFlags)
    }
    field(:tissue_name_singular, 48) {
        stl_string
    }
    field(:tissue_name_plural, 80) {
        stl_string
    }
    field(:tissue_material_str, 112) {
        static_array(3, 32) {
            stl_string
        }
    }
    field(:mat_type, 208) {
        number 16, true, -1
    }
    field(:mat_index, 212) {
        number 32, true
    }
    field(:relative_thickness, 216) {
        number 32, true
    }
    field(:healing_rate, 220) {
        number 32, true
    }
    field(:vascular, 224) {
        number 32, true
    }
    field(:pain_receptors, 228) {
        number 32, true
    }
    field(:tissue_shape, 232) {
        number 16, true
    }
    field(:unk1, 236) {
        number 32, true, -1
    }
    field(:insulation, 240) {
        number 16, true
    }
    field(:subordinate_to_tissue, 248) {
        stl_string
    }
    field(:tissue_mat_state, 280) {
        number 16, true, nil, MatterState
    }
    field(:tissue_shape_str, 288) {
        stl_string
    }
end

class TowerShape < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:round, 0) { bit 0 }
    field(:hollow, 0) { bit 1 }
    field(:keep, 0) { bit 2 }
    field(:goblin, 0) { bit 3 }
    field(:unk10, 0) { bit 4 }
end

class TrainingAssignment < MemHack::Compound
    sizeof 12

    field(:animal_id, 0) {
        number 32, true, -1
    }
    def animal_tg ; df.world.units.all.binsearch(animal_id) ; end
    field(:trainer_id, 4) {
        number 32, true, -1
    }
    def trainer_tg ; df.world.units.all.binsearch(trainer_id) ; end
    field(:flags, 8) {
        compound(:TrainingAssignment_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:any_trainer, 0) { bit 0 }
            field(:any_unassigned_trainer, 0) { bit 1 }
            field(:train_war, 0) { bit 2 }
            field(:train_hunt, 0) { bit 3 }
        }
    }
end

class Ui < MemHack::Compound
    sizeof 36120

    field(:game_state, 0) {
        number 16, true
    }
    field(:lost_to_siege_civ, 4) {
        number 32, true, -1
    }
    def lost_to_siege_civ_tg ; df.world.entities.all.binsearch(lost_to_siege_civ) ; end
    field(:tax_collection, 8) {
        compound(:Ui_TTaxCollection) {
            field(:state, 0) {
                number 16, true
            }
            field(:check_timer, 4) {
                number 32, true
            }
            field(:rooms, 8) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def rooms_tg ; rooms.map { |i| df.world.buildings.all.binsearch(i) } ; end
            field(:reach_room_timer, 32) {
                number 32, true
            }
            field(:tc_protect_timer, 36) {
                number 32, true
            }
            field(:guard1_reach_tc_timer, 40) {
                number 32, true
            }
            field(:guard2_reach_tc_timer, 44) {
                number 32, true
            }
            field(:collected, 48) {
                number 16, true
            }
            field(:quota, 50) {
                number 16, true
            }
            field(:collector_pos, 52) {
                global :Coord
            }
            field(:guard_pos_x, 58) {
                static_array(2, 2) {
                    number 16, true
                }
            }
            field(:guard_pos_y, 62) {
                static_array(2, 2) {
                    number 16, true
                }
            }
            field(:guard_pos_z, 66) {
                static_array(2, 2) {
                    number 16, true
                }
            }
            field(:collector, 72) {
                pointer {
                    global :Unit
                }
            }
            field(:guard1, 80) {
                pointer {
                    global :Unit
                }
            }
            field(:guard2, 88) {
                pointer {
                    global :Unit
                }
            }
            field(:guard_lack_complained, 96) {
                number 8, true
            }
        }
    }
    field(:nobles, 112) {
        compound(:Ui_TNobles) {
            field(:unk_1, 0) {
                number 32, true
            }
            field(:manager_cooldown, 4) {
                number 32, true
            }
            field(:bookkeeper_cooldown, 8) {
                number 32, true
            }
            field(:bookkeeper_precision, 12) {
                number 32, true
            }
            field(:bookkeeper_settings, 16) {
                class ::DFHack::Ui_TNobles_TBookkeeperSettings < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Nearest10 ; NUME[:Nearest10] = 0
                    ENUM[1] = :Nearest100 ; NUME[:Nearest100] = 1
                    ENUM[2] = :Nearest1000 ; NUME[:Nearest1000] = 2
                    ENUM[3] = :Nearest10000 ; NUME[:Nearest10000] = 3
                    ENUM[4] = :AllAccurate ; NUME[:AllAccurate] = 4
                end

                number 16, true, nil, Ui_TNobles_TBookkeeperSettings
            }
        }
    }
    field(:caravans, 136) {
        stl_vector(8) {
            pointer {
                global :CaravanState
            }
        }
    }
    field(:unk_2, 160) {
        number 8, true
    }
    field(:fortress_rank, 162) {
        number 16, true
    }
    field(:progress_population, 164) {
        number 16, true
    }
    field(:progress_trade, 166) {
        number 16, true
    }
    field(:progress_production, 168) {
        number 16, true
    }
    field(:king_arrived, 170) {
        number 8, true, nil, BooleanEnum
    }
    field(:king_hasty, 171) {
        number 8, true, nil, BooleanEnum
    }
    field(:economy_active, 172) {
        number 8, true, nil, BooleanEnum
    }
    field(:ignore_labor_shortage, 173) {
        number 8, true, nil, BooleanEnum
    }
    field(:justice_active, 174) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_3, 176) {
        number 16, false, 60001
    }
    field(:unk_4, 178) {
        number 16, false, 60001
    }
    field(:manager_timer, 180) {
        number 16, true
    }
    field(:becoming_capital, 184) {
        compound(:Ui_TBecomingCapital) {
            field(:desired_architecture, 0) {
                number 32, true
            }
            field(:desired_offerings, 4) {
                number 32, true
            }
        }
    }
    field(:units_killed, 192) {
        static_array(152, 2, Profession) {
            number 16, true
        }
    }
    field(:currency_value, 496) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:trees_removed, 520) {
        number 32, true
    }
    field(:unk_5, 524) {
        number 32, true
    }
    field(:fortress_age, 528) {
        number 32, true
    }
    field(:tasks, 536) {
        global :EntityActivityStatistics
    }
    field(:meeting_requests, 8936) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def meeting_requests_tg ; meeting_requests.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:activities, 8960) {
        stl_vector(8) {
            pointer {
                global :ActivityInfo
            }
        }
    }
    field(:dip_meeting_info, 8984) {
        stl_vector(8) {
            pointer {
                global :MeetingDiplomatInfo
            }
        }
    }
    field(:aid_requesters, 9008) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def aid_requesters_tg ; aid_requesters.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:game_over, 9032) {
        number 8, true, nil, BooleanEnum
    }
    field(:invasions, 9040) {
        compound(:Ui_TInvasions) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        global :InvasionInfo
                    }
                }
            }
            field(:next_id, 24) {
                number 32, true
            }
        }
    }
    field(:punishments, 9072) {
        stl_vector(8) {
            pointer {
                global :Punishment
            }
        }
    }
    field(:parties, 9096) {
        stl_vector(8) {
            pointer {
                global :PartyInfo
            }
        }
    }
    field(:room_rent, 9120) {
        stl_vector(8) {
            pointer {
                global :RoomRentInfo
            }
        }
    }
    field(:dipscripts, 9144) {
        stl_vector(8) {
            pointer {
                global :DipscriptInfo
            }
        }
    }
    field(:dipscript_popups, 9168) {
        stl_vector(8) {
            pointer {
                global :DipscriptPopup
            }
        }
    }
    field(:kitchen, 9192) {
        compound(:Ui_TKitchen) {
            field(:item_types, 0) {
                stl_vector(2) {
                    number 16, true, nil, ItemType
                }
            }
            field(:item_subtypes, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:mat_types, 48) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:mat_indices, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:exc_types, 96) {
                stl_vector(1) {
                    number 8, true, nil, KitchenExcType
                }
            }
        }
    }
    field(:economic_stone, 9312) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:unk23c8_flags, 9336) {
        compound(:Ui_TUnk23c8Flags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:first_year, 0) { bit 0 }
            field(:recheck_aid_requests, 0) { bit 1 }
            field(:force_elections, 0) { bit 2 }
        }
    }
    field(:mood_cooldown, 9340) {
        number 16, true
    }
    field(:civ_id, 9344) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:site_id, 9348) {
        number 32, true, -1
    }
    def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
    field(:group_id, 9352) {
        number 32, true, -1
    }
    def group_tg ; df.world.entities.all.binsearch(group_id) ; end
    field(:race_id, 9356) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race_id] ; end
    field(:unk_races, 9360) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_races_tg ; unk_races.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:farm_crops, 9384) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def farm_crops_tg ; farm_crops.map { |i| df.world.raws.plants.all[i] } ; end
    field(:farm_seasons, 9408) {
        stl_vector(1) {
            number 8, true, nil, Season
        }
    }
    field(:economy_prices, 9432) {
        compound(:Ui_TEconomyPrices) {
            field(:price_adjustment, 0) {
                compound(:Ui_TEconomyPrices_TPriceAdjustment) {
                    field(:general_items, 0) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:weapons, 24) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:armor, 48) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:handwear, 72) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:footwear, 96) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:headwear, 120) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:legwear, 144) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:prepared_food, 168) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:wood, 192) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:thread_cloth, 216) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:paper, 240) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:parchment, 264) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:bone, 288) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:tooth, 312) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:horn, 336) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:pearl, 360) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:shell, 384) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:leather, 408) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:silk, 432) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:yarn, 456) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:inorganic, 480) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:meat, 504) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:fish, 528) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:plants, 552) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:drinks, 576) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:extract_animal, 600) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:extract_plant, 624) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:mill_animal, 648) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:mill_plant, 672) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:cheese_animal, 696) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:cheese_plant, 720) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:pets, 744) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:price_setter, 768) {
                compound(:Ui_TEconomyPrices_TPriceSetter) {
                    field(:general_items, 0) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:weapons, 24) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:armor, 48) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:handwear, 72) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:footwear, 96) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:headwear, 120) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:legwear, 144) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:prepared_food, 168) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:wood, 192) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:thread_cloth, 216) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:paper, 240) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:parchment, 264) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:bone, 288) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:tooth, 312) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:horn, 336) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:pearl, 360) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:shell, 384) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:leather, 408) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:silk, 432) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:yarn, 456) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:inorganic, 480) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:meat, 504) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:fish, 528) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:plants, 552) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:drinks, 576) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:extract_animal, 600) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:extract_plant, 624) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:mill_animal, 648) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:mill_plant, 672) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:cheese_animal, 696) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:cheese_plant, 720) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                    field(:pets, 744) {
                        stl_vector(8) {
                            pointer {
                                global :Unit
                            }
                        }
                    }
                }
            }
        }
    }
    field(:stockpile, 10968) {
        compound(:Ui_TStockpile) {
            field(:reserved_bins, 0) {
                number 32, true
            }
            field(:reserved_barrels, 4) {
                number 32, true
            }
            field(:custom_settings, 8) {
                global :StockpileSettings
            }
        }
    }
    field(:unk2a8c, 12856) {
        static_array(4, 3072) {
            static_array(768, 4) {
                compound(:Ui_TUnk2a8c) {
                    field(:unk1, 0) {
                        number 16, true
                    }
                    field(:unk2, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:unk_mapedge_x, 25144) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_mapedge_y, 25168) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_mapedge_z, 25192) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:map_edge, 25216) {
        compound(:Ui_TMapEdge) {
            field(:layer_x, 0) {
                static_array(5, 24) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
            }
            field(:surface_x, 120) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:layer_y, 144) {
                static_array(5, 24) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
            }
            field(:surface_y, 264) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:layer_z, 288) {
                static_array(5, 24) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
            }
            field(:surface_z, 408) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:feature_x, 25648) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:feature_y, 25672) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:feature_id_local, 25696) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:feature_id_global, 25720) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:event_collections, 25744) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def event_collections_tg ; event_collections.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
    field(:stone_mat_types, 25768) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:stone_mat_indexes, 25792) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:waypoints, 25816) {
        compound(:Ui_TWaypoints) {
            field(:points, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:Ui_TWaypoints_TPoints) {
                            sizeof 88

                            field(:id, 0) {
                                number 32, true
                            }
                            field(:tile, 4) {
                                number 8, false
                            }
                            field(:fg_color, 6) {
                                number 16, true
                            }
                            field(:bg_color, 8) {
                                number 16, true
                            }
                            field(:name, 16) {
                                stl_string
                            }
                            field(:comment, 48) {
                                stl_string
                            }
                            field(:pos, 80) {
                                global :Coord
                            }
                        }
                    }
                }
            }
            field(:routes, 24) {
                stl_vector(8) {
                    pointer {
                        compound(:Ui_TWaypoints_TRoutes) {
                            sizeof 64

                            field(:id, 0) {
                                number 32, true
                            }
                            field(:name, 8) {
                                stl_string
                            }
                            field(:points, 40) {
                                stl_vector(4) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
            field(:sym_selector, 48) {
                number 16, true
            }
            field(:unk_1, 50) {
                number 16, true
            }
            field(:cur_point_index, 52) {
                number 32, true
            }
            field(:in_edit_name_mode, 56) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_edit_text_mode, 57) {
                number 8, true, nil, BooleanEnum
            }
            field(:sym_tile, 58) {
                number 8, false
            }
            field(:sym_fg_color, 60) {
                number 16, true
            }
            field(:sym_bg_color, 62) {
                number 16, true
            }
            field(:unk5c04, 64) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:next_point_id, 88) {
                number 32, true
            }
            field(:next_route_id, 92) {
                number 32, true
            }
            field(:sel_route_idx, 96) {
                number 32, true
            }
            field(:sel_route_waypt_idx, 100) {
                number 32, true
            }
            field(:in_edit_waypts_mode, 104) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk_42_06, 112) {
                stl_vector
            }
        }
    }
    field(:burrows, 25952) {
        compound(:Ui_TBurrows) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        global :Burrow
                    }
                }
            }
            field(:next_id, 24) {
                number 32, true
            }
            field(:sel_index, 28) {
                number 32, true, -1
            }
            field(:sel_id, 32) {
                number 32, true, -1
            }
            def sel_tg ; df.ui.burrows.list.binsearch(sel_id) ; end
            field(:in_confirm_delete, 36) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_add_units_mode, 37) {
                number 8, true, nil, BooleanEnum
            }
            field(:list_units, 40) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:sel_units, 64) {
                stl_bit_vector
            }
            field(:unit_cursor_pos, 96) {
                number 32, true
            }
            field(:in_define_mode, 100) {
                number 8, true, nil, BooleanEnum
            }
            field(:brush_erasing, 101) {
                number 8, true, nil, BooleanEnum
            }
            field(:rect_start, 102) {
                global :Coord
            }
            field(:brush_mode, 108) {
                number 16, true
            }
            field(:in_edit_name_mode, 110) {
                number 8, true, nil, BooleanEnum
            }
            field(:sym_selector, 112) {
                number 16, true
            }
            field(:sym_tile, 114) {
                number 16, true
            }
            field(:sym_fg_color, 116) {
                number 16, true
            }
            field(:sym_bg_color, 118) {
                number 16, true
            }
        }
    }
    field(:alerts, 26072) {
        compound(:Ui_TAlerts) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:Ui_TAlerts_TList) {
                            sizeof 64

                            field(:id, 0) {
                                number 32, true
                            }
                            field(:name, 8) {
                                stl_string
                            }
                            field(:burrows, 40) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def burrows_tg ; burrows.map { |i| df.ui.burrows.list.binsearch(i) } ; end
                        }
                    }
                }
            }
            field(:next_id, 24) {
                number 32, true
            }
            field(:civ_alert_idx, 28) {
                number 32, true, -1
            }
        }
    }
    field(:equipment, 26104) {
        compound(:Ui_TEquipment) {
            field(:items_unmanifested, 0) {
                static_array(112, 24, ItemType) {
                    stl_vector(8) {
                        pointer {
                            global :Item
                        }
                    }
                }
            }
            field(:items_unassigned, 2688) {
                static_array(112, 24, ItemType) {
                    stl_vector(8) {
                        pointer {
                            global :Item
                        }
                    }
                }
            }
            field(:items_assigned, 5376) {
                static_array(112, 24, ItemType) {
                    stl_vector(8) {
                        pointer {
                            global :Item
                        }
                    }
                }
            }
            field(:update, 8064) {
                compound(:Ui_TEquipment_TUpdate) {
                    field(:_whole, 0) {
                        number 32, true
                    }
                    field(:weapon, 0) { bit 0 }
                    field(:armor, 0) { bit 1 }
                    field(:shoes, 0) { bit 2 }
                    field(:shield, 0) { bit 3 }
                    field(:helm, 0) { bit 4 }
                    field(:gloves, 0) { bit 5 }
                    field(:ammo, 0) { bit 6 }
                    field(:pants, 0) { bit 7 }
                    field(:backpack, 0) { bit 8 }
                    field(:quiver, 0) { bit 9 }
                    field(:flask, 0) { bit 10 }
                    field(:buildings, 0) { bit 12 }
                }
            }
            field(:work_weapons, 8072) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def work_weapons_tg ; work_weapons.map { |i| df.world.items.all.binsearch(i) } ; end
            field(:work_units, 8096) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def work_units_tg ; work_units.map { |i| df.world.units.all.binsearch(i) } ; end
            field(:hunter_ammunition, 8120) {
                stl_vector(8) {
                    pointer {
                        global :SquadAmmoSpec
                    }
                }
            }
            field(:ammo_items, 8144) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def ammo_items_tg ; ammo_items.map { |i| df.world.items.all.binsearch(i) } ; end
            field(:ammo_units, 8168) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def ammo_units_tg ; ammo_units.map { |i| df.world.units.all.binsearch(i) } ; end
            field(:training_assignments, 8192) {
                stl_vector(8) {
                    pointer {
                        global :TrainingAssignment
                    }
                }
            }
        }
    }
    field(:hauling, 34320) {
        compound(:Ui_THauling) {
            field(:routes, 0) {
                stl_vector(8) {
                    pointer {
                        global :HaulingRoute
                    }
                }
            }
            field(:next_id, 24) {
                number 32, true
            }
            field(:view_routes, 32) {
                stl_vector(8) {
                    pointer {
                        global :HaulingRoute
                    }
                }
            }
            field(:view_stops, 56) {
                stl_vector(8) {
                    pointer {
                        global :HaulingStop
                    }
                }
            }
            field(:view_bad, 80) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:cursor_top, 104) {
                number 32, true
            }
            field(:in_stop, 108) {
                number 8, true, nil, BooleanEnum
            }
            field(:cursor_stop, 112) {
                number 32, true
            }
            field(:stop_conditions, 120) {
                stl_vector(8) {
                    pointer {
                        global :StopDepartCondition
                    }
                }
            }
            field(:stop_links, 144) {
                stl_vector(8) {
                    pointer {
                        global :RouteStockpileLink
                    }
                }
            }
            field(:in_advanced_cond, 168) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_assign_vehicle, 169) {
                number 8, true, nil, BooleanEnum
            }
            field(:cursor_vehicle, 172) {
                number 32, true
            }
            field(:vehicles, 176) {
                stl_vector(8) {
                    pointer {
                        global :Vehicle
                    }
                }
            }
            field(:in_name, 200) {
                number 8, true, nil, BooleanEnum
            }
            field(:old_name, 208) {
                stl_string
            }
        }
    }
    field(:petitions, 34560) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_6, 34584) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_7, 34608) {
        stl_vector
    }
    field(:unk_8, 34632) {
        stl_vector(8) {
            pointer {
                compound(:Ui_TUnk8) {
                    sizeof 576

                    field(:unk_1, 0) {
                        number 32, true, -1
                    }
                    def unk_1_tg ; df.world.items.all.binsearch(unk_1) ; end
                    field(:unk_2, 4) {
                        number 32, true, -1
                    }
                    def unk_2_tg ; df.world.history.figures.binsearch(unk_2) ; end
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true, -1
                    }
                    def unk_4_tg ; df.world.history.figures.binsearch(unk_4) ; end
                    field(:unk_5, 16) {
                        number 32, true, -1
                    }
                    def unk_5_tg ; df.world.units.all.binsearch(unk_5) ; end
                    field(:unk_6, 20) {
                        number 32, true, -1
                    }
                    def unk_6_tg ; df.world.history.figures.binsearch(unk_6) ; end
                    field(:unk_7, 24) {
                        number 32, true, -1
                    }
                    def unk_7_tg ; df.world.units.all.binsearch(unk_7) ; end
                    field(:unk_8, 28) {
                        number 32, true, -1
                    }
                    def unk_8_tg ; df.world.agreements.all.binsearch(unk_8) ; end
                    field(:unk_9, 32) {
                        number 32, true
                    }
                    field(:unk_10, 36) {
                        global :Coord
                    }
                    field(:unk_11, 44) {
                        static_array(16, 4) {
                            number 32, true, -1
                        }
                    }
                    field(:unk_12, 108) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_13, 172) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_14, 236) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_15, 300) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_16, 364) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_17, 428) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_18, 492) {
                        static_array(16, 4) {
                            number 32, true
                        }
                    }
                    field(:unk_19, 556) {
                        number 32, true
                    }
                    field(:unk_20, 560) {
                        number 32, true, -1
                    }
                    field(:unk_21, 564) {
                        number 32, true, -1
                    }
                    field(:unk_22, 568) {
                        number 32, true, -1
                    }
                    field(:unk_23, 572) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
    field(:unk_9, 34656) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_10, 34680) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_11, 34704) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:main, 34728) {
        compound(:Ui_TMain) {
            field(:hotkeys, 0) {
                static_array(16, 56) {
                    global :UiHotkey
                }
            }
            field(:traffic_cost_high, 896) {
                number 32, true
            }
            field(:traffic_cost_normal, 900) {
                number 32, true
            }
            field(:traffic_cost_low, 904) {
                number 32, true
            }
            field(:traffic_cost_restricted, 908) {
                number 32, true
            }
            field(:dead_citizens, 912) {
                stl_vector(8) {
                    pointer {
                        compound(:Ui_TMain_TDeadCitizens) {
                            sizeof 24

                            field(:unit_id, 0) {
                                number 32, true, -1
                            }
                            def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
                            field(:histfig_id, 4) {
                                number 32, true, -1
                            }
                            def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                            field(:death_year, 8) {
                                number 32, true
                            }
                            field(:death_time, 12) {
                                number 32, true
                            }
                            field(:timer, 16) {
                                number 32, true
                            }
                            field(:ghost_type, 20) {
                                number 16, true, nil, GhostType
                            }
                        }
                    }
                }
            }
            field(:fortress_entity, 936) {
                pointer {
                    global :HistoricalEntity
                }
            }
            field(:fortress_site, 944) {
                pointer {
                    global :WorldSite
                }
            }
            field(:mode, 952) {
                number 16, true, nil, UiSidebarMode
            }
            field(:unk1, 954) {
                number 16, true
            }
            field(:selected_traffic_cost, 956) {
                number 16, true
            }
            field(:autosave_request, 958) {
                number 8, true, nil, BooleanEnum
            }
            field(:autosave_unk, 959) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk6df4, 960) {
                number 32, true
            }
            field(:unk_44_12a, 964) {
                number 8, true, nil, BooleanEnum
            }
            field(:pad_1, 965) {
            }
            field(:unk_44_12b, 968) {
                global :NemesisOffload
            }
            field(:unk_44_12c, 1056) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk_44_12d, 1060) {
                number 32, true
            }
            field(:selected_hotkey, 1064) {
                number 16, true
            }
            field(:in_rename_hotkey, 1066) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:squads, 35800) {
        compound(:Ui_TSquads) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:unk6e08, 24) {
                stl_vector
            }
            field(:sel_squads, 48) {
                stl_bit_vector
            }
            field(:indiv_selected, 80) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def indiv_selected_tg ; indiv_selected.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:in_select_indiv, 104) {
                number 8, true, nil, BooleanEnum
            }
            field(:sel_indiv_squad, 108) {
                number 32, true, -1
            }
            field(:unk_70, 112) {
                number 32, true
            }
            field(:squad_list_scroll, 116) {
                number 32, true
            }
            field(:squad_list_first_id, 120) {
                number 32, true
            }
            field(:nearest_squad, 128) {
                pointer {
                    global :Squad
                }
            }
            field(:in_move_order, 136) {
                number 8, true, nil, BooleanEnum
            }
            field(:point_list_scroll, 140) {
                number 32, true
            }
            field(:in_kill_order, 144) {
                number 8, true, nil, BooleanEnum
            }
            field(:kill_rect_targets, 152) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:kill_rect_targets_scroll, 176) {
                number 32, true
            }
            field(:in_kill_list, 180) {
                number 8, true, nil, BooleanEnum
            }
            field(:kill_targets, 184) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:sel_kill_targets, 208) {
                stl_bit_vector
            }
            field(:kill_list_scroll, 240) {
                number 32, true
            }
            field(:in_kill_rect, 244) {
                number 8, true, nil, BooleanEnum
            }
            field(:rect_start, 246) {
                global :Coord
            }
        }
    }
    field(:follow_unit, 36056) {
        number 32, true, -1
    }
    def follow_unit_tg ; df.world.units.all.binsearch(follow_unit) ; end
    field(:follow_item, 36060) {
        number 32, true, -1
    }
    def follow_item_tg ; df.world.items.all.binsearch(follow_item) ; end
    field(:selected_farm_crops, 36064) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def selected_farm_crops_tg ; selected_farm_crops.map { |i| df.world.raws.plants.all[i] } ; end
    field(:available_seeds, 36088) {
        stl_bit_vector
    }
end

class UiAdvmode < MemHack::Compound
    sizeof 39592

    field(:menu, 0) {
        number 16, true, nil, UiAdvmodeMenu
    }
    field(:site_level_zoom, 2) {
        number 8, true
    }
    field(:travel_origin_x, 4) {
        number 32, true
    }
    field(:travel_origin_y, 8) {
        number 32, true
    }
    field(:travel_origin_z, 12) {
        number 32, true
    }
    field(:travel_clouds, 16) {
        number 8, true, nil, BooleanEnum
    }
    field(:travel_right_map, 17) {
        class ::DFHack::UiAdvmode_TTravelRightMap < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :MapNone ; NUME[:MapNone] = 0
            ENUM[1] = :MapSite ; NUME[:MapSite] = 1
            ENUM[2] = :MapWorld ; NUME[:MapWorld] = 2
        end

        number 8, true, nil, UiAdvmode_TTravelRightMap
    }
    field(:show_menu, 18) {
        class ::DFHack::UiAdvmode_TShowMenu < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :TwoBlankRows ; NUME[:TwoBlankRows] = -1
            ENUM[0] = :Hidden ; NUME[:Hidden] = 0
            ENUM[1] = :TwoRowsWithKeybindingHints ; NUME[:TwoRowsWithKeybindingHints] = 1
            ENUM[2] = :TwoRows ; NUME[:TwoRows] = 2
            ENUM[3] = :OneRow ; NUME[:OneRow] = 3
        end

        number 8, true, :TwoRowsWithKeybindingHints, UiAdvmode_TShowMenu
    }
    field(:message, 24) {
        stl_string
    }
    field(:message_color, 56) {
        number 16, true
    }
    field(:message_brightness, 58) {
        number 8, true
    }
    field(:travel_not_moved, 59) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk4b, 60) {
        number 8, true
    }
    field(:travel_move_countdown, 61) {
        number 8, false
    }
    field(:unk_4, 64) {
        number 32, true
    }
    field(:fell_tree_x, 68) {
        number 32, true
    }
    field(:fell_tree_y, 72) {
        number 32, true
    }
    field(:fell_tree_z, 76) {
        number 32, true
    }
    field(:unk_8, 80) {
        pointer {
        }
    }
    field(:unk_9, 88) {
        number 32, true
    }
    field(:unk_10, 92) {
        number 32, true
    }
    field(:unk_11, 96) {
        number 32, true
    }
    field(:unk_12, 100) {
        number 32, true
    }
    field(:unk_13, 104) {
        number 32, true
    }
    field(:offload_timer, 108) {
        number 8, true
    }
    field(:tick_counter, 112) {
        number 32, true
    }
    field(:frame_counter, 116) {
        number 32, true
    }
    field(:unk_15, 120) {
        number 16, true
    }
    field(:sleeping, 122) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_16, 123) {
        number 8, true
    }
    field(:bogeymen_ambush_size, 124) {
        number 32, true
    }
    field(:bogeymen_killed, 128) {
        number 32, true
    }
    field(:bogeymen_ambush_delay, 132) {
        number 32, true
    }
    field(:unk_18, 136) {
        number 32, true
    }
    field(:searched_x, 144) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:searched_y, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:searched_z, 192) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:searched_timeout, 216) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_19, 240) {
        number 8, true
    }
    field(:unk_20, 244) {
        number 32, true
    }
    field(:unk_21, 248) {
        number 32, true
    }
    field(:unk_22, 252) {
        number 32, true
    }
    field(:unk_23, 256) {
        number 8, true
    }
    field(:unk_24, 264) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def unk_24_tg ; unk_24.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:unk_25, 288) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_26, 312) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:player_army_id, 336) {
        number 32, true, -1
    }
    def player_army_tg ; df.world.armies.all.binsearch(player_army_id) ; end
    field(:gait_index, 340) {
        number 32, true
    }
    field(:gait_unk, 344) {
        number 8, true
    }
    field(:tracks_x, 348) {
        static_array(1000, 4) {
            number 32, true
        }
    }
    field(:tracks_y, 4348) {
        static_array(1000, 4) {
            number 32, true
        }
    }
    field(:tracks_z, 8348) {
        static_array(1000, 4) {
            number 32, true
        }
    }
    field(:tracks_next_idx, 12348) {
        number 32, true
    }
    field(:view_tracks_odors, 12352) {
        number 32, true
    }
    field(:tracks_visible, 12356) {
        number 32, true
    }
    field(:unk_x, 12360) {
        static_array(9, 2) {
            number 16, true
        }
    }
    field(:unk_y, 12378) {
        static_array(9, 2) {
            number 16, true
        }
    }
    field(:unk_z, 12396) {
        static_array(9, 2) {
            number 16, true
        }
    }
    field(:unk_v40_1, 12416) {
        static_array(9, 16) {
            compound(:UiAdvmode_TUnkV401) {
                field(:unk_s1, 0) {
                    number 16, true
                }
                field(:unk_s2, 2) {
                    number 8, true
                }
                field(:unk_s3, 4) {
                    number 32, true
                }
                field(:unk_s4, 8) {
                    number 32, true
                }
                field(:unk_s5, 12) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_39, 12560) {
        static_array(9, 1) {
            number 8, true
        }
    }
    field(:unk_40, 12569) {
        static_array(9, 1) {
            number 8, true
        }
    }
    field(:unk_41, 12580) {
        static_array(9, 4) {
            number 32, true
        }
    }
    field(:unk_42, 12616) {
        static_array(9, 1) {
            number 8, true
        }
    }
    field(:odor_race, 12628) {
        number 32, true, -1
    }
    def odor_race_tg ; df.world.raws.creatures.all[odor_race] ; end
    field(:odor_caste, 12632) {
        number 32, true, -1
    }
    def odor_caste_tg ; df.world.raws.creatures.all[odor_race].caste[odor_caste] ; end
    field(:odor_death, 12636) {
        number 8, true
    }
    field(:travel_odor_race, 12640) {
        number 32, true, -1
    }
    def travel_odor_race_tg ; df.world.raws.creatures.all[travel_odor_race] ; end
    field(:travel_odor_caste, 12644) {
        number 32, true, -1
    }
    def travel_odor_caste_tg ; df.world.raws.creatures.all[travel_odor_race].caste[travel_odor_caste] ; end
    field(:unk_46, 12648) {
        number 8, true
    }
    field(:multiattack, 12652) {
        number 32, true
    }
    field(:unk_3170, 12656) {
        compound(:UiAdvmode_TUnk3170) {
            field(:unk_1, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:UiAdvmode_TUnk3170_TUnk1) {
                            sizeof 100

                            field(:unk_0, 0) {
                                global :EntityEvent
                            }
                            field(:unk_28, 40) {
                                number 32, true
                            }
                            field(:unk_2c, 44) {
                                number 32, true, -1
                            }
                            field(:unk_30, 48) {
                                number 32, true, -1
                            }
                            field(:unk_34, 52) {
                                number 32, true, -1
                            }
                            field(:unk_38, 56) {
                                number 32, true, -1
                            }
                            field(:unk_3c, 60) {
                                number 32, true, -1000000
                            }
                            field(:unk_40, 64) {
                                number 32, true, -1000000
                            }
                            field(:unk_44, 68) {
                                number 32, true, -1000000
                            }
                            field(:unk_48, 72) {
                                number 32, true, -1
                            }
                            field(:unk_4c, 76) {
                                number 32, true, -1
                            }
                            field(:unk_50, 80) {
                                number 32, true, -1
                            }
                            field(:unk_54, 84) {
                                number 32, true, -1
                            }
                            field(:unk_58, 88) {
                                number 32, true, -1000000
                            }
                            field(:unk_5c, 92) {
                                number 32, true, -1000000
                            }
                            field(:unk_60, 96) {
                                number 32, true, -1000000
                            }
                        }
                    }
                }
            }
            field(:unk_2, 24) {
                static_array(17, 48) {
                    compound(:UiAdvmode_TUnk3170_TUnk2) {
                        field(:unk_1, 0) {
                            stl_vector
                        }
                        field(:unk_2, 24) {
                            stl_vector
                        }
                    }
                }
            }
            field(:unk_3, 840) {
                number 8, true
            }
        }
    }
    field(:unk_3124, 13504) {
        compound(:UiAdvmode_TUnk3124) {
            field(:unk_1, 0) {
                number 16, true
            }
            field(:unk_2, 2) {
                number 16, true
            }
            field(:unk_3, 4) {
                number 16, true
            }
            field(:unk_4, 6) {
                number 16, true
            }
            field(:unk_5, 8) {
                number 16, true
            }
            field(:unk_6, 10) {
                number 16, true
            }
            field(:unk_7, 12) {
                number 16, true
            }
            field(:unk_8, 16) {
                pointer {
                }
            }
            field(:unk_9, 24) {
                number 32, true
            }
            field(:unk_10, 28) {
                number 32, true
            }
            field(:unk_11, 32) {
                number 32, true
            }
            field(:unk_12, 36) {
                number 32, true
            }
            field(:unk_13, 40) {
                number 32, true
            }
            field(:unk_14, 44) {
                number 32, true
            }
            field(:unk_15, 48) {
                number 32, true
            }
            field(:unk_16, 52) {
                number 32, true
            }
            field(:unk_17, 56) {
                number 8, true
            }
            field(:unk_18, 57) {
                number 8, true
            }
            field(:unk_19, 58) {
                number 8, true
            }
            field(:unk_20, 64) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_21, 88) {
                number 32, true
            }
            field(:unk_22, 92) {
                static_array(20736, 1) {
                    number 8, true
                }
            }
            field(:unk_23, 20828) {
                number 8, true
            }
            field(:unk_24, 20829) {
                number 8, true
            }
            field(:unk_25, 20830) {
                number 16, true
            }
            field(:unk_26, 20832) {
                number 16, true
            }
            field(:unk_27, 20834) {
                number 16, true
            }
            field(:unk_28, 20840) {
                pointer {
                }
            }
            field(:unk_29, 20848) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_30, 20872) {
                number 32, true
            }
            field(:unk_31, 20880) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_32, 20904) {
                number 32, true
            }
            field(:unk_33, 20912) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_33b, 20936) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_34, 20960) {
                number 32, true
            }
            field(:unk_35, 20964) {
                number 8, true
            }
            field(:unk_36, 20965) {
                number 8, true
            }
            field(:unk_36a, 20966) {
                number 8, true
            }
            field(:unk_36b, 20968) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_36c, 20992) {
                number 32, true
            }
            field(:unk_37, 21000) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_38, 21024) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_39, 21048) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_40, 21072) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_41, 21096) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_42, 21120) {
                stl_vector
            }
            field(:unk_43, 21144) {
                stl_vector
            }
            field(:unk_44, 21168) {
                stl_vector
            }
            field(:unk_45, 21192) {
                number 32, true
            }
            field(:unk_46, 21200) {
                stl_string
            }
            field(:unk_47, 21232) {
                number 8, true
            }
            field(:unk_48, 21233) {
                number 8, true
            }
            field(:unk_49, 21234) {
                number 8, true
            }
            field(:unk_50, 21240) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_51, 21264) {
                stl_bit_vector
            }
            field(:unk_52, 21296) {
                stl_bit_vector
            }
            field(:unk_53, 21328) {
                number 32, true
            }
            field(:unk_54, 21336) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_55, 21360) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_56, 21384) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_57, 21408) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_58, 21432) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_59, 21456) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_60, 21480) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_61, 21504) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_62, 21528) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_48, 35056) {
        number 32, true
    }
    field(:unk_49, 35060) {
        number 32, true
    }
    field(:unk_50, 35064) {
        number 32, true
    }
    field(:unk_51, 35068) {
        number 32, true
    }
    field(:wait_timer, 35072) {
        number 32, true
    }
    field(:attack_style, 35076) {
        number 32, true
    }
    field(:charge_forbidden, 35080) {
        class ::DFHack::UiAdvmode_TChargeForbidden < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :None ; NUME[:None] = -1
            ENUM[0] = :NoTarget ; NUME[:NoTarget] = 0
            ENUM[1] = :SelfProne ; NUME[:SelfProne] = 1
            ENUM[2] = :SelfMounted ; NUME[:SelfMounted] = 2
            ENUM[3] = :SelfChained ; NUME[:SelfChained] = 3
            ENUM[4] = :SelfUncontrolledFlight ; NUME[:SelfUncontrolledFlight] = 4
            ENUM[5] = :SelfVehicle ; NUME[:SelfVehicle] = 5
            ENUM[6] = :SelfProjectile ; NUME[:SelfProjectile] = 6
            ENUM[7] = :SelfClimbing ; NUME[:SelfClimbing] = 7
            ENUM[8] = :TargetProne ; NUME[:TargetProne] = 8
            ENUM[9] = :TargetMounted ; NUME[:TargetMounted] = 9
            ENUM[10] = :TargetChained ; NUME[:TargetChained] = 10
            ENUM[11] = :TargetUncontrolledFlight ; NUME[:TargetUncontrolledFlight] = 11
            ENUM[12] = :TargetVehicle ; NUME[:TargetVehicle] = 12
            ENUM[13] = :TargetProjectile ; NUME[:TargetProjectile] = 13
            ENUM[14] = :TargetClimbing ; NUME[:TargetClimbing] = 14
            ENUM[15] = :TargetSharesLocation ; NUME[:TargetSharesLocation] = 15
            ENUM[16] = :TargetLocationInaccessible ; NUME[:TargetLocationInaccessible] = 16
            ENUM[17] = :TargetTooFarAway ; NUME[:TargetTooFarAway] = 17
        end

        number 32, true, nil, UiAdvmode_TChargeForbidden
    }
    field(:unk_55, 35084) {
        number 8, true
    }
    field(:unk_56, 35088) {
        number 32, true
    }
    field(:unk_57, 35092) {
        number 32, true
    }
    field(:unk_58, 35096) {
        number 32, true
    }
    field(:unk_59, 35104) {
        stl_vector
    }
    field(:unk_60, 35128) {
        number 32, true
    }
    field(:unk_61, 35132) {
        number 8, true
    }
    field(:long_action_duration, 35134) {
        number 16, true
    }
    field(:travel_start_x, 35136) {
        number 16, true
    }
    field(:travel_start_y, 35138) {
        number 16, true
    }
    field(:travel_start_z, 35140) {
        number 16, true
    }
    field(:player_id, 35144) {
        number 32, true, -1
    }
    def player_tg ; df.world.nemesis.all.binsearch(player_id) ; end
    field(:track_viewed_x, 35148) {
        number 16, true
    }
    field(:track_viewed_y, 35150) {
        number 16, true
    }
    field(:track_viewed_unk_1, 35152) {
        pointer {
        }
    }
    field(:track_viewed_unk_2, 35160) {
        pointer {
        }
    }
    field(:conversation, 35168) {
        compound(:UiAdvmode_TConversation) {
            field(:activity, 0) {
                stl_vector(8) {
                    pointer {
                        global :ActivityEntry
                    }
                }
            }
            field(:activity_event, 24) {
                stl_vector(8) {
                    pointer {
                        global :ActivityEvent
                    }
                }
            }
            field(:cursor_activity, 48) {
                number 32, true, -1
            }
            field(:cursor_choice, 52) {
                number 32, true, -1
            }
            field(:current_page, 56) {
                number 32, true
            }
            field(:page_top_choices, 64) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:page_bottom_choices, 88) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:choices, 112) {
                stl_vector(8) {
                    pointer {
                        compound(:UiAdvmode_TConversation_TChoices) {
                            sizeof 64

                            field(:choice, 0) {
                                pointer {
                                    global :TalkChoice
                                }
                            }
                            field(:keywords, 8) {
                                stl_vector(8) {
                                    pointer {
                                        stl_string
                                    }
                                }
                            }
                            field(:title, 32) {
                                stl_vector(8) {
                                    pointer {
                                        stl_string
                                    }
                                }
                            }
                            field(:orig_index, 56) {
                                number 32, true
                            }
                            field(:ranking, 60) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:filter, 136) {
                stl_string
            }
            field(:unk_1, 168) {
                number 32, true
            }
            field(:targets, 176) {
                stl_vector(8) {
                    pointer {
                        compound(:UiAdvmode_TConversation_TTargets) {
                            sizeof 12

                            field(:unit_id, 0) {
                                number 32, true, -1
                            }
                            def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
                            field(:histfig_id, 4) {
                                number 32, true, -1
                            }
                            def histfig_tg ; df.world.history.figures.binsearch(histfig_id) ; end
                            field(:type, 8) {
                                class ::DFHack::UiAdvmode_TConversation_TTargets_TType < MemHack::Enum
                                    ENUM = Hash.new
                                    NUME = Hash.new
                                    ENUM[0] = :Talk ; NUME[:Talk] = 0
                                    ENUM[3] = :Shout ; NUME[:Shout] = 3
                                    ENUM[4] = :Perform ; NUME[:Perform] = 4
                                end

                                number 32, true, nil, UiAdvmode_TConversation_TTargets_TType
                            }
                        }
                    }
                }
            }
            field(:cursor_target, 200) {
                number 32, true, -1
            }
        }
    }
    field(:unk_70, 35376) {
        stl_vector
    }
    field(:unk_71, 35400) {
        number 32, true
    }
    field(:unk_72, 35408) {
        stl_vector
    }
    field(:interacts, 35432) {
        stl_vector(8) {
            pointer {
                global :AdventureItemInteractChoicest
            }
        }
    }
    field(:commands, 35456) {
        stl_vector(8) {
            pointer {
                global :AdventureOptionst
            }
        }
    }
    field(:movements, 35480) {
        stl_vector(8) {
            pointer {
                global :AdventureMovementOptionst
            }
        }
    }
    field(:unk_75, 35504) {
        stl_vector
    }
    field(:sleep_hours, 35528) {
        number 32, true
    }
    field(:sleep_until_dawn, 35532) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_78, 35533) {
        number 8, true
    }
    field(:rest_mode, 35534) {
        class ::DFHack::UiAdvmode_TRestMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Wait ; NUME[:Wait] = 0
            ENUM[1] = :Sleep ; NUME[:Sleep] = 1
        end

        number 8, true, nil, UiAdvmode_TRestMode
    }
    field(:unk_80, 35535) {
        number 8, true
    }
    field(:unk_81, 35536) {
        number 8, true
    }
    field(:player_control_state, 35537) {
        number 8, true
    }
    field(:item_projectiles_state, 35538) {
        number 8, true
    }
    field(:unk_84, 35540) {
        number 32, true
    }
    field(:companions, 35544) {
        compound(:UiAdvmode_TCompanions) {
            field(:unit, 0) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:unit_visible, 24) {
                stl_bit_vector
            }
            field(:unit_position, 56) {
                global :CoordPath
            }
            field(:all_histfigs, 128) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def all_histfigs_tg ; all_histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
        }
    }
    field(:unk_1, 35696) {
        number 32, true
    }
    field(:interactions, 35704) {
        compound(:UiAdvmode_TInteractions) {
            field(:party_core_members, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def party_core_members_tg ; party_core_members.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:party_pets, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def party_pets_tg ; party_pets.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:party_extra_members, 48) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def party_extra_members_tg ; party_extra_members.map { |i| df.world.history.figures.binsearch(i) } ; end
            field(:unk_86, 72) {
                stl_vector
            }
            field(:unk_1, 96) {
                stl_vector
            }
            field(:unk_1e4, 120) {
                number 32, true
            }
            field(:unk_1e8, 124) {
                number 32, true
            }
            field(:selected_ability, 128) {
                number 32, true, -1
            }
            field(:selected_power, 132) {
                number 32, true, -1
            }
            field(:unk_1f0, 136) {
                pointer {
                }
            }
            field(:max_target_number, 144) {
                number 32, true, -1
            }
            field(:target_range, 148) {
                number 32, true
            }
            field(:target_flags, 152) {
                global :CreatureInteractionTargetFlags
            }
            field(:unk_200, 160) {
                pointer {
                }
            }
        }
    }
    field(:unk_87, 35872) {
        stl_string
    }
    field(:unk_220, 35904) {
        number 32, true
    }
    field(:unk_224, 35908) {
        number 32, true
    }
    field(:unk_v40_2, 35912) {
        compound(:UiAdvmode_TUnkV402) {
            field(:unk_s1, 0) {
                stl_vector
            }
            field(:unk_s2, 24) {
                stl_vector
            }
            field(:unk_s3, 48) {
                stl_vector
            }
            field(:unk_s4, 72) {
                stl_vector
            }
            field(:unk_s5, 96) {
                number 8, true
            }
            field(:unk_s6, 104) {
                stl_vector
            }
            field(:unk_s7, 128) {
                stl_vector
            }
        }
    }
    field(:unk_v40_3, 36064) {
        compound(:UiAdvmode_TUnkV403) {
            field(:unk_s1, 0) {
                number 32, true
            }
            field(:unk_s2, 8) {
                stl_vector
            }
        }
    }
    field(:player_unit_projectile_unk, 36096) {
        pointer {
        }
    }
    field(:player_unit_projectile_z, 36104) {
        number 32, true
    }
    field(:unk_90, 36108) {
        number 32, true
    }
    field(:unk_v40_4, 36112) {
        compound(:UiAdvmode_TUnkV404) {
            field(:unk_v40_4a, 0) {
                static_array(100, 28) {
                    compound(:UiAdvmode_TUnkV404_TUnkV404a) {
                        field(:unk_s1, 0) {
                            number 32, true
                        }
                        field(:unk_s2, 4) {
                            global :Coord
                        }
                        field(:unk_s5, 10) {
                            global :Coord
                        }
                        field(:unk_s8, 16) {
                            number 16, true
                        }
                        field(:unk_s9, 20) {
                            number 32, true
                        }
                        field(:unk_s10, 24) {
                            number 32, true
                        }
                    }
                }
            }
            field(:unk_v40_4b, 2800) {
                number 32, true
            }
        }
    }
    field(:unk_v40_5, 38920) {
        compound(:UiAdvmode_TUnkV405) {
            field(:unk_s1, 0) {
                stl_vector
            }
            field(:unk_s2, 24) {
                stl_vector
            }
            field(:unk_s3, 48) {
                stl_vector
            }
            field(:unk_s4, 72) {
                number 32, true
            }
            field(:unk_s5, 80) {
                stl_vector
            }
            field(:unk_s6, 104) {
                stl_vector
            }
        }
    }
    field(:unk_v42_1, 39048) {
        compound(:UiAdvmode_TUnkV421) {
            field(:unk_s1, 0) {
                number 32, true
            }
            field(:unk_s2, 8) {
                stl_vector
            }
            field(:unk_s3, 32) {
                stl_vector
            }
            field(:unk_s4, 56) {
                stl_string
            }
            field(:unk_s5, 88) {
                number 8, true
            }
            field(:unk_s6, 92) {
                number 32, true
            }
            field(:unk_s7, 96) {
                number 32, true
            }
            field(:unk_s8, 100) {
                number 32, true
            }
            field(:unk_s9, 104) {
                stl_vector
            }
        }
    }
    field(:unk_91, 39176) {
        pointer {
        }
    }
    field(:assume_identity, 39184) {
        compound(:UiAdvmode_TAssumeIdentity) {
            field(:mode, 0) {
                number 32, true, nil, AssumeIdentityMode
            }
            field(:name, 8) {
                global :LanguageName
            }
            field(:worship_object, 128) {
                number 32, true, -1
            }
            def worship_object_tg ; df.world.history.figures.binsearch(worship_object) ; end
            field(:profession, 132) {
                number 32, true, nil, Profession
            }
            field(:origin, 136) {
                number 32, true, -1
            }
            def origin_tg ; df.world.entities.all.binsearch(origin) ; end
            field(:unk_1, 144) {
                stl_vector
            }
            field(:unk_2, 168) {
                stl_vector
            }
            field(:filter, 192) {
                stl_string
            }
            field(:unk_3, 224) {
                number 8, true
            }
            field(:unk_4, 228) {
                number 32, true
            }
        }
    }
    field(:move_direction_x, 39416) {
        number 16, true
    }
    field(:move_direction_y, 39418) {
        number 16, true
    }
    field(:move_direction_z, 39420) {
        number 16, true
    }
    field(:unk_95, 39422) {
        number 8, true
    }
    field(:move_carefully, 39423) {
        number 8, true
    }
    field(:careful_direction_x, 39424) {
        number 16, true
    }
    field(:careful_direction_y, 39426) {
        number 16, true
    }
    field(:interrupt_performance_warning, 39432) {
        stl_string
    }
    field(:unk_2, 39464) {
        number 32, true
    }
    field(:name_item, 39472) {
        global :LanguageName
    }
end

class UiBuildItemReq < MemHack::Compound
    sizeof 368

    field(:filter, 0) {
        global :JobItemFilter
    }
    field(:candidates, 264) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:candidate_selected, 288) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:unk_a0, 312) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:candidate_enabled, 336) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:count_required, 360) {
        number 16, true
    }
    field(:count_max, 362) {
        number 16, true
    }
    field(:count_provided, 364) {
        number 16, true
    }
end

class UiBuildSelector < MemHack::Compound
    sizeof 4072

    rtti_classname :buildreqst

    field(:requirements, 8) {
        stl_vector(8) {
            pointer {
                global :UiBuildItemReq
            }
        }
    }
    field(:choices, 32) {
        stl_vector(8) {
            pointer {
                global :BuildReqChoicest
            }
        }
    }
    field(:building_type, 56) {
        number 32, true, nil, BuildingType
    }
    field(:building_subtype, 60) {
        number 16, true
    }
    field(:custom_type, 64) {
        number 32, true, -1
    }
    def custom_type_tg ; df.world.raws.buildings.all.binsearch(custom_type) ; end
    field(:stage, 68) {
        number 32, true
    }
    field(:req_index, 72) {
        number 16, true
    }
    field(:sel_index, 74) {
        number 16, true
    }
    field(:is_grouped, 76) {
        number 32, true
    }
    field(:errors, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk4, 104) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:tiles, 128) {
        static_array(31, 124) {
            static_array(31, 4) {
                number 32, true
            }
        }
    }
    field(:unk5_0a, 3972) {
        number 16, true
    }
    field(:unk5_0b, 3974) {
        number 16, true
    }
    field(:plate_info, 3976) {
        global :PressurePlateInfo
    }
    field(:unk6, 4000) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk7, 4024) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:friction, 4048) {
        number 32, true, 50000
    }
    field(:use_dump, 4052) {
        number 32, true
    }
    field(:dump_x_shift, 4056) {
        number 32, true
    }
    field(:dump_y_shift, 4060) {
        number 32, true
    }
    field(:speed, 4064) {
        number 32, true, 50000
    }
end

class UiHotkey < MemHack::Compound
    sizeof 56

    field(:name, 0) {
        stl_string
    }
    field(:cmd, 32) {
        class ::DFHack::UiHotkey_TCmd < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :None ; NUME[:None] = -1
            ENUM[0] = :Zoom ; NUME[:Zoom] = 0
            ENUM[1] = :FollowUnit ; NUME[:FollowUnit] = 1
            ENUM[2] = :FollowItem ; NUME[:FollowItem] = 2
        end

        number 16, true, nil, UiHotkey_TCmd
    }
    field(:x, 36) {
        number 32, true
    }
    field(:y, 40) {
        number 32, true
    }
    field(:z, 44) {
        number 32, true
    }
    field(:unit_id, 48) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:item_id, 48) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
end

class UiLookList < MemHack::Compound
    sizeof 24

    field(:items, 0) {
        stl_vector(8) {
            pointer {
                compound(:UiLookList_TItems) {
                    sizeof 32

                    field(:type, 0) {
                        class ::DFHack::UiLookList_TItems_TType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :Item ; NUME[:Item] = 0
                            ENUM[1] = :Floor ; NUME[:Floor] = 1
                            ENUM[2] = :Unit ; NUME[:Unit] = 2
                            ENUM[3] = :Building ; NUME[:Building] = 3
                            ENUM[4] = :Vermin ; NUME[:Vermin] = 4
                            ENUM[5] = :Flow ; NUME[:Flow] = 5
                            ENUM[6] = :Campfire ; NUME[:Campfire] = 6
                            ENUM[7] = :Spatter ; NUME[:Spatter] = 7
                            ENUM[8] = :BuildingItem ; NUME[:BuildingItem] = 8
                            ENUM[9] = :Fire ; NUME[:Fire] = 9
                            ENUM[10] = :Water ; NUME[:Water] = 10
                            ENUM[11] = :Magma ; NUME[:Magma] = 11
                            ENUM[12] = :Spoor ; NUME[:Spoor] = 12
                        end

                        number 16, true, nil, UiLookList_TItems_TType
                    }
                    field(:spatter_item_type, 2) {
                        number 16, true, nil, ItemType
                    }
                    field(:spatter_item_subtype, 4) {
                        number 16, true, -1
                    }
                    field(:spatter_mat_type, 6) {
                        number 16, true, -1
                    }
                    field(:spatter_mat_index, 8) {
                        number 32, true
                    }
                    field(:spatter_mat_state, 12) {
                        number 16, true, nil, MatterState
                    }
                    field(:data, 16) {
                        compound(:UiLookList_TItems_TData) {
                            field(:Item, 0) {
                                pointer {
                                    global :Item
                                }
                            }
                            field(:Unit, 0) {
                                pointer {
                                    global :Unit
                                }
                            }
                            field(:Building, 0) {
                                pointer {
                                    global :Building
                                }
                            }
                            field(:Vermin, 0) {
                                pointer {
                                    global :Vermin
                                }
                            }
                            field(:Flow, 0) {
                                pointer {
                                    global :FlowInfo
                                }
                            }
                            field(:Spatter, 0) {
                                compound(:UiLookList_TItems_TData_TSpatter) {
                                    field(:amount, 0) {
                                        number 8, true
                                    }
                                }
                            }
                            field(:Water, 0) {
                                compound(:UiLookList_TItems_TData_TWater) {
                                    field(:depth, 0) {
                                        number 8, true
                                    }
                                }
                            }
                            field(:Magma, 0) {
                                compound(:UiLookList_TItems_TData_TMagma) {
                                    field(:depth, 0) {
                                        number 8, true
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_1, 24) {
                        number 16, true
                    }
                    field(:unk_2, 26) {
                        number 16, true
                    }
                    field(:unk_3, 28) {
                        number 16, true
                    }
                }
            }
        }
    }
end

class UiSidebarMenus < MemHack::Compound
    sizeof 7304

    field(:designation, 0) {
        compound(:UiSidebarMenus_TDesignation) {
            field(:marker_only, 0) {
                number 8, true, nil, BooleanEnum
            }
            field(:priority_set, 1) {
                number 8, true, nil, BooleanEnum
            }
            field(:priority, 4) {
                number 32, true, 4000
            }
            field(:mine_mode, 8) {
                class ::DFHack::UiSidebarMenus_TDesignation_TMineMode < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :All ; NUME[:All] = 0
                    ENUM[1] = :AutoMine ; NUME[:AutoMine] = 1
                    ENUM[2] = :Economic ; NUME[:Economic] = 2
                    ENUM[3] = :Gems ; NUME[:Gems] = 3
                end

                number 32, true, nil, UiSidebarMenus_TDesignation_TMineMode
            }
        }
    }
    field(:workshop_job, 16) {
        compound(:UiSidebarMenus_TWorkshopJob) {
            field(:choices_all, 0) {
                stl_vector(8) {
                    pointer {
                        global :InterfaceButtonBuildingst
                    }
                }
            }
            field(:choices_visible, 24) {
                stl_vector(8) {
                    pointer {
                        global :InterfaceButtonBuildingst
                    }
                }
            }
            field(:cursor, 48) {
                number 32, true
            }
            field(:category_id, 52) {
                number 32, true
            }
            field(:mat_type, 56) {
                number 16, true, -1
            }
            field(:mat_index, 60) {
                number 32, true
            }
            field(:material_category, 64) {
                global :JobMaterialCategory
            }
            field(:unk_1, 72) {
                stl_string
            }
            field(:use_tooltip_lines, 104) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
        }
    }
    field(:building, 144) {
        compound(:UiSidebarMenus_TBuilding) {
            field(:choices_all, 0) {
                stl_vector(8) {
                    pointer {
                        global :InterfaceButtonConstructionst
                    }
                }
            }
            field(:choices_visible, 24) {
                stl_vector(8) {
                    pointer {
                        global :InterfaceButtonConstructionst
                    }
                }
            }
            field(:category_id, 48) {
                number 32, true
            }
            field(:cursor, 52) {
                number 32, true
            }
        }
    }
    field(:zone, 200) {
        compound(:UiSidebarMenus_TZone) {
            field(:remove, 0) {
                number 8, true, nil, BooleanEnum
            }
            field(:pad_1, 1) {
            }
            field(:mode, 2) {
                class ::DFHack::UiSidebarMenus_TZone_TMode < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Rectangle ; NUME[:Rectangle] = 0
                    ENUM[1] = :Flow ; NUME[:Flow] = 1
                    ENUM[2] = :FloorFlow ; NUME[:FloorFlow] = 2
                end

                number 16, true, nil, UiSidebarMenus_TZone_TMode
            }
            field(:selected, 8) {
                pointer {
                    global :BuildingCivzonest
                }
            }
        }
    }
    field(:unit, 216) {
        compound(:UiSidebarMenus_TUnit) {
            field(:inv_items, 0) {
                stl_vector(8) {
                    pointer {
                        global :UnitInventoryItem
                    }
                }
            }
            field(:inv_spatters, 24) {
                stl_vector(8) {
                    pointer {
                        global :Spatter
                    }
                }
            }
            field(:unk_1, 48) {
                stl_vector
            }
            field(:in_new_squad, 72) {
                number 8, true, nil, BooleanEnum
            }
            field(:cursor_uniform, 76) {
                number 32, true
            }
            field(:unk_88n_cursor, 80) {
                number 32, true
            }
            field(:squads, 88) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:squad_pos, 112) {
                stl_vector(8) {
                    pointer {
                        global :EntityPosition
                    }
                }
            }
            field(:squad_assn, 136) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:squad_unk1, 160) {
                stl_bit_vector
            }
            field(:squad_unk2, 192) {
                stl_vector
            }
            field(:unk_2a, 216) {
                pointer {
                    global :EntityPosition
                }
            }
            field(:unk_2b, 224) {
                pointer {
                    global :EntityPositionAssignment
                }
            }
            field(:unk_2c, 232) {
                pointer {
                    global :EntityPosition
                }
            }
            field(:unk3, 240) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk4, 241) {
                number 8, true, nil, BooleanEnum
            }
            field(:squad_list_opened, 242) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk5, 243) {
                number 8, true, nil, BooleanEnum
            }
            field(:rename_squad, 248) {
                pointer {
                    global :Squad
                }
            }
            field(:unk_88, 256) {
                stl_vector
            }
            field(:unk_44_11a, 280) {
                stl_vector
            }
            field(:unk_44_11b, 304) {
                number 32, true
            }
            field(:unk_44_11c, 308) {
                number 8, true
            }
            field(:expel_error, 312) {
                class ::DFHack::UiSidebarMenus_TUnit_TExpelError < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[-1] = :NONE ; NUME[:NONE] = -1
                    ENUM[0] = :NOBILITY ; NUME[:NOBILITY] = 0
                    ENUM[1] = :HOLDS_OFFICE ; NUME[:HOLDS_OFFICE] = 1
                    ENUM[2] = :DOES_EXPELLING ; NUME[:DOES_EXPELLING] = 2
                    ENUM[3] = :SPOUSE_IS_NOT_PRESENT ; NUME[:SPOUSE_IS_NOT_PRESENT] = 3
                    ENUM[4] = :SPOUSE_IS_NOBILITY ; NUME[:SPOUSE_IS_NOBILITY] = 4
                    ENUM[5] = :SPOUSE_IS_ELECTED ; NUME[:SPOUSE_IS_ELECTED] = 5
                    ENUM[6] = :SPOUSE_DOES_EXPELLING ; NUME[:SPOUSE_DOES_EXPELLING] = 6
                    ENUM[7] = :CHILD_IS_NOT_PRESENT ; NUME[:CHILD_IS_NOT_PRESENT] = 7
                    ENUM[8] = :CHILD_IS_NOBILITY ; NUME[:CHILD_IS_NOBILITY] = 8
                    ENUM[9] = :CHILD_IS_ELECTED ; NUME[:CHILD_IS_ELECTED] = 9
                    ENUM[10] = :CHILD_DOES_EXPELLING ; NUME[:CHILD_DOES_EXPELLING] = 10
                end

                number 32, true, nil, UiSidebarMenus_TUnit_TExpelError
            }
        }
    }
    field(:hospital, 536) {
        compound(:UiSidebarMenus_THospital) {
            field(:selected_line, 0) {
                number 32, true
            }
            field(:beds, 4) {
                number 32, true
            }
            field(:tables, 8) {
                number 32, true
            }
            field(:traction_benches, 12) {
                number 32, true
            }
            field(:containers, 16) {
                number 32, true
            }
        }
    }
    field(:location, 560) {
        compound(:UiSidebarMenus_TLocation) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        global :AbstractBuilding
                    }
                }
            }
            field(:cursor, 24) {
                number 32, true
            }
            field(:deity_type, 32) {
                stl_vector(4) {
                    global :TempleDeityType
                }
            }
            field(:deity_data, 56) {
                stl_vector(4) {
                    global :TempleDeityData
                }
            }
            field(:cursor_deity, 80) {
                number 32, true
            }
            field(:in_create, 84) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_choose_deity, 85) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_choose_profession, 86) {
                number 8, true, nil, BooleanEnum
            }
            field(:profession, 88) {
                stl_vector(2) {
                    global :Profession
                }
            }
            field(:cursor_profession, 112) {
                number 32, true
            }
        }
    }
    field(:job_details, 680) {
        compound(:UiSidebarMenus_TJobDetails) {
            field(:job, 0) {
                pointer {
                    global :Job
                }
            }
            field(:order, 8) {
                pointer {
                    global :ManagerOrder
                }
            }
            field(:detail_type, 16) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:detail_material_type, 40) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:detail_cursor, 64) {
                number 32, true
            }
            field(:setting_detail_type, 68) {
                number 32, true
            }
            field(:unk6, 72) {
                number 32, true
            }
            field(:pos, 76) {
                global :Coord
            }
            field(:workshop, 88) {
                pointer {
                    global :BuildingWorkshopst
                }
            }
            field(:mat_type_visible, 96) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:mat_index_visible, 120) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:mat_amount_visible, 144) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:mat_type_all, 168) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:mat_index_all, 192) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:mat_amount_all, 216) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:mat_cursor, 240) {
                number 32, true
            }
            field(:mat_filter, 248) {
                stl_string
            }
            field(:editing_mat_filter, 280) {
                number 8, true, nil, BooleanEnum
            }
            field(:sizes_visible, 288) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:sizes_all, 312) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:size_cursor, 336) {
                number 32, true
            }
            field(:size_filter, 344) {
                stl_string
            }
            field(:editing_size_filter, 376) {
                number 8, true, nil, BooleanEnum
            }
            field(:decoration_types, 384) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:decoration_cursor, 408) {
                number 32, true
            }
            field(:selected_display_furniture, 416) {
                pointer {
                    global :BuildingDisplayFurniturest
                }
            }
            field(:displayed_items_cursor, 424) {
                number 32, true
            }
        }
    }
    field(:unit_cursor, 1112) {
        compound(:UiSidebarMenus_TUnitCursor) {
            field(:list, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def list_tg ; df.world.units.active[list] ; end
            field(:unk_a0, 24) {
                number 8, true
            }
            field(:unk_a1, 25) {
                number 8, true
            }
        }
    }
    field(:unit_skills, 1144) {
        compound(:UiSidebarMenus_TUnitSkills) {
            field(:skill_id, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            field(:skill_type, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:skill_subtype, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:show_combat, 1216) {
        number 8, true, nil, BooleanEnum
    }
    field(:show_labor, 1217) {
        number 8, true, nil, BooleanEnum
    }
    field(:show_misc, 1218) {
        number 8, true, nil, BooleanEnum
    }
    field(:barracks_squad_cursor, 1220) {
        number 32, true
    }
    field(:barracks, 1224) {
        compound(:UiSidebarMenus_TBarracks) {
            field(:squads, 0) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:uses, 24) {
                stl_vector(4) {
                    global :SquadUseFlags
                }
            }
            field(:in_rename, 48) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_positions, 49) {
                number 8, true, nil, BooleanEnum
            }
            field(:position_squad, 56) {
                pointer {
                    global :Squad
                }
            }
            field(:position_cursor, 64) {
                number 32, true
            }
            field(:in_position_squads, 68) {
                number 8, true, nil, BooleanEnum
            }
            field(:position_squads, 72) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:position_squad_cursor, 96) {
                number 32, true
            }
        }
    }
    field(:unk_1, 1328) {
        stl_vector
    }
    field(:unk_2, 1352) {
        pointer {
        }
    }
    field(:minimap, 1360) {
        compound(:UiSidebarMenus_TMinimap) {
            field(:data, 0) {
                static_array(23, 92) {
                    static_array(23, 4) {
                        number 32, true
                    }
                }
            }
            field(:need_render, 2116) {
                number 8, true, nil, BooleanEnum
            }
            field(:need_scan, 2117) {
                number 8, true, nil, BooleanEnum
            }
            field(:z_level, 2118) {
                number 16, true
            }
            field(:tile, 2120) {
                static_array(23, 23) {
                    static_array(23, 1) {
                        number 8, false
                    }
                }
            }
            field(:tile_fg, 2650) {
                static_array(23, 46) {
                    static_array(23, 2) {
                        number 16, true
                    }
                }
            }
            field(:tile_bg, 3708) {
                static_array(23, 46) {
                    static_array(23, 2) {
                        number 16, true
                    }
                }
            }
            field(:tile_bold, 4766) {
                static_array(23, 46) {
                    static_array(23, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:command_line, 7184) {
        compound(:UiSidebarMenus_TCommandLine) {
            field(:original, 0) {
                stl_string
            }
            field(:arg_vect, 32) {
                stl_vector(8) {
                    pointer {
                        stl_string
                    }
                }
            }
            field(:gen_id, 56) {
                number 4, true
            }
            field(:world_seed, 60) {
                number 4, true
            }
            field(:use_seed, 64) {
                number 8, true, nil, BooleanEnum
            }
            field(:world_param, 72) {
                stl_string
            }
            field(:use_param, 104) {
                number 8, true
            }
        }
    }
    field(:num_speech_tokens, 7296) {
        number 32, true
    }
    field(:unk_17d8, 7300) {
        number 8, true
    }
end

class UiUnitViewMode < MemHack::Compound
    sizeof 4

    field(:value, 0) {
        class ::DFHack::UiUnitViewMode_TValue < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :General ; NUME[:General] = 0
            ENUM[1] = :Inventory ; NUME[:Inventory] = 1
            ENUM[2] = :Preferences ; NUME[:Preferences] = 2
            ENUM[3] = :Wounds ; NUME[:Wounds] = 3
            ENUM[4] = :PrefLabor ; NUME[:PrefLabor] = 4
            ENUM[5] = :PrefDogs ; NUME[:PrefDogs] = 5
            ENUM[6] = :PrefOccupation ; NUME[:PrefOccupation] = 6
        end

        number 32, true, nil, UiUnitViewMode_TValue
    }
end

class UndeadFlags < MemHack::Compound
    field(:_whole, 0) {
        number 16, false
    }
    field(:zombie, 0) { bit 0 }
    field(:ghostly, 0) { bit 1 }
end

class UniformFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:replace_clothing, 0) { bit 0 }
    field(:exact_matches, 0) { bit 1 }
end

class UniformIndivChoice < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:any, 0) { bit 0 }
    field(:melee, 0) { bit 1 }
    field(:ranged, 0) { bit 2 }
end

class Unit < MemHack::Compound
    sizeof 5072

    rtti_classname :unitst

    field(:name, 8) {
        global :LanguageName
    }
    field(:custom_profession, 128) {
        stl_string
    }
    field(:profession, 160) {
        number 16, true, :STANDARD, Profession
    }
    field(:profession2, 162) {
        number 16, true, :STANDARD, Profession
    }
    field(:race, 164) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:pos, 168) {
        global :Coord
    }
    field(:idle_area, 174) {
        global :Coord
    }
    field(:idle_area_threshold, 180) {
        number 32, true, 3
    }
    field(:idle_area_type, 184) {
        number 16, true, nil, UnitStationType
    }
    field(:follow_distance, 188) {
        number 32, true
    }
    field(:path, 192) {
        compound(:Unit_TPath) {
            field(:dest, 0) {
                global :Coord
            }
            field(:goal, 6) {
                number 16, true, nil, UnitPathGoal
            }
            field(:path, 8) {
                global :CoordPath
            }
        }
    }
    field(:flags1, 272) {
        global :UnitFlags1
    }
    field(:flags2, 276) {
        global :UnitFlags2
    }
    field(:flags3, 280) {
        global :UnitFlags3
    }
    field(:flags4, 284) {
        global :UnitFlags4
    }
    field(:meeting, 288) {
        compound(:Unit_TMeeting) {
            field(:state, 0) {
                class ::DFHack::Unit_TMeeting_TState < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :SelectNoble ; NUME[:SelectNoble] = 0
                    ENUM[1] = :FollowNoble ; NUME[:FollowNoble] = 1
                    ENUM[2] = :DoMeeting ; NUME[:DoMeeting] = 2
                    ENUM[3] = :LeaveMap ; NUME[:LeaveMap] = 3
                end

                number 8, true, nil, Unit_TMeeting_TState
            }
            field(:target_entity, 4) {
                number 32, true, -1
            }
            def target_entity_tg ; df.world.entities.all.binsearch(target_entity) ; end
            field(:target_role, 8) {
                number 16, true, nil, EntityPositionResponsibility
            }
            field(:pad_1, 10) {
            }
        }
    }
    field(:caste, 300) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:sex, 302) {
        number 8, true, nil, PronounType
    }
    field(:id, 304) {
        number 32, true
    }
    field(:unk_100, 308) {
        number 16, true
    }
    field(:training_level, 312) {
        number 32, true, :WildUntamed, AnimalTrainingLevel
    }
    field(:schedule_id, 316) {
        number 32, true, -1
    }
    def schedule_tg ; df.world.schedules.all.binsearch(schedule_id) ; end
    field(:civ_id, 320) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:population_id, 324) {
        number 32, true, -1
    }
    def population_tg ; df.world.entity_populations.binsearch(population_id) ; end
    field(:unk_c0, 328) {
        number 32, true, -1
    }
    field(:cultural_identity, 332) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity) ; end
    field(:invasion_id, 336) {
        number 32, true, -1
    }
    def invasion_tg ; df.ui.invasions.list.binsearch(invasion_id) ; end
    field(:patrol_route, 344) {
        global :CoordPath
    }
    field(:patrol_index, 416) {
        number 32, true
    }
    field(:specific_refs, 424) {
        stl_vector(8) {
            pointer {
                global :SpecificRef
            }
        }
    }
    field(:general_refs, 448) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:military, 472) {
        compound(:Unit_TMilitary) {
            field(:squad_id, 0) {
                number 32, true, -1
            }
            def squad_tg ; df.world.squads.all.binsearch(squad_id) ; end
            field(:squad_position, 4) {
                number 32, true, -1
            }
            field(:patrol_cooldown, 8) {
                number 32, true
            }
            field(:patrol_timer, 12) {
                number 32, true
            }
            field(:cur_uniform, 16) {
                number 16, true
            }
            field(:unk_items, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def unk_items_tg ; unk_items.map { |i| df.world.items.all.binsearch(i) } ; end
            field(:uniforms, 48) {
                static_array(4, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
            field(:pickup_flags, 144) {
                compound(:Unit_TMilitary_TPickupFlags) {
                    field(:_whole, 0) {
                        number 32, true
                    }
                    field(:update, 0) { bit 0 }
                }
            }
            field(:uniform_pickup, 152) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def uniform_pickup_tg ; uniform_pickup.map { |i| df.world.items.all.binsearch(i) } ; end
            field(:uniform_drop, 176) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def uniform_drop_tg ; uniform_drop.map { |i| df.world.items.all.binsearch(i) } ; end
            field(:individual_drills, 200) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def individual_drills_tg ; individual_drills.map { |i| df.world.activities.all.binsearch(i) } ; end
        }
    }
    field(:social_activities, 696) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def social_activities_tg ; social_activities.map { |i| df.world.activities.all.binsearch(i) } ; end
    field(:conversations, 720) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def conversations_tg ; conversations.map { |i| df.world.activities.all.binsearch(i) } ; end
    field(:activities, 744) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def activities_tg ; activities.map { |i| df.world.activities.all.binsearch(i) } ; end
    field(:unk_1e8, 768) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:animal, 792) {
        compound(:Unit_TAnimal) {
            field(:population, 0) {
                global :WorldPopulationRef
            }
            field(:leave_countdown, 24) {
                number 32, true
            }
            field(:vanish_countdown, 28) {
                number 32, true
            }
        }
    }
    field(:opponent, 824) {
        compound(:Unit_TOpponent) {
            field(:unit_id, 0) {
                number 32, true, -1
            }
            def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
            field(:unit_pos, 4) {
                global :Coord
            }
            field(:unk_c, 12) {
                number 32, true
            }
        }
    }
    field(:mood, 840) {
        number 16, true, :None, MoodType
    }
    field(:unk_18e, 842) {
        number 16, true
    }
    field(:pregnancy_timer, 844) {
        number 32, false
    }
    field(:pregnancy_genes, 848) {
        pointer {
            global :UnitGenes
        }
    }
    field(:pregnancy_caste, 856) {
        number 16, true, -1
    }
    field(:pregnancy_spouse, 860) {
        number 32, true, -1
    }
    def pregnancy_spouse_tg ; df.world.history.figures.binsearch(pregnancy_spouse) ; end
    field(:mood_copy, 864) {
        number 16, true, :None, MoodType
    }
    field(:ghost_info, 872) {
        pointer {
            global :UnitGhostInfo
        }
    }
    field(:unk_9, 880) {
        number 32, true, -1
    }
    field(:birth_year, 884) {
        number 32, true, -1
    }
    field(:birth_time, 888) {
        number 32, true, -1
    }
    field(:curse_year, 892) {
        number 32, true, -1
    }
    field(:curse_time, 896) {
        number 32, true, -1
    }
    field(:birth_year_bias, 900) {
        number 32, true
    }
    field(:birth_time_bias, 904) {
        number 32, true
    }
    field(:old_year, 908) {
        number 32, true, -1
    }
    field(:old_time, 912) {
        number 32, true, -1
    }
    field(:following, 920) {
        pointer {
            global :Unit
        }
    }
    field(:unk_238, 928) {
        number 16, false
    }
    field(:relationship_ids, 932) {
        static_array(10, 4, UnitRelationshipType) {
            number 32, true
        }
    }
    field(:mount_type, 972) {
        number 16, true
    }
    field(:last_hit, 976) {
        global :HistoryHitItem
    }
    field(:riding_item_id, 1008) {
        number 32, true, -1
    }
    def riding_item_tg ; df.world.items.all.binsearch(riding_item_id) ; end
    field(:inventory, 1016) {
        stl_vector(8) {
            pointer {
                global :UnitInventoryItem
            }
        }
    }
    field(:owned_items, 1040) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def owned_items_tg ; owned_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:traded_items, 1064) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def traded_items_tg ; traded_items.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:owned_buildings, 1088) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:corpse_parts, 1112) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def corpse_parts_tg ; corpse_parts.map { |i| df.world.items.all.binsearch(i) } ; end
    field(:job, 1136) {
        compound(:Unit_TJob) {
            field(:account, 0) {
                number 32, true
            }
            field(:satisfaction, 4) {
                number 32, true
            }
            field(:hunt_target, 8) {
                pointer {
                    global :Unit
                }
            }
            field(:unk_v4305_1, 16) {
                number 32, true
            }
            field(:destroy_target, 24) {
                pointer {
                    global :Building
                }
            }
            field(:unk_v40_1, 32) {
                number 32, true
            }
            field(:unk_v40_2, 36) {
                number 32, true
            }
            field(:unk_v40_3, 40) {
                number 32, true
            }
            field(:unk_v40_4, 44) {
                number 32, true
            }
            field(:unk_v40_5, 48) {
                number 8, true
            }
            field(:gait_buildup, 52) {
                number 32, true
            }
            field(:climb_hold, 56) {
                global :Coord
            }
            field(:unk_v4014_1, 64) {
                number 32, true, -1
            }
            field(:current_job, 72) {
                pointer {
                    global :Job
                }
            }
            field(:mood_skill, 80) {
                number 16, true, nil, JobSkill
            }
            field(:mood_timeout, 84) {
                number 32, true
            }
            field(:unk_39c, 88) {
                number 32, true
            }
        }
    }
    field(:body, 1232) {
        compound(:Unit_TBody) {
            field(:components, 0) {
                global :BodyComponentInfo
            }
            field(:wounds, 192) {
                stl_vector(8) {
                    pointer {
                        global :UnitWound
                    }
                }
            }
            field(:wound_next_id, 216) {
                number 32, true, 1
            }
            field(:unk_39c, 220) {
                static_array(10, 4) {
                    number 32, true, -1
                }
            }
            field(:body_plan, 264) {
                pointer {
                    global :CasteBodyInfo
                }
            }
            field(:weapon_bp, 272) {
                number 16, true, -1
            }
            field(:physical_attrs, 276) {
                static_array(6, 28, PhysicalAttributeType) {
                    global :UnitAttribute
                }
            }
            field(:size_info, 444) {
                global :BodySizeInfo
            }
            field(:blood_max, 468) {
                number 32, false
            }
            field(:blood_count, 472) {
                number 32, false
            }
            field(:infection_level, 476) {
                number 32, true
            }
            field(:spatters, 480) {
                stl_vector(8) {
                    pointer {
                        global :Spatter
                    }
                }
            }
        }
    }
    field(:appearance, 1736) {
        compound(:Unit_TAppearance) {
            field(:body_modifiers, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:bp_modifiers, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:size_modifier, 48) {
                number 32, true
            }
            field(:tissue_style, 56) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:tissue_style_civ_id, 80) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def tissue_style_civ_tg ; tissue_style_civ_id.map { |i| df.world.entities.all.binsearch(i) } ; end
            field(:tissue_style_id, 104) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            field(:tissue_style_type, 128) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            field(:tissue_length, 152) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:genes, 176) {
                global :UnitGenes
            }
            field(:colors, 208) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:actions, 1968) {
        stl_vector(8) {
            pointer {
                global :UnitAction
            }
        }
    }
    field(:next_action_id, 1992) {
        number 32, true
    }
    field(:counters, 1996) {
        compound(:Unit_TCounters) {
            field(:think_counter, 0) {
                number 32, true
            }
            field(:job_counter, 4) {
                number 32, true
            }
            field(:swap_counter, 8) {
                number 32, true
            }
            field(:death_cause, 12) {
                number 16, true, nil, DeathType
            }
            field(:death_id, 16) {
                number 32, true, -1
            }
            def death_tg ; df.world.incidents.all.binsearch(death_id) ; end
            field(:winded, 20) {
                number 16, true
            }
            field(:stunned, 22) {
                number 16, true
            }
            field(:unconscious, 24) {
                number 16, true
            }
            field(:suffocation, 26) {
                number 16, true
            }
            field(:webbed, 28) {
                number 16, true
            }
            field(:guts_trail1, 30) {
                global :Coord
            }
            field(:guts_trail2, 36) {
                global :Coord
            }
            field(:soldier_mood_countdown, 42) {
                number 16, true, 300
            }
            field(:soldier_mood, 44) {
                class ::DFHack::Unit_TCounters_TSoldierMood < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[-1] = :None ; NUME[:None] = -1
                    ENUM[0] = :MartialTrance ; NUME[:MartialTrance] = 0
                    ENUM[1] = :Enraged ; NUME[:Enraged] = 1
                    ENUM[2] = :Tantrum ; NUME[:Tantrum] = 2
                    ENUM[3] = :Depressed ; NUME[:Depressed] = 3
                    ENUM[4] = :Oblivious ; NUME[:Oblivious] = 4
                end

                number 16, true, :None, Unit_TCounters_TSoldierMood
            }
            field(:pain, 48) {
                number 32, false
            }
            field(:nausea, 52) {
                number 32, false
            }
            field(:dizziness, 56) {
                number 32, false
            }
        }
    }
    field(:curse, 2056) {
        compound(:Unit_TCurse) {
            field(:unk_0, 0) {
                number 32, true
            }
            field(:add_tags1, 4) {
                global :CieAddTagMask1
            }
            field(:rem_tags1, 8) {
                global :CieAddTagMask1
            }
            field(:add_tags2, 12) {
                global :CieAddTagMask2
            }
            field(:rem_tags2, 16) {
                global :CieAddTagMask2
            }
            field(:name_visible, 20) {
                number 8, true, nil, BooleanEnum
            }
            field(:name, 24) {
                stl_string
            }
            field(:name_plural, 56) {
                stl_string
            }
            field(:name_adjective, 88) {
                stl_string
            }
            field(:sym_and_color1, 120) {
                number 32, false, 0x400
            }
            field(:sym_and_color2, 124) {
                number 32, false, 0x400
            }
            field(:flash_period, 128) {
                number 32, false
            }
            field(:flash_time2, 132) {
                number 32, false
            }
            field(:body_appearance, 136) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:bp_appearance, 160) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:speed_add, 184) {
                number 32, false
            }
            field(:speed_mul_percent, 188) {
                number 32, false, 100
            }
            field(:attr_change, 192) {
                pointer {
                    global :CurseAttrChange
                }
            }
            field(:luck_mul_percent, 200) {
                number 32, false, 100
            }
            field(:unk_98, 204) {
                number 32, true
            }
            field(:interaction_id, 208) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def interaction_tg ; interaction_id.map { |i| df.world.raws.effects.all[i] } ; end
            field(:interaction_time, 232) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:interaction_delay, 256) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:time_on_site, 280) {
                number 32, true
            }
            field(:own_interaction, 288) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            field(:own_interaction_delay, 312) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:counters2, 2392) {
        compound(:Unit_TCounters2) {
            field(:paralysis, 0) {
                number 32, false
            }
            field(:numbness, 4) {
                number 32, false
            }
            field(:fever, 8) {
                number 32, false
            }
            field(:exhaustion, 12) {
                number 32, false
            }
            field(:hunger_timer, 16) {
                number 32, false
            }
            field(:thirst_timer, 20) {
                number 32, false
            }
            field(:sleepiness_timer, 24) {
                number 32, false
            }
            field(:stomach_content, 28) {
                number 32, false
            }
            field(:stomach_food, 32) {
                number 32, false
            }
            field(:vomit_timeout, 36) {
                number 32, false
            }
            field(:stored_fat, 40) {
                number 32, false
            }
        }
    }
    field(:status, 2440) {
        compound(:Unit_TStatus) {
            field(:misc_traits, 0) {
                stl_vector(8) {
                    pointer {
                        global :UnitMiscTrait
                    }
                }
            }
            field(:eat_history, 24) {
                pointer {
                    compound(:Unit_TStatus_TEatHistory) {
                        sizeof 288

                        field(:food, 0) {
                            compound(:Unit_TStatus_TEatHistory_TFood) {
                                field(:item_type, 0) {
                                    stl_vector(2) {
                                        number 16, true, nil, ItemType
                                    }
                                }
                                field(:item_subtype, 24) {
                                    stl_vector(2) {
                                        number 16, true
                                    }
                                }
                                field(:material, 48) {
                                    global :MaterialVecRef
                                }
                                field(:year, 96) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:year_time, 120) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                        field(:drink, 144) {
                            compound(:Unit_TStatus_TEatHistory_TDrink) {
                                field(:item_type, 0) {
                                    stl_vector(2) {
                                        number 16, true, nil, ItemType
                                    }
                                }
                                field(:item_subtype, 24) {
                                    stl_vector(2) {
                                        number 16, true
                                    }
                                }
                                field(:material, 48) {
                                    global :MaterialVecRef
                                }
                                field(:year, 96) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:year_time, 120) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                }
            }
            field(:demand_timeout, 32) {
                number 32, true, 1000
            }
            field(:mandate_timeout, 36) {
                number 32, true, 1000
            }
            field(:attacker_ids, 40) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def attacker_tgs ; attacker_ids.map { |i| df.world.units.all.binsearch(i) } ; end
            field(:attacker_cntdn, 64) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:face_direction, 88) {
                number 8, false
            }
            field(:artifact_name, 96) {
                global :LanguageName
            }
            field(:souls, 216) {
                stl_vector(8) {
                    pointer {
                        global :UnitSoul
                    }
                }
            }
            field(:current_soul, 240) {
                pointer {
                    global :UnitSoul
                }
            }
            field(:demands, 248) {
                stl_vector(8) {
                    pointer {
                        global :UnitDemand
                    }
                }
            }
            field(:labors, 272) {
                static_array(94, 1, UnitLabor) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:wrestle_items, 368) {
                stl_vector(8) {
                    pointer {
                        global :UnitItemWrestle
                    }
                }
            }
            field(:observed_traps, 392) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def observed_traps_tg ; observed_traps.map { |i| df.world.buildings.all.binsearch(i) } ; end
            field(:complaints, 416) {
                stl_vector(8) {
                    pointer {
                        global :UnitComplaint
                    }
                }
            }
            field(:unk_138, 440) {
                stl_vector(8) {
                    pointer {
                        global :UnitUnk138
                    }
                }
            }
            field(:requests, 464) {
                stl_vector(8) {
                    pointer {
                        global :UnitRequest
                    }
                }
            }
            field(:coin_debts, 488) {
                stl_vector(8) {
                    pointer {
                        global :UnitCoinDebt
                    }
                }
            }
            field(:unk_1, 512) {
                stl_vector(8) {
                    pointer {
                        compound(:Unit_TStatus_TUnk1) {
                            sizeof 24

                            field(:unk_1, 0) {
                                number 32, true
                            }
                            field(:unk_2, 4) {
                                number 32, true
                            }
                            field(:unk_3, 8) {
                                number 32, true
                            }
                            field(:unk_4, 12) {
                                number 32, true
                            }
                            field(:unk_5, 16) {
                                number 16, true
                            }
                            field(:unk_6, 18) {
                                number 16, true
                            }
                            field(:unk_7, 20) {
                                number 16, true
                            }
                        }
                    }
                }
            }
            field(:unk_2, 536) {
                number 32, true
            }
            field(:unk_3, 540) {
                number 32, true
            }
            field(:unk_4, 544) {
                static_array(5, 4, GaitType) {
                    number 32, true
                }
            }
            field(:unk_5, 564) {
                number 32, true
            }
            field(:adv_sleep_timer, 568) {
                number 16, true
            }
            field(:recent_job_area, 570) {
                global :Coord
            }
            field(:recent_jobs, 576) {
                global :CoordPath
            }
        }
    }
    field(:hist_figure_id, 3088) {
        number 32, true, -1
    }
    def hist_figure_tg ; df.world.history.figures.binsearch(hist_figure_id) ; end
    field(:hist_figure_id2, 3092) {
        number 32, true, -1
    }
    def hist_figure_tg2 ; df.world.history.figures.binsearch(hist_figure_id2) ; end
    field(:status2, 3096) {
        compound(:Unit_TStatus2) {
            field(:limbs_stand_max, 0) {
                number 16, true
            }
            field(:limbs_stand_count, 2) {
                number 16, true
            }
            field(:limbs_grasp_max, 4) {
                number 16, true
            }
            field(:limbs_grasp_count, 6) {
                number 16, true
            }
            field(:limbs_fly_max, 8) {
                number 16, true
            }
            field(:limbs_fly_count, 10) {
                number 16, true
            }
            field(:body_part_temperature, 16) {
                stl_vector(8) {
                    pointer {
                        global :Temperaturest
                    }
                }
            }
            field(:add_path_flags, 40) {
                number 32, false
            }
            field(:liquid_type, 44) {
                global :TileDesignation
            }
            field(:liquid_depth, 48) {
                number 8, false
            }
            field(:histeventcol_id, 52) {
                number 32, true, -1
            }
            def histeventcol_tg ; df.world.history.event_collections.all.binsearch(histeventcol_id) ; end
        }
    }
    field(:unknown7, 3152) {
        compound(:Unit_TUnknown7) {
            field(:unk_7c4, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_c, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:syndromes, 3200) {
        compound(:Unit_TSyndromes) {
            field(:active, 0) {
                stl_vector(8) {
                    pointer {
                        global :UnitSyndrome
                    }
                }
            }
            field(:reinfection_type, 24) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def reinfection_type_tg ; reinfection_type.map { |i| df.world.raws.syndromes.all[i] } ; end
            field(:reinfection_count, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:reports, 3272) {
        compound(:Unit_TReports) {
            field(:log, 0) {
                static_array(3, 24, UnitReportType) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
            field(:last_year, 72) {
                static_array(3, 4, UnitReportType) {
                    number 32, true
                }
            }
            field(:last_year_tick, 84) {
                static_array(3, 4, UnitReportType) {
                    number 32, true
                }
            }
        }
    }
    field(:health, 3368) {
        pointer {
            global :UnitHealthInfo
        }
    }
    field(:used_items, 3376) {
        stl_vector(8) {
            pointer {
                global :UnitItemUse
            }
        }
    }
    field(:enemy, 3400) {
        compound(:Unit_TEnemy) {
            field(:sound_cooldown, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:undead, 24) {
                pointer {
                    compound(:Unit_TEnemy_TUndead) {
                        sizeof 72

                        field(:unk_1, 0) {
                            number 32, true
                        }
                        field(:unk_2, 4) {
                            number 32, true
                        }
                        field(:unk_3, 8) {
                            number 32, true, -1
                        }
                        field(:unk_4, 12) {
                            number 32, true, -1
                        }
                        field(:unk_5, 16) {
                            number 32, true
                        }
                        field(:unk_6, 20) {
                            number 32, true
                        }
                        field(:root_body_part_id, 24) {
                            number 16, true
                        }
                        field(:undead_name, 32) {
                            stl_string
                        }
                        field(:unk_v43_1, 64) {
                            number 32, true
                        }
                        field(:unk_v43_2, 68) {
                            number 32, true
                        }
                    }
                }
            }
            field(:were_race, 32) {
                number 32, true, -1
            }
            def were_race_tg ; df.world.raws.creatures.all[were_race] ; end
            field(:were_caste, 36) {
                number 32, true, -1
            }
            def were_caste_tg ; df.world.raws.creatures.all[were_race].caste[were_caste] ; end
            field(:normal_race, 40) {
                number 32, true, -1
            }
            def normal_race_tg ; df.world.raws.creatures.all[normal_race] ; end
            field(:normal_caste, 44) {
                number 32, true, -1
            }
            def normal_caste_tg ; df.world.raws.creatures.all[normal_race].caste[normal_caste] ; end
            field(:interaction, 48) {
                number 32, true, -1
            }
            field(:appearances, 56) {
                stl_vector(8) {
                    pointer {
                        global :UnitAppearance
                    }
                }
            }
            field(:witness_reports, 80) {
                stl_vector(8) {
                    pointer {
                        global :WitnessReport
                    }
                }
            }
            field(:unk_a5c, 104) {
                stl_vector(8) {
                    pointer {
                        global :EntityEvent
                    }
                }
            }
            field(:gait_index, 128) {
                static_array(5, 4, GaitType) {
                    number 32, true
                }
            }
            field(:unk_unit_id_1, 148) {
                static_array(10, 4) {
                    number 32, true, -1
                }
            }
            def unk_unit_tg_1 ; df.world.units.all.binsearch(unk_unit_id_1) ; end
            field(:unk_v40_1b, 188) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:unk_v40_1c, 228) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:unk_v40_1d, 268) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:unk_v40_1e, 308) {
                static_array(10, 4) {
                    number 32, true
                }
            }
            field(:unk_unit_id_2, 348) {
                static_array(200, 4) {
                    number 32, true, -1
                }
            }
            def unk_unit_tg_2 ; df.world.units.all.binsearch(unk_unit_id_2) ; end
            field(:unk_unit_id_2_count, 1148) {
                number 32, true
            }
            field(:unk_448, 1152) {
                pointer {
                    compound(:Unit_TEnemy_TUnk448) {
                        sizeof 52

                        field(:unk_1, 0) {
                            number 32, true
                        }
                        field(:unk_2, 4) {
                            number 32, true
                        }
                        field(:unk_3, 8) {
                            number 32, true
                        }
                        field(:unk, 12) {
                            compound(:Unit_TEnemy_TUnk448_TUnk) {
                                field(:unk_1, 0) {
                                    number 32, true
                                }
                                field(:unk_2, 4) {
                                    number 32, true
                                }
                                field(:unk_3, 8) {
                                    number 32, true
                                }
                                field(:unk_4, 12) {
                                    number 32, true
                                }
                                field(:unk_5, 16) {
                                    number 32, true
                                }
                                field(:unk_6, 20) {
                                    number 32, true
                                }
                                field(:unk_7, 24) {
                                    number 32, true
                                }
                                field(:unk_8, 28) {
                                    number 32, true
                                }
                                field(:unk_9, 32) {
                                    number 32, true
                                }
                                field(:unk_10, 36) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
            field(:unk_44c, 1160) {
                pointer {
                    compound(:Unit_TEnemy_TUnk44c) {
                        sizeof 196

                        field(:unk_1, 0) {
                            number 32, true
                        }
                        field(:unk_2, 4) {
                            number 32, true
                        }
                        field(:unk_3, 8) {
                            number 16, true
                        }
                        field(:unk_4, 12) {
                            number 32, true
                        }
                        field(:unk_5, 16) {
                            number 32, true
                        }
                        field(:unk_6, 20) {
                            number 32, true
                        }
                        field(:unk_7, 24) {
                            static_array(20, 4) {
                                number 32, true
                            }
                        }
                        field(:unk_8, 104) {
                            static_array(20, 4) {
                                number 32, true
                            }
                        }
                        field(:unk_9, 184) {
                            number 16, true
                        }
                        field(:unk_10, 186) {
                            number 16, true
                        }
                        field(:unk_11, 188) {
                            number 32, true
                        }
                        field(:unk_12, 192) {
                            number 32, true
                        }
                    }
                }
            }
            field(:unk_450, 1168) {
                number 32, true
            }
            field(:unk_454, 1172) {
                number 32, true
            }
            field(:army_controller_id, 1176) {
                number 32, true, -1
            }
            def army_controller_tg ; df.world.army_controllers.all.binsearch(army_controller_id) ; end
            field(:unk_v40_sub3, 1184) {
                compound(:Unit_TEnemy_TUnkV40Sub3) {
                    field(:controller, 0) {
                        pointer {
                            global :ArmyController
                        }
                    }
                    field(:unk_2, 8) {
                        pointer {
                            compound(:Unit_TEnemy_TUnkV40Sub3_TUnk2) {
                                sizeof 96

                                field(:unk_1, 0) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_2, 24) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_3, 48) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_4, 72) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_3, 16) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_4, 40) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_5, 64) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_6, 88) {
                        pointer {
                            compound(:Unit_TEnemy_TUnkV40Sub3_TUnk6) {
                                sizeof 48

                                field(:unk_0, 0) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                                field(:unk_10, 24) {
                                    stl_vector(4) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_7, 96) {
                        pointer {
                            compound(:Unit_TEnemy_TUnkV40Sub3_TUnk7) {
                                sizeof 56

                                field(:unk_sub1, 0) {
                                    stl_vector(8) {
                                        pointer {
                                            compound(:Unit_TEnemy_TUnkV40Sub3_TUnk7_TUnkSub1) {
                                                sizeof 36

                                                field(:unk_sub1_1, 0) {
                                                    number 32, true
                                                }
                                                field(:unk_sub1_2, 4) {
                                                    number 32, true
                                                }
                                                field(:unk_sub1_3, 8) {
                                                    number 32, true
                                                }
                                                field(:remaining, 12) {
                                                    number 32, true, -1
                                                }
                                                field(:year, 16) {
                                                    number 32, true
                                                }
                                                field(:year_tick, 20) {
                                                    number 32, true
                                                }
                                                field(:flags, 24) {
                                                    compound(:Unit_TEnemy_TUnkV40Sub3_TUnk7_TUnkSub1_TFlags) {
                                                        field(:_whole, 0) {
                                                            number 32, true
                                                        }
                                                    }
                                                }
                                                field(:unk_sub1_8, 28) {
                                                    number 32, true
                                                }
                                                field(:unk_sub1_9, 32) {
                                                    number 32, true
                                                }
                                            }
                                        }
                                    }
                                }
                                field(:unk_1, 24) {
                                    compound(:Unit_TEnemy_TUnkV40Sub3_TUnk7_TUnk1) {
                                        field(:_whole, 0) {
                                            number 32, true
                                        }
                                    }
                                }
                                field(:year, 28) {
                                    number 32, true
                                }
                                field(:year_tick, 32) {
                                    number 32, true
                                }
                                field(:unk_4, 36) {
                                    number 32, true
                                }
                                field(:unk_5, 40) {
                                    number 32, true
                                }
                                field(:unk_6, 44) {
                                    number 32, true
                                }
                                field(:unk_7, 48) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
            field(:combat_side_id, 1288) {
                number 32, true, -1
            }
            field(:caste_flags, 1296) {
                df_flagarray(CasteRawFlags)
            }
            field(:enemy_status_slot, 1312) {
                number 32, true, -1
            }
            def enemy_status_slot_tg ; df.world.enemy_status_cache.rel_map[enemy_status_slot] ; end
            field(:unk_874_cntr, 1316) {
                number 32, true
            }
            field(:body_part_878, 1320) {
                stl_vector(1) {
                    number 8, false
                }
            }
            field(:body_part_888, 1344) {
                stl_vector(1) {
                    number 8, false
                }
            }
            field(:body_part_relsize, 1368) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:body_part_8a8, 1392) {
                stl_vector(1) {
                    number 8, false
                }
            }
            field(:body_part_base_ins, 1416) {
                stl_vector(2) {
                    number 16, false
                }
            }
            field(:body_part_clothing_ins, 1440) {
                stl_vector(2) {
                    number 16, false
                }
            }
            field(:body_part_8d8, 1464) {
                stl_vector(2) {
                    number 16, false
                }
            }
            field(:unk_8e8, 1488) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_8f8, 1512) {
                stl_vector(2) {
                    number 16, false
                }
            }
        }
    }
    field(:healing_rate, 4936) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:effective_rate, 4960) {
        number 32, true, -1
    }
    field(:tendons_heal, 4964) {
        number 32, true
    }
    field(:ligaments_heal, 4968) {
        number 32, true
    }
    field(:weight, 4972) {
        number 32, true
    }
    field(:weight_fraction, 4976) {
        number 32, true
    }
    field(:burrows, 4984) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def burrows_tg ; burrows.map { |i| df.ui.burrows.list.binsearch(i) } ; end
    field(:vision_cone, 5008) {
        pointer {
            static_array(21, 21) {
                static_array(21, 1) {
                    number 8, true
                }
            }
        }
    }
    field(:occupations, 5016) {
        stl_vector(8) {
            pointer {
                global :Occupation
            }
        }
    }
    field(:adjective, 5040) {
        stl_string
    }
    def getCreatureTile()
        val = DFHack.vmethod_call(self, 0)
        val & ((1 << 8) - 1)
    end
    def getCorpseTile()
        val = DFHack.vmethod_call(self, 8)
        val & ((1 << 8) - 1)
    end
    def getGlowTile()
        val = DFHack.vmethod_call(self, 16)
        val & ((1 << 8) - 1)
    end
end

class UnitAction < MemHack::Compound
    sizeof 104

    field(:type, 0) {
        number 32, true, :None, UnitActionType
    }
    field(:id, 4) {
        number 32, true, -1
    }
    field(:data, 8) {
        compound(:UnitAction_TData) {
            field(:raw_data, 0) {
                static_array(24, 4) {
                    number 32, true
                }
            }
            field(:move, 0) {
                global :UnitActionDataMove
            }
            field(:attack, 0) {
                global :UnitActionDataAttack
            }
            field(:jump, 0) {
                global :UnitActionDataJump
            }
            field(:holdterrain, 0) {
                global :UnitActionDataHoldTerrain
            }
            field(:releaseterrain, 0) {
                global :UnitActionDataReleaseTerrain
            }
            field(:climb, 0) {
                global :UnitActionDataClimb
            }
            field(:job, 0) {
                global :UnitActionDataJob
            }
            field(:talk, 0) {
                global :UnitActionDataTalk
            }
            field(:unsteady, 0) {
                global :UnitActionDataUnsteady
            }
            field(:parry, 0) {
                global :UnitActionDataParry
            }
            field(:block, 0) {
                global :UnitActionDataBlock
            }
            field(:dodge, 0) {
                global :UnitActionDataDodge
            }
            field(:recover, 0) {
                global :UnitActionDataRecover
            }
            field(:standup, 0) {
                global :UnitActionDataStandUp
            }
            field(:liedown, 0) {
                global :UnitActionDataLieDown
            }
            field(:job2, 0) {
                global :UnitActionDataJob2
            }
            field(:pushobject, 0) {
                global :UnitActionDataPushObject
            }
            field(:suckblood, 0) {
                global :UnitActionDataSuckBlood
            }
            field(:holditem, 0) {
                global :UnitActionDataHoldItem
            }
            field(:releaseitem, 0) {
                global :UnitActionDataReleaseItem
            }
            field(:unk20, 0) {
                global :UnitActionDataUnkSub20
            }
            field(:unk21, 0) {
                global :UnitActionDataUnkSub21
            }
            field(:unk22, 0) {
                global :UnitActionDataUnkSub22
            }
            field(:unk23, 0) {
                global :UnitActionDataUnkSub23
            }
        }
    }
end

class UnitActionDataAttack < MemHack::Compound
    sizeof 72

    field(:target_unit_id, 0) {
        number 32, true, -1
    }
    def target_unit_tg ; df.world.units.all.binsearch(target_unit_id) ; end
    field(:unk_4, 4) {
        compound(:UnitActionDataAttack_TUnk4) {
            field(:wrestle_type, 0) {
                class ::DFHack::UnitActionDataAttack_TUnk4_TWrestleType < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Wrestle ; NUME[:Wrestle] = 0
                    ENUM[1] = :Grab ; NUME[:Grab] = 1
                end

                number 32, true, nil, UnitActionDataAttack_TUnk4_TWrestleType
            }
            field(:unk_4, 4) {
                number 16, true
            }
            field(:unk_6, 6) {
                number 16, true
            }
            field(:unk_8, 8) {
                number 32, true
            }
            field(:unk_c, 12) {
                number 32, true
            }
            field(:unk_10, 16) {
                number 32, true
            }
            field(:unk_14, 20) {
                number 16, true
            }
        }
    }
    field(:attack_item_id, 28) {
        number 32, true, -1
    }
    def attack_item_tg ; df.world.items.all.binsearch(attack_item_id) ; end
    field(:target_body_part_id, 32) {
        number 16, true
    }
    field(:attack_body_part_id, 34) {
        number 16, true
    }
    field(:attack_id, 36) {
        number 32, true
    }
    field(:unk_28, 40) {
        number 32, true
    }
    field(:unk_2c, 44) {
        number 32, true
    }
    field(:attack_velocity, 48) {
        number 32, true
    }
    field(:flags, 52) {
        compound(:UnitActionDataAttack_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:quick, 0) { bit 5 }
            field(:heavy, 0) { bit 6 }
            field(:wild, 0) { bit 7 }
            field(:precise, 0) { bit 8 }
            field(:charge, 0) { bit 9 }
            field(:lightly_tap, 0) { bit 12 }
            field(:spar_report, 0) { bit 15 }
        }
    }
    field(:attack_skill, 56) {
        number 16, true, nil, JobSkill
    }
    field(:attack_accuracy, 60) {
        number 32, true
    }
    field(:timer1, 64) {
        number 32, true
    }
    field(:timer2, 68) {
        number 32, true
    }
end

class UnitActionDataBlock < MemHack::Compound
    sizeof 12

    field(:unit_id, 0) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:target_action, 4) {
        number 32, true, -1
    }
    field(:block_item_id, 8) {
        number 32, true, -1
    }
    def block_item_tg ; df.world.items.all.binsearch(block_item_id) ; end
end

class UnitActionDataClimb < MemHack::Compound
    sizeof 32

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:x2, 6) {
        number 16, true
    }
    field(:y2, 8) {
        number 16, true
    }
    field(:z2, 10) {
        number 16, true
    }
    field(:x3, 12) {
        number 16, true
    }
    field(:y3, 14) {
        number 16, true
    }
    field(:z3, 16) {
        number 16, true
    }
    field(:timer, 20) {
        number 32, true
    }
    field(:timer_init, 24) {
        number 32, true
    }
    field(:fatigue, 28) {
        number 32, true
    }
end

class UnitActionDataDodge < MemHack::Compound
    sizeof 20

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:timer, 8) {
        number 32, true
    }
    field(:x2, 12) {
        number 16, true
    }
    field(:y2, 14) {
        number 16, true
    }
    field(:z2, 16) {
        number 16, true
    }
end

class UnitActionDataHoldItem < MemHack::Compound
    sizeof 24

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:x2, 6) {
        number 16, true
    }
    field(:y2, 8) {
        number 16, true
    }
    field(:z2, 10) {
        number 16, true
    }
    field(:unk_c, 12) {
        number 32, true
    }
    field(:unk_10, 16) {
        number 32, true
    }
    field(:unk_14, 20) {
        number 32, true
    }
end

class UnitActionDataHoldTerrain < MemHack::Compound
    sizeof 28

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:x2, 6) {
        number 16, true
    }
    field(:y2, 8) {
        number 16, true
    }
    field(:z2, 10) {
        number 16, true
    }
    field(:x3, 12) {
        number 16, true
    }
    field(:y3, 14) {
        number 16, true
    }
    field(:z3, 16) {
        number 16, true
    }
    field(:timer, 20) {
        number 32, true
    }
    field(:fatigue, 24) {
        number 32, true
    }
end

class UnitActionDataJob < MemHack::Compound
    sizeof 12

    field(:x, 0) {
        number 16, true
    }
    field(:y, 2) {
        number 16, true
    }
    field(:z, 4) {
        number 16, true
    }
    field(:timer, 8) {
        number 32, true
    }
end

class UnitActionDataJob2 < MemHack::Compound
    sizeof 4

    field(:timer, 0) {
        number 32, true
    }
end

class UnitActionDataJump < MemHack::Compound
    sizeof 12

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:x2, 6) {
        number 16, true
    }
    field(:y2, 8) {
        number 16, true
    }
    field(:z2, 10) {
        number 16, true
    }
end

class UnitActionDataLieDown < MemHack::Compound
    sizeof 4

    field(:timer, 0) {
        number 32, true
    }
end

class UnitActionDataMove < MemHack::Compound
    sizeof 24

    field(:x, 0) {
        number 16, true
    }
    field(:y, 2) {
        number 16, true
    }
    field(:z, 4) {
        number 16, true
    }
    field(:timer, 8) {
        number 32, true
    }
    field(:timer_init, 12) {
        number 32, true
    }
    field(:fatigue, 16) {
        number 32, true
    }
    field(:flags, 20) {
        compound(:UnitActionDataMove_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:charge, 0) { bit 0 }
        }
    }
end

class UnitActionDataParry < MemHack::Compound
    sizeof 12

    field(:unit_id, 0) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:target_action, 4) {
        number 32, true, -1
    }
    field(:parry_item_id, 8) {
        number 32, true, -1
    }
    def parry_item_tg ; df.world.items.all.binsearch(parry_item_id) ; end
end

class UnitActionDataPushObject < MemHack::Compound
    sizeof 28

    field(:x1, 0) {
        number 16, true
    }
    field(:y1, 2) {
        number 16, true
    }
    field(:z1, 4) {
        number 16, true
    }
    field(:x2, 6) {
        number 16, true
    }
    field(:y2, 8) {
        number 16, true
    }
    field(:z2, 10) {
        number 16, true
    }
    field(:x3, 12) {
        number 16, true
    }
    field(:y3, 14) {
        number 16, true
    }
    field(:z3, 16) {
        number 16, true
    }
    field(:timer, 20) {
        number 32, true
    }
    field(:unk_18, 24) {
        number 32, true
    }
end

class UnitActionDataRecover < MemHack::Compound
    sizeof 8

    field(:timer, 0) {
        number 32, true
    }
    field(:unk_4, 4) {
        number 32, true
    }
end

class UnitActionDataReleaseItem < MemHack::Compound
    sizeof 4

    field(:unk_0, 0) {
        number 32, true
    }
end

class UnitActionDataReleaseTerrain < MemHack::Compound
    sizeof 6

    field(:x, 0) {
        number 16, true
    }
    field(:y, 2) {
        number 16, true
    }
    field(:z, 4) {
        number 16, true
    }
end

class UnitActionDataStandUp < MemHack::Compound
    sizeof 4

    field(:timer, 0) {
        number 32, true
    }
end

class UnitActionDataSuckBlood < MemHack::Compound
    sizeof 8

    field(:unit_id, 0) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:timer, 4) {
        number 32, true
    }
end

class UnitActionDataTalk < MemHack::Compound
    sizeof 88

    field(:unk_0, 0) {
        number 32, true
    }
    field(:activity_id, 4) {
        number 32, true, -1
    }
    def activity_tg ; df.world.activities.all.binsearch(activity_id) ; end
    field(:activity_event_idx, 8) {
        number 32, true, -1
    }
    field(:event, 12) {
        global :EntityEvent
    }
    field(:unk_34, 52) {
        number 32, true
    }
    field(:timer, 56) {
        number 32, true
    }
    field(:unk_3c, 60) {
        number 32, true
    }
    field(:unk_40, 64) {
        number 32, true
    }
    field(:unk_44, 68) {
        number 32, true
    }
    field(:unk_48, 72) {
        number 32, true
    }
    field(:unk_4c, 76) {
        number 32, true
    }
    field(:unk_50, 80) {
        number 32, true
    }
    field(:unk_54, 84) {
        number 32, true
    }
end

class UnitActionDataUnkSub20 < MemHack::Compound
    sizeof 28

    field(:unk_0, 0) {
        static_array(6, 2) {
            number 16, true
        }
    }
    field(:unk_1, 12) {
        static_array(4, 4) {
            number 32, true
        }
    }
end

class UnitActionDataUnkSub21 < MemHack::Compound
    sizeof 20

    field(:unk_0, 0) {
        static_array(6, 2) {
            number 16, true
        }
    }
    field(:unk_1, 12) {
        static_array(2, 4) {
            number 32, true
        }
    }
end

class UnitActionDataUnkSub22 < MemHack::Compound
    sizeof 4

    field(:unk_0, 0) {
        number 32, true
    }
end

class UnitActionDataUnkSub23 < MemHack::Compound
    sizeof 4

    field(:unk_0, 0) {
        number 32, true
    }
end

class UnitActionDataUnsteady < MemHack::Compound
    sizeof 4

    field(:timer, 0) {
        number 32, true
    }
end

class UnitAppearance < MemHack::Compound
    sizeof 424

    field(:unk_1, 0) {
        number 32, true
    }
    field(:caste_index, 4) {
        number 32, true, -1
    }
    def caste_index_tg ; df.world.raws.creatures.list_creature[caste_index] ; end
    field(:unk_3, 8) {
        number 16, true
    }
    field(:physical_attributes, 12) {
        static_array(6, 28, PhysicalAttributeType) {
            global :UnitAttribute
        }
    }
    field(:unk_5, 180) {
        number 32, true
    }
    field(:body_modifiers, 184) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:bp_modifiers, 208) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_8, 232) {
        number 32, true
    }
    field(:tissue_style, 240) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:tissue_style_civ_id, 264) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:tissue_style_id, 288) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:tissue_style_type, 312) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:tissue_length, 336) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:appearance_genes, 360) {
        df_array(1) {
            number 8, false
        }
    }
    field(:color_genes, 376) {
        df_array(2) {
            number 16, false
        }
    }
    field(:color_modifiers, 392) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_18, 416) {
        number 32, true
    }
    field(:unk_19, 420) {
        number 32, true
    }
end

class UnitAttribute < MemHack::Compound
    sizeof 28

    field(:value, 0) {
        number 32, true, 1000
    }
    field(:max_value, 4) {
        number 32, true, 2000
    }
    field(:improve_counter, 8) {
        number 32, true
    }
    field(:unused_counter, 12) {
        number 32, true
    }
    field(:soft_demotion, 16) {
        number 32, true
    }
    field(:rust_counter, 20) {
        number 32, true
    }
    field(:demotion_counter, 24) {
        number 32, true
    }
end

class UnitBpHealthFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:rq_immobilize, 0) { bit 0 }
    field(:rq_dressing, 0) { bit 1 }
    field(:rq_cleaning, 0) { bit 2 }
    field(:rq_surgery, 0) { bit 3 }
    field(:rq_suture, 0) { bit 4 }
    field(:rq_setting, 0) { bit 5 }
    field(:rq_traction, 0) { bit 6 }
    field(:inoperable_rot, 0) { bit 7 }
    field(:needs_bandage, 0) { bit 8 }
    field(:needs_cast, 0) { bit 9 }
end

class UnitChunk < MemHack::Compound
    sizeof 3208

    field(:id, 0) {
        number 32, true
    }
    field(:units, 8) {
        static_array(100, 32) {
            compound(:UnitChunk_TUnits) {
                field(:items, 0) {
                    stl_vector(8) {
                        pointer {
                            global :Item
                        }
                    }
                }
                field(:unit, 24) {
                    pointer {
                        global :Unit
                    }
                }
            }
        }
    }
end

class UnitCoinDebt < MemHack::Compound
    sizeof 8

    field(:recipient, 0) {
        number 32, true, -1
    }
    def recipient_tg ; df.world.units.all.binsearch(recipient) ; end
    field(:amount, 4) {
        number 32, true
    }
end

class UnitComplaint < MemHack::Compound
    sizeof 12

    field(:type, 0) {
        class ::DFHack::UnitComplaint_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[25] = :SelfUnemployed ; NUME[:SelfUnemployed] = 25
            ENUM[26] = :GuildUnemployed ; NUME[:GuildUnemployed] = 26
            ENUM[27] = :NeedWeapons ; NUME[:NeedWeapons] = 27
            ENUM[28] = :IsAngry ; NUME[:IsAngry] = 28
            ENUM[29] = :IsSad ; NUME[:IsSad] = 29
            ENUM[48] = :Petition ; NUME[:Petition] = 48
        end

        number 32, true, nil, UnitComplaint_TType
    }
    field(:guild, 4) {
        number 16, true, nil, GuildId
    }
    field(:age, 8) {
        number 32, true
    }
end

class UnitDanceSkill < MemHack::Compound
    sizeof 12

    field(:id, 0) {
        number 32, true, -1
    }
    field(:rating, 4) {
        number 32, true, nil, SkillRating
    }
    field(:experience, 8) {
        number 32, true
    }
end

class UnitDemand < MemHack::Compound
    sizeof 24

    field(:unk_0, 0) {
        number 16, true
    }
    field(:place, 2) {
        class ::DFHack::UnitDemand_TPlace < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Office ; NUME[:Office] = 0
            ENUM[1] = :Bedroom ; NUME[:Bedroom] = 1
            ENUM[2] = :DiningRoom ; NUME[:DiningRoom] = 2
            ENUM[3] = :Tomb ; NUME[:Tomb] = 3
        end

        number 16, true, nil, UnitDemand_TPlace
    }
    field(:item_type, 4) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 6) {
        number 16, true, -1
    }
    field(:mat_type, 8) {
        number 16, true, -1
    }
    field(:mat_index, 12) {
        number 32, true, -1
    }
    field(:timeout_counter, 16) {
        number 32, true
    }
    field(:timeout_limit, 20) {
        number 32, true
    }
end

class UnitEmotionMemory < MemHack::Compound
    sizeof 36

    field(:type, 0) {
        number 32, true, nil, EmotionType
    }
    field(:unk2, 4) {
        number 32, true
    }
    field(:strength, 8) {
        number 32, true
    }
    field(:thought, 12) {
        number 32, true, nil, UnitThoughtType
    }
    field(:subthought, 16) {
        number 32, true
    }
    field(:severity, 20) {
        number 32, true
    }
    field(:unk_1, 24) {
        number 32, true
    }
    field(:year, 28) {
        number 32, true
    }
    field(:year_tick, 32) {
        number 32, true
    }
end

class UnitFlags1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:move_state, 0) { bit 0 }
    field(:inactive, 0) { bit 1 }
    field(:has_mood, 0) { bit 2 }
    field(:had_mood, 0) { bit 3 }
    field(:marauder, 0) { bit 4 }
    field(:drowning, 0) { bit 5 }
    field(:merchant, 0) { bit 6 }
    field(:forest, 0) { bit 7 }
    field(:left, 0) { bit 8 }
    field(:rider, 0) { bit 9 }
    field(:incoming, 0) { bit 10 }
    field(:diplomat, 0) { bit 11 }
    field(:zombie, 0) { bit 12 }
    field(:skeleton, 0) { bit 13 }
    field(:can_swap, 0) { bit 14 }
    field(:on_ground, 0) { bit 15 }
    field(:projectile, 0) { bit 16 }
    field(:active_invader, 0) { bit 17 }
    field(:hidden_in_ambush, 0) { bit 18 }
    field(:invader_origin, 0) { bit 19 }
    field(:coward, 0) { bit 20 }
    field(:hidden_ambusher, 0) { bit 21 }
    field(:invades, 0) { bit 22 }
    field(:check_flows, 0) { bit 23 }
    field(:ridden, 0) { bit 24 }
    field(:caged, 0) { bit 25 }
    field(:tame, 0) { bit 26 }
    field(:chained, 0) { bit 27 }
    field(:royal_guard, 0) { bit 28 }
    field(:fortress_guard, 0) { bit 29 }
    field(:suppress_wield, 0) { bit 30 }
    field(:important_historical_figure, 0) { bit 31 }
end

class UnitFlags2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:swimming, 0) { bit 0 }
    field(:sparring, 0) { bit 1 }
    field(:no_notify, 0) { bit 2 }
    field(:unused, 0) { bit 3 }
    field(:calculated_nerves, 0) { bit 4 }
    field(:calculated_bodyparts, 0) { bit 5 }
    field(:important_historical_figure, 0) { bit 6 }
    field(:killed, 0) { bit 7 }
    field(:cleanup_1, 0) { bit 8 }
    field(:cleanup_2, 0) { bit 9 }
    field(:cleanup_3, 0) { bit 10 }
    field(:for_trade, 0) { bit 11 }
    field(:trade_resolved, 0) { bit 12 }
    field(:has_breaks, 0) { bit 13 }
    field(:gutted, 0) { bit 14 }
    field(:circulatory_spray, 0) { bit 15 }
    field(:locked_in_for_trading, 0) { bit 16 }
    field(:slaughter, 0) { bit 17 }
    field(:underworld, 0) { bit 18 }
    field(:resident, 0) { bit 19 }
    field(:cleanup_4, 0) { bit 20 }
    field(:calculated_insulation, 0) { bit 21 }
    field(:visitor_uninvited, 0) { bit 22 }
    field(:visitor, 0) { bit 23 }
    field(:calculated_inventory, 0) { bit 24 }
    field(:vision_good, 0) { bit 25 }
    field(:vision_damaged, 0) { bit 26 }
    field(:vision_missing, 0) { bit 27 }
    field(:breathing_good, 0) { bit 28 }
    field(:breathing_problem, 0) { bit 29 }
    field(:roaming_wilderness_population_source, 0) { bit 30 }
    field(:roaming_wilderness_population_source_not_a_map_feature, 0) { bit 31 }
end

class UnitFlags3 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:body_part_relsize_computed, 0) { bit 0 }
    field(:size_modifier_computed, 0) { bit 1 }
    field(:stuck_weapon_computed, 0) { bit 2 }
    field(:compute_health, 0) { bit 3 }
    field(:announce_titan, 0) { bit 4 }
    field(:unk5, 0) { bit 5 }
    field(:on_crutch, 0) { bit 6 }
    field(:weight_computed, 0) { bit 7 }
    field(:body_temp_in_range, 0) { bit 8 }
    field(:wait_until_reveal, 0) { bit 9 }
    field(:scuttle, 0) { bit 10 }
    field(:unk11, 0) { bit 11 }
    field(:ghostly, 0) { bit 12 }
    field(:unk13, 0) { bit 13 }
    field(:unk14, 0) { bit 14 }
    field(:unk15, 0) { bit 15 }
    field(:unk16, 0) { bit 16 }
    field(:no_meandering, 0) { bit 17 }
    field(:floundering, 0) { bit 18 }
    field(:exit_vehicle1, 0) { bit 19 }
    field(:exit_vehicle2, 0) { bit 20 }
    field(:dangerous_terrain, 0) { bit 21 }
    field(:adv_yield, 0) { bit 22 }
    field(:vision_cone_set, 0) { bit 23 }
    field(:unk24, 0) { bit 24 }
    field(:emotionally_overloaded, 0) { bit 25 }
    field(:unk26, 0) { bit 26 }
    field(:available_for_adoption, 0) { bit 27 }
    field(:gelded, 0) { bit 28 }
    field(:marked_for_gelding, 0) { bit 29 }
    field(:injury_thought, 0) { bit 30 }
    field(:unk31, 0) { bit 31 }
end

class UnitFlags4 < MemHack::Compound
    field(:_whole, 0) {
        number 32, false
    }
    field(:unk0, 0) { bit 0 }
    field(:unk1, 0) { bit 1 }
    field(:unk2, 0) { bit 2 }
    field(:unk3, 0) { bit 3 }
end

class UnitGenes < MemHack::Compound
    sizeof 32

    field(:appearance, 0) {
        df_array(1) {
            number 8, false
        }
    }
    field(:colors, 16) {
        df_array(2) {
            number 16, true
        }
    }
end

class UnitGhostInfo < MemHack::Compound
    sizeof 44

    field(:type, 0) {
        number 16, true, nil, GhostType
    }
    field(:type2, 2) {
        number 16, true, nil, GhostType
    }
    field(:goal, 4) {
        number 16, true, nil, GhostGoal
    }
    field(:target, 8) {
        compound(:UnitGhostInfo_TTarget) {
            field(:unit, 0) {
                number 32, true, -1
            }
            def unit_tg ; df.world.units.all.binsearch(unit) ; end
            field(:item, 0) {
                number 32, true, -1
            }
            def item_tg ; df.world.items.all.binsearch(item) ; end
            field(:building, 0) {
                number 32, true, -1
            }
            def building_tg ; df.world.buildings.all.binsearch(building) ; end
        }
    }
    field(:misplace_pos, 12) {
        global :Coord
    }
    field(:action_timer, 20) {
        number 32, true, 403200
    }
    field(:unk_18, 24) {
        number 32, true
    }
    field(:flags, 28) {
        compound(:UnitGhostInfo_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:announced, 0) { bit 0 }
            field(:was_at_rest, 0) { bit 1 }
        }
    }
    field(:death_x, 32) {
        number 32, true
    }
    field(:death_y, 36) {
        number 32, true
    }
    field(:death_z, 40) {
        number 32, true
    }
end

class UnitHealthFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:rq_diagnosis, 0) { bit 0 }
    field(:needs_recovery, 0) { bit 1 }
    field(:needs_healthcare, 0) { bit 2 }
    field(:rq_immobilize, 0) { bit 3 }
    field(:rq_dressing, 0) { bit 4 }
    field(:rq_cleaning, 0) { bit 5 }
    field(:rq_surgery, 0) { bit 6 }
    field(:rq_suture, 0) { bit 7 }
    field(:rq_setting, 0) { bit 8 }
    field(:rq_traction, 0) { bit 9 }
    field(:rq_crutch, 0) { bit 10 }
end

class UnitHealthInfo < MemHack::Compound
    sizeof 96

    field(:unit_id, 0) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
    field(:flags, 4) {
        global :UnitHealthFlags
    }
    field(:body_part_flags, 8) {
        stl_vector(4) {
            global :UnitBpHealthFlags
        }
    }
    field(:unk_18_cntdn, 32) {
        number 16, true
    }
    field(:immobilize_cntdn, 34) {
        number 16, true
    }
    field(:dressing_cntdn, 36) {
        number 16, true
    }
    field(:suture_cntdn, 38) {
        number 16, true
    }
    field(:crutch_cntdn, 40) {
        number 16, true
    }
    field(:op_history, 48) {
        stl_vector(8) {
            pointer {
                compound(:UnitHealthInfo_TOpHistory) {
                    sizeof 36

                    field(:job_type, 0) {
                        number 16, true, nil, JobType
                    }
                    field(:info, 4) {
                        compound(:UnitHealthInfo_TOpHistory_TInfo) {
                            field(:crutch, 0) {
                                compound(:UnitHealthInfo_TOpHistory_TInfo_TCrutch) {
                                    field(:item_type, 0) {
                                        number 32, true, -1
                                    }
                                    field(:item_subtype, 4) {
                                        number 32, true, -1
                                    }
                                    field(:mat_type, 8) {
                                        number 32, true, -1
                                    }
                                    field(:mat_index, 12) {
                                        number 32, true, -1
                                    }
                                    field(:item_id, 16) {
                                        number 32, true, -1
                                    }
                                    def item_tg ; df.world.items.all.binsearch(item_id) ; end
                                }
                            }
                            field(:bed_id, 0) {
                                number 32, true, -1
                            }
                            def bed_tg ; df.world.buildings.all.binsearch(bed_id) ; end
                            field(:bandage, 0) {
                                compound(:UnitHealthInfo_TOpHistory_TInfo_TBandage) {
                                    field(:mat_type, 0) {
                                        number 32, true, -1
                                    }
                                    field(:mat_index, 4) {
                                        number 32, true, -1
                                    }
                                    field(:body_part_id, 8) {
                                        number 32, true, -1
                                    }
                                    field(:item_id, 12) {
                                        number 32, true, -1
                                    }
                                    def item_tg ; df.world.items.all.binsearch(item_id) ; end
                                }
                            }
                            field(:surgery, 0) {
                                compound(:UnitHealthInfo_TOpHistory_TInfo_TSurgery) {
                                    field(:subtype, 0) {
                                        number 32, true, nil, JobSubtypeSurgery
                                    }
                                    field(:body_part_id, 4) {
                                        number 32, true, -1
                                    }
                                    field(:amputated_part_id, 8) {
                                        number 32, true, -1
                                    }
                                }
                            }
                        }
                    }
                    field(:year, 24) {
                        number 32, true
                    }
                    field(:year_time, 28) {
                        number 32, true
                    }
                    field(:doctor_id, 32) {
                        number 32, true, -1
                    }
                    def doctor_tg ; df.world.units.all.binsearch(doctor_id) ; end
                }
            }
        }
    }
    field(:unk_34, 72) {
        stl_vector
    }
end

class UnitInstrumentSkill < MemHack::Compound
    sizeof 12

    field(:id, 0) {
        number 32, true, -1
    }
    field(:rating, 4) {
        number 32, true, nil, SkillRating
    }
    field(:experience, 8) {
        number 32, true
    }
end

class UnitInventoryItem < MemHack::Compound
    sizeof 24

    field(:item, 0) {
        pointer {
            global :Item
        }
    }
    field(:mode, 8) {
        class ::DFHack::UnitInventoryItem_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Hauled ; NUME[:Hauled] = 0
            ENUM[1] = :Weapon ; NUME[:Weapon] = 1
            ENUM[2] = :Worn ; NUME[:Worn] = 2
            ENUM[3] = :Piercing ; NUME[:Piercing] = 3
            ENUM[4] = :Flask ; NUME[:Flask] = 4
            ENUM[5] = :WrappedAround ; NUME[:WrappedAround] = 5
            ENUM[6] = :StuckIn ; NUME[:StuckIn] = 6
            ENUM[7] = :InMouth ; NUME[:InMouth] = 7
            ENUM[8] = :Pet ; NUME[:Pet] = 8
            ENUM[9] = :SewnInto ; NUME[:SewnInto] = 9
            ENUM[10] = :Strapped ; NUME[:Strapped] = 10
        end

        number 16, true, nil, UnitInventoryItem_TMode
    }
    field(:body_part_id, 10) {
        number 16, true, -1
    }
    field(:pet_seed, 12) {
        number 32, true
    }
    field(:wound_id, 16) {
        number 32, true, -1
    }
end

class UnitItemUse < MemHack::Compound
    sizeof 16

    field(:id, 0) {
        number 32, true, -1
    }
    def id_tg ; df.world.items.all.binsearch(id) ; end
    field(:time_in_use, 4) {
        number 32, true
    }
    field(:has_grown_attached, 8) {
        number 32, true
    }
    field(:affection_level, 12) {
        number 32, true
    }
end

class UnitItemWrestle < MemHack::Compound
    sizeof 36

    field(:unit, 0) {
        number 32, true, -1
    }
    def unit_tg ; df.world.units.all.binsearch(unit) ; end
    field(:self_bp, 4) {
        number 32, true, -1
    }
    field(:other_bp, 8) {
        number 32, true, -1
    }
    field(:unk_c, 12) {
        number 32, true, -1
    }
    field(:unk_10, 16) {
        number 32, true, -1
    }
    field(:item1, 20) {
        number 32, true, -1
    }
    def item1_tg ; df.world.items.all.binsearch(item1) ; end
    field(:item2, 24) {
        number 32, true, -1
    }
    def item2_tg ; df.world.items.all.binsearch(item2) ; end
    field(:unk_1c, 28) {
        number 16, true
    }
    field(:unk_1e, 30) {
        number 8, true
    }
    field(:unk_20, 32) {
        number 32, true, -1
    }
end

class UnitMiscTrait < MemHack::Compound
    sizeof 8

    field(:id, 0) {
        number 16, true, nil, MiscTraitType
    }
    field(:value, 4) {
        number 32, true
    }
end

class UnitMusicalSkill < MemHack::Compound
    sizeof 12

    field(:id, 0) {
        number 32, true, -1
    }
    field(:rating, 4) {
        number 32, true, nil, SkillRating
    }
    field(:experience, 8) {
        number 32, true
    }
end

class UnitPersonality < MemHack::Compound
    sizeof 392

    field(:values, 0) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TValues) {
                    sizeof 8

                    field(:type, 0) {
                        number 32, true, nil, ValueType
                    }
                    field(:strength, 4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v40_2, 24) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TUnkV402) {
                    sizeof 4

                    field(:unk1, 0) {
                        number 16, true
                    }
                    field(:unk2, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:emotions, 48) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TEmotions) {
                    sizeof 40

                    field(:type, 0) {
                        number 32, true, nil, EmotionType
                    }
                    field(:unk2, 4) {
                        number 32, true
                    }
                    field(:strength, 8) {
                        number 32, true
                    }
                    field(:thought, 12) {
                        number 32, true, nil, UnitThoughtType
                    }
                    field(:subthought, 16) {
                        number 32, true
                    }
                    field(:severity, 20) {
                        number 32, true
                    }
                    field(:flags, 24) {
                        compound(:UnitPersonality_TEmotions_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                            field(:unk0, 0) { bit 0 }
                            field(:unk1, 0) { bit 1 }
                            field(:unk2, 0) { bit 2 }
                            field(:unk3, 0) { bit 3 }
                            field(:remembered_longterm, 0) { bit 4 }
                            field(:remembered_shortterm, 0) { bit 5 }
                            field(:remembered_reflected_on, 0) { bit 6 }
                        }
                    }
                    field(:unk7, 28) {
                        number 32, true
                    }
                    field(:year, 32) {
                        number 32, true
                    }
                    field(:year_tick, 36) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:dreams, 72) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TDreams) {
                    sizeof 48

                    field(:unk1, 0) {
                        number 32, true
                    }
                    field(:type, 4) {
                        number 32, true, nil, GoalType
                    }
                    field(:unk3, 8) {
                        number 32, true, -1
                    }
                    field(:unk4, 16) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:flags, 40) {
                        compound(:UnitPersonality_TDreams_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                            field(:accomplished, 0) { bit 0 }
                        }
                    }
                }
            }
        }
    }
    field(:next_dream_id, 96) {
        number 32, true
    }
    field(:unk_v40_6, 104) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TUnkV406) {
                    sizeof 24

                    field(:unk1, 0) {
                        number 32, true, -1
                    }
                    field(:unk2, 4) {
                        number 32, true, -1
                    }
                    field(:unk3, 8) {
                        number 32, true, -1
                    }
                    field(:unk4, 12) {
                        number 32, true, -1
                    }
                    field(:unk5, 16) {
                        number 32, true, -1
                    }
                    field(:unk6, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:traits, 128) {
        static_array(50, 2, PersonalityFacetType) {
            number 16, false
        }
    }
    field(:civ_id, 228) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:cultural_identity, 232) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity) ; end
    field(:unk5, 240) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TUnk5) {
                    sizeof 4

                    field(:unk1, 0) {
                        number 16, true
                    }
                    field(:unk2, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:unk6, 264) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:stress_level, 288) {
        number 32, true
    }
    field(:stress_drain, 292) {
        number 32, true
    }
    field(:stress_boost, 296) {
        number 32, true
    }
    field(:likes_outdoors, 300) {
        number 32, true
    }
    field(:combat_hardened, 304) {
        number 32, true
    }
    field(:unk_v4705_1, 308) {
        number 32, true
    }
    field(:needs, 312) {
        stl_vector(8) {
            pointer {
                compound(:UnitPersonality_TNeeds) {
                    sizeof 16

                    field(:id, 0) {
                        number 32, true, nil, NeedType
                    }
                    field(:deity_id, 4) {
                        number 32, true, -1
                    }
                    field(:focus_level, 8) {
                        number 32, true
                    }
                    field(:need_level, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:flags, 336) {
        compound(:UnitPersonality_TFlags) {
            field(:_whole, 0) {
                number 32, false
            }
            field(:has_unmet_needs, 0) { bit 1 }
        }
    }
    field(:temporary_trait_changes, 344) {
        pointer {
            static_array(50, 2, PersonalityFacetType) {
                number 16, true
            }
        }
    }
    field(:unk_v4201_3, 352) {
        number 32, true, -1
    }
    field(:unk_v4201_4, 356) {
        number 32, true, -1
    }
    field(:memories, 360) {
        pointer {
            compound(:UnitPersonality_TMemories) {
                sizeof 600

                field(:shortterm, 0) {
                    static_array(8, 36) {
                        global :UnitEmotionMemory
                    }
                }
                field(:longterm, 288) {
                    static_array(8, 36) {
                        global :UnitEmotionMemory
                    }
                }
                field(:reflected_on, 576) {
                    stl_vector(8) {
                        pointer {
                            compound(:UnitPersonality_TMemories_TReflectedOn) {
                                sizeof 60

                                field(:memory, 0) {
                                    global :UnitEmotionMemory
                                }
                                field(:changed_facet, 36) {
                                    number 32, true, :NONE, PersonalityFacetType
                                }
                                field(:unk_1, 40) {
                                    number 32, true
                                }
                                field(:unk_2, 44) {
                                    number 32, true
                                }
                                field(:changed_value, 48) {
                                    number 32, true, :NONE, ValueType
                                }
                                field(:unk_3, 52) {
                                    number 32, true
                                }
                                field(:unk_4, 56) {
                                    number 32, true
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    field(:unk_v47_1, 368) {
        number 32, true
    }
    field(:unk_v47_2, 372) {
        number 32, true
    }
    field(:unk_v47_3, 376) {
        number 32, true
    }
    field(:unk_v47_4, 380) {
        number 32, true
    }
    field(:current_focus, 384) {
        number 32, true
    }
    field(:undistracted_focus, 388) {
        number 32, true
    }
end

class UnitPoeticSkill < MemHack::Compound
    sizeof 12

    field(:id, 0) {
        number 32, true, -1
    }
    field(:rating, 4) {
        number 32, true, nil, SkillRating
    }
    field(:experience, 8) {
        number 32, true
    }
end

class UnitPreference < MemHack::Compound
    sizeof 28

    field(:type, 0) {
        class ::DFHack::UnitPreference_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :LikeMaterial ; NUME[:LikeMaterial] = 0
            ENUM[1] = :LikeCreature ; NUME[:LikeCreature] = 1
            ENUM[2] = :LikeFood ; NUME[:LikeFood] = 2
            ENUM[3] = :HateCreature ; NUME[:HateCreature] = 3
            ENUM[4] = :LikeItem ; NUME[:LikeItem] = 4
            ENUM[5] = :LikePlant ; NUME[:LikePlant] = 5
            ENUM[6] = :LikeTree ; NUME[:LikeTree] = 6
            ENUM[7] = :LikeColor ; NUME[:LikeColor] = 7
            ENUM[8] = :LikeShape ; NUME[:LikeShape] = 8
            ENUM[9] = :LikePoeticForm ; NUME[:LikePoeticForm] = 9
            ENUM[10] = :LikeMusicalForm ; NUME[:LikeMusicalForm] = 10
            ENUM[11] = :LikeDanceForm ; NUME[:LikeDanceForm] = 11
        end

        number 16, true, nil, UnitPreference_TType
    }
    field(:item_type, 2) {
        number 16, true, nil, ItemType
    }
    field(:creature_id, 2) {
        number 16, true, -1
    }
    def creature_tg ; df.world.raws.creatures.all[creature_id] ; end
    field(:color_id, 2) {
        number 16, true, -1
    }
    def color_tg ; df.world.raws.descriptors.colors[color_id] ; end
    field(:shape_id, 2) {
        number 16, true, -1
    }
    def shape_tg ; df.world.raws.descriptors.shapes[shape_id] ; end
    field(:plant_id, 2) {
        number 16, true, -1
    }
    def plant_tg ; df.world.raws.plants.all[plant_id] ; end
    field(:poetic_form_id, 4) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form_id) ; end
    field(:musical_form_id, 4) {
        number 32, true, -1
    }
    def musical_form_tg ; df.world.musical_forms.all.binsearch(musical_form_id) ; end
    field(:dance_form_id, 4) {
        number 32, true, -1
    }
    def dance_form_tg ; df.world.dance_forms.all.binsearch(dance_form_id) ; end
    field(:item_subtype, 8) {
        number 32, true, -1
    }
    field(:mattype, 12) {
        number 32, true, -1
    }
    field(:matindex, 16) {
        number 32, true
    }
    field(:mat_state, 20) {
        number 16, true, nil, MatterState
    }
    field(:active, 22) {
        number 8, true, nil, BooleanEnum
    }
    field(:prefstring_seed, 24) {
        number 32, false
    }
end

class UnitRequest < MemHack::Compound
    sizeof 6

    field(:type, 0) {
        class ::DFHack::UnitRequest_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :DoGuildJobs ; NUME[:DoGuildJobs] = 0
        end

        number 16, true, nil, UnitRequest_TType
    }
    field(:guild, 2) {
        number 16, true, nil, GuildId
    }
    field(:count, 4) {
        number 16, true
    }
end

class UnitSkill < MemHack::Compound
    sizeof 32

    field(:id, 0) {
        number 16, true, nil, JobSkill
    }
    field(:rating, 4) {
        number 32, true, nil, SkillRating
    }
    field(:experience, 8) {
        number 32, true
    }
    field(:unused_counter, 12) {
        number 32, true
    }
    field(:rusty, 16) {
        number 32, true
    }
    field(:rust_counter, 20) {
        number 32, true
    }
    field(:demotion_counter, 24) {
        number 32, true
    }
    field(:natural_skill_lvl, 28) {
        number 32, true
    }
end

class UnitSoul < MemHack::Compound
    sizeof 984

    field(:id, 0) {
        number 32, true
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:race, 128) {
        number 32, false, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:sex, 132) {
        number 8, true, nil, PronounType
    }
    field(:caste, 134) {
        number 16, false, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:orientation_flags, 136) {
        global :OrientationFlags
    }
    field(:unk2, 140) {
        number 32, true
    }
    field(:unk3, 144) {
        number 32, true
    }
    field(:unk4, 148) {
        number 32, true
    }
    field(:unk_1, 152) {
        number 32, true
    }
    field(:unk_2, 156) {
        number 32, true
    }
    field(:unk_3, 160) {
        number 32, true
    }
    field(:unk_4, 164) {
        number 32, true
    }
    field(:unk_5, 168) {
        number 32, true
    }
    field(:mental_attrs, 172) {
        static_array(13, 28, MentalAttributeType) {
            global :UnitAttribute
        }
    }
    field(:skills, 536) {
        stl_vector(8) {
            pointer {
                global :UnitSkill
            }
        }
    }
    field(:preferences, 560) {
        stl_vector(8) {
            pointer {
                global :UnitPreference
            }
        }
    }
    field(:personality, 584) {
        global :UnitPersonality
    }
    field(:performance_skills, 976) {
        pointer {
            compound(:UnitSoul_TPerformanceSkills) {
                sizeof 96

                field(:musical_instruments, 0) {
                    stl_vector(8) {
                        pointer {
                            global :UnitInstrumentSkill
                        }
                    }
                }
                field(:poetic_forms, 24) {
                    stl_vector(8) {
                        pointer {
                            global :UnitPoeticSkill
                        }
                    }
                }
                field(:musical_forms, 48) {
                    stl_vector(8) {
                        pointer {
                            global :UnitMusicalSkill
                        }
                    }
                }
                field(:dance_forms, 72) {
                    stl_vector(8) {
                        pointer {
                            global :UnitDanceSkill
                        }
                    }
                }
            }
        }
    }
end

class UnitStorageStatus < MemHack::Compound
    sizeof 92

    field(:floor_pos, 0) {
        global :Coord
    }
    field(:chest_pos, 6) {
        global :Coord
    }
    field(:chest_capacity, 12) {
        number 16, true
    }
    field(:cabinet_pos, 14) {
        global :Coord
    }
    field(:cabinet_capacity, 20) {
        number 16, true
    }
    field(:weaponrack_pos, 22) {
        global :Coord
    }
    field(:weaponrack_capacity, 28) {
        number 16, true
    }
    field(:armorstand_capacity, 30) {
        static_array(6, 1) {
            number 8, true
        }
    }
    field(:armorstand_pos, 36) {
        static_array(6, 6) {
            global :Coord
        }
    }
    field(:num_owned_items, 72) {
        number 32, true
    }
    field(:num_owned_chests, 76) {
        number 32, true
    }
    field(:num_owned_cabinets, 80) {
        number 32, true
    }
    field(:num_owned_weaponracks, 84) {
        number 32, true
    }
    field(:num_owned_armorstands, 88) {
        number 32, true
    }
end

class UnitSyndrome < MemHack::Compound
    sizeof 104

    field(:type, 0) {
        number 32, true, -1
    }
    def type_tg ; df.world.raws.syndromes.all[type] ; end
    field(:year, 4) {
        number 32, true
    }
    field(:year_time, 8) {
        number 32, true
    }
    field(:ticks, 12) {
        number 32, true
    }
    field(:wounds, 16) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:wound_id, 40) {
        number 32, true, -1
    }
    field(:symptoms, 48) {
        stl_vector(8) {
            pointer {
                compound(:UnitSyndrome_TSymptoms) {
                    sizeof 152

                    field(:quantity, 0) {
                        number 32, true
                    }
                    field(:delay, 4) {
                        number 32, true
                    }
                    field(:ticks, 8) {
                        number 32, true
                    }
                    field(:target_bp, 16) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:target_layer, 40) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:target_quantity, 64) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:target_delay, 88) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:target_ticks, 112) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:flags, 136) {
                        compound(:UnitSyndrome_TSymptoms_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                            field(:disabled, 0) { bit 0 }
                            field(:active, 0) { bit 1 }
                        }
                    }
                    field(:random_transformation_race, 140) {
                        number 32, true, -1
                    }
                    def random_transformation_race_tg ; df.world.raws.creatures.all[random_transformation_race] ; end
                    field(:random_transformation_caste, 144) {
                        number 32, true, -1
                    }
                    def random_transformation_caste_tg ; df.world.raws.creatures.all[random_transformation_race].caste[random_transformation_caste] ; end
                }
            }
        }
    }
    field(:reinfection_count, 72) {
        number 16, true
    }
    field(:flags, 76) {
        compound(:UnitSyndrome_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:is_sick, 0) { bit 0 }
            field(:is_sick_low, 0) { bit 1 }
        }
    }
    field(:unk4, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class UnitUnk138 < MemHack::Compound
    sizeof 16

    field(:unk_1, 0) {
        number 32, true
    }
    field(:unk_2, 4) {
        number 32, true
    }
    field(:unk_3, 8) {
        number 32, true
    }
    field(:flags, 12) {
        compound(:UnitUnk138_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:returning_treasure, 0) { bit 1 }
        }
    }
end

class UnitWound < MemHack::Compound
    sizeof 96

    field(:id, 0) {
        number 32, true
    }
    field(:parts, 8) {
        stl_vector(8) {
            pointer {
                compound(:UnitWound_TParts) {
                    sizeof 168

                    field(:global_layer_idx, 0) {
                        number 32, true, -1
                    }
                    field(:body_part_id, 4) {
                        number 16, true, -1
                    }
                    field(:layer_idx, 6) {
                        number 16, true, -1
                    }
                    field(:contact_area, 8) {
                        number 32, true
                    }
                    field(:surface_perc, 12) {
                        number 16, true
                    }
                    field(:strain, 16) {
                        number 32, true
                    }
                    field(:effect_perc1, 24) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:effect_perc2, 48) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:effect_type, 72) {
                        stl_vector(2) {
                            number 16, true, nil, WoundEffectType
                        }
                    }
                    field(:edged_curve_perc, 96) {
                        number 16, true
                    }
                    field(:flags1, 100) {
                        global :WoundDamageFlags1
                    }
                    field(:flags2, 104) {
                        global :WoundDamageFlags2
                    }
                    field(:bleeding, 108) {
                        number 32, true
                    }
                    field(:pain, 112) {
                        number 32, true
                    }
                    field(:nausea, 116) {
                        number 32, true
                    }
                    field(:dizziness, 120) {
                        number 32, true
                    }
                    field(:paralysis, 124) {
                        number 32, true
                    }
                    field(:numbness, 128) {
                        number 32, true
                    }
                    field(:swelling, 132) {
                        number 32, true
                    }
                    field(:impaired, 136) {
                        number 32, true
                    }
                    field(:unk_v42_1, 140) {
                        number 32, true
                    }
                    field(:unk_v42_2, 144) {
                        number 32, true
                    }
                    field(:unk_v42_3, 148) {
                        number 32, true
                    }
                    field(:cur_penetration_perc, 152) {
                        number 16, true
                    }
                    field(:max_penetration_perc, 154) {
                        number 16, true
                    }
                    field(:jammed_layer_idx, 156) {
                        number 32, true, -1
                    }
                    field(:partially_butchered, 160) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:age, 32) {
        number 32, true
    }
    field(:attacker_unit_id, 36) {
        number 32, true, -1
    }
    def attacker_unit_tg ; df.world.units.all.binsearch(attacker_unit_id) ; end
    field(:attacker_hist_figure_id, 40) {
        number 32, true, -1
    }
    def attacker_hist_figure_tg ; df.world.history.figures.binsearch(attacker_hist_figure_id) ; end
    field(:flags, 44) {
        compound(:UnitWound_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:severed_part, 0) { bit 0 }
            field(:mortal_wound, 0) { bit 1 }
            field(:stuck_weapon, 0) { bit 2 }
            field(:diagnosed, 0) { bit 3 }
            field(:sutured, 0) { bit 4 }
            field(:infection, 0) { bit 5 }
        }
    }
    field(:syndrome_id, 48) {
        number 32, true, -1
    }
    def syndrome_tg ; df.world.raws.syndromes.all[syndrome_id] ; end
    field(:pain, 52) {
        number 32, true
    }
    field(:nausea, 56) {
        number 32, true
    }
    field(:dizziness, 60) {
        number 32, true
    }
    field(:paralysis, 64) {
        number 32, true
    }
    field(:numbness, 68) {
        number 32, true
    }
    field(:fever, 72) {
        number 32, true
    }
    field(:curse, 80) {
        pointer {
            global :WoundCurseInfo
        }
    }
    field(:unk_v42_1, 88) {
        number 32, true
    }
    field(:unk_v42_2, 92) {
        number 32, true
    }
end

class UnitsOther < MemHack::OtherVectors
    sizeof 48

    ienum UnitsOtherId

    field(:ANY_RIDER, 0) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:ANY_BABY2, 24) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
end

class Vehicle < MemHack::Compound
    sizeof 64

    field(:id, 0) {
        number 32, true
    }
    field(:item_id, 4) {
        number 32, true, -1
    }
    def item_tg ; df.world.items.all.binsearch(item_id) ; end
    field(:offset_x, 8) {
        number 32, true
    }
    field(:offset_y, 12) {
        number 32, true
    }
    field(:offset_z, 16) {
        number 32, true
    }
    field(:speed_x, 20) {
        number 32, true
    }
    field(:speed_y, 24) {
        number 32, true
    }
    field(:speed_z, 28) {
        number 32, true
    }
    field(:unk_20, 32) {
        number 32, true
    }
    field(:unk_24, 36) {
        number 32, true
    }
    field(:unk_28, 40) {
        number 32, true
    }
    field(:unk_2c, 44) {
        number 32, true
    }
    field(:route_id, 48) {
        number 32, true, -1
    }
    def route_tg ; df.ui.hauling.routes.binsearch(route_id) ; end
    field(:pos, 52) {
        global :Coord
    }
    field(:time_stopped, 60) {
        number 32, true
    }
end

class Vermin < MemHack::Compound
    sizeof 64

    field(:race, 0) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 2) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:pos, 4) {
        global :Coord
    }
    field(:visible, 10) {
        number 8, true, nil, BooleanEnum
    }
    field(:countdown, 12) {
        number 16, true
    }
    field(:item, 16) {
        pointer {
            global :Item
        }
    }
    field(:flags, 24) {
        global :VerminFlags
    }
    field(:amount, 28) {
        number 32, true
    }
    field(:population, 32) {
        global :WorldPopulationRef
    }
    field(:category, 56) {
        number 16, true, nil, VerminCategory
    }
    field(:id, 60) {
        number 32, true
    }
end

class VerminFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:is_colony, 0) { bit 1 }
    field(:is_roaming_colony, 0) { bit 3 }
end

class ViewscreenAdoptRegionst < Viewscreen
    sizeof 1424

    rtti_classname :viewscreen_adopt_regionst

    field(:compressor, 32) {
        global :FileCompressorst
    }
    field(:cur_step, 360) {
        class ::DFHack::ViewscreenAdoptRegionst_TCurStep < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :OpeningFile ; NUME[:OpeningFile] = 0
            ENUM[1] = :ProcessingRawData ; NUME[:ProcessingRawData] = 1
            ENUM[2] = :AllocatingSpace ; NUME[:AllocatingSpace] = 2
            ENUM[3] = :LoadingItems ; NUME[:LoadingItems] = 3
            ENUM[4] = :LoadingBuildings ; NUME[:LoadingBuildings] = 4
            ENUM[5] = :LoadingEntities ; NUME[:LoadingEntities] = 5
            ENUM[6] = :LoadingCoinInformation ; NUME[:LoadingCoinInformation] = 6
            ENUM[7] = :LoadingMapData ; NUME[:LoadingMapData] = 7
            ENUM[8] = :LoadingCivilizedPopulations ; NUME[:LoadingCivilizedPopulations] = 8
            ENUM[9] = :LoadingHistory ; NUME[:LoadingHistory] = 9
            ENUM[10] = :LoadingParameters ; NUME[:LoadingParameters] = 10
            ENUM[11] = :LoadingArtifacts ; NUME[:LoadingArtifacts] = 11
            ENUM[12] = :LoadingActiveHistoricalFigures ; NUME[:LoadingActiveHistoricalFigures] = 12
            ENUM[13] = :LoadingSquads ; NUME[:LoadingSquads] = 13
            ENUM[14] = :LoadingFormations ; NUME[:LoadingFormations] = 14
            ENUM[15] = :LoadingActivities ; NUME[:LoadingActivities] = 15
            ENUM[16] = :LoadingInteractions ; NUME[:LoadingInteractions] = 16
            ENUM[17] = :LoadingWrittenContent ; NUME[:LoadingWrittenContent] = 17
            ENUM[18] = :LoadingIdentities ; NUME[:LoadingIdentities] = 18
            ENUM[19] = :LoadingIncidents ; NUME[:LoadingIncidents] = 19
            ENUM[20] = :LoadingCrimes ; NUME[:LoadingCrimes] = 20
            ENUM[21] = :LoadingVehicles ; NUME[:LoadingVehicles] = 21
            ENUM[22] = :LoadingArmies ; NUME[:LoadingArmies] = 22
            ENUM[23] = :LoadingArmyControllers ; NUME[:LoadingArmyControllers] = 23
            ENUM[24] = :LoadingTrackingInformation ; NUME[:LoadingTrackingInformation] = 24
            ENUM[25] = :LoadingCulturalIdentities ; NUME[:LoadingCulturalIdentities] = 25
            ENUM[26] = :LoadingAgreements ; NUME[:LoadingAgreements] = 26
            ENUM[27] = :LoadingArtForms ; NUME[:LoadingArtForms] = 27
            ENUM[28] = :LoadingOccupations ; NUME[:LoadingOccupations] = 28
            ENUM[29] = :LoadingBeliefSystems ; NUME[:LoadingBeliefSystems] = 29
            ENUM[30] = :LoadingImageSets ; NUME[:LoadingImageSets] = 30
            ENUM[31] = :LoadingDivinationSets ; NUME[:LoadingDivinationSets] = 31
            ENUM[32] = :ClosingFile ; NUME[:ClosingFile] = 32
            ENUM[33] = :RebuildingTemporaryInformation ; NUME[:RebuildingTemporaryInformation] = 33
            ENUM[34] = :PreparingGame ; NUME[:PreparingGame] = 34
            ENUM[35] = :Failed ; NUME[:Failed] = 35
        end

        number 32, true, nil, ViewscreenAdoptRegionst_TCurStep
    }
    field(:save_version, 364) {
        number 32, true, nil, SaveVersion
    }
    field(:cur_save, 368) {
        global :WorldDatSummary
    }
    field(:glosses, 720) {
        global :MatglossList
    }
    field(:progress, 1416) {
        number 32, true
    }
end

class ViewscreenAdventureLogst < Viewscreen
    sizeof 1120

    rtti_classname :viewscreen_adventure_logst

    field(:unk_20, 32) {
        stl_vector(8) {
            pointer {
            }
        }
    }
    field(:unk_38, 56) {
        stl_vector(8) {
            pointer {
            }
        }
    }
    field(:unk_50, 80) {
        stl_vector(8) {
            pointer {
            }
        }
    }
    field(:unk_68, 104) {
        compound(:ViewscreenAdventureLogst_TUnk68) {
            field(:unk_0, 0) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_18, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_30, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_48, 72) {
                number 32, true
            }
        }
    }
    field(:mode, 184) {
        class ::DFHack::ViewscreenAdventureLogst_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Info ; NUME[:Info] = 0
            ENUM[1] = :Map ; NUME[:Map] = 1
        end

        number 8, true, nil, ViewscreenAdventureLogst_TMode
    }
    field(:map_islocalview, 185) {
        number 8, true
    }
    field(:map_hidden, 186) {
        number 8, true
    }
    field(:unk_1, 187) {
        number 8, true
    }
    field(:player_region, 188) {
        global :Coord2d
    }
    field(:player_local, 192) {
        global :Coord2d
    }
    field(:min_discovered, 196) {
        global :Coord2d
    }
    field(:max_discovered, 200) {
        global :Coord2d
    }
    field(:cursor, 204) {
        global :Coord2d
    }
    field(:local_area_x1, 208) {
        number 16, true
    }
    field(:local_area_x2, 210) {
        number 16, true
    }
    field(:local_area_y1, 212) {
        number 16, true
    }
    field(:local_area_y2, 214) {
        number 16, true
    }
    field(:index, 216) {
        number 32, true
    }
    field(:map_draw_line, 220) {
        number 8, true
    }
    field(:info_mode, 222) {
        class ::DFHack::ViewscreenAdventureLogst_TInfoMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Events ; NUME[:Events] = 0
            ENUM[1] = :Agreements ; NUME[:Agreements] = 1
            ENUM[2] = :People ; NUME[:People] = 2
            ENUM[3] = :Sites ; NUME[:Sites] = 3
            ENUM[4] = :Groups ; NUME[:Groups] = 4
            ENUM[5] = :Regions ; NUME[:Regions] = 5
            ENUM[6] = :Bestiary ; NUME[:Bestiary] = 6
        end

        number 16, true, nil, ViewscreenAdventureLogst_TInfoMode
    }
    field(:unk_2, 224) {
        number 16, true
    }
    field(:unk_3, 226) {
        number 16, true
    }
    field(:unk_v40_1a, 228) {
        number 32, true
    }
    field(:unk_v40_1b, 232) {
        number 32, true
    }
    field(:unk_v40_1c, 236) {
        number 32, true
    }
    field(:unk_v40_1d, 240) {
        number 32, true
    }
    field(:unk_v40_1e, 244) {
        number 32, true
    }
    field(:unk_v40_1f, 248) {
        number 32, true
    }
    field(:unk_4, 252) {
        number 32, true
    }
    field(:unk_5, 256) {
        number 8, true
    }
    field(:unk_6, 264) {
        pointer {
        }
    }
    field(:filter_str, 272) {
        stl_string
    }
    field(:in_filter, 304) {
        number 8, true
    }
    field(:unk_7, 305) {
        number 8, true
    }
    field(:items, 312) {
        static_array(9, 24) {
            stl_vector(8) {
                pointer {
                    global :AdventureLogItem
                }
            }
        }
    }
    field(:unk_8, 528) {
        number 8, true
    }
    field(:unk_9, 529) {
        number 8, true
    }
    field(:unk_10, 530) {
        number 8, true
    }
    field(:unk_11, 532) {
        number 32, true
    }
    field(:unk_12, 536) {
        number 32, true
    }
    field(:filtered_items, 544) {
        static_array(9, 24) {
            stl_vector(8) {
                pointer {
                    global :AdventureLogItem
                }
            }
        }
    }
    field(:unk_13, 760) {
        stl_vector
    }
    field(:unk_14, 784) {
        stl_vector
    }
    field(:unk_15, 808) {
        stl_vector
    }
    field(:unk_16, 832) {
        stl_vector
    }
    field(:unk_17, 856) {
        stl_vector
    }
    field(:unk_18, 880) {
        stl_vector
    }
    field(:unk_19, 904) {
        stl_vector
    }
    field(:unk_21, 928) {
        stl_vector
    }
    field(:unk_22, 952) {
        stl_vector
    }
    field(:unk_23, 976) {
        stl_vector
    }
    field(:unk_24, 1000) {
        stl_vector
    }
    field(:unk_25, 1024) {
        stl_vector
    }
    field(:unk_26, 1048) {
        stl_vector
    }
    field(:unk_27, 1072) {
        stl_vector
    }
    field(:unk_28, 1096) {
        stl_vector
    }
end

class ViewscreenAnnouncelistst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_announcelistst

    field(:unit, 32) {
        pointer {
            global :Unit
        }
    }
    field(:report_type, 40) {
        number 16, true, nil, UnitReportType
    }
    field(:sel_idx, 44) {
        number 32, true
    }
    field(:reports, 48) {
        stl_vector(8) {
            pointer {
                global :Report
            }
        }
    }
end

class ViewscreenAssignDisplayItemst < Viewscreen
    sizeof 2696

    rtti_classname :viewscreen_assign_display_itemst

    field(:building, 32) {
        pointer {
            global :BuildingDisplayFurniturest
        }
    }
    field(:title, 40) {
        static_string(256)
    }
    field(:sel_type, 296) {
        number 32, true
    }
    field(:sel_item, 300) {
        number 32, true
    }
    field(:selected_item_ids, 304) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:sel_column, 328) {
        class ::DFHack::ViewscreenAssignDisplayItemst_TSelColumn < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :ItemTypes ; NUME[:ItemTypes] = 0
            ENUM[1] = :Items ; NUME[:Items] = 1
        end

        number 32, true, nil, ViewscreenAssignDisplayItemst_TSelColumn
    }
    field(:item_type, 336) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:artifacts, 360) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:unk_3, 384) {
        number 8, true
    }
    field(:items, 392) {
        static_array(91, 24, ItemType) {
            stl_vector(8) {
                pointer {
                    global :Item
                }
            }
        }
    }
    field(:items_populated, 2576) {
        static_array(91, 1, ItemType) {
            number 8, true
        }
    }
    field(:description, 2672) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class ViewscreenBarterst < Viewscreen
    sizeof 368

    rtti_classname :viewscreen_barterst

    field(:units, 32) {
        static_array(2, 8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:building, 48) {
        pointer {
            global :BuildingCivzonest
        }
    }
    field(:unk_4, 56) {
        pointer {
        }
    }
    field(:unk_5, 64) {
        number 8, true
    }
    field(:making_demands, 65) {
        number 8, true
    }
    field(:unk_7, 66) {
        number 8, true
    }
    field(:items, 72) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    global :Item
                }
            }
        }
    }
    field(:selected, 120) {
        static_array(2, 24) {
            stl_vector(1) {
                number 8, true
            }
        }
    }
    field(:count, 168) {
        static_array(2, 24) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:unk_11, 216) {
        stl_vector
    }
    field(:unk_12, 240) {
        stl_vector
    }
    field(:cursor, 264) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:unk_14, 272) {
        number 8, true
    }
    field(:trade_reply, 274) {
        number 16, true
    }
    field(:unk_16, 276) {
        number 8, true
    }
    field(:max_ask, 280) {
        number 32, true
    }
    field(:max_offer, 284) {
        number 32, true
    }
    field(:cur_ask, 288) {
        number 32, true
    }
    field(:cur_offer, 292) {
        number 32, true
    }
    field(:do_trade, 296) {
        number 8, true
    }
    field(:do_settle_debt, 297) {
        number 8, true
    }
    field(:do_offer, 298) {
        number 8, true
    }
    field(:quantity_prompt, 304) {
        stl_string
    }
    field(:responses, 336) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:response_cursor, 360) {
        number 32, true
    }
end

class ViewscreenBuildinglistst < Viewscreen
    sizeof 136

    rtti_classname :viewscreen_buildinglistst

    field(:cursor, 32) {
        number 32, true, -1
    }
    field(:alt_right_panel, 36) {
        number 8, true, nil, BooleanEnum
    }
    field(:buildings, 40) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:buildings2, 64) {
        stl_vector(8) {
            pointer {
                global :Building
            }
        }
    }
    field(:room_value, 88) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:room_value2, 112) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class ViewscreenBuildingst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_buildingst

    field(:building, 32) {
        pointer {
            global :Building
        }
    }
end

class ViewscreenChooseStartSitest < Viewscreen
    sizeof 496

    rtti_classname :viewscreen_choose_start_sitest

    field(:page, 32) {
        class ::DFHack::ViewscreenChooseStartSitest_TPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Biome ; NUME[:Biome] = 0
            ENUM[1] = :Neighbors ; NUME[:Neighbors] = 1
            ENUM[2] = :Civilization ; NUME[:Civilization] = 2
            ENUM[3] = :Elevation ; NUME[:Elevation] = 3
            ENUM[4] = :Cliffs ; NUME[:Cliffs] = 4
            ENUM[5] = :Reclaim ; NUME[:Reclaim] = 5
            ENUM[6] = :Reclaim2 ; NUME[:Reclaim2] = 6
            ENUM[7] = :Find ; NUME[:Find] = 7
            ENUM[8] = :Notes ; NUME[:Notes] = 8
        end

        number 32, true, nil, ViewscreenChooseStartSitest_TPage
    }
    field(:location, 40) {
        global :EmbarkLocation
    }
    field(:biome_idx, 112) {
        number 32, true
    }
    field(:biome_highlighted, 116) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_aquifer, 117) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_salt, 118) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_large, 119) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_narrow, 120) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_only_warning, 121) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_embark_civ_dying, 122) {
        number 8, true, nil, BooleanEnum
    }
    field(:highlighted_sites, 128) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:local_sites, 152) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:reclaim_idx, 176) {
        number 32, true, -1
    }
    def reclaim_tgx ; df.world.world_data.old_sites[reclaim_idx] ; end
    field(:civ_idx, 180) {
        number 32, true, -1
    }
    field(:available_civs, 184) {
        stl_vector(8) {
            pointer {
                global :HistoricalEntity
            }
        }
    }
    field(:site_info, 208) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:site_abandoned, 232) {
        pointer {
            global :HistoryEvent
        }
    }
    field(:site_created, 240) {
        pointer {
            global :HistoryEvent
        }
    }
    field(:unk_a4, 248) {
        number 32, true
    }
    field(:unk_a8, 252) {
        number 32, true
    }
    field(:finder, 256) {
        compound(:ViewscreenChooseStartSitest_TFinder) {
            field(:search_x, 0) {
                number 32, true, -1
            }
            field(:search_y, 4) {
                number 32, true
            }
            field(:cursor, 8) {
                number 32, true, -1
            }
            field(:options, 12) {
                static_array(23, 4, EmbarkFinderOption) {
                    number 32, true
                }
            }
            field(:unmatched, 104) {
                static_array(23, 1, EmbarkFinderOption) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:visible_options, 128) {
                stl_vector(4) {
                    number 32, true, nil, EmbarkFinderOption
                }
            }
            field(:finder_state, 152) {
                class ::DFHack::ViewscreenChooseStartSitest_TFinder_TFinderState < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[-1] = :None ; NUME[:None] = -1
                    ENUM[0] = :Searching ; NUME[:Searching] = 0
                    ENUM[1] = :NoResult ; NUME[:NoResult] = 1
                    ENUM[2] = :Partial ; NUME[:Partial] = 2
                    ENUM[3] = :Suitable ; NUME[:Suitable] = 3
                end

                number 16, true, nil, ViewscreenChooseStartSitest_TFinder_TFinderState
            }
            field(:unk_11e, 154) {
                number 16, true
            }
            field(:unk_120, 156) {
                number 16, true
            }
            field(:unk_122, 158) {
                number 16, true
            }
            field(:unk_124, 160) {
                number 16, true
            }
            field(:unk_126, 162) {
                number 16, true
            }
            field(:unk_128, 164) {
                number 16, true
            }
        }
    }
    field(:notes_order, 424) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def notes_order_tg ; df.world.world_data.embark_notes[notes_order] ; end
    field(:cur_note_name, 448) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_14c, 472) {
        number 32, true
    }
    field(:unk_150, 476) {
        number 32, true
    }
    field(:unk_154, 480) {
        number 16, true
    }
    field(:note_tile, 482) {
        number 8, true
    }
    field(:note_fg_color, 484) {
        number 16, true
    }
    field(:note_bg_color, 486) {
        number 16, true
    }
    field(:unk_15c, 488) {
        number 32, true
    }
end

class ViewscreenCivlistst < Viewscreen
    sizeof 32864

    rtti_classname :viewscreen_civlistst

    field(:page, 32) {
        class ::DFHack::ViewscreenCivlistst_TPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Civilizations ; NUME[:Civilizations] = 0
            ENUM[1] = :News ; NUME[:News] = 1
            ENUM[2] = :World ; NUME[:World] = 2
            ENUM[3] = :Missions ; NUME[:Missions] = 3
            ENUM[4] = :MissionSquads ; NUME[:MissionSquads] = 4
            ENUM[5] = :MissionMessengers ; NUME[:MissionMessengers] = 5
            ENUM[6] = :MissionDetails ; NUME[:MissionDetails] = 6
            ENUM[7] = :People ; NUME[:People] = 7
            ENUM[8] = :Artifacts ; NUME[:Artifacts] = 8
        end

        number 32, true, :World, ViewscreenCivlistst_TPage
    }
    field(:sel_idx, 36) {
        number 32, true
    }
    field(:entities, 40) {
        stl_vector(8) {
            pointer {
                global :HistoricalEntity
            }
        }
    }
    field(:map_x, 64) {
        number 32, true
    }
    field(:map_y, 68) {
        number 32, true
    }
    field(:site, 72) {
        pointer {
            global :WorldSite
        }
    }
    field(:site_artifacts, 80) {
        stl_vector(8) {
            pointer {
                global :ArtifactRecord
            }
        }
    }
    field(:site_prisoners, 104) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:site_is_linked, 128) {
        number 8, true
    }
    field(:unk_site_nemesis, 136) {
        stl_vector(8) {
            pointer {
                global :NemesisRecord
            }
        }
    }
    field(:missions, 160) {
        stl_vector(8) {
            pointer {
                global :Mission
            }
        }
    }
    field(:mission_idx, 184) {
        number 32, true
    }
    field(:squads, 192) {
        stl_vector(8) {
            pointer {
                global :Squad
            }
        }
    }
    field(:squads_travelling, 216) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:squad_idx, 240) {
        number 32, true
    }
    field(:messengers, 248) {
        stl_vector(8) {
            pointer {
                global :Occupation
            }
        }
    }
    field(:messengers_travelling, 272) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:messenger_idx, 296) {
        number 32, true
    }
    field(:workers, 304) {
        stl_vector(8) {
            pointer {
                global :NemesisRecord
            }
        }
    }
    field(:worker_idx, 328) {
        number 32, true
    }
    field(:people, 336) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:person_idx, 360) {
        number 32, true
    }
    field(:person_x, 364) {
        number 32, true
    }
    field(:person_y, 368) {
        number 32, true
    }
    field(:artifact_records, 376) {
        stl_vector(8) {
            pointer {
                global :ArtifactRecord
            }
        }
    }
    field(:artifact_details, 400) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenCivlistst_TArtifactDetails) {
                    sizeof 48

                    field(:unk_1, 0) {
                        pointer {
                        }
                    }
                    field(:last_site, 8) {
                        number 32, true, -1
                    }
                    def last_site_tg ; df.world.world_data.sites.binsearch(last_site) ; end
                    field(:unk_3, 12) {
                        number 32, true
                    }
                    field(:last_holder_hf, 16) {
                        number 32, true, -1
                    }
                    def last_holder_hf_tg ; df.world.history.figures.binsearch(last_holder_hf) ; end
                    field(:unk_5, 20) {
                        number 32, true
                    }
                    field(:unk_6, 24) {
                        number 32, true
                    }
                    field(:unk_7, 28) {
                        number 32, true
                    }
                    field(:unk_8, 32) {
                        number 32, true
                    }
                    field(:unk_9, 36) {
                        number 32, true
                    }
                    field(:unk_10, 40) {
                        pointer {
                        }
                    }
                }
            }
        }
    }
    field(:artifact_idx, 424) {
        number 32, true
    }
    field(:artifact_x, 428) {
        number 32, true
    }
    field(:artifact_y, 432) {
        number 32, true
    }
    field(:artifact_desc, 440) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:artifact_claimed_by_unk1, 464) {
        pointer {
        }
    }
    field(:artifact_claimed_by_unk2, 472) {
        pointer {
        }
    }
    field(:artifact_claimed_by_hf, 480) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:histfig, 488) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:histfig2, 496) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:rumors, 504) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenCivlistst_TRumors) {
                    sizeof 40

                    field(:artifact_or_entity, 0) {
                        number 32, true
                    }
                    field(:site, 4) {
                        number 32, true, -1
                    }
                    def site_tg ; df.world.world_data.sites.binsearch(site) ; end
                    field(:histfig_or_entity, 8) {
                        number 32, true
                    }
                    field(:histfig2, 12) {
                        number 32, true, -1
                    }
                    def histfig2_tg ; df.world.history.figures.binsearch(histfig2) ; end
                    field(:year1, 16) {
                        number 32, true
                    }
                    field(:year_tick1, 20) {
                        number 32, true
                    }
                    field(:year2, 24) {
                        number 32, true
                    }
                    field(:year_tick2, 28) {
                        number 32, true
                    }
                    field(:unk_3, 32) {
                        number 32, true
                    }
                    field(:type, 36) {
                        class ::DFHack::ViewscreenCivlistst_TRumors_TType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :ArmyMarched ; NUME[:ArmyMarched] = 0
                            ENUM[1] = :Kidnapped ; NUME[:Kidnapped] = 1
                            ENUM[3] = :Unknown3 ; NUME[:Unknown3] = 3
                            ENUM[7] = :RefugeesFled ; NUME[:RefugeesFled] = 7
                            ENUM[8] = :MovedOn ; NUME[:MovedOn] = 8
                            ENUM[9] = :Reclaimed ; NUME[:Reclaimed] = 9
                            ENUM[10] = :Founded ; NUME[:Founded] = 10
                            ENUM[13] = :GaveUpOccupation ; NUME[:GaveUpOccupation] = 13
                            ENUM[16] = :BecameRuler ; NUME[:BecameRuler] = 16
                            ENUM[17] = :Claimed ; NUME[:Claimed] = 17
                            ENUM[25] = :ArtifactLocation ; NUME[:ArtifactLocation] = 25
                            ENUM[28] = :Unknown28 ; NUME[:Unknown28] = 28
                        end

                        number 32, true, nil, ViewscreenCivlistst_TRumors_TType
                    }
                }
            }
        }
    }
    field(:unk_24, 528) {
        stl_vector
    }
    field(:unk_25, 552) {
        number 32, true
    }
    field(:news_x, 556) {
        number 32, true
    }
    field(:news_y, 560) {
        number 32, true
    }
    field(:unk_28, 568) {
        pointer {
        }
    }
    field(:unk_29, 576) {
        number 32, true
    }
    field(:unk_2a, 580) {
        number 32, true
    }
    field(:unk_2b, 584) {
        pointer {
        }
    }
    field(:unk_2c, 592) {
        pointer {
        }
    }
    field(:unk_2d, 600) {
        number 32, true
    }
    field(:unk_2e, 604) {
        number 32, true
    }
    field(:unk_cache_ptr, 608) {
        pointer {
        }
    }
    field(:unk_cache, 616) {
        compound(:ViewscreenCivlistst_TUnkCache) {
            field(:tmp1, 0) {
                compound(:ViewscreenCivlistst_TUnkCache_TTmp1) {
                    field(:values, 0) {
                        static_array(50, 4) {
                            number 32, true
                        }
                    }
                    field(:count, 200) {
                        number 32, true
                    }
                }
            }
            field(:tmp2, 208) {
                compound(:ViewscreenCivlistst_TUnkCache_TTmp2) {
                    field(:unk_1, 0) {
                        static_array(4001, 8) {
                            number 64, true
                        }
                    }
                }
            }
        }
    }
    field(:news_text, 32832) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:show_holdings, 32856) {
        number 8, true, nil, BooleanEnum
    }
    field(:show_legend, 32857) {
        number 8, true, nil, BooleanEnum
    }
end

class ViewscreenCounterintelligencest < Viewscreen
    sizeof 312

    rtti_classname :viewscreen_counterintelligencest

    field(:unk_1, 32) {
        stl_vector
    }
    field(:unk_2, 56) {
        stl_vector
    }
    field(:unk_3, 80) {
        stl_vector
    }
    field(:unk_4, 104) {
        number 32, true
    }
    field(:unk_5, 108) {
        number 32, true
    }
    field(:unk_6, 112) {
        stl_string
    }
    field(:unk_7, 144) {
        number 8, true
    }
    field(:unk_8, 145) {
        number 8, true
    }
    field(:unk_9, 152) {
        pointer {
        }
    }
    field(:unk_10, 160) {
        number 32, true
    }
    field(:unk_11, 168) {
        stl_vector
    }
    field(:unk_12, 192) {
        stl_vector
    }
    field(:unk_13, 216) {
        stl_vector
    }
    field(:unk_14, 240) {
        stl_vector
    }
    field(:unk_15, 264) {
        stl_vector
    }
    field(:unk_16, 288) {
        stl_vector
    }
end

class ViewscreenCreatequotast < Viewscreen
    sizeof 392

    rtti_classname :viewscreen_createquotast

    field(:building_id, 32) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:str_filter, 36) {
        static_string(256)
    }
    field(:sel_idx, 292) {
        number 32, true
    }
    field(:orders, 296) {
        stl_vector(8) {
            pointer {
                global :ManagerOrderTemplate
            }
        }
    }
    field(:all_orders, 320) {
        stl_vector(8) {
            pointer {
                global :ManagerOrderTemplate
            }
        }
    }
    field(:want_quantity, 344) {
        number 8, true, nil, BooleanEnum
    }
    field(:str_quantity, 352) {
        stl_string
    }
    field(:workshop_profile_orders, 384) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :ManagerOrder
                }
            }
        }
    }
end

class ViewscreenCustomizeUnitst < Viewscreen
    sizeof 88

    rtti_classname :viewscreen_customize_unitst

    field(:unit, 32) {
        pointer {
            global :Unit
        }
    }
    field(:editing_nickname, 40) {
        number 8, true
    }
    field(:editing_profession, 41) {
        number 8, true
    }
    field(:previous_name, 48) {
        stl_string
    }
    field(:has_name, 80) {
        number 8, true
    }
end

class ViewscreenDungeonMonsterstatusst < Viewscreen
    sizeof 144

    rtti_classname :viewscreen_dungeon_monsterstatusst

    field(:unit, 32) {
        pointer {
            global :Unit
        }
    }
    field(:inventory_cursor, 40) {
        number 32, true
    }
    field(:body_part_cursor, 44) {
        number 32, true
    }
    field(:body_part, 48) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:view_skills, 72) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1, 76) {
        number 32, true
    }
    field(:length, 80) {
        number 32, true
    }
    field(:scroll_pos, 84) {
        number 32, true
    }
    field(:unk_2, 88) {
        number 8, true
    }
    field(:inventory, 96) {
        stl_vector(8) {
            pointer {
                global :UnitInventoryItem
            }
        }
    }
    field(:spatters, 120) {
        stl_vector(8) {
            pointer {
                global :Spatter
            }
        }
    }
end

class ViewscreenDungeonWrestlest < Viewscreen
    sizeof 520

    rtti_classname :viewscreen_dungeon_wrestlest

    field(:player, 32) {
        pointer {
            global :Unit
        }
    }
    field(:target, 40) {
        pointer {
            global :Unit
        }
    }
    field(:unk_1, 48) {
        number 8, true
    }
    field(:unk_2, 52) {
        number 32, true
    }
    field(:unk_3, 56) {
        stl_vector
    }
    field(:unk_4, 80) {
        number 32, true
    }
    field(:unk_5, 84) {
        number 32, true
    }
    field(:unk_6, 88) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_7, 112) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk1, 136) {
        compound(:ViewscreenDungeonWrestlest_TUnk1) {
            field(:unk_1, 0) {
                pointer {
                    global :Unit
                }
            }
            field(:unk_2, 8) {
                number 8, true
            }
            field(:unk_3, 9) {
                number 8, true
            }
            field(:weapons, 16) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:unk_4, 40) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_5, 64) {
                stl_vector
            }
            field(:unk_6, 88) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_7, 112) {
                stl_vector
            }
            field(:unk_8, 136) {
                stl_vector
            }
            field(:unk_9, 160) {
                stl_vector
            }
            field(:unk_10, 184) {
                stl_vector
            }
            field(:unk_11, 208) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_12, 232) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_13, 256) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_14, 280) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_15, 304) {
                stl_vector
            }
            field(:unk_16, 328) {
                stl_vector
            }
            field(:unk_17, 352) {
                stl_vector
            }
        }
    }
    field(:unk_8, 512) {
        number 32, true
    }
    field(:unk_9, 516) {
        number 32, true
    }
end

class ViewscreenDungeonmodest < Viewscreen
    sizeof 56

    rtti_classname :viewscreen_dungeonmodest

    field(:x, 32) {
        number 32, true
    }
    field(:y, 36) {
        number 32, true
    }
    field(:z, 40) {
        number 32, true
    }
    field(:announce_y, 44) {
        number 32, true
    }
    field(:announce_idx, 48) {
        number 32, true
    }
    field(:announce_more, 52) {
        number 8, true
    }
end

class ViewscreenDwarfmodest < Viewscreen
    sizeof 184

    rtti_classname :viewscreen_dwarfmodest

    field(:shown_site_name, 32) {
        number 8, true
    }
    field(:jeweler_mat_count, 34) {
        number 16, true
    }
    field(:jeweler_cutgem, 40) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:jeweler_encrust, 64) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unit_labors_sidemenu, 88) {
        stl_vector(4) {
            number 32, true, nil, UnitLabor
        }
    }
    field(:unit_labors_sidemenu_uplevel, 112) {
        stl_vector(4) {
            number 32, true, nil, UnitLabor
        }
    }
    field(:unit_labors_sidemenu_uplevel_idx, 136) {
        number 32, true
    }
    field(:sideSubmenu, 140) {
        number 8, true
    }
    field(:keyRepeat, 141) {
        number 8, true
    }
    field(:trained_animals, 144) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:trained_animal_idx, 168) {
        number 32, true
    }
    field(:number_assigned_hunt, 172) {
        number 32, true
    }
    field(:number_assigned_war, 176) {
        number 32, true
    }
end

class ViewscreenEntityst < Viewscreen
    sizeof 184

    rtti_classname :viewscreen_entityst

    field(:entity, 32) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:unk_1, 40) {
        stl_vector
    }
    field(:unk_2, 64) {
        number 32, true
    }
    field(:important_leader_nemesis, 72) {
        stl_vector(8) {
            pointer {
                global :NemesisRecord
            }
        }
    }
    field(:important_leader_precedence, 96) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:start_idx, 120) {
        number 32, true
    }
    field(:agreements, 128) {
        stl_vector(8) {
            pointer {
                global :MeetingEvent
            }
        }
    }
    field(:agreement_status, 152) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:agreement_cursor, 176) {
        number 32, true
    }
    field(:page, 180) {
        number 16, true
    }
end

class ViewscreenExportGraphicalMapst < Viewscreen
    sizeof 136

    rtti_classname :viewscreen_export_graphical_mapst

    field(:in_select, 32) {
        number 8, true, nil, BooleanEnum
    }
    field(:sel_type, 36) {
        number 32, true, nil, ExportMapType
    }
    field(:unk_1, 40) {
        number 32, true
    }
    field(:unk_2, 48) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 72) {
        stl_vector
    }
    field(:x0, 96) {
        number 16, true
    }
    field(:y0, 98) {
        number 16, true
    }
    field(:x1, 100) {
        number 16, true
    }
    field(:y1, 102) {
        number 16, true
    }
    field(:cur_x, 104) {
        number 32, true
    }
    field(:cur_y, 108) {
        number 32, true
    }
    field(:rgb_buffer, 112) {
        pointer {
            compound(:ViewscreenExportGraphicalMapst_TRgbBuffer) {
                sizeof 3

                field(:r, 0) {
                    number 8, false
                }
                field(:g, 1) {
                    number 8, false
                }
                field(:b, 2) {
                    number 8, false
                }
            }
        }
    }
    field(:map_width, 120) {
        number 32, true
    }
    field(:map_height, 124) {
        number 32, true
    }
    field(:numtiles_map_width, 128) {
        number 32, true
    }
    field(:numtiles_map_height, 132) {
        number 32, true
    }
end

class ViewscreenExportRegionst < Viewscreen
    sizeof 456

    rtti_classname :viewscreen_export_regionst

    field(:state, 32) {
        class ::DFHack::ViewscreenExportRegionst_TState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Initializing ; NUME[:Initializing] = 0
            ENUM[1] = :PreliminaryCleaning ; NUME[:PreliminaryCleaning] = 1
            ENUM[2] = :OffloadingUnits ; NUME[:OffloadingUnits] = 2
            ENUM[3] = :OffloadingArtImages ; NUME[:OffloadingArtImages] = 3
            ENUM[4] = :OffloadingFile ; NUME[:OffloadingFile] = 4
            ENUM[5] = :CharacterizingRawData ; NUME[:CharacterizingRawData] = 5
            ENUM[6] = :SortingWorldInformation ; NUME[:SortingWorldInformation] = 6
            ENUM[7] = :AllocatingSpace ; NUME[:AllocatingSpace] = 7
            ENUM[8] = :SavingItems ; NUME[:SavingItems] = 8
            ENUM[9] = :SavingBuildings ; NUME[:SavingBuildings] = 9
            ENUM[10] = :SavingEntities ; NUME[:SavingEntities] = 10
            ENUM[11] = :SavingCoinInformation ; NUME[:SavingCoinInformation] = 11
            ENUM[12] = :SavingMapData ; NUME[:SavingMapData] = 12
            ENUM[13] = :SavingCivilizedPopulations ; NUME[:SavingCivilizedPopulations] = 13
            ENUM[14] = :SavingHistory ; NUME[:SavingHistory] = 14
            ENUM[15] = :SavingParameters ; NUME[:SavingParameters] = 15
            ENUM[16] = :SavingArtifacts ; NUME[:SavingArtifacts] = 16
            ENUM[17] = :SavingActiveHistoricalFigures ; NUME[:SavingActiveHistoricalFigures] = 17
            ENUM[18] = :SavingSquads ; NUME[:SavingSquads] = 18
            ENUM[19] = :SavingFormations ; NUME[:SavingFormations] = 19
            ENUM[20] = :SavingActivities ; NUME[:SavingActivities] = 20
            ENUM[21] = :SavingInteractions ; NUME[:SavingInteractions] = 21
            ENUM[22] = :SavingWrittenContent ; NUME[:SavingWrittenContent] = 22
            ENUM[23] = :SavingIdentities ; NUME[:SavingIdentities] = 23
            ENUM[24] = :SavingIncidents ; NUME[:SavingIncidents] = 24
            ENUM[25] = :SavingCrimes ; NUME[:SavingCrimes] = 25
            ENUM[26] = :SavingVehicles ; NUME[:SavingVehicles] = 26
            ENUM[27] = :SavingArmies ; NUME[:SavingArmies] = 27
            ENUM[28] = :SavingArmyControllers ; NUME[:SavingArmyControllers] = 28
            ENUM[29] = :SavingTrackingInfo ; NUME[:SavingTrackingInfo] = 29
            ENUM[30] = :SavingCulturalIdentities ; NUME[:SavingCulturalIdentities] = 30
            ENUM[31] = :SavingAgreements ; NUME[:SavingAgreements] = 31
            ENUM[32] = :SavingArtForms ; NUME[:SavingArtForms] = 32
            ENUM[33] = :SavingOccupations ; NUME[:SavingOccupations] = 33
            ENUM[34] = :SavingBeliefSystems ; NUME[:SavingBeliefSystems] = 34
            ENUM[35] = :SavingImageSets ; NUME[:SavingImageSets] = 35
            ENUM[36] = :SavingDivinationSets ; NUME[:SavingDivinationSets] = 36
            ENUM[37] = :ClosingFile ; NUME[:ClosingFile] = 37
            ENUM[38] = :SynchronizingFolders ; NUME[:SynchronizingFolders] = 38
        end

        number 32, true, nil, ViewscreenExportRegionst_TState
    }
    field(:progress, 36) {
        number 32, true
    }
    field(:units_progress, 40) {
        compound(:ViewscreenExportRegionst_TUnitsProgress) {
            field(:save_file_id, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:save_file_member_idx, 24) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:units, 48) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:current_chunk, 72) {
                pointer {
                    global :UnitChunk
                }
            }
            field(:current_save_file_id, 80) {
                number 32, true
            }
            field(:offloaded_units, 84) {
                number 32, true
            }
        }
    }
    field(:compressor, 128) {
        global :FileCompressorst
    }
end

class ViewscreenGameCleanerst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_game_cleanerst

    field(:state, 32) {
        class ::DFHack::ViewscreenGameCleanerst_TState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :CleaningGameObjects ; NUME[:CleaningGameObjects] = 0
            ENUM[1] = :CleaningStrandedObjects ; NUME[:CleaningStrandedObjects] = 1
            ENUM[2] = :CleaningPlayObjects ; NUME[:CleaningPlayObjects] = 2
        end

        number 32, true, nil, ViewscreenGameCleanerst_TState
    }
end

class ViewscreenImageCreatorst < Viewscreen
    sizeof 1208

    rtti_classname :viewscreen_image_creatorst

    field(:title, 32) {
        stl_string
    }
    field(:modes, 64) {
        stl_vector(4) {
            global :ViewscreenImageCreatorMode
        }
    }
    field(:mode_cursor, 88) {
        number 32, true
    }
    field(:mode, 92) {
        number 32, true, nil, ViewscreenImageCreatorMode
    }
    field(:item_idx, 96) {
        number 32, true
    }
    field(:in_filter, 100) {
        number 8, true, nil, BooleanEnum
    }
    field(:filter, 104) {
        stl_string
    }
    field(:descriptions, 136) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:sites, 160) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TSites) {
                    sizeof 72

                    field(:site, 0) {
                        pointer {
                            global :WorldSite
                        }
                    }
                    field(:name, 8) {
                        stl_string
                    }
                    field(:trans_name, 40) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:entities, 184) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TEntities) {
                    sizeof 72

                    field(:entity, 0) {
                        pointer {
                            global :HistoricalEntity
                        }
                    }
                    field(:name, 8) {
                        stl_string
                    }
                    field(:trans_name, 40) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:plants, 208) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TPlants) {
                    sizeof 40

                    field(:plant, 0) {
                        number 32, true, -1
                    }
                    def plant_tg ; df.world.raws.plants.all[plant] ; end
                    field(:name, 8) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:trees, 232) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TTrees) {
                    sizeof 40

                    field(:tree, 0) {
                        number 32, true, -1
                    }
                    def tree_tg ; df.world.raws.plants.all[tree] ; end
                    field(:name, 8) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:shapes, 256) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TShapes) {
                    sizeof 40

                    field(:shape, 0) {
                        number 32, true
                    }
                    field(:shape2, 4) {
                        number 32, true
                    }
                    field(:name, 8) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:objects, 280) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TObjects) {
                    sizeof 40

                    field(:item_type, 0) {
                        number 32, true, nil, ItemType
                    }
                    field(:item_subtype, 4) {
                        number 32, true, -1
                    }
                    field(:name, 8) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:artifacts, 304) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TArtifacts) {
                    sizeof 72

                    field(:artifact, 0) {
                        pointer {
                            global :ArtifactRecord
                        }
                    }
                    field(:name, 8) {
                        stl_string
                    }
                    field(:trans_name, 40) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:histfigs, 328) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_THistfigs) {
                    sizeof 72

                    field(:histfig, 0) {
                        pointer {
                            global :HistoricalFigure
                        }
                    }
                    field(:name, 8) {
                        stl_string
                    }
                    field(:trans_name, 40) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:relationships, 352) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenImageCreatorst_TRelationships) {
                    sizeof 40

                    field(:verb, 0) {
                        number 32, true, nil, ArtImagePropertyVerb
                    }
                    field(:binary, 4) {
                        number 8, true, nil, BooleanEnum
                    }
                    field(:name, 8) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:histfigs_filtered, 376) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:sites_filtered, 400) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:entities_filtered, 424) {
        stl_vector(8) {
            pointer {
                global :HistoricalEntity
            }
        }
    }
    field(:unkvec_1, 448) {
        stl_vector
    }
    field(:existing_images_filtered, 472) {
        stl_vector(8) {
            pointer {
                global :ArtImage
            }
        }
    }
    field(:image, 496) {
        global :ArtImage
    }
    field(:races_filtered, 720) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def races_filtered_tg ; races_filtered.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:castes_filtered, 744) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:histfigs_filtered2, 768) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:plants_filtered, 792) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def plants_filtered_tg ; plants_filtered.map { |i| df.world.raws.plants.all[i] } ; end
    field(:trees_filtered, 816) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def trees_filtered_tg ; trees_filtered.map { |i| df.world.raws.plants.all[i] } ; end
    field(:shapes_filtered, 840) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def shapes_filtered_tg ; shapes_filtered.map { |i| df.world.raws.descriptors.shapes[i] } ; end
    field(:shapes_filtered_adj, 864) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:item_types_filtered, 888) {
        stl_vector(4) {
            number 32, true, nil, ItemType
        }
    }
    field(:item_subtypes_filtered, 912) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:artifacts_filtered, 936) {
        stl_vector(8) {
            pointer {
                global :ArtifactRecord
            }
        }
    }
    field(:relationships_filtered_verb, 960) {
        stl_vector(4) {
            number 32, true, nil, ArtImagePropertyVerb
        }
    }
    field(:relationships_filtered_binary, 984) {
        stl_bit_vector
    }
    field(:relationship_targets, 1016) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 1040) {
        number 32, true
    }
    field(:unk_2, 1044) {
        number 8, true
    }
    field(:unk_3, 1048) {
        number 32, true
    }
    field(:unk_4, 1052) {
        number 32, true
    }
    field(:unk_5, 1056) {
        number 32, true
    }
    field(:unk_6, 1060) {
        number 32, true
    }
    field(:unk_7, 1064) {
        stl_string
    }
    field(:unk_8, 1096) {
        number 8, true
    }
    field(:unk_9, 1097) {
        number 8, true
    }
    field(:unk_10, 1098) {
        number 8, true
    }
    field(:deletable_elements, 1104) {
        stl_vector
    }
    field(:text_pos, 1128) {
        number 32, true
    }
    field(:job, 1136) {
        pointer {
            global :Job
        }
    }
    field(:job_order, 1144) {
        pointer {
            global :ManagerOrder
        }
    }
    field(:order, 1152) {
        pointer {
            global :ManagerOrder
        }
    }
    field(:entity, 1160) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:symbol, 1168) {
        pointer {
            global :EmbarkSymbol
        }
    }
    field(:unk_15, 1176) {
        pointer {
            stl_string
        }
    }
    field(:figure, 1184) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_17, 1192) {
        pointer {
        }
    }
    field(:unk_50, 1200) {
        number 32, true
    }
end

class ViewscreenItemst < Viewscreen
    sizeof 168

    rtti_classname :viewscreen_itemst

    field(:item, 32) {
        pointer {
            global :Item
        }
    }
    field(:entry_ref, 40) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:entry_indent, 64) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:entry_spatters, 88) {
        stl_vector(8) {
            pointer {
                global :Spatter
            }
        }
    }
    field(:entry_string, 112) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:entry_reaction, 136) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:cursor_pos, 160) {
        number 32, true
    }
    field(:caption_uses, 164) {
        number 8, true, nil, BooleanEnum
    }
    field(:caption_contents, 165) {
        number 8, true, nil, BooleanEnum
    }
end

class ViewscreenJoblistst < Viewscreen
    sizeof 88

    rtti_classname :viewscreen_joblistst

    field(:allow_zoom, 32) {
        number 8, true, nil, BooleanEnum
    }
    field(:cursor_pos, 36) {
        number 32, true
    }
    field(:jobs, 40) {
        stl_vector(8) {
            pointer {
                global :Job
            }
        }
    }
    field(:units, 64) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
end

class ViewscreenJobmanagementst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_jobmanagementst

    field(:sel_idx, 32) {
        number 32, true
    }
    field(:in_max_workshops, 36) {
        number 8, true, nil, BooleanEnum
    }
    field(:max_workshops, 40) {
        stl_string
    }
end

class ViewscreenJobst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_jobst

    field(:job, 32) {
        pointer {
            global :Job
        }
    }
end

class ViewscreenJusticest < Viewscreen
    sizeof 224

    rtti_classname :viewscreen_justicest

    field(:jails_needed, 32) {
        number 16, true
    }
    field(:jails_present, 34) {
        number 16, true
    }
    field(:cur_column, 36) {
        class ::DFHack::ViewscreenJusticest_TCurColumn < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Crimes ; NUME[:Crimes] = 0
            ENUM[1] = :Suspects ; NUME[:Suspects] = 1
            ENUM[2] = :ConvictChoices ; NUME[:ConvictChoices] = 2
            ENUM[3] = :InterrogateChoices ; NUME[:InterrogateChoices] = 3
        end

        number 32, true, nil, ViewscreenJusticest_TCurColumn
    }
    field(:convicts, 40) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:cases, 64) {
        stl_vector(8) {
            pointer {
                global :Crime
            }
        }
    }
    field(:sel_idx_current, 88) {
        number 32, true
    }
    field(:sel_idx_cold, 92) {
        number 32, true
    }
    field(:sel_idx_recent, 96) {
        number 32, true
    }
    field(:cold_cases, 100) {
        number 8, true, nil, BooleanEnum
    }
    field(:count_cold, 104) {
        number 32, true
    }
    field(:count_recent, 108) {
        number 32, true
    }
    field(:cursor_right, 112) {
        number 32, true
    }
    field(:convictions, 120) {
        stl_vector(8) {
            pointer {
                global :Crime
            }
        }
    }
    field(:punishment, 144) {
        pointer {
            global :Punishment
        }
    }
    field(:convict_choices, 152) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:interrogate_choices, 176) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:interrogate_status, 200) {
        stl_vector(4) {
            compound(:ViewscreenJusticest_TInterrogateStatus) {
                field(:_whole, 0) {
                    number 32, true
                }
                field(:interview_scheduled, 0) { bit 0 }
                field(:already_interviewed, 0) { bit 1 }
            }
        }
    }
end

class ViewscreenKitchenprefst < Viewscreen
    sizeof 808

    rtti_classname :viewscreen_kitchenprefst

    field(:cursor, 32) {
        number 32, true
    }
    field(:page, 36) {
        number 32, true, nil, ViewscreenKitchenprefPage
    }
    field(:item_type, 40) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(2) {
                number 16, true, nil, ItemType
            }
        }
    }
    field(:item_subtype, 136) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    }
    field(:mat_type, 232) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    }
    field(:mat_index, 328) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:count, 424) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:forbidden, 520) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(1) {
                global :KitchenPrefFlag
            }
        }
    }
    field(:possible, 616) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(1) {
                global :KitchenPrefFlag
            }
        }
    }
    field(:item_str, 712) {
        static_array(4, 24, ViewscreenKitchenprefPage) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
end

class ViewscreenLayer < Viewscreen
    sizeof 56

    rtti_classname :viewscreen_layerst

    field(:layer_objects, 32) {
        stl_vector(8) {
            pointer {
                global :LayerObject
            }
        }
    }
end

class ViewscreenLayerArenaCreaturest < ViewscreenLayer
    sizeof 160

    rtti_classname :viewscreen_layer_arena_creaturest

    field(:in_adding_item, 56) {
        number 8, true, nil, BooleanEnum
    }
    field(:item_type, 58) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 60) {
        number 16, true, -1
    }
    field(:mat_type, 62) {
        number 16, true, -1
    }
    field(:mat_index, 64) {
        number 32, true
    }
    field(:cur_side, 68) {
        number 32, true
    }
    field(:cur_interaction, 72) {
        number 32, true, -1
    }
    def cur_interaction_tg ; df.world.arena_spawn.interactions[cur_interaction] ; end
    field(:filter, 80) {
        stl_string
    }
    field(:race, 112) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def race_tg ; race.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:caste, 136) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
end

class ViewscreenLayerAssigntradest < ViewscreenLayer
    sizeof 1712

    rtti_classname :viewscreen_layer_assigntradest

    field(:info, 56) {
        stl_vector(8) {
            pointer {
                global :AssignTradeStatus
            }
        }
    }
    field(:depot, 80) {
        pointer {
            global :BuildingTradedepotst
        }
    }
    field(:lists, 88) {
        static_array(65, 24) {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:visible_lists, 1648) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:sort_distance, 1672) {
        number 8, true, nil, BooleanEnum
    }
    field(:pending_on_top, 1673) {
        number 8, true, nil, BooleanEnum
    }
    field(:filter_mandates, 1674) {
        number 8, true, nil, BooleanEnum
    }
    field(:filter, 1680) {
        stl_string
    }
end

class ViewscreenLayerChooseLanguageNamest < ViewscreenLayer
    sizeof 472

    rtti_classname :viewscreen_layer_choose_language_namest

    field(:entity, 56) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:name, 64) {
        pointer {
            global :LanguageName
        }
    }
    field(:type, 72) {
        number 32, true, nil, LanguageNameType
    }
    field(:current_component, 76) {
        number 32, true, nil, LanguageNameComponent
    }
    field(:type2, 80) {
        number 32, true, nil, LanguageNameType
    }
    field(:dictionary, 88) {
        global :LanguageWordTable
    }
    field(:list_word, 376) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def list_word_tg ; list_word.map { |i| df.world.raws.language.words[i] } ; end
    field(:list_part, 400) {
        stl_vector(4) {
            number 32, true, nil, PartOfSpeech
        }
    }
    field(:selector, 424) {
        stl_string
    }
    field(:unk_1, 456) {
        pointer {
        }
    }
    field(:unk_2, 464) {
        pointer {
        }
    }
end

class ViewscreenLayerCurrencyst < ViewscreenLayer
    sizeof 112

    rtti_classname :viewscreen_layer_currencyst

    field(:unk_1, 56) {
        stl_vector
    }
    field(:unk_2, 80) {
        number 32, true
    }
    field(:unk_3, 88) {
        stl_vector
    }
end

class ViewscreenLayerExportPlayMapst < ViewscreenLayer
    sizeof 152

    rtti_classname :viewscreen_layer_export_play_mapst

    field(:unk_1, 56) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:unk_2, 80) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_3, 104) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_4, 128) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class ViewscreenLayerMilitaryst < ViewscreenLayer
    sizeof 1232

    rtti_classname :viewscreen_layer_militaryst

    field(:squads, 56) {
        compound(:ViewscreenLayerMilitaryst_TSquads) {
            field(:list, 0) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:leader_positions, 24) {
                stl_vector(8) {
                    pointer {
                        global :EntityPosition
                    }
                }
            }
            field(:leader_assignments, 48) {
                stl_vector(8) {
                    pointer {
                        global :EntityPositionAssignment
                    }
                }
            }
            field(:can_appoint, 72) {
                stl_bit_vector
            }
        }
    }
    field(:positions, 160) {
        compound(:ViewscreenLayerMilitaryst_TPositions) {
            field(:assigned, 0) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:unk_1, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:skill, 48) {
                stl_vector(2) {
                    number 16, true, nil, JobSkill
                }
            }
            field(:unk_84, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:candidates, 96) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
        }
    }
    field(:page, 280) {
        class ::DFHack::ViewscreenLayerMilitaryst_TPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Positions ; NUME[:Positions] = 0
            ENUM[1] = :Alerts ; NUME[:Alerts] = 1
            ENUM[2] = :Equip ; NUME[:Equip] = 2
            ENUM[3] = :Uniforms ; NUME[:Uniforms] = 3
            ENUM[4] = :Supplies ; NUME[:Supplies] = 4
            ENUM[5] = :Ammunition ; NUME[:Ammunition] = 5
        end

        number 32, true, nil, ViewscreenLayerMilitaryst_TPage
    }
    field(:num_squads, 284) {
        number 32, true
    }
    field(:num_soldiers, 288) {
        number 32, true
    }
    field(:num_active, 292) {
        number 32, true
    }
    field(:squad_members, 296) {
        compound(:ViewscreenLayerMilitaryst_TSquadMembers) {
            field(:profession, 0) {
                stl_vector(2) {
                    number 16, true, nil, Profession
                }
            }
            field(:count, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:max_count, 48) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:in_create_squad, 368) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_new_squad, 369) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_e6, 370) {
        number 8, true, nil, BooleanEnum
    }
    field(:captain_positions, 376) {
        stl_vector(8) {
            pointer {
                global :EntityPosition
            }
        }
    }
    field(:new_position, 400) {
        pointer {
            global :EntityPosition
        }
    }
    field(:unk_fc, 408) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_rename_alert, 409) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_delete_alert, 410) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_ff, 411) {
        number 8, true, nil, BooleanEnum
    }
    field(:alert_squads, 416) {
        stl_vector(8) {
            pointer {
                global :Squad
            }
        }
    }
    field(:equip, 440) {
        compound(:ViewscreenLayerMilitaryst_TEquip) {
            field(:mode, 0) {
                class ::DFHack::ViewscreenLayerMilitaryst_TEquip_TMode < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Customize ; NUME[:Customize] = 0
                    ENUM[1] = :Uniform ; NUME[:Uniform] = 1
                    ENUM[2] = :Priority ; NUME[:Priority] = 2
                end

                number 32, true, nil, ViewscreenLayerMilitaryst_TEquip_TMode
            }
            field(:squads, 8) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:units, 32) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:specific_items, 56) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:prio_in_move, 80) {
                number 32, true, -1
            }
            field(:assigned, 88) {
                compound(:ViewscreenLayerMilitaryst_TEquip_TAssigned) {
                    field(:spec, 0) {
                        stl_vector(8) {
                            pointer {
                                global :SquadUniformSpec
                            }
                        }
                    }
                    field(:category, 24) {
                        stl_vector(2) {
                            number 16, true, nil, UniformCategory
                        }
                    }
                    field(:index, 48) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:assigned_items, 160) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:edit_spec, 184) {
                pointer {
                    global :SquadUniformSpec
                }
            }
            field(:uniforms, 192) {
                stl_vector(8) {
                    pointer {
                        global :EntityUniform
                    }
                }
            }
            field(:uniform, 216) {
                compound(:ViewscreenLayerMilitaryst_TEquip_TUniform) {
                    field(:type, 0) {
                        stl_vector(2) {
                            number 16, true, nil, ItemType
                        }
                    }
                    field(:subtype, 24) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:category, 48) {
                        stl_vector(2) {
                            number 16, true, nil, UniformCategory
                        }
                    }
                    field(:index, 72) {
                        stl_vector(2) {
                            number 16, true
                        }
                    }
                    field(:info, 96) {
                        stl_vector(8) {
                            pointer {
                                global :EntityUniformItem
                            }
                        }
                    }
                }
            }
            field(:edit_mode, 336) {
                class ::DFHack::ViewscreenLayerMilitaryst_TEquip_TEditMode < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Armor ; NUME[:Armor] = 0
                    ENUM[1] = :Helm ; NUME[:Helm] = 1
                    ENUM[2] = :Legs ; NUME[:Legs] = 2
                    ENUM[3] = :Gloves ; NUME[:Gloves] = 3
                    ENUM[4] = :Boots ; NUME[:Boots] = 4
                    ENUM[5] = :Shield ; NUME[:Shield] = 5
                    ENUM[6] = :Weapon ; NUME[:Weapon] = 6
                    ENUM[7] = :Material ; NUME[:Material] = 7
                    ENUM[8] = :Color ; NUME[:Color] = 8
                    ENUM[9] = :SpecificArmor ; NUME[:SpecificArmor] = 9
                    ENUM[10] = :SpecificHelm ; NUME[:SpecificHelm] = 10
                    ENUM[11] = :SpecificLegs ; NUME[:SpecificLegs] = 11
                    ENUM[12] = :SpecificGloves ; NUME[:SpecificGloves] = 12
                    ENUM[13] = :SpecificBoots ; NUME[:SpecificBoots] = 13
                    ENUM[14] = :SpecificShield ; NUME[:SpecificShield] = 14
                    ENUM[15] = :SpecificWeapon ; NUME[:SpecificWeapon] = 15
                end

                number 32, true, nil, ViewscreenLayerMilitaryst_TEquip_TEditMode
            }
            field(:unk_1ec, 340) {
            }
            field(:add_item, 344) {
                compound(:ViewscreenLayerMilitaryst_TEquip_TAddItem) {
                    field(:type, 0) {
                        stl_vector(2) {
                            number 16, true, nil, ItemType
                        }
                    }
                    field(:subtype, 24) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:indiv_choice, 48) {
                        stl_vector(4) {
                            global :UniformIndivChoice
                        }
                    }
                    field(:foreign, 72) {
                        stl_bit_vector
                    }
                }
            }
            field(:material, 448) {
                compound(:ViewscreenLayerMilitaryst_TEquip_TMaterial) {
                    field(:generic, 0) {
                        stl_vector(2) {
                            number 16, true, nil, EntityMaterialCategory
                        }
                    }
                    field(:specific, 24) {
                        global :MaterialVecRef
                    }
                }
            }
            field(:color, 520) {
                compound(:ViewscreenLayerMilitaryst_TEquip_TColor) {
                    field(:id, 0) {
                        stl_vector(4) {
                            number 32, true, -1
                        }
                    }
                    def id_tg ; id.map { |i| df.world.raws.descriptors.colors[i] } ; end
                    field(:dye, 24) {
                        stl_bit_vector
                    }
                }
            }
            field(:in_name_uniform, 576) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:ammo, 1024) {
        compound(:ViewscreenLayerMilitaryst_TAmmo) {
            field(:squads, 0) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:in_add_item, 24) {
                number 8, true, nil, BooleanEnum
            }
            field(:in_set_material, 25) {
                number 8, true, nil, BooleanEnum
            }
            field(:add_item, 32) {
                compound(:ViewscreenLayerMilitaryst_TAmmo_TAddItem) {
                    field(:type, 0) {
                        stl_vector(2) {
                            number 16, true, nil, ItemType
                        }
                    }
                    field(:subtype, 24) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:foreign, 48) {
                        stl_bit_vector
                    }
                }
            }
            field(:material, 112) {
                compound(:ViewscreenLayerMilitaryst_TAmmo_TMaterial) {
                    field(:generic, 0) {
                        stl_vector(2) {
                            number 16, true, nil, EntityMaterialCategory
                        }
                    }
                    field(:specific, 24) {
                        global :MaterialVecRef
                    }
                }
            }
        }
    }
    field(:supplies_squads, 1208) {
        stl_vector(8) {
            pointer {
                global :Squad
            }
        }
    }
end

class ViewscreenLayerMusicsoundst < ViewscreenLayer
    sizeof 56

    rtti_classname :viewscreen_layer_musicsoundst

end

class ViewscreenLayerNoblelistst < ViewscreenLayer
    sizeof 184

    rtti_classname :viewscreen_layer_noblelistst

    field(:mode, 56) {
        class ::DFHack::ViewscreenLayerNoblelistst_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :List ; NUME[:List] = 0
            ENUM[1] = :Appoint ; NUME[:Appoint] = 1
            ENUM[2] = :Settings ; NUME[:Settings] = 2
        end

        number 16, true, nil, ViewscreenLayerNoblelistst_TMode
    }
    field(:info, 64) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenLayerNoblelistst_TInfo) {
                    sizeof 48

                    field(:unit, 0) {
                        pointer {
                            global :Unit
                        }
                    }
                    field(:nemesis, 8) {
                        pointer {
                            global :NemesisRecord
                        }
                    }
                    field(:storage_status, 16) {
                        pointer {
                            global :UnitStorageStatus
                        }
                    }
                    field(:position, 24) {
                        pointer {
                            global :EntityPosition
                        }
                    }
                    field(:assignment, 32) {
                        pointer {
                            global :EntityPositionAssignment
                        }
                    }
                    field(:group, 40) {
                        number 32, true, -1
                    }
                    def group_tg ; df.world.entities.all.binsearch(group) ; end
                    field(:precedence, 44) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:candidates, 88) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenLayerNoblelistst_TCandidates) {
                    sizeof 16

                    field(:unit, 0) {
                        pointer {
                            global :Unit
                        }
                    }
                    field(:weight, 8) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:assignments, 112) {
        stl_vector(8) {
            pointer {
                global :EntityPositionAssignment
            }
        }
    }
    field(:histfigs, 136) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfigs_tg ; histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:groups, 160) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def groups_tg ; groups.map { |i| df.world.entities.all.binsearch(i) } ; end
end

class ViewscreenLayerOverallHealthst < ViewscreenLayer
    sizeof 168

    rtti_classname :viewscreen_layer_overall_healthst

    field(:unk_1, 56) {
        number 32, true
    }
    field(:unit, 64) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:bits1, 88) {
        stl_vector(4) {
            global :HealthViewBits1
        }
    }
    field(:bits2, 112) {
        stl_vector(4) {
            global :HealthViewBits2
        }
    }
    field(:bits3, 136) {
        stl_vector(4) {
            global :HealthViewBits3
        }
    }
    field(:x_cursor_pos, 160) {
        number 32, true
    }
end

class ViewscreenLayerReactionst < ViewscreenLayer
    sizeof 112

    rtti_classname :viewscreen_layer_reactionst

    field(:unk_1, 56) {
        pointer {
        }
    }
    field(:unk_2, 64) {
        number 32, true
    }
    field(:unk_3, 72) {
        stl_bit_vector
    }
    field(:unk_4, 104) {
        number 8, true
    }
end

class ViewscreenLayerSquadSchedulest < ViewscreenLayer
    sizeof 208

    rtti_classname :viewscreen_layer_squad_schedulest

    field(:squads, 56) {
        stl_vector(8) {
            pointer {
                global :Squad
            }
        }
    }
    field(:swapped, 80) {
        number 8, true
    }
    field(:page_month, 84) {
        number 32, true
    }
    field(:cur_alert, 88) {
        number 32, true
    }
    field(:in_name_cell, 92) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_give_order, 93) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_edit_order, 94) {
        number 8, true, nil, BooleanEnum
    }
    field(:order_list, 96) {
        pointer {
            global :SquadScheduleEntry
        }
    }
    field(:unk_1, 104) {
        number 32, true
    }
    field(:order_month, 108) {
        number 32, true
    }
    field(:order_type, 112) {
        number 32, true
    }
    field(:burrows, 120) {
        stl_bit_vector
    }
    field(:patrol_route, 152) {
        number 32, true
    }
    field(:min_soldiers, 156) {
        number 32, true
    }
    field(:positions, 160) {
        stl_bit_vector
    }
    field(:station_point, 192) {
        number 32, true
    }
    field(:copy_item, 200) {
        pointer {
            global :SquadScheduleEntry
        }
    }
end

class ViewscreenLayerStockpilest < ViewscreenLayer
    sizeof 224

    rtti_classname :viewscreen_layer_stockpilest

    field(:settings, 56) {
        pointer {
            global :StockpileSettings
        }
    }
    field(:cur_group, 64) {
        number 32, true, nil, StockpileList
    }
    field(:cur_list, 68) {
        number 32, true, nil, StockpileList
    }
    field(:group_ids, 72) {
        stl_vector(4) {
            number 32, true, nil, StockpileList
        }
    }
    field(:group_bits, 96) {
        stl_vector(4) {
            global :StockpileGroupSet
        }
    }
    field(:list_ids, 120) {
        stl_vector(4) {
            number 32, true, nil, StockpileList
        }
    }
    field(:item_names, 144) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:item_status, 168) {
        stl_vector(8) {
            pointer {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:title, 192) {
        stl_string
    }
end

class ViewscreenLayerStoneRestrictionst < ViewscreenLayer
    sizeof 216

    rtti_classname :viewscreen_layer_stone_restrictionst

    field(:stone_type, 56) {
        static_array(2, 24) {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:stone_economic, 104) {
        static_array(2, 24) {
            stl_vector(8) {
                pointer {
                    number 8, true, nil, BooleanEnum
                }
            }
        }
    }
    field(:type_tab, 152) {
        number 32, true
    }
    field(:unk_1, 156) {
        number 32, true
    }
    field(:unk_2, 160) {
        number 32, true
    }
    field(:use_name, 168) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:use_id, 192) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def use_tg ; use_id.map { |i| df.world.raws.reactions.reactions[i] } ; end
end

class ViewscreenLayerUnitActionst < ViewscreenLayer
    sizeof 672

    rtti_classname :viewscreen_layer_unit_actionst

    field(:unit, 56) {
        pointer {
            global :Unit
        }
    }
    field(:held_items, 64) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:reactions, 88) {
        stl_vector(8) {
            pointer {
                global :Reaction
            }
        }
    }
    field(:unk_1, 112) {
        stl_vector
    }
    field(:group_name, 136) {
        stl_string
    }
    field(:choice_items, 168) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:sel_items, 192) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:sel_reagents, 216) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:cur_reaction, 240) {
        pointer {
            global :Reaction
        }
    }
    field(:reagent, 248) {
        number 32, true, -1
    }
    field(:reagent_amnt_left, 252) {
        number 32, true
    }
    field(:unk_2, 256) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_3, 280) {
        number 32, true
    }
    field(:unk_4, 284) {
        number 32, true
    }
    field(:unk_5, 288) {
        number 32, true
    }
    field(:unk_6, 296) {
        stl_vector
    }
    field(:unk_7, 320) {
        stl_vector
    }
    field(:unk_8, 344) {
        stl_vector
    }
    field(:unk_9, 368) {
        stl_vector
    }
    field(:unk_10, 392) {
        stl_vector
    }
    field(:unk_11, 416) {
        stl_vector
    }
    field(:unk_12, 440) {
        stl_vector
    }
    field(:unk_13, 464) {
        stl_vector
    }
    field(:unk_14, 488) {
        stl_vector
    }
    field(:unk_15, 512) {
        stl_vector
    }
    field(:unk_16, 536) {
        stl_vector
    }
    field(:unk_17, 560) {
        stl_vector
    }
    field(:unk_20, 584) {
        number 32, true
    }
    field(:unk_21, 592) {
        pointer {
        }
    }
    field(:unk_22, 600) {
        stl_vector
    }
    field(:unk_23, 624) {
        stl_vector
    }
    field(:unk_24, 648) {
        stl_vector
    }
end

class ViewscreenLayerUnitHealthst < ViewscreenLayer
    sizeof 512

    rtti_classname :viewscreen_layer_unit_healthst

    field(:diagnosis_skill, 56) {
        number 32, true, nil, SkillRating
    }
    field(:unit, 64) {
        pointer {
            global :Unit
        }
    }
    field(:page, 72) {
        number 16, true
    }
    field(:title, 80) {
        stl_string
    }
    field(:text, 112) {
        static_array(4, 24) {
            stl_vector(8) {
                pointer {
                    stl_string
                }
            }
        }
    }
    field(:text_fg, 208) {
        static_array(4, 24) {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:text_bg, 304) {
        static_array(4, 24) {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:text_bold, 400) {
        static_array(4, 24) {
            stl_vector(2) {
                number 16, true
            }
        }
    }
    field(:unk_1, 496) {
        number 32, true
    }
    field(:unk_2, 500) {
        number 32, true
    }
    field(:unk_3, 504) {
        number 32, true
    }
    field(:unk_4, 508) {
        number 32, true
    }
end

class ViewscreenLayerUnitRelationshipst < ViewscreenLayer
    sizeof 256

    rtti_classname :viewscreen_layer_unit_relationshipst

    field(:unit, 56) {
        pointer {
            global :Unit
        }
    }
    field(:relation_textline, 64) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:relation_unit_type, 88) {
        stl_vector(2) {
            number 16, true, nil, UnitRelationshipType
        }
    }
    field(:relation_histfig_type, 112) {
        stl_vector(2) {
            number 16, true, nil, HistfigRelationshipType
        }
    }
    field(:relation_unit, 136) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:relation_hf, 160) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_1, 184) {
        stl_vector
    }
    field(:unk_2, 208) {
        stl_vector
    }
    field(:level, 232) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class ViewscreenLayerWorldGenParamPresetst < ViewscreenLayer
    sizeof 192

    rtti_classname :viewscreen_layer_world_gen_param_presetst

    field(:unk_1, 56) {
        pointer {
        }
    }
    field(:unk_2, 64) {
        number 32, true
    }
    field(:unk_3, 68) {
        number 32, true
    }
    field(:unk_4, 72) {
        stl_string
    }
    field(:unk_5, 104) {
        static_array(24, 2) {
            number 16, true
        }
    }
    field(:unk_6, 152) {
        static_array(24, 1) {
            number 8, true
        }
    }
    field(:unk_7, 176) {
        number 32, true
    }
    field(:unk_8, 180) {
        number 16, true
    }
    field(:unk_9, 182) {
        number 16, true
    }
    field(:unk_10, 184) {
        number 16, true
    }
    field(:unk_11, 186) {
        number 16, true
    }
end

class ViewscreenLayerWorldGenParamst < ViewscreenLayer
    sizeof 320

    rtti_classname :viewscreen_layer_world_gen_paramst

    field(:parms, 56) {
        pointer {
            global :WorldgenParms
        }
    }
    field(:unk_1, 64) {
        stl_string
    }
    field(:controls, 96) {
        stl_vector(8) {
            pointer {
                global :WorldGenParamBasest
            }
        }
    }
    field(:ps, 120) {
        global :WorldgenParmsPs
    }
end

class ViewscreenLegendsst < Viewscreen
    sizeof 928

    rtti_classname :viewscreen_legendsst

    field(:unk_1, 32) {
        number 32, true
    }
    field(:init_step, 36) {
        number 32, true
    }
    field(:init_era, 40) {
        number 32, true
    }
    field(:unk_2, 44) {
        number 32, true
    }
    field(:unk_3, 48) {
        number 32, true
    }
    field(:init_progress, 52) {
        number 32, true
    }
    field(:histfigs, 56) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def histfigs_tg ; histfigs.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:sites, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def sites_tg ; sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:artifacts, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def artifacts_tg ; artifacts.map { |i| df.world.artifacts.all.binsearch(i) } ; end
    field(:codices, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:regions, 152) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:layers, 176) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:entities, 200) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def entities_tg ; entities.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:structure_sites, 224) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def structure_sites_tg ; structure_sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:structures_indices, 248) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_4, 272) {
        stl_vector
    }
    field(:header_text, 296) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:event_collections, 320) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def event_collections_tg ; event_collections.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
    field(:unk_5, 344) {
        stl_bit_vector
    }
    field(:events, 376) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def events_tg ; events.map { |i| df.world.history.events.binsearch(i) } ; end
    field(:events_text, 400) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:stack_collections, 424) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def stack_collections_tg ; stack_collections.map { |i| df.world.history.event_collections.all.binsearch(i) } ; end
    field(:stack_cursor, 448) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:collection_name, 472) {
        stl_string
    }
    field(:cur_page, 504) {
        class ::DFHack::ViewscreenLegendsst_TCurPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Main ; NUME[:Main] = 0
            ENUM[1] = :HistoricalFigures ; NUME[:HistoricalFigures] = 1
            ENUM[2] = :Sites ; NUME[:Sites] = 2
            ENUM[3] = :Artifacts ; NUME[:Artifacts] = 3
            ENUM[4] = :Books ; NUME[:Books] = 4
            ENUM[5] = :Regions ; NUME[:Regions] = 5
            ENUM[6] = :Civilizations ; NUME[:Civilizations] = 6
            ENUM[7] = :Art ; NUME[:Art] = 7
            ENUM[8] = :Structures ; NUME[:Structures] = 8
            ENUM[9] = :Age ; NUME[:Age] = 9
            ENUM[10] = :HistoricalMaps ; NUME[:HistoricalMaps] = 10
            ENUM[11] = :UndergroundRegions ; NUME[:UndergroundRegions] = 11
            ENUM[12] = :Populations ; NUME[:Populations] = 12
        end

        number 16, true, nil, ViewscreenLegendsst_TCurPage
    }
    field(:unk_6, 508) {
        number 32, true
    }
    field(:main_cursor, 512) {
        number 32, true
    }
    field(:main_row_type, 520) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:main_row_arg1, 544) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:main_row_arg2, 568) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:main_row_arg3, 592) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:sub_cursor, 616) {
        number 32, true
    }
    field(:important_events_only, 620) {
        number 8, true
    }
    field(:unk_7, 624) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenLegendsst_TUnk7) {
                    sizeof 48

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        pointer {
                            compound(:ViewscreenLegendsst_TUnk7_TUnk3) {
                                sizeof 40

                                field(:unk_1, 0) {
                                    pointer {
                                    }
                                }
                                field(:unk_2, 8) {
                                    pointer {
                                    }
                                }
                                field(:unk_3, 16) {
                                    pointer {
                                    }
                                }
                                field(:unk_4, 24) {
                                    pointer {
                                    }
                                }
                                field(:unk_5, 32) {
                                    pointer {
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_4, 16) {
                        number 16, true
                    }
                    field(:unk_5, 18) {
                        number 16, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:map_x, 648) {
        number 16, true
    }
    field(:map_y, 650) {
        number 16, true
    }
    field(:hide_territories, 652) {
        number 16, true
    }
    field(:civ_site_mode, 654) {
        number 16, true
    }
    field(:decade, 656) {
        number 16, true
    }
    field(:filter_text, 664) {
        stl_string
    }
    field(:filter_editing, 696) {
        number 8, true
    }
    field(:histfigs_filtered, 704) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:sites_filtered, 728) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:artifacts_filtered, 752) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:codices_filtered, 776) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:regions_filtered, 800) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:layers_filtered, 824) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_8, 848) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:entities_filtered, 872) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:structures_filtered, 896) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:total_codices, 920) {
        number 32, true
    }
    field(:total_artifacts, 924) {
        number 32, true
    }
end

class ViewscreenLoadgamest < Viewscreen
    sizeof 1376

    rtti_classname :viewscreen_loadgamest

    field(:cur_step, 32) {
        class ::DFHack::ViewscreenLoadgamest_TCurStep < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :OpeningFile ; NUME[:OpeningFile] = 0
            ENUM[1] = :ProcessingRawData ; NUME[:ProcessingRawData] = 1
            ENUM[2] = :AllocatingSpace ; NUME[:AllocatingSpace] = 2
            ENUM[3] = :LoadingItems ; NUME[:LoadingItems] = 3
            ENUM[4] = :LoadingUnits ; NUME[:LoadingUnits] = 4
            ENUM[5] = :LoadingJobs ; NUME[:LoadingJobs] = 5
            ENUM[6] = :LoadingSchedules ; NUME[:LoadingSchedules] = 6
            ENUM[7] = :LoadingProjectiles ; NUME[:LoadingProjectiles] = 7
            ENUM[8] = :LoadingBuildings ; NUME[:LoadingBuildings] = 8
            ENUM[9] = :LoadingMachines ; NUME[:LoadingMachines] = 9
            ENUM[10] = :LoadingFlowGuides ; NUME[:LoadingFlowGuides] = 10
            ENUM[11] = :LoadingEffects ; NUME[:LoadingEffects] = 11
            ENUM[12] = :LoadingEntities ; NUME[:LoadingEntities] = 12
            ENUM[13] = :LoadingLocalAnimalPopulations ; NUME[:LoadingLocalAnimalPopulations] = 13
            ENUM[14] = :LoadingEvents ; NUME[:LoadingEvents] = 14
            ENUM[15] = :LoadingMandates ; NUME[:LoadingMandates] = 15
            ENUM[16] = :LoadingWorkQuotas ; NUME[:LoadingWorkQuotas] = 16
            ENUM[17] = :LoadingWorldEvents ; NUME[:LoadingWorldEvents] = 17
            ENUM[18] = :LoadingCoinInformation ; NUME[:LoadingCoinInformation] = 18
            ENUM[19] = :LoadingSquads ; NUME[:LoadingSquads] = 19
            ENUM[20] = :LoadingFormations ; NUME[:LoadingFormations] = 20
            ENUM[21] = :LoadingActivities ; NUME[:LoadingActivities] = 21
            ENUM[22] = :LoadingInteractions ; NUME[:LoadingInteractions] = 22
            ENUM[23] = :LoadingWrittenContent ; NUME[:LoadingWrittenContent] = 23
            ENUM[24] = :LoadingIdentities ; NUME[:LoadingIdentities] = 24
            ENUM[25] = :LoadingIncidents ; NUME[:LoadingIncidents] = 25
            ENUM[26] = :LoadingCrimes ; NUME[:LoadingCrimes] = 26
            ENUM[27] = :LoadingVehicles ; NUME[:LoadingVehicles] = 27
            ENUM[28] = :LoadingArmies ; NUME[:LoadingArmies] = 28
            ENUM[29] = :LoadingArmyControllers ; NUME[:LoadingArmyControllers] = 29
            ENUM[30] = :LoadingTrackingInformation ; NUME[:LoadingTrackingInformation] = 30
            ENUM[31] = :LoadingCulturalIdentities ; NUME[:LoadingCulturalIdentities] = 31
            ENUM[32] = :LoadingAgreements ; NUME[:LoadingAgreements] = 32
            ENUM[33] = :LoadingArtForms ; NUME[:LoadingArtForms] = 33
            ENUM[34] = :LoadingOccupations ; NUME[:LoadingOccupations] = 34
            ENUM[35] = :LoadingBeliefSystems ; NUME[:LoadingBeliefSystems] = 35
            ENUM[36] = :LoadingImageSets ; NUME[:LoadingImageSets] = 36
            ENUM[37] = :LoadingDivinationSets ; NUME[:LoadingDivinationSets] = 37
            ENUM[38] = :LoadingAnnouncements ; NUME[:LoadingAnnouncements] = 38
            ENUM[39] = :LoadingFortressInformation ; NUME[:LoadingFortressInformation] = 39
            ENUM[40] = :LoadingWorldInformation ; NUME[:LoadingWorldInformation] = 40
            ENUM[41] = :LoadingArtifacts ; NUME[:LoadingArtifacts] = 41
            ENUM[42] = :LoadingActiveHistoricalFigures ; NUME[:LoadingActiveHistoricalFigures] = 42
            ENUM[43] = :LoadingAdventure ; NUME[:LoadingAdventure] = 43
            ENUM[44] = :LoadingGeneralInformation ; NUME[:LoadingGeneralInformation] = 44
            ENUM[45] = :ClosingFile ; NUME[:ClosingFile] = 45
            ENUM[46] = :RebuildingTemporaryInformation ; NUME[:RebuildingTemporaryInformation] = 46
            ENUM[47] = :RebuildingMoreTemporaryInformation ; NUME[:RebuildingMoreTemporaryInformation] = 47
            ENUM[48] = :PreparingGameScreen ; NUME[:PreparingGameScreen] = 48
            ENUM[49] = :HandlingCompatibilityIssues ; NUME[:HandlingCompatibilityIssues] = 49
            ENUM[50] = :Finishing ; NUME[:Finishing] = 50
        end

        number 32, true, nil, ViewscreenLoadgamest_TCurStep
    }
    field(:progress, 36) {
        number 32, true
    }
    field(:loading, 40) {
        number 8, true
    }
    field(:sel_idx, 44) {
        number 32, true
    }
    field(:saves, 48) {
        stl_vector(8) {
            pointer {
                global :LoadgameSaveInfo
            }
        }
    }
    field(:compressor, 72) {
        global :FileCompressorst
    }
    field(:glosses, 400) {
        global :MatglossList
    }
    field(:save_version, 1096) {
        number 32, true
    }
    field(:cur_save, 1104) {
        global :LoadgameSaveInfo
    }
end

class ViewscreenLocationsst < Viewscreen
    sizeof 312

    rtti_classname :viewscreen_locationsst

    field(:locations, 32) {
        stl_vector(8) {
            pointer {
                global :AbstractBuilding
            }
        }
    }
    field(:dance_floor_x, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:dance_floor_y, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:location_idx, 128) {
        number 32, true
    }
    field(:occupations, 136) {
        stl_vector(8) {
            pointer {
                global :Occupation
            }
        }
    }
    field(:unk_2, 160) {
        stl_vector
    }
    field(:unk_3, 184) {
        stl_vector
    }
    field(:unk_4, 208) {
        stl_vector
    }
    field(:occupation_idx, 232) {
        number 32, true
    }
    field(:units, 240) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:unit_idx, 264) {
        number 32, true
    }
    field(:in_edit, 268) {
        class ::DFHack::ViewscreenLocationsst_TInEdit < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :None ; NUME[:None] = 0
            ENUM[1] = :Goblets ; NUME[:Goblets] = 1
            ENUM[2] = :Instruments ; NUME[:Instruments] = 2
            ENUM[3] = :WritingCopies ; NUME[:WritingCopies] = 3
            ENUM[4] = :WritingMaterial ; NUME[:WritingMaterial] = 4
        end

        number 32, true, nil, ViewscreenLocationsst_TInEdit
    }
    field(:edit_input, 272) {
        stl_string
    }
    field(:menu, 304) {
        class ::DFHack::ViewscreenLocationsst_TMenu < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Locations ; NUME[:Locations] = 0
            ENUM[1] = :Occupations ; NUME[:Occupations] = 1
            ENUM[2] = :AssignOccupation ; NUME[:AssignOccupation] = 2
        end

        number 32, true, nil, ViewscreenLocationsst_TMenu
    }
end

class ViewscreenMeetingst < Viewscreen
    sizeof 56

    rtti_classname :viewscreen_meetingst

    field(:dipscript_popup, 32) {
        pointer {
            global :DipscriptPopup
        }
    }
    field(:activity, 40) {
        pointer {
            global :ActivityInfo
        }
    }
    field(:holder, 48) {
        pointer {
            global :Unit
        }
    }
end

class ViewscreenMovieplayerst < Viewscreen
    sizeof 168

    rtti_classname :viewscreen_movieplayerst

    field(:saving, 32) {
        number 8, true
    }
    field(:loading, 33) {
        number 8, true
    }
    field(:editing, 34) {
        number 8, true
    }
    field(:text_mode, 35) {
        number 8, true
    }
    field(:editing_char, 36) {
        number 8, false
    }
    field(:editing_copy_from, 40) {
        number 32, true
    }
    field(:editing_screenf, 44) {
        number 16, true
    }
    field(:editing_screenb, 46) {
        number 16, true
    }
    field(:editing_screenbright, 48) {
        number 16, true
    }
    field(:editing_selected_sound, 52) {
        number 32, true
    }
    field(:editing_menu, 56) {
        number 8, true
    }
    field(:savename, 64) {
        stl_string
    }
    field(:force_file, 96) {
        stl_string
    }
    field(:is_playing, 128) {
        number 8, true
    }
    field(:is_forced_play, 129) {
        number 8, true
    }
    field(:quit_if_no_play, 130) {
        number 8, true
    }
    field(:maxmoviepos, 132) {
        number 32, true
    }
    field(:end_frame_pos, 136) {
        number 32, true
    }
    field(:selfile, 140) {
        number 32, true
    }
    field(:filelist, 144) {
        stl_vector(8) {
            pointer {
                static_string(-1)
            }
        }
    }
end

class ViewscreenNewRegionst < Viewscreen
    sizeof 248

    rtti_classname :viewscreen_new_regionst

    field(:worldgen_presets, 32) {
        stl_vector(8) {
            pointer {
                global :WorldgenParms
            }
        }
    }
    field(:start_in_advanced_mode, 56) {
        number 8, true, nil, BooleanEnum
    }
    field(:in_worldgen, 57) {
        number 8, true, nil, BooleanEnum
    }
    field(:cursor_paramset, 60) {
        number 32, true
    }
    field(:random_seed, 64) {
        stl_string
    }
    field(:editing_randseed, 96) {
        number 8, true, nil, BooleanEnum
    }
    field(:editing_customname, 97) {
        number 8, true, nil, BooleanEnum
    }
    field(:editing_title, 98) {
        number 8, true, nil, BooleanEnum
    }
    field(:popup_deleteset, 99) {
        number 8, true, nil, BooleanEnum
    }
    field(:popup_changedimensions, 100) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_11, 101) {
        number 8, true, nil, BooleanEnum
    }
    field(:custom_size_x, 102) {
        number 16, false
    }
    field(:custom_size_y, 104) {
        number 16, false
    }
    field(:popup_abort, 106) {
        number 8, true, nil, BooleanEnum
    }
    field(:popup_goon, 107) {
        number 8, true, nil, BooleanEnum
    }
    field(:unsaved_changes, 108) {
        number 8, true, nil, BooleanEnum
    }
    field(:simple_mode, 109) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_20, 110) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_21, 111) {
        number 8, true, nil, BooleanEnum
    }
    field(:cursor_line, 112) {
        number 32, true
    }
    field(:world_size, 116) {
        number 32, true
    }
    field(:history, 120) {
        number 32, true
    }
    field(:number_civs, 124) {
        number 32, true
    }
    field(:number_sites, 128) {
        number 32, true
    }
    field(:number_beasts, 132) {
        number 32, true
    }
    field(:savagery, 136) {
        number 32, true
    }
    field(:mineral_occurence, 140) {
        number 32, true
    }
    field(:worldgen_paused, 144) {
        number 8, true, nil, BooleanEnum
    }
    field(:worldgen_rejected, 145) {
        number 8, true, nil, BooleanEnum
    }
    field(:rejection_msg, 152) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:welcome_msg, 176) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:raw_folder, 200) {
        stl_string
    }
    field(:load_world_params, 232) {
        number 8, true, nil, BooleanEnum
    }
    field(:load_progress, 236) {
        number 32, true
    }
    field(:load_state, 240) {
        class ::DFHack::ViewscreenNewRegionst_TLoadState < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Initializing ; NUME[:Initializing] = 0
            ENUM[1] = :LoadingObjectFiles ; NUME[:LoadingObjectFiles] = 1
            ENUM[2] = :FinalizingLanguages ; NUME[:FinalizingLanguages] = 2
            ENUM[3] = :FinalizingDescriptors ; NUME[:FinalizingDescriptors] = 3
            ENUM[4] = :FinalizingMaterialTemplates ; NUME[:FinalizingMaterialTemplates] = 4
            ENUM[5] = :FinalizingInorganics ; NUME[:FinalizingInorganics] = 5
            ENUM[6] = :FinalizingPlants ; NUME[:FinalizingPlants] = 6
            ENUM[7] = :FinalizingTissueTemplates ; NUME[:FinalizingTissueTemplates] = 7
            ENUM[8] = :FinalizingItems ; NUME[:FinalizingItems] = 8
            ENUM[9] = :FinalizingBuildings ; NUME[:FinalizingBuildings] = 9
            ENUM[10] = :FinalizingBodyDetailPlans ; NUME[:FinalizingBodyDetailPlans] = 10
            ENUM[11] = :FinalizingCreatureVariations ; NUME[:FinalizingCreatureVariations] = 11
            ENUM[12] = :FinalizingCreatures ; NUME[:FinalizingCreatures] = 12
            ENUM[13] = :FinalizingEntities ; NUME[:FinalizingEntities] = 13
            ENUM[14] = :FinalizingReactions ; NUME[:FinalizingReactions] = 14
            ENUM[15] = :FinalizingInteractions ; NUME[:FinalizingInteractions] = 15
            ENUM[16] = :PreparingMaterialData ; NUME[:PreparingMaterialData] = 16
            ENUM[17] = :PreparingTextObjects ; NUME[:PreparingTextObjects] = 17
            ENUM[18] = :PreparingGraphics ; NUME[:PreparingGraphics] = 18
            ENUM[19] = :Finalizing ; NUME[:Finalizing] = 19
        end

        number 32, true, nil, ViewscreenNewRegionst_TLoadState
    }
end

class ViewscreenNoblest < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_noblest

    field(:become_capital_offerings, 32) {
        number 32, true
    }
end

class ViewscreenOptionst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_optionst

    field(:msg_quit, 32) {
        number 8, true
    }
    field(:in_retire_adv, 33) {
        number 8, true
    }
    field(:msg_peasant, 34) {
        number 8, true
    }
    field(:in_retire_dwf_abandon_adv, 35) {
        number 8, true
    }
    field(:in_abandon_dwf, 36) {
        number 8, true
    }
    field(:ending_game, 37) {
        number 8, true
    }
    field(:sel_idx, 40) {
        number 32, true
    }
    field(:options, 48) {
        stl_vector(4) {
            class ::DFHack::ViewscreenOptionst_TOptions < MemHack::Enum
                ENUM = Hash.new
                NUME = Hash.new
                ENUM[0] = :Return ; NUME[:Return] = 0
                ENUM[1] = :Save ; NUME[:Save] = 1
                ENUM[2] = :KeyBindings ; NUME[:KeyBindings] = 2
                ENUM[3] = :ExportImage ; NUME[:ExportImage] = 3
                ENUM[4] = :MusicSound ; NUME[:MusicSound] = 4
                ENUM[5] = :AbortRetire ; NUME[:AbortRetire] = 5
                ENUM[6] = :Abandon ; NUME[:Abandon] = 6
            end

            number 32, true, nil, ViewscreenOptionst_TOptions
        }
    }
end

class ViewscreenOverallstatusst < Viewscreen
    sizeof 64

    rtti_classname :viewscreen_overallstatusst

    field(:visible_pages, 32) {
        stl_vector(2) {
            class ::DFHack::ViewscreenOverallstatusst_TVisiblePages < MemHack::Enum
                ENUM = Hash.new
                NUME = Hash.new
                ENUM[0] = :Animals ; NUME[:Animals] = 0
                ENUM[1] = :Kitchen ; NUME[:Kitchen] = 1
                ENUM[2] = :Stone ; NUME[:Stone] = 2
                ENUM[3] = :Stocks ; NUME[:Stocks] = 3
                ENUM[4] = :Health ; NUME[:Health] = 4
                ENUM[5] = :Prices ; NUME[:Prices] = 5
                ENUM[6] = :Currency ; NUME[:Currency] = 6
                ENUM[7] = :Justice ; NUME[:Justice] = 7
            end

            number 16, true, nil, ViewscreenOverallstatusst_TVisiblePages
        }
    }
    field(:page_cursor, 56) {
        number 32, true
    }
end

class ViewscreenPetitionsst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_petitionsst

    field(:can_manage, 32) {
        number 8, true
    }
    field(:list, 40) {
        stl_vector(8) {
            pointer {
                global :Agreement
            }
        }
    }
    field(:cursor, 64) {
        number 32, true
    }
end

class ViewscreenPetst < Viewscreen
    sizeof 224

    rtti_classname :viewscreen_petst

    field(:cursor, 32) {
        number 32, true
    }
    field(:animal, 40) {
        stl_vector(8) {
            compound(:ViewscreenPetst_TAnimal) {
                field(:unit, 0) {
                    pointer {
                        global :Unit
                    }
                }
                field(:item, 0) {
                    pointer {
                        global :Item
                    }
                }
            }
        }
    }
    field(:is_vermin, 64) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:is_tame, 88) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:is_adopting, 112) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:mode, 136) {
        class ::DFHack::ViewscreenPetst_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :List ; NUME[:List] = 0
            ENUM[1] = :TrainingKnowledge ; NUME[:TrainingKnowledge] = 1
            ENUM[2] = :SelectTrainer ; NUME[:SelectTrainer] = 2
        end

        number 32, true, nil, ViewscreenPetst_TMode
    }
    field(:knowledge_page, 140) {
        number 32, true
    }
    field(:known, 144) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def known_tg ; known.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:trainer_cursor, 168) {
        number 32, true
    }
    field(:trainer_unit, 176) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:trainer_mode, 200) {
        stl_vector(4) {
            class ::DFHack::ViewscreenPetst_TTrainerMode < MemHack::Enum
                ENUM = Hash.new
                NUME = Hash.new
                ENUM[0] = :Any ; NUME[:Any] = 0
                ENUM[1] = :AnyUnassigned ; NUME[:AnyUnassigned] = 1
                ENUM[2] = :None ; NUME[:None] = 2
                ENUM[3] = :Unit ; NUME[:Unit] = 3
            end

            number 32, true, nil, ViewscreenPetst_TTrainerMode
        }
    }
end

class ViewscreenPricest < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_pricest

    field(:category_idx, 32) {
        number 16, true
    }
    field(:item_idx, 36) {
        number 32, true
    }
end

class ViewscreenReportlistst < Viewscreen
    sizeof 352

    rtti_classname :viewscreen_reportlistst

    field(:units, 32) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:types, 56) {
        stl_vector(2) {
            number 16, true, nil, UnitReportType
        }
    }
    field(:last_id, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def last_tg ; last_id.map { |i| df.world.status.reports.binsearch(i) } ; end
    field(:mission_reports, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:spoils_reports, 128) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:unk_1, 152) {
        stl_vector
    }
    field(:cursor, 176) {
        number 32, true
    }
    field(:mission_report, 184) {
        pointer {
            global :MissionReport
        }
    }
    field(:map_cursor_x, 192) {
        number 32, true
    }
    field(:map_cursor_y, 196) {
        number 32, true
    }
    field(:mission_path_finished, 200) {
        number 32, true
    }
    field(:mission_path_progress, 204) {
        number 32, true
    }
    field(:mission_text_finished, 208) {
        number 32, true
    }
    field(:mission_text_progress, 212) {
        number 32, true
    }
    field(:mission_report_text, 216) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:mission_report_colors, 240) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:mission_year, 264) {
        number 32, true
    }
    field(:mission_year_tick, 268) {
        number 32, true
    }
    field(:mission_path_speed, 272) {
        number 32, true
    }
    field(:mission_report_paused, 276) {
        number 8, true, nil, BooleanEnum
    }
    field(:mission_report_fade, 280) {
        number 32, true
    }
    field(:mission_report_fade_line, 284) {
        number 32, true
    }
    field(:mission_report_scroll, 288) {
        number 32, true
    }
    field(:spoils_report_title, 296) {
        pointer {
            stl_string
        }
    }
    field(:spoils_report_scroll, 304) {
        number 32, true
    }
    field(:unk_2, 312) {
        pointer {
        }
    }
    field(:unk_3, 320) {
        stl_vector
    }
    field(:unk_4, 344) {
        number 32, true
    }
end

class ViewscreenRequestagreementst < Viewscreen
    sizeof 312

    rtti_classname :viewscreen_requestagreementst

    field(:requests, 32) {
        pointer {
            global :EntityBuyPrices
        }
    }
    field(:civ_id, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:cursor, 44) {
        number 32, true
    }
    field(:title, 48) {
        static_string(256)
    }
    field(:civ, 304) {
        pointer {
            global :HistoricalEntity
        }
    }
end

class ViewscreenSavegamest < Viewscreen
    sizeof 488

    rtti_classname :viewscreen_savegamest

    field(:unk_1, 32) {
        stl_string
    }
    field(:cur_step, 64) {
        class ::DFHack::ViewscreenSavegamest_TCurStep < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Initializing ; NUME[:Initializing] = 0
            ENUM[1] = :CheckingDirectoryStructure ; NUME[:CheckingDirectoryStructure] = 1
            ENUM[2] = :PreliminaryCleaning ; NUME[:PreliminaryCleaning] = 2
            ENUM[3] = :OffloadingUnits ; NUME[:OffloadingUnits] = 3
            ENUM[4] = :OffloadingArt ; NUME[:OffloadingArt] = 4
            ENUM[5] = :OpeningFile ; NUME[:OpeningFile] = 5
            ENUM[6] = :CharacterizingRawData ; NUME[:CharacterizingRawData] = 6
            ENUM[7] = :AllocatingSpace ; NUME[:AllocatingSpace] = 7
            ENUM[8] = :SavingItems ; NUME[:SavingItems] = 8
            ENUM[9] = :SavingUnits ; NUME[:SavingUnits] = 9
            ENUM[10] = :SavingJobs ; NUME[:SavingJobs] = 10
            ENUM[11] = :SavingSchedules ; NUME[:SavingSchedules] = 11
            ENUM[12] = :SavingProjectiles ; NUME[:SavingProjectiles] = 12
            ENUM[13] = :SavingBuildings ; NUME[:SavingBuildings] = 13
            ENUM[14] = :SavingMachines ; NUME[:SavingMachines] = 14
            ENUM[15] = :SavingFlowGuides ; NUME[:SavingFlowGuides] = 15
            ENUM[16] = :SavingEffects ; NUME[:SavingEffects] = 16
            ENUM[17] = :SavingEntities ; NUME[:SavingEntities] = 17
            ENUM[18] = :SavingLocalAnimalPopulations ; NUME[:SavingLocalAnimalPopulations] = 18
            ENUM[19] = :SavingEvents ; NUME[:SavingEvents] = 19
            ENUM[20] = :SavingMandates ; NUME[:SavingMandates] = 20
            ENUM[21] = :SavingWorkQuotas ; NUME[:SavingWorkQuotas] = 21
            ENUM[22] = :SavingWorldEvents ; NUME[:SavingWorldEvents] = 22
            ENUM[23] = :SavingCoinInformation ; NUME[:SavingCoinInformation] = 23
            ENUM[24] = :SavingSquads ; NUME[:SavingSquads] = 24
            ENUM[25] = :SavingFormations ; NUME[:SavingFormations] = 25
            ENUM[26] = :SavingActivities ; NUME[:SavingActivities] = 26
            ENUM[27] = :SavingInteractions ; NUME[:SavingInteractions] = 27
            ENUM[28] = :SavingWrittenContent ; NUME[:SavingWrittenContent] = 28
            ENUM[29] = :SavingIdentities ; NUME[:SavingIdentities] = 29
            ENUM[30] = :SavingIncidents ; NUME[:SavingIncidents] = 30
            ENUM[31] = :SavingCrimes ; NUME[:SavingCrimes] = 31
            ENUM[32] = :SavingVehicles ; NUME[:SavingVehicles] = 32
            ENUM[33] = :SavingArmies ; NUME[:SavingArmies] = 33
            ENUM[34] = :SavingArmyControllers ; NUME[:SavingArmyControllers] = 34
            ENUM[35] = :SavingTrackingInformation ; NUME[:SavingTrackingInformation] = 35
            ENUM[36] = :SavingCulturalIdentities ; NUME[:SavingCulturalIdentities] = 36
            ENUM[37] = :SavingAgreement ; NUME[:SavingAgreement] = 37
            ENUM[38] = :SavingArtForms ; NUME[:SavingArtForms] = 38
            ENUM[39] = :SavingOccupations ; NUME[:SavingOccupations] = 39
            ENUM[40] = :SavingBeliefSystems ; NUME[:SavingBeliefSystems] = 40
            ENUM[41] = :SavingImageSets ; NUME[:SavingImageSets] = 41
            ENUM[42] = :SavingDivinationSets ; NUME[:SavingDivinationSets] = 42
            ENUM[43] = :SavingAnnouncements ; NUME[:SavingAnnouncements] = 43
            ENUM[44] = :SavingFortressInformation ; NUME[:SavingFortressInformation] = 44
            ENUM[45] = :SavingWorldInformation ; NUME[:SavingWorldInformation] = 45
            ENUM[46] = :SavingArtifacts ; NUME[:SavingArtifacts] = 46
            ENUM[47] = :SavingActiveHistoricalFigures ; NUME[:SavingActiveHistoricalFigures] = 47
            ENUM[48] = :SavingAdventureData ; NUME[:SavingAdventureData] = 48
            ENUM[49] = :SavingGeneralInformation ; NUME[:SavingGeneralInformation] = 49
            ENUM[50] = :ClosingFile ; NUME[:ClosingFile] = 50
            ENUM[51] = :Finishing ; NUME[:Finishing] = 51
        end

        number 32, true, nil, ViewscreenSavegamest_TCurStep
    }
    field(:progress, 68) {
        number 32, true
    }
    field(:offload, 72) {
        global :NemesisOffload
    }
    field(:compressor, 160) {
        global :FileCompressorst
    }
end

class ViewscreenSelectitemst < Viewscreen
    sizeof 3464

    rtti_classname :viewscreen_selectitemst

    field(:p_item_type, 32) {
        pointer {
            number 16, true
        }
    }
    field(:p_item_subtype, 40) {
        pointer {
            number 16, true
        }
    }
    field(:p_mattype, 48) {
        pointer {
            number 16, true
        }
    }
    field(:p_matindex, 56) {
        pointer {
            number 32, true
        }
    }
    field(:choice, 64) {
        pointer {
            global :EmbarkItemChoice
        }
    }
    field(:screen, 72) {
        pointer {
            global :ViewscreenSetupdwarfgamest
        }
    }
    field(:unk_1, 80) {
        pointer {
        }
    }
    field(:page_base, 88) {
        static_array(107, 24, EntitySellCategory) {
            stl_vector(4) {
                number 32, true
            }
        }
    }
    field(:title, 2656) {
        static_string(256)
    }
    field(:unk_2, 2912) {
        static_string(256)
    }
    field(:filter, 3168) {
        static_string(256)
    }
    field(:right_pos, 3424) {
        number 32, true
    }
    field(:right_page_base, 3428) {
        number 32, true
    }
    field(:right_list, 3432) {
        number 8, true, nil, BooleanEnum
    }
    field(:sel_category, 3436) {
        number 32, true, -1
    }
    field(:categories, 3440) {
        stl_vector(2) {
            number 16, true, nil, EntitySellCategory
        }
    }
end

class ViewscreenSetupadventurest < Viewscreen
    sizeof 328

    rtti_classname :viewscreen_setupadventurest

    field(:page, 32) {
        class ::DFHack::ViewscreenSetupadventurest_TPage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :ChooseRace ; NUME[:ChooseRace] = 0
            ENUM[1] = :ChooseAnimalRace ; NUME[:ChooseAnimalRace] = 1
            ENUM[2] = :ChooseHistfig ; NUME[:ChooseHistfig] = 2
            ENUM[3] = :ChooseCiv ; NUME[:ChooseCiv] = 3
            ENUM[4] = :Skills ; NUME[:Skills] = 4
            ENUM[5] = :Appearance ; NUME[:Appearance] = 5
            ENUM[6] = :Personality ; NUME[:Personality] = 6
            ENUM[7] = :Background ; NUME[:Background] = 7
            ENUM[8] = :Equipment ; NUME[:Equipment] = 8
            ENUM[9] = :MountsAndPets ; NUME[:MountsAndPets] = 9
        end

        number 32, true, nil, ViewscreenSetupadventurest_TPage
    }
    field(:races_info, 40) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenSetupadventurest_TRacesInfo) {
                    sizeof 16

                    field(:race, 0) {
                        number 32, true, -1
                    }
                    def race_tg ; df.world.raws.creatures.all[race] ; end
                    field(:entity_id, 4) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:unk_1, 8) {
                        number 32, true
                    }
                    field(:playable, 12) {
                        number 8, true, nil, BooleanEnum
                    }
                }
            }
        }
    }
    field(:status, 64) {
        class ::DFHack::ViewscreenSetupadventurest_TStatus < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Peasant ; NUME[:Peasant] = 0
            ENUM[1] = :Hero ; NUME[:Hero] = 1
            ENUM[2] = :Demigod ; NUME[:Demigod] = 2
        end

        number 16, true, nil, ViewscreenSetupadventurest_TStatus
    }
    field(:race, 68) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:unk_1, 72) {
        number 8, true
    }
    field(:race_ids, 80) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def race_tgs ; race_ids.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:highlighted_entity_ids, 104) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def highlighted_entity_tgs ; highlighted_entity_ids.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:race_idx, 128) {
        number 32, true
    }
    field(:wild_creature_ids, 136) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def wild_creature_tgs ; wild_creature_ids.map { |i| df.world.raws.creatures.all[i] } ; end
    field(:wild_creature_idx, 160) {
        number 32, true
    }
    field(:nemesis_ids, 168) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def nemesis_tgs ; df.world.nemesis.all[nemesis_ids] ; end
    def nemesis_tgs ; nemesis_ids.map { |i| df.world.nemesis.all.binsearch(i) } ; end
    field(:nemesis_idx, 192) {
        number 32, true
    }
    field(:home_entity_ids, 200) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def home_entity_tgs ; home_entity_ids.map { |i| df.world.entities.all.binsearch(i) } ; end
    field(:home_entity_idx, 224) {
        number 32, true
    }
    field(:party_members, 232) {
        stl_vector(8) {
            pointer {
                global :SetupCharacterInfo
            }
        }
    }
    field(:unk_2, 256) {
        number 32, true
    }
    field(:unk_3, 264) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_4, 288) {
        number 32, true
    }
    field(:unk_5, 296) {
        stl_vector
    }
    field(:unk_6, 320) {
        number 32, true
    }
end

class ViewscreenSetupdwarfgamest < Viewscreen
    sizeof 3800

    rtti_classname :viewscreen_setupdwarfgamest

    field(:title, 32) {
        static_string(256)
    }
    field(:dwarf_info, 288) {
        stl_vector(8) {
            pointer {
                global :SetupCharacterInfo
            }
        }
    }
    field(:embark_skills, 312) {
        stl_vector(2) {
            number 16, true, nil, JobSkill
        }
    }
    field(:reclaim_professions, 336) {
        stl_vector(2) {
            global :Profession
        }
    }
    field(:mode, 360) {
        class ::DFHack::ViewscreenSetupdwarfgamest_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Dwarves ; NUME[:Dwarves] = 0
            ENUM[1] = :Items ; NUME[:Items] = 1
        end

        number 32, true, nil, ViewscreenSetupdwarfgamest_TMode
    }
    field(:dwarf_cursor, 364) {
        number 32, true
    }
    field(:dwarf_page_idx, 368) {
        number 32, true
    }
    field(:item_cursor, 372) {
        number 32, true
    }
    field(:skill_cursor, 376) {
        number 32, true, -1
    }
    field(:animal_cursor, 380) {
        number 32, true
    }
    field(:dwarf_column, 384) {
        number 32, true
    }
    field(:supply_column, 388) {
        number 32, true
    }
    field(:display_row, 392) {
        number 32, true
    }
    field(:show_play_now, 396) {
        number 8, true
    }
    field(:embark_prompt, 397) {
        number 8, true
    }
    field(:choice_types, 400) {
        stl_vector(1) {
            class ::DFHack::ViewscreenSetupdwarfgamest_TChoiceTypes < MemHack::Enum
                ENUM = Hash.new
                NUME = Hash.new
                ENUM[0] = :PlayNow ; NUME[:PlayNow] = 0
                ENUM[1] = :Prepare ; NUME[:Prepare] = 1
                ENUM[2] = :Profile ; NUME[:Profile] = 2
            end

            number 8, true, nil, ViewscreenSetupdwarfgamest_TChoiceTypes
        }
    }
    field(:choices, 424) {
        stl_vector(8) {
            pointer {
                global :EmbarkProfile
            }
        }
    }
    field(:choice, 448) {
        number 32, true
    }
    field(:profile_name, 456) {
        stl_string
    }
    field(:problems, 488) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_1, 512) {
        number 32, true
    }
    field(:in_problems, 516) {
        number 8, true
    }
    field(:in_save_profile, 517) {
        number 8, true
    }
    field(:profile_name_conflict, 518) {
        number 8, true
    }
    field(:item_choice, 520) {
        global :EmbarkItemChoice
    }
    field(:animals, 3088) {
        compound(:ViewscreenSetupdwarfgamest_TAnimals) {
            field(:race, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def race_tg ; race.map { |i| df.world.raws.creatures.all[i] } ; end
            field(:caste, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:profession, 48) {
                stl_vector(2) {
                    number 16, true, nil, Profession
                }
            }
            field(:count, 72) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:fort_name, 3184) {
        global :LanguageName
    }
    field(:group_name, 3304) {
        global :LanguageName
    }
    field(:unk_2, 3424) {
        number 8, true
    }
    field(:symbol, 3432) {
        global :EmbarkSymbol
    }
    field(:location, 3656) {
        global :EmbarkLocation
    }
    field(:units, 3728) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:items, 3752) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:unk_3, 3776) {
        number 32, true
    }
    field(:points_remaining, 3780) {
        number 32, true
    }
    field(:add_item_type, 3784) {
        number 16, true, nil, ItemType
    }
    field(:add_item_subtype, 3786) {
        number 16, true, -1
    }
    field(:add_mattype, 3788) {
        number 16, true, -1
    }
    field(:add_matindex, 3792) {
        number 32, true
    }
    field(:adding_item, 3796) {
        number 32, true
    }
end

class ViewscreenStoresst < Viewscreen
    sizeof 528

    rtti_classname :viewscreen_storesst

    field(:title, 32) {
        static_string(256)
    }
    field(:category_cursor, 288) {
        number 32, true
    }
    field(:item_cursor, 292) {
        number 32, true
    }
    field(:in_right_list, 296) {
        number 16, true
    }
    field(:in_group_mode, 298) {
        number 16, true
    }
    field(:category_total, 304) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:category_busy, 328) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:items, 352) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:group_item_type, 376) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:group_item_subtype, 400) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:group_mat_type, 424) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:group_mat_index, 448) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:group_count, 472) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:category_order, 496) {
        stl_vector(2) {
            number 16, true, nil, ItemType
        }
    }
    field(:can_zoom, 520) {
        number 8, true, nil, BooleanEnum
    }
end

class ViewscreenTextviewerst < Viewscreen
    sizeof 344

    rtti_classname :viewscreen_textviewerst

    field(:title, 32) {
        stl_string
    }
    field(:title_colors, 64) {
        stl_string
    }
    field(:src_text, 96) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:outvar_type, 120) {
        stl_string
    }
    field(:outvar_name, 152) {
        stl_string
    }
    field(:meeting_context, 184) {
        global :MeetingContext
    }
    field(:help_filename, 216) {
        stl_string
    }
    field(:page_filename, 248) {
        stl_string
    }
    field(:formatted_text, 280) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenTextviewerst_TFormattedText) {
                    sizeof 32

                    field(:text, 0) {
                        pointer {
                            static_string(-1)
                        }
                    }
                    field(:format, 8) {
                        pointer {
                            static_string(-1)
                        }
                    }
                    field(:flags, 16) {
                        compound(:ViewscreenTextviewerst_TFormattedText_TFlags) {
                            field(:_whole, 0) {
                                number 16, false
                            }
                            field(:hyperlink, 0) { bit 0 }
                            field(:no_newline, 0) { bit 1 }
                        }
                    }
                    field(:pause_depth, 20) {
                        number 32, true
                    }
                    field(:return_val, 24) {
                        number 32, true, -1
                    }
                    field(:indent, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:hyperlinks, 304) {
        stl_vector(8) {
            pointer {
                static_string(-1)
            }
        }
    }
    field(:logged_error, 328) {
        number 8, true
    }
    field(:scroll_pos, 332) {
        number 32, true
    }
    field(:cursor_line, 336) {
        number 32, true
    }
    field(:pause_depth, 340) {
        number 32, true
    }
end

class ViewscreenTitlest < Viewscreen
    sizeof 1080

    rtti_classname :viewscreen_titlest

    field(:str_histories, 32) {
        static_string(256)
    }
    field(:menu_items, 288) {
        static_string(256)
    }
    field(:sel_subpage, 544) {
        class ::DFHack::ViewscreenTitlest_TSelSubpage < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :None ; NUME[:None] = 0
            ENUM[1] = :StartSelectWorld ; NUME[:StartSelectWorld] = 1
            ENUM[2] = :StartSelectMode ; NUME[:StartSelectMode] = 2
            ENUM[3] = :Arena ; NUME[:Arena] = 3
            ENUM[4] = :About ; NUME[:About] = 4
        end

        number 16, true, nil, ViewscreenTitlest_TSelSubpage
    }
    field(:sel_menu_line, 548) {
        number 32, true
    }
    field(:sel_submenu_line, 552) {
        number 32, true
    }
    field(:loading, 556) {
        number 8, true
    }
    field(:menu_line_id, 560) {
        stl_vector(4) {
            class ::DFHack::ViewscreenTitlest_TMenuLineId < MemHack::Enum
                ENUM = Hash.new
                NUME = Hash.new
                ENUM[0] = :Continue ; NUME[:Continue] = 0
                ENUM[1] = :Start ; NUME[:Start] = 1
                ENUM[2] = :NewWorld ; NUME[:NewWorld] = 2
                ENUM[3] = :AdvancedWorld ; NUME[:AdvancedWorld] = 3
                ENUM[4] = :TestingArena ; NUME[:TestingArena] = 4
                ENUM[5] = :AboutDF ; NUME[:AboutDF] = 5
                ENUM[6] = :Quit ; NUME[:Quit] = 6
            end

            number 32, true, nil, ViewscreenTitlest_TMenuLineId
        }
    }
    field(:submenu_line_id, 584) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:submenu_line_text, 608) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:start_savegames, 632) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenTitlest_TStartSavegames) {
                    sizeof 352

                    field(:world_name, 0) {
                        global :LanguageName
                    }
                    field(:world_name_str, 120) {
                        stl_string
                    }
                    field(:unk1, 152) {
                        static_array(15, 1) {
                            number 8, true
                        }
                    }
                    field(:next_id, 168) {
                        static_array(37, 4, NextGlobalId) {
                            number 32, true
                        }
                    }
                    field(:save_dir, 320) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:arena_savegames, 656) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_1, 680) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_2, 704) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:str_slaves, 728) {
        stl_string
    }
    field(:str_chapter, 760) {
        stl_string
    }
    field(:str_copyright, 792) {
        stl_string
    }
    field(:str_version, 824) {
        stl_string
    }
    field(:str_warning, 856) {
        stl_string
    }
    field(:str_programmed, 888) {
        stl_string
    }
    field(:str_designed, 920) {
        stl_string
    }
    field(:str_visit, 952) {
        stl_string
    }
    field(:str_site, 984) {
        stl_string
    }
    field(:arena_raw_folder, 1016) {
        stl_string
    }
    field(:unk_388, 1048) {
        number 32, true
    }
    field(:unk_38c, 1052) {
        number 8, true
    }
    field(:unk_390, 1056) {
        number 32, true
    }
    field(:unk_394, 1060) {
        number 8, true
    }
    field(:unk_398, 1064) {
        number 32, true
    }
    field(:unk_39c, 1068) {
        number 8, true
    }
    field(:unk_3a0, 1072) {
        number 32, true
    }
end

class ViewscreenTopicmeetingFillLandHolderPositionsst < Viewscreen
    sizeof 400

    rtti_classname :viewscreen_topicmeeting_fill_land_holder_positionsst

    field(:title, 32) {
        static_string(256)
    }
    field(:popup, 288) {
        pointer {
            global :DipscriptPopup
        }
    }
    field(:meeting, 296) {
        pointer {
            global :MeetingDiplomatInfo
        }
    }
    field(:entity_diplomat, 304) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:entity_fortress, 312) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:position_ids, 320) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    field(:selected_histfig_ids, 344) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def selected_histfig_tgs ; selected_histfig_ids.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:candidate_histfig_ids, 368) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def candidate_histfig_tgs ; candidate_histfig_ids.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:position_cursor, 392) {
        number 32, true
    }
    field(:cursor, 396) {
        number 32, true
    }
end

class ViewscreenTopicmeetingTakerequestsst < Viewscreen
    sizeof 336

    rtti_classname :viewscreen_topicmeeting_takerequestsst

    field(:title, 32) {
        static_string(256)
    }
    field(:popup, 288) {
        pointer {
            global :DipscriptPopup
        }
    }
    field(:meeting, 296) {
        pointer {
            global :MeetingDiplomatInfo
        }
    }
    field(:type_categories, 304) {
        stl_vector(2) {
            global :EntitySellCategory
        }
    }
    field(:type_idx, 328) {
        number 32, true
    }
    field(:good_idx, 332) {
        number 32, true
    }
end

class ViewscreenTopicmeetingst < Viewscreen
    sizeof 80

    rtti_classname :viewscreen_topicmeetingst

    field(:popup, 32) {
        pointer {
            global :DipscriptPopup
        }
    }
    field(:meeting, 40) {
        pointer {
            global :MeetingDiplomatInfo
        }
    }
    field(:unk_138, 48) {
        pointer {
            global :UnitUnk138
        }
    }
    field(:text, 56) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class ViewscreenTradeagreementst < Viewscreen
    sizeof 344

    rtti_classname :viewscreen_tradeagreementst

    field(:requests, 32) {
        pointer {
            global :EntitySellPrices
        }
    }
    field(:civ_id, 40) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:unk_1, 48) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:type_idx, 72) {
        number 32, true
    }
    field(:good_idx, 76) {
        number 32, true
    }
    field(:title, 80) {
        static_string(256)
    }
    field(:civ, 336) {
        pointer {
            global :HistoricalEntity
        }
    }
end

class ViewscreenTradegoodsst < Viewscreen
    sizeof 664

    rtti_classname :viewscreen_tradegoodsst

    field(:title, 32) {
        static_string(256)
    }
    field(:merchant_name, 288) {
        stl_string
    }
    field(:merchant_entity, 320) {
        stl_string
    }
    field(:depot, 352) {
        pointer {
            global :BuildingTradedepotst
        }
    }
    field(:caravan, 360) {
        pointer {
            global :CaravanState
        }
    }
    field(:entity, 368) {
        pointer {
            global :HistoricalEntity
        }
    }
    field(:is_unloading, 376) {
        number 8, true, nil, BooleanEnum
    }
    field(:has_traders, 377) {
        number 8, true, nil, BooleanEnum
    }
    field(:trader, 384) {
        pointer {
            global :Unit
        }
    }
    field(:broker, 392) {
        pointer {
            global :Unit
        }
    }
    field(:trader_items, 400) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:broker_items, 424) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:trader_selected, 448) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:broker_selected, 472) {
        stl_vector(1) {
            number 8, true, nil, BooleanEnum
        }
    }
    field(:trader_count, 496) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:broker_count, 520) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:trader_cursor, 544) {
        number 32, true
    }
    field(:broker_cursor, 548) {
        number 32, true
    }
    field(:in_right_pane, 552) {
        number 8, true, nil, BooleanEnum
    }
    field(:trade_reply, 554) {
        class ::DFHack::ViewscreenTradegoodsst_TTradeReply < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Welcome ; NUME[:Welcome] = 0
            ENUM[1] = :RefusedLossTooHeavy ; NUME[:RefusedLossTooHeavy] = 1
            ENUM[2] = :RefusedTooHeavy ; NUME[:RefusedTooHeavy] = 2
            ENUM[3] = :RefusedLoss ; NUME[:RefusedLoss] = 3
            ENUM[4] = :TradeAccepted ; NUME[:TradeAccepted] = 4
            ENUM[5] = :OfferAccepted ; NUME[:OfferAccepted] = 5
            ENUM[6] = :Seizure ; NUME[:Seizure] = 6
            ENUM[7] = :HalfEmptyTraderAlt ; NUME[:HalfEmptyTraderAlt] = 7
            ENUM[8] = :SeizureEmpty ; NUME[:SeizureEmpty] = 8
            ENUM[9] = :EmptyTrade ; NUME[:EmptyTrade] = 9
            ENUM[10] = :HalfEmptyBroker ; NUME[:HalfEmptyBroker] = 10
            ENUM[11] = :HalfEmptyTrader ; NUME[:HalfEmptyTrader] = 11
            ENUM[12] = :OffendedBoth ; NUME[:OffendedBoth] = 12
            ENUM[13] = :OffendedAnimal ; NUME[:OffendedAnimal] = 13
            ENUM[14] = :OffendedPlant ; NUME[:OffendedPlant] = 14
            ENUM[15] = :Result15 ; NUME[:Result15] = 15
            ENUM[16] = :Result16 ; NUME[:Result16] = 16
            ENUM[17] = :Result17 ; NUME[:Result17] = 17
            ENUM[18] = :Counteroffer ; NUME[:Counteroffer] = 18
            ENUM[19] = :NoCounteroffer ; NUME[:NoCounteroffer] = 19
            ENUM[20] = :WelcomeAnnoyed ; NUME[:WelcomeAnnoyed] = 20
            ENUM[21] = :RefusedAnnoyed ; NUME[:RefusedAnnoyed] = 21
        end

        number 16, true, nil, ViewscreenTradegoodsst_TTradeReply
    }
    field(:unk_1, 556) {
        number 16, true
    }
    field(:unk_2, 560) {
        number 32, true
    }
    field(:has_offer, 564) {
        number 8, true
    }
    field(:counteroffer, 568) {
        stl_vector(8) {
            pointer {
                global :Item
            }
        }
    }
    field(:in_edit_count, 592) {
        number 8, true
    }
    field(:edit_count, 600) {
        stl_string
    }
    field(:unk_3, 632) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:unk_4, 656) {
        number 32, true
    }
end

class ViewscreenTradelistst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_tradelistst

    field(:cursor, 32) {
        number 32, true
    }
    field(:depot, 40) {
        pointer {
            global :BuildingTradedepotst
        }
    }
    field(:caravans, 48) {
        stl_vector(8) {
            pointer {
                global :CaravanState
            }
        }
    }
end

class ViewscreenTreasurelistst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_treasurelistst

    field(:sel_idx, 32) {
        number 32, true
    }
end

class ViewscreenUnitlistst < Viewscreen
    sizeof 248

    rtti_classname :viewscreen_unitlistst

    field(:allow_zoom, 32) {
        number 8, true, nil, BooleanEnum
    }
    field(:page, 36) {
        number 32, true, nil, ViewscreenUnitlistPage
    }
    field(:cursor_pos, 40) {
        static_array(4, 4, ViewscreenUnitlistPage) {
            number 32, true, -1
        }
    }
    field(:jobs, 56) {
        static_array(4, 24, ViewscreenUnitlistPage) {
            stl_vector(8) {
                pointer {
                    global :Job
                }
            }
        }
    }
    field(:units, 152) {
        static_array(4, 24, ViewscreenUnitlistPage) {
            stl_vector(8) {
                pointer {
                    global :Unit
                }
            }
        }
    }
end

class ViewscreenUnitst < Viewscreen
    sizeof 72

    rtti_classname :viewscreen_unitst

    field(:unit, 32) {
        pointer {
            global :Unit
        }
    }
    field(:noble_assignments, 40) {
        pointer {
            stl_vector(8) {
                pointer {
                    global :EntityPositionAssignment
                }
            }
        }
    }
    field(:noble_histfigs, 48) {
        pointer {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:noble_groups, 56) {
        pointer {
            stl_vector(4) {
                number 32, true, -1
            }
        }
    }
    field(:has_kills, 64) {
        number 8, true, nil, BooleanEnum
    }
end

class ViewscreenUpdateRegionst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_update_regionst

    field(:year, 32) {
        number 32, true
    }
    field(:year_tick, 36) {
        number 32, true
    }
end

class ViewscreenWagesst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_wagesst

    field(:profession_category, 32) {
        number 16, true
    }
end

class ViewscreenWorkquotaConditionst < Viewscreen
    sizeof 488

    rtti_classname :viewscreen_workquota_conditionst

    field(:order, 32) {
        pointer {
            global :ManagerOrder
        }
    }
    field(:cond_idx, 40) {
        number 32, true
    }
    field(:satisfied_items, 48) {
        stl_bit_vector
    }
    field(:satisfied_orders, 80) {
        stl_bit_vector
    }
    field(:filter, 112) {
        stl_string
    }
    field(:list_entries, 144) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
    field(:list_idx, 168) {
        number 32, true
    }
    field(:mode, 172) {
        class ::DFHack::ViewscreenWorkquotaConditionst_TMode < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :List ; NUME[:List] = -1
            ENUM[0] = :ItemType ; NUME[:ItemType] = 0
            ENUM[1] = :Material ; NUME[:Material] = 1
            ENUM[2] = :Traits ; NUME[:Traits] = 2
        end

        number 32, true, nil, ViewscreenWorkquotaConditionst_TMode
    }
    field(:item_types, 176) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:item_subtypes, 200) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:item_types_visible, 224) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:item_subtypes_visible, 248) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:mat_types, 272) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:mat_indices, 296) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:list_unk3, 320) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:list_visible, 344) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:traits, 368) {
        stl_vector(8) {
            pointer {
                compound(:ViewscreenWorkquotaConditionst_TTraits) {
                    sizeof 120

                    field(:flags, 0) {
                        compound(:ViewscreenWorkquotaConditionst_TTraits_TFlags) {
                            field(:_whole, 0) {
                                number 32, true
                            }
                        }
                    }
                    field(:type, 4) {
                        number 32, true
                    }
                    field(:item_desc, 8) {
                        stl_string
                    }
                    field(:product_desc, 40) {
                        stl_string
                    }
                    field(:mat_index, 72) {
                        number 32, true
                    }
                    field(:unk_1, 76) {
                        number 32, true
                    }
                    field(:unk_2, 80) {
                        number 32, true
                    }
                    field(:unk_3, 84) {
                        number 32, true
                    }
                    field(:name, 88) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:traits_visible, 392) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_1, 416) {
        number 8, true
    }
    field(:unk_2, 424) {
        stl_vector
    }
    field(:unk_3, 448) {
        number 32, true
    }
    field(:item_count_edit, 452) {
        number 8, true, nil, BooleanEnum
    }
    field(:item_count_entry, 456) {
        stl_string
    }
end

class ViewscreenWorkquotaDetailsst < Viewscreen
    sizeof 40

    rtti_classname :viewscreen_workquota_detailsst

    field(:order, 32) {
        pointer {
            global :ManagerOrder
        }
    }
end

class ViewscreenWorkshopProfilest < Viewscreen
    sizeof 152

    rtti_classname :viewscreen_workshop_profilest

    field(:building_id, 32) {
        number 32, true, -1
    }
    def building_tg ; df.world.buildings.all.binsearch(building_id) ; end
    field(:profile, 40) {
        pointer {
            global :WorkshopProfile
        }
    }
    field(:tab, 48) {
        class ::DFHack::ViewscreenWorkshopProfilest_TTab < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Workers ; NUME[:Workers] = 0
            ENUM[1] = :Orders ; NUME[:Orders] = 1
            ENUM[2] = :Restrictions ; NUME[:Restrictions] = 2
        end

        number 32, true, nil, ViewscreenWorkshopProfilest_TTab
    }
    field(:workers, 56) {
        stl_vector(8) {
            pointer {
                global :Unit
            }
        }
    }
    field(:worker_idx, 80) {
        number 32, true
    }
    field(:orders, 88) {
        stl_vector(8) {
            pointer {
                global :ManagerOrder
            }
        }
    }
    field(:order_idx, 112) {
        number 32, true
    }
    field(:labors, 120) {
        stl_vector(4) {
            global :UnitLabor
        }
    }
    field(:labor_idx, 144) {
        number 32, true
    }
end

class WeaponAttack < MemHack::Compound
    sizeof 128

    field(:edged, 0) {
        number 8, true, nil, BooleanEnum
    }
    field(:contact, 4) {
        number 32, true
    }
    field(:penetration, 8) {
        number 32, true
    }
    field(:velocity_mult, 12) {
        number 32, true
    }
    field(:verb_2nd, 16) {
        stl_string
    }
    field(:verb_3rd, 48) {
        stl_string
    }
    field(:noun, 80) {
        stl_string
    }
    field(:prepare, 112) {
        number 32, true
    }
    field(:recover, 116) {
        number 32, true
    }
    field(:flags, 120) {
        compound(:WeaponAttack_TFlags) {
            field(:_whole, 0) {
                number 32, true
            }
            field(:independent_multiattack, 0) { bit 0 }
            field(:bad_multiattack, 0) { bit 1 }
        }
    }
end

class WebCluster < MemHack::Compound
    sizeof 88

    field(:x, 0) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:y, 24) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:z, 48) {
        number 16, true
    }
    field(:race, 50) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:caste, 52) {
        number 16, true, -1
    }
    def caste_tg ; df.world.raws.creatures.all[race].caste[caste] ; end
    field(:pos_min, 54) {
        global :Coord2d
    }
    field(:pos_max, 58) {
        global :Coord2d
    }
    field(:ambushers, 64) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def ambushers_tg ; ambushers.map { |i| df.world.units.all.binsearch(i) } ; end
end

class WidgetMenu < MemHack::Compound
    sizeof 60

    field(:pad_1, 0) {
    }
    field(:selection, 24) {
        number 32, true
    }
    field(:last_displayheight, 28) {
        number 32, true
    }
    field(:bleached, 32) {
        number 8, true, nil, BooleanEnum
    }
    field(:pad_2, 33) {
    }
end

class WidgetTextbox < MemHack::Compound
    sizeof 40

    field(:text, 0) {
        stl_string
    }
    field(:keep, 32) {
        number 8, true, nil, BooleanEnum
    }
end

class WitnessReport < MemHack::Compound
    sizeof 64

    field(:death_id, 0) {
        number 32, true, -1
    }
    def death_tg ; df.world.incidents.all.binsearch(death_id) ; end
    field(:crime_id, 4) {
        number 32, true, -1
    }
    def crime_tg ; df.world.crimes.all.binsearch(crime_id) ; end
    field(:type, 8) {
        number 32, true, nil, WitnessReportType
    }
    field(:year, 12) {
        number 32, true
    }
    field(:year_tick, 16) {
        number 32, true
    }
    field(:flags, 20) {
        global :WitnessReportFlags
    }
    field(:unk_18, 24) {
        number 32, true, -1
    }
    field(:unk_1c, 28) {
        number 32, true, -1
    }
    field(:unk_20, 32) {
        number 32, true, -1
    }
    field(:unk_24, 36) {
        number 32, true, -1
    }
    field(:unk_28, 40) {
        number 32, true, -1
    }
    field(:unk_2c, 44) {
        number 32, true, -1
    }
    field(:unk_30, 48) {
        number 32, true, -1
    }
    field(:unk_34, 52) {
        number 32, true, -1
    }
    field(:pos, 56) {
        global :Coord
    }
end

class WitnessReportFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:accuses, 0) { bit 0 }
end

class WorkshopProfile < MemHack::Compound
    sizeof 232

    field(:permitted_workers, 0) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def permitted_workers_tg ; permitted_workers.map { |i| df.world.units.all.binsearch(i) } ; end
    field(:min_level, 24) {
        number 32, true
    }
    field(:max_level, 28) {
        number 32, true, 3000
    }
    field(:links, 32) {
        global :StockpileLinks
    }
    field(:max_general_orders, 128) {
        number 32, true
    }
    field(:block_general_orders, 132) {
        number 8, true, nil, BooleanEnum
    }
    field(:pad_1, 133) {
    }
    field(:blocked_labors, 136) {
        static_array(94, 1, UnitLabor) {
            number 8, true, nil, BooleanEnum
        }
    }
end

class World < MemHack::Compound
    sizeof 2544160

    field(:glowing_barriers, 0) {
        stl_vector(8) {
            pointer {
                global :GlowingBarrier
            }
        }
    }
    field(:deep_vein_hollows, 24) {
        stl_vector(8) {
            pointer {
                global :DeepVeinHollow
            }
        }
    }
    field(:cursed_tombs, 48) {
        stl_vector(8) {
            pointer {
                global :CursedTomb
            }
        }
    }
    field(:engravings, 72) {
        stl_vector(8) {
            pointer {
                global :Engraving
            }
        }
    }
    field(:vermin, 96) {
        compound(:World_TVermin) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Vermin
                    }
                }
            }
            field(:colonies, 24) {
                stl_vector(8) {
                    pointer {
                        global :Vermin
                    }
                }
            }
        }
    }
    field(:dirty_waters, 144) {
        stl_vector(8) {
            pointer {
                global :Coord
            }
        }
    }
    field(:campfires, 168) {
        stl_vector(8) {
            pointer {
                global :Campfire
            }
        }
    }
    field(:web_clusters, 192) {
        stl_vector(8) {
            pointer {
                global :WebCluster
            }
        }
    }
    field(:fires, 216) {
        stl_vector(8) {
            pointer {
                global :Fire
            }
        }
    }
    field(:ocean_wave_makers, 240) {
        stl_vector(8) {
            pointer {
                global :OceanWaveMaker
            }
        }
    }
    field(:ocean_waves, 264) {
        stl_vector(8) {
            pointer {
                global :OceanWave
            }
        }
    }
    field(:constructions, 288) {
        stl_vector(8) {
            pointer {
                global :Construction
            }
        }
    }
    field(:murky_pools, 312) {
        stl_vector(8) {
            pointer {
                global :CoordRect
            }
        }
    }
    field(:embark_features, 336) {
        stl_vector(8) {
            pointer {
                global :EmbarkFeature
            }
        }
    }
    field(:site_glowing_barriers, 360) {
        stl_vector(8) {
            pointer {
                global :GlowingBarrier
            }
        }
    }
    field(:site_deep_vein_hollows, 384) {
        stl_vector(8) {
            pointer {
                global :DeepVeinHollow
            }
        }
    }
    field(:site_cursed_tombs, 408) {
        stl_vector(8) {
            pointer {
                global :CursedTomb
            }
        }
    }
    field(:site_engravings, 432) {
        stl_vector(8) {
            pointer {
                global :Engraving
            }
        }
    }
    field(:site_constructions, 456) {
        stl_vector(8) {
            pointer {
                global :Construction
            }
        }
    }
    field(:site_embark_features, 480) {
        stl_vector(8) {
            pointer {
                global :EmbarkFeature
            }
        }
    }
    field(:site_ocean_wave_makers, 504) {
        stl_vector(8) {
            pointer {
                global :OceanWaveMaker
            }
        }
    }
    field(:site_murky_pools, 528) {
        stl_vector(8) {
            pointer {
                global :CoordRect
            }
        }
    }
    field(:effects, 552) {
        stl_vector(8) {
            pointer {
                global :EffectInfo
            }
        }
    }
    field(:coin_batches, 576) {
        stl_vector(8) {
            pointer {
                global :CoinBatch
            }
        }
    }
    field(:populations, 600) {
        stl_vector(8) {
            pointer {
                global :LocalPopulation
            }
        }
    }
    field(:manager_orders, 624) {
        stl_vector(8) {
            pointer {
                global :ManagerOrder
            }
        }
    }
    field(:manager_order_next_id, 648) {
        number 32, true
    }
    field(:mandates, 656) {
        stl_vector(8) {
            pointer {
                global :Mandate
            }
        }
    }
    field(:entities, 680) {
        compound(:World_TEntities) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :HistoricalEntity
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :HistoricalEntity
                    }
                }
            }
        }
    }
    field(:worldgen_coord_buf, 728) {
        compound(:World_TWorldgenCoordBuf) {
            field(:slots, 0) {
                static_array(20000, 4) {
                    global :Coord2d
                }
            }
            field(:next_slot, 80000) {
                number 16, true
            }
        }
    }
    field(:units, 80736) {
        compound(:World_TUnits) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:active, 24) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:other, 48) {
                global :UnitsOther
            }
            field(:bad, 96) {
                stl_vector(8) {
                    pointer {
                        global :Unit
                    }
                }
            }
            field(:unknown, 120) {
                stl_vector
            }
        }
    }
    field(:unit_chunks, 80880) {
        stl_vector(8) {
            pointer {
                global :UnitChunk
            }
        }
    }
    field(:art_image_chunks, 80904) {
        stl_vector(8) {
            pointer {
                global :ArtImageChunk
            }
        }
    }
    field(:nemesis, 80928) {
        compound(:World_TNemesis) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:other, 24) {
                static_array(28, 24) {
                    stl_vector(8) {
                        pointer {
                            global :NemesisRecord
                        }
                    }
                }
            }
            field(:bad, 696) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk4, 720) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:items, 81656) {
        compound(:World_TItems) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:other, 24) {
                global :ItemsOther
            }
            field(:bad, 3192) {
                stl_vector(8) {
                    pointer {
                        global :Item
                    }
                }
            }
            field(:bad_tag, 3216) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:artifacts, 84896) {
        compound(:World_TArtifacts) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :ArtifactRecord
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :ArtifactRecord
                    }
                }
            }
        }
    }
    field(:jobs, 84944) {
        global :JobHandler
    }
    field(:proj_list, 117008) {
        df_linked_list {
            global :ProjListLink
        }
    }
    field(:buildings, 117032) {
        global :BuildingHandler
    }
    field(:machines, 119304) {
        global :MachineHandler
    }
    field(:flow_guides, 119360) {
        compound(:World_TFlowGuides) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :FlowGuide
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :FlowGuide
                    }
                }
            }
        }
    }
    field(:stockpile, 119408) {
        compound(:World_TStockpile) {
            field(:num_jobs, 0) {
                static_array(10, 4, HaulerType) {
                    number 32, true
                }
            }
            field(:num_haulers, 40) {
                static_array(10, 4, HaulerType) {
                    number 32, true
                }
            }
            field(:simple1, 80) {
                compound(:World_TStockpile_TSimple1) {
                    field(:unk_1, 0) {
                        number 8, true
                    }
                    field(:food, 1) {
                        number 8, true
                    }
                    field(:unk_2, 2) {
                        number 8, true
                    }
                    field(:unk_3, 3) {
                        number 8, true
                    }
                }
            }
            field(:seeds, 88) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:plants, 112) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:cheese, 136) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:meat_fish, 160) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:eggs, 184) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:leaves, 208) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:plant_powder, 232) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:simple2, 256) {
                compound(:World_TStockpile_TSimple2) {
                    field(:seeds, 0) {
                        number 8, true
                    }
                    field(:plants, 1) {
                        number 8, true
                    }
                    field(:cheese, 2) {
                        number 8, true
                    }
                    field(:fish, 3) {
                        number 8, true
                    }
                    field(:meat, 4) {
                        number 8, true
                    }
                    field(:leaves, 5) {
                        number 8, true
                    }
                    field(:powder, 6) {
                        number 8, true
                    }
                    field(:eggs, 7) {
                        number 8, true
                    }
                }
            }
            field(:liquid_plant, 264) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:liquid_animal, 288) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:liquid_builtin, 312) {
                stl_vector(1) {
                    number 8, true
                }
            }
            field(:simple3, 336) {
                compound(:World_TStockpile_TSimple3) {
                    field(:glob_fat, 0) {
                        number 8, true
                    }
                    field(:glob_tallow, 1) {
                        number 8, true
                    }
                    field(:glob_paste, 2) {
                        number 8, true
                    }
                    field(:glob_pressed, 3) {
                        number 8, true
                    }
                    field(:weapons, 4) {
                        number 8, true
                    }
                    field(:shields, 5) {
                        number 8, true
                    }
                    field(:ammo, 6) {
                        number 8, true
                    }
                    field(:coins, 7) {
                        number 8, true
                    }
                    field(:bar_blocks, 8) {
                        number 8, true
                    }
                    field(:gems, 9) {
                        number 8, true
                    }
                    field(:finished_goods, 10) {
                        number 8, true
                    }
                    field(:tanned_skins, 11) {
                        number 8, true
                    }
                    field(:thread_cloth, 12) {
                        number 8, true
                    }
                    field(:unk_1, 13) {
                        number 8, true
                    }
                    field(:unk_2, 14) {
                        number 8, true
                    }
                    field(:unk_3, 15) {
                        number 8, true
                    }
                }
            }
        }
    }
    field(:plants, 119760) {
        compound(:World_TPlants) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
            field(:shrub_dry, 24) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
            field(:shrub_wet, 48) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
            field(:tree_dry, 72) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
            field(:tree_wet, 96) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
            field(:empty, 120) {
                stl_vector(8) {
                    pointer {
                        global :Plant
                    }
                }
            }
        }
    }
    field(:enemy_status_cache, 119904) {
        compound(:World_TEnemyStatusCache) {
            field(:slot_used, 0) {
                static_array(500, 1) {
                    number 8, true, nil, BooleanEnum
                }
            }
            field(:rel_map, 500) {
                static_array(500, 2000) {
                    static_array(500, 4) {
                        number 32, true
                    }
                }
            }
            field(:next_slot, 1000500) {
                number 32, true
            }
        }
    }
    field(:schedules, 1120408) {
        compound(:World_TSchedules) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :ScheduleInfo
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :ScheduleInfo
                    }
                }
            }
        }
    }
    field(:squads, 1120456) {
        compound(:World_TSquads) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Squad
                    }
                }
            }
        }
    }
    field(:formations, 1120504) {
        compound(:World_TFormations) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        number 32, true
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
        }
    }
    field(:activities, 1120552) {
        compound(:World_TActivities) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :ActivityEntry
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :ActivityEntry
                    }
                }
            }
        }
    }
    field(:status, 1120600) {
        compound(:World_TStatus) {
            field(:reports, 0) {
                stl_vector(8) {
                    pointer {
                        global :Report
                    }
                }
            }
            field(:announcements, 24) {
                stl_vector(8) {
                    pointer {
                        global :Report
                    }
                }
            }
            field(:popups, 48) {
                stl_vector(8) {
                    pointer {
                        global :PopupMessage
                    }
                }
            }
            field(:next_report_id, 72) {
                number 32, true
            }
            field(:flags, 76) {
                compound(:World_TStatus_TFlags) {
                    field(:_whole, 0) {
                        number 32, true
                    }
                    field(:combat, 0) { bit 0 }
                    field(:hunting, 0) { bit 1 }
                    field(:sparring, 0) { bit 2 }
                }
            }
            field(:unk_1, 80) {
                static_array(9, 4) {
                    number 32, true
                }
            }
            field(:mission_reports, 120) {
                stl_vector(8) {
                    pointer {
                        global :MissionReport
                    }
                }
            }
            field(:spoils_reports, 144) {
                stl_vector(8) {
                    pointer {
                        global :SpoilsReport
                    }
                }
            }
            field(:interrogation_reports, 168) {
                stl_vector(8) {
                    pointer {
                        global :InterrogationReport
                    }
                }
            }
            field(:display_timer, 192) {
                number 32, true
            }
            field(:slots, 200) {
                static_array(100, 168) {
                    compound(:World_TStatus_TSlots) {
                        field(:type, 0) {
                            number 16, true, nil, CombatReportEventType
                        }
                        field(:item, 4) {
                            number 32, true
                        }
                        field(:unk1b, 8) {
                            number 32, true
                        }
                        field(:unk1c, 12) {
                            number 32, true
                        }
                        field(:unk1d, 16) {
                            number 32, true
                        }
                        field(:body_part, 20) {
                            number 16, true
                        }
                        field(:unk2b, 22) {
                            number 16, true
                        }
                        field(:unk2c, 24) {
                            number 16, true
                        }
                        field(:unk2d, 26) {
                            number 16, true
                        }
                        field(:target_bp_name, 32) {
                            stl_string
                        }
                        field(:verb, 64) {
                            stl_string
                        }
                        field(:with_item_name, 96) {
                            stl_string
                        }
                        field(:unk3d, 128) {
                            stl_string
                        }
                        field(:flags, 160) {
                            compound(:World_TStatus_TSlots_TFlags) {
                                field(:_whole, 0) {
                                    number 32, true
                                }
                                field(:behind, 0) { bit 0 }
                                field(:side, 0) { bit 1 }
                                field(:by, 0) { bit 2 }
                                field(:item, 0) { bit 3 }
                                field(:tap, 0) { bit 4 }
                                field(:sever, 0) { bit 5 }
                            }
                        }
                    }
                }
            }
            field(:slot_id_used, 17000) {
                static_array(38, 2, CombatReportEventType) {
                    number 16, true
                }
            }
            field(:slot_id_idx1, 17076) {
                static_array(38, 2, CombatReportEventType) {
                    number 16, true
                }
            }
            field(:slot_id_idx2, 17152) {
                static_array(38, 2, CombatReportEventType) {
                    number 16, true
                }
            }
            field(:slots_used, 17228) {
                number 16, true
            }
        }
    }
    field(:interaction_instances, 1137832) {
        compound(:World_TInteractionInstances) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :InteractionInstance
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :InteractionInstance
                    }
                }
            }
        }
    }
    field(:written_contents, 1137880) {
        compound(:World_TWrittenContents) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :WrittenContent
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :WrittenContent
                    }
                }
            }
        }
    }
    field(:identities, 1137928) {
        compound(:World_TIdentities) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Identity
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Identity
                    }
                }
            }
        }
    }
    field(:incidents, 1137976) {
        compound(:World_TIncidents) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Incident
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Incident
                    }
                }
            }
        }
    }
    field(:crimes, 1138024) {
        compound(:World_TCrimes) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Crime
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Crime
                    }
                }
            }
        }
    }
    field(:vehicles, 1138072) {
        compound(:World_TVehicles) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Vehicle
                    }
                }
            }
            field(:active, 24) {
                stl_vector(8) {
                    pointer {
                        global :Vehicle
                    }
                }
            }
            field(:bad, 48) {
                stl_vector(8) {
                    pointer {
                        global :Vehicle
                    }
                }
            }
        }
    }
    field(:armies, 1138144) {
        compound(:World_TArmies) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Army
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Army
                    }
                }
            }
        }
    }
    field(:army_controllers, 1138192) {
        compound(:World_TArmyControllers) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :ArmyController
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :ArmyController
                    }
                }
            }
        }
    }
    field(:army_tracking_info, 1138240) {
        compound(:World_TArmyTrackingInfo) {
            field(:all, 0) {
                stl_vector
            }
            field(:bad, 24) {
                stl_vector
            }
        }
    }
    field(:cultural_identities, 1138288) {
        compound(:World_TCulturalIdentities) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :CulturalIdentity
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :CulturalIdentity
                    }
                }
            }
        }
    }
    field(:agreements, 1138336) {
        compound(:World_TAgreements) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Agreement
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Agreement
                    }
                }
            }
        }
    }
    field(:poetic_forms, 1138384) {
        compound(:World_TPoeticForms) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :PoeticForm
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :PoeticForm
                    }
                }
            }
        }
    }
    field(:musical_forms, 1138432) {
        compound(:World_TMusicalForms) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :MusicalForm
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :MusicalForm
                    }
                }
            }
        }
    }
    field(:dance_forms, 1138480) {
        compound(:World_TDanceForms) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :DanceForm
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :DanceForm
                    }
                }
            }
        }
    }
    field(:scales, 1138528) {
        compound(:World_TScales) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Scale
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Scale
                    }
                }
            }
        }
    }
    field(:rhythms, 1138576) {
        compound(:World_TRhythms) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Rhythm
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Rhythm
                    }
                }
            }
        }
    }
    field(:occupations, 1138624) {
        compound(:World_TOccupations) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Occupation
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :Occupation
                    }
                }
            }
        }
    }
    field(:belief_systems, 1138672) {
        compound(:World_TBeliefSystems) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :BeliefSystem
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :BeliefSystem
                    }
                }
            }
        }
    }
    field(:image_sets, 1138720) {
        compound(:World_TImageSets) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :ImageSet
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :ImageSet
                    }
                }
            }
        }
    }
    field(:divination_sets, 1138768) {
        compound(:World_TDivinationSets) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :DivinationSet
                    }
                }
            }
            field(:bad, 24) {
                stl_vector(8) {
                    pointer {
                        global :DivinationSet
                    }
                }
            }
        }
    }
    field(:selected_building, 1138816) {
        pointer {
            global :Building
        }
    }
    field(:selected_stockpile_type, 1138824) {
        number 16, true, nil, StockpileCategory
    }
    field(:update_selected_building, 1138826) {
        number 8, true, nil, BooleanEnum
    }
    field(:building_width, 1138828) {
        number 16, true
    }
    field(:building_height, 1138830) {
        number 16, true
    }
    field(:selected_direction, 1138832) {
        number 8, true, nil, ScrewPumpDirection
    }
    field(:map, 1138840) {
        compound(:World_TMap) {
            field(:map_blocks, 0) {
                stl_vector(8) {
                    pointer {
                        global :MapBlock
                    }
                }
            }
            field(:block_index, 24) {
                pointer_ary(8) {
                    pointer_ary(8) {
                        pointer_ary(8) {
                            pointer {
                                global :MapBlock
                            }
                        }
                    }
                }
            }
            field(:map_block_columns, 32) {
                stl_vector(8) {
                    pointer {
                        global :MapBlockColumn
                    }
                }
            }
            field(:column_index, 56) {
                pointer_ary(8) {
                    pointer_ary(8) {
                        pointer {
                            global :MapBlockColumn
                        }
                    }
                }
            }
            field(:x_count_block, 64) {
                number 32, true
            }
            field(:y_count_block, 68) {
                number 32, true
            }
            field(:z_count_block, 72) {
                number 32, true
            }
            field(:x_count, 76) {
                number 32, true
            }
            field(:y_count, 80) {
                number 32, true
            }
            field(:z_count, 84) {
                number 32, true
            }
            field(:region_x, 88) {
                number 32, true
            }
            field(:region_y, 92) {
                number 32, true
            }
            field(:region_z, 96) {
                number 32, true
            }
            field(:distance_lookup, 100) {
                static_array(53, 106) {
                    static_array(53, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:profession_skills, 1144560) {
        compound(:World_TProfessionSkills) {
            field(:primary, 0) {
                static_array(135, 24, Profession) {
                    stl_vector(2) {
                        global :JobSkill
                    }
                }
            }
            field(:secondary, 3240) {
                static_array(135, 24, Profession) {
                    stl_vector(2) {
                        global :JobSkill
                    }
                }
            }
        }
    }
    field(:math, 1151040) {
        compound(:World_TMath) {
            field(:approx, 0) {
                static_array(40, 8) {
                    compound(:World_TMath_TApprox) {
                        field(:cos, 0) {
                            number 32, true
                        }
                        field(:sin, 4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:cos, 320) {
                static_array(181, 8) {
                    double
                }
            }
            field(:hypot, 1768) {
                static_array(11, 88) {
                    static_array(11, 8) {
                        double
                    }
                }
            }
        }
    }
    field(:map_extras, 1153776) {
        compound(:World_TMapExtras) {
            field(:rotation, 0) {
                number 8, false
            }
            field(:z_level_flags, 8) {
                pointer_ary(4) {
                    global :ZLevelFlags
                }
            }
            field(:unk_v40_3a, 16) {
                stl_vector(8) {
                    pointer {
                        global :BlockSquareEventSpoorst
                    }
                }
            }
            field(:unk_v40_3b, 40) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_v40_3c, 64) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_v40_3d, 88) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:world_data, 1153888) {
        pointer {
            global :WorldData
        }
    }
    field(:worldgen_status, 1153896) {
        compound(:World_TWorldgenStatus) {
            field(:state, 0) {
                class ::DFHack::World_TWorldgenStatus_TState < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[-1] = :None ; NUME[:None] = -1
                    ENUM[0] = :Initializing ; NUME[:Initializing] = 0
                    ENUM[1] = :PreparingElevation ; NUME[:PreparingElevation] = 1
                    ENUM[2] = :SettingTemperature ; NUME[:SettingTemperature] = 2
                    ENUM[3] = :RunningRivers ; NUME[:RunningRivers] = 3
                    ENUM[4] = :FormingLakesAndMinerals ; NUME[:FormingLakesAndMinerals] = 4
                    ENUM[5] = :GrowingVegetation ; NUME[:GrowingVegetation] = 5
                    ENUM[6] = :VerifyingTerrain ; NUME[:VerifyingTerrain] = 6
                    ENUM[7] = :ImportingWildlife ; NUME[:ImportingWildlife] = 7
                    ENUM[8] = :RecountingLegends ; NUME[:RecountingLegends] = 8
                    ENUM[9] = :Finalizing ; NUME[:Finalizing] = 9
                    ENUM[10] = :Done ; NUME[:Done] = 10
                end

                number 16, true, nil, World_TWorldgenStatus_TState
            }
            field(:num_rejects, 4) {
                number 32, true
            }
            field(:unk_1, 8) {
                static_array(53, 4) {
                    number 32, true
                }
            }
            field(:unk_2, 220) {
                static_array(53, 4) {
                    number 32, true
                }
            }
            field(:rejection_reason, 432) {
                number 16, true
            }
            field(:lakes_total, 436) {
                number 32, true
            }
            field(:unk_3, 440) {
                number 32, true
            }
            field(:unk_4, 444) {
                number 16, true
            }
            field(:lakes_cur, 448) {
                number 32, true
            }
            field(:unk_5, 452) {
                number 32, true
            }
            field(:unk_6, 456) {
                number 32, true
            }
            field(:geo_layers, 464) {
                static_array(100, 8) {
                    pointer {
                        global :WorldGeoLayer
                    }
                }
            }
            field(:unk_7, 1264) {
                static_array(100, 1) {
                    number 8, true
                }
            }
            field(:unk_8, 1364) {
                static_array(100, 2) {
                    number 16, true
                }
            }
            field(:unk_9, 1564) {
                number 32, true
            }
            field(:finalized_civ_mats, 1568) {
                number 32, true
            }
            field(:finalized_art, 1572) {
                number 32, true
            }
            field(:finalized_uniforms, 1576) {
                number 32, true
            }
            field(:finalized_sites, 1580) {
                number 32, true
            }
            field(:unk_10, 1584) {
                number 32, true
            }
            field(:unk_11, 1588) {
                number 32, true
            }
            field(:unk_12, 1592) {
                number 32, true
            }
            field(:entities, 1600) {
                stl_vector(8) {
                    pointer {
                        global :HistoricalEntity
                    }
                }
            }
            field(:sites, 1624) {
                stl_vector(8) {
                    pointer {
                        global :WorldSite
                    }
                }
            }
            field(:cursor_x, 1648) {
                number 32, true
            }
            field(:cursor_y, 1652) {
                number 32, true
            }
            field(:unk_13, 1656) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:unk_14, 1680) {
                stl_vector(8) {
                    pointer {
                    }
                }
            }
            field(:rivers_total, 1704) {
                number 32, true
            }
            field(:rivers_cur, 1708) {
                number 32, true
            }
            field(:unk_15, 1712) {
                number 8, true
            }
            field(:last_param_set, 1720) {
                stl_string
            }
            field(:last_seed, 1752) {
                stl_string
            }
            field(:last_name_seed, 1784) {
                stl_string
            }
            field(:last_history_seed, 1816) {
                stl_string
            }
            field(:last_creature_seed, 1848) {
                stl_string
            }
            field(:place_caves, 1880) {
                number 8, true, nil, BooleanEnum
            }
            field(:place_good_evil, 1881) {
                number 8, true, nil, BooleanEnum
            }
            field(:place_megabeasts, 1882) {
                number 8, true, nil, BooleanEnum
            }
            field(:place_other_beasts, 1883) {
                number 8, true, nil, BooleanEnum
            }
            field(:make_cave_pops, 1884) {
                number 8, true, nil, BooleanEnum
            }
            field(:make_cave_civs, 1885) {
                number 8, true, nil, BooleanEnum
            }
            field(:place_civs, 1886) {
                number 8, true, nil, BooleanEnum
            }
            field(:finished_prehistory, 1887) {
                number 8, true, nil, BooleanEnum
            }
            field(:sites2, 1888) {
                stl_vector(8) {
                    pointer {
                        global :WorldSite
                    }
                }
            }
            field(:sites3, 1912) {
                stl_vector(8) {
                    pointer {
                        global :WorldSite
                    }
                }
            }
            field(:unk_16, 1936) {
                number 32, true
            }
            field(:unk_17, 1940) {
                number 8, true
            }
            field(:unk_18, 1941) {
                number 8, true
            }
            field(:unk_19, 1942) {
                number 8, true
            }
            field(:unk_20, 1943) {
                number 8, true
            }
            field(:entity_raws, 1944) {
                stl_vector(8) {
                    pointer {
                        global :EntityRaw
                    }
                }
            }
            field(:unk_21, 1968) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:civ_count, 1992) {
                number 32, true
            }
            field(:civs_left_to_place, 1996) {
                number 32, true
            }
            field(:regions1, 2000) {
                static_array(10, 24) {
                    stl_vector(8) {
                        pointer {
                            global :WorldRegion
                        }
                    }
                }
            }
            field(:regions2, 2240) {
                static_array(10, 24) {
                    stl_vector(8) {
                        pointer {
                            global :WorldRegion
                        }
                    }
                }
            }
            field(:regions3, 2480) {
                static_array(10, 24) {
                    stl_vector(8) {
                        pointer {
                            global :WorldRegion
                        }
                    }
                }
            }
            field(:unk_22, 2720) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_23, 2744) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_24, 2768) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_25, 2792) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_26, 2816) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_27, 2840) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_28, 2864) {
                number 32, true
            }
            field(:unk_29, 2868) {
                number 32, true
            }
            field(:unk_10d298, 2872) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_10d2a4, 2896) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:libraries, 2920) {
                stl_vector(8) {
                    pointer {
                        global :AbstractBuilding
                    }
                }
            }
            field(:unk_30, 2944) {
                number 32, true
            }
            field(:temples, 2952) {
                stl_vector(8) {
                    pointer {
                        global :AbstractBuilding
                    }
                }
            }
            field(:some_artifacts, 2976) {
                stl_vector(8) {
                    pointer {
                        global :ArtifactRecord
                    }
                }
            }
            field(:unk_31, 3000) {
                stl_vector
            }
            field(:unk_32, 3024) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:orphaned_flow_pool, 1156944) {
        global :FlowReusePool
    }
    field(:raws, 1156952) {
        global :WorldRaws
    }
    field(:area_grasses, 1205704) {
        compound(:World_TAreaGrasses) {
            field(:world_tiles, 0) {
                global :Coord2dPath
            }
            field(:layer_grasses, 48) {
                stl_vector(8) {
                    pointer {
                        compound(:World_TAreaGrasses_TLayerGrasses) {
                            sizeof 48

                            field(:ref, 0) {
                                global :WorldPopulationRef
                            }
                            field(:grasses, 24) {
                                stl_vector(4) {
                                    number 32, true, -1
                                }
                            }
                            def grasses_tg ; grasses.map { |i| df.world.raws.plants.all[i] } ; end
                        }
                    }
                }
            }
        }
    }
    field(:flow_engine, 1205776) {
        compound(:World_TFlowEngine) {
            field(:rnd_16, 0) {
                number 8, true
            }
            field(:rnd_256, 2) {
                number 16, true
            }
            field(:rnd_pos, 4) {
                number 16, true
            }
            field(:rnd_x, 6) {
                static_array(16, 2) {
                    number 16, true
                }
            }
            field(:rnd_y, 38) {
                static_array(16, 2) {
                    number 16, true
                }
            }
            field(:block_idx, 72) {
                number 32, true, -1
            }
            field(:unk7a, 80) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk7b, 104) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk7c, 128) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk7_cntdn, 152) {
                stl_vector(2) {
                    number 16, true
                }
            }
        }
    }
    field(:busy_buildings, 1205952) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def busy_buildings_tg ; busy_buildings.map { |i| df.world.buildings.all.binsearch(i) } ; end
    field(:cavein_flags, 1205976) {
        df_flagarray(WorldCaveinFlags)
    }
    field(:original_save_version, 1205992) {
        number 32, true, nil, SaveVersion
    }
    field(:worldgen, 1206000) {
        compound(:World_TWorldgen) {
            field(:version, 0) {
                stl_string
            }
            field(:next_unit_chunk_id, 32) {
                number 32, true
            }
            field(:next_unit_chunk_offset, 36) {
                number 16, true
            }
            field(:next_art_image_chunk_id, 40) {
                number 32, true
            }
            field(:next_art_image_chunk_offset, 44) {
                number 16, true
            }
            field(:worldgen_parms, 48) {
                global :WorldgenParms
            }
        }
    }
    field(:history, 1207256) {
        global :WorldHistory
    }
    field(:entity_populations, 1208896) {
        stl_vector(8) {
            pointer {
                global :EntityPopulation
            }
        }
    }
    field(:unk_v40_6, 1208920) {
        compound(:World_TUnkV406) {
            field(:unk1, 0) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
            field(:unk2, 8064) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
            field(:unk3, 16128) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
            field(:unk4, 24192) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
            field(:unk5, 32256) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
            field(:unk6, 40320) {
                static_array(336, 24) {
                    stl_vector(4) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
    field(:unk_131ec0, 1257304) {
        stl_vector(8) {
            pointer {
                compound(:World_TUnk131ec0) {
                    sizeof 64

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        number 32, true
                    }
                    field(:unk_5, 16) {
                        number 32, true
                    }
                    field(:unk_6, 20) {
                        number 32, true
                    }
                    field(:unk_7, 24) {
                        number 32, true
                    }
                    field(:unk_8, 28) {
                        number 32, true
                    }
                    field(:unk_9, 32) {
                        number 32, true
                    }
                    field(:unk_10, 36) {
                        number 32, true
                    }
                    field(:unk_11, 40) {
                        number 32, true
                    }
                    field(:unk_12, 44) {
                        number 32, true
                    }
                    field(:unk_13, 48) {
                        number 32, true
                    }
                    field(:unk_14, 52) {
                        number 32, true
                    }
                    field(:unk_15, 56) {
                        number 32, true
                    }
                    field(:unk_16, 60) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:languages, 1257328) {
        stl_vector(8) {
            pointer {
                compound(:World_TLanguages) {
                    sizeof 40

                    field(:name, 0) {
                        stl_string
                    }
                    field(:unk_1, 32) {
                        number 32, true
                    }
                    field(:unk_2, 36) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_131ef0, 1257352) {
        stl_vector(8) {
            pointer {
                compound(:World_TUnk131ef0) {
                    sizeof 48

                    field(:hfid, 0) {
                        number 32, true, -1
                    }
                    def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
                    field(:claims, 8) {
                        stl_vector(8) {
                            pointer {
                                compound(:World_TUnk131ef0_TClaims) {
                                    sizeof 20

                                    field(:artifact, 0) {
                                        number 32, true, -1
                                    }
                                    def artifact_tg ; df.world.artifacts.all.binsearch(artifact) ; end
                                    field(:unk_1, 4) {
                                        number 32, true
                                    }
                                    field(:year, 8) {
                                        number 32, true
                                    }
                                    field(:year_tick, 12) {
                                        number 32, true, -1
                                    }
                                    field(:unk_2, 16) {
                                        number 32, true, -1
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_hfid, 32) {
                        number 32, true, -1
                    }
                    def unk_hfid_tg ; df.world.history.figures.binsearch(unk_hfid) ; end
                    field(:unk_1, 36) {
                        number 32, true
                    }
                    field(:unk_2, 40) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_131f08, 1257376) {
        number 32, true
    }
    field(:reindex_pathfinding, 1257380) {
        number 8, true, nil, BooleanEnum
    }
    field(:frame_counter, 1257384) {
        number 32, true
    }
    field(:orphaned_flows, 1257392) {
        stl_vector(8) {
            pointer {
                global :FlowInfo
            }
        }
    }
    field(:pathfinder, 1257416) {
        compound(:World_TPathfinder) {
            field(:boundary_heap, 0) {
                static_array(80000, 16) {
                    compound(:World_TPathfinder_TBoundaryHeap) {
                        field(:total_cost, 0) {
                            number 32, true
                        }
                        field(:local_cost, 4) {
                            number 32, true
                        }
                        field(:x, 8) {
                            number 16, true
                        }
                        field(:y, 10) {
                            number 16, true
                        }
                        field(:z, 12) {
                            number 32, true
                        }
                    }
                }
            }
            field(:heap_count, 1280000) {
                number 32, true
            }
            field(:pos1, 1280004) {
                global :Coord
            }
            field(:pos2, 1280010) {
                global :Coord
            }
            field(:dist_x, 1280016) {
                number 32, true
            }
            field(:dist_y, 1280020) {
                number 32, true
            }
            field(:dist_z, 1280024) {
                number 32, true
            }
            field(:next_path_cost, 1280028) {
                number 32, true
            }
            field(:wipe_path_cost, 1280032) {
                number 8, true, nil, BooleanEnum
            }
            field(:next_path_tag, 1280034) {
                number 16, false
            }
            field(:wipe_path_tag, 1280036) {
                number 8, true, nil, BooleanEnum
            }
            field(:next_walkable_id, 1280038) {
                number 16, true
            }
            field(:plant_update_step, 1280040) {
                number 16, true
            }
            field(:unk_1, 1280042) {
                number 8, true, nil, BooleanEnum
            }
        }
    }
    field(:save_version, 2537460) {
        number 32, true
    }
    field(:cur_savegame, 2537464) {
        compound(:World_TCurSavegame) {
            field(:save_dir, 0) {
                stl_string
            }
            field(:unk_v40_0s, 32) {
                number 32, true
            }
            field(:load_stage, 36) {
                class ::DFHack::World_TCurSavegame_TLoadStage < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :LoadingObjectFiles ; NUME[:LoadingObjectFiles] = 0
                    ENUM[1] = :SortingMaterialTemplates ; NUME[:SortingMaterialTemplates] = 1
                    ENUM[2] = :SortingInorganics ; NUME[:SortingInorganics] = 2
                    ENUM[3] = :SortingPlants ; NUME[:SortingPlants] = 3
                    ENUM[4] = :SortingTissueTemplates ; NUME[:SortingTissueTemplates] = 4
                    ENUM[5] = :SortingItems ; NUME[:SortingItems] = 5
                    ENUM[6] = :SortingBuildings ; NUME[:SortingBuildings] = 6
                    ENUM[7] = :SortingBodyDetailPlans ; NUME[:SortingBodyDetailPlans] = 7
                    ENUM[8] = :SortingCreatureBodies ; NUME[:SortingCreatureBodies] = 8
                    ENUM[9] = :SortingCreatureVariations ; NUME[:SortingCreatureVariations] = 9
                    ENUM[10] = :SortingCreatures ; NUME[:SortingCreatures] = 10
                    ENUM[11] = :SortingEntities ; NUME[:SortingEntities] = 11
                    ENUM[12] = :SortingLanguages ; NUME[:SortingLanguages] = 12
                    ENUM[13] = :SortingDescriptions ; NUME[:SortingDescriptions] = 13
                    ENUM[14] = :SortingReactions ; NUME[:SortingReactions] = 14
                    ENUM[15] = :SortingInteractions ; NUME[:SortingInteractions] = 15
                    ENUM[16] = :FinalizingLanguages ; NUME[:FinalizingLanguages] = 16
                    ENUM[17] = :FinalizingDescriptors ; NUME[:FinalizingDescriptors] = 17
                    ENUM[18] = :FinalizingMaterialTemplates ; NUME[:FinalizingMaterialTemplates] = 18
                    ENUM[19] = :FinalizingInorganics ; NUME[:FinalizingInorganics] = 19
                    ENUM[20] = :FinalizingPlants ; NUME[:FinalizingPlants] = 20
                    ENUM[21] = :FinalizingTissueTemplates ; NUME[:FinalizingTissueTemplates] = 21
                    ENUM[22] = :FinalizingItems ; NUME[:FinalizingItems] = 22
                    ENUM[23] = :FinalizingBuildings ; NUME[:FinalizingBuildings] = 23
                    ENUM[24] = :FinalizingBodyDetailPlans ; NUME[:FinalizingBodyDetailPlans] = 24
                    ENUM[25] = :FinalizingCreatureVariations ; NUME[:FinalizingCreatureVariations] = 25
                    ENUM[26] = :FinalizingCreatures ; NUME[:FinalizingCreatures] = 26
                    ENUM[27] = :FinalizingEntities ; NUME[:FinalizingEntities] = 27
                    ENUM[28] = :FinalizingReactions ; NUME[:FinalizingReactions] = 28
                    ENUM[29] = :FinalizingInteractions ; NUME[:FinalizingInteractions] = 29
                    ENUM[30] = :PreparingMaterialData ; NUME[:PreparingMaterialData] = 30
                    ENUM[31] = :GeneratingInorganics ; NUME[:GeneratingInorganics] = 31
                    ENUM[32] = :GeneratingPlants ; NUME[:GeneratingPlants] = 32
                    ENUM[33] = :GeneratingItems ; NUME[:GeneratingItems] = 33
                    ENUM[34] = :GeneratingCreatures ; NUME[:GeneratingCreatures] = 34
                    ENUM[35] = :GeneratingEntities ; NUME[:GeneratingEntities] = 35
                    ENUM[36] = :GeneratingReactions ; NUME[:GeneratingReactions] = 36
                    ENUM[37] = :GeneratingInteractions ; NUME[:GeneratingInteractions] = 37
                    ENUM[38] = :FinalizingGeneratedObjects ; NUME[:FinalizingGeneratedObjects] = 38
                    ENUM[39] = :PreparingTextObjects ; NUME[:PreparingTextObjects] = 39
                    ENUM[40] = :PreparingGraphics ; NUME[:PreparingGraphics] = 40
                    ENUM[41] = :Finishing ; NUME[:Finishing] = 41
                end

                number 32, true, nil, World_TCurSavegame_TLoadStage
            }
            field(:unk_v40_2s, 40) {
                number 32, true
            }
        }
    }
    field(:loading, 2537512) {
        compound(:World_TLoading) {
            field(:state, 0) {
                class ::DFHack::World_TLoading_TState < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :Initializing ; NUME[:Initializing] = 0
                    ENUM[1] = :Languages ; NUME[:Languages] = 1
                    ENUM[2] = :Shapes ; NUME[:Shapes] = 2
                    ENUM[3] = :Colors ; NUME[:Colors] = 3
                    ENUM[4] = :Patterns ; NUME[:Patterns] = 4
                    ENUM[5] = :MaterialTemplates ; NUME[:MaterialTemplates] = 5
                    ENUM[6] = :Inorganics ; NUME[:Inorganics] = 6
                    ENUM[7] = :Plants ; NUME[:Plants] = 7
                    ENUM[8] = :TissueTemplates ; NUME[:TissueTemplates] = 8
                    ENUM[9] = :Items ; NUME[:Items] = 9
                    ENUM[10] = :Buildings ; NUME[:Buildings] = 10
                    ENUM[11] = :BodyDetailPlans ; NUME[:BodyDetailPlans] = 11
                    ENUM[12] = :CreatureBodies ; NUME[:CreatureBodies] = 12
                    ENUM[13] = :CreatureVariations ; NUME[:CreatureVariations] = 13
                    ENUM[14] = :Creatures ; NUME[:Creatures] = 14
                    ENUM[15] = :Entities ; NUME[:Entities] = 15
                    ENUM[16] = :Reactions ; NUME[:Reactions] = 16
                    ENUM[17] = :Interactions ; NUME[:Interactions] = 17
                    ENUM[18] = :Finishing ; NUME[:Finishing] = 18
                end

                number 32, true, nil, World_TLoading_TState
            }
            field(:progress, 4) {
                number 32, true
            }
            field(:object_files, 8) {
                stl_vector(8) {
                    pointer {
                        static_string(-1)
                    }
                }
            }
            field(:object_file_index, 32) {
                number 32, true, -1
            }
        }
    }
    field(:unk_v40_7s, 2537552) {
        pointer {
        }
    }
    field(:features, 2537560) {
        compound(:World_TFeatures) {
            field(:unk_v47_1, 0) {
                stl_vector(8) {
                    pointer {
                        global :WorldSite
                    }
                }
            }
            field(:map_features, 24) {
                stl_vector(8) {
                    pointer {
                        global :FeatureInit
                    }
                }
            }
            field(:feature_x, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:feature_y, 72) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:feature_local_idx, 96) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:feature_global_idx, 120) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def feature_global_tgx ; feature_global_idx.map { |i| df.world.world_data.underground_regions[i] } ; end
            field(:unk_1, 144) {
                stl_vector(8) {
                    pointer {
                        global :FeatureInit
                    }
                }
            }
            field(:unk_2, 168) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_3, 192) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_4, 216) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_5, 240) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_6, 264) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_7, 288) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_8, 312) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_9, 336) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_10, 360) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_11, 384) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_12, 408) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_13, 432) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_14, 456) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_15, 480) {
                stl_bit_vector
            }
        }
    }
    field(:allow_announcements, 2538072) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_26a9a9, 2538073) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_26a9aa, 2538074) {
        number 8, true, nil, BooleanEnum
    }
    field(:arena_spawn, 2538080) {
        compound(:World_TArenaSpawn) {
            field(:race, 0) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            def race_tg ; race.map { |i| df.world.raws.creatures.all[i] } ; end
            field(:caste, 24) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:type, 48) {
                number 32, true, -1
            }
            field(:filter, 56) {
                stl_string
            }
            field(:item_types, 88) {
                static_array(107, 24) {
                    stl_vector(8) {
                        pointer {
                            compound(:World_TArenaSpawn_TItemTypes) {
                                sizeof 16

                                field(:item_type, 0) {
                                    number 16, true, nil, ItemType
                                }
                                field(:item_subtype, 2) {
                                    number 16, true, -1
                                }
                                field(:mattype, 4) {
                                    number 16, true, -1
                                }
                                field(:matindex, 8) {
                                    number 32, true
                                }
                                field(:unk_1, 12) {
                                    number 8, true, nil, BooleanEnum
                                }
                            }
                        }
                    }
                }
            }
            field(:unk_vec1, 2656) {
                stl_vector
            }
            field(:unk_vec2, 2680) {
                stl_vector
            }
            field(:unk_vec3, 2704) {
                stl_vector
            }
            field(:equipment, 2728) {
                compound(:World_TArenaSpawn_TEquipment) {
                    field(:skills, 0) {
                        stl_vector(2) {
                            number 16, true, nil, JobSkill
                        }
                    }
                    field(:skill_levels, 24) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:item_types, 48) {
                        stl_vector(2) {
                            number 16, true, nil, ItemType
                        }
                    }
                    field(:item_subtypes, 72) {
                        stl_vector(2) {
                            number 16, true, -1
                        }
                    }
                    field(:item_materials, 96) {
                        global :MaterialVecRef
                    }
                    field(:item_counts, 144) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
            field(:side, 2896) {
                number 32, true
            }
            field(:interaction, 2900) {
                number 32, true, -1
            }
            field(:tame, 2904) {
                class ::DFHack::World_TArenaSpawn_TTame < MemHack::Enum
                    ENUM = Hash.new
                    NUME = Hash.new
                    ENUM[0] = :NotTame ; NUME[:NotTame] = 0
                    ENUM[1] = :Tame ; NUME[:Tame] = 1
                end

                number 32, true, nil, World_TArenaSpawn_TTame
            }
            field(:interactions, 2912) {
                stl_vector(8) {
                    pointer {
                        global :InteractionEffect
                    }
                }
            }
            field(:creature_cnt, 2936) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_int1, 2960) {
                number 32, true
            }
        }
    }
    field(:arena_settings, 2541048) {
        compound(:World_TArenaSettings) {
            field(:conflict_level, 0) {
                number 32, true, nil, ConflictLevel
            }
            field(:morale_enable, 4) {
                number 8, true, nil, BooleanEnum
            }
            field(:unk1, 6) {
                number 16, true
            }
            field(:temperature, 8) {
                number 16, false
            }
            field(:time, 10) {
                number 16, true
            }
            field(:weather_column, 12) {
                number 32, true
            }
            field(:weather_row, 16) {
                number 32, true
            }
            field(:tree_types, 24) {
                stl_vector(8) {
                    pointer {
                        global :PlantRaw
                    }
                }
            }
            field(:tree_cursor, 48) {
                number 32, true
            }
            field(:tree_age, 52) {
                number 32, true
            }
            field(:tree_filter, 56) {
                stl_string
            }
            field(:tree_age_str, 88) {
                stl_string
            }
        }
    }
    field(:unk_26b5b8, 2541168) {
        number 8, true
    }
    field(:unk_26b5b9, 2541169) {
        number 8, true
    }
    field(:unk_26c678, 2541176) {
        compound(:World_TUnk26c678) {
            field(:unk_1, 0) {
                stl_vector
            }
            field(:unk_2, 24) {
                stl_vector
            }
            field(:unk_3, 48) {
                number 32, true
            }
            field(:unk_38, 56) {
                global :WorldUnk26c678Unk38
            }
            field(:unk_4, 2696) {
                stl_vector
            }
            field(:unk_5, 2720) {
                stl_vector
            }
            field(:unk_6, 2744) {
                stl_vector
            }
            field(:unk_7, 2768) {
                stl_vector
            }
            field(:unk_8, 2792) {
                stl_vector
            }
            field(:unk_9, 2816) {
                stl_vector
            }
            field(:unk_10, 2840) {
                stl_vector
            }
            field(:unk_11, 2864) {
                stl_vector
            }
        }
    }
    field(:unk_19325c, 2544064) {
        compound(:World_TUnk19325c) {
            field(:unk_1, 0) {
                stl_vector(8) {
                    pointer {
                        compound(:World_TUnk19325c_TUnk1) {
                            sizeof 32

                            field(:unk_1, 0) {
                                pointer {
                                }
                            }
                            field(:unk_2, 8) {
                                number 32, true
                            }
                            field(:unk_3, 12) {
                                number 16, true
                            }
                            field(:unk_4, 16) {
                                number 32, true
                            }
                            field(:unk_5, 20) {
                                number 32, true
                            }
                            field(:unk_6, 24) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_2, 24) {
                stl_vector(8) {
                    pointer {
                        compound(:World_TUnk19325c_TUnk2) {
                            sizeof 16

                            field(:unk_1, 0) {
                                pointer {
                                }
                            }
                            field(:unk_2, 8) {
                                number 32, true
                            }
                            field(:unk_3, 12) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_3, 48) {
                stl_vector(8) {
                    pointer {
                        compound(:World_TUnk19325c_TUnk3) {
                            sizeof 16

                            field(:unk_1, 0) {
                                number 16, true
                            }
                            field(:unk_2, 4) {
                                number 32, true
                            }
                            field(:unk_3, 8) {
                                number 32, true
                            }
                            field(:unk_4, 12) {
                                number 32, true
                            }
                        }
                    }
                }
            }
            field(:unk_4, 72) {
                number 32, true
            }
            field(:unk_5, 76) {
                number 32, true
            }
            field(:unk_6, 80) {
                number 32, true
            }
        }
    }
    field(:unk_26b618, 2544152) {
        number 32, true
    }
end

class WorldConstruction < MemHack::Compound
    sizeof 88

    rtti_classname :world_constructionst

    field(:id, 8) {
        number 32, true
    }
    field(:square_obj, 16) {
        stl_vector(8) {
            pointer {
                global :WorldConstructionSquare
            }
        }
    }
    field(:square_pos, 40) {
        global :Coord2dPath
    }
    def getType()
        WorldConstructionType.sym(DFHack.vmethod_call(self, 0))
    end
    def getName()
        ptr = DFHack.vmethod_call(self, 8)
        class << self
            global :LanguageName
        end._at(ptr) if ptr != 0
    end
    def write_file(file)
        DFHack.vmethod_call(self, 16, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 24, file, SaveVersion.int(loadversion)) ; nil
    end
end

class WorldConstructionBridgest < WorldConstruction
    sizeof 208

    rtti_classname :world_construction_bridgest

    field(:name, 88) {
        global :LanguageName
    }
end

class WorldConstructionRoadst < WorldConstruction
    sizeof 208

    rtti_classname :world_construction_roadst

    field(:name, 88) {
        global :LanguageName
    }
end

class WorldConstructionSquare < MemHack::Compound
    sizeof 112

    rtti_classname :world_construction_squarest

    field(:region_pos, 8) {
        global :Coord2d
    }
    field(:construction_id, 12) {
        number 32, true, -1
    }
    def construction_tg ; df.world.world_data.constructions.list.binsearch(construction_id) ; end
    field(:embark_x, 16) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:embark_y, 40) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:embark_unk, 64) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:embark_z, 88) {
        stl_vector(2) {
            number 16, true
        }
    }
    def getType()
        WorldConstructionType.sym(DFHack.vmethod_call(self, 0))
    end
    def write_file(file)
        DFHack.vmethod_call(self, 8, file) ; nil
    end
    def read_file(file, loadversion)
        DFHack.vmethod_call(self, 16, file, SaveVersion.int(loadversion)) ; nil
    end
end

class WorldConstructionSquareBridgest < WorldConstructionSquare
    sizeof 128

    rtti_classname :world_construction_square_bridgest

    field(:road_id, 112) {
        number 32, true, -1
    }
    def road_tg ; df.world.world_data.constructions.list.binsearch(road_id) ; end
    field(:item_type, 116) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 118) {
        number 16, true, -1
    }
    field(:mat_type, 120) {
        number 16, true, -1
    }
    field(:mat_index, 124) {
        number 32, true
    }
end

class WorldConstructionSquareRoadst < WorldConstructionSquare
    sizeof 128

    rtti_classname :world_construction_square_roadst

    field(:item_type, 112) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 114) {
        number 16, true, -1
    }
    field(:mat_type, 116) {
        number 16, true, -1
    }
    field(:mat_index, 120) {
        number 32, true
    }
end

class WorldConstructionSquareTunnelst < WorldConstructionSquare
    sizeof 112

    rtti_classname :world_construction_square_tunnelst

end

class WorldConstructionSquareWallst < WorldConstructionSquare
    sizeof 128

    rtti_classname :world_construction_square_wallst

    field(:item_type, 112) {
        number 16, true, nil, ItemType
    }
    field(:item_subtype, 114) {
        number 16, true, -1
    }
    field(:mat_type, 116) {
        number 16, true, -1
    }
    field(:mat_index, 120) {
        number 32, true
    }
end

class WorldConstructionTunnelst < WorldConstruction
    sizeof 208

    rtti_classname :world_construction_tunnelst

    field(:name, 88) {
        global :LanguageName
    }
end

class WorldConstructionWallst < WorldConstruction
    sizeof 208

    rtti_classname :world_construction_wallst

    field(:name, 88) {
        global :LanguageName
    }
end

class WorldDatSummary < MemHack::Compound
    sizeof 352

    field(:name, 0) {
        global :LanguageName
    }
    field(:unk_1, 120) {
        stl_string
    }
    field(:unk_2, 152) {
        static_array(15, 1) {
            number 8, true
        }
    }
    field(:last_id, 168) {
        compound(:WorldDatSummary_TLastId) {
            field(:unit, 0) {
                number 32, true
            }
            field(:soul, 4) {
                number 32, true
            }
            field(:ite, 8) {
                number 32, true
            }
            field(:entity, 12) {
                number 32, true
            }
            field(:nemesis, 16) {
                number 32, true
            }
            field(:artifact, 20) {
                number 32, true
            }
            field(:building, 24) {
                number 32, true
            }
            field(:machine, 28) {
                number 32, true
            }
            field(:hist_figure, 32) {
                number 32, true
            }
            field(:hist_event, 36) {
                number 32, true
            }
            field(:hist_event_collection, 40) {
                number 32, true
            }
            field(:unit_chunk, 44) {
                number 32, true
            }
            field(:art_image_chunk, 48) {
                number 32, true
            }
            field(:task, 52) {
                number 32, true
            }
            field(:squad, 56) {
                number 32, true
            }
            field(:formation, 60) {
                number 32, true
            }
            field(:activity, 64) {
                number 32, true
            }
            field(:interaction_instance, 68) {
                number 32, true
            }
            field(:written_content, 72) {
                number 32, true
            }
            field(:identity, 76) {
                number 32, true
            }
            field(:incident, 80) {
                number 32, true
            }
            field(:crime, 84) {
                number 32, true
            }
            field(:vehicle, 88) {
                number 32, true
            }
            field(:army, 92) {
                number 32, true
            }
            field(:army_controller, 96) {
                number 32, true
            }
            field(:army_tracking_info, 100) {
                number 32, true
            }
            field(:cultural_identity, 104) {
                number 32, true
            }
            field(:agreement, 108) {
                number 32, true
            }
            field(:poetic_form, 112) {
                number 32, true
            }
            field(:musical_form, 116) {
                number 32, true
            }
            field(:dance_form, 120) {
                number 32, true
            }
            field(:scale, 124) {
                number 32, true
            }
            field(:rhythm, 128) {
                number 32, true
            }
            field(:occupation, 132) {
                number 32, true
            }
            field(:belief_system, 136) {
                number 32, true
            }
            field(:image_set, 140) {
                number 32, true
            }
            field(:divination_set, 144) {
                number 32, true
            }
        }
    }
    field(:unk_3, 320) {
        stl_string
    }
end

class WorldData < MemHack::Compound
    sizeof 1576056

    field(:name, 0) {
        global :LanguageName
    }
    field(:unk1, 120) {
        static_array(15, 1) {
            number 8, true
        }
    }
    field(:next_site_id, 136) {
        number 32, true
    }
    field(:next_site_unk130_id, 140) {
        number 32, true
    }
    field(:next_resource_allotment_id, 144) {
        number 32, true
    }
    field(:next_breed_id, 148) {
        number 32, true
    }
    field(:next_battlefield_id, 152) {
        number 32, true
    }
    field(:unk_v34_1, 156) {
        number 32, true
    }
    field(:world_width, 160) {
        number 32, true
    }
    field(:world_height, 164) {
        number 32, true
    }
    field(:unk_78, 168) {
        number 32, true
    }
    field(:moon_phase, 172) {
        number 32, true
    }
    field(:flip_latitude, 176) {
        class ::DFHack::WorldData_TFlipLatitude < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[-1] = :None ; NUME[:None] = -1
            ENUM[0] = :North ; NUME[:North] = 0
            ENUM[1] = :South ; NUME[:South] = 1
            ENUM[2] = :Both ; NUME[:Both] = 2
        end

        number 16, true, nil, WorldData_TFlipLatitude
    }
    field(:flip_longitude, 178) {
        number 16, true
    }
    field(:unk_84, 180) {
        number 16, true
    }
    field(:unk_86, 182) {
        number 16, true
    }
    field(:unk_88, 184) {
        number 16, true
    }
    field(:unk_8a, 186) {
        number 16, true
    }
    field(:unk_v34_2, 188) {
        number 16, true
    }
    field(:unk_v34_3, 190) {
        number 16, true
    }
    field(:unk_b4, 192) {
        compound(:WorldData_TUnkB4) {
            field(:world_width2, 0) {
                number 32, true
            }
            field(:world_height2, 4) {
                number 32, true
            }
            field(:unk_1, 8) {
                pointer_ary(4) {
                    number 32, false
                }
            }
            field(:unk_2, 16) {
                pointer_ary(4) {
                    number 32, false
                }
            }
            field(:unk_3, 24) {
                pointer_ary(4) {
                    number 32, false
                }
            }
            field(:unk_4, 32) {
                pointer_ary(1) {
                    number 8, false
                }
            }
        }
    }
    field(:region_details, 232) {
        stl_vector(8) {
            pointer {
                global :WorldRegionDetails
            }
        }
    }
    field(:adv_region_x, 256) {
        number 32, true
    }
    field(:adv_region_y, 260) {
        number 32, true
    }
    field(:adv_emb_x, 264) {
        number 32, true
    }
    field(:adv_emb_y, 268) {
        number 32, true
    }
    field(:unk_x1, 272) {
        number 16, true
    }
    field(:unk_y1, 274) {
        number 16, true
    }
    field(:unk_x2, 276) {
        number 16, true
    }
    field(:unk_y2, 278) {
        number 16, true
    }
    field(:constructions, 280) {
        compound(:WorldData_TConstructions) {
            field(:width, 0) {
                number 16, true
            }
            field(:height, 2) {
                number 16, true
            }
            field(:map, 8) {
                pointer_ary(8) {
                    pointer_ary(24) {
                        stl_vector(8) {
                            pointer {
                                global :WorldConstructionSquare
                            }
                        }
                    }
                }
            }
            field(:list, 16) {
                stl_vector(8) {
                    pointer {
                        global :WorldConstruction
                    }
                }
            }
            field(:next_id, 40) {
                number 32, true
            }
        }
    }
    field(:entity_claims1, 328) {
        global :EntityClaimMask
    }
    field(:entity_claims2, 344) {
        global :EntityClaimMask
    }
    field(:sites, 360) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:site_unk130, 384) {
        stl_vector(8) {
            pointer {
                global :WorldSiteUnk130
            }
        }
    }
    field(:resource_allotments, 408) {
        stl_vector(8) {
            pointer {
                global :ResourceAllotmentData
            }
        }
    }
    field(:breeds, 432) {
        stl_vector(8) {
            pointer {
                global :Breed
            }
        }
    }
    field(:battlefields, 456) {
        stl_vector(8) {
            pointer {
                global :Battlefield
            }
        }
    }
    field(:region_weather, 480) {
        stl_vector(8) {
            pointer {
                global :RegionWeather
            }
        }
    }
    field(:object_data, 504) {
        stl_vector(8) {
            pointer {
                global :WorldObjectData
            }
        }
    }
    field(:landmasses, 528) {
        stl_vector(8) {
            pointer {
                global :WorldLandmass
            }
        }
    }
    field(:regions, 552) {
        stl_vector(8) {
            pointer {
                global :WorldRegion
            }
        }
    }
    field(:underground_regions, 576) {
        stl_vector(8) {
            pointer {
                global :WorldUndergroundRegion
            }
        }
    }
    field(:geo_biomes, 600) {
        stl_vector(8) {
            pointer {
                global :WorldGeoBiome
            }
        }
    }
    field(:mountain_peaks, 624) {
        stl_vector(8) {
            pointer {
                global :WorldMountainPeak
            }
        }
    }
    field(:rivers, 648) {
        stl_vector(8) {
            pointer {
                global :WorldRiver
            }
        }
    }
    field(:region_map, 672) {
        pointer_ary(8) {
            pointer_ary(112) {
                global :RegionMapEntry
            }
        }
    }
    field(:unk_1c4, 680) {
        pointer_ary(1) {
            number 8, true
        }
    }
    field(:unk_1c8, 688) {
    }
    field(:embark_notes, 696) {
        stl_vector(8) {
            pointer {
                global :EmbarkNote
            }
        }
    }
    field(:unk_1dc, 720) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector(8) {
                    pointer {
                        global :Army
                    }
                }
            }
        }
    }
    field(:unk_1e0, 728) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector
            }
        }
    }
    field(:unk_1e4, 736) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector
            }
        }
    }
    field(:unk_1e8, 744) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector
            }
        }
    }
    field(:unk_1ec, 752) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector
            }
        }
    }
    field(:unk_1f0, 760) {
        pointer_ary(8) {
            pointer_ary(24) {
                stl_vector
            }
        }
    }
    field(:unk_1, 768) {
        number 32, true
    }
    field(:unk_2, 776) {
        pointer {
        }
    }
    field(:unk_3, 784) {
        pointer {
        }
    }
    field(:unk_4, 792) {
        pointer {
        }
    }
    field(:unk_5, 800) {
        pointer {
        }
    }
    field(:unk_6, 808) {
        pointer {
        }
    }
    field(:unk_7, 816) {
        pointer {
        }
    }
    field(:unk_8, 824) {
        pointer {
        }
    }
    field(:unk_9, 832) {
        pointer {
        }
    }
    field(:unk_10, 840) {
        pointer {
        }
    }
    field(:unk_11, 848) {
        pointer {
        }
    }
    field(:unk_12, 856) {
        pointer {
        }
    }
    field(:unk_13, 864) {
        pointer {
        }
    }
    field(:unk_14, 872) {
        pointer {
        }
    }
    field(:unk_15, 880) {
        pointer {
        }
    }
    field(:unk_16, 888) {
        pointer {
        }
    }
    field(:pad_1, 896) {
    }
    field(:unk_17, 295816) {
        number 8, true
    }
    field(:unk_18, 295817) {
        number 8, true
    }
    field(:active_site, 295824) {
        stl_vector(8) {
            pointer {
                global :WorldSite
            }
        }
    }
    field(:feature_map, 295848) {
        pointer_ary(8) {
            pointer_ary(32) {
                compound(:WorldData_TFeatureMap) {
                    sizeof 32

                    field(:x, 0) {
                        number 16, true
                    }
                    field(:y, 2) {
                        number 16, true
                    }
                    field(:features, 8) {
                        pointer {
                            compound(:WorldData_TFeatureMap_TFeatures) {
                                sizeof 36864

                                field(:feature_init, 0) {
                                    static_array(16, 384) {
                                        static_array(16, 24) {
                                            stl_vector(8) {
                                                pointer {
                                                    global :FeatureInit
                                                }
                                            }
                                        }
                                    }
                                }
                                field(:unk, 6144) {
                                    static_array(16, 1920) {
                                        static_array(16, 120) {
                                            static_array(30, 4) {
                                                number 32, true
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_8, 16) {
                        pointer_ary(2) {
                            number 16, true
                        }
                    }
                    field(:unk_c, 24) {
                        pointer_ary(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:old_sites, 295856) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def old_sites_tg ; old_sites.map { |i| df.world.world_data.sites.binsearch(i) } ; end
    field(:old_site_x, 295880) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:old_site_y, 295904) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:land_rgns, 295928) {
        global :Coord2dPath
    }
    field(:unk_260, 295976) {
        number 32, true
    }
    field(:unk_264, 295980) {
        number 8, true
    }
    field(:unk_268, 295984) {
        number 32, true
    }
    field(:unk_26c, 295988) {
        number 8, true
    }
    field(:unk_270, 295992) {
        number 32, true
    }
    field(:unk_274, 296000) {
        stl_vector(8) {
            pointer {
                compound(:WorldData_TUnk274) {
                    sizeof 80

                    field(:members, 0) {
                        stl_vector(8) {
                            pointer {
                                global :HistoricalFigure
                            }
                        }
                    }
                    field(:unk_10, 24) {
                        stl_vector(8) {
                            pointer {
                                compound(:WorldData_TUnk274_TUnk10) {
                                    sizeof 12

                                    field(:unk_0, 0) {
                                        number 32, true
                                    }
                                    field(:race, 4) {
                                        number 32, true, -1
                                    }
                                    def race_tg ; df.world.raws.creatures.all[race] ; end
                                    field(:unk_8, 8) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                    field(:entity, 48) {
                        pointer {
                            global :HistoricalEntity
                        }
                    }
                    field(:unk_24, 56) {
                        number 32, true
                    }
                    field(:unk_region_name, 64) {
                        pointer {
                            global :LanguageName
                        }
                    }
                    field(:unk_2c, 72) {
                        number 32, true
                    }
                    field(:unk_30, 76) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_482f8, 296024) {
        compound(:WorldData_TUnk482f8) {
            field(:unk_1, 0) {
                static_array(320000, 4) {
                    number 32, true
                }
            }
            field(:unk_2, 1280000) {
                number 32, true
            }
            field(:unk_3, 1280004) {
                number 32, true
            }
            field(:unk_4, 1280008) {
                number 32, true
            }
            field(:unk_5, 1280012) {
                number 32, true
            }
            field(:unk_6, 1280016) {
                number 32, true
            }
            field(:unk_7, 1280020) {
                number 32, true
            }
            field(:unk_8, 1280024) {
                number 32, true
            }
        }
    }
end

class WorldGenParamBasest < MemHack::Compound
    sizeof 40

    rtti_classname :world_gen_param_basest

    field(:name, 8) {
        stl_string
    }
    def getString(arg0)
        DFHack.vmethod_call(self, 0, arg0) ; nil
    end
    def getMinVal()
        val = DFHack.vmethod_call(self, 24)
    end
    def getMaxVal()
        val = DFHack.vmethod_call(self, 32)
    end
    def setFromString(arg0)
        DFHack.vmethod_call(self, 40, arg0) ; nil
    end
    def setToDefault()
        DFHack.vmethod_call(self, 48) ; nil
    end
    def doIncrement()
        DFHack.vmethod_call(self, 56) ; nil
    end
    def doDecrement()
        DFHack.vmethod_call(self, 64) ; nil
    end
end

class WorldGenParamValuest < WorldGenParamBasest
    sizeof 104

    rtti_classname :world_gen_param_valuest

    field(:label, 40) {
        stl_string
    }
    field(:custom, 72) {
        number 8, true, nil, BooleanEnum
    }
    field(:preset_labels, 80) {
        stl_vector(8) {
            pointer {
                stl_string
            }
        }
    }
end

class WorldGenParamCharst < WorldGenParamValuest
    sizeof 144

    rtti_classname :world_gen_param_charst

    field(:value, 104) {
        pointer {
            number 8, true
        }
    }
    field(:min_val, 112) {
        number 8, true
    }
    field(:max_val, 113) {
        number 8, true
    }
    field(:initial_val, 114) {
        number 8, true
    }
    field(:presets, 120) {
        stl_vector(1) {
            number 8, true
        }
    }
end

class WorldGenParamMemberst < WorldGenParamValuest
    sizeof 152

    rtti_classname :world_gen_param_memberst

    field(:value, 104) {
        pointer {
            number 32, true
        }
    }
    field(:min_val, 112) {
        number 32, true
    }
    field(:max_val, 116) {
        number 32, true
    }
    field(:initial_val, 120) {
        number 32, true
    }
    field(:presets, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class WorldGenParamSeedst < WorldGenParamBasest
    sizeof 48

    rtti_classname :world_gen_param_seedst

    field(:value, 40) {
        pointer {
            stl_string
        }
    }
end

class WorldGeoBiome < MemHack::Compound
    sizeof 32

    field(:unk1, 0) {
        number 16, true
    }
    field(:index, 2) {
        number 16, true
    }
    field(:layers, 8) {
        stl_vector(8) {
            pointer {
                global :WorldGeoLayer
            }
        }
    }
end

class WorldGeoLayer < MemHack::Compound
    sizeof 112

    field(:type, 0) {
        number 16, true, nil, GeoLayerType
    }
    field(:mat_index, 4) {
        number 32, true, -1
    }
    def mat_index_tg ; df.world.raws.inorganics[mat_index] ; end
    field(:vein_mat, 8) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def vein_mat_tg ; vein_mat.map { |i| df.world.raws.inorganics[i] } ; end
    field(:vein_nested_in, 32) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:vein_type, 56) {
        stl_vector(1) {
            number 8, true, nil, InclusionType
        }
    }
    field(:vein_unk_38, 80) {
        stl_vector(1) {
            number 8, true
        }
    }
    field(:top_height, 104) {
        number 16, true
    }
    field(:bottom_height, 106) {
        number 16, true
    }
end

class WorldHistory < MemHack::Compound
    sizeof 1640

    field(:events, 0) {
        stl_vector(8) {
            pointer {
                global :HistoryEvent
            }
        }
    }
    field(:events_death, 24) {
        stl_vector(8) {
            pointer {
                global :HistoryEvent
            }
        }
    }
    field(:relationship_events, 48) {
        stl_vector(8) {
            pointer {
                global :RelationshipEvent
            }
        }
    }
    field(:relationship_event_supplements, 72) {
        stl_vector(8) {
            pointer {
                global :RelationshipEventSupplement
            }
        }
    }
    field(:figures, 96) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:event_collections, 120) {
        compound(:WorldHistory_TEventCollections) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :HistoryEventCollection
                    }
                }
            }
            field(:other, 24) {
                static_array(18, 24, HistoryEventCollectionType) {
                    stl_vector(8) {
                        pointer {
                            global :HistoryEventCollection
                        }
                    }
                }
            }
        }
    }
    field(:eras, 576) {
        stl_vector(8) {
            pointer {
                global :HistoryEra
            }
        }
    }
    field(:discovered_art_image_id, 600) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def discovered_art_image_tg ; discovered_art_image_id.map { |i| df.world.art_image_chunks.binsearch(i) } ; end
    field(:discovered_art_image_subid, 624) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    field(:total_unk, 648) {
        number 32, true
    }
    field(:total_powers, 652) {
        number 32, true
    }
    field(:total_megabeasts, 656) {
        number 32, true
    }
    field(:total_semimegabeasts, 660) {
        number 32, true
    }
    field(:unk_14, 664) {
        stl_vector
    }
    field(:unk_v42_1, 688) {
        static_array(28, 2) {
            number 16, true
        }
    }
    field(:intrigues, 744) {
        stl_vector(8) {
            pointer {
                global :Intrigue
            }
        }
    }
    field(:live_megabeasts, 768) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:live_semimegabeasts, 792) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_3, 816) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_4, 840) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_5, 864) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_1, 888) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_v40_1, 912) {
        static_array(15, 24) {
            stl_vector(8) {
                pointer {
                    global :HistoricalFigure
                }
            }
        }
    }
    field(:unk_histfig_6, 1272) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_7, 1296) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_8, 1320) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_9, 1344) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_10, 1368) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_11, 1392) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_12, 1416) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_histfig_13, 1440) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_3, 1464) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_4, 1488) {
        stl_vector
    }
    field(:unk_5, 1512) {
        stl_vector(8) {
            pointer {
                global :HistoricalFigure
            }
        }
    }
    field(:unk_6, 1536) {
        stl_vector
    }
    field(:unk_7, 1560) {
        stl_vector
    }
    field(:unk_8, 1584) {
        number 8, true
    }
    field(:active_event_collections, 1592) {
        stl_vector(8) {
            pointer {
                global :HistoryEventCollection
            }
        }
    }
    field(:unk_10, 1616) {
        number 8, true
    }
    field(:unk_11, 1620) {
        number 32, true
    }
    field(:unk_12, 1624) {
        number 32, true
    }
    field(:active_mission, 1632) {
        pointer {
            global :MissionReport
        }
    }
end

class WorldLandmass < MemHack::Compound
    sizeof 192

    field(:name, 0) {
        global :LanguageName
    }
    field(:index, 120) {
        number 32, true
    }
    field(:area, 124) {
        number 32, true
    }
    field(:min_x, 128) {
        number 32, true
    }
    field(:max_x, 132) {
        number 32, true
    }
    field(:min_y, 136) {
        number 32, true
    }
    field(:max_y, 140) {
        number 32, true
    }
    field(:unk_74, 144) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_84, 168) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class WorldMountainPeak < MemHack::Compound
    sizeof 152

    field(:name, 0) {
        global :LanguageName
    }
    field(:pos, 120) {
        global :Coord2d
    }
    field(:flags, 128) {
        df_flagarray(MountainPeakFlags)
    }
    field(:height, 144) {
        number 16, true
    }
end

class WorldObjectData < MemHack::Compound
    sizeof 528

    field(:id, 0) {
        number 32, true
    }
    field(:altered_items, 8) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:offloaded_items, 32) {
        stl_vector(8) {
            pointer {
                compound(:WorldObjectData_TOffloadedItems) {
                    sizeof 32

                    field(:item, 0) {
                        pointer {
                            global :Item
                        }
                    }
                    field(:global_x, 8) {
                        number 32, true
                    }
                    field(:global_y, 12) {
                        number 32, true
                    }
                    field(:global_z, 16) {
                        number 32, true
                    }
                    field(:container, 20) {
                        number 32, true, -1
                    }
                    def container_tg ; df.world.items.all.binsearch(container) ; end
                    field(:building, 24) {
                        number 32, true, -1
                    }
                    def building_tg ; df.world.buildings.all.binsearch(building) ; end
                    field(:unk_18, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_24, 56) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_34, 80) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_44, 104) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_54, 128) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_64, 152) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:altered_buildings, 176) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:offloaded_buildings, 200) {
        stl_vector(8) {
            pointer {
                compound(:WorldObjectData_TOffloadedBuildings) {
                    sizeof 24

                    field(:building, 0) {
                        pointer {
                            global :Building
                        }
                    }
                    field(:global_x, 8) {
                        number 32, true
                    }
                    field(:global_y, 12) {
                        number 32, true
                    }
                    field(:global_z, 16) {
                        number 32, true
                    }
                    field(:unk_10, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_94, 224) {
        stl_vector(8) {
            pointer {
                compound(:WorldObjectData_TUnk94) {
                    sizeof 16

                    field(:global_x, 0) {
                        number 32, true
                    }
                    field(:global_y, 4) {
                        number 32, true
                    }
                    field(:global_z, 8) {
                        number 32, true
                    }
                    field(:unk_c, 12) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:creation_zone_alterations, 248) {
        stl_vector(8) {
            pointer {
                global :CreationZonePwgAlterationst
            }
        }
    }
    field(:unk_v40_1, 272) {
        number 32, true
    }
    field(:year, 276) {
        number 32, true
    }
    field(:year_tick, 280) {
        number 32, true
    }
    field(:picked_growths, 288) {
        compound(:WorldObjectData_TPickedGrowths) {
            field(:x, 0) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:y, 24) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:z, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:subtype, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:density, 96) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:year, 120) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:unk_v43, 432) {
        compound(:WorldObjectData_TUnkV43) {
            field(:x, 0) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:y, 24) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:z, 48) {
                stl_vector(2) {
                    number 16, true
                }
            }
            field(:unk_4, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
end

class WorldPopulation < MemHack::Compound
    sizeof 40

    field(:type, 0) {
        number 8, true, nil, WorldPopulationType
    }
    field(:race, 2) {
        number 16, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:plant, 2) {
        number 16, true, -1
    }
    def plant_tg ; df.world.raws.plants.all[plant] ; end
    field(:count_min, 4) {
        number 32, true, 10000001
    }
    field(:count_max, 8) {
        number 32, true, 10000001
    }
    field(:unk_c, 12) {
        number 32, true
    }
    field(:owner, 16) {
        number 32, true, -1
    }
    def owner_tg ; df.world.entities.all.binsearch(owner) ; end
    field(:unk_10, 20) {
        number 32, true, -1
    }
    field(:unk_14, 24) {
        number 32, true, -1
    }
    field(:unk_18, 28) {
        number 32, true, -1
    }
    field(:unk_1c, 32) {
        number 32, true, -1
    }
    field(:unk_20, 36) {
        number 32, true, -1
    }
end

class WorldPopulationRef < MemHack::Compound
    sizeof 24

    field(:region_x, 0) {
        number 16, true
    }
    field(:region_y, 2) {
        number 16, true
    }
    field(:feature_idx, 4) {
        number 16, true, -1
    }
    field(:cave_id, 8) {
        number 32, true, -1
    }
    def cave_tg ; df.world.world_data.underground_regions[cave_id] ; end
    field(:unk_28, 12) {
        number 32, true
    }
    field(:population_idx, 16) {
        number 32, true
    }
    field(:depth, 20) {
        number 16, true, nil, LayerType
    }
end

class WorldRaws < MemHack::Compound
    sizeof 48752

    field(:material_templates, 0) {
        stl_vector(8) {
            pointer {
                global :MaterialTemplate
            }
        }
    }
    field(:inorganics, 24) {
        stl_vector(8) {
            pointer {
                global :InorganicRaw
            }
        }
    }
    field(:inorganics_subset, 48) {
        stl_vector(8) {
            pointer {
                global :InorganicRaw
            }
        }
    }
    field(:plants, 72) {
        compound(:WorldRaws_TPlants) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :PlantRaw
                    }
                }
            }
            field(:bushes, 24) {
                stl_vector(8) {
                    pointer {
                        global :PlantRaw
                    }
                }
            }
            field(:bushes_idx, 48) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def bushes_tgx ; bushes_idx.map { |i| df.world.raws.plants.all[i] } ; end
            field(:trees, 72) {
                stl_vector(8) {
                    pointer {
                        global :PlantRaw
                    }
                }
            }
            field(:trees_idx, 96) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def trees_tgx ; trees_idx.map { |i| df.world.raws.plants.all[i] } ; end
            field(:grasses, 120) {
                stl_vector(8) {
                    pointer {
                        global :PlantRaw
                    }
                }
            }
            field(:grasses_idx, 144) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def grasses_tgx ; grasses_idx.map { |i| df.world.raws.plants.all[i] } ; end
        }
    }
    field(:tissue_templates, 240) {
        stl_vector(8) {
            pointer {
                global :TissueTemplate
            }
        }
    }
    field(:body_detail_plans, 264) {
        stl_vector(8) {
            pointer {
                global :BodyDetailPlan
            }
        }
    }
    field(:body_templates, 288) {
        stl_vector(8) {
            pointer {
                global :BodyTemplate
            }
        }
    }
    field(:bodyglosses, 312) {
        stl_vector(8) {
            pointer {
                compound(:WorldRaws_TBodyglosses) {
                    sizeof 160

                    field(:id, 0) {
                        stl_string
                    }
                    field(:old_singular, 32) {
                        stl_string
                    }
                    field(:new_singular, 64) {
                        stl_string
                    }
                    field(:old_plural, 96) {
                        stl_string
                    }
                    field(:new_plural, 128) {
                        stl_string
                    }
                }
            }
        }
    }
    field(:creature_variations, 336) {
        stl_vector(8) {
            pointer {
                global :CreatureVariation
            }
        }
    }
    field(:creatures, 360) {
        global :CreatureHandler
    }
    field(:itemdefs, 496) {
        compound(:WorldRaws_TItemdefs) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :Itemdef
                    }
                }
            }
            field(:weapons, 24) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefWeaponst
                    }
                }
            }
            field(:trapcomps, 48) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefTrapcompst
                    }
                }
            }
            field(:toys, 72) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefToyst
                    }
                }
            }
            field(:tools, 96) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefToolst
                    }
                }
            }
            field(:tools_by_type, 120) {
                static_array(26, 24, ToolUses) {
                    stl_vector(8) {
                        pointer {
                            global :ItemdefToolst
                        }
                    }
                }
            }
            field(:instruments, 744) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefInstrumentst
                    }
                }
            }
            field(:armor, 768) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefArmorst
                    }
                }
            }
            field(:ammo, 792) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefAmmost
                    }
                }
            }
            field(:siege_ammo, 816) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefSiegeammost
                    }
                }
            }
            field(:gloves, 840) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefGlovesst
                    }
                }
            }
            field(:shoes, 864) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefShoesst
                    }
                }
            }
            field(:shields, 888) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefShieldst
                    }
                }
            }
            field(:helms, 912) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefHelmst
                    }
                }
            }
            field(:pants, 936) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefPantsst
                    }
                }
            }
            field(:food, 960) {
                stl_vector(8) {
                    pointer {
                        global :ItemdefFoodst
                    }
                }
            }
        }
    }
    field(:entities, 1480) {
        stl_vector(8) {
            pointer {
                global :EntityRaw
            }
        }
    }
    field(:language, 1504) {
        compound(:WorldRaws_TLanguage) {
            field(:words, 0) {
                stl_vector(8) {
                    pointer {
                        global :LanguageWord
                    }
                }
            }
            field(:symbols, 24) {
                stl_vector(8) {
                    pointer {
                        global :LanguageSymbol
                    }
                }
            }
            field(:translations, 48) {
                stl_vector(8) {
                    pointer {
                        global :LanguageTranslation
                    }
                }
            }
            field(:word_table, 72) {
                static_array(2, 19296) {
                    static_array(67, 288, LanguageNameCategory) {
                        global :LanguageWordTable
                    }
                }
            }
        }
    }
    field(:descriptors, 40168) {
        compound(:WorldRaws_TDescriptors) {
            field(:colors, 0) {
                stl_vector(8) {
                    pointer {
                        global :DescriptorColor
                    }
                }
            }
            field(:shapes, 24) {
                stl_vector(8) {
                    pointer {
                        global :DescriptorShape
                    }
                }
            }
            field(:patterns, 48) {
                stl_vector(8) {
                    pointer {
                        global :DescriptorPattern
                    }
                }
            }
            field(:unk_1, 72) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_2, 96) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_3, 120) {
                stl_vector(4) {
                    number 32, true
                }
            }
        }
    }
    field(:reactions, 40312) {
        compound(:WorldRaws_TReactions) {
            field(:reactions, 0) {
                stl_vector(8) {
                    pointer {
                        global :Reaction
                    }
                }
            }
            field(:reaction_categories, 24) {
                stl_vector(8) {
                    pointer {
                        global :ReactionCategory
                    }
                }
            }
        }
    }
    field(:buildings, 40360) {
        compound(:WorldRaws_TBuildings) {
            field(:all, 0) {
                stl_vector(8) {
                    pointer {
                        global :BuildingDef
                    }
                }
            }
            field(:workshops, 24) {
                stl_vector(8) {
                    pointer {
                        global :BuildingDefWorkshopst
                    }
                }
            }
            field(:furnaces, 48) {
                stl_vector(8) {
                    pointer {
                        global :BuildingDefFurnacest
                    }
                }
            }
            field(:next_id, 72) {
                number 32, true
            }
        }
    }
    field(:interactions, 40440) {
        stl_vector(8) {
            pointer {
                global :Interaction
            }
        }
    }
    field(:mat_table, 40464) {
        global :SpecialMatTable
    }
    field(:syndromes, 48544) {
        compound(:WorldRaws_TSyndromes) {
            field(:mat_types, 0) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:mat_indexes, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:interactions, 48) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def interactions_tg ; interactions.map { |i| df.world.raws.interactions.binsearch(i) } ; end
            field(:all, 72) {
                stl_vector(8) {
                    pointer {
                        global :Syndrome
                    }
                }
            }
        }
    }
    field(:effects, 48640) {
        compound(:WorldRaws_TEffects) {
            field(:mat_types, 0) {
                stl_vector(2) {
                    number 16, true, -1
                }
            }
            field(:mat_indexes, 24) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:interactions, 48) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def interactions_tg ; interactions.map { |i| df.world.raws.interactions.binsearch(i) } ; end
            field(:all, 72) {
                stl_vector(8) {
                    pointer {
                        global :CreatureInteractionEffect
                    }
                }
            }
        }
    }
    field(:text_object_counts, 48736) {
        compound(:WorldRaws_TTextObjectCounts) {
            field(:book_instruction, 0) {
                number 32, true
            }
            field(:book_art, 4) {
                number 32, true
            }
            field(:secret_death, 8) {
                number 32, true
            }
        }
    }
end

class WorldRegion < MemHack::Compound
    sizeof 648

    field(:name, 0) {
        global :LanguageName
    }
    field(:index, 120) {
        number 32, true
    }
    field(:type, 124) {
        number 16, true, nil, WorldRegionType
    }
    field(:region_coords, 128) {
        global :Coord2dPath
    }
    field(:size, 176) {
        number 32, true
    }
    field(:unk_98, 180) {
        number 32, true
    }
    field(:unk_9c, 184) {
        number 32, true
    }
    field(:unk_a0, 188) {
        number 32, true
    }
    field(:unk_a4, 192) {
        number 32, true
    }
    field(:population, 200) {
        stl_vector(8) {
            pointer {
                global :WorldPopulation
            }
        }
    }
    field(:biome_tile_counts, 224) {
        static_array(51, 4, BiomeType) {
            number 32, true
        }
    }
    field(:tree_biomes, 432) {
        stl_vector(2) {
            number 16, true, nil, BiomeType
        }
    }
    field(:tree_tiles_1, 456) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def tree_tiles_1_tg ; tree_tiles_1.map { |i| df.world.raws.plants.all[i] } ; end
    field(:tree_tiles_2, 480) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def tree_tiles_2_tg ; tree_tiles_2.map { |i| df.world.raws.plants.all[i] } ; end
    field(:tree_tiles_good, 504) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def tree_tiles_good_tg ; tree_tiles_good.map { |i| df.world.raws.plants.all[i] } ; end
    field(:tree_tiles_evil, 528) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def tree_tiles_evil_tg ; tree_tiles_evil.map { |i| df.world.raws.plants.all[i] } ; end
    field(:tree_tiles_savage, 552) {
        stl_vector(2) {
            number 16, true, -1
        }
    }
    def tree_tiles_savage_tg ; tree_tiles_savage.map { |i| df.world.raws.plants.all[i] } ; end
    field(:dead_percentage, 576) {
        number 8, true
    }
    field(:unk_1e5, 577) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1e6, 578) {
        number 8, true, nil, BooleanEnum
    }
    field(:reanimating, 579) {
        number 8, true, nil, BooleanEnum
    }
    field(:unk_1e8, 580) {
        number 32, true, -1
    }
    field(:evil, 584) {
        number 8, true, nil, BooleanEnum
    }
    field(:good, 585) {
        number 8, true, nil, BooleanEnum
    }
    field(:lake_surface, 586) {
        number 16, true, -30000
    }
    field(:forces, 592) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def forces_tg ; forces.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:unk_v47_2, 616) {
        number 32, true
    }
    field(:mid_x, 620) {
        number 32, true
    }
    field(:mid_y, 624) {
        number 32, true
    }
    field(:min_x, 628) {
        number 32, true
    }
    field(:max_x, 632) {
        number 32, true
    }
    field(:min_y, 636) {
        number 32, true
    }
    field(:max_y, 640) {
        number 32, true
    }
end

class WorldRegionDetails < MemHack::Compound
    sizeof 18912

    field(:biome, 0) {
        static_array(17, 17) {
            static_array(17, 1) {
                number 8, true
            }
        }
    }
    field(:elevation, 290) {
        static_array(17, 34) {
            static_array(17, 2) {
                number 16, true
            }
        }
    }
    field(:seed, 868) {
        static_array(16, 64) {
            static_array(16, 4) {
                number 32, false
            }
        }
    }
    field(:edges, 1892) {
        compound(:WorldRegionDetails_TEdges) {
            field(:split_x, 0) {
                static_array(16, 68) {
                    static_array(17, 4) {
                        global :Coord2d
                    }
                }
            }
            field(:split_y, 1088) {
                static_array(17, 64) {
                    static_array(16, 4) {
                        global :Coord2d
                    }
                }
            }
            field(:biome_corner, 2176) {
                static_array(16, 16) {
                    static_array(16, 1) {
                        number 8, true
                    }
                }
            }
            field(:biome_x, 2432) {
                static_array(16, 16) {
                    static_array(16, 1) {
                        number 8, true
                    }
                }
            }
            field(:biome_y, 2688) {
                static_array(16, 16) {
                    static_array(16, 1) {
                        number 8, true
                    }
                }
            }
        }
    }
    field(:pos, 4836) {
        global :Coord2d
    }
    field(:unk12e8, 4840) {
        number 16, true
    }
    field(:unk_1, 4842) {
        number 16, true
    }
    field(:unk_2, 4844) {
        number 16, true
    }
    field(:unk_3, 4846) {
        number 16, true
    }
    field(:unk_4, 4848) {
        number 16, true
    }
    field(:rivers_vertical, 4850) {
        compound(:WorldRegionDetails_TRiversVertical) {
            field(:x_min, 0) {
                static_array(16, 34) {
                    static_array(17, 2) {
                        number 16, true
                    }
                }
            }
            field(:x_max, 544) {
                static_array(16, 34) {
                    static_array(17, 2) {
                        number 16, true
                    }
                }
            }
            field(:active, 1088) {
                static_array(16, 17) {
                    static_array(17, 1) {
                        number 8, true
                    }
                }
            }
            field(:elevation, 1360) {
                static_array(16, 34) {
                    static_array(17, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:rivers_horizontal, 6754) {
        compound(:WorldRegionDetails_TRiversHorizontal) {
            field(:y_min, 0) {
                static_array(17, 32) {
                    static_array(16, 2) {
                        number 16, true
                    }
                }
            }
            field(:y_max, 544) {
                static_array(17, 32) {
                    static_array(16, 2) {
                        number 16, true
                    }
                }
            }
            field(:active, 1088) {
                static_array(17, 16) {
                    static_array(16, 1) {
                        number 8, true
                    }
                }
            }
            field(:elevation, 1360) {
                static_array(17, 32) {
                    static_array(16, 2) {
                        number 16, true
                    }
                }
            }
        }
    }
    field(:other_features, 8658) {
        static_array(16, 16) {
            static_array(16, 1) {
                compound(:WorldRegionDetails_TOtherFeatures) {
                    field(:_whole, 0) {
                        number 8, false
                    }
                    field(:construction, 0) { bit 0 }
                    field(:minor_site_footprint, 0) { bit 1 }
                    field(:river, 0) { bit 2 }
                }
            }
        }
    }
    field(:features, 8920) {
        static_array(16, 384) {
            static_array(16, 24) {
                stl_vector(8) {
                    pointer {
                        global :WorldRegionFeature
                    }
                }
            }
        }
    }
    field(:lava_stone, 15064) {
        number 16, true, -1
    }
    def lava_stone_tg ; df.world.raws.inorganics[lava_stone] ; end
    field(:unk_12, 15066) {
        static_array(1152, 2) {
            number 16, true
        }
    }
    field(:elevation2, 17370) {
        static_array(16, 32) {
            static_array(16, 2) {
                number 16, true
            }
        }
    }
    field(:undef13, 17884) {
        static_array(256, 4) {
            number 32, true
        }
    }
end

class WorldRegionFeature < MemHack::Compound
    sizeof 96

    field(:feature_idx, 0) {
        number 16, true
    }
    field(:layer, 4) {
        number 32, true, -1
    }
    def layer_tg ; df.world.world_data.underground_regions[layer] ; end
    field(:region_tile_idx, 8) {
        number 32, true
    }
    field(:min_z, 12) {
        number 16, true
    }
    field(:max_z, 14) {
        number 16, true
    }
    field(:unk_c, 16) {
        static_array(6, 4) {
            global :Coord2d
        }
    }
    field(:unk_28, 40) {
        number 32, true
    }
    field(:seed, 44) {
        number 32, false
    }
    field(:unk_30, 48) {
        df_flagarray
    }
    field(:unk_38, 64) {
        static_array(15, 2) {
            number 16, true
        }
    }
    field(:top_layer_idx, 94) {
        number 16, true, nil, LayerType
    }
end

class WorldRiver < MemHack::Compound
    sizeof 264

    field(:name, 0) {
        global :LanguageName
    }
    field(:path, 120) {
        global :Coord2dPath
    }
    field(:flow, 168) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:exit_tile, 192) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:elevation, 216) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:end_pos, 240) {
        global :Coord2d
    }
    field(:flags, 248) {
        df_flagarray
    }
end

class WorldSite < MemHack::Compound
    sizeof 1344

    field(:name, 0) {
        global :LanguageName
    }
    field(:civ_id, 120) {
        number 32, true, -1
    }
    def civ_tg ; df.world.entities.all.binsearch(civ_id) ; end
    field(:cur_owner_id, 124) {
        number 32, true, -1
    }
    def cur_owner_tg ; df.world.entities.all.binsearch(cur_owner_id) ; end
    field(:type, 128) {
        number 16, true, nil, WorldSiteType
    }
    field(:pos, 130) {
        global :Coord2d
    }
    field(:id, 136) {
        number 32, true
    }
    field(:unk_1, 144) {
        compound(:WorldSite_TUnk1) {
            field(:nemesis, 0) {
                stl_vector(4) {
                    number 32, true, -1
                }
            }
            def nemesis_tg ; nemesis.map { |i| df.world.nemesis.all.binsearch(i) } ; end
            field(:artifacts, 24) {
                stl_vector(8) {
                    pointer {
                        global :ArtifactRecord
                    }
                }
            }
            field(:animals, 48) {
                stl_vector(8) {
                    pointer {
                        global :WorldPopulation
                    }
                }
            }
            field(:inhabitants, 72) {
                stl_vector(8) {
                    pointer {
                        global :WorldSiteInhabitant
                    }
                }
            }
            field(:units, 96) {
                stl_vector(8) {
                    pointer {
                        compound(:WorldSite_TUnk1_TUnits) {
                            sizeof 20

                            field(:unit_id, 0) {
                                number 32, true, -1
                            }
                            def unit_tg ; df.world.units.all.binsearch(unit_id) ; end
                            field(:pos_x, 4) {
                                number 32, true
                            }
                            field(:pos_y, 8) {
                                number 32, true
                            }
                            field(:pos_z, 12) {
                                number 32, true
                            }
                            field(:unk_10, 16) {
                                number 32, true, -1
                            }
                        }
                    }
                }
            }
            field(:unk_d4, 120) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:unk_v40_1a, 144) {
                stl_vector(8) {
                    pointer {
                        global :HistoricalFigure
                    }
                }
            }
            field(:pad_1, 168) {
            }
            field(:unk_v40_1b, 176) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1c, 200) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1d, 224) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1e, 248) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1f, 272) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1g, 296) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
            field(:unk_v40_1h, 320) {
                stl_vector(8) {
                    pointer {
                        global :NemesisRecord
                    }
                }
            }
        }
    }
    field(:index, 488) {
        number 32, true
    }
    field(:rgn_min_x, 492) {
        number 16, true
    }
    field(:rgn_max_x, 494) {
        number 16, true
    }
    field(:rgn_min_y, 496) {
        number 16, true
    }
    field(:rgn_max_y, 498) {
        number 16, true
    }
    field(:rgn_min_z, 500) {
        number 16, true
    }
    field(:rgn_max_z, 502) {
        number 16, true
    }
    field(:global_min_x, 504) {
        number 32, true
    }
    field(:global_min_y, 508) {
        number 32, true
    }
    field(:global_max_x, 512) {
        number 32, true
    }
    field(:global_max_y, 516) {
        number 32, true
    }
    field(:seed1, 520) {
        number 32, false
    }
    field(:seed2, 524) {
        number 32, false
    }
    field(:resident_count, 528) {
        number 32, true
    }
    field(:unk_110, 532) {
        number 32, true
    }
    field(:unk_114, 536) {
        number 32, true
    }
    field(:unk_118, 544) {
        pointer {
            compound(:WorldSite_TUnk118) {
                sizeof 144

                field(:unk_1, 0) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
                field(:unk_2, 24) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
                field(:unk_3, 48) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
                field(:unk_4, 72) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_5, 96) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
                field(:unk_6, 120) {
                    stl_vector(4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_11c, 552) {
        number 32, true
    }
    field(:unk_120, 556) {
        number 32, true
    }
    field(:unk_124, 560) {
        number 32, true
    }
    field(:unk_128, 564) {
        number 32, true
    }
    field(:unk_2, 568) {
        static_array(8, 4) {
            number 32, true
        }
    }
    field(:unk_13c, 600) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnk13c) {
                    sizeof 72

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                    field(:unk_8, 8) {
                        number 32, true
                    }
                    field(:unk_c, 12) {
                        number 32, true
                    }
                    field(:unk_10, 16) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_20, 40) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_30, 64) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v40_2, 624) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV402) {
                    sizeof 72

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:unk_4, 4) {
                        number 32, true
                    }
                    field(:unk_8, 8) {
                        number 32, true
                    }
                    field(:unk_c, 12) {
                        number 32, true
                    }
                    field(:unk_10, 16) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_20, 40) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_30, 64) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v47_1, 648) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV471) {
                    sizeof 244

                    field(:unk_1, 0) {
                        static_array(20, 12) {
                            compound(:WorldSite_TUnkV471_TUnk1) {
                                field(:unk_1, 0) {
                                    number 32, true, -1
                                }
                                field(:unk_2, 4) {
                                    number 32, true
                                }
                                field(:unk_3, 8) {
                                    number 32, true
                                }
                            }
                        }
                    }
                    field(:count, 240) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:flags, 672) {
        df_flagarray(WorldSiteFlags)
    }
    field(:buildings, 688) {
        stl_vector(8) {
            pointer {
                global :AbstractBuilding
            }
        }
    }
    field(:next_building_id, 712) {
        number 32, true
    }
    field(:property_ownership, 720) {
        stl_vector(8) {
            pointer {
                global :PropertyOwnership
            }
        }
    }
    field(:next_property_ownership_id, 744) {
        number 32, true
    }
    field(:created_tick, 748) {
        number 32, true
    }
    field(:created_year, 752) {
        number 32, true
    }
    field(:unk_170, 756) {
        number 32, true
    }
    field(:unk_174, 760) {
        number 32, true
    }
    field(:unk_178, 764) {
        global :Coord
    }
    field(:realization, 776) {
        pointer {
            global :WorldSiteRealization
        }
    }
    field(:subtype_info, 784) {
        pointer {
            compound(:WorldSite_TSubtypeInfo) {
                sizeof 64

                field(:fortress_type, 0) {
                    number 16, true, :NONE, FortressType
                }
                field(:monument_type, 2) {
                    number 16, true, :NONE, MonumentType
                }
                field(:lair_type, 4) {
                    number 16, true, :NONE, LairType
                }
                field(:unk_night_creature_lair, 8) {
                    stl_vector(2) {
                        number 16, true
                    }
                }
                field(:unk_14, 32) {
                    number 32, true, -1000000
                }
                field(:unk_18, 36) {
                    number 32, true, -1000000
                }
                field(:unk_1c, 40) {
                    number 32, true, -1000000
                }
                field(:creator, 44) {
                    number 32, true, -1
                }
                def creator_tg ; df.world.history.figures.binsearch(creator) ; end
                field(:unk_vault, 48) {
                    number 32, true
                }
                field(:tower_seed, 52) {
                    number 32, true
                }
                field(:unk_monastery, 56) {
                    number 32, true, -1
                }
                field(:founding_entity, 60) {
                    number 32, true, -1
                }
                def founding_entity_tg ; df.world.entities.all.binsearch(founding_entity) ; end
            }
        }
    }
    field(:unk_21c, 792) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnk21c) {
                    sizeof 32

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:race, 4) {
                        number 32, true
                    }
                    field(:entity_id, 8) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:unk_c, 12) {
                        number 32, true
                    }
                    field(:unk_10, 16) {
                        number 32, true
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                    field(:unk_18, 24) {
                        number 32, true
                    }
                    field(:unk_1c, 28) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:deaths, 816) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def deaths_tg ; deaths.map { |i| df.world.history.figures.binsearch(i) } ; end
    field(:is_mountain_halls, 840) {
        number 32, true
    }
    field(:is_fortress, 844) {
        number 32, true
    }
    field(:unk_v47_2, 848) {
        number 32, true
    }
    field(:unk_v40_4a, 856) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV404a) {
                    sizeof 24

                    field(:unk_0, 0) {
                        number 32, true
                    }
                    field(:entity_id, 4) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                    field(:year, 8) {
                        number 32, true
                    }
                    field(:year_tick, 12) {
                        number 32, true, -1
                    }
                    field(:unk_10, 16) {
                        number 32, true
                    }
                    field(:unk_14, 20) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v40_4b, 880) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV404b) {
                    sizeof 8

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v40_4c, 904) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV404c) {
                    sizeof 40

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:unk_4, 32) {
                        number 32, true
                    }
                    field(:unk_5, 36) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_v40_4d, 928) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV404d) {
                    sizeof 64

                    field(:id, 0) {
                        number 32, true
                    }
                    field(:unk_1, 8) {
                        stl_vector(8) {
                            pointer {
                                compound(:WorldSite_TUnkV404d_TUnk1) {
                                    sizeof 32

                                    field(:unk_1, 0) {
                                        number 32, true
                                    }
                                    field(:unk_2, 4) {
                                        number 32, true
                                    }
                                    field(:unk_3, 8) {
                                        number 32, true
                                    }
                                    field(:unk_4, 12) {
                                        number 32, true
                                    }
                                    field(:unk_5, 16) {
                                        number 32, true
                                    }
                                    field(:unk_6, 20) {
                                        number 32, true
                                    }
                                    field(:unk_7, 24) {
                                        number 32, true
                                    }
                                    field(:unk_8, 28) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_2, 32) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                    field(:entity_id, 56) {
                        number 32, true, -1
                    }
                    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
                }
            }
        }
    }
    field(:unk_v40_4d_next_id, 952) {
        number 32, true
    }
    field(:unk_v43_2, 960) {
        stl_vector(8) {
            pointer {
                compound(:WorldSite_TUnkV432) {
                    sizeof 14348

                    field(:unk_1, 0) {
                        number 32, true
                    }
                    field(:unk_2, 4) {
                        number 32, true
                    }
                    field(:unk_3, 8) {
                        number 32, true
                    }
                    field(:unk_4, 12) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_5, 1036) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_6, 2060) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_7, 3084) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_8, 4108) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_9, 5132) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_10, 6156) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_11, 7180) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_12, 8204) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_13, 9228) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_14, 10252) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_15, 11276) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_16, 12300) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                    field(:unk_17, 13324) {
                        static_array(16, 64) {
                            static_array(16, 4) {
                                number 32, true
                            }
                        }
                    }
                }
            }
        }
    }
    field(:unk_v43_3, 984) {
        number 32, true
    }
    field(:unk_v40_5, 988) {
        number 32, true
    }
    field(:unk_188, 992) {
        pointer {
            stl_vector(8) {
                pointer {
                    compound(:WorldSite_TUnk188) {
                        sizeof 44

                        field(:unk_2, 0) {
                            number 32, true
                        }
                        field(:unk_3, 4) {
                            number 32, true
                        }
                        field(:unk_4, 8) {
                            number 32, true
                        }
                        field(:unk_5, 12) {
                            number 32, true
                        }
                        field(:unk1, 16) {
                            compound(:WorldSite_TUnk188_TUnk1) {
                                field(:unk_1, 0) {
                                    number 32, true
                                }
                                field(:unk_2, 4) {
                                    number 32, true, -1
                                }
                                field(:hfid, 8) {
                                    number 32, true, -1
                                }
                                def hfid_tg ; df.world.history.figures.binsearch(hfid) ; end
                                field(:artifact_id, 12) {
                                    number 32, true, -1
                                }
                                def artifact_tg ; df.world.artifacts.all.binsearch(artifact_id) ; end
                                field(:site_id, 16) {
                                    number 32, true, -1
                                }
                                def site_tg ; df.world.world_data.sites.binsearch(site_id) ; end
                            }
                        }
                        field(:unk_6, 36) {
                            number 32, true, -1
                        }
                        field(:unk_7, 40) {
                            number 32, true, -1
                        }
                    }
                }
            }
        }
    }
    field(:unk_3a8, 1000) {
        number 32, true
    }
    field(:unk_3b0, 1008) {
        pointer {
            global :WorldSiteUnk130
        }
    }
    field(:unk_18c, 1016) {
        stl_vector
    }
    field(:unk_19c, 1040) {
        stl_vector
    }
    field(:entity_links, 1064) {
        stl_vector(8) {
            pointer {
                global :EntitySiteLink
            }
        }
    }
    field(:cultural_identities, 1088) {
        stl_vector(8) {
            pointer {
                global :CulturalIdentity
            }
        }
    }
    field(:unk_v42_1, 1112) {
        stl_vector(8) {
            pointer {
                global :Occupation
            }
        }
    }
    field(:unk_v43_4, 1136) {
        number 32, true
    }
    field(:unk_3, 1144) {
        stl_vector
    }
    field(:unk_4, 1168) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_5, 1176) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_6, 1184) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_7, 1192) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_8, 1200) {
        pointer {
            global :HistoricalFigure
        }
    }
    field(:unk_9, 1208) {
        pointer {
        }
    }
    field(:unk_10, 1216) {
        pointer {
        }
    }
    field(:unk_11, 1224) {
        pointer {
        }
    }
    field(:unk_12, 1232) {
        pointer {
        }
    }
    field(:unk_13, 1240) {
        pointer {
        }
    }
    field(:unk_14, 1248) {
        pointer {
        }
    }
    field(:unk_15, 1256) {
        pointer {
        }
    }
    field(:unk_16, 1264) {
        pointer {
        }
    }
    field(:unk_17, 1272) {
        pointer {
        }
    }
    field(:unk_18, 1280) {
        pointer {
        }
    }
    field(:unk_19, 1288) {
        pointer {
        }
    }
    field(:unk_20, 1296) {
        pointer {
        }
    }
    field(:unk_21, 1304) {
        pointer {
        }
    }
    field(:unk_22, 1312) {
        pointer {
        }
    }
    field(:unk_23, 1320) {
        pointer {
        }
    }
    field(:unk_24, 1328) {
        number 32, true
    }
    field(:unk_25, 1336) {
        pointer {
            stl_vector
        }
    }
end

class WorldSiteInhabitant < MemHack::Compound
    sizeof 44

    field(:count, 0) {
        number 32, true
    }
    field(:race, 4) {
        number 32, true, -1
    }
    def race_tg ; df.world.raws.creatures.all[race] ; end
    field(:population_id, 8) {
        number 32, true, -1
    }
    def population_tg ; df.world.entity_populations.binsearch(population_id) ; end
    field(:entity_id, 12) {
        number 32, true, -1
    }
    def entity_tg ; df.world.entities.all.binsearch(entity_id) ; end
    field(:unk_10, 16) {
        number 32, true, -1
    }
    field(:cultural_identity_id, 20) {
        number 32, true, -1
    }
    def cultural_identity_tg ; df.world.cultural_identities.all.binsearch(cultural_identity_id) ; end
    field(:interaction_id, 24) {
        number 32, true, -1
    }
    def interaction_tg ; df.world.raws.interactions.binsearch(interaction_id) ; end
    field(:interaction_effect_idx, 28) {
        number 32, true, -1
    }
    field(:related_entity_id, 32) {
        number 32, true, -1
    }
    def related_entity_tg ; df.world.entities.all.binsearch(related_entity_id) ; end
    field(:unk_24, 36) {
        number 32, true, -1
    }
    field(:unk_28, 40) {
        number 32, true, -1
    }
end

class WorldSiteRealization < MemHack::Compound
    sizeof 268120

    field(:buildings, 0) {
        stl_vector(8) {
            pointer {
                global :SiteRealizationBuilding
            }
        }
    }
    field(:num_buildings, 24) {
        number 32, true
    }
    field(:unk_14, 28) {
        number 32, true
    }
    field(:num_areas, 32) {
        number 32, true
    }
    field(:mini_rivers, 36) {
        static_array(17, 17) {
            static_array(17, 1) {
                number 8, true
            }
        }
    }
    field(:mini_tiles, 325) {
        static_array(17, 17) {
            static_array(17, 1) {
                number 8, false
            }
        }
    }
    field(:mini_colors, 614) {
        static_array(17, 34) {
            static_array(17, 2) {
                number 16, true
            }
        }
    }
    field(:road_map, 1192) {
        static_array(51, 408) {
            static_array(51, 8) {
                pointer {
                    global :SiteRealizationCrossroads
                }
            }
        }
    }
    field(:river_map, 22000) {
        static_array(51, 408) {
            static_array(51, 8) {
                pointer {
                    compound(:WorldSiteRealization_TRiverMap) {
                        sizeof 448

                        field(:start, 0) {
                            static_array(48, 4) {
                                number 32, true
                            }
                        }
                        field(:end, 192) {
                            static_array(48, 4) {
                                number 32, true
                            }
                        }
                        field(:unk_180, 384) {
                            number 32, true
                        }
                        field(:unk_184, 388) {
                            number 32, true
                        }
                        field(:start_array_limits, 392) {
                            number 32, true
                        }
                        field(:end_array_limits, 396) {
                            number 32, true
                        }
                        field(:unk_190, 400) {
                            number 32, true
                        }
                        field(:unk_194, 404) {
                            static_array(9, 4) {
                                number 32, true
                            }
                        }
                        field(:unk_1b8, 440) {
                            number 8, true
                        }
                        field(:unk_1b9, 441) {
                            number 8, true
                        }
                        field(:unk_1ba, 442) {
                            number 8, true
                        }
                        field(:unk_1bb, 443) {
                            number 8, true
                        }
                        field(:unk_1bc, 444) {
                            number 8, true
                        }
                        field(:unk_1be, 446) {
                            number 16, true
                        }
                    }
                }
            }
        }
    }
    field(:unk_55e8, 42808) {
        static_array(17, 2856) {
            static_array(17, 168) {
                compound(:WorldSiteRealization_TUnk55e8) {
                    field(:unk_55e8, 0) {
                        number 32, true, -30000
                    }
                    field(:unk_55ec, 4) {
                        number 32, true, -30000
                    }
                    field(:unk_v40_1a, 8) {
                        number 32, true, -30000
                    }
                    field(:unk_v40_1b, 12) {
                        number 32, true, -30000
                    }
                    field(:unk_v40_1c, 16) {
                        number 32, true, -30000
                    }
                    field(:unk_v40_1d, 20) {
                        number 32, true, -30000
                    }
                    field(:unk_v40_2, 24) {
                        stl_vector(8) {
                            pointer {
                                compound(:WorldSiteRealization_TUnk55e8_TUnkV402) {
                                    sizeof 32

                                    field(:unk_0, 0) {
                                        number 32, true
                                    }
                                    field(:unk_4, 4) {
                                        number 32, true
                                    }
                                    field(:unk_8, 8) {
                                        number 16, true
                                    }
                                    field(:unk_a, 10) {
                                        number 16, true
                                    }
                                    field(:unk_c, 12) {
                                        number 32, true
                                    }
                                    field(:unk_10, 16) {
                                        number 32, true
                                    }
                                    field(:unk_14, 20) {
                                        number 16, true
                                    }
                                    field(:unk_16, 22) {
                                        number 16, true
                                    }
                                    field(:unk_18, 24) {
                                        number 32, true
                                    }
                                    field(:unk_1c, 28) {
                                        number 32, true
                                    }
                                }
                            }
                        }
                    }
                    field(:unk_1, 48) {
                        stl_vector
                    }
                    field(:unk_55f0, 72) {
                        number 32, true, -30000
                    }
                    field(:unk_55f4, 76) {
                        number 32, true, -30000
                    }
                    field(:unk_55f8, 80) {
                        number 16, true
                    }
                    field(:unk_55fa, 82) {
                        number 16, true
                    }
                    field(:unk_55fc, 84) {
                        number 32, true
                    }
                    field(:unk_5600, 88) {
                        number 32, true
                    }
                    field(:unk_5604, 92) {
                        number 32, true
                    }
                    field(:unk_5608, 96) {
                        number 32, true
                    }
                    field(:unk_560c, 100) {
                        number 32, true
                    }
                    field(:unk_5610, 104) {
                        number 32, true
                    }
                    field(:unk_5614, 108) {
                        number 32, true
                    }
                    field(:unk_5618, 112) {
                        stl_vector
                    }
                    field(:unk_5628, 136) {
                        number 32, true
                    }
                    field(:unk_562c, 140) {
                        number 32, true
                    }
                    field(:unk_5630, 144) {
                        number 32, true
                    }
                    field(:unk_5634, 148) {
                        number 32, true
                    }
                    field(:unk_v40_3a, 152) {
                        number 32, true, -1
                    }
                    field(:unk_v40_3b, 156) {
                        number 32, true, -1
                    }
                    field(:unk_v40_3c, 160) {
                        number 32, true, -1
                    }
                    field(:unk_v40_3d, 164) {
                        number 32, true, -1
                    }
                }
            }
        }
    }
    field(:building_map, 91360) {
        static_array(17, 1088) {
            static_array(17, 64) {
                compound(:WorldSiteRealization_TBuildingMap) {
                    field(:unk0, 0) {
                        number 32, true
                    }
                    field(:buildings, 8) {
                        stl_vector(8) {
                            pointer {
                                global :SiteRealizationBuilding
                            }
                        }
                    }
                    field(:unk4, 32) {
                        number 32, true
                    }
                    field(:unk5, 36) {
                        number 32, false
                    }
                    field(:unk6, 40) {
                        stl_vector(4) {
                            number 32, true
                        }
                    }
                }
            }
        }
    }
    field(:flags_map, 109856) {
        static_array(51, 204) {
            static_array(51, 4) {
                number 32, false
            }
        }
    }
    field(:zoom_tiles, 120260) {
        static_array(51, 51) {
            static_array(51, 1) {
                number 8, false
            }
        }
    }
    field(:zoom_colors, 122862) {
        static_array(51, 102) {
            static_array(51, 2) {
                number 16, true
            }
        }
    }
    field(:zoom_movemask, 128064) {
        static_array(51, 51) {
            static_array(51, 1) {
                number 8, true
            }
        }
    }
    field(:area_map, 130668) {
        static_array(52, 208) {
            static_array(52, 4) {
                number 32, true, -1
            }
        }
    }
    field(:areas, 141488) {
        stl_vector(8) {
            pointer {
                compound(:WorldSiteRealization_TAreas) {
                    sizeof 36

                    field(:type, 0) {
                        class ::DFHack::WorldSiteRealization_TAreas_TType < MemHack::Enum
                            ENUM = Hash.new
                            NUME = Hash.new
                            ENUM[0] = :Crops1 ; NUME[:Crops1] = 0
                            ENUM[1] = :Crops2 ; NUME[:Crops2] = 1
                            ENUM[2] = :Crops3 ; NUME[:Crops3] = 2
                            ENUM[3] = :Meadow ; NUME[:Meadow] = 3
                            ENUM[4] = :Pasture ; NUME[:Pasture] = 4
                            ENUM[5] = :Orchard ; NUME[:Orchard] = 5
                            ENUM[6] = :Woodland ; NUME[:Woodland] = 6
                            ENUM[7] = :Waste ; NUME[:Waste] = 7
                            ENUM[8] = :Unknown1 ; NUME[:Unknown1] = 8
                        end

                        number 32, true, nil, WorldSiteRealization_TAreas_TType
                    }
                    field(:index, 4) {
                        number 32, true
                    }
                    field(:unk_8, 8) {
                        number 32, true
                    }
                    field(:min_x, 12) {
                        number 32, true
                    }
                    field(:max_x, 16) {
                        number 32, true
                    }
                    field(:min_y, 20) {
                        number 32, true
                    }
                    field(:max_y, 24) {
                        number 32, true
                    }
                    field(:unk_1c, 28) {
                        number 32, true, -1
                    }
                    field(:unk_20, 32) {
                        number 32, true
                    }
                }
            }
        }
    }
    field(:unk_1, 141512) {
        number 32, true
    }
    field(:army_controller_pos_x, 141516) {
        number 32, true
    }
    field(:army_controller_pos_y, 141520) {
        number 32, true
    }
    field(:unk_193bc, 141524) {
        static_array(500, 244) {
            compound(:WorldSiteRealization_TUnk193bc) {
                field(:nemesis_id, 0) {
                    number 32, true, -1
                }
                def nemesis_tg ; df.world.nemesis.all.binsearch(nemesis_id) ; end
                field(:unk_1, 4) {
                    number 32, true
                }
                field(:unk_8, 8) {
                    compound(:WorldSiteRealization_TUnk193bc_TUnk8) {
                        field(:unk_1, 0) {
                            number 32, true
                        }
                        field(:unk_2, 4) {
                            number 32, true
                        }
                        field(:unk_3, 8) {
                            number 32, true
                        }
                        field(:unk_4, 12) {
                            number 32, true
                        }
                        field(:unk_5, 16) {
                            number 32, true
                        }
                        field(:unk_6, 20) {
                            number 32, true
                        }
                        field(:unk_7, 24) {
                            number 32, true
                        }
                        field(:unk_8, 28) {
                            number 32, true
                        }
                        field(:unk_9, 32) {
                            number 32, true
                        }
                    }
                }
                field(:unk_2, 44) {
                    number 32, true
                }
                field(:building_id, 48) {
                    number 32, true, -1
                }
                field(:pos, 52) {
                    global :Coord
                }
                field(:unk_3, 58) {
                    number 16, true
                }
                field(:unk_4, 60) {
                    number 32, true
                }
                field(:unk_5, 64) {
                    number 32, true
                }
                field(:unk_6, 68) {
                    number 32, true
                }
                field(:unk_7, 72) {
                    static_array(20, 4) {
                        number 32, true
                    }
                }
                field(:unk_9, 152) {
                    static_array(20, 4) {
                        number 32, true
                    }
                }
                field(:unk_10, 232) {
                    number 16, true
                }
                field(:unk_11, 234) {
                    number 16, true
                }
                field(:unk_12, 236) {
                    number 32, true
                }
                field(:unk_13, 240) {
                    number 32, true
                }
            }
        }
    }
    field(:num_unk_193bc, 263524) {
        number 32, true
    }
    field(:unk_2, 263528) {
        number 32, true
    }
    field(:unk_3, 263532) {
        number 32, true
    }
    field(:unk_4, 263536) {
        static_array(2, 1200) {
            static_array(300, 4) {
                number 32, true
            }
        }
    }
    field(:unk_5, 265936) {
        number 32, true
    }
    field(:unk_6, 265944) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_7, 266104) {
        number 32, true
    }
    field(:unk_8, 266112) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_9, 266272) {
        number 32, true
    }
    field(:unk_10, 266280) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_11, 266440) {
        number 32, true
    }
    field(:unk_12, 266448) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_13, 266608) {
        number 32, true
    }
    field(:unk_15, 266616) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_16, 266776) {
        number 32, true
    }
    field(:unk_17, 266784) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_18, 266944) {
        number 32, true
    }
    field(:unk_19, 266952) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_20, 267112) {
        number 32, true
    }
    field(:unk_21, 267120) {
        static_array(20, 8) {
            pointer {
            }
        }
    }
    field(:unk_22, 267280) {
        number 32, true
    }
    field(:building_well, 267288) {
        static_array(20, 8) {
            pointer {
                global :SiteRealizationBuilding
            }
        }
    }
    field(:num_building_well, 267448) {
        number 32, true
    }
    field(:building_temple, 267456) {
        static_array(20, 8) {
            pointer {
                global :SiteRealizationBuilding
            }
        }
    }
    field(:num_building_temple, 267616) {
        number 32, true
    }
    field(:building_type22, 267624) {
        static_array(20, 8) {
            pointer {
                global :SiteRealizationBuilding
            }
        }
    }
    field(:num_building_type22, 267784) {
        number 32, true
    }
    field(:building_type21, 267792) {
        static_array(20, 8) {
            pointer {
                global :SiteRealizationBuilding
            }
        }
    }
    field(:num_building_type21, 267952) {
        number 32, true
    }
    field(:unk_23, 267960) {
        static_array(16, 8) {
            pointer {
            }
        }
    }
    field(:unk_24, 268088) {
        number 32, true
    }
    field(:unk_wsr_vector, 268096) {
        stl_vector
    }
end

class WorldSiteUnk130 < MemHack::Compound
    sizeof 104

    field(:index, 0) {
        number 32, true
    }
    field(:unk_4, 8) {
        static_array(4, 24) {
            stl_vector(8) {
                pointer {
                    compound(:WorldSiteUnk130_TUnk4) {
                        sizeof 40

                        field(:unk_0, 0) {
                            number 32, true
                        }
                        field(:index, 4) {
                            number 32, true
                        }
                        field(:unk_8, 8) {
                            number 32, true
                        }
                        field(:unk_c, 16) {
                            stl_vector(4) {
                                number 32, true
                            }
                        }
                    }
                }
            }
        }
    }
end

class WorldUndergroundRegion < MemHack::Compound
    sizeof 280

    field(:type, 0) {
        class ::DFHack::WorldUndergroundRegion_TType < MemHack::Enum
            ENUM = Hash.new
            NUME = Hash.new
            ENUM[0] = :Cavern ; NUME[:Cavern] = 0
            ENUM[1] = :MagmaSea ; NUME[:MagmaSea] = 1
            ENUM[2] = :Underworld ; NUME[:Underworld] = 2
        end

        number 16, true, nil, WorldUndergroundRegion_TType
    }
    field(:name, 8) {
        global :LanguageName
    }
    field(:index, 128) {
        number 32, true
    }
    field(:layer_depth, 132) {
        number 16, true
    }
    field(:layer_depth_p1a, 134) {
        number 16, true
    }
    field(:layer_depth_p1b, 136) {
        number 16, true
    }
    field(:water, 138) {
        number 16, true
    }
    field(:unk_7c, 140) {
        number 16, true
    }
    field(:openness_min, 142) {
        number 16, true
    }
    field(:openness_max, 144) {
        number 16, true
    }
    field(:passage_density_min, 146) {
        number 16, true
    }
    field(:passage_density_max, 148) {
        number 16, true
    }
    field(:region_coords, 152) {
        global :Coord2dPath
    }
    field(:region_min_z, 200) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:region_max_z, 224) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_c8, 248) {
        stl_vector
    }
    field(:feature_init, 272) {
        pointer {
            global :FeatureInit
        }
    }
end

class WorldUnk26c678Unk38 < MemHack::Compound
    sizeof 2640

    field(:unk_1, 0) {
        static_array(107, 24) {
            stl_vector
        }
    }
    field(:unk_2, 2568) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk_3, 2592) {
        stl_vector(2) {
            number 16, true
        }
    }
    field(:unk_4, 2616) {
        stl_vector(2) {
            number 16, true
        }
    }
end

class WorldgenParms < MemHack::Compound
    sizeof 1208

    field(:title, 0) {
        stl_string
    }
    field(:seed, 32) {
        stl_string
    }
    field(:history_seed, 64) {
        stl_string
    }
    field(:name_seed, 96) {
        stl_string
    }
    field(:creature_seed, 128) {
        stl_string
    }
    field(:dim_x, 160) {
        number 32, true
    }
    field(:dim_y, 164) {
        number 32, true
    }
    field(:custom_name, 168) {
        stl_string
    }
    field(:has_seed, 200) {
        number 8, true, nil, BooleanEnum
    }
    field(:has_history_seed, 201) {
        number 8, true, nil, BooleanEnum
    }
    field(:has_name_seed, 202) {
        number 8, true, nil, BooleanEnum
    }
    field(:has_creature_seed, 203) {
        number 8, true, nil, BooleanEnum
    }
    field(:embark_points, 204) {
        number 32, true
    }
    field(:peak_number_min, 208) {
        number 32, true
    }
    field(:partial_ocean_edge_min, 212) {
        number 32, true
    }
    field(:complete_ocean_edge_min, 216) {
        number 32, true
    }
    field(:volcano_min, 220) {
        number 32, true
    }
    field(:region_counts, 224) {
        static_array(3, 40) {
            static_array(10, 4, WorldgenRegionType) {
                number 32, true
            }
        }
    }
    field(:river_mins, 344) {
        static_array(2, 4) {
            number 32, true
        }
    }
    field(:subregion_max, 352) {
        number 32, true
    }
    field(:cavern_layer_count, 356) {
        number 32, true
    }
    field(:cavern_layer_openness_min, 360) {
        number 32, true
    }
    field(:cavern_layer_openness_max, 364) {
        number 32, true
    }
    field(:cavern_layer_passage_density_min, 368) {
        number 32, true
    }
    field(:cavern_layer_passage_density_max, 372) {
        number 32, true
    }
    field(:cavern_layer_water_min, 376) {
        number 32, true
    }
    field(:cavern_layer_water_max, 380) {
        number 32, true
    }
    field(:have_bottom_layer_1, 384) {
        number 8, true, nil, BooleanEnum
    }
    field(:have_bottom_layer_2, 385) {
        number 8, true, nil, BooleanEnum
    }
    field(:levels_above_ground, 388) {
        number 32, true
    }
    field(:levels_above_layer_1, 392) {
        number 32, true
    }
    field(:levels_above_layer_2, 396) {
        number 32, true
    }
    field(:levels_above_layer_3, 400) {
        number 32, true
    }
    field(:levels_above_layer_4, 404) {
        number 32, true
    }
    field(:levels_above_layer_5, 408) {
        number 32, true
    }
    field(:levels_at_bottom, 412) {
        number 32, true
    }
    field(:cave_min_size, 416) {
        number 32, true
    }
    field(:cave_max_size, 420) {
        number 32, true
    }
    field(:mountain_cave_min, 424) {
        number 32, true
    }
    field(:non_mountain_cave_min, 428) {
        number 32, true
    }
    field(:total_civ_number, 432) {
        number 32, true
    }
    field(:rain_ranges_1, 436) {
        number 32, true
    }
    field(:rain_ranges_0, 440) {
        number 32, true
    }
    field(:rain_ranges_2, 444) {
        number 32, true
    }
    field(:drainage_ranges_1, 448) {
        number 32, true
    }
    field(:drainage_ranges_0, 452) {
        number 32, true
    }
    field(:drainage_ranges_2, 456) {
        number 32, true
    }
    field(:savagery_ranges_1, 460) {
        number 32, true
    }
    field(:savagery_ranges_0, 464) {
        number 32, true
    }
    field(:savagery_ranges_2, 468) {
        number 32, true
    }
    field(:volcanism_ranges_1, 472) {
        number 32, true
    }
    field(:volcanism_ranges_0, 476) {
        number 32, true
    }
    field(:volcanism_ranges_2, 480) {
        number 32, true
    }
    field(:ranges, 484) {
        static_array(4, 96) {
            static_array(24, 4, WorldgenRangeType) {
                number 32, true
            }
        }
    }
    field(:beast_end_year, 868) {
        number 32, true
    }
    field(:end_year, 872) {
        number 32, true
    }
    field(:beast_end_year_percent, 876) {
        number 32, true
    }
    field(:total_civ_population, 880) {
        number 32, true
    }
    field(:site_cap, 884) {
        number 32, true
    }
    field(:elevation_ranges_1, 888) {
        number 32, true
    }
    field(:elevation_ranges_0, 892) {
        number 32, true
    }
    field(:elevation_ranges_2, 896) {
        number 32, true
    }
    field(:mineral_scarcity, 900) {
        number 32, true
    }
    field(:megabeast_cap, 904) {
        number 32, true
    }
    field(:semimegabeast_cap, 908) {
        number 32, true
    }
    field(:titan_number, 912) {
        number 32, true
    }
    field(:titan_attack_trigger, 916) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:demon_number, 928) {
        number 32, true
    }
    field(:night_troll_number, 932) {
        number 32, true
    }
    field(:bogeyman_number, 936) {
        number 32, true
    }
    field(:nightmare_number, 940) {
        number 32, true
    }
    field(:vampire_number, 944) {
        number 32, true
    }
    field(:werebeast_number, 948) {
        number 32, true
    }
    field(:werebeast_attack_trigger, 952) {
        static_array(3, 4) {
            number 32, true
        }
    }
    field(:secret_number, 964) {
        number 32, true
    }
    field(:regional_interaction_number, 968) {
        number 32, true
    }
    field(:disturbance_interaction_number, 972) {
        number 32, true
    }
    field(:evil_cloud_number, 976) {
        number 32, true
    }
    field(:evil_rain_number, 980) {
        number 32, true
    }
    field(:generate_divine_materials, 984) {
        number 8, true
    }
    field(:allow_divination, 985) {
        number 8, true
    }
    field(:allow_demonic_experiments, 986) {
        number 8, true
    }
    field(:allow_necromancer_experiments, 987) {
        number 8, true
    }
    field(:allow_necromancer_lieutenants, 988) {
        number 8, true
    }
    field(:allow_necromancer_ghouls, 989) {
        number 8, true
    }
    field(:allow_necromancer_summons, 990) {
        number 8, true
    }
    field(:good_sq_counts_0, 992) {
        number 32, true
    }
    field(:evil_sq_counts_0, 996) {
        number 32, true
    }
    field(:good_sq_counts_1, 1000) {
        number 32, true
    }
    field(:evil_sq_counts_1, 1004) {
        number 32, true
    }
    field(:good_sq_counts_2, 1008) {
        number 32, true
    }
    field(:evil_sq_counts_2, 1012) {
        number 32, true
    }
    field(:elevation_frequency, 1016) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:rain_frequency, 1040) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:drainage_frequency, 1064) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:savagery_frequency, 1088) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:temperature_frequency, 1112) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:volcanism_frequency, 1136) {
        static_array(6, 4) {
            number 32, true
        }
    }
    field(:ps, 1160) {
        pointer {
            global :WorldgenParmsPs
        }
    }
    field(:reveal_all_history, 1168) {
        number 32, true
    }
    field(:cull_historical_figures, 1172) {
        number 32, true
    }
    field(:erosion_cycle_count, 1176) {
        number 32, true
    }
    field(:periodically_erode_extremes, 1180) {
        number 32, true
    }
    field(:orographic_precipitation, 1184) {
        number 32, true
    }
    field(:playable_civilization_required, 1188) {
        number 32, true
    }
    field(:all_caves_visible, 1192) {
        number 32, true
    }
    field(:show_embark_tunnel, 1196) {
        number 32, true
    }
    field(:pole, 1200) {
        number 32, true
    }
    field(:unk_1, 1204) {
        number 8, true, nil, BooleanEnum
    }
end

class WorldgenParmsPs < MemHack::Compound
    sizeof 200

    field(:width, 0) {
        number 32, true
    }
    field(:height, 4) {
        number 32, true
    }
    field(:data, 8) {
        static_array(24, 8, WorldgenRangeType) {
            pointer_ary(8) {
                pointer_ary(2) {
                    number 16, true
                }
            }
        }
    }
end

class WoundCurseInfo < MemHack::Compound
    sizeof 280

    field(:unk_v40_1, 0) {
        number 32, true
    }
    field(:add_tags1, 4) {
        global :CieAddTagMask1
    }
    field(:rem_tags1, 8) {
        global :CieAddTagMask1
    }
    field(:add_tags2, 12) {
        global :CieAddTagMask2
    }
    field(:rem_tags2, 16) {
        global :CieAddTagMask2
    }
    field(:name_visible, 20) {
        number 8, true, nil, BooleanEnum
    }
    field(:name, 24) {
        stl_string
    }
    field(:name_plural, 56) {
        stl_string
    }
    field(:name_adjective, 88) {
        stl_string
    }
    field(:sym_and_color1, 120) {
        number 32, false, 0x400
    }
    field(:sym_and_color2, 124) {
        number 32, false, 0x400
    }
    field(:flash_period, 128) {
        number 32, false
    }
    field(:flash_time2, 132) {
        number 32, false
    }
    field(:speed_add, 136) {
        number 32, false
    }
    field(:speed_mul_percent, 140) {
        number 32, false, 100
    }
    field(:attr_change, 144) {
        pointer {
            global :CurseAttrChange
        }
    }
    field(:unk_v42_1, 152) {
        number 32, true
    }
    field(:luck_mul_percent, 156) {
        number 32, false, 100
    }
    field(:unk_v42_2, 160) {
        number 32, true
    }
    field(:interaction_id, 168) {
        stl_vector(4) {
            number 32, true, -1
        }
    }
    def interaction_tg ; interaction_id.map { |i| df.world.raws.effects.all[i] } ; end
    field(:timing, 192) {
        compound(:WoundCurseInfo_TTiming) {
            field(:interaction_time, 0) {
                stl_vector(4) {
                    number 32, true
                }
            }
            field(:time_counter, 24) {
                number 32, true
            }
        }
    }
    field(:were_race, 224) {
        number 32, true, -1
    }
    def were_race_tg ; df.world.raws.creatures.all[were_race] ; end
    field(:were_caste, 228) {
        number 32, true, -1
    }
    def were_caste_tg ; df.world.raws.creatures.all[were_race].caste[were_caste] ; end
    field(:body_appearance, 232) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:bp_appearance, 256) {
        stl_vector(4) {
            number 32, true
        }
    }
end

class WoundDamageFlags1 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:cut, 0) { bit 0 }
    field(:smashed, 0) { bit 1 }
    field(:scar_cut, 0) { bit 2 }
    field(:scar_smashed, 0) { bit 3 }
    field(:tendon_bruised, 0) { bit 4 }
    field(:tendon_strained, 0) { bit 5 }
    field(:tendon_torn, 0) { bit 6 }
    field(:ligament_bruised, 0) { bit 7 }
    field(:ligament_sprained, 0) { bit 8 }
    field(:ligament_torn, 0) { bit 9 }
    field(:motor_nerve_severed, 0) { bit 10 }
    field(:sensory_nerve_severed, 0) { bit 11 }
    field(:edged_damage, 0) { bit 12 }
    field(:smashed_apart, 0) { bit 13 }
    field(:major_artery, 0) { bit 14 }
    field(:guts_spilled, 0) { bit 15 }
    field(:edged_shake1, 0) { bit 16 }
    field(:scar_edged_shake1, 0) { bit 17 }
    field(:edged_shake2, 0) { bit 18 }
    field(:broken, 0) { bit 19 }
    field(:scar_broken, 0) { bit 20 }
    field(:gouged, 0) { bit 21 }
    field(:blunt_shake1, 0) { bit 22 }
    field(:scar_blunt_shake1, 0) { bit 23 }
    field(:blunt_shake2, 0) { bit 24 }
    field(:joint_bend1, 0) { bit 25 }
    field(:scar_joint_bend1, 0) { bit 26 }
    field(:joint_bend2, 0) { bit 27 }
    field(:compound_fracture, 0) { bit 28 }
    field(:diagnosed, 0) { bit 29 }
    field(:artery, 0) { bit 30 }
    field(:overlapping_fracture, 0) { bit 31 }
end

class WoundDamageFlags2 < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:needs_setting, 0) { bit 0 }
    field(:entire_surface, 0) { bit 1 }
    field(:gelded, 0) { bit 2 }
end

class WrittenContent < MemHack::Compound
    sizeof 168

    field(:id, 0) {
        number 32, true
    }
    field(:title, 8) {
        stl_string
    }
    field(:page_start, 40) {
        number 32, true
    }
    field(:page_end, 44) {
        number 32, true
    }
    field(:refs, 48) {
        stl_vector(8) {
            pointer {
                global :GeneralRef
            }
        }
    }
    field(:ref_aux, 72) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:unk1, 96) {
        number 32, true, -1
    }
    field(:unk2, 100) {
        number 32, true, -1
    }
    field(:type, 104) {
        number 32, true, nil, WrittenContentType
    }
    field(:poetic_form, 108) {
        number 32, true, -1
    }
    def poetic_form_tg ; df.world.poetic_forms.all.binsearch(poetic_form) ; end
    field(:styles, 112) {
        stl_vector(4) {
            global :WrittenContentStyle
        }
    }
    field(:style_strength, 136) {
        stl_vector(4) {
            number 32, true
        }
    }
    field(:author, 160) {
        number 32, true, -1
    }
    def author_tg ; df.world.history.figures.binsearch(author) ; end
    field(:author_roll, 164) {
        number 32, true, -1
    }
end

class ZLevelFlags < MemHack::Compound
    field(:_whole, 0) {
        number 32, true
    }
    field(:update, 0) { bit 0 }
    field(:can_stop, 0) { bit 1 }
    field(:update_twice, 0) { bit 2 }
end

class GlobalObjects < MemHack::Compound
    addr = DFHack.get_global_address('cursor')
    if addr != 0
        field(:cursor, addr) {
            compound(:Global_TCursor) {
                field(:x, 0) {
                    number 32, true
                }
                field(:y, 4) {
                    number 32, true
                }
                field(:z, 8) {
                    number 32, true
                }
            }
        }
    end
    addr = DFHack.get_global_address('selection_rect')
    if addr != 0
        field(:selection_rect, addr) {
            compound(:Global_TSelectionRect) {
                field(:start_x, 0) {
                    number 32, true
                }
                field(:start_y, 4) {
                    number 32, true
                }
                field(:start_z, 8) {
                    number 32, true
                }
                field(:end_x, 12) {
                    number 32, true
                }
                field(:end_y, 16) {
                    number 32, true
                }
                field(:end_z, 20) {
                    number 32, true
                }
            }
        }
    end
    addr = DFHack.get_global_address('gamemode')
    if addr != 0
        field(:gamemode, addr) {
            number 32, true, nil, GameMode
        }
    end
    addr = DFHack.get_global_address('gametype')
    if addr != 0
        field(:gametype, addr) {
            number 32, true, nil, GameType
        }
    end
    addr = DFHack.get_global_address('ui_menu_width')
    if addr != 0
        field(:ui_menu_width, addr) {
            static_array(2, 1) {
                number 8, true
            }
        }
    end
    addr = DFHack.get_global_address('title')
    if addr != 0
        field(:title, addr) {
            static_string(256)
        }
    end
    addr = DFHack.get_global_address('title_spaced')
    if addr != 0
        field(:title_spaced, addr) {
            static_string(256)
        }
    end
    addr = DFHack.get_global_address('created_item_type')
    if addr != 0
        field(:created_item_type, addr) {
            stl_vector(2) {
                number 16, true, nil, ItemType
            }
        }
    end
    addr = DFHack.get_global_address('created_item_subtype')
    if addr != 0
        field(:created_item_subtype, addr) {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    end
    addr = DFHack.get_global_address('created_item_mattype')
    if addr != 0
        field(:created_item_mattype, addr) {
            stl_vector(2) {
                number 16, true, -1
            }
        }
    end
    addr = DFHack.get_global_address('created_item_matindex')
    if addr != 0
        field(:created_item_matindex, addr) {
            stl_vector(2) {
                number 16, true
            }
        }
    end
    addr = DFHack.get_global_address('created_item_count')
    if addr != 0
        field(:created_item_count, addr) {
            stl_vector(4) {
                number 32, true
            }
        }
    end
    addr = DFHack.get_global_address('map_renderer')
    if addr != 0
        field(:map_renderer, addr) {
            global :MapRenderer
        }
    end
    addr = DFHack.get_global_address('d_init')
    if addr != 0
        field(:d_init, addr) {
            global :DInit
        }
    end
    addr = DFHack.get_global_address('flows')
    if addr != 0
        field(:flows, addr) {
            stl_vector(8) {
                pointer {
                    global :FlowInfo
                }
            }
        }
    end
    addr = DFHack.get_global_address('enabler')
    if addr != 0
        field(:enabler, addr) {
            global :Enabler
        }
    end
    addr = DFHack.get_global_address('gps')
    if addr != 0
        field(:gps, addr) {
            global :Graphic
        }
    end
    addr = DFHack.get_global_address('gview')
    if addr != 0
        field(:gview, addr) {
            global :Interfacest
        }
    end
    addr = DFHack.get_global_address('init')
    if addr != 0
        field(:init, addr) {
            global :Init
        }
    end
    addr = DFHack.get_global_address('texture')
    if addr != 0
        field(:texture, addr) {
            global :TextureHandler
        }
    end
    addr = DFHack.get_global_address('timed_events')
    if addr != 0
        field(:timed_events, addr) {
            stl_vector(8) {
                pointer {
                    global :TimedEvent
                }
            }
        }
    end
    addr = DFHack.get_global_address('ui')
    if addr != 0
        field(:ui, addr) {
            global :Ui
        }
    end
    addr = DFHack.get_global_address('ui_advmode')
    if addr != 0
        field(:ui_advmode, addr) {
            global :UiAdvmode
        }
    end
    addr = DFHack.get_global_address('ui_build_selector')
    if addr != 0
        field(:ui_build_selector, addr) {
            global :UiBuildSelector
        }
    end
    addr = DFHack.get_global_address('ui_building_assign_type')
    if addr != 0
        field(:ui_building_assign_type, addr) {
            stl_vector(1) {
                number 8, true
            }
        }
    end
    addr = DFHack.get_global_address('ui_building_assign_is_marked')
    if addr != 0
        field(:ui_building_assign_is_marked, addr) {
            stl_vector(1) {
                number 8, true, nil, BooleanEnum
            }
        }
    end
    addr = DFHack.get_global_address('ui_building_assign_units')
    if addr != 0
        field(:ui_building_assign_units, addr) {
            stl_vector(8) {
                pointer {
                    global :Unit
                }
            }
        }
    end
    addr = DFHack.get_global_address('ui_building_assign_items')
    if addr != 0
        field(:ui_building_assign_items, addr) {
            stl_vector(8) {
                pointer {
                    global :Item
                }
            }
        }
    end
    addr = DFHack.get_global_address('ui_look_list')
    if addr != 0
        field(:ui_look_list, addr) {
            global :UiLookList
        }
    end
    addr = DFHack.get_global_address('ui_sidebar_menus')
    if addr != 0
        field(:ui_sidebar_menus, addr) {
            global :UiSidebarMenus
        }
    end
    addr = DFHack.get_global_address('world')
    if addr != 0
        field(:world, addr) {
            global :World
        }
    end
    addr = DFHack.get_global_address('version')
    if addr != 0
        field(:version, addr) {
            number 32, true, nil, SaveVersion
        }
    end
    addr = DFHack.get_global_address('min_load_version')
    if addr != 0
        field(:min_load_version, addr) {
            number 32, true, nil, SaveVersion
        }
    end
    addr = DFHack.get_global_address('movie_version')
    if addr != 0
        field(:movie_version, addr) {
            number 32, true, nil, CmvVersion
        }
    end
    addr = DFHack.get_global_address('basic_seed')
    if addr != 0
        field(:basic_seed, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('activity_next_id')
    if addr != 0
        field(:activity_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('agreement_next_id')
    if addr != 0
        field(:agreement_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('army_controller_next_id')
    if addr != 0
        field(:army_controller_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('army_next_id')
    if addr != 0
        field(:army_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('army_tracking_info_next_id')
    if addr != 0
        field(:army_tracking_info_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('art_image_chunk_next_id')
    if addr != 0
        field(:art_image_chunk_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('artifact_next_id')
    if addr != 0
        field(:artifact_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('belief_system_next_id')
    if addr != 0
        field(:belief_system_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('building_next_id')
    if addr != 0
        field(:building_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('crime_next_id')
    if addr != 0
        field(:crime_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('cultural_identity_next_id')
    if addr != 0
        field(:cultural_identity_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('dance_form_next_id')
    if addr != 0
        field(:dance_form_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('divination_set_next_id')
    if addr != 0
        field(:divination_set_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('entity_next_id')
    if addr != 0
        field(:entity_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('flow_guide_next_id')
    if addr != 0
        field(:flow_guide_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('formation_next_id')
    if addr != 0
        field(:formation_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('hist_event_collection_next_id')
    if addr != 0
        field(:hist_event_collection_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('hist_event_next_id')
    if addr != 0
        field(:hist_event_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('hist_figure_next_id')
    if addr != 0
        field(:hist_figure_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('identity_next_id')
    if addr != 0
        field(:identity_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('image_set_next_id')
    if addr != 0
        field(:image_set_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('incident_next_id')
    if addr != 0
        field(:incident_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('interaction_instance_next_id')
    if addr != 0
        field(:interaction_instance_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('item_next_id')
    if addr != 0
        field(:item_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('job_next_id')
    if addr != 0
        field(:job_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('machine_next_id')
    if addr != 0
        field(:machine_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('musical_form_next_id')
    if addr != 0
        field(:musical_form_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('nemesis_next_id')
    if addr != 0
        field(:nemesis_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('occupation_next_id')
    if addr != 0
        field(:occupation_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('poetic_form_next_id')
    if addr != 0
        field(:poetic_form_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('proj_next_id')
    if addr != 0
        field(:proj_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('rhythm_next_id')
    if addr != 0
        field(:rhythm_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('scale_next_id')
    if addr != 0
        field(:scale_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('schedule_next_id')
    if addr != 0
        field(:schedule_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('soul_next_id')
    if addr != 0
        field(:soul_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('squad_next_id')
    if addr != 0
        field(:squad_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('task_next_id')
    if addr != 0
        field(:task_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('unit_chunk_next_id')
    if addr != 0
        field(:unit_chunk_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('unit_next_id')
    if addr != 0
        field(:unit_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('vehicle_next_id')
    if addr != 0
        field(:vehicle_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('written_content_next_id')
    if addr != 0
        field(:written_content_next_id, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('cur_year')
    if addr != 0
        field(:cur_year, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('cur_year_tick')
    if addr != 0
        field(:cur_year_tick, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('cur_year_tick_advmode')
    if addr != 0
        field(:cur_year_tick_advmode, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('cur_season')
    if addr != 0
        field(:cur_season, addr) {
            number 8, true, nil, Season
        }
    end
    addr = DFHack.get_global_address('cur_season_tick')
    if addr != 0
        field(:cur_season_tick, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('current_weather')
    if addr != 0
        field(:current_weather, addr) {
            static_array(5, 5) {
                static_array(5, 1) {
                    number 8, true, nil, WeatherType
                }
            }
        }
    end
    addr = DFHack.get_global_address('pause_state')
    if addr != 0
        field(:pause_state, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('process_dig')
    if addr != 0
        field(:process_dig, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('process_jobs')
    if addr != 0
        field(:process_jobs, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('ui_building_in_assign')
    if addr != 0
        field(:ui_building_in_assign, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('ui_building_in_resize')
    if addr != 0
        field(:ui_building_in_resize, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('ui_building_resize_radius')
    if addr != 0
        field(:ui_building_resize_radius, addr) {
            number 16, true
        }
    end
    addr = DFHack.get_global_address('ui_building_item_cursor')
    if addr != 0
        field(:ui_building_item_cursor, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('ui_look_cursor')
    if addr != 0
        field(:ui_look_cursor, addr) {
            number 32, true, -1
        }
    end
    addr = DFHack.get_global_address('ui_selected_unit')
    if addr != 0
        field(:ui_selected_unit, addr) {
            number 32, true, -1
        }
    end
    addr = DFHack.get_global_address('ui_unit_view_mode')
    if addr != 0
        field(:ui_unit_view_mode, addr) {
            global :UiUnitViewMode
        }
    end
    addr = DFHack.get_global_address('ui_workshop_in_add')
    if addr != 0
        field(:ui_workshop_in_add, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('ui_workshop_job_cursor')
    if addr != 0
        field(:ui_workshop_job_cursor, addr) {
            number 32, true, -1
        }
    end
    addr = DFHack.get_global_address('ui_lever_target_type')
    if addr != 0
        field(:ui_lever_target_type, addr) {
            number 8, true, nil, LeverTargetType
        }
    end
    addr = DFHack.get_global_address('window_x')
    if addr != 0
        field(:window_x, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('window_y')
    if addr != 0
        field(:window_y, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('window_z')
    if addr != 0
        field(:window_z, addr) {
            number 32, true
        }
    end
    addr = DFHack.get_global_address('debug_nopause')
    if addr != 0
        field(:debug_nopause, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_nomoods')
    if addr != 0
        field(:debug_nomoods, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_combat')
    if addr != 0
        field(:debug_combat, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_wildlife')
    if addr != 0
        field(:debug_wildlife, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_nodrink')
    if addr != 0
        field(:debug_nodrink, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_noeat')
    if addr != 0
        field(:debug_noeat, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_nosleep')
    if addr != 0
        field(:debug_nosleep, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_showambush')
    if addr != 0
        field(:debug_showambush, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_fastmining')
    if addr != 0
        field(:debug_fastmining, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_noberserk')
    if addr != 0
        field(:debug_noberserk, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('debug_turbospeed')
    if addr != 0
        field(:debug_turbospeed, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('save_on_exit')
    if addr != 0
        field(:save_on_exit, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_minerals')
    if addr != 0
        field(:standing_orders_gather_minerals, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_wood')
    if addr != 0
        field(:standing_orders_gather_wood, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_food')
    if addr != 0
        field(:standing_orders_gather_food, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_bodies')
    if addr != 0
        field(:standing_orders_gather_bodies, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_animals')
    if addr != 0
        field(:standing_orders_gather_animals, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_furniture')
    if addr != 0
        field(:standing_orders_gather_furniture, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_farmer_harvest')
    if addr != 0
        field(:standing_orders_farmer_harvest, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_job_cancel_announce')
    if addr != 0
        field(:standing_orders_job_cancel_announce, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_mix_food')
    if addr != 0
        field(:standing_orders_mix_food, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_refuse')
    if addr != 0
        field(:standing_orders_gather_refuse, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_refuse_outside')
    if addr != 0
        field(:standing_orders_gather_refuse_outside, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_gather_vermin_remains')
    if addr != 0
        field(:standing_orders_gather_vermin_remains, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_corpses')
    if addr != 0
        field(:standing_orders_dump_corpses, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_skulls')
    if addr != 0
        field(:standing_orders_dump_skulls, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_skins')
    if addr != 0
        field(:standing_orders_dump_skins, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_bones')
    if addr != 0
        field(:standing_orders_dump_bones, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_hair')
    if addr != 0
        field(:standing_orders_dump_hair, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_shells')
    if addr != 0
        field(:standing_orders_dump_shells, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_dump_other')
    if addr != 0
        field(:standing_orders_dump_other, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_forbid_used_ammo')
    if addr != 0
        field(:standing_orders_forbid_used_ammo, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_forbid_other_dead_items')
    if addr != 0
        field(:standing_orders_forbid_other_dead_items, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_forbid_own_dead')
    if addr != 0
        field(:standing_orders_forbid_own_dead, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_forbid_other_nohunt')
    if addr != 0
        field(:standing_orders_forbid_other_nohunt, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_forbid_own_dead_items')
    if addr != 0
        field(:standing_orders_forbid_own_dead_items, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_loom')
    if addr != 0
        field(:standing_orders_auto_loom, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_collect_webs')
    if addr != 0
        field(:standing_orders_auto_collect_webs, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_slaughter')
    if addr != 0
        field(:standing_orders_auto_slaughter, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_butcher')
    if addr != 0
        field(:standing_orders_auto_butcher, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_tan')
    if addr != 0
        field(:standing_orders_auto_tan, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_fishery')
    if addr != 0
        field(:standing_orders_auto_fishery, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_kitchen')
    if addr != 0
        field(:standing_orders_auto_kitchen, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_kiln')
    if addr != 0
        field(:standing_orders_auto_kiln, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_smelter')
    if addr != 0
        field(:standing_orders_auto_smelter, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_auto_other')
    if addr != 0
        field(:standing_orders_auto_other, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_use_dyed_cloth')
    if addr != 0
        field(:standing_orders_use_dyed_cloth, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_zoneonly_drink')
    if addr != 0
        field(:standing_orders_zoneonly_drink, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('standing_orders_zoneonly_fish')
    if addr != 0
        field(:standing_orders_zoneonly_fish, addr) {
            number 8, false
        }
    end
    addr = DFHack.get_global_address('cur_snow_counter')
    if addr != 0
        field(:cur_snow_counter, addr) {
            number 16, true
        }
    end
    addr = DFHack.get_global_address('cur_rain_counter')
    if addr != 0
        field(:cur_rain_counter, addr) {
            number 16, true
        }
    end
    addr = DFHack.get_global_address('weathertimer')
    if addr != 0
        field(:weathertimer, addr) {
            number 16, true
        }
    end
    addr = DFHack.get_global_address('cur_snow')
    if addr != 0
        field(:cur_snow, addr) {
            static_array(256, 6) {
                global :Coord
            }
        }
    end
    addr = DFHack.get_global_address('cur_rain')
    if addr != 0
        field(:cur_rain, addr) {
            static_array(1280, 6) {
                global :Coord
            }
        }
    end
    addr = DFHack.get_global_address('jobvalue')
    if addr != 0
        field(:jobvalue, addr) {
            static_array(260, 4) {
                number 32, true
            }
        }
    end
    addr = DFHack.get_global_address('jobvalue_setter')
    if addr != 0
        field(:jobvalue_setter, addr) {
            static_array(260, 8) {
                pointer {
                    global :Unit
                }
            }
        }
    end
    addr = DFHack.get_global_address('interactitem')
    if addr != 0
        field(:interactitem, addr) {
            pointer {
                global :Item
            }
        }
    end
    addr = DFHack.get_global_address('interactinvslot')
    if addr != 0
        field(:interactinvslot, addr) {
            pointer {
                global :UnitInventoryItem
            }
        }
    end
    addr = DFHack.get_global_address('handleannounce')
    if addr != 0
        field(:handleannounce, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('preserveannounce')
    if addr != 0
        field(:preserveannounce, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
    addr = DFHack.get_global_address('updatelightstate')
    if addr != 0
        field(:updatelightstate, addr) {
            number 8, true, nil, BooleanEnum
        }
    end
end
    Global = GlobalObjects.new._at(0)
    if DFHack.get_global_address('cursor') != 0
        def self.cursor ; Global.cursor ; end
        def self.cursor=(v) ; Global.cursor = v ; end
    end
    if DFHack.get_global_address('selection_rect') != 0
        def self.selection_rect ; Global.selection_rect ; end
        def self.selection_rect=(v) ; Global.selection_rect = v ; end
    end
    if DFHack.get_global_address('gamemode') != 0
        def self.gamemode ; Global.gamemode ; end
        def self.gamemode=(v) ; Global.gamemode = v ; end
    end
    if DFHack.get_global_address('gametype') != 0
        def self.gametype ; Global.gametype ; end
        def self.gametype=(v) ; Global.gametype = v ; end
    end
    if DFHack.get_global_address('ui_menu_width') != 0
        def self.ui_menu_width ; Global.ui_menu_width ; end
        def self.ui_menu_width=(v) ; Global.ui_menu_width = v ; end
    end
    if DFHack.get_global_address('title') != 0
        def self.title ; Global.title ; end
        def self.title=(v) ; Global.title = v ; end
    end
    if DFHack.get_global_address('title_spaced') != 0
        def self.title_spaced ; Global.title_spaced ; end
        def self.title_spaced=(v) ; Global.title_spaced = v ; end
    end
    if DFHack.get_global_address('created_item_type') != 0
        def self.created_item_type ; Global.created_item_type ; end
        def self.created_item_type=(v) ; Global.created_item_type = v ; end
    end
    if DFHack.get_global_address('created_item_subtype') != 0
        def self.created_item_subtype ; Global.created_item_subtype ; end
        def self.created_item_subtype=(v) ; Global.created_item_subtype = v ; end
    end
    if DFHack.get_global_address('created_item_mattype') != 0
        def self.created_item_mattype ; Global.created_item_mattype ; end
        def self.created_item_mattype=(v) ; Global.created_item_mattype = v ; end
    end
    if DFHack.get_global_address('created_item_matindex') != 0
        def self.created_item_matindex ; Global.created_item_matindex ; end
        def self.created_item_matindex=(v) ; Global.created_item_matindex = v ; end
    end
    if DFHack.get_global_address('created_item_count') != 0
        def self.created_item_count ; Global.created_item_count ; end
        def self.created_item_count=(v) ; Global.created_item_count = v ; end
    end
    if DFHack.get_global_address('map_renderer') != 0
        def self.map_renderer ; Global.map_renderer ; end
        def self.map_renderer=(v) ; Global.map_renderer = v ; end
    end
    if DFHack.get_global_address('d_init') != 0
        def self.d_init ; Global.d_init ; end
        def self.d_init=(v) ; Global.d_init = v ; end
    end
    if DFHack.get_global_address('flows') != 0
        def self.flows ; Global.flows ; end
        def self.flows=(v) ; Global.flows = v ; end
    end
    if DFHack.get_global_address('enabler') != 0
        def self.enabler ; Global.enabler ; end
        def self.enabler=(v) ; Global.enabler = v ; end
    end
    if DFHack.get_global_address('gps') != 0
        def self.gps ; Global.gps ; end
        def self.gps=(v) ; Global.gps = v ; end
    end
    if DFHack.get_global_address('gview') != 0
        def self.gview ; Global.gview ; end
        def self.gview=(v) ; Global.gview = v ; end
    end
    if DFHack.get_global_address('init') != 0
        def self.init ; Global.init ; end
        def self.init=(v) ; Global.init = v ; end
    end
    if DFHack.get_global_address('texture') != 0
        def self.texture ; Global.texture ; end
        def self.texture=(v) ; Global.texture = v ; end
    end
    if DFHack.get_global_address('timed_events') != 0
        def self.timed_events ; Global.timed_events ; end
        def self.timed_events=(v) ; Global.timed_events = v ; end
    end
    if DFHack.get_global_address('ui') != 0
        def self.ui ; Global.ui ; end
        def self.ui=(v) ; Global.ui = v ; end
    end
    if DFHack.get_global_address('ui_advmode') != 0
        def self.ui_advmode ; Global.ui_advmode ; end
        def self.ui_advmode=(v) ; Global.ui_advmode = v ; end
    end
    if DFHack.get_global_address('ui_build_selector') != 0
        def self.ui_build_selector ; Global.ui_build_selector ; end
        def self.ui_build_selector=(v) ; Global.ui_build_selector = v ; end
    end
    if DFHack.get_global_address('ui_building_assign_type') != 0
        def self.ui_building_assign_type ; Global.ui_building_assign_type ; end
        def self.ui_building_assign_type=(v) ; Global.ui_building_assign_type = v ; end
    end
    if DFHack.get_global_address('ui_building_assign_is_marked') != 0
        def self.ui_building_assign_is_marked ; Global.ui_building_assign_is_marked ; end
        def self.ui_building_assign_is_marked=(v) ; Global.ui_building_assign_is_marked = v ; end
    end
    if DFHack.get_global_address('ui_building_assign_units') != 0
        def self.ui_building_assign_units ; Global.ui_building_assign_units ; end
        def self.ui_building_assign_units=(v) ; Global.ui_building_assign_units = v ; end
    end
    if DFHack.get_global_address('ui_building_assign_items') != 0
        def self.ui_building_assign_items ; Global.ui_building_assign_items ; end
        def self.ui_building_assign_items=(v) ; Global.ui_building_assign_items = v ; end
    end
    if DFHack.get_global_address('ui_look_list') != 0
        def self.ui_look_list ; Global.ui_look_list ; end
        def self.ui_look_list=(v) ; Global.ui_look_list = v ; end
    end
    if DFHack.get_global_address('ui_sidebar_menus') != 0
        def self.ui_sidebar_menus ; Global.ui_sidebar_menus ; end
        def self.ui_sidebar_menus=(v) ; Global.ui_sidebar_menus = v ; end
    end
    if DFHack.get_global_address('world') != 0
        def self.world ; Global.world ; end
        def self.world=(v) ; Global.world = v ; end
    end
    if DFHack.get_global_address('version') != 0
        def self.version ; Global.version ; end
        def self.version=(v) ; Global.version = v ; end
    end
    if DFHack.get_global_address('min_load_version') != 0
        def self.min_load_version ; Global.min_load_version ; end
        def self.min_load_version=(v) ; Global.min_load_version = v ; end
    end
    if DFHack.get_global_address('movie_version') != 0
        def self.movie_version ; Global.movie_version ; end
        def self.movie_version=(v) ; Global.movie_version = v ; end
    end
    if DFHack.get_global_address('basic_seed') != 0
        def self.basic_seed ; Global.basic_seed ; end
        def self.basic_seed=(v) ; Global.basic_seed = v ; end
    end
    if DFHack.get_global_address('activity_next_id') != 0
        def self.activity_next_id ; Global.activity_next_id ; end
        def self.activity_next_id=(v) ; Global.activity_next_id = v ; end
    end
    if DFHack.get_global_address('agreement_next_id') != 0
        def self.agreement_next_id ; Global.agreement_next_id ; end
        def self.agreement_next_id=(v) ; Global.agreement_next_id = v ; end
    end
    if DFHack.get_global_address('army_controller_next_id') != 0
        def self.army_controller_next_id ; Global.army_controller_next_id ; end
        def self.army_controller_next_id=(v) ; Global.army_controller_next_id = v ; end
    end
    if DFHack.get_global_address('army_next_id') != 0
        def self.army_next_id ; Global.army_next_id ; end
        def self.army_next_id=(v) ; Global.army_next_id = v ; end
    end
    if DFHack.get_global_address('army_tracking_info_next_id') != 0
        def self.army_tracking_info_next_id ; Global.army_tracking_info_next_id ; end
        def self.army_tracking_info_next_id=(v) ; Global.army_tracking_info_next_id = v ; end
    end
    if DFHack.get_global_address('art_image_chunk_next_id') != 0
        def self.art_image_chunk_next_id ; Global.art_image_chunk_next_id ; end
        def self.art_image_chunk_next_id=(v) ; Global.art_image_chunk_next_id = v ; end
    end
    if DFHack.get_global_address('artifact_next_id') != 0
        def self.artifact_next_id ; Global.artifact_next_id ; end
        def self.artifact_next_id=(v) ; Global.artifact_next_id = v ; end
    end
    if DFHack.get_global_address('belief_system_next_id') != 0
        def self.belief_system_next_id ; Global.belief_system_next_id ; end
        def self.belief_system_next_id=(v) ; Global.belief_system_next_id = v ; end
    end
    if DFHack.get_global_address('building_next_id') != 0
        def self.building_next_id ; Global.building_next_id ; end
        def self.building_next_id=(v) ; Global.building_next_id = v ; end
    end
    if DFHack.get_global_address('crime_next_id') != 0
        def self.crime_next_id ; Global.crime_next_id ; end
        def self.crime_next_id=(v) ; Global.crime_next_id = v ; end
    end
    if DFHack.get_global_address('cultural_identity_next_id') != 0
        def self.cultural_identity_next_id ; Global.cultural_identity_next_id ; end
        def self.cultural_identity_next_id=(v) ; Global.cultural_identity_next_id = v ; end
    end
    if DFHack.get_global_address('dance_form_next_id') != 0
        def self.dance_form_next_id ; Global.dance_form_next_id ; end
        def self.dance_form_next_id=(v) ; Global.dance_form_next_id = v ; end
    end
    if DFHack.get_global_address('divination_set_next_id') != 0
        def self.divination_set_next_id ; Global.divination_set_next_id ; end
        def self.divination_set_next_id=(v) ; Global.divination_set_next_id = v ; end
    end
    if DFHack.get_global_address('entity_next_id') != 0
        def self.entity_next_id ; Global.entity_next_id ; end
        def self.entity_next_id=(v) ; Global.entity_next_id = v ; end
    end
    if DFHack.get_global_address('flow_guide_next_id') != 0
        def self.flow_guide_next_id ; Global.flow_guide_next_id ; end
        def self.flow_guide_next_id=(v) ; Global.flow_guide_next_id = v ; end
    end
    if DFHack.get_global_address('formation_next_id') != 0
        def self.formation_next_id ; Global.formation_next_id ; end
        def self.formation_next_id=(v) ; Global.formation_next_id = v ; end
    end
    if DFHack.get_global_address('hist_event_collection_next_id') != 0
        def self.hist_event_collection_next_id ; Global.hist_event_collection_next_id ; end
        def self.hist_event_collection_next_id=(v) ; Global.hist_event_collection_next_id = v ; end
    end
    if DFHack.get_global_address('hist_event_next_id') != 0
        def self.hist_event_next_id ; Global.hist_event_next_id ; end
        def self.hist_event_next_id=(v) ; Global.hist_event_next_id = v ; end
    end
    if DFHack.get_global_address('hist_figure_next_id') != 0
        def self.hist_figure_next_id ; Global.hist_figure_next_id ; end
        def self.hist_figure_next_id=(v) ; Global.hist_figure_next_id = v ; end
    end
    if DFHack.get_global_address('identity_next_id') != 0
        def self.identity_next_id ; Global.identity_next_id ; end
        def self.identity_next_id=(v) ; Global.identity_next_id = v ; end
    end
    if DFHack.get_global_address('image_set_next_id') != 0
        def self.image_set_next_id ; Global.image_set_next_id ; end
        def self.image_set_next_id=(v) ; Global.image_set_next_id = v ; end
    end
    if DFHack.get_global_address('incident_next_id') != 0
        def self.incident_next_id ; Global.incident_next_id ; end
        def self.incident_next_id=(v) ; Global.incident_next_id = v ; end
    end
    if DFHack.get_global_address('interaction_instance_next_id') != 0
        def self.interaction_instance_next_id ; Global.interaction_instance_next_id ; end
        def self.interaction_instance_next_id=(v) ; Global.interaction_instance_next_id = v ; end
    end
    if DFHack.get_global_address('item_next_id') != 0
        def self.item_next_id ; Global.item_next_id ; end
        def self.item_next_id=(v) ; Global.item_next_id = v ; end
    end
    if DFHack.get_global_address('job_next_id') != 0
        def self.job_next_id ; Global.job_next_id ; end
        def self.job_next_id=(v) ; Global.job_next_id = v ; end
    end
    if DFHack.get_global_address('machine_next_id') != 0
        def self.machine_next_id ; Global.machine_next_id ; end
        def self.machine_next_id=(v) ; Global.machine_next_id = v ; end
    end
    if DFHack.get_global_address('musical_form_next_id') != 0
        def self.musical_form_next_id ; Global.musical_form_next_id ; end
        def self.musical_form_next_id=(v) ; Global.musical_form_next_id = v ; end
    end
    if DFHack.get_global_address('nemesis_next_id') != 0
        def self.nemesis_next_id ; Global.nemesis_next_id ; end
        def self.nemesis_next_id=(v) ; Global.nemesis_next_id = v ; end
    end
    if DFHack.get_global_address('occupation_next_id') != 0
        def self.occupation_next_id ; Global.occupation_next_id ; end
        def self.occupation_next_id=(v) ; Global.occupation_next_id = v ; end
    end
    if DFHack.get_global_address('poetic_form_next_id') != 0
        def self.poetic_form_next_id ; Global.poetic_form_next_id ; end
        def self.poetic_form_next_id=(v) ; Global.poetic_form_next_id = v ; end
    end
    if DFHack.get_global_address('proj_next_id') != 0
        def self.proj_next_id ; Global.proj_next_id ; end
        def self.proj_next_id=(v) ; Global.proj_next_id = v ; end
    end
    if DFHack.get_global_address('rhythm_next_id') != 0
        def self.rhythm_next_id ; Global.rhythm_next_id ; end
        def self.rhythm_next_id=(v) ; Global.rhythm_next_id = v ; end
    end
    if DFHack.get_global_address('scale_next_id') != 0
        def self.scale_next_id ; Global.scale_next_id ; end
        def self.scale_next_id=(v) ; Global.scale_next_id = v ; end
    end
    if DFHack.get_global_address('schedule_next_id') != 0
        def self.schedule_next_id ; Global.schedule_next_id ; end
        def self.schedule_next_id=(v) ; Global.schedule_next_id = v ; end
    end
    if DFHack.get_global_address('soul_next_id') != 0
        def self.soul_next_id ; Global.soul_next_id ; end
        def self.soul_next_id=(v) ; Global.soul_next_id = v ; end
    end
    if DFHack.get_global_address('squad_next_id') != 0
        def self.squad_next_id ; Global.squad_next_id ; end
        def self.squad_next_id=(v) ; Global.squad_next_id = v ; end
    end
    if DFHack.get_global_address('task_next_id') != 0
        def self.task_next_id ; Global.task_next_id ; end
        def self.task_next_id=(v) ; Global.task_next_id = v ; end
    end
    if DFHack.get_global_address('unit_chunk_next_id') != 0
        def self.unit_chunk_next_id ; Global.unit_chunk_next_id ; end
        def self.unit_chunk_next_id=(v) ; Global.unit_chunk_next_id = v ; end
    end
    if DFHack.get_global_address('unit_next_id') != 0
        def self.unit_next_id ; Global.unit_next_id ; end
        def self.unit_next_id=(v) ; Global.unit_next_id = v ; end
    end
    if DFHack.get_global_address('vehicle_next_id') != 0
        def self.vehicle_next_id ; Global.vehicle_next_id ; end
        def self.vehicle_next_id=(v) ; Global.vehicle_next_id = v ; end
    end
    if DFHack.get_global_address('written_content_next_id') != 0
        def self.written_content_next_id ; Global.written_content_next_id ; end
        def self.written_content_next_id=(v) ; Global.written_content_next_id = v ; end
    end
    if DFHack.get_global_address('cur_year') != 0
        def self.cur_year ; Global.cur_year ; end
        def self.cur_year=(v) ; Global.cur_year = v ; end
    end
    if DFHack.get_global_address('cur_year_tick') != 0
        def self.cur_year_tick ; Global.cur_year_tick ; end
        def self.cur_year_tick=(v) ; Global.cur_year_tick = v ; end
    end
    if DFHack.get_global_address('cur_year_tick_advmode') != 0
        def self.cur_year_tick_advmode ; Global.cur_year_tick_advmode ; end
        def self.cur_year_tick_advmode=(v) ; Global.cur_year_tick_advmode = v ; end
    end
    if DFHack.get_global_address('cur_season') != 0
        def self.cur_season ; Global.cur_season ; end
        def self.cur_season=(v) ; Global.cur_season = v ; end
    end
    if DFHack.get_global_address('cur_season_tick') != 0
        def self.cur_season_tick ; Global.cur_season_tick ; end
        def self.cur_season_tick=(v) ; Global.cur_season_tick = v ; end
    end
    if DFHack.get_global_address('current_weather') != 0
        def self.current_weather ; Global.current_weather ; end
        def self.current_weather=(v) ; Global.current_weather = v ; end
    end
    if DFHack.get_global_address('pause_state') != 0
        def self.pause_state ; Global.pause_state ; end
        def self.pause_state=(v) ; Global.pause_state = v ; end
    end
    if DFHack.get_global_address('process_dig') != 0
        def self.process_dig ; Global.process_dig ; end
        def self.process_dig=(v) ; Global.process_dig = v ; end
    end
    if DFHack.get_global_address('process_jobs') != 0
        def self.process_jobs ; Global.process_jobs ; end
        def self.process_jobs=(v) ; Global.process_jobs = v ; end
    end
    if DFHack.get_global_address('ui_building_in_assign') != 0
        def self.ui_building_in_assign ; Global.ui_building_in_assign ; end
        def self.ui_building_in_assign=(v) ; Global.ui_building_in_assign = v ; end
    end
    if DFHack.get_global_address('ui_building_in_resize') != 0
        def self.ui_building_in_resize ; Global.ui_building_in_resize ; end
        def self.ui_building_in_resize=(v) ; Global.ui_building_in_resize = v ; end
    end
    if DFHack.get_global_address('ui_building_resize_radius') != 0
        def self.ui_building_resize_radius ; Global.ui_building_resize_radius ; end
        def self.ui_building_resize_radius=(v) ; Global.ui_building_resize_radius = v ; end
    end
    if DFHack.get_global_address('ui_building_item_cursor') != 0
        def self.ui_building_item_cursor ; Global.ui_building_item_cursor ; end
        def self.ui_building_item_cursor=(v) ; Global.ui_building_item_cursor = v ; end
    end
    if DFHack.get_global_address('ui_look_cursor') != 0
        def self.ui_look_cursor ; Global.ui_look_cursor ; end
        def self.ui_look_cursor=(v) ; Global.ui_look_cursor = v ; end
    end
    if DFHack.get_global_address('ui_selected_unit') != 0
        def self.ui_selected_unit ; Global.ui_selected_unit ; end
        def self.ui_selected_unit=(v) ; Global.ui_selected_unit = v ; end
    end
    if DFHack.get_global_address('ui_unit_view_mode') != 0
        def self.ui_unit_view_mode ; Global.ui_unit_view_mode ; end
        def self.ui_unit_view_mode=(v) ; Global.ui_unit_view_mode = v ; end
    end
    if DFHack.get_global_address('ui_workshop_in_add') != 0
        def self.ui_workshop_in_add ; Global.ui_workshop_in_add ; end
        def self.ui_workshop_in_add=(v) ; Global.ui_workshop_in_add = v ; end
    end
    if DFHack.get_global_address('ui_workshop_job_cursor') != 0
        def self.ui_workshop_job_cursor ; Global.ui_workshop_job_cursor ; end
        def self.ui_workshop_job_cursor=(v) ; Global.ui_workshop_job_cursor = v ; end
    end
    if DFHack.get_global_address('ui_lever_target_type') != 0
        def self.ui_lever_target_type ; Global.ui_lever_target_type ; end
        def self.ui_lever_target_type=(v) ; Global.ui_lever_target_type = v ; end
    end
    if DFHack.get_global_address('window_x') != 0
        def self.window_x ; Global.window_x ; end
        def self.window_x=(v) ; Global.window_x = v ; end
    end
    if DFHack.get_global_address('window_y') != 0
        def self.window_y ; Global.window_y ; end
        def self.window_y=(v) ; Global.window_y = v ; end
    end
    if DFHack.get_global_address('window_z') != 0
        def self.window_z ; Global.window_z ; end
        def self.window_z=(v) ; Global.window_z = v ; end
    end
    if DFHack.get_global_address('debug_nopause') != 0
        def self.debug_nopause ; Global.debug_nopause ; end
        def self.debug_nopause=(v) ; Global.debug_nopause = v ; end
    end
    if DFHack.get_global_address('debug_nomoods') != 0
        def self.debug_nomoods ; Global.debug_nomoods ; end
        def self.debug_nomoods=(v) ; Global.debug_nomoods = v ; end
    end
    if DFHack.get_global_address('debug_combat') != 0
        def self.debug_combat ; Global.debug_combat ; end
        def self.debug_combat=(v) ; Global.debug_combat = v ; end
    end
    if DFHack.get_global_address('debug_wildlife') != 0
        def self.debug_wildlife ; Global.debug_wildlife ; end
        def self.debug_wildlife=(v) ; Global.debug_wildlife = v ; end
    end
    if DFHack.get_global_address('debug_nodrink') != 0
        def self.debug_nodrink ; Global.debug_nodrink ; end
        def self.debug_nodrink=(v) ; Global.debug_nodrink = v ; end
    end
    if DFHack.get_global_address('debug_noeat') != 0
        def self.debug_noeat ; Global.debug_noeat ; end
        def self.debug_noeat=(v) ; Global.debug_noeat = v ; end
    end
    if DFHack.get_global_address('debug_nosleep') != 0
        def self.debug_nosleep ; Global.debug_nosleep ; end
        def self.debug_nosleep=(v) ; Global.debug_nosleep = v ; end
    end
    if DFHack.get_global_address('debug_showambush') != 0
        def self.debug_showambush ; Global.debug_showambush ; end
        def self.debug_showambush=(v) ; Global.debug_showambush = v ; end
    end
    if DFHack.get_global_address('debug_fastmining') != 0
        def self.debug_fastmining ; Global.debug_fastmining ; end
        def self.debug_fastmining=(v) ; Global.debug_fastmining = v ; end
    end
    if DFHack.get_global_address('debug_noberserk') != 0
        def self.debug_noberserk ; Global.debug_noberserk ; end
        def self.debug_noberserk=(v) ; Global.debug_noberserk = v ; end
    end
    if DFHack.get_global_address('debug_turbospeed') != 0
        def self.debug_turbospeed ; Global.debug_turbospeed ; end
        def self.debug_turbospeed=(v) ; Global.debug_turbospeed = v ; end
    end
    if DFHack.get_global_address('save_on_exit') != 0
        def self.save_on_exit ; Global.save_on_exit ; end
        def self.save_on_exit=(v) ; Global.save_on_exit = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_minerals') != 0
        def self.standing_orders_gather_minerals ; Global.standing_orders_gather_minerals ; end
        def self.standing_orders_gather_minerals=(v) ; Global.standing_orders_gather_minerals = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_wood') != 0
        def self.standing_orders_gather_wood ; Global.standing_orders_gather_wood ; end
        def self.standing_orders_gather_wood=(v) ; Global.standing_orders_gather_wood = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_food') != 0
        def self.standing_orders_gather_food ; Global.standing_orders_gather_food ; end
        def self.standing_orders_gather_food=(v) ; Global.standing_orders_gather_food = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_bodies') != 0
        def self.standing_orders_gather_bodies ; Global.standing_orders_gather_bodies ; end
        def self.standing_orders_gather_bodies=(v) ; Global.standing_orders_gather_bodies = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_animals') != 0
        def self.standing_orders_gather_animals ; Global.standing_orders_gather_animals ; end
        def self.standing_orders_gather_animals=(v) ; Global.standing_orders_gather_animals = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_furniture') != 0
        def self.standing_orders_gather_furniture ; Global.standing_orders_gather_furniture ; end
        def self.standing_orders_gather_furniture=(v) ; Global.standing_orders_gather_furniture = v ; end
    end
    if DFHack.get_global_address('standing_orders_farmer_harvest') != 0
        def self.standing_orders_farmer_harvest ; Global.standing_orders_farmer_harvest ; end
        def self.standing_orders_farmer_harvest=(v) ; Global.standing_orders_farmer_harvest = v ; end
    end
    if DFHack.get_global_address('standing_orders_job_cancel_announce') != 0
        def self.standing_orders_job_cancel_announce ; Global.standing_orders_job_cancel_announce ; end
        def self.standing_orders_job_cancel_announce=(v) ; Global.standing_orders_job_cancel_announce = v ; end
    end
    if DFHack.get_global_address('standing_orders_mix_food') != 0
        def self.standing_orders_mix_food ; Global.standing_orders_mix_food ; end
        def self.standing_orders_mix_food=(v) ; Global.standing_orders_mix_food = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_refuse') != 0
        def self.standing_orders_gather_refuse ; Global.standing_orders_gather_refuse ; end
        def self.standing_orders_gather_refuse=(v) ; Global.standing_orders_gather_refuse = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_refuse_outside') != 0
        def self.standing_orders_gather_refuse_outside ; Global.standing_orders_gather_refuse_outside ; end
        def self.standing_orders_gather_refuse_outside=(v) ; Global.standing_orders_gather_refuse_outside = v ; end
    end
    if DFHack.get_global_address('standing_orders_gather_vermin_remains') != 0
        def self.standing_orders_gather_vermin_remains ; Global.standing_orders_gather_vermin_remains ; end
        def self.standing_orders_gather_vermin_remains=(v) ; Global.standing_orders_gather_vermin_remains = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_corpses') != 0
        def self.standing_orders_dump_corpses ; Global.standing_orders_dump_corpses ; end
        def self.standing_orders_dump_corpses=(v) ; Global.standing_orders_dump_corpses = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_skulls') != 0
        def self.standing_orders_dump_skulls ; Global.standing_orders_dump_skulls ; end
        def self.standing_orders_dump_skulls=(v) ; Global.standing_orders_dump_skulls = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_skins') != 0
        def self.standing_orders_dump_skins ; Global.standing_orders_dump_skins ; end
        def self.standing_orders_dump_skins=(v) ; Global.standing_orders_dump_skins = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_bones') != 0
        def self.standing_orders_dump_bones ; Global.standing_orders_dump_bones ; end
        def self.standing_orders_dump_bones=(v) ; Global.standing_orders_dump_bones = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_hair') != 0
        def self.standing_orders_dump_hair ; Global.standing_orders_dump_hair ; end
        def self.standing_orders_dump_hair=(v) ; Global.standing_orders_dump_hair = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_shells') != 0
        def self.standing_orders_dump_shells ; Global.standing_orders_dump_shells ; end
        def self.standing_orders_dump_shells=(v) ; Global.standing_orders_dump_shells = v ; end
    end
    if DFHack.get_global_address('standing_orders_dump_other') != 0
        def self.standing_orders_dump_other ; Global.standing_orders_dump_other ; end
        def self.standing_orders_dump_other=(v) ; Global.standing_orders_dump_other = v ; end
    end
    if DFHack.get_global_address('standing_orders_forbid_used_ammo') != 0
        def self.standing_orders_forbid_used_ammo ; Global.standing_orders_forbid_used_ammo ; end
        def self.standing_orders_forbid_used_ammo=(v) ; Global.standing_orders_forbid_used_ammo = v ; end
    end
    if DFHack.get_global_address('standing_orders_forbid_other_dead_items') != 0
        def self.standing_orders_forbid_other_dead_items ; Global.standing_orders_forbid_other_dead_items ; end
        def self.standing_orders_forbid_other_dead_items=(v) ; Global.standing_orders_forbid_other_dead_items = v ; end
    end
    if DFHack.get_global_address('standing_orders_forbid_own_dead') != 0
        def self.standing_orders_forbid_own_dead ; Global.standing_orders_forbid_own_dead ; end
        def self.standing_orders_forbid_own_dead=(v) ; Global.standing_orders_forbid_own_dead = v ; end
    end
    if DFHack.get_global_address('standing_orders_forbid_other_nohunt') != 0
        def self.standing_orders_forbid_other_nohunt ; Global.standing_orders_forbid_other_nohunt ; end
        def self.standing_orders_forbid_other_nohunt=(v) ; Global.standing_orders_forbid_other_nohunt = v ; end
    end
    if DFHack.get_global_address('standing_orders_forbid_own_dead_items') != 0
        def self.standing_orders_forbid_own_dead_items ; Global.standing_orders_forbid_own_dead_items ; end
        def self.standing_orders_forbid_own_dead_items=(v) ; Global.standing_orders_forbid_own_dead_items = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_loom') != 0
        def self.standing_orders_auto_loom ; Global.standing_orders_auto_loom ; end
        def self.standing_orders_auto_loom=(v) ; Global.standing_orders_auto_loom = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_collect_webs') != 0
        def self.standing_orders_auto_collect_webs ; Global.standing_orders_auto_collect_webs ; end
        def self.standing_orders_auto_collect_webs=(v) ; Global.standing_orders_auto_collect_webs = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_slaughter') != 0
        def self.standing_orders_auto_slaughter ; Global.standing_orders_auto_slaughter ; end
        def self.standing_orders_auto_slaughter=(v) ; Global.standing_orders_auto_slaughter = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_butcher') != 0
        def self.standing_orders_auto_butcher ; Global.standing_orders_auto_butcher ; end
        def self.standing_orders_auto_butcher=(v) ; Global.standing_orders_auto_butcher = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_tan') != 0
        def self.standing_orders_auto_tan ; Global.standing_orders_auto_tan ; end
        def self.standing_orders_auto_tan=(v) ; Global.standing_orders_auto_tan = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_fishery') != 0
        def self.standing_orders_auto_fishery ; Global.standing_orders_auto_fishery ; end
        def self.standing_orders_auto_fishery=(v) ; Global.standing_orders_auto_fishery = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_kitchen') != 0
        def self.standing_orders_auto_kitchen ; Global.standing_orders_auto_kitchen ; end
        def self.standing_orders_auto_kitchen=(v) ; Global.standing_orders_auto_kitchen = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_kiln') != 0
        def self.standing_orders_auto_kiln ; Global.standing_orders_auto_kiln ; end
        def self.standing_orders_auto_kiln=(v) ; Global.standing_orders_auto_kiln = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_smelter') != 0
        def self.standing_orders_auto_smelter ; Global.standing_orders_auto_smelter ; end
        def self.standing_orders_auto_smelter=(v) ; Global.standing_orders_auto_smelter = v ; end
    end
    if DFHack.get_global_address('standing_orders_auto_other') != 0
        def self.standing_orders_auto_other ; Global.standing_orders_auto_other ; end
        def self.standing_orders_auto_other=(v) ; Global.standing_orders_auto_other = v ; end
    end
    if DFHack.get_global_address('standing_orders_use_dyed_cloth') != 0
        def self.standing_orders_use_dyed_cloth ; Global.standing_orders_use_dyed_cloth ; end
        def self.standing_orders_use_dyed_cloth=(v) ; Global.standing_orders_use_dyed_cloth = v ; end
    end
    if DFHack.get_global_address('standing_orders_zoneonly_drink') != 0
        def self.standing_orders_zoneonly_drink ; Global.standing_orders_zoneonly_drink ; end
        def self.standing_orders_zoneonly_drink=(v) ; Global.standing_orders_zoneonly_drink = v ; end
    end
    if DFHack.get_global_address('standing_orders_zoneonly_fish') != 0
        def self.standing_orders_zoneonly_fish ; Global.standing_orders_zoneonly_fish ; end
        def self.standing_orders_zoneonly_fish=(v) ; Global.standing_orders_zoneonly_fish = v ; end
    end
    if DFHack.get_global_address('cur_snow_counter') != 0
        def self.cur_snow_counter ; Global.cur_snow_counter ; end
        def self.cur_snow_counter=(v) ; Global.cur_snow_counter = v ; end
    end
    if DFHack.get_global_address('cur_rain_counter') != 0
        def self.cur_rain_counter ; Global.cur_rain_counter ; end
        def self.cur_rain_counter=(v) ; Global.cur_rain_counter = v ; end
    end
    if DFHack.get_global_address('weathertimer') != 0
        def self.weathertimer ; Global.weathertimer ; end
        def self.weathertimer=(v) ; Global.weathertimer = v ; end
    end
    if DFHack.get_global_address('cur_snow') != 0
        def self.cur_snow ; Global.cur_snow ; end
        def self.cur_snow=(v) ; Global.cur_snow = v ; end
    end
    if DFHack.get_global_address('cur_rain') != 0
        def self.cur_rain ; Global.cur_rain ; end
        def self.cur_rain=(v) ; Global.cur_rain = v ; end
    end
    if DFHack.get_global_address('jobvalue') != 0
        def self.jobvalue ; Global.jobvalue ; end
        def self.jobvalue=(v) ; Global.jobvalue = v ; end
    end
    if DFHack.get_global_address('jobvalue_setter') != 0
        def self.jobvalue_setter ; Global.jobvalue_setter ; end
        def self.jobvalue_setter=(v) ; Global.jobvalue_setter = v ; end
    end
    if DFHack.get_global_address('interactitem') != 0
        def self.interactitem ; Global.interactitem ; end
        def self.interactitem=(v) ; Global.interactitem = v ; end
    end
    if DFHack.get_global_address('interactinvslot') != 0
        def self.interactinvslot ; Global.interactinvslot ; end
        def self.interactinvslot=(v) ; Global.interactinvslot = v ; end
    end
    if DFHack.get_global_address('handleannounce') != 0
        def self.handleannounce ; Global.handleannounce ; end
        def self.handleannounce=(v) ; Global.handleannounce = v ; end
    end
    if DFHack.get_global_address('preserveannounce') != 0
        def self.preserveannounce ; Global.preserveannounce ; end
        def self.preserveannounce=(v) ; Global.preserveannounce = v ; end
    end
    if DFHack.get_global_address('updatelightstate') != 0
        def self.updatelightstate ; Global.updatelightstate ; end
        def self.updatelightstate=(v) ; Global.updatelightstate = v ; end
    end
end
