From d5aa1488a600389b48c6b703893cb5f44536b2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 6 Apr 2010 13:05:54 +0200 Subject: [PATCH] Magma create works --- dfhack/include/DFTypes.h | 178 +------------------------------- dfhack/include/modules/Maps.h | 188 +++++++++++++++++++++++++++++++++- examples/veccheck.cpp | 49 ++++++++- output/Memory.xml | 5 + tools/CMakeLists.txt | 4 +- tools/magma_create.cpp | 54 +++++----- 6 files changed, 270 insertions(+), 208 deletions(-) diff --git a/dfhack/include/DFTypes.h b/dfhack/include/DFTypes.h index f9ba70cd5..902684947 100644 --- a/dfhack/include/DFTypes.h +++ b/dfhack/include/DFTypes.h @@ -64,20 +64,7 @@ struct t_vein uint32_t address_of; // this is NOT part of the DF vein, but an address of the vein as seen by DFhack. }; */ -struct t_vein -{ - uint32_t vtable; - int32_t type; - int16_t assignment[16]; - uint32_t flags; - uint32_t address_of; // this is NOT part of the DF vein, but an address of the vein as seen by DFhack. -}; -// stores what tiles should appear when the ice melts -struct t_frozenliquidvein -{ - uint32_t vtable; - int16_t tiles[16][16]; -}; + struct t_matglossPair { @@ -121,10 +108,12 @@ struct t_construction_df40d { int16_t x; int16_t y; + // 4 int16_t z; int16_t unk1; + // 8 int16_t unk2; - t_matglossPair material; // 4B + t_matglossPair material; // C points to the index part // int16_t mat_type; // int16_t mat_idx; }; @@ -695,165 +684,6 @@ struct t_itemType char name[128]; }; - -enum e_traffic -{ - traffic_normal, - traffic_low, - traffic_high, - traffic_restricted -}; - -enum e_designation -{ - designation_no, - designation_default, // dig walls, remove stairs and ramps, gather plants, fell trees - designation_ud_stair, // dig up/down stairs - designation_channel, // dig a channel - designation_ramp, // dig ramp out of a wall - designation_d_stair, // dig a stair down - designation_u_stair, // dig a stair up - designation_7 // whatever -}; - -enum e_liquidtype -{ - liquid_water, - liquid_magma -}; - -struct naked_designation -{ - unsigned int flow_size : 3; // how much liquid is here? - unsigned int pile : 1; // stockpile? - /* - * All the different dig designations... needs more info, probably an enum - */ - e_designation dig : 3; - unsigned int smooth : 2; - unsigned int hidden : 1; - - /* - * This one is rather involved, but necessary to retrieve the base layer matgloss index - * see http://www.bay12games.com/forum/index.php?topic=608.msg253284#msg253284 for details - */ - unsigned int geolayer_index :4; - unsigned int light : 1; - unsigned int subterranean : 1; // never seen the light of day? - unsigned int skyview : 1; // sky is visible now, it rains in here when it rains - - /* - * Probably similar to the geolayer_index. Only with a different set of offsets and different data. - * we don't use this yet - */ - unsigned int biome : 4; - /* - * 0 = water - * 1 = magma - */ - e_liquidtype liquid_type : 1; - unsigned int water_table : 1; // srsly. wtf? - unsigned int rained : 1; // does this mean actual rain (as in the blue blocks) or a wet tile? - e_traffic traffic : 2; // needs enum - unsigned int flow_forbid : 1; // what? - unsigned int liquid_static : 1; - unsigned int moss : 1;// I LOVE MOSS - unsigned int feature_present : 1; // another wtf... is this required for magma pipes to work? - unsigned int liquid_character : 2; // those ripples on streams? -}; - -union t_designation -{ - uint32_t whole; - naked_designation bits; -}; - -// occupancy flags (rat,dwarf,horse,built wall,not build wall,etc) -struct naked_occupancy -{ - unsigned int building : 3;// building type... should be an enum? - // 7 = door - unsigned int unit : 1; - unsigned int unit_grounded : 1; - unsigned int item : 1; - // splatter. everyone loves splatter. - unsigned int mud : 1; - unsigned int vomit :1; - unsigned int broken_arrows_color :4; - unsigned int blood_g : 1; - unsigned int blood_g2 : 1; - unsigned int blood_b : 1; - unsigned int blood_b2 : 1; - unsigned int blood_y : 1; - unsigned int blood_y2 : 1; - unsigned int blood_m : 1; - unsigned int blood_m2 : 1; - unsigned int blood_c : 1; - unsigned int blood_c2 : 1; - unsigned int blood_w : 1; - unsigned int blood_w2 : 1; - unsigned int blood_o : 1; - unsigned int blood_o2 : 1; - unsigned int slime : 1; - unsigned int slime2 : 1; - unsigned int blood : 1; - unsigned int blood2 : 1; - unsigned int broken_arrows_variant : 1; - unsigned int snow : 1; -}; - -struct naked_occupancy_grouped -{ - unsigned int building : 3;// building type... should be an enum? - // 7 = door - unsigned int unit : 1; - unsigned int unit_grounded : 1; - unsigned int item : 1; - // splatter. everyone loves splatter. - unsigned int splatter : 26; -}; - -union t_occupancy -{ - uint32_t whole; - naked_occupancy bits; - naked_occupancy_grouped unibits; -}; - -// map block flags -struct naked_blockflags -{ - unsigned int designated : 1;// designated for jobs (digging and stuff like that) - unsigned int unk_1 : 1; // possibly related to the designated flag - // two flags required for liquid flow. no idea why - unsigned int liquid_1 : 1; - unsigned int liquid_2 : 1; - unsigned int unk_2: 28; // rest of the flags is completely unknown - // there's a possibility that this flags field is shorter than 32 bits -}; - -union t_blockflags -{ - uint32_t whole; - naked_blockflags bits; -}; - -typedef int16_t tiletypes40d [16][16]; -typedef DFHack::t_designation designations40d [16][16]; -typedef DFHack::t_occupancy occupancies40d [16][16]; -typedef uint8_t biome_indices40d [16]; - -typedef struct -{ - tiletypes40d tiletypes; - designations40d designation; - occupancies40d occupancy; - // really a '7', but I use 8 to make it neater :) - biome_indices40d biome_indices; - uint32_t origin; // the address where it came from - t_blockflags blockflags; -} mapblock40d; - struct t_viewscreen { int32_t type; diff --git a/dfhack/include/modules/Maps.h b/dfhack/include/modules/Maps.h index eb4856d32..7e4274cc4 100644 --- a/dfhack/include/modules/Maps.h +++ b/dfhack/include/modules/Maps.h @@ -1,12 +1,194 @@ +/******************************************************************************* + M A P S + Read and write DF's map +*******************************************************************************/ #ifndef CL_MOD_MAPS #define CL_MOD_MAPS #include "Export.h" -/* -* Maps: Read and write DF's map -*/ namespace DFHack { + /*************************************************************************** + T Y P E S + ***************************************************************************/ + + struct t_vein + { + uint32_t vtable; + int32_t type; + int16_t assignment[16]; + uint32_t flags; + uint32_t address_of; // this is NOT part of the DF vein, but an address of the vein as seen by DFhack. + }; + // stores what tiles should appear when the ice melts + struct t_frozenliquidvein + { + uint32_t vtable; + int16_t tiles[16][16]; + }; + + enum e_traffic + { + traffic_normal, + traffic_low, + traffic_high, + traffic_restricted + }; + + enum e_designation + { + designation_no, + designation_default, // dig walls, remove stairs and ramps, gather plants, fell trees + designation_ud_stair, // dig up/down stairs + designation_channel, // dig a channel + designation_ramp, // dig ramp out of a wall + designation_d_stair, // dig a stair down + designation_u_stair, // dig a stair up + designation_7 // whatever + }; + + enum e_liquidtype + { + liquid_water, + liquid_magma + }; + + struct naked_designation + { + unsigned int flow_size : 3; // how much liquid is here? + unsigned int pile : 1; // stockpile? + /* + * All the different dig designations... needs more info, probably an enum + */ + e_designation dig : 3; + unsigned int smooth : 2; + unsigned int hidden : 1; + + /* + * This one is rather involved, but necessary to retrieve the base layer matgloss index + * see http://www.bay12games.com/forum/index.php?topic=608.msg253284#msg253284 for details + */ + unsigned int geolayer_index :4; + unsigned int light : 1; + unsigned int subterranean : 1; // never seen the light of day? + unsigned int skyview : 1; // sky is visible now, it rains in here when it rains + + /* + * Probably similar to the geolayer_index. Only with a different set of offsets and different data. + * we don't use this yet + */ + unsigned int biome : 4; + /* + * 0 = water + * 1 = magma + */ + e_liquidtype liquid_type : 1; + unsigned int water_table : 1; // srsly. wtf? + unsigned int rained : 1; // does this mean actual rain (as in the blue blocks) or a wet tile? + e_traffic traffic : 2; // needs enum + unsigned int flow_forbid : 1; // what? + unsigned int liquid_static : 1; + unsigned int moss : 1;// I LOVE MOSS + unsigned int feature_present : 1; // another wtf... is this required for magma pipes to work? + unsigned int liquid_character : 2; // those ripples on streams? + }; + + union t_designation + { + uint32_t whole; + naked_designation bits; + }; + + // occupancy flags (rat,dwarf,horse,built wall,not build wall,etc) + struct naked_occupancy + { + unsigned int building : 3;// building type... should be an enum? + // 7 = door + unsigned int unit : 1; + unsigned int unit_grounded : 1; + unsigned int item : 1; + // splatter. everyone loves splatter. + unsigned int mud : 1; + unsigned int vomit :1; + unsigned int broken_arrows_color :4; + unsigned int blood_g : 1; + unsigned int blood_g2 : 1; + unsigned int blood_b : 1; + unsigned int blood_b2 : 1; + unsigned int blood_y : 1; + unsigned int blood_y2 : 1; + unsigned int blood_m : 1; + unsigned int blood_m2 : 1; + unsigned int blood_c : 1; + unsigned int blood_c2 : 1; + unsigned int blood_w : 1; + unsigned int blood_w2 : 1; + unsigned int blood_o : 1; + unsigned int blood_o2 : 1; + unsigned int slime : 1; + unsigned int slime2 : 1; + unsigned int blood : 1; + unsigned int blood2 : 1; + unsigned int broken_arrows_variant : 1; + unsigned int snow : 1; + }; + + struct naked_occupancy_grouped + { + unsigned int building : 3;// building type... should be an enum? + // 7 = door + unsigned int unit : 1; + unsigned int unit_grounded : 1; + unsigned int item : 1; + // splatter. everyone loves splatter. + unsigned int splatter : 26; + }; + + union t_occupancy + { + uint32_t whole; + naked_occupancy bits; + naked_occupancy_grouped unibits; + }; + + // map block flags + struct naked_blockflags + { + unsigned int designated : 1;// designated for jobs (digging and stuff like that) + unsigned int unk_1 : 1; // possibly related to the designated flag + // two flags required for liquid flow. no idea why + unsigned int liquid_1 : 1; + unsigned int liquid_2 : 1; + unsigned int unk_2: 28; // rest of the flags is completely unknown + // there's a possibility that this flags field is shorter than 32 bits + }; + + union t_blockflags + { + uint32_t whole; + naked_blockflags bits; + }; + + typedef int16_t tiletypes40d [16][16]; + typedef DFHack::t_designation designations40d [16][16]; + typedef DFHack::t_occupancy occupancies40d [16][16]; + typedef uint8_t biome_indices40d [16]; + + typedef struct + { + tiletypes40d tiletypes; + designations40d designation; + occupancies40d occupancy; + // really a '7', but I use 8 to make it neater :) + biome_indices40d biome_indices; + uint32_t origin; // the address where it came from + t_blockflags blockflags; + } mapblock40d; + + /*************************************************************************** + C L I E N T M O D U L E + ***************************************************************************/ + class APIPrivate; struct t_viewscreen; class DFHACK_EXPORT Maps diff --git a/examples/veccheck.cpp b/examples/veccheck.cpp index ba82b2f87..e8cfbe086 100644 --- a/examples/veccheck.cpp +++ b/examples/veccheck.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace std; #include @@ -13,6 +14,7 @@ using namespace std; #include #include #include +#include void DumpObjStr0Vector (const char * name, DFHack::Process *p, uint32_t addr) { @@ -25,7 +27,18 @@ void DumpObjStr0Vector (const char * name, DFHack::Process *p, uint32_t addr) } cout << endl; } - +void DumpObjVtables (const char * name, DFHack::Process *p, uint32_t addr) +{ + cout << "----==== " << name << " ====----" << endl; + DFHack::DfVector vect(p,addr,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t addr = *(uint32_t *) vect[i]; + uint32_t vptr = p->readDWord(addr); + cout << p->readClassName(vptr) << endl; + } + cout << endl; +} void DumpDWordVector (const char * name, DFHack::Process *p, uint32_t addr) { cout << "----==== " << name << " ====----" << endl; @@ -63,11 +76,41 @@ int main (int numargs, const char ** args) DFHack::Process* p = DF.getProcess(); DFHack::memory_info* mem = DF.getMemoryInfo(); //const vector * names = mem->getClassIDMapping(); +/* + string name="Stuff"; + cout << "----==== " << name << " ====----" << endl; + DFHack::DfVector vect(p,0x165b290,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t addr = *(uint32_t *) vect[i]; + DFHack::t_construction_df40d constr; + DF.ReadRaw(addr, sizeof(constr), (uint8_t *) &constr); + printf("0x%x %dX %dY %dZ: %d:%d\n", addr, constr.x, constr.y, constr.z, + constr.material.type,constr.material.index); + } - DumpObjStr0Vector("Material templates",p, mem->getAddress("mat_templates")); + cout << endl; + */ + /* + DumpObjVtables("Constructions?",p,0x165b278); + DumpObjVtables("Constructions?",p,0x166edb8); + */ + /* + DumpObjStr0Vector("Material templates",p, mem->getAddress("mat_templates")); + */ DumpObjStr0Vector("Inorganics",p, mem->getAddress("mat_inorganics")); + cout << "----==== Inorganics ====----" << endl; + DFHack::DfVector vect(p,addr,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t addr = *(uint32_t *) vect[i]; + cout << p->readSTLString(addr) << endl; + } + cout << endl; + + /* DumpObjStr0Vector("Organics - all",p, mem->getAddress("mat_organics_all")); DumpObjStr0Vector("Organics - plants",p, mem->getAddress("mat_organics_plants")); @@ -89,7 +132,7 @@ int main (int numargs, const char ** args) DumpObjStr0Vector("Creature variations",p, mem->getAddress("mat_creature_variations")); DumpObjStr0Vector("Creature types",p, mem->getAddress("mat_creature_types")); - + */ #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl; diff --git a/output/Memory.xml b/output/Memory.xml index f4d5a751d..8630545e3 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -3012,6 +3012,11 @@ map_data_1b60_offset 0x1B9c
0x016AFE58
+ + +
0x165b290
+ 0x14 +