From 0f7006bc57cf51d5438cbe9ca2a1fb63d93a56c6 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Tue, 2 Jan 2007 05:35:36 +0000 Subject: stop_travel messages now also apply to shift-run and rest (under the default conditions this is irrelevant because al messages stop shift-run and rest). Allow individual interrupts to be disabled for an activity using -=. For instance, interrupt_rest -= message will disable the stop-resting-for-any-silly-message behaviour (and also make stop_travel relevant to resting). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@761 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/initfile.cc | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'crawl-ref/source/initfile.cc') diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index 0b3c032e6d..0054550a91 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -493,7 +493,8 @@ void game_options::set_activity_interrupt( void game_options::set_activity_interrupt(const std::string &activity_name, const std::string &interrupt_names, - bool append_interrupts) + bool append_interrupts, + bool remove_interrupts) { const delay_type delay = get_delay(activity_name); if (delay == NUM_DELAYS) @@ -502,14 +503,28 @@ void game_options::set_activity_interrupt(const std::string &activity_name, return; } + std::vector interrupts = split_string(",", interrupt_names); FixedVector &eints = activity_interrupts[ delay ]; - if (!append_interrupts) - clear_activity_interrupts(eints); + if (remove_interrupts) + { + FixedVector refints; + clear_activity_interrupts(refints); + for (int i = 0, size = interrupts.size(); i < size; ++i) + set_activity_interrupt(refints, interrupts[i]); - std::vector interrupts = split_string(",", interrupt_names); - for (int i = 0, size = interrupts.size(); i < size; ++i) - set_activity_interrupt(eints, interrupts[i]); + for (int i = 0; i < NUM_AINTERRUPTS; ++i) + if (refints[i]) + eints[i] = false; + } + else + { + if (!append_interrupts) + clear_activity_interrupts(eints); + + for (int i = 0, size = interrupts.size(); i < size; ++i) + set_activity_interrupt(eints, interrupts[i]); + } eints[AI_FORCE_INTERRUPT] = true; } @@ -1484,7 +1499,8 @@ void game_options::read_option_line(const std::string &str, bool runscript) { set_activity_interrupt(key.substr(interrupt_prefix.length()), field, - plus_equal); + plus_equal, + minus_equal); } else if (key.find("cset") == 0) { -- cgit v1.2.3-54-g00ecf