Add "tweak cage-butcher" and some extra Building module functions
* Buildings::markedForRemoval() * Buildings::getCageOccupants() Closes #906develop
parent
db375ae83b
commit
10e13c532a
@ -0,0 +1,98 @@
|
||||
#include "modules/Gui.h"
|
||||
#include "modules/Screen.h"
|
||||
#include "df/building_cagest.h"
|
||||
#include "df/viewscreen_dwarfmodest.h"
|
||||
#include "df/ui_sidebar_mode.h"
|
||||
#include "df/unit.h"
|
||||
|
||||
using namespace DFHack;
|
||||
using df::global::ui;
|
||||
using df::global::ui_building_in_assign;
|
||||
using df::global::ui_building_in_resize;
|
||||
using df::global::ui_building_item_cursor;
|
||||
|
||||
struct cage_butcher_hook : df::viewscreen_dwarfmodest {
|
||||
typedef df::viewscreen_dwarfmodest interpose_base;
|
||||
|
||||
inline df::building_cagest *get_cage()
|
||||
{
|
||||
if (*ui_building_in_assign || *ui_building_in_resize)
|
||||
return nullptr;
|
||||
|
||||
if (ui->main.mode != df::ui_sidebar_mode::QueryBuilding)
|
||||
return nullptr;
|
||||
|
||||
auto cage = virtual_cast<df::building_cagest>(Gui::getAnyBuilding(this));
|
||||
if (!cage)
|
||||
return nullptr;
|
||||
if (cage->getBuildStage() < cage->getMaxBuildStage())
|
||||
return nullptr;
|
||||
if (cage->flags.bits.justice)
|
||||
return nullptr;
|
||||
if (Buildings::markedForRemoval(cage))
|
||||
return nullptr;
|
||||
|
||||
return cage;
|
||||
}
|
||||
|
||||
DEFINE_VMETHOD_INTERPOSE(void, render, ())
|
||||
{
|
||||
using namespace df::enums::interface_key;
|
||||
INTERPOSE_NEXT(render)();
|
||||
|
||||
auto cage = get_cage();
|
||||
if (!cage)
|
||||
return;
|
||||
|
||||
std::vector<df::unit*> units;
|
||||
if (!Buildings::getCageOccupants(cage, units))
|
||||
return;
|
||||
|
||||
auto dims = Gui::getDwarfmodeViewDims();
|
||||
for (int y = 4, i = (*ui_building_item_cursor/11)*11;
|
||||
y <= 14 && i < units.size();
|
||||
++y, ++i)
|
||||
{
|
||||
df::unit *unit = vector_get(units, i);
|
||||
if (unit && unit->flags2.bits.slaughter)
|
||||
{
|
||||
int x = dims.menu_x2 - 2;
|
||||
OutputString(COLOR_LIGHTMAGENTA, x, y, "Bu");
|
||||
}
|
||||
}
|
||||
|
||||
int x = dims.menu_x1 + 1, y = dims.y2;
|
||||
OutputHotkeyString(x, y, "Butcher ", CUSTOM_B, false, 0, COLOR_WHITE, COLOR_LIGHTRED);
|
||||
OutputHotkeyString(x, y, "all", CUSTOM_SHIFT_B, false, 0, COLOR_WHITE, COLOR_LIGHTRED);
|
||||
}
|
||||
DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key> *input))
|
||||
{
|
||||
using namespace df::enums::interface_key;
|
||||
auto cage = get_cage();
|
||||
if (cage)
|
||||
{
|
||||
std::vector<df::unit*> units;
|
||||
if (Buildings::getCageOccupants(cage, units))
|
||||
{
|
||||
df::unit *unit = vector_get(units, *ui_building_item_cursor);
|
||||
if (unit)
|
||||
{
|
||||
if (input->count(CUSTOM_B))
|
||||
{
|
||||
unit->flags2.bits.slaughter = !unit->flags2.bits.slaughter;
|
||||
}
|
||||
}
|
||||
if (input->count(CUSTOM_SHIFT_B))
|
||||
{
|
||||
bool state = unit ? !unit->flags2.bits.slaughter : true;
|
||||
for (auto u : units)
|
||||
u->flags2.bits.slaughter = state;
|
||||
}
|
||||
}
|
||||
}
|
||||
INTERPOSE_NEXT(feed)(input);
|
||||
}
|
||||
};
|
||||
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(cage_butcher_hook, feed);
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(cage_butcher_hook, render);
|
Loading…
Reference in New Issue