164 lines
3.7 KiB
C++
164 lines
3.7 KiB
C++
#include "Core.h"
|
|
#include "Console.h"
|
|
#include "Export.h"
|
|
#include "PluginManager.h"
|
|
#include <vector>
|
|
#include <string>
|
|
#include "modules/Vermin.h"
|
|
#include "modules/Materials.h"
|
|
|
|
using std::vector;
|
|
using std::string;
|
|
using namespace DFHack;
|
|
using namespace DFHack::Simple;
|
|
|
|
DFhackCExport command_result colonies (Core * c, vector <string> & parameters);
|
|
|
|
DFhackCExport const char * plugin_name ( void )
|
|
{
|
|
return "colonies";
|
|
}
|
|
|
|
DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
|
|
{
|
|
commands.clear();
|
|
commands.push_back(PluginCommand("colonies",
|
|
"List or change wild colonies (ants hills and such)",
|
|
colonies));
|
|
return CR_OK;
|
|
}
|
|
|
|
DFhackCExport command_result plugin_shutdown ( Core * c )
|
|
{
|
|
return CR_OK;
|
|
}
|
|
|
|
void destroyColonies();
|
|
void convertColonies(Materials *Materials);
|
|
void showColonies(Core *c, Materials *Materials);
|
|
|
|
DFhackCExport command_result colonies (Core * c, vector <string> & parameters)
|
|
{
|
|
bool destroy = false;
|
|
bool convert = false;
|
|
bool help = false;
|
|
|
|
for(int i = 0; i < parameters.size();i++)
|
|
{
|
|
if(parameters[i] == "kill")
|
|
destroy = true;
|
|
else if(parameters[i] == "bees")
|
|
convert = true;
|
|
else if(parameters[i] == "help" || parameters[i] == "?")
|
|
{
|
|
help = true;
|
|
}
|
|
}
|
|
if(help)
|
|
{
|
|
c->con.print("Without any options, this command lists all the vermin colonies present.\n"
|
|
"Options:\n"
|
|
"kill - destroy colonies\n"
|
|
"bees - turn colonies into honey bees\n"
|
|
);
|
|
return CR_OK;
|
|
}
|
|
if (destroy && convert)
|
|
{
|
|
c->con.printerr("Kill or make bees? DECIDE!\n");
|
|
return CR_FAILURE;
|
|
}
|
|
CoreSuspender suspend(c);
|
|
|
|
Materials * materials = c->getMaterials();
|
|
|
|
materials->ReadCreatureTypesEx();
|
|
|
|
if (destroy)
|
|
destroyColonies();
|
|
else if (convert)
|
|
convertColonies(materials);
|
|
else
|
|
showColonies(c, materials);
|
|
|
|
materials->Finish();
|
|
|
|
return CR_OK;
|
|
}
|
|
|
|
//FIXME: this is probably bullshit
|
|
void destroyColonies()
|
|
{
|
|
uint32_t numSpawnPoints = Vermin::getNumVermin();
|
|
for (uint32_t i = 0; i < numSpawnPoints; i++)
|
|
{
|
|
Vermin::t_vermin sp;
|
|
Vermin::Read(i, sp);
|
|
|
|
if (sp.visible && sp.is_colony)
|
|
{
|
|
sp.visible = false;
|
|
Vermin::Write(i, sp);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Convert all colonies to honey bees.
|
|
void convertColonies(Materials *Materials)
|
|
{
|
|
int bee_idx = -1;
|
|
for (size_t i = 0; i < Materials->raceEx.size(); i++)
|
|
{
|
|
if (Materials->raceEx[i].id == "HONEY_BEE")
|
|
{
|
|
bee_idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bee_idx == -1)
|
|
{
|
|
std::cerr << "Honey bees not present in game." << std::endl;
|
|
return;
|
|
}
|
|
|
|
uint32_t numSpawnPoints = Vermin::getNumVermin();
|
|
for (uint32_t i = 0; i < numSpawnPoints; i++)
|
|
{
|
|
Vermin::t_vermin sp;
|
|
Vermin::Read(i, sp);
|
|
|
|
if (sp.visible && sp.is_colony)
|
|
{
|
|
sp.race = bee_idx;
|
|
Vermin::Write(i, sp);
|
|
}
|
|
}
|
|
}
|
|
|
|
void showColonies(Core *c, Materials *Materials)
|
|
{
|
|
uint32_t numSpawnPoints = Vermin::getNumVermin();
|
|
int numColonies = 0;
|
|
for (uint32_t i = 0; i < numSpawnPoints; i++)
|
|
{
|
|
Vermin::t_vermin sp;
|
|
|
|
Vermin::Read(i, sp);
|
|
|
|
if (sp.visible && sp.is_colony)
|
|
{
|
|
numColonies++;
|
|
string race="(no race)";
|
|
if(sp.race != -1)
|
|
race = Materials->raceEx[sp.race].id;
|
|
|
|
c->con.print("Colony %u: %s at %d:%d:%d\n", i,
|
|
race.c_str(), sp.x, sp.y, sp.z);
|
|
}
|
|
}
|
|
|
|
if (numColonies == 0)
|
|
c->con << "No colonies present." << std::endl;
|
|
}
|