// Just show some position data #include #include #include #include #include #include #include using namespace std; #define DFHACK_WANT_MISCUTILS #include using namespace DFHack; //FIXME: A pile of magic numbers. looks like decompiled number typedef uint32_t _DWORD; int get_material_vector(uint32_t vein_8, uint16_t vein_4, int WORLD_) { int result; // eax@2 int v4; // ecx@11 int v5; // eax@12 if ( (uint16_t)(vein_4 - 0x1A3) > 0xC7u ) { if ( ((int16_t)vein_4 < 19 || (int16_t)vein_4 > 0xDAu) && (uint16_t)(vein_4 - 219) > 0xC7u ) { if ( vein_4 ) { if ( vein_4 > 0x292u ) result = 0; else result = *(_DWORD *)(WORLD_ + 4 * (int16_t)vein_4 + 0x5DF44); } else { if ( (signed int)vein_8 >= 0 && (v4 = *(_DWORD *)(WORLD_ + 0x54B88), vein_8 < (*(_DWORD *)(WORLD_ + 0x54B8C) - v4) >> 2) && (v5 = *(_DWORD *)(v4 + 4 * vein_8)) != 0 ) result = v5 + 0x178; else result = *(_DWORD *)(WORLD_ + 0x5DF44); } } else { /* result = sub_4D47A0(vein_8, vein_4, WORLD_ + 0x54C84); if ( !result ) result = *(_DWORD *)(WORLD_ + 0x5DF90); */ } } else { /* result = sub_41F430(WORLD_ + 0x54B94, vein_4); if ( !result ) result = *(_DWORD *)(WORLD_ + 0x5E5D0); */ } return result; } char shades[10] = {'#','$','O','=','+','|','-','^','.',' '}; void printSpatter(DFHack::Context * DF, t_spattervein & spatter) { DFHack::Materials *Mats = DF->getMaterials(); printf("Splatter\nmat1: %d\nunknown: %d\nmat2: %d\n",spatter.mat1,spatter.unk1,spatter.mat2); printf ("Material : %d - ", spatter.matter_state); // FIXME: stupid switch(spatter.matter_state) { case state_gas: printf("Gas "); break; case state_solid: printf("Solid "); break; case state_liquid: printf("Liquid "); break; case state_paste: printf("Paste "); break; case state_powder: printf("Powder "); break; case state_pressed: printf("Pressed "); break; default: printf("Unknown state "); } cout << PrintSplatterType(spatter.mat1,spatter.mat2,Mats->race) << endl; printf("Address 0x%08x\n",spatter.address_of); for(uint32_t yyy = 0; yyy < 16; yyy++) { cout << "|"; for(uint32_t xxx = 0; xxx < 16; xxx++) { uint8_t intensity = spatter.intensity[xxx][yyy]; cout << shades[9 - (intensity / 28)]; } cout << "|" << endl; } hexdump(DF, spatter.address_of,20*16); } int main (int numargs, const char ** args) { uint32_t x_max,y_max,z_max; vector veinVector; vector IceVeinVector; vector splatter; DFHack::ContextManager DFMgr("Memory.xml"); DFHack::Context * DF; try { DF = DFMgr.getSingleContext(); DF->Attach(); } catch (exception& e) { cerr << e.what() << endl; #ifndef LINUX_BUILD cin.ignore(); #endif return 1; } DFHack::Maps *Maps =DF->getMaps(); DFHack::Gui *Gui =DF->getGui(); DFHack::Materials *Mats =DF->getMaterials(); Mats->ReadCreatureTypes(); // init the map if(!Maps->Start()) { cerr << "Can't init map." << endl; #ifndef LINUX_BUILD cin.ignore(); #endif return 1; } int32_t cx, cy, cz; Maps->getSize(x_max,y_max,z_max); Gui->getCursorCoords(cx,cy,cz); if(cx == -30000) { // walk the map for(uint32_t x = 0; x< x_max;x++) for(uint32_t y = 0; y< y_max;y++) for(uint32_t z = 0; z< z_max;z++) { if(Maps->isValidBlock(x,y,z)) { // look for splater veins Maps->ReadVeins(x,y,z,0,0,&splatter); if(splatter.size()) { printf("Block %d/%d/%d\n",x,y,z); for(uint32_t i = 0; i < splatter.size(); i++) { cout << i << ":" << endl; printSpatter(DF,splatter[i]); } } } } } else { uint32_t bx,by,bz; bx = cx / 16; by = cy / 16; bz = cz; // look for splater veins Maps->ReadVeins(bx,by,bz,0,0,&splatter); if(splatter.size()) { printf("Block %d/%d/%d\n",bx,by,bz); for(uint32_t i = 0; i < splatter.size(); i++) { printSpatter(DF,splatter[i]); cout << endl; } } } #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl; cin.ignore(); #endif return 0; }