remove old buildingplan files
parent
a9d9e0e50c
commit
4b7bc937a4
File diff suppressed because it is too large
Load Diff
@ -1,140 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <queue>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
#include "df/building.h"
|
|
||||||
#include "df/dfhack_material_category.h"
|
|
||||||
#include "df/item_quality.h"
|
|
||||||
#include "df/job_item.h"
|
|
||||||
|
|
||||||
#include "modules/Materials.h"
|
|
||||||
#include "modules/Persistence.h"
|
|
||||||
|
|
||||||
class ItemFilter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ItemFilter();
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
bool deserialize(std::string ser);
|
|
||||||
std::string serialize() const;
|
|
||||||
|
|
||||||
void addMaterialMask(uint32_t mask);
|
|
||||||
void clearMaterialMask();
|
|
||||||
void setMaterials(std::vector<DFHack::MaterialInfo> materials);
|
|
||||||
|
|
||||||
void incMinQuality();
|
|
||||||
void decMinQuality();
|
|
||||||
void incMaxQuality();
|
|
||||||
void decMaxQuality();
|
|
||||||
void toggleDecoratedOnly();
|
|
||||||
|
|
||||||
uint32_t getMaterialMask() const;
|
|
||||||
std::vector<std::string> getMaterials() const;
|
|
||||||
std::string getMinQuality() const;
|
|
||||||
std::string getMaxQuality() const;
|
|
||||||
bool getDecoratedOnly() const;
|
|
||||||
|
|
||||||
bool matches(df::dfhack_material_category mask) const;
|
|
||||||
bool matches(DFHack::MaterialInfo &material) const;
|
|
||||||
bool matches(df::item *item) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// remove friend declaration when we no longer need v1 deserialization
|
|
||||||
friend void migrateV1ToV2();
|
|
||||||
|
|
||||||
df::dfhack_material_category mat_mask;
|
|
||||||
std::vector<DFHack::MaterialInfo> materials;
|
|
||||||
df::item_quality min_quality;
|
|
||||||
df::item_quality max_quality;
|
|
||||||
bool decorated_only;
|
|
||||||
|
|
||||||
bool deserializeMaterialMask(std::string ser);
|
|
||||||
bool deserializeMaterials(std::string ser);
|
|
||||||
void setMinQuality(int quality);
|
|
||||||
void setMaxQuality(int quality);
|
|
||||||
bool matchesMask(DFHack::MaterialInfo &mat) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PlannedBuilding
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PlannedBuilding(df::building *building, const std::vector<ItemFilter> &filters);
|
|
||||||
PlannedBuilding(DFHack::PersistentDataItem &config);
|
|
||||||
|
|
||||||
bool isValid() const;
|
|
||||||
void remove();
|
|
||||||
|
|
||||||
df::building * getBuilding();
|
|
||||||
const std::vector<ItemFilter> & getFilters() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DFHack::PersistentDataItem config;
|
|
||||||
df::building *building;
|
|
||||||
const df::building::key_field_type building_id;
|
|
||||||
const std::vector<ItemFilter> filters;
|
|
||||||
};
|
|
||||||
|
|
||||||
// building type, subtype, custom
|
|
||||||
typedef std::tuple<df::building_type, int16_t, int32_t> BuildingTypeKey;
|
|
||||||
|
|
||||||
BuildingTypeKey toBuildingTypeKey(
|
|
||||||
df::building_type btype, int16_t subtype, int32_t custom);
|
|
||||||
BuildingTypeKey toBuildingTypeKey(df::building *bld);
|
|
||||||
BuildingTypeKey toBuildingTypeKey(df::ui_build_selector *uibs);
|
|
||||||
|
|
||||||
struct BuildingTypeKeyHash
|
|
||||||
{
|
|
||||||
std::size_t operator() (const BuildingTypeKey & key) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Planner
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
class ItemFiltersWrapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ItemFiltersWrapper(std::vector<ItemFilter> & item_filters)
|
|
||||||
: item_filters(item_filters) { }
|
|
||||||
std::vector<ItemFilter>::reverse_iterator rbegin() const { return item_filters.rbegin(); }
|
|
||||||
std::vector<ItemFilter>::reverse_iterator rend() const { return item_filters.rend(); }
|
|
||||||
const std::vector<ItemFilter> & get() const { return item_filters; }
|
|
||||||
private:
|
|
||||||
std::vector<ItemFilter> &item_filters;
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::map<std::string, bool> & getGlobalSettings() const;
|
|
||||||
bool setGlobalSetting(std::string name, bool value);
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
void addPlannedBuilding(df::building *bld);
|
|
||||||
PlannedBuilding *getPlannedBuilding(df::building *bld);
|
|
||||||
|
|
||||||
bool isPlannableBuilding(BuildingTypeKey key);
|
|
||||||
|
|
||||||
// returns an empty vector if the type is not supported
|
|
||||||
ItemFiltersWrapper getItemFilters(BuildingTypeKey key);
|
|
||||||
|
|
||||||
void doCycle();
|
|
||||||
|
|
||||||
private:
|
|
||||||
DFHack::PersistentDataItem config;
|
|
||||||
std::map<std::string, bool> global_settings;
|
|
||||||
std::unordered_map<BuildingTypeKey,
|
|
||||||
std::vector<ItemFilter>,
|
|
||||||
BuildingTypeKeyHash> default_item_filters;
|
|
||||||
// building id -> PlannedBuilding
|
|
||||||
std::unordered_map<int32_t, PlannedBuilding> planned_buildings;
|
|
||||||
// vector id -> filter bucket -> queue of (building id, job_item index)
|
|
||||||
std::map<df::job_item_vector_id, std::map<std::string, std::queue<std::pair<int32_t, int>>>> tasks;
|
|
||||||
|
|
||||||
bool registerTasks(PlannedBuilding &plannedBuilding);
|
|
||||||
void unregisterBuilding(int32_t id);
|
|
||||||
void popInvalidTasks(std::queue<std::pair<int32_t, int>> &task_queue);
|
|
||||||
void doVector(df::job_item_vector_id vector_id,
|
|
||||||
std::map<std::string, std::queue<std::pair<int32_t, int>>> & buckets);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern Planner planner;
|
|
@ -1,226 +0,0 @@
|
|||||||
#include "buildingplan.h"
|
|
||||||
|
|
||||||
#include <df/entity_position.h>
|
|
||||||
#include <df/job_type.h>
|
|
||||||
#include <df/world.h>
|
|
||||||
|
|
||||||
#include <modules/World.h>
|
|
||||||
#include <modules/Units.h>
|
|
||||||
#include <modules/Buildings.h>
|
|
||||||
|
|
||||||
using namespace DFHack;
|
|
||||||
|
|
||||||
bool canReserveRoom(df::building *building)
|
|
||||||
{
|
|
||||||
if (!building)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (building->jobs.size() > 0 && building->jobs[0]->job_type == df::job_type::DestroyBuilding)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return building->is_room;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Units::NoblePosition> getUniqueNoblePositions(df::unit *unit)
|
|
||||||
{
|
|
||||||
std::vector<Units::NoblePosition> np;
|
|
||||||
Units::getNoblePositions(&np, unit);
|
|
||||||
for (auto iter = np.begin(); iter != np.end(); iter++)
|
|
||||||
{
|
|
||||||
if (iter->position->code == "MILITIA_CAPTAIN")
|
|
||||||
{
|
|
||||||
np.erase(iter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return np;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ReservedRoom
|
|
||||||
*/
|
|
||||||
|
|
||||||
ReservedRoom::ReservedRoom(df::building *building, std::string noble_code)
|
|
||||||
{
|
|
||||||
this->building = building;
|
|
||||||
config = DFHack::World::AddPersistentData("buildingplan/reservedroom");
|
|
||||||
config.val() = noble_code;
|
|
||||||
config.ival(1) = building->id;
|
|
||||||
pos = df::coord(building->centerx, building->centery, building->z);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReservedRoom::ReservedRoom(PersistentDataItem &config, color_ostream &)
|
|
||||||
{
|
|
||||||
this->config = config;
|
|
||||||
|
|
||||||
building = df::building::find(config.ival(1));
|
|
||||||
if (!building)
|
|
||||||
return;
|
|
||||||
pos = df::coord(building->centerx, building->centery, building->z);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ReservedRoom::checkRoomAssignment()
|
|
||||||
{
|
|
||||||
if (!isValid())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
auto np = getOwnersNobleCode();
|
|
||||||
bool correctOwner = false;
|
|
||||||
for (auto iter = np.begin(); iter != np.end(); iter++)
|
|
||||||
{
|
|
||||||
if (iter->position->code == getCode())
|
|
||||||
{
|
|
||||||
correctOwner = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (correctOwner)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
for (auto iter = df::global::world->units.active.begin(); iter != df::global::world->units.active.end(); iter++)
|
|
||||||
{
|
|
||||||
df::unit* unit = *iter;
|
|
||||||
if (!Units::isCitizen(unit))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!Units::isActive(unit))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
np = getUniqueNoblePositions(unit);
|
|
||||||
for (auto iter = np.begin(); iter != np.end(); iter++)
|
|
||||||
{
|
|
||||||
if (iter->position->code == getCode())
|
|
||||||
{
|
|
||||||
Buildings::setOwner(building, unit);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReservedRoom::remove() { DFHack::World::DeletePersistentData(config); }
|
|
||||||
|
|
||||||
bool ReservedRoom::isValid()
|
|
||||||
{
|
|
||||||
if (!building)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (Buildings::findAtTile(pos) != building)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return canReserveRoom(building);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ReservedRoom::getId()
|
|
||||||
{
|
|
||||||
if (!isValid())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return building->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ReservedRoom::getCode() { return config.val(); }
|
|
||||||
|
|
||||||
void ReservedRoom::setCode(const std::string &noble_code) { config.val() = noble_code; }
|
|
||||||
|
|
||||||
std::vector<Units::NoblePosition> ReservedRoom::getOwnersNobleCode()
|
|
||||||
{
|
|
||||||
if (!building->owner)
|
|
||||||
return std::vector<Units::NoblePosition> ();
|
|
||||||
|
|
||||||
return getUniqueNoblePositions(building->owner);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RoomMonitor
|
|
||||||
*/
|
|
||||||
|
|
||||||
std::string RoomMonitor::getReservedNobleCode(int32_t buildingId)
|
|
||||||
{
|
|
||||||
for (auto iter = reservedRooms.begin(); iter != reservedRooms.end(); iter++)
|
|
||||||
{
|
|
||||||
if (buildingId == iter->getId())
|
|
||||||
return iter->getCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void RoomMonitor::toggleRoomForPosition(int32_t buildingId, std::string noble_code)
|
|
||||||
{
|
|
||||||
bool found = false;
|
|
||||||
for (auto iter = reservedRooms.begin(); iter != reservedRooms.end(); iter++)
|
|
||||||
{
|
|
||||||
if (buildingId != iter->getId())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (noble_code == iter->getCode())
|
|
||||||
{
|
|
||||||
iter->remove();
|
|
||||||
reservedRooms.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iter->setCode(noble_code);
|
|
||||||
}
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
ReservedRoom room(df::building::find(buildingId), noble_code);
|
|
||||||
reservedRooms.push_back(room);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RoomMonitor::doCycle()
|
|
||||||
{
|
|
||||||
for (auto iter = reservedRooms.begin(); iter != reservedRooms.end();)
|
|
||||||
{
|
|
||||||
if (iter->checkRoomAssignment())
|
|
||||||
{
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iter->remove();
|
|
||||||
iter = reservedRooms.erase(iter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RoomMonitor::reset(color_ostream &out)
|
|
||||||
{
|
|
||||||
reservedRooms.clear();
|
|
||||||
std::vector<PersistentDataItem> items;
|
|
||||||
DFHack::World::GetPersistentData(&items, "buildingplan/reservedroom");
|
|
||||||
|
|
||||||
for (auto i = items.begin(); i != items.end(); i++)
|
|
||||||
{
|
|
||||||
ReservedRoom rr(*i, out);
|
|
||||||
if (rr.isValid())
|
|
||||||
addRoom(rr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RoomMonitor::addRoom(ReservedRoom &rr)
|
|
||||||
{
|
|
||||||
for (auto iter = reservedRooms.begin(); iter != reservedRooms.end(); iter++)
|
|
||||||
{
|
|
||||||
if (iter->getId() == rr.getId())
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
reservedRooms.push_back(rr);
|
|
||||||
}
|
|
||||||
|
|
||||||
RoomMonitor roomMonitor;
|
|
@ -1,51 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "modules/Persistence.h"
|
|
||||||
#include "modules/Units.h"
|
|
||||||
|
|
||||||
class ReservedRoom
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ReservedRoom(df::building *building, std::string noble_code);
|
|
||||||
|
|
||||||
ReservedRoom(DFHack::PersistentDataItem &config, DFHack::color_ostream &out);
|
|
||||||
|
|
||||||
bool checkRoomAssignment();
|
|
||||||
void remove();
|
|
||||||
bool isValid();
|
|
||||||
|
|
||||||
int32_t getId();
|
|
||||||
std::string getCode();
|
|
||||||
void setCode(const std::string &noble_code);
|
|
||||||
|
|
||||||
private:
|
|
||||||
df::building *building;
|
|
||||||
DFHack::PersistentDataItem config;
|
|
||||||
df::coord pos;
|
|
||||||
|
|
||||||
std::vector<DFHack::Units::NoblePosition> getOwnersNobleCode();
|
|
||||||
};
|
|
||||||
|
|
||||||
class RoomMonitor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RoomMonitor() { }
|
|
||||||
|
|
||||||
std::string getReservedNobleCode(int32_t buildingId);
|
|
||||||
|
|
||||||
void toggleRoomForPosition(int32_t buildingId, std::string noble_code);
|
|
||||||
|
|
||||||
void doCycle();
|
|
||||||
|
|
||||||
void reset(DFHack::color_ostream &out);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<ReservedRoom> reservedRooms;
|
|
||||||
|
|
||||||
void addRoom(ReservedRoom &rr);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool canReserveRoom(df::building *building);
|
|
||||||
std::vector<DFHack::Units::NoblePosition> getUniqueNoblePositions(df::unit *unit);
|
|
||||||
|
|
||||||
extern RoomMonitor roomMonitor;
|
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "buildingplan-planner.h"
|
|
||||||
#include "buildingplan-rooms.h"
|
|
||||||
|
|
||||||
void debug(const char *fmt, ...) Wformat(printf,1,2);
|
|
||||||
|
|
||||||
extern bool show_debugging;
|
|
Loading…
Reference in New Issue