New tweak: farm-plot-select
parent
999d265d50
commit
d34b22b2c2
@ -0,0 +1,93 @@
|
||||
#include "BitArray.h"
|
||||
#include "df/building_farmplotst.h"
|
||||
#include "df/plant_raw.h"
|
||||
|
||||
using namespace df::enums;
|
||||
|
||||
using df::global::ui;
|
||||
using df::global::ui_building_item_cursor;
|
||||
using df::global::world;
|
||||
|
||||
struct farm_select_hook : df::viewscreen_dwarfmodest {
|
||||
typedef df::viewscreen_dwarfmodest interpose_base;
|
||||
|
||||
df::building_farmplotst* getFarmPlot()
|
||||
{
|
||||
if (ui->main.mode != ui_sidebar_mode::QueryBuilding)
|
||||
return NULL;
|
||||
VIRTUAL_CAST_VAR(farm_plot, df::building_farmplotst, world->selected_building);
|
||||
return farm_plot;
|
||||
}
|
||||
|
||||
bool isValidCrop (int32_t crop_id, int season, df::building_farmplotst* farm_plot)
|
||||
{
|
||||
// Adapted from autofarm
|
||||
using namespace df::enums::plant_raw_flags;
|
||||
// Discovered?
|
||||
if (ui->tasks.discovered_plants[crop_id])
|
||||
{
|
||||
// Possible to plant?
|
||||
df::plant_raw* raws = world->raws.plants.all[crop_id];
|
||||
if (raws->flags.is_set(SEED) && raws->flags.is_set((df::plant_raw_flags)season))
|
||||
{
|
||||
// Right depth?
|
||||
DFCoord cursor (farm_plot->centerx, farm_plot->centery, farm_plot->z);
|
||||
MapExtras::MapCache mc;
|
||||
MapExtras::Block * b = mc.BlockAt(cursor / 16);
|
||||
if (!b || !b->is_valid())
|
||||
return false;
|
||||
auto &block = *b->getRaw();
|
||||
df::tile_designation &des =
|
||||
block.designation[farm_plot->centerx % 16][farm_plot->centery % 16];
|
||||
if ((raws->underground_depth_min == 0 || raws->underground_depth_max == 0) != des.bits.subterranean)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline int32_t getSelectedCropId() { return ui->selected_farm_crops[*ui_building_item_cursor]; }
|
||||
|
||||
DEFINE_VMETHOD_INTERPOSE(void, feed, (set<df::interface_key> *input))
|
||||
{
|
||||
df::building_farmplotst* farm_plot = getFarmPlot();
|
||||
if (farm_plot)
|
||||
{
|
||||
if (input->count(interface_key::SELECT_ALL))
|
||||
{
|
||||
int32_t crop_id = getSelectedCropId();
|
||||
for (int season = 0; season < 4; season++)
|
||||
{
|
||||
farm_plot->plant_id[season] = crop_id;
|
||||
}
|
||||
}
|
||||
else if (input->count(interface_key::DESELECT_ALL))
|
||||
{
|
||||
for (int season = 0; season < 4; season++)
|
||||
{
|
||||
farm_plot->plant_id[season] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
INTERPOSE_NEXT(feed)(input);
|
||||
}
|
||||
|
||||
DEFINE_VMETHOD_INTERPOSE(void, render, ())
|
||||
{
|
||||
INTERPOSE_NEXT(render)();
|
||||
if (!getFarmPlot())
|
||||
return;
|
||||
auto dims = Gui::getDwarfmodeViewDims();
|
||||
int x = dims.menu_x1 + 1,
|
||||
y = dims.y2 - 5,
|
||||
left = x;
|
||||
OutputString(COLOR_LIGHTRED, x, y, Screen::getKeyDisplay(interface_key::SELECT_ALL));
|
||||
OutputString(COLOR_WHITE, x, y, ": All seasons", true, left);
|
||||
OutputString(COLOR_LIGHTRED, x, y, Screen::getKeyDisplay(interface_key::DESELECT_ALL));
|
||||
OutputString(COLOR_WHITE, x, y, ": Fallow all seasons", true, left);
|
||||
}
|
||||
};
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(farm_select_hook, render);
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(farm_select_hook, feed);
|
Loading…
Reference in New Issue