OSDN Git Service

[Refactor] #37353 do_cmd_archer() を create_ammo() に改名。 / Rename do_cmd_archer() to...
[hengband/hengband.git] / src / spells-object.c
1 
2 #include "angband.h"
3 #include "spells-object.h"
4 #include "object-hook.h"
5
6 /*!
7  * @brief「弾/矢の製造」処理 / do_cmd_cast calls this function if the player's class is 'archer'.
8  * Hook to determine if an object is contertible in an arrow/bolt
9  * @return 製造を実際に行ったらTRUE、キャンセルしたらFALSEを返す
10  */
11 bool create_ammo(void)
12 {
13         int ext = 0;
14         char ch;
15
16         object_type     forge;
17         object_type *q_ptr;
18
19         char com[80];
20         GAME_TEXT o_name[MAX_NLEN];
21
22         q_ptr = &forge;
23
24         if (p_ptr->lev >= 20)
25                 sprintf(com, _("[S]弾, [A]矢, [B]クロスボウの矢 :", "Create [S]hots, Create [A]rrow or Create [B]olt ?"));
26         else if (p_ptr->lev >= 10)
27                 sprintf(com, _("[S]弾, [A]矢:", "Create [S]hots or Create [A]rrow ?"));
28         else
29                 sprintf(com, _("[S]弾:", "Create [S]hots ?"));
30
31         if (p_ptr->confused)
32         {
33                 msg_print(_("混乱してる!", "You are too confused!"));
34                 return FALSE;
35         }
36
37         if (p_ptr->blind)
38         {
39                 msg_print(_("目が見えない!", "You are blind!"));
40                 return FALSE;
41         }
42
43         while (TRUE)
44         {
45                 if (!get_com(com, &ch, TRUE))
46                 {
47                         return FALSE;
48                 }
49                 if (ch == 'S' || ch == 's')
50                 {
51                         ext = 1;
52                         break;
53                 }
54                 if ((ch == 'A' || ch == 'a') && (p_ptr->lev >= 10))
55                 {
56                         ext = 2;
57                         break;
58                 }
59                 if ((ch == 'B' || ch == 'b') && (p_ptr->lev >= 20))
60                 {
61                         ext = 3;
62                         break;
63                 }
64         }
65
66         /**********Create shots*********/
67         if (ext == 1)
68         {
69                 POSITION x, y;
70                 DIRECTION dir;
71                 cave_type *c_ptr;
72
73                 if (!get_rep_dir(&dir, FALSE)) return FALSE;
74                 y = p_ptr->y + ddy[dir];
75                 x = p_ptr->x + ddx[dir];
76                 c_ptr = &cave[y][x];
77
78                 if (!have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_CAN_DIG))
79                 {
80                         msg_print(_("そこには岩石がない。", "You need pile of rubble."));
81                         return FALSE;
82                 }
83                 else if (!cave_have_flag_grid(c_ptr, FF_CAN_DIG) || !cave_have_flag_grid(c_ptr, FF_HURT_ROCK))
84                 {
85                         msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo."));
86                 }
87                 else
88                 {
89                         s16b slot;
90                         q_ptr = &forge;
91
92                         /* Hack -- Give the player some small firestones */
93                         object_prep(q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
94                         q_ptr->number = (byte)rand_range(15, 30);
95                         object_aware(q_ptr);
96                         object_known(q_ptr);
97                         apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
98                         q_ptr->discount = 99;
99
100                         slot = inven_carry(q_ptr);
101
102                         object_desc(o_name, q_ptr, 0);
103                         msg_format(_("%sを作った。", "You make some ammo."), o_name);
104
105                         /* Auto-inscription */
106                         if (slot >= 0) autopick_alter_item(slot, FALSE);
107
108                         /* Destroy the wall */
109                         cave_alter_feat(y, x, FF_HURT_ROCK);
110
111                         p_ptr->update |= (PU_FLOW);
112                 }
113         }
114         /**********Create arrows*********/
115         else if (ext == 2)
116         {
117                 OBJECT_IDX item;
118                 concptr q, s;
119                 s16b slot;
120
121                 item_tester_hook = item_tester_hook_convertible;
122
123                 q = _("どのアイテムから作りますか? ", "Convert which item? ");
124                 s = _("材料を持っていない。", "You have no item to convert.");
125                 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
126                 if (!q_ptr) return FALSE;
127
128                 q_ptr = &forge;
129
130                 /* Hack -- Give the player some small firestones */
131                 object_prep(q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
132                 q_ptr->number = (byte)rand_range(5, 10);
133                 object_aware(q_ptr);
134                 object_known(q_ptr);
135                 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
136
137                 q_ptr->discount = 99;
138
139                 object_desc(o_name, q_ptr, 0);
140                 msg_format(_("%sを作った。", "You make some ammo."), o_name);
141
142                 if (item >= 0)
143                 {
144                         inven_item_increase(item, -1);
145                         inven_item_describe(item);
146                         inven_item_optimize(item);
147                 }
148                 else
149                 {
150                         floor_item_increase(0 - item, -1);
151                         floor_item_describe(0 - item);
152                         floor_item_optimize(0 - item);
153                 }
154
155                 slot = inven_carry(q_ptr);
156
157                 /* Auto-inscription */
158                 if (slot >= 0) autopick_alter_item(slot, FALSE);
159         }
160         /**********Create bolts*********/
161         else if (ext == 3)
162         {
163                 OBJECT_IDX item;
164                 concptr q, s;
165                 s16b slot;
166
167                 item_tester_hook = item_tester_hook_convertible;
168
169                 q = _("どのアイテムから作りますか? ", "Convert which item? ");
170                 s = _("材料を持っていない。", "You have no item to convert.");
171
172                 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
173                 if (!q_ptr) return FALSE;
174
175                 q_ptr = &forge;
176
177                 /* Hack -- Give the player some small firestones */
178                 object_prep(q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
179                 q_ptr->number = (byte)rand_range(4, 8);
180                 object_aware(q_ptr);
181                 object_known(q_ptr);
182                 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
183
184                 q_ptr->discount = 99;
185
186                 object_desc(o_name, q_ptr, 0);
187                 msg_format(_("%sを作った。", "You make some ammo."), o_name);
188
189                 if (item >= 0)
190                 {
191                         inven_item_increase(item, -1);
192                         inven_item_describe(item);
193                         inven_item_optimize(item);
194                 }
195                 else
196                 {
197                         floor_item_increase(0 - item, -1);
198                         floor_item_describe(0 - item);
199                         floor_item_optimize(0 - item);
200                 }
201
202                 slot = inven_carry(q_ptr);
203
204                 /* Auto-inscription */
205                 if (slot >= 0) autopick_alter_item(slot, FALSE);
206         }
207         return TRUE;
208 }