Convert colonies plugin to script, add place feature
parent
9a81fb1add
commit
e519313b70
@ -1,153 +0,0 @@
|
|||||||
#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;
|
|
||||||
|
|
||||||
command_result colonies (color_ostream &out, vector <string> & parameters);
|
|
||||||
|
|
||||||
DFHACK_PLUGIN("colonies");
|
|
||||||
REQUIRE_GLOBAL(world); // used by Materials
|
|
||||||
|
|
||||||
DFhackCExport command_result plugin_init ( color_ostream &out, std::vector <PluginCommand> &commands)
|
|
||||||
{
|
|
||||||
commands.push_back(PluginCommand(
|
|
||||||
"colonies", "List or change wild colonies (ants hills and such)",
|
|
||||||
colonies, false,
|
|
||||||
" Without any options, this command lists all the vermin colonies present.\n"
|
|
||||||
"Options:\n"
|
|
||||||
//" kill - destroy colonies\n" // unlisted because it's likely broken anyway
|
|
||||||
" bees - turn colonies into honey bee hives\n"
|
|
||||||
));
|
|
||||||
return CR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
DFhackCExport command_result plugin_shutdown ( color_ostream &out )
|
|
||||||
{
|
|
||||||
return CR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void destroyColonies();
|
|
||||||
void convertColonies(Materials *Materials);
|
|
||||||
void showColonies(color_ostream &out, Materials *Materials);
|
|
||||||
|
|
||||||
command_result colonies (color_ostream &out, vector <string> & parameters)
|
|
||||||
{
|
|
||||||
bool destroy = false;
|
|
||||||
bool convert = false;
|
|
||||||
|
|
||||||
for(size_t i = 0; i < parameters.size();i++)
|
|
||||||
{
|
|
||||||
if(parameters[i] == "kill")
|
|
||||||
destroy = true;
|
|
||||||
else if(parameters[i] == "bees")
|
|
||||||
convert = true;
|
|
||||||
else
|
|
||||||
return CR_WRONG_USAGE;
|
|
||||||
}
|
|
||||||
if (destroy && convert)
|
|
||||||
{
|
|
||||||
out.printerr("Kill or make bees? DECIDE!\n");
|
|
||||||
return CR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
CoreSuspender suspend;
|
|
||||||
|
|
||||||
Materials * materials = Core::getInstance().getMaterials();
|
|
||||||
|
|
||||||
materials->ReadCreatureTypesEx();
|
|
||||||
|
|
||||||
if (destroy)
|
|
||||||
destroyColonies();
|
|
||||||
else if (convert)
|
|
||||||
convertColonies(materials);
|
|
||||||
else
|
|
||||||
showColonies(out, 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(color_ostream &out, 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;
|
|
||||||
|
|
||||||
out.print("Colony %u: %s at %d:%d:%d\n", i,
|
|
||||||
race.c_str(), sp.x, sp.y, sp.z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numColonies == 0)
|
|
||||||
out << "No colonies present." << std::endl;
|
|
||||||
}
|
|
@ -0,0 +1,82 @@
|
|||||||
|
-- List, create, or change wild colonies (eg honey bees)
|
||||||
|
-- By PeridexisErrant and Warmist
|
||||||
|
|
||||||
|
local help = [[=begin
|
||||||
|
|
||||||
|
colonies
|
||||||
|
========
|
||||||
|
List vermin colonies, place honey bees, or convert all vermin
|
||||||
|
to honey bees. Usage:
|
||||||
|
|
||||||
|
:colonies: List all vermin colonies on the map.
|
||||||
|
:colonies place: Place a honey bee colony under the cursor.
|
||||||
|
:colonies convert: Convert all existing colonies to honey bees.
|
||||||
|
|
||||||
|
The ``place`` and ``convert`` subcommands by default create or
|
||||||
|
convert to honey bees, as this is the most commonly useful.
|
||||||
|
However both accept an optional flag to use a different vermin
|
||||||
|
type, for example ``colonies place ANT`` creates an ant colony
|
||||||
|
and ``colonies convert TERMITE`` ends your beekeeping industry.
|
||||||
|
|
||||||
|
=end]]
|
||||||
|
|
||||||
|
function findVermin(target_verm)
|
||||||
|
for k,v in pairs(df.global.world.raws.creatures.all) do
|
||||||
|
if v.creature_id == target_verm then
|
||||||
|
return k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
qerror("No vermin found with name: "..target_verm)
|
||||||
|
end
|
||||||
|
|
||||||
|
function list_colonies()
|
||||||
|
for idx, col in pairs(df.global.world.vermin.colonies) do
|
||||||
|
race = df.global.world.raws.creatures.all[col.race].creature_id
|
||||||
|
print(race..' at '..col.pos.x..', '..col.pos.y..', '..col.pos.z)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function convert_vermin_to(target_verm)
|
||||||
|
local vermin_id = findVermin(target_verm)
|
||||||
|
local changed = 0
|
||||||
|
for _, verm in pairs(df.global.world.vermin.colonies) do
|
||||||
|
verm.race = vermin_id
|
||||||
|
verm.caste = -1 -- check for queen bee?
|
||||||
|
verm.amount = 18826
|
||||||
|
verm.visible = true
|
||||||
|
changed = changed + 1
|
||||||
|
end
|
||||||
|
print('Converted '..changed..' colonies to '..target_verm)
|
||||||
|
end
|
||||||
|
|
||||||
|
function place_vermin(target_verm)
|
||||||
|
local pos = copyall(df.global.cursor)
|
||||||
|
if pos.x == -30000 then
|
||||||
|
qerror("Cursor must be pointing somewhere")
|
||||||
|
end
|
||||||
|
local verm = df.vermin:new()
|
||||||
|
verm.race = findVermin(target_verm)
|
||||||
|
verm.flags.is_colony = true
|
||||||
|
verm.caste = -1 -- check for queen bee?
|
||||||
|
verm.amount = 18826
|
||||||
|
verm.visible = true
|
||||||
|
verm.pos:assign(pos)
|
||||||
|
df.global.world.vermin.colonies:insert("#", verm)
|
||||||
|
df.global.world.vermin.all:insert("#", verm)
|
||||||
|
end
|
||||||
|
|
||||||
|
local args = {...}
|
||||||
|
local target_verm = args[2] or "HONEY_BEE"
|
||||||
|
|
||||||
|
if args[1] == 'help' or args[1] == '?' then
|
||||||
|
print(help)
|
||||||
|
elseif args[1] == 'convert' then
|
||||||
|
convert_vermin_to(target_verm)
|
||||||
|
elseif args[1] == 'place' then
|
||||||
|
place_vermin(target_verm)
|
||||||
|
else
|
||||||
|
if #df.global.world.vermin.colonies < 1 then
|
||||||
|
dfhack.printerr('There are no colonies on the map.')
|
||||||
|
end
|
||||||
|
list_colonies()
|
||||||
|
end
|
Loading…
Reference in New Issue