Merge remote-tracking branch 'eswald/trackstop'

Conflicts:
	NEWS
develop
lethosor 2015-01-05 16:22:18 -05:00
commit 1d0b4deef6
2 changed files with 43 additions and 6 deletions

@ -3,6 +3,7 @@ DFHack Future
Fixes Fixes
plugins/dwarfmonitor: correct date display (month index, separator) plugins/dwarfmonitor: correct date display (month index, separator)
scripts/putontable: added to the readme scripts/putontable: added to the readme
trackstop: No longer prevents cancelling the removal of a track stop or roller.
New Plugins New Plugins
New Scripts New Scripts
gui/stockpiles: an in-game interface for saving and loading stockpile gui/stockpiles: an in-game interface for saving and loading stockpile

@ -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) {