diff --git a/plugins/spectate/spectate.cpp b/plugins/spectate/spectate.cpp index bab789454..96500820a 100644 --- a/plugins/spectate/spectate.cpp +++ b/plugins/spectate/spectate.cpp @@ -56,7 +56,7 @@ std::set job_tracker; std::map freq; std::default_random_engine RNG; - +void enable_auto_unpause(color_ostream &out, bool state); #define base 0.99 @@ -121,6 +121,7 @@ DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { EM::registerListener(EventType::TICK, ticking, plugin_self); EM::registerListener(EventType::JOB_STARTED, start, plugin_self); EM::registerListener(EventType::JOB_COMPLETED, complete, plugin_self); + enable_auto_unpause(out, unpause_enabled); } else if (!enable && enabled) { // warp 8, engage! out.print("Spectate mode disabled!\n"); @@ -141,6 +142,12 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan our_dorf = nullptr; job_watched = nullptr; following_dwarf = false; + //pause_lock->unlock(); + break; + case SC_MAP_LOADED: + // todo: RE UNDEAD_ATTACK event still pausing regardless of announcement settings + //enable_auto_unpause(out, unpause_enabled); + break; default: break; } @@ -150,22 +157,21 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan DFhackCExport command_result plugin_onupdate(color_ostream &out) { // keeps announcement pause settings locked - World::Update(); // from pause.h - if (lock_collision) { - if (unpause_enabled) { - // player asked for auto-unpause enabled - World::SaveAnnouncementSettings(); - if (World::DisableAnnouncementPausing()) { - // now that we've got what we want, we can lock it down - lock_collision = false; - pause_lock->lock(); - } - } else { - if (World::RestoreAnnouncementSettings()) { - lock_collision = false; - } - } - } +// World::Update(); // from pause.h +// if (lock_collision) { +// if (unpause_enabled) { +// // player asked for auto-unpause enabled +// World::SaveAnnouncementSettings(); +// if (World::DisableAnnouncementPausing(out)) { +// // now that we've got what we want, we can lock it down +// lock_collision = false; +// } +// } else { +// if (World::RestoreAnnouncementSettings()) { +// lock_collision = false; +// } +// } +// } while (unpause_enabled && !world->status.popups.empty()) { // dismiss announcement popup(s) Gui::getCurViewscreen(true)->feed_key(interface_key::CLOSE_MEGA_ANNOUNCEMENT); @@ -179,40 +185,48 @@ DFhackCExport command_result plugin_onupdate(color_ostream &out) { } void enable_auto_unpause(color_ostream &out, bool state) { - // lock_collision == true means: enable_auto_unpause() was already invoked and didn't complete - // The onupdate function above ensure the procedure properly completes, thus we only care about - // state reversal here ergo `enabled != state` - if (lock_collision && unpause_enabled != state) { - // if unpaused_enabled is true, then a lock collision means: we couldn't save/disable the pause settings, - // therefore nothing to revert and the lock won't even be engaged (nothing to unlock) - lock_collision = false; + // we don't need to do any of this yet if the plugin isn't enabled + if (enabled) { +// Announcement manipulation doesn't prevent siege pauses +// if(pause_lock) { +// // lock_collision == true means: enable_auto_unpause() was already invoked and didn't complete +// // The onupdate function above ensure the procedure properly completes, thus we only care about +// // state reversal here ergo `enabled != state` +// if (lock_collision && unpause_enabled != state) { +// out.print("handling collision\n"); +// // if unpaused_enabled is true, then a lock collision means: we couldn't save/disable the pause settings, +// // therefore nothing to revert and the lock won't even be engaged (nothing to unlock) +// lock_collision = false; +// unpause_enabled = state; +// if (unpause_enabled) { +// // a collision means we couldn't restore the pause settings, therefore we only need re-engage the lock +// pause_lock->lock(); +// } +// return; +// } +// // update the announcement settings if we can +// if (state) { +// if (World::SaveAnnouncementSettings()) { +// World::DisableAnnouncementPausing(out); +// pause_lock->lock(); +// } else { +// lock_collision = true; +// } +// } else { +// pause_lock->unlock(); +// if (!World::RestoreAnnouncementSettings()) { +// // this in theory shouldn't happen, if others use the lock like we do in spectate +// lock_collision = true; +// } +// } +// if (lock_collision) { +// out.printerr( +// "auto-unpause: must wait for another Pausing::AnnouncementLock to be lifted." +// " This setting will complete when the lock lifts.\n"); +// pause_lock->reportLocks(out); +// } +// } unpause_enabled = state; - if (unpause_enabled) { - // a collision means we couldn't restore the pause settings, therefore we only need re-engage the lock - pause_lock->lock(); - } - return; - } - unpause_enabled = state; - // update the announcement settings if we can - if (unpause_enabled) { - if (World::SaveAnnouncementSettings()) { - World::DisableAnnouncementPausing(); - pause_lock->lock(); - } else { - lock_collision = true; - } - } else { - pause_lock->unlock(); - if (!World::RestoreAnnouncementSettings()) { - // this in theory shouldn't happen, if others use the lock like we do in spectate - lock_collision = true; - } - } - if (lock_collision) { - out.printerr( - "auto-unpause: must wait for another Pausing::AnnouncementLock to be lifted." - " This setting will complete when the lock lifts.\n"); } }