3 #include "spells-object.h"
4 #include "object-hook.h"
5 #include "player-status.h"
10 OBJECT_TYPE_VALUE tval;
11 OBJECT_SUBTYPE_VALUE sval;
17 * Scatter some "amusing" objects near the player
20 #define AMS_NOTHING 0x00 /* No restriction */
21 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
22 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
23 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
24 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
26 static amuse_type amuse_info[] =
28 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
29 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
30 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
31 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
32 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
33 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
34 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
35 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
36 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
37 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
38 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
39 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
40 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
46 * @brief「弾/矢の製造」処理 / do_cmd_cast calls this function if the player's class is 'archer'.
47 * Hook to determine if an object is contertible in an arrow/bolt
48 * @return 製造を実際に行ったらTRUE、キャンセルしたらFALSEを返す
50 bool create_ammo(void)
59 GAME_TEXT o_name[MAX_NLEN];
64 sprintf(com, _("[S]弾, [A]矢, [B]クロスボウの矢 :", "Create [S]hots, Create [A]rrow or Create [B]olt ?"));
65 else if (p_ptr->lev >= 10)
66 sprintf(com, _("[S]弾, [A]矢:", "Create [S]hots or Create [A]rrow ?"));
68 sprintf(com, _("[S]弾:", "Create [S]hots ?"));
72 msg_print(_("混乱してる!", "You are too confused!"));
78 msg_print(_("目が見えない!", "You are blind!"));
84 if (!get_com(com, &ch, TRUE))
88 if (ch == 'S' || ch == 's')
93 if ((ch == 'A' || ch == 'a') && (p_ptr->lev >= 10))
98 if ((ch == 'B' || ch == 'b') && (p_ptr->lev >= 20))
105 /**********Create shots*********/
112 if (!get_rep_dir(&dir, FALSE)) return FALSE;
113 y = p_ptr->y + ddy[dir];
114 x = p_ptr->x + ddx[dir];
117 if (!have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_CAN_DIG))
119 msg_print(_("そこには岩石がない。", "You need pile of rubble."));
122 else if (!cave_have_flag_grid(c_ptr, FF_CAN_DIG) || !cave_have_flag_grid(c_ptr, FF_HURT_ROCK))
124 msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo."));
131 /* Hack -- Give the player some small firestones */
132 object_prep(q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
133 q_ptr->number = (byte)rand_range(15, 30);
136 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
137 q_ptr->discount = 99;
139 slot = inven_carry(q_ptr);
141 object_desc(o_name, q_ptr, 0);
142 msg_format(_("%sを作った。", "You make some ammo."), o_name);
144 /* Auto-inscription */
145 if (slot >= 0) autopick_alter_item(slot, FALSE);
147 /* Destroy the wall */
148 cave_alter_feat(y, x, FF_HURT_ROCK);
150 p_ptr->update |= (PU_FLOW);
153 /**********Create arrows*********/
160 item_tester_hook = item_tester_hook_convertible;
162 q = _("どのアイテムから作りますか? ", "Convert which item? ");
163 s = _("材料を持っていない。", "You have no item to convert.");
164 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
165 if (!q_ptr) return FALSE;
169 /* Hack -- Give the player some small firestones */
170 object_prep(q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
171 q_ptr->number = (byte)rand_range(5, 10);
174 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
176 q_ptr->discount = 99;
178 object_desc(o_name, q_ptr, 0);
179 msg_format(_("%sを作った。", "You make some ammo."), o_name);
183 inven_item_increase(item, -1);
184 inven_item_describe(item);
185 inven_item_optimize(item);
189 floor_item_increase(0 - item, -1);
190 floor_item_describe(0 - item);
191 floor_item_optimize(0 - item);
194 slot = inven_carry(q_ptr);
196 /* Auto-inscription */
197 if (slot >= 0) autopick_alter_item(slot, FALSE);
199 /**********Create bolts*********/
206 item_tester_hook = item_tester_hook_convertible;
208 q = _("どのアイテムから作りますか? ", "Convert which item? ");
209 s = _("材料を持っていない。", "You have no item to convert.");
211 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
212 if (!q_ptr) return FALSE;
216 /* Hack -- Give the player some small firestones */
217 object_prep(q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
218 q_ptr->number = (byte)rand_range(4, 8);
221 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
223 q_ptr->discount = 99;
225 object_desc(o_name, q_ptr, 0);
226 msg_format(_("%sを作った。", "You make some ammo."), o_name);
230 inven_item_increase(item, -1);
231 inven_item_describe(item);
232 inven_item_optimize(item);
236 floor_item_increase(0 - item, -1);
237 floor_item_describe(0 - item);
238 floor_item_optimize(0 - item);
241 slot = inven_carry(q_ptr);
243 /* Auto-inscription */
244 if (slot >= 0) autopick_alter_item(slot, FALSE);
250 * @brief 魔道具術師の魔力取り込み処理
251 * @return 取り込みを実行したらTRUE、キャンセルしたらFALSEを返す
253 bool import_magic_device(void)
256 PARAMETER_VALUE pval;
260 GAME_TEXT o_name[MAX_NLEN];
262 /* Only accept legal items */
263 item_tester_hook = item_tester_hook_recharge;
265 q = _("どのアイテムの魔力を取り込みますか? ", "Gain power of which item? ");
266 s = _("魔力を取り込めるアイテムがない。", "You have nothing to gain power.");
268 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
269 if (!o_ptr) return (FALSE);
271 if (o_ptr->tval == TV_STAFF && o_ptr->sval == SV_STAFF_NOTHING)
273 msg_print(_("この杖には発動の為の能力は何も備わっていないようだ。", "This staff doesn't have any magical ability."));
277 if (!object_is_known(o_ptr))
279 msg_print(_("鑑定されていないと取り込めない。", "You need to identify before absorbing."));
285 msg_print(_("充填中のアイテムは取り込めない。", "This item is still charging."));
290 if (o_ptr->tval == TV_ROD)
292 else if (o_ptr->tval == TV_WAND)
295 if (o_ptr->tval == TV_ROD)
297 p_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)o_ptr->number;
298 if (p_ptr->magic_num2[o_ptr->sval + ext] > 99) p_ptr->magic_num2[o_ptr->sval + ext] = 99;
303 for (num = o_ptr->number; num; num--)
306 if (o_ptr->tval == TV_WAND) gain_num = (pval + num - 1) / num;
307 if (p_ptr->magic_num2[o_ptr->sval + ext])
310 gain_num = (gain_num / 3 + randint0(gain_num / 3)) / 256;
311 if (gain_num < 1) gain_num = 1;
313 p_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)gain_num;
314 if (p_ptr->magic_num2[o_ptr->sval + ext] > 99) p_ptr->magic_num2[o_ptr->sval + ext] = 99;
315 p_ptr->magic_num1[o_ptr->sval + ext] += pval * 0x10000;
316 if (p_ptr->magic_num1[o_ptr->sval + ext] > 99 * 0x10000) p_ptr->magic_num1[o_ptr->sval + ext] = 99 * 0x10000;
317 if (p_ptr->magic_num1[o_ptr->sval + ext] > p_ptr->magic_num2[o_ptr->sval + ext] * 0x10000) p_ptr->magic_num1[o_ptr->sval + ext] = p_ptr->magic_num2[o_ptr->sval + ext] * 0x10000;
318 if (o_ptr->tval == TV_WAND) pval -= (pval + num - 1) / num;
322 object_desc(o_name, o_ptr, 0);
323 msg_format(_("%sの魔力を取り込んだ。", "You absorb magic of %s."), o_name);
325 /* Eliminate the item (from the pack) */
328 inven_item_increase(item, -999);
329 inven_item_describe(item);
330 inven_item_optimize(item);
333 /* Eliminate the item (from the floor) */
336 floor_item_increase(0 - item, -999);
337 floor_item_describe(0 - item);
338 floor_item_optimize(0 - item);
340 take_turn(p_ptr, 100);;
346 * @param y1 配置したいフロアのY座標
347 * @param x1 配置したいフロアのX座標
349 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
352 void amusement(POSITION y1, POSITION x1, int num, bool known)
355 object_type object_type_body;
358 for (n = 0; amuse_info[n].tval != 0; n++)
360 t += amuse_info[n].prob;
367 KIND_OBJECT_IDX k_idx;
368 ARTIFACT_IDX a_idx = 0;
370 bool insta_art, fixed_art;
374 r -= amuse_info[i].prob;
377 i_ptr = &object_type_body;
379 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
381 /* Paranoia - reroll if nothing */
382 if (!k_idx) continue;
384 /* Search an artifact index if need */
385 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
386 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
388 if (insta_art || fixed_art)
390 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
392 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
393 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
394 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
395 if (a_info[a_idx].cur_num > 0) continue;
399 if (a_idx >= max_a_idx) continue;
402 /* Make an object (if possible) */
403 object_prep(i_ptr, k_idx);
404 if (a_idx) i_ptr->name1 = a_idx;
405 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
407 if (amuse_info[i].flag & AMS_NO_UNIQUE)
409 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
412 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
413 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
421 /* Paranoia - reroll if nothing */
422 if (!(i_ptr->k_idx)) continue;
424 /* Drop the object */
425 (void)drop_near(i_ptr, -1, y1, x1);