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