Memory hacking/v0.27.169.33f
From DwarfFortressWiki
[edit] Addresses
pe_header_timestamp == 4763710C map_data_loc == 01462568 map_x_count_loc == 01462580 map_y_count_loc == 01462584 map_z_count_loc == 01462588 race_data_vector_loc == 01463F48 dwarven_race_index_loc == 01241AD0 main_creature_vector_loc == 01420A38 another_creature_vector_loc == 01420A48 yet_another_creature_vector_loc == 01420A88 whathe_another_creature_vector_loc == 01420A18 number_of_dwarves_loc == 0078A555 initial_starting_points_loc == 0078970A art_defacement_malus_loc == 007A489F current_unit_focus_loc == 00C39548 next_creature_id_loc == 00C119F4 language_vector_loc == 01464068 metal_tokens_vector_loc == 01463F18 starting_skills_limit_loc == 0078654B starting_skills_increment_loc == 00786466 starting_skills_decrement_loc == 00786608 creature.happiness_level == 00000508
Does anyone need other locations? Ask in the Talk subpage.
[edit] Racial Data
I shall use assembly language syntax instead of C, as that's what my disassembler delivers.
The race_data_vector is an array of pointers to instances of an object we will hereby call race_type. The instances are, of course, generated from the [CREATURE] entries in the raw files.
race_type appears to contain several custom sub-objects as well as standard ones such as strings.
This structure merely groups two strings, a singular noun and a plural noun.
00000000 s_p struc ; (sizeof=0x38) 00000000 singular string ? 0000001C plural string ? 00000038 s_p ends
This structure groups three strings, a singular noun and a plural noun and a noun I call "corpse" as it is used when displaying info about a corpse. (It is probably used in other ways as well.)
00000000 s_p_c struc ; (sizeof=0x54) 00000000 singular string ? 0000001C plural string ? 00000038 corpse_prefix? string ? 00000054 s_p_c ends
This structure groups color information. It is not obvious whether the original code has a color substructure, but I decided to make one anyway. I have not tested whether the red, green, blue fields are in the proper order. Edit: this appears to be foreground color, background color, and the bold flag, just like the raws define it.
00000000 color_type struc ; (sizeof=0x6) 00000000 red? dw ? 00000002 green? dw ? 00000004 blue? dw ? 00000006 color_type ends
This structure groups certain temperature-related information.
00000000 temperature_table struc ; (sizeof=0xE) 00000000 spec_heat dw ? 00000002 heatdam_point dw ? 00000004 colddam_point dw ? 00000006 ignite_point dw ? 00000008 melting_point dw ? 0000000A boiling_point dw ? 0000000C fixed_temp dw ? 0000000E temperature_table ends
Finally the (huge) race_type object. Note the lack of a vtable, implying that race_type is probably not subclassed.
00000000 race_type struc ; (sizeof=0x20A0) 00000000 token string ? ; TOAD, COW, EQUIPMENT_WAGON 0000001C name s_p_c ? ; cow:cows:bovine 00000070 chunk s_p ? ; remains:remains 00000070 ; chunk:chunks 000000A8 extract string ? ; cow's milk 000000A8 ; phantom spider venom 000000A8 ; liquid fire 000000C4 extract_cheese string ? ; cow cheese 000000E0 extract_antidote string ? 000000FC vermin_bite_verb string ? 00000118 gnawer_verb string ? 00000134 babyname s_p ? ; warning: token BABYNAME not in raws 0000016C childname s_p ? ; puppy, x calf, x fry 000001A4 craftsman_name s_p ? ; craftsdwarf:craftsdwarves 000001DC fisherman_name s_p ? 00000214 hammerman_name s_p ? 0000024C spearman_name s_p ? 00000284 crossbowman_name s_p ? ; marksdwarf:marksdwarves 000002BC axeman_name s_p ? 000002F4 swordsman_name s_p ? 0000032C maceman_name s_p ? 00000364 pikeman_name s_p ? ; pikedwarf:pikedwarves (!) 0000039C bowman_name s_p ? ; bowdwarf:bowdwarves (!) 000003D4 specname_male s_p_c ? ; bull:bulls:bull 00000428 specname_female s_p_c ? ; mermaid:mermaids:mermaid 0000047C tile db ? 0000047D alttile db ? 0000047E bloodtype db ? ; default 9 0000047F glowtile db ? 00000480 t temperature_table ? 0000048E silk_t temperature_table ? 0000049C leather_t temperature_table ? 000004AA bone_t temperature_table ? 000004B8 extract_t temperature_table ? 000004C6 cheese_t temperature_table ? 000004D4 drink_t temperature_table ? 000004E2 homeotherm dw ? ; default 60001 000004E4 field_4E4 dw ? 000004E6 field_4E6 dw ? 000004E8 color color_type ? ; a sub-object may start here 000004EE population_number_high dw ? 000004F0 population_number_low dw ? 000004F2 cluster_number_high dw ? 000004F4 cluster_number_low dw ? 000004F6 triggerable_group_high dw ? 000004F8 triggerable_group_low dw ? 000004FA probably_littersize_high dw ? ; default 3 000004FC probably_littersize_low dw ? 000004FE genpower dw ? 00000500 value dw ? 00000502 extract_field3 dw ? 00000504 extract_field4 dw ? 00000506 extract_cheese_value dw ? 00000508 extract_cheese_field3 dw ? 0000050A extract_cheese_field4 dw ? 0000050C penetrate_power dw ? 0000050E frequency dw ? ; default 50 00000510 antidote_value dw ? 00000512 antidote_field3 dw ? 00000514 antidote_field4 dw ? 00000516 vermin_bite_field1 dw ? 00000518 vermin_bite_field3 dw ? 0000051A grasstrample dw ? ; default 5 0000051C building_destroyer_level dw ? 0000051E damblock dw ? 00000520 corpse_item_type dw ? 00000522 corpse_item_subtype dw ? 00000524 corpse_material_type dw ? 00000526 corpse_material_subtype dw ? 00000528 itemcorpse_quality dw ? 0000052A racegloss dw ? ; default -1 0000052C remains_color color_type ? ; default 5:0:0 00000532 difficulty dw ? 00000534 fat dw ? 00000536 glowcolor1 color_type ? 0000053C material_type dw ? 0000053E material_subtype dw ? 00000540 layering dw ? 00000542 beach_frequency dw ? 00000544 speed dd ? ; default 900 00000548 modvalue dd ? 0000054C extract_value dd ? 00000550 cheese_value dd ? 00000554 antidote_field5 dd ? 00000558 petvalue dd ? 0000055C extract_size dd ? ; default 1 00000560 milking_related_number dd ? ; default 100800, 1 year 00000564 viewrange dd ? ; default 20 00000568 size dd ? ; default 6 0000056C maxage_low dd ? 00000570 maxage_high dd ? 00000574 baby_count dd ? 00000578 child_count? dd ? 0000057C density dd ? ; default 0FBBC7818h 00000580 silk_solid_density dd ? ; default 1353 00000584 silk_liquid_density dd ? ; default 0FBBC7818h 00000588 leather_solid_density dd ? ; default 0FBBC7818h 0000058C leather_liquid_density dd ? ; default 0FBBC7818h 00000590 bone_solid_density dd ? ; default 0FBBC7818h 00000594 bone_liquid_density dd ? ; default 0FBBC7818h 00000598 extract_solid_density dd ? ; default 1200 0000059C extract_liquid_density dd ? ; default 1200 000005A0 cheese_solid_density dd ? ; default 1200 000005A4 cheese_liquid_density dd ? ; default 1200 000005A8 drink_solid_density dd ? ; default 1200 000005AC drink_liquid_density dd ? ; default 1200 000005B0 swim_speed dd ? 000005B4 trade_capacity dd ? 000005B8 prefstring_vector vector ? 000005C8 body_vector vector ? 000005D8 attack_vector vector ? 000005E8 personality_traits_min? dw 30 dup(?) ; base 10 00000624 personality_traits_avg? dw 30 dup(?) ; default 50's 00000660 personality_traits_max? dw 30 dup(?) ; default 100's 0000069C demon_sphere_vector vector ? 000006AC flags_ptr dd ? ; ptr to flags bitfield size 19h 000006B0 flags_size dd ? ; 19h, size of bitfield 000006B4 field_6B4 dd 6 dup(?) 000006CC field_6CC dd 6 dup(?) 000006E4 field_6E4 dd 7 dup(?) 00000700 field_700 dd 7 dup(?) 0000071C field_71C dd 7 dup(?) 00000738 field_738 dd 7 dup(?) 00000754 field_754 dd 7 dup(?) 00000770 field_770 dd 7 dup(?) 0000078C field_78C dd 7 dup(?) 000007A8 field_7A8 dd 7 dup(?) 000007C4 field_7C4 dd 7 dup(?) 000007E0 field_7E0 dd 7 dup(?) 000007FC field_7FC dd 7 dup(?) 00000818 field_818 dd 7 dup(?) 00000834 field_834 dd 114 dup(?) 000009FC field_9FC dd 114 dup(?) 00000BC4 field_BC4 dd 114 dup(?) 00000D8C field_D8C dd 114 dup(?) 00000F54 field_F54 dd 114 dup(?) 0000111C field_111C dd 114 dup(?) 000012E4 field_12E4 dd 114 dup(?) ; associated with field_834 000014AC field_14AC dd 114 dup(?) 00001674 field_1674 dd 114 dup(?) 0000183C field_183C dd 114 dup(?) 00001A04 field_1A04 dd 114 dup(?) 00001BCC field_1BCC dd 114 dup(?) 00001D94 field_1D94 db 6 dup(?) ; probably flags, 00001D94 ; associated with field_6B4 and field_6CC, 00001D94 ; somehow related to ADD_COLOR 00001D9A field_1D9A db 7 dup(?) ; associated with field_6E4 00001DA1 field_1DA1 db 7 dup(?) ; associated with field_700 00001DA8 field_1DA8 db 7 dup(?) ; associated with field_71C 00001DAF field_1DAF db 7 dup(?) 00001DB6 field_1DB6 db 7 dup(?) ; associated with field_754 00001DBD field_1DBD db 7 dup(?) ; associated with field_770 00001DC4 field_1DC4 db 114 dup(?) ; probably flags 00001DC4 ; associated with field_834 and field_12E4 00001DC4 ; somehow related to ADD_COLOR 00001E36 field_1E36 db 114 dup(?) ; associated with field_9FC 00001EA8 field_1EA8 db 114 dup(?) ; associated with field_BC4 00001F1A field_1F1A db 114 dup(?) 00001F8C field_1F8C db 114 dup(?) ; associated wiuth field_F54 00001FFE field_1FFE db 114 dup(?) ; associated with field_111C 00002070 speech_vector?_1 vector ? 00002080 speech_vector?_2 vector ? 00002090 speech_vector?_3 vector ? 000020A0 race_type ends
Most everything that the raws can set on a creature has been found. The arrays near the end are not set by the raws, and are currently unknown.
race_type.flags_ptr needs further explanation. The object does not contain the associated flags; instead it has a pointer to a bitvector of flags. To test a flag in the bitvector, divide the flag number by 8 (number of bits in a byte). The quotient is the byte to test, the remainder is the number of bits to shift the mask. Flag 0x43, for example, is tested by (BYTE *)(race.flags_ptr)[8] & (1 << 3) .
The flags:
0: ?? used but not set by raws
1: ??
2: LOCKPICKER
3: AMPHIBIOUS
4: AQUATIC (also sets AMPHIBIOUS)
5: MISCHIEVIOUS
6: PATTERNFLIER
7: CURIOUSBEAST
8: CURIOUSBEAST_ITEM
9: CURIOUSBEAST_GUZZLER
A: FLEEQUICK
B: VERMINHUNTER
C: VERMIN_EATER
D: VERMIN_GROUNDER
E: VERMIN_ROTTER
F: ??
10: SWIMS_LEARNED
11: VERMIN_SOIL
12: VERMIN_SOIL_COLONY
13: ??
14: ??
15: NO_EAT
16: NO_DRINK
17: NO_SLEEP
18: COMMON_DOMESTIC
19: WAGON_PULLER
1A: PACK_ANIMAL
1B: LARGE_ROAMING
1C: VERMIN_FISH
1D: FLIER
1E: LARGE_PREDATOR
1F: MAGMA_VISION
20: LOOSE_CLUSTERS
21: FIREIMMUNE
22: FIREIMMUNE_SUPER
23: WEBBER
24: WEBIMMUNE
25: FANCIFUL
26: FISHITEM
27: IMMOBILE_LAND
28: IMMOLATE
29: MILKABLE
2A: NO_SPRING
2B: NO_SUMMER
2C: NO_AUTUMN
2D: NO_WINTER
2E: BENIGN
2F: VERMIN_NOROAM
30: VERMIN_NOTRAP
31: VERMIN_NOFISH
32: EXTRACT_PERMANENT
33: EXTRACT_PARALYZE
34: EXTRACT_STUN
35: EXTRACT_PARALYZE_INTERMITTENT
36: EXTRACT_STUN_INTERMITTENT
37: AMBUSHPREDATOR
38: CHITIN
39: GNAWER
3A: NOT_BUTCHERABLE
3B: BUTCHERABLE_NONSTANDARD
3C: COOKABLE_LIVE
3D: EXTRACT_COOKABLE
3E: FIREBREATH
3F: DRAGONFIREBREATH
40: MEANDERER
41: THICKWEB
42: TRAINABLE
43: PET
44: PET_EXOTIC
45: CAN_CIV
46: CAN_SPEAK
47: CAN_LEARN
note: INTELLIGENT sets 45, 46, 47
48: UTTERANCES
49: BONECARN (also sets CARNIVORE)
4A: CARNIVORE
4B: UNDERSWIM
4C: NOEXERT
4D: NOPAIN
4E: EXTRAVISION
4F: NOBREATHE
50: NOSTUN
51: NONAUSEA
52: NOBLEAD
53: TRANCES
54: NOEMOTION
55: RECKLESS
56: NOSTUCKINS
57: SEVERONBREAKS
58: NOSKULL
59: NOSKIN
5A: NOBONES
5B: NOMEAT
5C: PARALYZEIMMUNE
5D: NOFEAR
5E: CANOPENDOORS
5F: has ITEMCORPSE see also fields 520-526
60: USE_RACEGLOSS as corpse material subtype
61: NOSMELLYROT
62: REMAINS_UNDETERMINED
63: HASSHELL
64: PEARL
65: IVORY
66: HORN
67: NARROW
68: STOUT
69: LIKES_FIGHTING
6A: VERMIN_HATABLE
6B: VEGETATION
6C: MAGICAL
6D: GOOD
6E: NATURAL
6F: EVIL
70: SAVAGE
71: BABY see also field 574
72: CHILD see also field 578
73: MULTIPLE_LITTER_RARE
74: MOUNT
75: MOUNT_EXOTIC
76: FEATURE_ATTACK_GROUP
77: VERMIN_MICRO
78: BIOME_POOL_TEMPERATE_BRACKISHWATER
79: EQUIPS
7A: ENDING
7B: DEFENDER
7C: NOTHOUGHT
7D: TRAPAVOID
7E: CAVE_ADAPT
7F: MEGABEAST
80: SEMIMEGABEAST
81: ALL_ACTIVE
82: DIURNAL
83: NOCTURNAL
84: CREPUSCULAR
85: MATUTINAL
86: VESPERTINE
87: LIGHT_GEN
88: BIOME_MOUNTAIN
89: BIOME_GLACIER
8A: BIOME_TUNDRA
8B: BIOME_SWAMP_TEMPERATE_FRESHWATER
8C: BIOME_SWAMP_TEMPERATE_SALTWATER
8D: BIOME_MARSH_TEMPERATE_FRESHWATER
8E: BIOME_MARSH_TEMPERATE_SALTWATER
8F: BIOME_SWAMP_TROPICAL_FRESHWATER
90: BIOME_SWAMP_TROPICAL_SALTWATER
91: BIOME_SWAMP_MANGROVE
92: BIOME_MARSH_TROPICAL_FRESHWATER
93: BIOME_MARSH_TROPICAL_SALTWATER
94: BIOME_FOREST_TAIGA
95: BIOME_FOREST_TEMPERATE_CONIFER
96: BIOME_FOREST_TEMPERATE_BROADLEAF
97: BIOME_FOREST_TROPICAL_CONIFER
98: BIOME_FOREST_TROPICAL_DRY_BROADLEAF
99: BIOME_FOREST_TROPICAL_MOIST_BROADLEAF
9A: BIOME_GRASSLAND_TEMPERATE
9B: BIOME_SAVANNA_TEMPERATE
9C: BIOME_SHRUBLAND_TEMPERATE
9D: BIOME_GRASSLAND_TROPICAL
9E: BIOME_SAVANNA_TROPICAL
9F: BIOME_SHRUBLAND_TROPICAL
A0: BIOME_DESERT_BADLAND
A1: BIOME_DESERT_ROCK
A2: BIOME_DESERT_SAND
A3: BIOME_OCEAN_TROPICAL
A4: BIOME_OCEAN_TEMPERATE
A5: BIOME_OCEAN_ARCTIC
A6: BIOME_POOL_TEMPERATE_FRESHWATER
A7: BIOME_SUBTERRANEAN_WATER
A8: BIOME_SUBTERRANEAN_CHASM
A9: BIOME_SUBTERRANEAN_LAVA
AA: FEMALE
AB: MALE
AC: NO_GENDER
AD: LISP
AE: MATERIAL
AF: both MATERIAL & USE_RACEGLOSS
B0: ALCOHOL_DEPENDENT
B1: SWIMS_INNATE (also sets SWIMS_LEARNED)
B2: BIOME_POOL_TEMPERATE_SALTWATER
B3: BIOME_POOL_TROPICAL_FRESHWATER
B4: BIOME_POOL_TROPICAL_BRACKISHWATER
B5: BIOME_POOL_TROPICAL_SALTWATER
B6: BIOME_LAKE_TEMPERATE_FRESHWATER
B7: BIOME_LAKE_TEMPERATE_BRACKISHWATER
B8: BIOME_LAKE_TEMPERATE_SALTWATER
B9: BIOME_LAKE_TROPICAL_FRESHWATER
BA: BIOME_LAKE_TROPICAL_BRACKISHWATER
BB: BIOME_LAKE_TROPICAL_SALTWATER
BC: BIOME_RIVER_TEMPERATE_FRESHWATER
BD: BIOME_RIVER_TEMPERATE_BRACKISHWATER
BE: BIOME_RIVER_TEMPERATE_SALTWATER
BF: BIOME_RIVER_TROPICAL_FRESHWATER
C0: BIOME_RIVER_TROPICAL_BRACKISHWATER
C1: BIOME_RIVER_TROPICAL_SALTWATER
EQUIPMENT_WAGON sets 1, 15-17, 3A, 4C-5D, 61, 7C, AC
the following set multiple biome flags:
BIOME_ALL_MAIN, BIOME_ANY_LAND, BIOME_ANY_OCEAN, BIOME_ANY_LAKE,
BIOME_ANY_RIVER, BIOME_ANY_POOL, BIOME_NOT_FREEZING, BIOME_ANY_TEMPERATE,
BIOME_ANY_TROPICAL, BIOME_ANY_TEMPERATE_FOREST, BIOME_ANY_TROPICAL_FOREST,
BIOME_ANY_WETLAND, BIOME_ANY_DESERT
This work done by 0x517A5D 22:36, 19 December 2007 (EST)
- A thought: If I was designing this structure, all of these seldom-used fields would be kept off in a vector of strings and parsed when needed. I mean,
remains_coloris used once in the entire game, and it's for a creature that (I think) can't even appear!demon_sphere_vector?cheese_liquid_density? Now, really.
—0x517A5D 15:28, 21 December 2007 (EST)

