Made a function to find building extents for un-built buildings.

develop
JapaMala 2018-07-01 20:36:36 +05:30
parent 9c2e052d4d
commit d9b910f79c
1 changed files with 112 additions and 0 deletions

@ -5,6 +5,9 @@
#include "df/build_req_choice_genst.h"
#include "df/build_req_choice_specst.h"
#include "df/build_req_choicest.h"
#include "df/building_def.h"
#include "df/building_def_furnacest.h"
#include "df/building_def_workshopst.h"
#include "df/job.h"
#include "df/job_list_link.h"
#include "df/interface_button_construction_building_selectorst.h"
@ -22,15 +25,124 @@
#include "modules/Maps.h"
#include "modules/World.h"
#include "MiscUtils.h"
#include <queue>
using namespace DFHack;
using namespace RemoteFortressReader;
using namespace df::enums;
using namespace Gui;
using namespace df::global;
extern std::queue<interface_key::interface_key> keyQueue;
void GetBuildingSize(
int16_t type,
int16_t subtype,
int16_t custom,
int16_t &x_min,
int16_t &y_min,
int16_t &x_max,
int16_t &y_max
)
{
x_min = 0;
y_min = 0;
x_max = 0;
y_max = 0;
df::building_def* customBuilding = 0;
switch (type)
{
case building_type::FarmPlot:
case building_type::Bridge:
case building_type::RoadDirt:
case building_type::RoadPaved:
case building_type::Stockpile:
case building_type::Civzone:
case building_type::ScrewPump:
case building_type::Construction:
case building_type::AxleHorizontal:
case building_type::WaterWheel:
case building_type::Rollers:
bool widthOdd = world->building_width % 2;
x_min = world->building_width / 2;
if(widthOdd)
x_max = world->building_width / 2;
else
x_max = (world->building_width / 2) - 1;
bool heightOdd = world->building_width % 2;
y_min = world->building_height / 2;
if (widthOdd)
y_max = world->building_height / 2;
else
y_max = (world->building_height / 2) - 1;
return;
case building_type::Furnace:
if (subtype != furnace_type::Custom)
{
x_min = y_min = x_max = y_max = 1;
return;
}
customBuilding = binsearch_in_vector(world->raws.buildings.furnaces, custom);
break;
case building_type::TradeDepot:
case building_type::Shop:
x_min = y_min = x_max = y_max = 2;
return;
case building_type::Workshop:
switch (subtype)
{
case workshop_type::Carpenters:
case workshop_type::Farmers:
case workshop_type::Masons:
case workshop_type::Craftsdwarfs:
case workshop_type::Jewelers:
case workshop_type::MetalsmithsForge:
case workshop_type::MagmaForge:
case workshop_type::Bowyers:
case workshop_type::Mechanics:
case workshop_type::Butchers:
case workshop_type::Leatherworks:
case workshop_type::Tanners:
case workshop_type::Clothiers:
case workshop_type::Fishery:
case workshop_type::Still:
case workshop_type::Loom:
case workshop_type::Kitchen:
case workshop_type::Ashery:
case workshop_type::Dyers:
x_min = y_min = x_max = y_max = 1;
return;
case workshop_type::Siege:
case workshop_type::Kennels:
x_min = y_min = x_max = y_max = 2;
return;
case workshop_type::Custom:
customBuilding = binsearch_in_vector(world->raws.buildings.workshops, custom);
break;
default:
return;
}
break;
case building_type::SiegeEngine:
case building_type::Wagon:
case building_type::Windmill:
x_min = y_min = x_max = y_max = 1;
return;
default:
return;
}
if (customBuilding)
{
x_min = customBuilding->workloc_x;
y_min = customBuilding->workloc_y;
x_max = customBuilding->dim_x - x_min - 1;
y_max = customBuilding->dim_y - y_min - 1;
return;
}
}
command_result SendDigCommand(color_ostream &stream, const DigCommand *in)
{
MapExtras::MapCache mc;