|
|
@ -6,20 +6,36 @@
|
|
|
|
#include <Export.h>
|
|
|
|
#include <Export.h>
|
|
|
|
#include <PluginManager.h>
|
|
|
|
#include <PluginManager.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <Map>
|
|
|
|
|
|
|
|
|
|
|
|
// DF data structure definition headers
|
|
|
|
// DF data structure definition headers
|
|
|
|
#include "DataDefs.h"
|
|
|
|
#include "DataDefs.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "modules/Items.h"
|
|
|
|
#include "modules/Maps.h"
|
|
|
|
#include "modules/Maps.h"
|
|
|
|
#include "modules/Units.h"
|
|
|
|
#include "modules/Units.h"
|
|
|
|
#include "modules/World.h"
|
|
|
|
#include "modules/World.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "df/manager_order.h"
|
|
|
|
#include "df/manager_order.h"
|
|
|
|
|
|
|
|
#include "df/creature_raw.h"
|
|
|
|
#include "df/world.h"
|
|
|
|
#include "df/world.h"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace DFHack;
|
|
|
|
using namespace DFHack;
|
|
|
|
|
|
|
|
using namespace DFHack::Items;
|
|
|
|
using namespace DFHack::Units;
|
|
|
|
using namespace DFHack::Units;
|
|
|
|
using namespace df::enums;
|
|
|
|
using namespace df::enums;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ClothingRequirement
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
df::job_type job_type;
|
|
|
|
|
|
|
|
df::item_type item_type;
|
|
|
|
|
|
|
|
int16_t item_subtype;
|
|
|
|
|
|
|
|
int16_t needed_per_citizen;
|
|
|
|
|
|
|
|
std::map<int32_t, int32_t> total_needed_per_size;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<ClothingRequirement>clothingOrders;
|
|
|
|
|
|
|
|
|
|
|
|
// A plugin must be able to return its name and version.
|
|
|
|
// A plugin must be able to return its name and version.
|
|
|
|
// The name string provided must correspond to the filename -
|
|
|
|
// The name string provided must correspond to the filename -
|
|
|
|
// skeleton.plug.so, skeleton.plug.dylib, or skeleton.plug.dll in this case
|
|
|
|
// skeleton.plug.so, skeleton.plug.dylib, or skeleton.plug.dll in this case
|
|
|
@ -132,14 +148,33 @@ command_result autoclothing(color_ostream &out, std::vector <std::string> & para
|
|
|
|
|
|
|
|
|
|
|
|
static void do_autoclothing()
|
|
|
|
static void do_autoclothing()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if (clothingOrders.size() == 0)
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
for (auto&& unit : world->units.active)
|
|
|
|
for (auto&& unit : world->units.active)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!isCitizen(unit))
|
|
|
|
if (!isCitizen(unit))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
for (auto&& clothingOrder : clothingOrders)
|
|
|
|
for (auto&& ownedItem : unit->owned_items)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
int alreadyOwnedAmount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (auto&& ownedItem : unit->owned_items)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
auto item = findItemByID(ownedItem);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (item->getType() != clothingOrder.item_type)
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (item->getSubtype() != clothingOrder.item_subtype)
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alreadyOwnedAmount++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alreadyOwnedAmount -= clothingOrder.needed_per_citizen;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (alreadyOwnedAmount <= 0)
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|