v50 Steam/Premium information for editors
- v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
- Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.
Editing User:0x517A5D
Jump to navigation
Jump to search
Warning: You are not logged in.
Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | == Build | + | == Build == |
− | + | Currently running | |
− | + | * a competent mason / proficient building designer / novice organizer / novice record keeper | |
+ | * a proficient armorsmith / skilled metalsmith / novice furnace operator | ||
+ | * a proficient weaponsmith / skilled metalcrafter / novice furnace operator | ||
+ | * a proficient bowyer / proficient mechanic | ||
+ | * a skilled herbalist / novice bowyer / novice persuader / novice negotiator / novice judge of intent / novice appraiser / novice flatterer | ||
+ | * a proficient brewer / skilled grower / novice armorsmith | ||
+ | * a proficient cook / skilled grower / novice weaponsmith | ||
− | * | + | And |
− | + | * 2 copper picks | |
− | * | + | * 1 steel battle axe |
− | + | * 1 iron anvil | |
− | * | + | * 28 plump helmet spawn |
− | + | * 15 pig tail spawn | |
− | * | + | * 1 dimple cup spawn |
− | + | * 1 cave wheat seed | |
− | * | + | * 1 sweet pod seed |
− | + | * 1 rock nut | |
− | * | + | * 1 plump helmet |
− | + | * 4 units of assorted alcohol, 1 of each type available | |
− | * | + | * 11 turtles |
− | + | * 11 units of assorted 2p meats, 1 of each type available | |
+ | * 11 units of assorted 4p meats, 1 of each type available | ||
+ | * 8 units of assorted 2p fish, 1 of each type available | ||
+ | * 2 units of assorted 4p meats, 1 of each type available | ||
+ | * 6 dogs | ||
− | + | The drinks, plump helmet, meat, and fish are bought for the free barrels. Most seeds are bought for the free bags. Turtles are bought for the shells and bones. | |
− | I | + | I chose a 5x5 map which I had previously verified to have hidden magma, lots of limestone and marble, tons of magnetite, some coal, and lots of trees. |
− | I | + | I wil play with using reveal this time. I enjoy it more that way. |
− | + | Esmullogem, "Fullpaint". Could be worse. Stroike the oith! | |
− | + | <!-- | |
− | + | :Post mortem: abandoned in a fit of pique after striking the aquifer in the middle of my ore storage area and flooding the forging/smelting area below. The bolt thing didn't work out. I got nothing. So that's 90 more points I can spend. Probably I'll buy 4p meats for more barrels. I love me some barrels. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | The | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | :Lessons learned: it's too easy to dig into an aquifer square. There really should be a warning beyond the initial "dig cancelled". Outdoor farming seems even more imbalanced than indoor farming. All crops, all year around. Maybe that will change when recipes are implemented. Vertical connectivity is king. An up/down staircase takes no longer to dig than an empty square, and has much more potential. You can't put a building on an up/down, but you can put a stockpile or zone on it. Garbage dumps should preferably be built on the same x/y coords on every z level, or selectively disabled as necessary. Make magma channels two-wide or more for faster filling. | ||
− | + | :Still to do: I had planned to experiment with steel pumps to move magma around, but obviously never got there. I want my magma moat, darnit! I'm considering making all hallways out of up/down. It would be ugly though. I should experiment in seeing how many melted copper picks it takes to forge a copper battle axe. If it's more than 1, than I'd need to bring enough supplies to start with two wagons. Or buy some logs for the initial charcoal. 3p each, a fairly good deal. | |
+ | --> | ||
− | + | ---- | |
− | + | == Enable Magma Buildings == | |
+ | Helper utility for Rick's reveal.exe<br/> | ||
+ | [http://www.yourfilehost.com/media.php?cat=other&file=enable_magma_buildings.zip enable_magma_buildings.zip] | ||
− | + | You need this utility in the case that you used the reveal utility, and | |
+ | there is a magma pool or pipe on your map that does not reach the surface. | ||
+ | (If the hide utility is ever updated, you could also hide a few magma | ||
+ | tiles and then dig them out. That worked in the old version.) | ||
− | + | Because there is no actual flag that controls whether magma has been seen | |
+ | (the game searches a list, probably a list of notable events), I had to | ||
+ | patch the game's code. This means you need to run the patch every time | ||
+ | you start dwarfort.exe. | ||
− | + | This utility has been made version-independent. | |
+ | It is expected to work with future releases of Dwarf Fortress. | ||
− | + | ---- | |
− | + | == Map Data Voodoo == | |
− | + | To find the map_data, map_x_count, map_y_count, and map_z_count in an unknown version of dwarfort.exe, | |
− | + | <pre>// find certain map data variables. | |
+ | // this is the simplest type of search -- no meta tokens at all. | ||
+ | d = search(6, 0xC6, 0x44, 0x24, 0x38, 0x3E, 0xBF); | ||
+ | if (!d) { handlefailure; } | ||
− | + | // however this math complicates it. | |
+ | map_data_loc = peekd(d + 0x18); | ||
+ | map_x_count_loc = peekd(d + 0x1E); | ||
+ | map_y_count_loc = peekd(d + 0x24); | ||
+ | map_z_count_loc = peekd(d + 0x2A); | ||
− | + | if (map_x_count_loc + 4 != map_y_count_loc || map_y_count_loc + 4 != map_z_count_loc) { handlefailure; } | |
− | + | printf("map: %08X %08X %08X %08X", map_data_loc, map_x_count_loc, map_y_count_loc, map_z_count_loc); </pre> | |
− | + | == Race Voodoo == | |
+ | To find the variable holding the index of the dwarven race, | ||
− | + | <pre> | |
+ | // find dwarven race variable. shows use of some of the simpler meta tokens. | ||
− | + | d = search(5+4, | |
+ | // movsx reg1, word ptr dorf_race_id | ||
+ | 0x0F, 0xBF, ANYBYTE, HERE, ADDRESS, | ||
+ | // cmp [reg2+8Ch], reg1 | ||
+ | 0x39, ANYBYTE, DWORD_, 0x0000008C | ||
+ | ); | ||
− | + | if (!d) { handlefailure; } | |
− | + | dwarven_race_index_loc = peekd(d); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | printf("dwarven_race_index at %08X", dwarven_race_index_loc);</pre> | |
− | + | Note: the variable is 16-bit: int16_t or uint16_t. | |
− | + | ||
− | + | == Main Creature Vector Voodoo == | |
− | + | ||
− | + | To find the main creature vector, | |
− | + | ||
− | + | <pre> | |
− | + | // find main (complete) creature vector. | |
− | + | // this one feels a bit fragile. | |
− | + | // note use of EOL instead of a true count. | |
− | + | d = search(1000, | |
− | + | 0x8B, RANGE_LO,0x80, RANGE_HI,0xBF, DWORD_, 0x000004C8, | |
− | + | 0x8D, RANGE_LO,0x00, RANGE_HI,0x3F, RANGE_LO,0x80, RANGE_HI,0xBF, | |
− | + | 0x8B, RANGE_LO,0x00, RANGE_HI,0x3F, HERE, ADDRESS, | |
− | + | 0x85, ANYBYTE, | |
− | + | EOL | |
− | + | ); | |
+ | |||
+ | if (!d) { handlefailure; } | ||
+ | main_creature_vector_loc = peekd(d) - 4; | ||
+ | |||
+ | // another way, also a bit fragile | ||
+ | d = search(1000, | ||
+ | 0x8B, RANGE_LO,0x80, RANGE_HI,0xBF, DWORD_, 0x228, | ||
+ | 0x3B, RANGE_LO,0xC0, RANGE_HI,0xFF, | ||
+ | JZ, | ||
+ | 0xB8, HERE, ADDRESS, | ||
+ | CALL, | ||
+ | 0x8B, RANGE_LO,0xC0, RANGE_HI,0xFF, | ||
+ | 0x85, RANGE_LO,0xC0, RANGE_HI,0xFF, | ||
+ | EOL | ||
+ | ); | ||
+ | if (!d) { handlefailure; } | ||
+ | main_creature_vector_ptr_loc = peekd(d); | ||
+ | </pre> | ||
+ | So if one doesn't work, try the other. | ||
+ | |||
+ | == Another Creature Vector Voodoo == | ||
+ | <pre>// find "another" creature vector | ||
+ | d = search(1000, | ||
+ | 0xF7, RANGE_LO,0x80, RANGE_HI,0xBF, | ||
+ | DWORD_, 0xE4, DWORD_, 0x02000000, | ||
+ | 0x0F, 0x85, ANYBYTE, EITHER,0,1, 0, 0, | ||
+ | RANGE_LO, 0xB8, RANGE_HI, 0xBF, HERE, ADDRESS, | ||
+ | CALL, | ||
+ | EOL | ||
+ | ); | ||
+ | if (!d) { handlefailure; } | ||
+ | another_creature_vector_loc = peekd(d);</pre> | ||
+ | |||
+ | == Initial 7 Dwarves Voodoo == | ||
+ | |||
+ | To find the the number of dwarves you start with, first find dwarven_race_index_loc, then | ||
+ | |||
+ | <pre>// this search does not work in .32a because the 7 was relocated far | ||
+ | // away from this region due to excessive optimization. | ||
+ | d = search(1000, | ||
+ | 0x4F, 0, 0, 0, | ||
+ | CALL, | ||
+ | SKIP_UP_TO, 8, | ||
+ | HERE, DWORD_, 7, | ||
+ | SKIP_UP_TO, 8, | ||
+ | CALL, | ||
+ | 0x0F, 0xB7, ANYBYTE, DWORD_, dwarven_race_index_loc, | ||
+ | EOL | ||
+ | ); | ||
+ | |||
+ | if (!d) { handlefailure; } | ||
+ | |||
+ | number_of_dwarves_loc = d; | ||
+ | |||
+ | printf("initial number of dwarves = %d", peekd(number_of_dwarves_loc));</pre> | ||
+ | |||
+ | == Initial Points Voodoo == | ||
+ | |||
+ | To find the number of points you are allocated when starting, | ||
+ | |||
+ | <pre>d = search(10, 0x66, 0xC7, 0x83, ANYBYTE, ANYBYTE, 0, 0, HERE, 0xC8, 0); | ||
+ | |||
+ | if (!d) { handlefailure; } | ||
+ | |||
+ | initial_starting_points_loc = d; | ||
+ | |||
+ | printf("intial starting points = %d", peekw(initial_starting_points_loc)); | ||
+ | </pre> | ||
+ | |||
+ | Note that it is a int16_t variable. | ||
+ | |||
+ | == Current Unit Focus Voodoo == | ||
+ | |||
+ | To find the location of the current_unit_focus variable, try both of these patterns. | ||
+ | |||
+ | <pre> | ||
+ | // method 1, may be fragile | ||
+ | d = search(5+5, 0x66, 0x83, ANYBYTE, ADDRESS, 0x16, | ||
+ | 0x89, ANYBYTE, HERE, ADDRESS, 0x75); | ||
+ | |||
+ | if (!d) { handlefailure; } | ||
+ | |||
+ | current_unit_focus_loc = peekd(d); | ||
+ | current_unit_focus = peekd(current_unit_focus_loc); | ||
+ | |||
+ | // method 2, may also be fragile | ||
+ | d = search(4+2+4+4, 0x3B, ANYBYTE, HERE, ADDRESS, | ||
+ | 0x75, ANYBYTE, | ||
+ | 0x8B, ANYBYTE, 0x24, 0x18, | ||
+ | 0x8B, ANYBYTE, DWORD_, 0x814); | ||
+ | |||
+ | if (!d) { handlefailure; } | ||
+ | |||
+ | current_unit_focus_loc = peekd(d); | ||
+ | current_unit_focus = peekd(current_unit_focus_loc);</pre> | ||
+ | I expect that at least one of them will work. |