Ticket #1714: 0001-Add-prompt_destructive-option.txt

File 0001-Add-prompt_destructive-option.txt, 4.8 KB (added by daniel.santos, 6 years ago)
Line 
1From ec21af9b301096ff29667a8e441ac509bcf0c4bd Mon Sep 17 00:00:00 2001
2From: Daniel Santos <daniel.santos@pobox.com>
3Date: Wed, 5 Dec 2012 17:41:01 -0600
4Subject: Add prompt_destructive option
5
6I find it annoying when I'm just buzzing away on a priest or paladin and
7I accidentally hit the key sequence to cast Earthquake when I meant to
8cast something else.  This is bad because my Flyswatter of Companionship
9+2 just got destroyed.
10
11This patch adds an option to prompt the user prior to a voluntary
12evocation of Earthquake or Destruction spells.  Prompt is not applicable
13for using an unidentified scroll or staff, because it's the surprises in
14life that keep it interesting.
15---
16 src/effects.c |   12 ++++++++++++
17 src/effects.h |    1 +
18 src/option.c  |    4 ++--
19 src/option.h  |    1 +
20 src/x-spell.c |   12 ++++++++++++
21 5 files changed, 28 insertions(+), 2 deletions(-)
22
23diff --git a/src/effects.c b/src/effects.c
24index bb7e6b5..72a8697 100644
25--- a/src/effects.c
26+++ b/src/effects.c
27@@ -23,6 +23,7 @@
28 #include "monster/mon-util.h"
29 #include "trap.h"
30 #include "spells.h"
31+#include "option.h"
32 
33 /*
34  * Entries for spell/activation descriptions
35@@ -1074,6 +1075,9 @@ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam,
36 
37                case EF_EARTHQUAKES:
38                {
39+                       if(*ident && !prompt_destructive("Cause an earthquake? "))
40+                               return false;
41+
42                        earthquake(py, px, 10);
43                        *ident = TRUE;
44                        return TRUE;
45@@ -1081,6 +1085,9 @@ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam,
46 
47                case EF_DESTRUCTION2:
48                {
49+                       if(*ident && !prompt_destructive("Destroy area? "))
50+                               return false;
51+
52                        destroy_area(py, px, 15, TRUE);
53                        *ident = TRUE;
54                        return TRUE;
55@@ -2139,3 +2146,8 @@ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam,
56        msg("Effect not handled.");
57        return FALSE;
58 }
59+
60+bool prompt_destructive(const char *prompt)
61+{
62+       return !(OPT(prompt_destructive) && !get_check(prompt));
63+}
64diff --git a/src/effects.h b/src/effects.h
65index d738d71..0d2dc24 100644
66--- a/src/effects.h
67+++ b/src/effects.h
68@@ -37,5 +37,6 @@ const char *effect_desc(effect_type effect);
69 int effect_power(effect_type effect);
70 bool effect_obvious(effect_type effect);
71 bool effect_wonder(int dir, int die, int beam);
72+bool prompt_destructive(const char *prompt);
73 
74 #endif /* INCLUDED_EFFECTS_H */
75diff --git a/src/option.c b/src/option.c
76index 5ac84e5..114cdb2 100644
77--- a/src/option.c
78+++ b/src/option.c
79@@ -51,7 +51,7 @@ const int option_page[OPT_PAGE_MAX][OPT_PAGE_PER] =
80                OPT_disturb_state,
81                OPT_auto_more,
82                OPT_notify_recharge,
83-               OPT_NONE,
84+               OPT_prompt_destructive,
85                OPT_NONE,
86                OPT_NONE,
87                OPT_NONE,
88@@ -138,7 +138,7 @@ static const struct option options[OPT_MAX] =
89 { "mouse_movement",      "Allow mouse clicks to move the player",       TRUE },  /* 21 */
90 { "mouse_buttons",       "Show mouse status line buttons",              FALSE }, /* 22 */
91 { "notify_recharge",     "Notify on object recharge",                   FALSE }, /* 23 */
92-{ NULL,                  NULL,                                          FALSE }, /* 24 */
93+{ "prompt_destructive",  "Confirm use of earthquake, destruction etc.", FALSE }, /* 24 */
94 { NULL,                  NULL,                                          FALSE }, /* 25 */
95 { NULL,                  NULL,                                          FALSE }, /* 26 */
96 { NULL,                  NULL,                                          FALSE }, /* 27 */
97diff --git a/src/option.h b/src/option.h
98index 08bb094..fe4b60f 100644
99--- a/src/option.h
100+++ b/src/option.h
101@@ -71,6 +71,7 @@ extern const int option_page[OPT_PAGE_MAX][OPT_PAGE_PER];
102 #define OPT_mouse_movement                     21
103 #define OPT_mouse_buttons                      22
104 #define OPT_notify_recharge                    23
105+#define OPT_prompt_destructive         24
106 
107 #define OPT_cheat_hear                         (OPT_CHEAT+1)
108 #define OPT_cheat_room                         (OPT_CHEAT+2)
109diff --git a/src/x-spell.c b/src/x-spell.c
110index 3b14835..ceaf653 100644
111--- a/src/x-spell.c
112+++ b/src/x-spell.c
113@@ -668,6 +668,9 @@ static bool cast_mage_spell(int spell, int dir)
114 
115                case SPELL_WORD_OF_DESTRUCTION:
116                {
117+                       if(!prompt_destructive("Destroy area? "))
118+                               return false;
119+
120                        destroy_area(py, px, 15, TRUE);
121                        break;
122                }
123@@ -698,6 +701,9 @@ static bool cast_mage_spell(int spell, int dir)
124 
125                case SPELL_EARTHQUAKE:
126                {
127+                       if(!prompt_destructive("Cause an earthquake? "))
128+                               return false;
129+
130                        earthquake(py, px, 10);
131                        break;
132                }
133@@ -1043,6 +1049,9 @@ static bool cast_priest_spell(int spell, int dir)
134 
135                case PRAYER_EARTHQUAKE:
136                {
137+                       if(!prompt_destructive("Cause an earthquake? "))
138+                               return false;
139+
140                        earthquake(py, px, 10);
141                        break;
142                }
143@@ -1219,6 +1228,9 @@ static bool cast_priest_spell(int spell, int dir)
144 
145                case PRAYER_WORD_OF_DESTRUCTION:
146                {
147+                       if(!prompt_destructive("Destroy area? "))
148+                               return false;
149+
150                        destroy_area(py, px, 15, TRUE);
151                        break;
152                }
153--
1541.7.10.4
155