Trackstop bugfix: No longer prevents cancelling building removal.

Thanks to Ramblurr for pointing this out.
develop
Eric Wald 2014-12-16 21:10:18 -07:00
parent 10fa55570e
commit 0b7f890d87
2 changed files with 43 additions and 6 deletions

@ -1,6 +1,7 @@
DFHack Future DFHack Future
Internals Internals
Fixes Fixes
trackstop: No longer prevents cancelling the removal of a track stop or roller.
New Plugins New Plugins
New Scripts New Scripts
Misc Improvements Misc Improvements

@ -8,6 +8,7 @@
#include "df/building_rollersst.h" #include "df/building_rollersst.h"
#include "df/building_trapst.h" #include "df/building_trapst.h"
#include "df/job.h"
#include "df/viewscreen_dwarfmodest.h" #include "df/viewscreen_dwarfmodest.h"
#include "modules/Gui.h" #include "modules/Gui.h"
@ -44,17 +45,37 @@ struct trackstop_hook : public df::viewscreen_dwarfmodest {
building_trapst *get_selected_trackstop() { building_trapst *get_selected_trackstop() {
if (!Gui::dwarfmode_hotkey(Core::getTopViewscreen()) || ui->main.mode != ui_sidebar_mode::QueryBuilding) { if (!Gui::dwarfmode_hotkey(Core::getTopViewscreen()) || ui->main.mode != ui_sidebar_mode::QueryBuilding) {
// Not in a building's 'q' menu.
return nullptr; return nullptr;
} }
building_trapst *ts = virtual_cast<building_trapst>(world->selected_building); building_trapst *ts = virtual_cast<building_trapst>(world->selected_building);
if (ts && ts->trap_type == df::trap_type::TrackStop && ts->construction_stage) { if (!ts) {
return ts; // Not a trap type of building.
return nullptr;
}
if (ts->trap_type != df::trap_type::TrackStop) {
// Not a trackstop.
return nullptr;
} }
if (ts->construction_stage < ts->getMaxBuildStage()) {
// Not yet fully constructed.
return nullptr; return nullptr;
} }
for (auto it = ts->jobs.begin(); it != ts->jobs.end(); it++) {
auto job = *it;
if (job->job_type == df::job_type::DestroyBuilding) {
// Slated for removal.
return nullptr;
}
}
return ts;
}
bool handleInput(set<df::interface_key> *input) { bool handleInput(set<df::interface_key> *input) {
building_trapst *ts = get_selected_trackstop(); building_trapst *ts = get_selected_trackstop();
if (!ts) { if (!ts) {
@ -178,17 +199,32 @@ struct roller_hook : public df::viewscreen_dwarfmodest {
building_rollersst *get_selected_roller() { building_rollersst *get_selected_roller() {
if (!Gui::dwarfmode_hotkey(Core::getTopViewscreen()) || ui->main.mode != ui_sidebar_mode::QueryBuilding) { if (!Gui::dwarfmode_hotkey(Core::getTopViewscreen()) || ui->main.mode != ui_sidebar_mode::QueryBuilding) {
// Not in a building's 'q' menu.
return nullptr; return nullptr;
} }
building_rollersst *roller = virtual_cast<building_rollersst>(world->selected_building); building_rollersst *roller = virtual_cast<building_rollersst>(world->selected_building);
if (roller && roller->construction_stage) { if (!roller) {
return roller; // Not a roller.
return nullptr;
} }
if (roller->construction_stage < roller->getMaxBuildStage()) {
// Not yet fully constructed.
return nullptr; return nullptr;
} }
for (auto it = roller->jobs.begin(); it != roller->jobs.end(); it++) {
auto job = *it;
if (job->job_type == df::job_type::DestroyBuilding) {
// Slated for removal.
return nullptr;
}
}
return roller;
}
bool handleInput(set<df::interface_key> *input) { bool handleInput(set<df::interface_key> *input) {
building_rollersst *roller = get_selected_roller(); building_rollersst *roller = get_selected_roller();
if (!roller) { if (!roller) {