6 * @param sval オブジェクトのsval
8 * @param use_charge チャージを消費したかどうかを返す参照ポインタ
9 * @param powerful 強力発動上の処理ならばTRUE
10 * @param magic 魔道具術上の処理ならばTRUE
11 * @return 発動により効果内容が確定したならばTRUEを返す
13 int rod_effect(OBJECT_SUBTYPE_VALUE sval, DIRECTION dir, bool *use_charge, bool powerful, bool magic)
16 PLAYER_LEVEL lev = powerful ? p_ptr->lev * 2 : p_ptr->lev;
17 POSITION detect_rad = powerful ? DETECT_RAD_DEFAULT * 3 / 2 : DETECT_RAD_DEFAULT;
18 POSITION rad = powerful ? 3 : 2;
26 case SV_ROD_DETECT_TRAP:
28 if (detect_traps(detect_rad, (bool)(dir ? FALSE : TRUE))) ident = TRUE;
32 case SV_ROD_DETECT_DOOR:
34 if (detect_doors(detect_rad)) ident = TRUE;
35 if (detect_stairs(detect_rad)) ident = TRUE;
42 if (!identify_fully(FALSE)) *use_charge = FALSE;
45 if (!ident_spell(FALSE)) *use_charge = FALSE;
53 if (!recall_player(p_ptr, randint0(21) + 15)) *use_charge = FALSE;
58 case SV_ROD_ILLUMINATION:
60 if (lite_area(damroll(2, 8), (powerful ? 4 : 2))) ident = TRUE;
66 map_area(powerful ? DETECT_RAD_MAP * 3 / 2 : DETECT_RAD_MAP);
71 case SV_ROD_DETECTION:
73 detect_all(detect_rad);
87 if (true_healing(0)) ident = TRUE;
88 if (set_shero(0, TRUE)) ident = TRUE;
94 if(cure_critical_wounds(powerful ? 750 : 500)) ident = TRUE;
98 case SV_ROD_RESTORATION:
100 if(restore_level()) ident = TRUE;
101 if(restore_all_status()) ident = TRUE;
107 if (set_fast(randint1(30) + (powerful ? 30 : 15), FALSE)) ident = TRUE;
111 case SV_ROD_PESTICIDE:
113 if (dispel_monsters(powerful ? 8 : 4)) ident = TRUE;
117 case SV_ROD_TELEPORT_AWAY:
119 int distance = MAX_SIGHT * (powerful ? 8 : 5);
120 if (teleport_monster(dir, distance)) ident = TRUE;
124 case SV_ROD_DISARMING:
126 if (disarm_trap(dir)) ident = TRUE;
127 if (powerful && disarm_traps_touch()) ident = TRUE;
133 HIT_POINT dam = damroll((powerful ? 12 : 6), 8);
134 msg_print(_("青く輝く光線が放たれた。", "A line of blue shimmering light appears."));
135 (void)lite_line(dir, dam);
140 case SV_ROD_SLEEP_MONSTER:
142 if (sleep_monster(dir, lev)) ident = TRUE;
146 case SV_ROD_SLOW_MONSTER:
148 if (slow_monster(dir, lev)) ident = TRUE;
152 case SV_ROD_HYPODYNAMIA:
154 if (hypodynamic_bolt(dir, 70 + 3 * lev / 2)) ident = TRUE;
158 case SV_ROD_POLYMORPH:
160 if (poly_monster(dir, lev)) ident = TRUE;
164 case SV_ROD_ACID_BOLT:
166 fire_bolt_or_beam(10, GF_ACID, dir, damroll(6 + lev / 7, 8));
171 case SV_ROD_ELEC_BOLT:
173 fire_bolt_or_beam(10, GF_ELEC, dir, damroll(4 + lev / 9, 8));
178 case SV_ROD_FIRE_BOLT:
180 fire_bolt_or_beam(10, GF_FIRE, dir, damroll(7 + lev / 6, 8));
185 case SV_ROD_COLD_BOLT:
187 fire_bolt_or_beam(10, GF_COLD, dir, damroll(5 + lev / 8, 8));
192 case SV_ROD_ACID_BALL:
194 fire_ball(GF_ACID, dir, 60 + lev, rad);
199 case SV_ROD_ELEC_BALL:
201 fire_ball(GF_ELEC, dir, 40 + lev, rad);
206 case SV_ROD_FIRE_BALL:
208 fire_ball(GF_FIRE, dir, 70 + lev, rad);
213 case SV_ROD_COLD_BALL:
215 fire_ball(GF_COLD, dir, 50 + lev, rad);
227 case SV_ROD_STONE_TO_MUD:
229 HIT_POINT dam = powerful ? 40 + randint1(60) : 20 + randint1(30);
230 if (wall_to_mud(dir, dam)) ident = TRUE;
234 case SV_ROD_AGGRAVATE:
236 aggravate_monsters(0);
245 * @brief ロッドを使うコマンドのサブルーチン /
246 * Activate (zap) a Rod
247 * @param item 使うオブジェクトの所持品ID
251 * Unstack fully charged rods as needed.
252 * Hack -- rods of perception/genocide can be "cancelled"
253 * All rods can be cancelled at the "Direction?" prompt
254 * pvals are defined for each rod in k_info. -LM-
257 void do_cmd_zap_rod_aux(INVENTORY_IDX item)
259 int ident, chance, lev, fail;
264 /* Hack -- let perception get aborted */
265 bool use_charge = TRUE;
269 /* Get the item (in the pack) */
272 o_ptr = &inventory[item];
275 /* Get the item (on the floor) */
278 o_ptr = &o_list[0 - item];
282 /* Mega-Hack -- refuse to zap a pile from the ground */
283 if ((item < 0) && (o_ptr->number > 1))
285 msg_print(_("まずはロッドを拾わなければ。", "You must first pick up the rods."));
290 /* Get a direction (unless KNOWN not to need it) */
291 if (((o_ptr->sval >= SV_ROD_MIN_DIRECTION) && (o_ptr->sval != SV_ROD_HAVOC) && (o_ptr->sval != SV_ROD_AGGRAVATE) && (o_ptr->sval != SV_ROD_PESTICIDE)) ||
292 !object_is_aware(o_ptr))
294 /* Get a direction, allow cancel */
295 if (!get_aim_dir(&dir)) return;
299 p_ptr->energy_use = 100;
301 /* Extract the item level */
302 lev = k_info[o_ptr->k_idx].level;
304 /* Base chance of success */
305 chance = p_ptr->skill_dev;
307 /* Confusion hurts skill */
308 if (p_ptr->confused) chance = chance / 2;
311 if (chance > fail) fail -= (chance - fail) * 2;
312 else chance -= (fail - chance) * 2;
313 if (fail < USE_DEVICE) fail = USE_DEVICE;
314 if (chance < USE_DEVICE) chance = USE_DEVICE;
318 if (flush_failure) flush();
319 msg_print(_("止まった時の中ではうまく働かないようだ。", "Nothing happen. Maybe this rod is freezing too."));
324 if (p_ptr->pclass == CLASS_BERSERKER) success = FALSE;
325 else if (chance > fail)
327 if (randint0(chance * 2) < fail) success = FALSE;
332 if (randint0(fail * 2) < chance) success = TRUE;
333 else success = FALSE;
339 if (flush_failure) flush();
340 msg_print(_("うまくロッドを使えなかった。", "You failed to use the rod properly."));
345 k_ptr = &k_info[o_ptr->k_idx];
347 /* A single rod is still charging */
348 if ((o_ptr->number == 1) && (o_ptr->timeout))
350 if (flush_failure) flush();
351 msg_print(_("このロッドはまだ魔力を充填している最中だ。", "The rod is still charging."));
354 /* A stack of rods lacks enough energy. */
355 else if ((o_ptr->number > 1) && (o_ptr->timeout > k_ptr->pval * (o_ptr->number - 1)))
357 if (flush_failure) flush();
358 msg_print(_("そのロッドはまだ充填中です。", "The rods are all still charging."));
364 ident = rod_effect(o_ptr->sval, dir, &use_charge, FALSE, FALSE);
366 /* Increase the timeout by the rod kind's pval. -LM- */
367 if (use_charge) o_ptr->timeout += k_ptr->pval;
369 /* Combine / Reorder the pack (later) */
370 p_ptr->update |= (PU_COMBINE | PU_REORDER);
372 if (!(object_is_aware(o_ptr)))
374 chg_virtue(V_PATIENCE, -1);
375 chg_virtue(V_CHANCE, 1);
376 chg_virtue(V_KNOWLEDGE, -1);
379 /* Tried the object */
382 /* Successfully determined the object function */
383 if (ident && !object_is_aware(o_ptr))
386 gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);
389 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
393 * @brief ロッドを使うコマンドのメインルーチン /
396 void do_cmd_zap_rod(void)
401 if (p_ptr->wild_mode)
406 if (p_ptr->inside_arena)
408 msg_print(_("アリーナが魔法を吸収した!", "The arena absorbs all attempted magic!"));
413 if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
415 set_action(ACTION_NONE);
418 /* Restrict choices to rods */
419 item_tester_tval = TV_ROD;
421 q = _("どのロッドを振りますか? ", "Zap which rod? ");
422 s = _("使えるロッドがない。", "You have no rod to zap.");
424 if (!choose_object(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
427 do_cmd_zap_rod_aux(item);