|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
// Creature dump
|
|
|
|
|
// Building dump
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <iomanip>
|
|
|
|
@ -11,59 +11,10 @@
|
|
|
|
|
#define DFHACK_WANT_MISCUTILS
|
|
|
|
|
#include <DFHack.h>
|
|
|
|
|
|
|
|
|
|
int main (int argc,const char* argv[])
|
|
|
|
|
void doWordPerLine(DFHack::Context *DF, DFHack::VersionInfo * mem,
|
|
|
|
|
DFHack::Buildings * Bld, uint32_t numBuildings,
|
|
|
|
|
const char* type, int lines)
|
|
|
|
|
{
|
|
|
|
|
int lines = 16;
|
|
|
|
|
int mode = 0;
|
|
|
|
|
if (argc < 2 || argc > 3)
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
cout << "usage:" << endl;
|
|
|
|
|
cout << argv[0] << " object_name [number of lines]" << endl;
|
|
|
|
|
#ifndef LINUX_BUILD
|
|
|
|
|
cout << "Done. Press any key to continue" << endl;
|
|
|
|
|
cin.ignore();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
else if(argc == 3)
|
|
|
|
|
{
|
|
|
|
|
std::string s = argv[2]; //blah. I don't care
|
|
|
|
|
std::istringstream ins; // Declare an input string stream.
|
|
|
|
|
ins.str(s); // Specify string to read.
|
|
|
|
|
ins >> lines; // Reads the integers from the string.
|
|
|
|
|
mode = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::map <uint32_t, std::string> custom_workshop_types;
|
|
|
|
|
|
|
|
|
|
DFHack::ContextManager DFMgr ("Memory.xml");
|
|
|
|
|
DFHack::Context *DF;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << e.what() << std::endl;
|
|
|
|
|
#ifndef LINUX_BUILD
|
|
|
|
|
cin.ignore();
|
|
|
|
|
#endif
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DFHack::VersionInfo * mem = DF->getMemoryInfo();
|
|
|
|
|
DFHack::Buildings * Bld = DF->getBuildings();
|
|
|
|
|
DFHack::Gui * Gui = DF->getGui();
|
|
|
|
|
|
|
|
|
|
uint32_t numBuildings;
|
|
|
|
|
if(Bld->Start(numBuildings))
|
|
|
|
|
{
|
|
|
|
|
Bld->ReadCustomWorkshopTypes(custom_workshop_types);
|
|
|
|
|
if(mode)
|
|
|
|
|
{
|
|
|
|
|
std::cout << numBuildings << std::endl;
|
|
|
|
|
std::vector < uint32_t > addresses;
|
|
|
|
|
for(uint32_t i = 0; i < numBuildings; i++)
|
|
|
|
@ -75,27 +26,34 @@ int main (int argc,const char* argv[])
|
|
|
|
|
std::string typestr;
|
|
|
|
|
mem->resolveClassIDToClassname(temp.type, typestr);
|
|
|
|
|
std::cout << typestr << std::endl;
|
|
|
|
|
if(typestr == argv[1])
|
|
|
|
|
{
|
|
|
|
|
//cout << buildingtypes[temp.type] << " 0x" << hex << temp.origin << endl;
|
|
|
|
|
//hexdump(DF, temp.origin, 256);
|
|
|
|
|
if(typestr == type)
|
|
|
|
|
addresses.push_back(temp.origin);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// couldn't translate type, print out the vtable
|
|
|
|
|
std::cout << "unknown vtable: " << temp.vtable << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
interleave_hex(DF,addresses,lines / 4);
|
|
|
|
|
}
|
|
|
|
|
else // mode
|
|
|
|
|
{
|
|
|
|
|
int32_t x,y,z;
|
|
|
|
|
Gui->getCursorCoords(x,y,z);
|
|
|
|
|
if(x != -30000)
|
|
|
|
|
|
|
|
|
|
if (addresses.empty())
|
|
|
|
|
{
|
|
|
|
|
std::cout << "No buildings matching '" << type << "'" << endl;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interleave_hex(DF,addresses,lines / 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void doUnderCursor(DFHack::Context *DF, DFHack::VersionInfo * mem,
|
|
|
|
|
DFHack::Buildings * Bld, uint32_t numBuildings,
|
|
|
|
|
int32_t x, int32_t y, int32_t z)
|
|
|
|
|
{
|
|
|
|
|
std::map <uint32_t, std::string> custom_workshop_types;
|
|
|
|
|
Bld->ReadCustomWorkshopTypes(custom_workshop_types);
|
|
|
|
|
|
|
|
|
|
uint32_t num_under_cursor = 0;
|
|
|
|
|
|
|
|
|
|
for(uint32_t i = 0; i < numBuildings; i++)
|
|
|
|
|
{
|
|
|
|
|
DFHack::t_building temp;
|
|
|
|
@ -107,43 +65,115 @@ int main (int argc,const char* argv[])
|
|
|
|
|
&& (uint32_t)z == temp.z
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
num_under_cursor++;
|
|
|
|
|
std::string typestr;
|
|
|
|
|
mem->resolveClassIDToClassname(temp.type, typestr);
|
|
|
|
|
printf("Address 0x%x, type %d (%s), %d/%d/%d\n",temp.origin, temp.type, typestr.c_str(), temp.x1,temp.y1,temp.z);
|
|
|
|
|
printf("Material %d %d\n", temp.material.type, temp.material.index);
|
|
|
|
|
printf("Address 0x%x, type %d (%s), %d/%d/%d\n", temp.origin,
|
|
|
|
|
temp.type, typestr.c_str(), temp.x1, temp.y1, temp.z);
|
|
|
|
|
printf("Material %d %d\n", temp.material.type,
|
|
|
|
|
temp.material.index);
|
|
|
|
|
int32_t custom;
|
|
|
|
|
if((custom = Bld->GetCustomWorkshopType(temp)) != -1)
|
|
|
|
|
{
|
|
|
|
|
printf("Custom workshop type %s (%d)\n",custom_workshop_types[custom].c_str(),custom);
|
|
|
|
|
printf("Custom workshop type %s (%d)\n",
|
|
|
|
|
custom_workshop_types[custom].c_str(), custom);
|
|
|
|
|
}
|
|
|
|
|
hexdump(DF,temp.origin,120*16);
|
|
|
|
|
hexdump(DF, temp.origin, 34*16);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::cout << numBuildings << std::endl;
|
|
|
|
|
|
|
|
|
|
if (num_under_cursor == 0)
|
|
|
|
|
std::cout << "No buildings present under cursor." << endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void doListAll(DFHack::VersionInfo * mem, DFHack::Buildings * Bld,
|
|
|
|
|
uint32_t numBuildings)
|
|
|
|
|
{
|
|
|
|
|
std::cout << "Num buildings present: " << numBuildings << std::endl;
|
|
|
|
|
for(uint32_t i = 0; i < numBuildings; i++)
|
|
|
|
|
{
|
|
|
|
|
DFHack::t_building temp;
|
|
|
|
|
Bld->Read(i, temp);
|
|
|
|
|
std::string typestr;
|
|
|
|
|
mem->resolveClassIDToClassname(temp.type, typestr);
|
|
|
|
|
printf("Address 0x%x, type %d (%s), %d/%d/%d\n",temp.origin, temp.type, typestr.c_str(), temp.x1,temp.y1,temp.z);
|
|
|
|
|
printf("Address 0x%x, type %d (%s), Coord %d/%d/%d\n", temp.origin,
|
|
|
|
|
temp.type, typestr.c_str(), temp.x1,temp.y1,temp.z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void doFinish(DFHack::Context *DF)
|
|
|
|
|
{
|
|
|
|
|
DF->Detach();
|
|
|
|
|
#ifndef LINUX_BUILD
|
|
|
|
|
std::cout << "Done. Press any key to continue" << std::endl;
|
|
|
|
|
cin.ignore();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main (int argc,const char* argv[])
|
|
|
|
|
{
|
|
|
|
|
int lines = 16;
|
|
|
|
|
bool word_per_line = false;
|
|
|
|
|
if (argc == 3)
|
|
|
|
|
{
|
|
|
|
|
std::string num = argv[2]; //blah. I don't care
|
|
|
|
|
std::istringstream ins; // Declare an input string stream.
|
|
|
|
|
ins.str(num); // Specify string to read.
|
|
|
|
|
ins >> lines; // Reads the integers from the string.
|
|
|
|
|
word_per_line = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DFHack::ContextManager DFMgr ("Memory.xml");
|
|
|
|
|
DFHack::Context *DF;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
}
|
|
|
|
|
Bld->Finish();
|
|
|
|
|
catch (std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << e.what() << std::endl;
|
|
|
|
|
#ifndef LINUX_BUILD
|
|
|
|
|
cin.ignore();
|
|
|
|
|
#endif
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
DFHack::VersionInfo * mem = DF->getMemoryInfo();
|
|
|
|
|
DFHack::Buildings * Bld = DF->getBuildings();
|
|
|
|
|
DFHack::Gui * Gui = DF->getGui();
|
|
|
|
|
|
|
|
|
|
uint32_t numBuildings;
|
|
|
|
|
if(!Bld->Start(numBuildings))
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "buildings not supported for this DF version" << std::endl;
|
|
|
|
|
doFinish(DF);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DF->Detach();
|
|
|
|
|
#ifndef LINUX_BUILD
|
|
|
|
|
std::cout << "Done. Press any key to continue" << std::endl;
|
|
|
|
|
cin.ignore();
|
|
|
|
|
#endif
|
|
|
|
|
if (numBuildings == 0)
|
|
|
|
|
{
|
|
|
|
|
cout << "No buildings on site." << endl;
|
|
|
|
|
doFinish(DF);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (word_per_line)
|
|
|
|
|
doWordPerLine(DF, mem, Bld, numBuildings, argv[1], lines);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int32_t x,y,z;
|
|
|
|
|
Gui->getCursorCoords(x,y,z);
|
|
|
|
|
|
|
|
|
|
if(x != -30000)
|
|
|
|
|
doUnderCursor(DF, mem, Bld, numBuildings, x, y, z);
|
|
|
|
|
else
|
|
|
|
|
doListAll(mem, Bld, numBuildings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Bld->Finish();
|
|
|
|
|
|
|
|
|
|
doFinish(DF);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|