dfhack/plugins/devel/rawdump.cpp

140 lines
4.0 KiB
C++

#include <dfhack/Core.h>
#include <dfhack/Console.h>
#include <dfhack/Export.h>
#include <dfhack/PluginManager.h>
#include <vector>
#include <string>
#include <dfhack/modules/Materials.h>
#include <stdlib.h>
using std::vector;
using std::string;
using namespace DFHack;
//FIXME: possible race conditions with calling kittens from the IO thread and shutdown from Core.
bool shutdown_flag = false;
bool final_flag = true;
bool timering = false;
uint64_t timeLast = 0;
DFhackCExport command_result rawdump_i (Core * c, vector <string> & parameters);
DFhackCExport command_result rawdump_p (Core * c, vector <string> & parameters);
DFhackCExport const char * plugin_name ( void )
{
return "rawdump";
}
DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
{
commands.clear();
commands.push_back(PluginCommand("dump_inorganic","Dump inorganic raws.",rawdump_i));
commands.push_back(PluginCommand("dump_plants","Dump plant raws.",rawdump_p));
return CR_OK;
}
DFhackCExport command_result plugin_shutdown ( Core * c )
{
return CR_OK;
}
DFhackCExport command_result rawdump_i (Core * c, vector <string> & parameters)
{
int index = -1;
Console & con = c->con;
if(parameters.size())
{
index = atoi(parameters[0].c_str());
}
c->Suspend();
Materials * mats = c->getMaterials();
if(!mats->df_inorganic)
{
con.printerr("No inorganic materials :(\n");
return CR_FAILURE;
}
if(index >= 0)
{
if( index < mats->df_inorganic->size())
{
df_inorganic_material * mat = mats->df_inorganic->at(index);
// dump single material
con.print("%-3d : [%s] %s\n",
index,
mat->Inorganic_ID.c_str(),
mat->STATE_NAME_SOLID.c_str());
con.print("MAX EDGE: %d\n",mat->MAX_EDGE);
}
else
{
con.printerr("Index out of range: %d of %d\n",index, mats->df_inorganic->size());
}
}
else
{
// dump all materials
for(int i = 0; i < mats->df_inorganic->size();i++)
{
con.print("%-3d : %s\n",i,mats->df_inorganic->at(i)->Inorganic_ID.c_str());
}
}
c->Resume();
return CR_OK;
}
DFhackCExport command_result rawdump_p (Core * c, vector <string> & parameters)
{
int index = -1;
Console & con = c->con;
if(parameters.size())
{
index = atoi(parameters[0].c_str());
}
c->Suspend();
Materials * mats = c->getMaterials();
if(!mats->df_plants)
{
con.printerr("No inorganic materials :(\n");
return CR_FAILURE;
}
if(index >= 0)
{
if( index < mats->df_plants->size())
{
df_plant_type * mat = mats->df_plants->at(index);
// dump single material
con.print("%-3d : [%s] %s %s %s\n",
index,
mat->ID.c_str(),
mat->material_str_leaves[0].c_str(),
mat->material_str_leaves[1].c_str(),
mat->material_str_leaves[2].c_str()
);
con.print("DEPTH: %d-%d\n",mat->underground_depth[0], mat->underground_depth[1]);
}
else
{
con.printerr("Index out of range: %d of %d\n",index, mats->df_plants->size());
}
}
else
{
// dump all materials
for(int i = 0; i < mats->df_plants->size();i++)
{
df_plant_type * mat = mats->df_plants->at(i);
// dump single material
con.print("%-3d : [%s] %s %s %s\n",
i,
mat->ID.c_str(),
mat->material_str_leaves[0].c_str(),
mat->material_str_leaves[1].c_str(),
mat->material_str_leaves[2].c_str()
);
con.print("DEPTH: %d-%d\n",mat->underground_depth[0], mat->underground_depth[1]);
}
}
c->Resume();
return CR_OK;
}