4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
11 /* Purpose: Movement commands (part 2) */
19 void do_cmd_go_up(void)
24 cave_type *c_ptr = &cave[py][px];
25 feature_type *f_ptr = &f_info[c_ptr->feat];
29 if (p_ptr->special_defense & KATA_MUSOU)
31 set_action(ACTION_NONE);
35 if (!have_flag(f_ptr->flags, FF_LESS))
38 msg_print("¤³¤³¤Ë¤Ï¾å¤ê³¬Ãʤ¬¸«Åö¤¿¤é¤Ê¤¤¡£");
40 msg_print("I see no up staircase here.");
47 if (have_flag(f_ptr->flags, FF_QUEST))
51 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
52 msg_print("¤Ê¤ó¤À¤³¤Î³¬Ãʤϡª");
54 msg_print("¾å¤Î³¬¤ËÅФä¿¡£");
56 msg_print("You enter the up staircase.");
61 p_ptr->inside_quest = c_ptr->special;
63 /* Activate the quest */
64 if (!quest[p_ptr->inside_quest].status)
66 quest[p_ptr->inside_quest].status = QUEST_STATUS_TAKEN;
70 if (!p_ptr->inside_quest)
76 p_ptr->leaving = TRUE;
91 quest_type *q_ptr = &quest[p_ptr->inside_quest];
93 /* Confirm leaving from once only quest */
94 if (confirm_quest && p_ptr->inside_quest &&
95 (q_ptr->type == QUEST_TYPE_RANDOM ||
96 (q_ptr->flags & QUEST_FLAG_ONCE &&
97 q_ptr->status != QUEST_STATUS_COMPLETED)))
100 msg_print("¤³¤Î³¬¤ò°ìÅÙµî¤ë¤ÈÆóÅÙ¤ÈÌá¤Ã¤ÆÍè¤é¤ì¤Þ¤»¤ó¡£");
101 if (get_check("ËÜÅö¤Ë¤³¤Î³¬¤òµî¤ê¤Þ¤¹¤«¡©")) go_up = TRUE;
103 msg_print("You can't come back here once you leave this floor.");
104 if (get_check("Really leave this floor? ")) go_up = TRUE;
113 /* Cancel the command */
116 /* Hack -- take a turn */
119 if (autosave_l) do_cmd_save_game(TRUE);
121 /* For a random quest */
122 if (p_ptr->inside_quest &&
123 quest[p_ptr->inside_quest].type == QUEST_TYPE_RANDOM)
127 p_ptr->inside_quest = 0;
130 /* For a fixed quest */
131 if (p_ptr->inside_quest &&
132 quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM)
136 p_ptr->inside_quest = c_ptr->special;
141 /* For normal dungeon and random quest */
145 if (have_flag(f_ptr->flags, FF_SHAFT))
147 /* Create a way back */
148 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_UP | CFM_SHAFT);
154 /* Create a way back */
155 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_UP);
160 /* Get out from current dungeon */
161 if (dun_level - up_num < d_info[dungeon_type].mindepth)
166 if (record_stair) do_cmd_write_nikki(NIKKI_STAIR, 0-up_num, "³¬Ãʤò¾å¤Ã¤¿");
168 if (record_stair) do_cmd_write_nikki(NIKKI_STAIR, 0-up_num, "climbed up the stairs to");
173 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
174 msg_print("¤Ê¤ó¤À¤³¤Î³¬Ãʤϡª");
175 else if (up_num == dun_level)
176 msg_print("ÃϾå¤ËÌá¤Ã¤¿¡£");
178 msg_print("³¬Ãʤò¾å¤Ã¤Æ¿·¤¿¤Ê¤ë̵ܤؤȤòƧ¤ßÆþ¤ì¤¿¡£");
180 if (up_num == dun_level)
181 msg_print("You go back to the surface.");
183 msg_print("You enter a maze of up staircases.");
187 p_ptr->leaving = TRUE;
194 void do_cmd_go_down(void)
197 cave_type *c_ptr = &cave[py][px];
198 feature_type *f_ptr = &f_info[c_ptr->feat];
200 bool fall_trap = FALSE;
203 if (p_ptr->special_defense & KATA_MUSOU)
205 set_action(ACTION_NONE);
209 if (!have_flag(f_ptr->flags, FF_MORE))
212 msg_print("¤³¤³¤Ë¤Ï²¼¤ê³¬Ãʤ¬¸«Åö¤¿¤é¤Ê¤¤¡£");
214 msg_print("I see no down staircase here.");
220 if (have_flag(f_ptr->flags, FF_TRAP)) fall_trap = TRUE;
223 if (have_flag(f_ptr->flags, FF_QUEST_ENTER))
228 /* Quest down stairs */
229 else if (have_flag(f_ptr->flags, FF_QUEST))
232 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
233 msg_print("¤Ê¤ó¤À¤³¤Î³¬Ãʤϡª");
235 msg_print("²¼¤Î³¬¤Ë¹ß¤ê¤¿¡£");
237 msg_print("You enter the down staircase.");
243 p_ptr->inside_quest = c_ptr->special;
245 /* Activate the quest */
246 if (!quest[p_ptr->inside_quest].status)
248 quest[p_ptr->inside_quest].status = QUEST_STATUS_TAKEN;
251 /* Leaving a quest */
252 if (!p_ptr->inside_quest)
258 p_ptr->leaving = TRUE;
266 int target_dungeon = 0;
270 target_dungeon = have_flag(f_ptr->flags, FF_ENTRANCE) ? c_ptr->special : DUNGEON_ANGBAND;
272 if (ironman_downward && (target_dungeon != DUNGEON_ANGBAND))
275 msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÆþ¸ý¤ÏºÉ¤¬¤ì¤Æ¤¤¤ë¡ª");
277 msg_print("The entrance of this dungeon is closed!");
281 if (!max_dlv[target_dungeon])
284 msg_format("¤³¤³¤Ë¤Ï%s¤ÎÆþ¤ê¸ý(%d³¬ÁêÅö)¤¬¤¢¤ê¤Þ¤¹", d_name+d_info[target_dungeon].name, d_info[target_dungeon].mindepth);
285 if (!get_check("ËÜÅö¤Ë¤³¤Î¥À¥ó¥¸¥ç¥ó¤ËÆþ¤ê¤Þ¤¹¤«¡©")) return;
287 msg_format("There is the entrance of %s (Danger level: %d)", d_name+d_info[target_dungeon].name, d_info[target_dungeon].mindepth);
288 if (!get_check("Do you really get in this dungeon? ")) return;
292 /* Save old player position */
295 dungeon_type = (byte)target_dungeon;
298 * Clear all saved floors
299 * and create a first saved floor
301 prepare_change_floor_mode(CFM_FIRST_FLOOR);
304 /* Hack -- take a turn */
307 if (autosave_l) do_cmd_save_game(TRUE);
310 if (have_flag(f_ptr->flags, FF_SHAFT)) down_num += 2;
315 /* Enter the dungeon just now */
316 p_ptr->enter_dungeon = TRUE;
317 down_num = d_info[dungeon_type].mindepth;
323 if (fall_trap) do_cmd_write_nikki(NIKKI_STAIR, down_num, "Í¸Í¤ËÍî¤Á¤¿");
324 else do_cmd_write_nikki(NIKKI_STAIR, down_num, "³¬Ãʤò²¼¤ê¤¿");
326 if (fall_trap) do_cmd_write_nikki(NIKKI_STAIR, down_num, "fell through a trap door");
327 else do_cmd_write_nikki(NIKKI_STAIR, down_num, "climbed down the stairs to");
334 msg_print("¤ï¤¶¤ÈÍ¸Í¤ËÍî¤Á¤¿¡£");
336 msg_print("You deliberately jump through the trap door.");
345 msg_format("%s¤ØÆþ¤Ã¤¿¡£", d_text + d_info[dungeon_type].text);
347 msg_format("You entered %s.", d_text + d_info[dungeon_type].text);
353 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
354 msg_print("¤Ê¤ó¤À¤³¤Î³¬Ãʤϡª");
356 msg_print("³¬Ãʤò²¼¤ê¤Æ¿·¤¿¤Ê¤ë̵ܤؤȤòƧ¤ßÆþ¤ì¤¿¡£");
358 msg_print("You enter a maze of down staircases.");
365 p_ptr->leaving = TRUE;
369 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
373 if (have_flag(f_ptr->flags, FF_SHAFT))
375 /* Create a way back */
376 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_DOWN | CFM_SHAFT);
380 /* Create a way back */
381 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_DOWN);
390 * Simple command to "search" for one turn
392 void do_cmd_search(void)
394 /* Allow repeated command */
397 /* Set repeat count */
398 command_rep = command_arg - 1;
400 /* Redraw the state */
401 p_ptr->redraw |= (PR_STATE);
416 * Determine if a grid contains a chest
418 static s16b chest_check(int y, int x)
420 cave_type *c_ptr = &cave[y][x];
422 s16b this_o_idx, next_o_idx = 0;
425 /* Scan all objects in the grid */
426 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
431 o_ptr = &o_list[this_o_idx];
433 /* Acquire next object */
434 next_o_idx = o_ptr->next_o_idx;
436 /* Skip unknown chests XXX XXX */
437 /* if (!o_ptr->marked) continue; */
439 /* Check for chest */
440 if (o_ptr->tval == TV_CHEST) return (this_o_idx);
449 * Allocates objects upon opening a chest -BEN-
451 * Disperse treasures from the given chest, centered at (x,y).
453 * Small chests often contain "gold", while Large chests always contain
454 * items. Wooden chests contain 2 items, Iron chests contain 4 items,
455 * and Steel chests contain 6 items. The "value" of the items in a
456 * chest is based on the "power" of the chest, which is in turn based
457 * on the level on which the chest is generated.
459 static void chest_death(bool scatter, int y, int x, s16b o_idx)
469 object_type *o_ptr = &o_list[o_idx];
472 /* Small chests often hold "gold" */
473 small = (o_ptr->sval < SV_CHEST_MIN_LARGE);
475 /* Determine how much to drop (see above) */
476 number = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2;
478 if (o_ptr->sval == SV_CHEST_KANDUME)
483 object_level = o_ptr->xtra3;
487 /* Determine the "value" of the items */
488 object_level = ABS(o_ptr->pval) + 10;
491 /* Zero pval means empty chest */
492 if (!o_ptr->pval) number = 0;
494 /* Opening a chest */
495 opening_chest = TRUE;
497 /* Drop some objects (non-chests) */
498 for (; number > 0; --number)
500 /* Get local object */
503 /* Wipe the object */
506 /* Small chests often drop gold */
507 if (small && (randint0(100) < 25))
510 if (!make_gold(q_ptr)) continue;
513 /* Otherwise drop an item */
516 /* Make a good object */
517 if (!make_object(q_ptr, mode)) continue;
520 /* If chest scatters its contents, pick any floor square. */
524 for (i = 0; i < 200; i++)
526 /* Pick a totally random spot. */
527 y = randint0(MAX_HGT);
528 x = randint0(MAX_WID);
530 /* Must be an empty floor. */
531 if (!cave_empty_bold(y, x)) continue;
533 /* Place the object there. */
534 drop_near(q_ptr, -1, y, x);
540 /* Normally, drop object near the chest. */
541 else drop_near(q_ptr, -1, y, x);
544 /* Reset the object level */
545 object_level = base_level;
547 /* No longer opening a chest */
548 opening_chest = FALSE;
559 * Chests have traps too.
561 * Exploding chest destroys contents (and traps).
562 * Note that the chest itself is never destroyed.
564 static void chest_trap(int y, int x, s16b o_idx)
568 object_type *o_ptr = &o_list[o_idx];
570 int mon_level = o_ptr->xtra3;
572 /* Ignore disarmed chests */
573 if (o_ptr->pval <= 0) return;
575 /* Obtain the traps */
576 trap = chest_traps[o_ptr->pval];
579 if (trap & (CHEST_LOSE_STR))
582 msg_print("»Å³Ý¤±¤é¤ì¤Æ¤¤¤¿¾®¤µ¤Ê¿Ë¤Ë»É¤µ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
583 take_hit(DAMAGE_NOESCAPE, damroll(1, 4), "ÆÇ¿Ë", -1);
585 msg_print("A small needle has pricked you!");
586 take_hit(DAMAGE_NOESCAPE, damroll(1, 4), "a poison needle", -1);
589 (void)do_dec_stat(A_STR);
592 /* Lose constitution */
593 if (trap & (CHEST_LOSE_CON))
596 msg_print("»Å³Ý¤±¤é¤ì¤Æ¤¤¤¿¾®¤µ¤Ê¿Ë¤Ë»É¤µ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
597 take_hit(DAMAGE_NOESCAPE, damroll(1, 4), "ÆÇ¿Ë", -1);
599 msg_print("A small needle has pricked you!");
600 take_hit(DAMAGE_NOESCAPE, damroll(1, 4), "a poison needle", -1);
603 (void)do_dec_stat(A_CON);
607 if (trap & (CHEST_POISON))
610 msg_print("ÆÍÇ¡¿á¤½Ð¤·¤¿Îп§¤Î¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
612 msg_print("A puff of green gas surrounds you!");
615 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
617 (void)set_poisoned(p_ptr->poisoned + 10 + randint1(20));
622 if (trap & (CHEST_PARALYZE))
625 msg_print("ÆÍÇ¡¿á¤½Ð¤·¤¿²«¿§¤¤¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
627 msg_print("A puff of yellow gas surrounds you!");
631 if (!p_ptr->free_act)
633 (void)set_paralyzed(p_ptr->paralyzed + 10 + randint1(20));
637 /* Summon monsters */
638 if (trap & (CHEST_SUMMON))
640 int num = 2 + randint1(3);
642 msg_print("ÆÍÇ¡¿á¤½Ð¤·¤¿±ì¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
644 msg_print("You are enveloped in a cloud of smoke!");
648 for (i = 0; i < num; i++)
650 if (randint1(100)<dun_level)
651 activate_hi_summon(py, px, FALSE);
653 (void)summon_specific(0, y, x, mon_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
657 /* Elemental summon. */
658 if (trap & (CHEST_E_SUMMON))
661 msg_print("Êõ¤ò¼é¤ë¤¿¤á¤Ë¥¨¥ì¥á¥ó¥¿¥ë¤¬¸½¤ì¤¿¡ª");
663 msg_print("Elemental beings appear to protect their treasures!");
665 for (i = 0; i < randint1(3) + 5; i++)
667 (void)summon_specific(0, y, x, mon_level, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
671 /* Force clouds, then summon birds. */
672 if (trap & (CHEST_BIRD_STORM))
675 msg_print("Ä»¤Î·²¤ì¤¬¤¢¤Ê¤¿¤ò¼è¤ê´¬¤¤¤¿¡ª");
677 msg_print("A storm of birds swirls around you!");
680 for (i = 0; i < randint1(3) + 3; i++)
681 (void)fire_meteor(-1, GF_FORCE, y, x, o_ptr->pval / 5, 7);
683 for (i = 0; i < randint1(5) + o_ptr->pval / 5; i++)
685 (void)summon_specific(0, y, x, mon_level, SUMMON_BIRD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
689 /* Various colorful summonings. */
690 if (trap & (CHEST_H_SUMMON))
696 msg_print("±ê¤Èⲫ¤Î±À¤ÎÃæ¤Ë°Ë⤬»Ñ¤ò¸½¤·¤¿¡ª");
698 msg_print("Demons materialize in clouds of fire and brimstone!");
701 for (i = 0; i < randint1(3) + 2; i++)
703 (void)fire_meteor(-1, GF_FIRE, y, x, 10, 5);
704 (void)summon_specific(0, y, x, mon_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
708 /* Summon dragons. */
712 msg_print("°Å°Ç¤Ë¥É¥é¥´¥ó¤Î±Æ¤¬¤Ü¤ó¤ä¤ê¤È¸½¤ì¤¿¡ª");
714 msg_print("Draconic forms loom out of the darkness!");
717 for (i = 0; i < randint1(3) + 2; i++)
719 (void)summon_specific(0, y, x, mon_level, SUMMON_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
723 /* Summon hybrids. */
727 msg_print("´ñ̯¤Ê»Ñ¤Î²øʪ¤¬½±¤Ã¤ÆÍ褿¡ª");
729 msg_print("Creatures strange and twisted assault you!");
732 for (i = 0; i < randint1(5) + 3; i++)
734 (void)summon_specific(0, y, x, mon_level, SUMMON_HYBRID, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
738 /* Summon vortices (scattered) */
742 msg_print("±²´¬¤«¹çÂΤ·¡¢ÇËÎö¤·¤¿¡ª");
744 msg_print("Vortices coalesce and wreak destruction!");
747 for (i = 0; i < randint1(3) + 2; i++)
749 (void)summon_specific(0, y, x, mon_level, SUMMON_VORTEX, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
755 if ((trap & (CHEST_RUNES_OF_EVIL)) && o_ptr->k_idx)
757 /* Determine how many nasty tricks can be played. */
758 int nasty_tricks_count = 4 + randint0(3);
762 msg_print("¶²¤·¤¤À¼¤¬¶Á¤¤¤¿: ¡Ö°Å°Ç¤¬Æò¤ò¤Ä¤Ä¤Þ¤ó¡ª¡×");
764 msg_print("Hideous voices bid: 'Let the darkness have thee!'");
767 /* This is gonna hurt... */
768 for (; nasty_tricks_count > 0; nasty_tricks_count--)
770 /* ...but a high saving throw does help a little. */
771 if (randint1(100+o_ptr->pval*2) > p_ptr->skill_sav)
774 if (one_in_(6)) take_hit(DAMAGE_NOESCAPE, damroll(5, 20), "ÇËÌǤΥȥé¥Ã¥×¤ÎÊõÈ¢", -1);
776 if (one_in_(6)) take_hit(DAMAGE_NOESCAPE, damroll(5, 20), "a chest dispel-player trap", -1);
778 else if (one_in_(5)) (void)set_cut(p_ptr->cut + 200);
781 if (!p_ptr->free_act)
782 (void)set_paralyzed(p_ptr->paralyzed + 2 +
785 (void)set_stun(p_ptr->stun + 10 +
788 else if (one_in_(3)) apply_disenchant(0);
791 (void)do_dec_stat(A_STR);
792 (void)do_dec_stat(A_DEX);
793 (void)do_dec_stat(A_CON);
794 (void)do_dec_stat(A_INT);
795 (void)do_dec_stat(A_WIS);
796 (void)do_dec_stat(A_CHR);
798 else (void)fire_meteor(-1, GF_NETHER, y, x, 150, 1);
803 /* Aggravate monsters. */
804 if (trap & (CHEST_ALARM))
807 msg_print("¤±¤¿¤¿¤Þ¤·¤¤²»¤¬ÌĤê¶Á¤¤¤¿¡ª");
809 msg_print("An alarm sounds!");
811 aggravate_monsters(0);
815 if ((trap & (CHEST_EXPLODE)) && o_ptr->k_idx)
818 msg_print("ÆÍÁ³¡¢È¢¤¬Çúȯ¤·¤¿¡ª");
819 msg_print("È¢¤ÎÃæ¤Îʪ¤Ï¤¹¤Ù¤ÆÊ´¡¹¤ËºÕ¤±»¶¤Ã¤¿¡ª");
821 msg_print("There is a sudden explosion!");
822 msg_print("Everything inside the chest is destroyed!");
826 sound(SOUND_EXPLODE);
828 take_hit(DAMAGE_ATTACK, damroll(5, 8), "Çúȯ¤¹¤ëÈ¢", -1);
830 take_hit(DAMAGE_ATTACK, damroll(5, 8), "an exploding chest", -1);
834 /* Scatter contents. */
835 if ((trap & (CHEST_SCATTER)) && o_ptr->k_idx)
838 msg_print("ÊõÈ¢¤ÎÃæ¿È¤Ï¥À¥ó¥¸¥ç¥ó¤¸¤å¤¦¤Ë»¶Í𤷤¿¡ª");
840 msg_print("The contents of the chest scatter all over the dungeon!");
842 chest_death(TRUE, y, x, o_idx);
849 * Attempt to open the given chest at the given location
851 * Assume there is no monster blocking the destination
853 * Returns TRUE if repeated commands may continue
855 static bool do_cmd_open_chest(int y, int x, s16b o_idx)
863 object_type *o_ptr = &o_list[o_idx];
869 /* Attempt to unlock it */
872 /* Assume locked, and thus not open */
875 /* Get the "disarm" factor */
876 i = p_ptr->skill_dis;
878 /* Penalize some conditions */
879 if (p_ptr->blind || no_lite()) i = i / 10;
880 if (p_ptr->confused || p_ptr->image) i = i / 10;
882 /* Extract the difficulty */
885 /* Always have a small chance of success */
888 /* Success -- May still have traps */
889 if (randint0(100) < j)
892 msg_print("¸°¤ò¤Ï¤º¤·¤¿¡£");
894 msg_print("You have picked the lock.");
901 /* Failure -- Keep trying */
904 /* We may continue repeating */
906 if (flush_failure) flush();
908 msg_print("¸°¤ò¤Ï¤º¤»¤Ê¤«¤Ã¤¿¡£");
910 msg_print("You failed to pick the lock.");
916 /* Allowed to open */
919 /* Apply chest traps, if any */
920 chest_trap(y, x, o_idx);
922 /* Let the Chest drop items */
923 chest_death(FALSE, y, x, o_idx);
931 #if defined(ALLOW_EASY_OPEN) || defined(ALLOW_EASY_DISARM) /* TNB */
934 * Return TRUE if the given feature is an open door
936 static bool is_open(int feat)
938 return have_flag(f_info[feat].flags, FF_CLOSE) && (feat != feat_state(feat, FF_CLOSE));
943 * Return the number of features around (or under) the character.
944 * Usually look for doors and floor traps.
946 static int count_dt(int *y, int *x, bool (*test)(int feat), bool under)
948 int d, count, xx, yy;
950 /* Count how many matches */
953 /* Check around (and under) the character */
954 for (d = 0; d < 9; d++)
959 /* if not searching under player continue */
960 if ((d == 8) && !under) continue;
962 /* Extract adjacent (legal) location */
963 yy = py + ddy_ddd[d];
964 xx = px + ddx_ddd[d];
967 c_ptr = &cave[yy][xx];
969 /* Must have knowledge */
970 if (!(c_ptr->info & (CAVE_MARK))) continue;
972 /* Feature code (applying "mimic" field) */
973 feat = get_feat_mimic(c_ptr);
975 /* Not looking for this feature */
976 if (!((*test)(feat))) continue;
981 /* Remember the location. Only useful if only one match */
992 * Return the number of chests around (or under) the character.
993 * If requested, count only trapped chests.
995 static int count_chests(int *y, int *x, bool trapped)
1001 /* Count how many matches */
1004 /* Check around (and under) the character */
1005 for (d = 0; d < 9; d++)
1007 /* Extract adjacent (legal) location */
1008 int yy = py + ddy_ddd[d];
1009 int xx = px + ddx_ddd[d];
1011 /* No (visible) chest is there */
1012 if ((o_idx = chest_check(yy, xx)) == 0) continue;
1014 /* Grab the object */
1015 o_ptr = &o_list[o_idx];
1018 if (o_ptr->pval == 0) continue;
1020 /* No (known) traps here */
1021 if (trapped && (!object_is_known(o_ptr) ||
1022 !chest_traps[o_ptr->pval])) continue;
1027 /* Remember the location. Only useful if only one match */
1038 * Convert an adjacent location to a direction.
1040 static int coords_to_dir(int y, int x)
1042 int d[3][3] = { {7, 4, 1}, {8, 5, 2}, {9, 6, 3} };
1049 if (ABS(dx) > 1 || ABS(dy) > 1) return (0);
1051 return d[dx + 1][dy + 1];
1054 #endif /* defined(ALLOW_EASY_OPEN) || defined(ALLOW_EASY_DISARM) -- TNB */
1058 * Perform the basic "open" command on doors
1060 * Assume destination is a closed/locked/jammed door
1062 * Assume there is no monster blocking the destination
1064 * Returns TRUE if repeated commands may continue
1066 static bool do_cmd_open_aux(int y, int x)
1070 /* Get requested grid */
1071 cave_type *c_ptr = &cave[y][x];
1073 feature_type *f_ptr = &f_info[c_ptr->feat];
1081 /* Seeing true feature code (ignore mimic) */
1084 if (!have_flag(f_ptr->flags, FF_OPEN))
1088 msg_format("%s¤Ï¤¬¤Ã¤Á¤ê¤ÈÊĤ¸¤é¤ì¤Æ¤¤¤ë¤è¤¦¤À¡£", f_name + f_info[get_feat_mimic(c_ptr)].name);
1090 msg_format("The %s appears to be stuck.", f_name + f_info[get_feat_mimic(c_ptr)].name);
1096 else if (f_ptr->power)
1099 i = p_ptr->skill_dis;
1101 /* Penalize some conditions */
1102 if (p_ptr->blind || no_lite()) i = i / 10;
1103 if (p_ptr->confused || p_ptr->image) i = i / 10;
1105 /* Extract the lock power */
1108 /* Extract the difficulty XXX XXX XXX */
1111 /* Always have a small chance of success */
1115 if (randint0(100) < j)
1119 msg_print("¸°¤ò¤Ï¤º¤·¤¿¡£");
1121 msg_print("You have picked the lock.");
1125 cave_alter_feat(y, x, FF_OPEN);
1127 /* Update some things */
1128 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
1131 sound(SOUND_OPENDOOR);
1141 if (flush_failure) flush();
1145 msg_print("¸°¤ò¤Ï¤º¤»¤Ê¤«¤Ã¤¿¡£");
1147 msg_print("You failed to pick the lock.");
1151 /* We may keep trying */
1160 cave_alter_feat(y, x, FF_OPEN);
1162 /* Update some things */
1163 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
1166 sound(SOUND_OPENDOOR);
1176 * Open a closed/locked/jammed door or a closed/locked chest.
1178 * Unlocking a locked door/chest is worth one experience point.
1180 void do_cmd_open(void)
1188 if (p_ptr->special_defense & KATA_MUSOU)
1190 set_action(ACTION_NONE);
1193 #ifdef ALLOW_EASY_OPEN /* TNB */
1195 /* Option: Pick a direction */
1198 int num_doors, num_chests;
1200 /* Count closed doors (locked or jammed) */
1201 num_doors = count_dt(&y, &x, is_closed_door, FALSE);
1203 /* Count chests (locked) */
1204 num_chests = count_chests(&y, &x, FALSE);
1206 /* See if only one target */
1207 if (num_doors || num_chests)
1209 bool too_many = (num_doors && num_chests) || (num_doors > 1) ||
1211 if (!too_many) command_dir = coords_to_dir(y, x);
1215 #endif /* ALLOW_EASY_OPEN -- TNB */
1217 /* Allow repeated command */
1220 /* Set repeat count */
1221 command_rep = command_arg - 1;
1223 /* Redraw the state */
1224 p_ptr->redraw |= (PR_STATE);
1226 /* Cancel the arg */
1230 /* Get a "repeated" direction */
1231 if (get_rep_dir(&dir, TRUE))
1236 /* Get requested location */
1240 /* Get requested grid */
1241 c_ptr = &cave[y][x];
1243 /* Feature code (applying "mimic" field) */
1244 feat = get_feat_mimic(c_ptr);
1246 /* Check for chest */
1247 o_idx = chest_check(y, x);
1249 /* Nothing useful */
1250 if (!have_flag(f_info[feat].flags, FF_OPEN) && !o_idx)
1254 msg_print("¤½¤³¤Ë¤Ï³«¤±¤ë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
1256 msg_print("You see nothing there to open.");
1261 /* Monster in the way */
1262 else if (c_ptr->m_idx && p_ptr->riding != c_ptr->m_idx)
1269 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
1271 msg_print("There is a monster in the way!");
1282 /* Open the chest */
1283 more = do_cmd_open_chest(y, x, o_idx);
1290 more = do_cmd_open_aux(y, x);
1294 /* Cancel repeat unless we may continue */
1295 if (!more) disturb(0, 0);
1301 * Perform the basic "close" command
1303 * Assume destination is an open/broken door
1305 * Assume there is no monster blocking the destination
1307 * Returns TRUE if repeated commands may continue
1309 static bool do_cmd_close_aux(int y, int x)
1311 /* Get grid and contents */
1312 cave_type *c_ptr = &cave[y][x];
1313 s16b old_feat = c_ptr->feat;
1319 /* Seeing true feature code (ignore mimic) */
1322 if (have_flag(f_info[old_feat].flags, FF_CLOSE))
1324 s16b closed_feat = feat_state(old_feat, FF_CLOSE);
1326 /* Hack -- object in the way */
1327 if ((c_ptr->o_idx || (c_ptr->info & CAVE_OBJECT)) &&
1328 (closed_feat != old_feat) && !have_flag(f_info[closed_feat].flags, FF_DROP))
1332 msg_print("²¿¤«¤¬¤Ä¤Ã¤«¤¨¤ÆÊĤޤé¤Ê¤¤¡£");
1334 msg_print("There seems stuck.");
1339 /* Close the door */
1340 cave_alter_feat(y, x, FF_CLOSE);
1343 if (old_feat == c_ptr->feat)
1347 msg_print("¥É¥¢¤Ï²õ¤ì¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¡£");
1349 msg_print("The door appears to be broken.");
1354 /* Update some things */
1355 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
1358 sound(SOUND_SHUTDOOR);
1369 * Close an open door.
1371 void do_cmd_close(void)
1377 if (p_ptr->special_defense & KATA_MUSOU)
1379 set_action(ACTION_NONE);
1382 #ifdef ALLOW_EASY_OPEN /* TNB */
1384 /* Option: Pick a direction */
1387 /* Count open doors */
1388 if (count_dt(&y, &x, is_open, FALSE) == 1)
1390 command_dir = coords_to_dir(y, x);
1394 #endif /* ALLOW_EASY_OPEN -- TNB */
1396 /* Allow repeated command */
1399 /* Set repeat count */
1400 command_rep = command_arg - 1;
1402 /* Redraw the state */
1403 p_ptr->redraw |= (PR_STATE);
1405 /* Cancel the arg */
1409 /* Get a "repeated" direction */
1410 if (get_rep_dir(&dir,FALSE))
1415 /* Get requested location */
1419 /* Get grid and contents */
1420 c_ptr = &cave[y][x];
1422 /* Feature code (applying "mimic" field) */
1423 feat = get_feat_mimic(c_ptr);
1425 /* Require open/broken door */
1426 if (!have_flag(f_info[feat].flags, FF_CLOSE))
1430 msg_print("¤½¤³¤Ë¤ÏÊĤ¸¤ë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
1432 msg_print("You see nothing there to close.");
1436 /* Monster in the way */
1437 else if (c_ptr->m_idx)
1444 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
1446 msg_print("There is a monster in the way!");
1453 /* Close the door */
1456 /* Close the door */
1457 more = do_cmd_close_aux(y, x);
1461 /* Cancel repeat unless we may continue */
1462 if (!more) disturb(0, 0);
1467 * Determine if a given grid may be "tunneled"
1469 static bool do_cmd_tunnel_test(int y, int x)
1471 cave_type *c_ptr = &cave[y][x];
1473 /* Must have knowledge */
1474 if (!(c_ptr->info & CAVE_MARK))
1478 msg_print("¤½¤³¤Ë¤Ï²¿¤â¸«Åö¤¿¤é¤Ê¤¤¡£");
1480 msg_print("You see nothing there.");
1487 /* Must be a wall/door/etc */
1488 if (!cave_have_flag_grid(c_ptr, FF_TUNNEL))
1492 msg_print("¤½¤³¤Ë¤Ï·¡¤ë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
1494 msg_print("You see nothing there to tunnel.");
1507 * Perform the basic "tunnel" command
1509 * Assumes that no monster is blocking the destination
1511 * Do not use twall anymore
1513 * Returns TRUE if repeated commands may continue
1515 static bool do_cmd_tunnel_aux(int y, int x)
1518 feature_type *f_ptr, *mimic_f_ptr;
1523 /* Verify legality */
1524 if (!do_cmd_tunnel_test(y, x)) return (FALSE);
1530 c_ptr = &cave[y][x];
1531 f_ptr = &f_info[c_ptr->feat];
1532 power = f_ptr->power;
1534 /* Feature code (applying "mimic" field) */
1535 mimic_f_ptr = &f_info[get_feat_mimic(c_ptr)];
1537 name = f_name + mimic_f_ptr->name;
1542 if (have_flag(f_ptr->flags, FF_PERMANENT))
1545 if (have_flag(mimic_f_ptr->flags, FF_PERMANENT))
1548 msg_print("¤³¤Î´ä¤Ï¹Å¤¹¤®¤Æ·¡¤ì¤Ê¤¤¤è¤¦¤À¡£");
1550 msg_print("This seems to be permanent rock.");
1554 /* Map border (mimiccing Permanent wall) */
1558 msg_print("¤½¤³¤Ï·¡¤ì¤Ê¤¤!");
1560 msg_print("You can't tunnel through that!");
1566 else if (have_flag(f_ptr->flags, FF_CAN_DIG))
1569 if (p_ptr->skill_dig > randint0(20 * power))
1573 msg_format("%s¤ò¤¯¤º¤·¤¿¡£", name);
1575 msg_format("You have removed the %s.", name);
1578 /* Remove the feature */
1579 cave_alter_feat(y, x, FF_TUNNEL);
1581 /* Update some things */
1582 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
1586 /* Message, keep digging */
1588 msg_format("%s¤ò¤¯¤º¤·¤Æ¤¤¤ë¡£", name);
1590 msg_format("You dig into the %s.", name);
1599 bool tree = have_flag(mimic_f_ptr->flags, FF_TREE);
1602 if (p_ptr->skill_dig > power + randint0(40 * power))
1605 if (tree) msg_format("%s¤òÀÚ¤êʧ¤Ã¤¿¡£", name);
1606 else msg_print("·ê¤ò·¡¤ê½ª¤¨¤¿¡£");
1608 if (tree) msg_format("You have cleared away the %s.", name);
1609 else msg_print("You have finished the tunnel.");
1612 /* Remove the feature */
1613 cave_alter_feat(y, x, FF_TUNNEL);
1615 /* Update some things */
1616 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
1618 chg_virtue(V_DILIGENCE, 1);
1619 chg_virtue(V_NATURE, -1);
1627 /* We may continue chopping */
1629 msg_format("%s¤òÀڤäƤ¤¤ë¡£", name);
1631 msg_format("You chop away at the %s.", name);
1633 /* Occasional Search XXX XXX */
1634 if (randint0(100) < 25) search();
1638 /* We may continue tunelling */
1640 msg_format("%s¤Ë·ê¤ò·¡¤Ã¤Æ¤¤¤ë¡£", name);
1642 msg_format("You tunnel into the %s.", name);
1650 if (is_hidden_door(c_ptr))
1652 /* Occasional Search XXX XXX */
1653 if (randint0(100) < 25) search();
1662 * Tunnels through "walls" (including rubble and closed doors)
1664 * Note that you must tunnel in order to hit invisible monsters
1665 * in walls, though moving into walls still takes a turn anyway.
1667 * Digging is very difficult without a "digger" weapon, but can be
1668 * accomplished by strong players using heavy weapons.
1670 void do_cmd_tunnel(void)
1680 if (p_ptr->special_defense & KATA_MUSOU)
1682 set_action(ACTION_NONE);
1685 /* Allow repeated command */
1688 /* Set repeat count */
1689 command_rep = command_arg - 1;
1691 /* Redraw the state */
1692 p_ptr->redraw |= (PR_STATE);
1694 /* Cancel the arg */
1698 /* Get a direction to tunnel, or Abort */
1699 if (get_rep_dir(&dir,FALSE))
1706 c_ptr = &cave[y][x];
1708 /* Feature code (applying "mimic" field) */
1709 feat = get_feat_mimic(c_ptr);
1711 /* No tunnelling through doors */
1712 if (have_flag(f_info[feat].flags, FF_DOOR))
1716 msg_print("¥É¥¢¤Ï·¡¤ì¤Ê¤¤¡£");
1718 msg_print("You cannot tunnel through doors.");
1722 /* No tunnelling through most features */
1723 else if (!have_flag(f_info[feat].flags, FF_TUNNEL))
1726 msg_print("¤½¤³¤Ï·¡¤ì¤Ê¤¤¡£");
1728 msg_print("You can't tunnel through that.");
1732 /* A monster is in the way */
1733 else if (c_ptr->m_idx)
1740 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
1742 msg_print("There is a monster in the way!");
1752 /* Tunnel through walls */
1753 more = do_cmd_tunnel_aux(y, x);
1757 /* Cancel repetition unless we can continue */
1758 if (!more) disturb(0, 0);
1762 #ifdef ALLOW_EASY_OPEN /* TNB */
1767 * If there is a jammed/closed/locked door at the given location,
1768 * then attempt to unlock/open it. Return TRUE if an attempt was
1769 * made (successful or not), otherwise return FALSE.
1771 * The code here should be nearly identical to that in
1772 * do_cmd_open_test() and do_cmd_open_aux().
1774 bool easy_open_door(int y, int x)
1778 cave_type *c_ptr = &cave[y][x];
1779 feature_type *f_ptr = &f_info[c_ptr->feat];
1781 /* Must be a closed door */
1782 if (!is_closed_door(c_ptr->feat))
1789 if (!have_flag(f_ptr->flags, FF_OPEN))
1793 msg_format("%s¤Ï¤¬¤Ã¤Á¤ê¤ÈÊĤ¸¤é¤ì¤Æ¤¤¤ë¤è¤¦¤À¡£", f_name + f_info[get_feat_mimic(c_ptr)].name);
1795 msg_format("The %s appears to be stuck.", f_name + f_info[get_feat_mimic(c_ptr)].name);
1801 else if (f_ptr->power)
1804 i = p_ptr->skill_dis;
1806 /* Penalize some conditions */
1807 if (p_ptr->blind || no_lite()) i = i / 10;
1808 if (p_ptr->confused || p_ptr->image) i = i / 10;
1810 /* Extract the lock power */
1813 /* Extract the difficulty XXX XXX XXX */
1816 /* Always have a small chance of success */
1820 if (randint0(100) < j)
1824 msg_print("¸°¤ò¤Ï¤º¤·¤¿¡£");
1826 msg_print("You have picked the lock.");
1831 cave_alter_feat(y, x, FF_OPEN);
1833 /* Update some things */
1834 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
1837 sound(SOUND_OPENDOOR);
1847 if (flush_failure) flush();
1851 msg_print("¸°¤ò¤Ï¤º¤»¤Ê¤«¤Ã¤¿¡£");
1853 msg_print("You failed to pick the lock.");
1863 cave_alter_feat(y, x, FF_OPEN);
1865 /* Update some things */
1866 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
1869 sound(SOUND_OPENDOOR);
1876 #endif /* ALLOW_EASY_OPEN -- TNB */
1880 * Perform the basic "disarm" command
1882 * Assume destination is a visible trap
1884 * Assume there is no monster blocking the destination
1886 * Returns TRUE if repeated commands may continue
1888 static bool do_cmd_disarm_chest(int y, int x, s16b o_idx)
1894 object_type *o_ptr = &o_list[o_idx];
1900 /* Get the "disarm" factor */
1901 i = p_ptr->skill_dis;
1903 /* Penalize some conditions */
1904 if (p_ptr->blind || no_lite()) i = i / 10;
1905 if (p_ptr->confused || p_ptr->image) i = i / 10;
1907 /* Extract the difficulty */
1908 j = i - o_ptr->pval;
1910 /* Always have a small chance of success */
1913 /* Must find the trap first. */
1914 if (!object_is_known(o_ptr))
1917 msg_print("¥È¥é¥Ã¥×¤¬¸«¤¢¤¿¤é¤Ê¤¤¡£");
1919 msg_print("I don't see any traps.");
1924 /* Already disarmed/unlocked */
1925 else if (o_ptr->pval <= 0)
1928 msg_print("È¢¤Ë¤Ï¥È¥é¥Ã¥×¤¬»Å³Ý¤±¤é¤ì¤Æ¤¤¤Ê¤¤¡£");
1930 msg_print("The chest is not trapped.");
1935 /* No traps to find. */
1936 else if (!chest_traps[o_ptr->pval])
1939 msg_print("È¢¤Ë¤Ï¥È¥é¥Ã¥×¤¬»Å³Ý¤±¤é¤ì¤Æ¤¤¤Ê¤¤¡£");
1941 msg_print("The chest is not trapped.");
1946 /* Success (get a lot of experience) */
1947 else if (randint0(100) < j)
1950 msg_print("È¢¤Ë»Å³Ý¤±¤é¤ì¤Æ¤¤¤¿¥È¥é¥Ã¥×¤ò²ò½ü¤·¤¿¡£");
1952 msg_print("You have disarmed the chest.");
1955 gain_exp(o_ptr->pval);
1956 o_ptr->pval = (0 - o_ptr->pval);
1959 /* Failure -- Keep trying */
1960 else if ((i > 5) && (randint1(i) > 5))
1962 /* We may keep trying */
1964 if (flush_failure) flush();
1966 msg_print("È¢¤Î¥È¥é¥Ã¥×²ò½ü¤Ë¼ºÇÔ¤·¤¿¡£");
1968 msg_print("You failed to disarm the chest.");
1973 /* Failure -- Set off the trap */
1977 msg_print("¥È¥é¥Ã¥×¤òºîÆ°¤µ¤»¤Æ¤·¤Þ¤Ã¤¿¡ª");
1979 msg_print("You set off a trap!");
1983 chest_trap(y, x, o_idx);
1992 * Perform the basic "disarm" command
1994 * Assume destination is a visible trap
1996 * Assume there is no monster blocking the destination
1998 * Returns TRUE if repeated commands may continue
2000 #ifdef ALLOW_EASY_DISARM /* TNB */
2002 bool do_cmd_disarm_aux(int y, int x, int dir)
2004 #else /* ALLOW_EASY_DISARM -- TNB */
2006 static bool do_cmd_disarm_aux(int y, int x, int dir)
2008 #endif /* ALLOW_EASY_DISARM -- TNB */
2010 /* Get grid and contents */
2011 cave_type *c_ptr = &cave[y][x];
2014 feature_type *f_ptr = &f_info[c_ptr->feat];
2016 /* Access trap name */
2017 cptr name = (f_name + f_ptr->name);
2019 /* Extract trap "power" */
2020 int power = f_ptr->power;
2024 /* Get the "disarm" factor */
2025 int i = p_ptr->skill_dis;
2032 /* Penalize some conditions */
2033 if (p_ptr->blind || no_lite()) i = i / 10;
2034 if (p_ptr->confused || p_ptr->image) i = i / 10;
2036 /* Extract the difficulty */
2039 /* Always have a small chance of success */
2043 if (randint0(100) < j)
2047 msg_format("%s¤ò²ò½ü¤·¤¿¡£", name);
2049 msg_format("You have disarmed the %s.", name);
2055 /* Remove the trap */
2056 cave_alter_feat(y, x, FF_DISARM);
2058 #ifdef ALLOW_EASY_DISARM /* TNB */
2060 /* Move the player onto the trap */
2061 move_player(dir, easy_disarm, FALSE);
2063 #else /* ALLOW_EASY_DISARM -- TNB */
2065 /* move the player onto the trap grid */
2066 move_player(dir, FALSE, FALSE);
2068 #endif /* ALLOW_EASY_DISARM -- TNB */
2071 /* Failure -- Keep trying */
2072 else if ((i > 5) && (randint1(i) > 5))
2075 if (flush_failure) flush();
2079 msg_format("%s¤Î²ò½ü¤Ë¼ºÇÔ¤·¤¿¡£", name);
2081 msg_format("You failed to disarm the %s.", name);
2084 /* We may keep trying */
2088 /* Failure -- Set off the trap */
2093 msg_format("%s¤òºîÆ°¤µ¤»¤Æ¤·¤Þ¤Ã¤¿¡ª", name);
2095 msg_format("You set off the %s!", name);
2098 #ifdef ALLOW_EASY_DISARM /* TNB */
2100 /* Move the player onto the trap */
2101 move_player(dir, easy_disarm, FALSE);
2103 #else /* ALLOW_EASY_DISARM -- TNB */
2105 /* Move the player onto the trap */
2106 move_player(dir, FALSE, FALSE);
2108 #endif /* ALLOW_EASY_DISARM -- TNB */
2117 * Disarms a trap, or chest
2119 void do_cmd_disarm(void)
2127 if (p_ptr->special_defense & KATA_MUSOU)
2129 set_action(ACTION_NONE);
2132 #ifdef ALLOW_EASY_DISARM /* TNB */
2134 /* Option: Pick a direction */
2137 int num_traps, num_chests;
2139 /* Count visible traps */
2140 num_traps = count_dt(&y, &x, is_trap, TRUE);
2142 /* Count chests (trapped) */
2143 num_chests = count_chests(&y, &x, TRUE);
2145 /* See if only one target */
2146 if (num_traps || num_chests)
2148 bool too_many = (num_traps && num_chests) || (num_traps > 1) ||
2150 if (!too_many) command_dir = coords_to_dir(y, x);
2154 #endif /* ALLOW_EASY_DISARM -- TNB */
2156 /* Allow repeated command */
2159 /* Set repeat count */
2160 command_rep = command_arg - 1;
2162 /* Redraw the state */
2163 p_ptr->redraw |= (PR_STATE);
2165 /* Cancel the arg */
2169 /* Get a direction (or abort) */
2170 if (get_rep_dir(&dir,TRUE))
2179 /* Get grid and contents */
2180 c_ptr = &cave[y][x];
2182 /* Feature code (applying "mimic" field) */
2183 feat = get_feat_mimic(c_ptr);
2185 /* Check for chests */
2186 o_idx = chest_check(y, x);
2189 if (!is_trap(feat) && !o_idx)
2193 msg_print("¤½¤³¤Ë¤Ï²ò½ü¤¹¤ë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
2195 msg_print("You see nothing there to disarm.");
2200 /* Monster in the way */
2201 else if (c_ptr->m_idx && p_ptr->riding != c_ptr->m_idx)
2205 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
2207 msg_print("There is a monster in the way!");
2218 /* Disarm the chest */
2219 more = do_cmd_disarm_chest(y, x, o_idx);
2225 /* Disarm the trap */
2226 more = do_cmd_disarm_aux(y, x, dir);
2230 /* Cancel repeat unless told not to */
2231 if (!more) disturb(0, 0);
2236 * Perform the basic "bash" command
2238 * Assume destination is a closed/locked/jammed door
2240 * Assume there is no monster blocking the destination
2242 * Returns TRUE if repeated commands may continue
2244 static bool do_cmd_bash_aux(int y, int x, int dir)
2247 cave_type *c_ptr = &cave[y][x];
2249 /* Hack -- Bash power based on strength */
2250 /* (Ranges from 3 to 20 to 100 to 200) */
2251 int bash = adj_str_blow[p_ptr->stat_ind[A_STR]];
2253 /* Extract door power */
2254 int temp = f_info[c_ptr->feat].power;
2258 cptr name = f_name + f_info[get_feat_mimic(c_ptr)].name;
2265 msg_format("%s¤ËÂÎÅö¤¿¤ê¤ò¤·¤¿¡ª", name);
2267 msg_format("You smash into the %s!", name);
2270 /* Compare bash power to door power XXX XXX XXX */
2271 temp = (bash - (temp * 10));
2273 if (p_ptr->pclass == CLASS_BERSERKER) temp *= 2;
2275 /* Hack -- always have a chance */
2276 if (temp < 1) temp = 1;
2278 /* Hack -- attempt to bash down the door */
2279 if (randint0(100) < temp)
2283 msg_format("%s¤ò²õ¤·¤¿¡ª", name);
2285 msg_format("The %s crashes open!", name);
2289 /* Break down the door */
2290 if ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat))
2292 cave_alter_feat(y, x, FF_BASH);
2298 cave_alter_feat(y, x, FF_OPEN);
2302 sound(SOUND_OPENDOOR);
2304 /* Hack -- Fall through the door */
2305 move_player(dir, FALSE, FALSE);
2307 /* Update some things */
2308 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
2309 p_ptr->update |= (PU_DISTANCE);
2312 /* Saving throw against stun */
2313 else if (randint0(100) < adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2318 msg_format("¤³¤Î%s¤Ï´è¾æ¤À¡£", name);
2320 msg_format("The %s holds firm.", name);
2324 /* Allow repeated bashing */
2328 /* High dexterity yields coolness */
2333 msg_print("ÂΤΥХé¥ó¥¹¤ò¤¯¤º¤·¤Æ¤·¤Þ¤Ã¤¿¡£");
2335 msg_print("You are off-balance.");
2339 /* Hack -- Lose balance ala paralysis */
2340 (void)set_paralyzed(p_ptr->paralyzed + 2 + randint0(2));
2349 * Bash open a door, success based on character strength
2351 * For a closed door, pval is positive if locked; negative if stuck.
2353 * For an open door, pval is positive for a broken door.
2355 * A closed door can be opened - harder if locked. Any door might be
2356 * bashed open (and thereby broken). Bashing a door is (potentially)
2357 * faster! You move into the door way. To open a stuck door, it must
2358 * be bashed. A closed door can be jammed (see do_cmd_spike()).
2360 * Creatures can also open or bash doors, see elsewhere.
2362 void do_cmd_bash(void)
2371 if (p_ptr->special_defense & KATA_MUSOU)
2373 set_action(ACTION_NONE);
2376 /* Allow repeated command */
2379 /* Set repeat count */
2380 command_rep = command_arg - 1;
2382 /* Redraw the state */
2383 p_ptr->redraw |= (PR_STATE);
2385 /* Cancel the arg */
2389 /* Get a "repeated" direction */
2390 if (get_rep_dir(&dir,FALSE))
2399 c_ptr = &cave[y][x];
2401 /* Feature code (applying "mimic" field) */
2402 feat = get_feat_mimic(c_ptr);
2404 /* Nothing useful */
2405 if (!have_flag(f_info[feat].flags, FF_BASH))
2409 msg_print("¤½¤³¤Ë¤ÏÂÎÅö¤¿¤ê¤¹¤ë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
2411 msg_print("You see nothing there to bash.");
2416 /* Monster in the way */
2417 else if (c_ptr->m_idx)
2424 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
2426 msg_print("There is a monster in the way!");
2434 /* Bash a closed door */
2438 more = do_cmd_bash_aux(y, x, dir);
2442 /* Unless valid action taken, cancel bash */
2443 if (!more) disturb(0, 0);
2448 * Manipulate an adjacent grid in some way
2450 * Attack monsters, tunnel through walls, disarm traps, open doors.
2452 * Consider confusion XXX XXX XXX
2454 * This command must always take a turn, to prevent free detection
2455 * of invisible monsters.
2457 void do_cmd_alter(void)
2466 if (p_ptr->special_defense & KATA_MUSOU)
2468 set_action(ACTION_NONE);
2471 /* Allow repeated command */
2474 /* Set repeat count */
2475 command_rep = command_arg - 1;
2477 /* Redraw the state */
2478 p_ptr->redraw |= (PR_STATE);
2480 /* Cancel the arg */
2484 /* Get a direction */
2485 if (get_rep_dir(&dir,TRUE))
2488 feature_type *f_ptr;
2495 c_ptr = &cave[y][x];
2497 /* Feature code (applying "mimic" field) */
2498 feat = get_feat_mimic(c_ptr);
2499 f_ptr = &f_info[feat];
2504 /* Attack monsters */
2512 else if (have_flag(f_ptr->flags, FF_OPEN))
2514 more = do_cmd_open_aux(y, x);
2517 /* Bash jammed doors */
2518 else if (have_flag(f_ptr->flags, FF_BASH))
2520 more = do_cmd_bash_aux(y, x, dir);
2523 /* Tunnel through walls */
2524 else if (have_flag(f_ptr->flags, FF_TUNNEL))
2526 more = do_cmd_tunnel_aux(y, x);
2529 /* Close open doors */
2530 else if (have_flag(f_ptr->flags, FF_CLOSE))
2532 more = do_cmd_close_aux(y, x);
2536 else if (have_flag(f_ptr->flags, FF_DISARM))
2538 more = do_cmd_disarm_aux(y, x, dir);
2546 msg_print("²¿¤â¤Ê¤¤¶õÃæ¤ò¹¶·â¤·¤¿¡£");
2548 msg_print("You attack the empty air.");
2554 /* Cancel repetition unless we can continue */
2555 if (!more) disturb(0, 0);
2560 * Find the index of some "spikes", if possible.
2562 * XXX XXX XXX Let user choose a pile of spikes, perhaps?
2564 static bool get_spike(int *ip)
2568 /* Check every item in the pack */
2569 for (i = 0; i < INVEN_PACK; i++)
2571 object_type *o_ptr = &inventory[i];
2573 /* Skip non-objects */
2574 if (!o_ptr->k_idx) continue;
2576 /* Check the "tval" code */
2577 if (o_ptr->tval == TV_SPIKE)
2579 /* Save the spike index */
2593 * Jam a closed door with a spike
2595 * This command may NOT be repeated
2597 void do_cmd_spike(void)
2601 if (p_ptr->special_defense & KATA_MUSOU)
2603 set_action(ACTION_NONE);
2606 /* Get a "repeated" direction */
2607 if (get_rep_dir(&dir,FALSE))
2617 /* Get grid and contents */
2618 c_ptr = &cave[y][x];
2620 /* Feature code (applying "mimic" field) */
2621 feat = get_feat_mimic(c_ptr);
2623 /* Require closed door */
2624 if (!have_flag(f_info[feat].flags, FF_SPIKE))
2628 msg_print("¤½¤³¤Ë¤Ï¤¯¤µ¤Ó¤òÂǤƤë¤â¤Î¤¬¸«Åö¤¿¤é¤Ê¤¤¡£");
2630 msg_print("You see nothing there to spike.");
2636 else if (!get_spike(&item))
2640 msg_print("¤¯¤µ¤Ó¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡ª");
2642 msg_print("You have no spikes!");
2646 /* Is a monster in the way? */
2647 else if (c_ptr->m_idx)
2654 msg_print("¥â¥ó¥¹¥¿¡¼¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª");
2656 msg_print("There is a monster in the way!");
2669 /* Successful jamming */
2671 msg_format("%s¤Ë¤¯¤µ¤Ó¤òÂǤÁ¹þ¤ó¤À¡£", f_name + f_info[feat].name);
2673 msg_format("You jam the %s with a spike.", f_name + f_info[feat].name);
2676 cave_alter_feat(y, x, FF_SPIKE);
2678 /* Use up, and describe, a single spike, from the bottom */
2679 inven_item_increase(item, -1);
2680 inven_item_describe(item);
2681 inven_item_optimize(item);
2689 * Support code for the "Walk" and "Jump" commands
2691 void do_cmd_walk(bool pickup)
2698 /* Allow repeated command */
2701 /* Set repeat count */
2702 command_rep = command_arg - 1;
2704 /* Redraw the state */
2705 p_ptr->redraw |= (PR_STATE);
2707 /* Cancel the arg */
2711 /* Get a "repeated" direction */
2712 if (get_rep_dir(&dir,FALSE))
2717 if ((dir != 5) && (p_ptr->special_defense & KATA_MUSOU))
2719 set_action(ACTION_NONE);
2722 /* Hack -- In small scale wilderness it takes MUCH more time to move */
2723 if (p_ptr->wild_mode) energy_use *= ((MAX_HGT + MAX_WID) / 2);
2724 if (p_ptr->action == ACTION_HAYAGAKE) energy_use = energy_use * (45-(p_ptr->lev/2)) / 100;
2726 /* Actually move the character */
2727 move_player(dir, pickup, FALSE);
2729 /* Allow more walking */
2733 /* Hack again -- Is there a special encounter ??? */
2734 if (p_ptr->wild_mode && !cave_have_flag_bold(py, px, FF_TOWN))
2736 int tmp = 120 + p_ptr->lev*10 - wilderness[py][px].level + 5;
2739 if (((wilderness[py][px].level + 5) > (p_ptr->lev / 2)) && randint0(tmp) < (21-p_ptr->skill_stl))
2741 /* Inform the player of his horrible fate :=) */
2743 msg_print("½±·â¤À¡ª");
2745 msg_print("You are ambushed !");
2748 /* Go into large wilderness view */
2749 p_ptr->oldpy = randint1(MAX_HGT-2);
2750 p_ptr->oldpx = randint1(MAX_WID-2);
2753 /* Give first move to monsters */
2756 /* HACk -- set the encouter flag for the wilderness generation */
2757 generate_encounter = TRUE;
2761 /* Cancel repeat unless we may continue */
2762 if (!more) disturb(0, 0);
2770 void do_cmd_run(void)
2774 /* Hack -- no running when confused */
2775 if (p_ptr->confused)
2778 msg_print("º®Í𤷤Ƥ¤¤ÆÁö¤ì¤Ê¤¤¡ª");
2780 msg_print("You are too confused!");
2786 if (p_ptr->special_defense & KATA_MUSOU)
2788 set_action(ACTION_NONE);
2791 /* Get a "repeated" direction */
2792 if (get_rep_dir(&dir,FALSE))
2794 /* Hack -- Set the run counter */
2795 running = (command_arg ? command_arg : 1000);
2805 * Stay still. Search. Enter stores.
2806 * Pick up treasure if "pickup" is true.
2808 void do_cmd_stay(bool pickup)
2810 u32b mpe_mode = MPE_STAYING | MPE_ENERGY_USE;
2812 /* Allow repeated command */
2815 /* Set repeat count */
2816 command_rep = command_arg - 1;
2818 /* Redraw the state */
2819 p_ptr->redraw |= (PR_STATE);
2821 /* Cancel the arg */
2828 if (pickup) mpe_mode |= MPE_DO_PICKUP;
2829 (void)move_player_effect(py, px, mpe_mode);
2835 * Resting allows a player to safely restore his hp -RAK-
2837 void do_cmd_rest(void)
2840 set_action(ACTION_NONE);
2842 if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] || p_ptr->magic_num1[1]))
2847 /* Prompt for time if needed */
2848 if (command_arg <= 0)
2851 cptr p = "µÙ·Æ (0-9999, '*' ¤Ç HP/MPÁ´²÷, '&' ¤ÇɬÍפʤÀ¤±): ";
2853 cptr p = "Rest (0-9999, '*' for HP/SP, '&' as needed): ";
2860 strcpy(out_val, "&");
2862 /* Ask for duration */
2863 if (!get_string(p, out_val, 4)) return;
2865 /* Rest until done */
2866 if (out_val[0] == '&')
2872 else if (out_val[0] == '*')
2880 command_arg = atoi(out_val);
2881 if (command_arg <= 0) return;
2887 if (command_arg > 9999) command_arg = 9999;
2889 if (p_ptr->special_defense & NINJA_S_STEALTH) set_superstealth(FALSE);
2891 /* Take a turn XXX XXX XXX (?) */
2894 /* The sin of sloth */
2895 if (command_arg > 100)
2896 chg_virtue(V_DILIGENCE, -1);
2898 /* Why are you sleeping when there's no need? WAKE UP!*/
2899 if ((p_ptr->chp == p_ptr->mhp) &&
2900 (p_ptr->csp == p_ptr->msp) &&
2901 !p_ptr->blind && !p_ptr->confused &&
2902 !p_ptr->poisoned && !p_ptr->afraid &&
2903 !p_ptr->stun && !p_ptr->cut &&
2904 !p_ptr->slow && !p_ptr->paralyzed &&
2905 !p_ptr->image && !p_ptr->word_recall &&
2906 !p_ptr->alter_reality)
2907 chg_virtue(V_DILIGENCE, -1);
2909 /* Save the rest code */
2910 resting = command_arg;
2911 p_ptr->action = ACTION_REST;
2913 /* Recalculate bonuses */
2914 p_ptr->update |= (PU_BONUS);
2916 /* Redraw the state */
2917 p_ptr->redraw |= (PR_STATE);
2928 * Determines the odds of an object breaking when thrown at a monster
2930 * Note that artifacts never break, see the "drop_near()" function.
2932 static int breakage_chance(object_type *o_ptr)
2934 int archer_bonus = (p_ptr->pclass == CLASS_ARCHER ? (p_ptr->lev-1)/7 + 4: 0);
2936 /* Examine the item type */
2937 switch (o_ptr->tval)
2953 /* Sometimes break */
2958 return (20 - archer_bonus * 2);
2963 return (10 - archer_bonus);
2970 static s16b tot_dam_aux_shot(object_type *o_ptr, int tdam, monster_type *m_ptr)
2974 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2976 u32b flgs[TR_FLAG_SIZE];
2978 /* Extract the flags */
2979 object_flags(o_ptr, flgs);
2981 /* Some "weapons" and "ammo" do extra damage */
2982 switch (o_ptr->tval)
2989 if ((have_flag(flgs, TR_SLAY_ANIMAL)) &&
2990 (r_ptr->flags3 & RF3_ANIMAL))
2992 if (is_original_ap_and_seen(m_ptr))
2994 r_ptr->r_flags3 |= RF3_ANIMAL;
2997 if (mult < 17) mult = 17;
3001 if ((have_flag(flgs, TR_KILL_ANIMAL)) &&
3002 (r_ptr->flags3 & RF3_ANIMAL))
3004 if (is_original_ap_and_seen(m_ptr))
3006 r_ptr->r_flags3 |= RF3_ANIMAL;
3009 if (mult < 27) mult = 27;
3013 if ((have_flag(flgs, TR_SLAY_EVIL)) &&
3014 (r_ptr->flags3 & RF3_EVIL))
3016 if (is_original_ap_and_seen(m_ptr))
3018 r_ptr->r_flags3 |= RF3_EVIL;
3021 if (mult < 15) mult = 15;
3025 if ((have_flag(flgs, TR_KILL_EVIL)) &&
3026 (r_ptr->flags3 & RF3_EVIL))
3028 if (is_original_ap_and_seen(m_ptr))
3030 r_ptr->r_flags3 |= RF3_EVIL;
3033 if (mult < 25) mult = 25;
3037 if ((have_flag(flgs, TR_SLAY_HUMAN)) &&
3038 (r_ptr->flags2 & RF2_HUMAN))
3040 if (is_original_ap_and_seen(m_ptr))
3042 r_ptr->r_flags2 |= RF2_HUMAN;
3045 if (mult < 17) mult = 17;
3049 if ((have_flag(flgs, TR_KILL_HUMAN)) &&
3050 (r_ptr->flags2 & RF2_HUMAN))
3052 if (is_original_ap_and_seen(m_ptr))
3054 r_ptr->r_flags2 |= RF2_HUMAN;
3057 if (mult < 27) mult = 27;
3061 if ((have_flag(flgs, TR_SLAY_UNDEAD)) &&
3062 (r_ptr->flags3 & RF3_UNDEAD))
3064 if (is_original_ap_and_seen(m_ptr))
3066 r_ptr->r_flags3 |= RF3_UNDEAD;
3069 if (mult < 20) mult = 20;
3073 if ((have_flag(flgs, TR_KILL_UNDEAD)) &&
3074 (r_ptr->flags3 & RF3_UNDEAD))
3076 if (is_original_ap_and_seen(m_ptr))
3078 r_ptr->r_flags3 |= RF3_UNDEAD;
3081 if (mult < 30) mult = 30;
3085 if ((have_flag(flgs, TR_SLAY_DEMON)) &&
3086 (r_ptr->flags3 & RF3_DEMON))
3088 if (is_original_ap_and_seen(m_ptr))
3090 r_ptr->r_flags3 |= RF3_DEMON;
3093 if (mult < 20) mult = 20;
3097 if ((have_flag(flgs, TR_KILL_DEMON)) &&
3098 (r_ptr->flags3 & RF3_DEMON))
3100 if (is_original_ap_and_seen(m_ptr))
3102 r_ptr->r_flags3 |= RF3_DEMON;
3105 if (mult < 30) mult = 30;
3109 if ((have_flag(flgs, TR_SLAY_ORC)) &&
3110 (r_ptr->flags3 & RF3_ORC))
3112 if (is_original_ap_and_seen(m_ptr))
3114 r_ptr->r_flags3 |= RF3_ORC;
3117 if (mult < 20) mult = 20;
3121 if ((have_flag(flgs, TR_KILL_ORC)) &&
3122 (r_ptr->flags3 & RF3_ORC))
3124 if (is_original_ap_and_seen(m_ptr))
3126 r_ptr->r_flags3 |= RF3_ORC;
3129 if (mult < 30) mult = 30;
3133 if ((have_flag(flgs, TR_SLAY_TROLL)) &&
3134 (r_ptr->flags3 & RF3_TROLL))
3136 if (is_original_ap_and_seen(m_ptr))
3138 r_ptr->r_flags3 |= RF3_TROLL;
3141 if (mult < 20) mult = 20;
3145 if ((have_flag(flgs, TR_KILL_TROLL)) &&
3146 (r_ptr->flags3 & RF3_TROLL))
3148 if (is_original_ap_and_seen(m_ptr))
3150 r_ptr->r_flags3 |= RF3_TROLL;
3153 if (mult < 30) mult = 30;
3157 if ((have_flag(flgs, TR_SLAY_GIANT)) &&
3158 (r_ptr->flags3 & RF3_GIANT))
3160 if (is_original_ap_and_seen(m_ptr))
3162 r_ptr->r_flags3 |= RF3_GIANT;
3165 if (mult < 20) mult = 20;
3169 if ((have_flag(flgs, TR_KILL_GIANT)) &&
3170 (r_ptr->flags3 & RF3_GIANT))
3172 if (is_original_ap_and_seen(m_ptr))
3174 r_ptr->r_flags3 |= RF3_GIANT;
3177 if (mult < 30) mult = 30;
3181 if ((have_flag(flgs, TR_SLAY_DRAGON)) &&
3182 (r_ptr->flags3 & RF3_DRAGON))
3184 if (is_original_ap_and_seen(m_ptr))
3186 r_ptr->r_flags3 |= RF3_DRAGON;
3189 if (mult < 20) mult = 20;
3192 /* Execute Dragon */
3193 if ((have_flag(flgs, TR_KILL_DRAGON)) &&
3194 (r_ptr->flags3 & RF3_DRAGON))
3196 if (is_original_ap_and_seen(m_ptr))
3198 r_ptr->r_flags3 |= RF3_DRAGON;
3201 if (mult < 30) mult = 30;
3203 if ((o_ptr->name1 == ART_BARD_ARROW) &&
3204 (m_ptr->r_idx == MON_SMAUG) &&
3205 (inventory[INVEN_BOW].name1 == ART_BARD))
3210 if (have_flag(flgs, TR_BRAND_ACID))
3212 /* Notice immunity */
3213 if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK)
3215 if (is_original_ap_and_seen(m_ptr))
3217 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK);
3221 /* Otherwise, take the damage */
3224 if (mult < 17) mult = 17;
3229 if (have_flag(flgs, TR_BRAND_ELEC))
3231 /* Notice immunity */
3232 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
3234 if (is_original_ap_and_seen(m_ptr))
3236 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3240 /* Otherwise, take the damage */
3243 if (mult < 17) mult = 17;
3248 if (have_flag(flgs, TR_BRAND_FIRE))
3250 /* Notice immunity */
3251 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
3253 if (is_original_ap_and_seen(m_ptr))
3255 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3259 /* Otherwise, take the damage */
3262 if (r_ptr->flags3 & RF3_HURT_FIRE)
3264 if (mult < 25) mult = 25;
3265 if (is_original_ap_and_seen(m_ptr))
3267 r_ptr->r_flags3 |= RF3_HURT_FIRE;
3270 else if (mult < 17) mult = 17;
3275 if (have_flag(flgs, TR_BRAND_COLD))
3277 /* Notice immunity */
3278 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
3280 if (is_original_ap_and_seen(m_ptr))
3282 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3285 /* Otherwise, take the damage */
3288 if (r_ptr->flags3 & RF3_HURT_COLD)
3290 if (mult < 25) mult = 25;
3291 if (is_original_ap_and_seen(m_ptr))
3293 r_ptr->r_flags3 |= RF3_HURT_COLD;
3296 else if (mult < 17) mult = 17;
3300 /* Brand (Poison) */
3301 if (have_flag(flgs, TR_BRAND_POIS))
3303 /* Notice immunity */
3304 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
3306 if (is_original_ap_and_seen(m_ptr))
3308 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
3312 /* Otherwise, take the damage */
3315 if (mult < 17) mult = 17;
3319 if ((have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (p_ptr->msp / 30)))
3321 p_ptr->csp -= (1+(p_ptr->msp / 30));
3322 p_ptr->redraw |= (PR_MANA);
3323 mult = mult * 5 / 2;
3329 /* Return the total damage */
3330 return (tdam * mult / 10);
3335 * Fire an object from the pack or floor.
3337 * You may only fire items that "match" your missile launcher.
3339 * You must use slings + pebbles/shots, bows + arrows, xbows + bolts.
3341 * See "calc_bonuses()" for more calculations and such.
3343 * Note that "firing" a missile is MUCH better than "throwing" it.
3345 * Note: "unseen" monsters are very hard to hit.
3347 * Objects are more likely to break if they "attempt" to hit a monster.
3349 * Rangers (with Bows) and Anyone (with "Extra Shots") get extra shots.
3351 * The "extra shot" code works by decreasing the amount of energy
3352 * required to make each shot, spreading the shots out over time.
3354 * Note that when firing missiles, the launcher multiplier is applied
3355 * after all the bonuses are added in, making multipliers very useful.
3357 * Note that Bows of "Extra Might" get extra range and an extra bonus
3358 * for the damage multiplier.
3360 * Note that Bows of "Extra Shots" give an extra shot.
3362 void do_cmd_fire_aux(int item, object_type *j_ptr)
3365 int j, y, x, ny, nx, ty, tx, prev_y, prev_x;
3366 int tdam, tdis, thits, tmul;
3368 int cur_dis, visible;
3375 bool hit_body = FALSE;
3377 char o_name[MAX_NLEN];
3379 int msec = delay_factor * delay_factor * delay_factor;
3382 bool stick_to = FALSE;
3384 /* Access the item (if in the pack) */
3387 o_ptr = &inventory[item];
3391 o_ptr = &o_list[0 - item];
3394 /* Describe the object */
3395 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3398 /* Use the proper number of shots */
3399 thits = p_ptr->num_fire;
3401 /* Use a base distance */
3404 /* Base damage from thrown object plus launcher bonus */
3405 tdam = damroll(o_ptr->dd, o_ptr->ds) + o_ptr->to_d + j_ptr->to_d;
3407 /* Actually "fire" the object */
3408 bonus = (p_ptr->to_h_b + o_ptr->to_h + j_ptr->to_h);
3409 if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW))
3410 chance = (p_ptr->skill_thb + (p_ptr->weapon_exp[0][j_ptr->sval] / 400 + bonus) * BTH_PLUS_ADJ);
3412 chance = (p_ptr->skill_thb + ((p_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + bonus) * BTH_PLUS_ADJ);
3414 energy_use = bow_energy(j_ptr->sval);
3415 tmul = bow_tmul(j_ptr->sval);
3417 /* Get extra "power" from "extra might" */
3418 if (p_ptr->xtra_might) tmul++;
3420 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
3422 /* Boost the damage */
3427 tdis = 10 + tmul/40;
3428 if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW))
3431 project_length = tdis + 1;
3433 /* Get a direction (or cancel) */
3434 if (!get_aim_dir(&dir))
3438 /* need not to reset project_length (already did)*/
3443 /* Start at the player */
3447 /* Predict the "target" location */
3448 tx = px + 99 * ddx[dir];
3449 ty = py + 99 * ddy[dir];
3451 /* Check for "target request" */
3452 if ((dir == 5) && target_okay())
3458 project_length = 0; /* reset to default */
3460 /* Don't shoot at my feet */
3461 if (tx == px && ty == py)
3465 /* project_length is already reset to 0 */
3471 /* Get local object */
3474 /* Obtain a local object */
3475 object_copy(q_ptr, o_ptr);
3480 /* Reduce and describe inventory */
3483 inven_item_increase(item, -1);
3484 inven_item_describe(item);
3485 inven_item_optimize(item);
3488 /* Reduce and describe floor item */
3491 floor_item_increase(0 - item, -1);
3492 floor_item_optimize(0 - item);
3500 /* Take a (partial) turn */
3501 energy_use = (energy_use / thits);
3504 /* Hack -- Handle stuff */
3507 /* Save the old location */
3511 /* Travel until stopped */
3512 for (cur_dis = 0; cur_dis <= tdis; )
3514 /* Hack -- Stop at the target */
3515 if ((y == ty) && (x == tx)) break;
3517 /* Calculate the new location (see "project()") */
3520 mmove2(&ny, &nx, py, px, ty, tx);
3522 /* Stopped by walls/doors */
3523 if (!cave_have_flag_bold(ny, nx, FF_PROJECT) && !cave[ny][nx].m_idx) break;
3525 /* Advance the distance */
3529 /* The player can see the (on screen) missile */
3530 if (panel_contains(ny, nx) && player_can_see_bold(ny, nx))
3532 char c = object_char(q_ptr);
3533 byte a = object_attr(q_ptr);
3535 /* Draw, Hilite, Fresh, Pause, Erase */
3536 print_rel(c, a, ny, nx);
3537 move_cursor_relative(ny, nx);
3539 Term_xtra(TERM_XTRA_DELAY, msec);
3544 /* The player cannot see the missile */
3547 /* Pause anyway, for consistancy */
3548 Term_xtra(TERM_XTRA_DELAY, msec);
3551 /* Save the old location */
3555 /* Save the new location */
3560 /* Monster here, Try to hit it */
3561 if (cave[y][x].m_idx)
3563 cave_type *c_ptr = &cave[y][x];
3565 monster_type *m_ptr = &m_list[c_ptr->m_idx];
3566 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3568 /* Check the visibility */
3569 visible = m_ptr->ml;
3571 /* Note the collision */
3576 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
3577 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
3580 if ((r_ptr->level + 10) > p_ptr->lev)
3582 int now_exp = p_ptr->weapon_exp[0][j_ptr->sval];
3583 if (now_exp < s_info[p_ptr->pclass].w_max[0][j_ptr->sval])
3586 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
3587 else if (now_exp < WEAPON_EXP_SKILLED) amount = 25;
3588 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 10;
3589 else if (p_ptr->lev > 34) amount = 2;
3590 p_ptr->weapon_exp[0][j_ptr->sval] += amount;
3591 p_ptr->update |= (PU_BONUS);
3597 if ((p_ptr->skill_exp[GINOU_RIDING] < s_info[p_ptr->pclass].s_max[GINOU_RIDING])
3598 && ((p_ptr->skill_exp[GINOU_RIDING] - (RIDING_EXP_BEGINNER * 2)) / 200 < r_info[m_list[p_ptr->riding].r_idx].level)
3601 p_ptr->skill_exp[GINOU_RIDING] += 1;
3602 p_ptr->update |= (PU_BONUS);
3606 /* Did we hit it (penalize range) */
3607 if (test_hit_fire(chance - cur_dis, r_ptr->ac, m_ptr->ml))
3611 /* Handle unseen monster */
3614 /* Invisible monster */
3616 msg_format("%s¤¬Å¨¤òÊ᪤·¤¿¡£", o_name);
3618 msg_format("The %s finds a mark.", o_name);
3623 /* Handle visible monster */
3628 /* Get "the monster" or "it" */
3629 monster_desc(m_name, m_ptr, 0);
3633 msg_format("%s¤¬%s¤ËÌ¿Ã椷¤¿¡£", o_name, m_name);
3635 msg_format("The %s hits %s.", o_name, m_name);
3639 /* Hack -- Track this monster race */
3640 if (m_ptr->ml) monster_race_track(m_ptr->ap_r_idx);
3642 /* Hack -- Track this monster */
3643 if (m_ptr->ml) health_track(c_ptr->m_idx);
3646 /* Apply special damage XXX XXX XXX */
3647 tdam = tot_dam_aux_shot(q_ptr, tdam, m_ptr);
3648 tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam);
3650 /* No negative damage */
3651 if (tdam < 0) tdam = 0;
3653 /* Modify the damage */
3654 tdam = mon_damage_mod(m_ptr, tdam, FALSE);
3656 /* Complex message */
3657 if (p_ptr->wizard || cheat_xtra)
3660 msg_format("%d/%d ¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤¿¡£",
3663 msg_format("You do %d (out of %d) damage.",
3669 /* Hit the monster, check for death */
3670 if (mon_take_hit(c_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_ptr(m_ptr))))
3679 if (object_is_fixed_artifact(q_ptr))
3683 monster_desc(m_name, m_ptr, 0);
3687 msg_format("%s¤Ï%s¤ËÆͤ»É¤µ¤Ã¤¿¡ª",o_name, m_name);
3689 msg_format("%^s have stuck into %s!",o_name, m_name);
3694 message_pain(c_ptr->m_idx, tdam);
3696 /* Anger the monster */
3697 if (tdam > 0) anger_monster(m_ptr);
3700 if (fear && m_ptr->ml)
3707 /* Get the monster name (or "it") */
3708 monster_desc(m_name, m_ptr, 0);
3712 msg_format("%^s¤Ï¶²Éݤ·¤Æƨ¤²½Ð¤·¤¿¡ª", m_name);
3714 msg_format("%^s flees in terror!", m_name);
3718 if (!projectable(m_ptr->fy, m_ptr->fx, py, px))
3720 set_target(m_ptr, py, px);
3730 /* Chance of breakage (during attacks) */
3731 j = (hit_body ? breakage_chance(q_ptr) : 0);
3735 int m_idx = cave[y][x].m_idx;
3736 monster_type *m_ptr = &m_list[m_idx];
3737 int o_idx = o_pop();
3742 msg_format("%s¤Ï¤É¤³¤«¤Ø¹Ô¤Ã¤¿¡£", o_name);
3744 msg_format("The %s have gone to somewhere.", o_name);
3746 if (object_is_fixed_artifact(q_ptr))
3748 a_info[j_ptr->name1].cur_num = 0;
3753 o_ptr = &o_list[o_idx];
3754 object_copy(o_ptr, q_ptr);
3759 /* Forget location */
3760 o_ptr->iy = o_ptr->ix = 0;
3762 /* Memorize monster */
3763 o_ptr->held_m_idx = m_idx;
3766 o_ptr->next_o_idx = m_ptr->hold_o_idx;
3769 m_ptr->hold_o_idx = o_idx;
3771 else if (cave_have_flag_bold(y, x, FF_PROJECT))
3773 /* Drop (or break) near that location */
3774 (void)drop_near(q_ptr, j, y, x);
3778 /* Drop (or break) near that location */
3779 (void)drop_near(q_ptr, j, prev_y, prev_x);
3784 void do_cmd_fire(void)
3790 /* Get the "bow" (if any) */
3791 j_ptr = &inventory[INVEN_BOW];
3793 /* Require a launcher */
3797 msg_print("¼Í·âÍѤÎÉð´ï¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£");
3799 msg_print("You have nothing to fire with.");
3805 if (j_ptr->sval == SV_CRIMSON)
3808 msg_print("¤³¤ÎÉð´ï¤Ïȯư¤·¤Æ»È¤¦¤â¤Î¤Î¤è¤¦¤À¡£");
3810 msg_print("Do activate.");
3817 if (p_ptr->special_defense & KATA_MUSOU)
3819 set_action(ACTION_NONE);
3822 /* Require proper missile */
3823 item_tester_tval = p_ptr->tval_ammo;
3827 q = "¤É¤ì¤ò·â¤Á¤Þ¤¹¤«? ";
3828 s = "ȯ¼Í¤µ¤ì¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3830 q = "Fire which item? ";
3831 s = "You have nothing to fire.";
3834 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR)))
3841 do_cmd_fire_aux(item, j_ptr);
3845 static bool item_tester_hook_boomerang(object_type *o_ptr)
3847 if ((o_ptr->tval==TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
3855 * Throw an object from the pack or floor.
3857 * Note: "unseen" monsters are very hard to hit.
3859 * Should throwing a weapon do full damage? Should it allow the magic
3860 * to hit bonus of the weapon to have an effect? Should it ever cause
3861 * the item to be destroyed? Should it do any damage at all?
3863 bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
3866 int i, j, y, x, ty, tx, prev_y, prev_x;
3868 int chance, tdam, tdis;
3870 int cur_dis, visible;
3877 bool hit_body = FALSE;
3878 bool hit_wall = FALSE;
3879 bool equiped_item = FALSE;
3880 bool return_when_thrown = FALSE;
3882 char o_name[MAX_NLEN];
3884 int msec = delay_factor * delay_factor * delay_factor;
3886 u32b flgs[TR_FLAG_SIZE];
3888 bool come_back = FALSE;
3889 bool do_drop = TRUE;
3892 if (p_ptr->special_defense & KATA_MUSOU)
3894 set_action(ACTION_NONE);
3903 if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
3905 item_tester_hook = item_tester_hook_boomerang;
3907 q = "¤É¤ÎÉð´ï¤òÅꤲ¤Þ¤¹¤«? ";
3908 s = "Åꤲ¤ëÉð´ï¤¬¤Ê¤¤¡£";
3910 q = "Throw which item? ";
3911 s = "You have nothing to throw.";
3914 if (!get_item(&item, q, s, (USE_EQUIP)))
3920 else if (buki_motteruka(INVEN_LARM)) item = INVEN_LARM;
3921 else item = INVEN_RARM;
3927 q = "¤É¤Î¥¢¥¤¥Æ¥à¤òÅꤲ¤Þ¤¹¤«? ";
3928 s = "Åꤲ¤ë¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
3930 q = "Throw which item? ";
3931 s = "You have nothing to throw.";
3934 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EQUIP)))
3941 /* Access the item (if in the pack) */
3944 o_ptr = &inventory[item];
3948 o_ptr = &o_list[0 - item];
3952 /* Item is cursed */
3953 if (object_is_cursed(o_ptr) && (item >= INVEN_RARM))
3957 msg_print("¤Õ¡¼¤à¡¢¤É¤¦¤ä¤é¼ö¤ï¤ì¤Æ¤¤¤ë¤è¤¦¤À¡£");
3959 msg_print("Hmmm, it seems to be cursed.");
3966 if (p_ptr->inside_arena && !boomerang)
3968 if (o_ptr->tval != TV_SPIKE)
3971 msg_print("¥¢¥ê¡¼¥Ê¤Ç¤Ï¥¢¥¤¥Æ¥à¤ò»È¤¨¤Ê¤¤¡ª");
3973 msg_print("You're in the arena now. This is hand-to-hand!");
3982 /* Get local object */
3985 /* Obtain a local object */
3986 object_copy(q_ptr, o_ptr);
3988 /* Extract the thrown object's flags. */
3989 object_flags(q_ptr, flgs);
3991 /* Distribute the charges of rods/wands between the stacks */
3992 distribute_charges(o_ptr, q_ptr, 1);
3998 object_desc(o_name, q_ptr, OD_OMIT_PREFIX);
4000 if (p_ptr->mighty_throw) mult += 3;
4002 /* Extract a "distance multiplier" */
4003 /* Changed for 'launcher' mutation */
4004 mul = 10 + 2 * (mult - 1);
4006 /* Enforce a minimum "weight" of one pound */
4007 div = ((q_ptr->weight > 10) ? q_ptr->weight : 10);
4008 if ((have_flag(flgs, TR_THROW)) || boomerang) div /= 2;
4010 /* Hack -- Distance -- Reward strength, penalize weight */
4011 tdis = (adj_str_blow[p_ptr->stat_ind[A_STR]] + 20) * mul / div;
4013 /* Max distance of 10-18 */
4014 if (tdis > mul) tdis = mul;
4018 ty = randint0(101)-50+py;
4019 tx = randint0(101)-50+px;
4023 project_length = tdis + 1;
4025 /* Get a direction (or cancel) */
4026 if (!get_aim_dir(&dir)) return FALSE;
4028 /* Predict the "target" location */
4029 tx = px + 99 * ddx[dir];
4030 ty = py + 99 * ddy[dir];
4032 /* Check for "target request" */
4033 if ((dir == 5) && target_okay())
4039 project_length = 0; /* reset to default */
4042 if ((q_ptr->name1 == ART_MJOLLNIR) ||
4043 (q_ptr->name1 == ART_AEGISFANG) || boomerang)
4044 return_when_thrown = TRUE;
4046 /* Reduce and describe inventory */
4049 inven_item_increase(item, -1);
4050 if (!return_when_thrown)
4051 inven_item_describe(item);
4052 inven_item_optimize(item);
4055 /* Reduce and describe floor item */
4058 floor_item_increase(0 - item, -1);
4059 floor_item_optimize(0 - item);
4061 if (item >= INVEN_RARM)
4063 equiped_item = TRUE;
4064 p_ptr->redraw |= (PR_EQUIPPY);
4070 /* Rogue and Ninja gets bonus */
4071 if ((p_ptr->pclass == CLASS_ROGUE) || (p_ptr->pclass == CLASS_NINJA))
4072 energy_use -= p_ptr->lev;
4074 /* Start at the player */
4079 /* Hack -- Handle stuff */
4082 if ((p_ptr->pclass == CLASS_NINJA) && ((q_ptr->tval == TV_SPIKE) || ((have_flag(flgs, TR_THROW)) && (q_ptr->tval == TV_SWORD)))) shuriken = TRUE;
4083 else shuriken = FALSE;
4085 /* Chance of hitting */
4086 if (have_flag(flgs, TR_THROW)) chance = ((p_ptr->skill_tht) +
4087 ((p_ptr->to_h_b + q_ptr->to_h) * BTH_PLUS_ADJ));
4088 else chance = (p_ptr->skill_tht + (p_ptr->to_h_b * BTH_PLUS_ADJ));
4090 if (shuriken) chance *= 2;
4092 /* Save the old location */
4096 /* Travel until stopped */
4097 for (cur_dis = 0; cur_dis <= tdis; )
4099 /* Hack -- Stop at the target */
4100 if ((y == ty) && (x == tx)) break;
4102 /* Calculate the new location (see "project()") */
4105 mmove2(&ny[cur_dis], &nx[cur_dis], py, px, ty, tx);
4107 /* Stopped by walls/doors */
4108 if (!cave_have_flag_bold(ny[cur_dis], nx[cur_dis], FF_PROJECT))
4111 if ((q_ptr->tval == TV_FIGURINE) || object_is_potion(q_ptr) || !cave[ny[cur_dis]][nx[cur_dis]].m_idx) break;
4114 /* The player can see the (on screen) missile */
4115 if (panel_contains(ny[cur_dis], nx[cur_dis]) && player_can_see_bold(ny[cur_dis], nx[cur_dis]))
4117 char c = object_char(q_ptr);
4118 byte a = object_attr(q_ptr);
4120 /* Draw, Hilite, Fresh, Pause, Erase */
4121 print_rel(c, a, ny[cur_dis], nx[cur_dis]);
4122 move_cursor_relative(ny[cur_dis], nx[cur_dis]);
4124 Term_xtra(TERM_XTRA_DELAY, msec);
4125 lite_spot(ny[cur_dis], nx[cur_dis]);
4129 /* The player cannot see the missile */
4132 /* Pause anyway, for consistancy */
4133 Term_xtra(TERM_XTRA_DELAY, msec);
4136 /* Save the old location */
4140 /* Save the new location */
4144 /* Advance the distance */
4147 /* Monster here, Try to hit it */
4148 if (cave[y][x].m_idx)
4150 cave_type *c_ptr = &cave[y][x];
4152 monster_type *m_ptr = &m_list[c_ptr->m_idx];
4153 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4155 /* Check the visibility */
4156 visible = m_ptr->ml;
4158 /* Note the collision */
4161 /* Did we hit it (penalize range) */
4162 if (test_hit_fire(chance - cur_dis, r_ptr->ac, m_ptr->ml))
4166 /* Handle unseen monster */
4169 /* Invisible monster */
4171 msg_format("%s¤¬Å¨¤òÊ᪤·¤¿¡£", o_name);
4173 msg_format("The %s finds a mark.", o_name);
4178 /* Handle visible monster */
4183 /* Get "the monster" or "it" */
4184 monster_desc(m_name, m_ptr, 0);
4188 msg_format("%s¤¬%s¤ËÌ¿Ã椷¤¿¡£", o_name, m_name);
4190 msg_format("The %s hits %s.", o_name, m_name);
4194 /* Hack -- Track this monster race */
4195 if (m_ptr->ml) monster_race_track(m_ptr->ap_r_idx);
4197 /* Hack -- Track this monster */
4198 if (m_ptr->ml) health_track(c_ptr->m_idx);
4201 /* Hack -- Base damage from thrown object */
4202 tdam = damroll(q_ptr->dd, q_ptr->ds);
4203 /* Apply special damage XXX XXX XXX */
4204 tdam = tot_dam_aux(q_ptr, tdam, m_ptr, 0, TRUE);
4205 tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam);
4206 if (q_ptr->to_d > 0)
4207 tdam += q_ptr->to_d;
4209 tdam += -q_ptr->to_d;
4213 tdam *= (mult+p_ptr->num_blow[item - INVEN_RARM]);
4214 tdam += p_ptr->to_d_m;
4216 else if (have_flag(flgs, TR_THROW))
4219 tdam += p_ptr->to_d_m;
4227 tdam += ((p_ptr->lev+30)*(p_ptr->lev+30)-900)/55;
4230 /* No negative damage */
4231 if (tdam < 0) tdam = 0;
4233 /* Modify the damage */
4234 tdam = mon_damage_mod(m_ptr, tdam, FALSE);
4236 /* Complex message */
4240 msg_format("%d/%d¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤¿¡£",
4243 msg_format("You do %d (out of %d) damage.",
4249 /* Hit the monster, check for death */
4250 if (mon_take_hit(c_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_ptr(m_ptr))))
4259 message_pain(c_ptr->m_idx, tdam);
4261 /* Anger the monster */
4262 if ((tdam > 0) && !object_is_potion(q_ptr))
4263 anger_monster(m_ptr);
4266 if (fear && m_ptr->ml)
4273 /* Get the monster name (or "it") */
4274 monster_desc(m_name, m_ptr, 0);
4278 msg_format("%^s¤Ï¶²Éݤ·¤Æƨ¤²½Ð¤·¤¿¡ª", m_name);
4280 msg_format("%^s flees in terror!", m_name);
4292 /* Chance of breakage (during attacks) */
4293 j = (hit_body ? breakage_chance(q_ptr) : 0);
4295 /* Figurines transform */
4296 if ((q_ptr->tval == TV_FIGURINE) && !(p_ptr->inside_arena))
4300 if (!(summon_named_creature(0, y, x, q_ptr->pval,
4301 !(object_is_cursed(q_ptr)) ? PM_FORCE_PET : 0L)))
4303 msg_print("¿Í·Á¤ÏDZ¤¸¶Ê¤¬¤êºÕ¤±»¶¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª");
4305 msg_print("The Figurine writhes and then shatters.");
4308 else if (object_is_cursed(q_ptr))
4310 msg_print("¤³¤ì¤Ï¤¢¤Þ¤êÎɤ¯¤Ê¤¤µ¤¤¬¤¹¤ë¡£");
4312 msg_print("You have a bad feeling about this.");
4318 /* Potions smash open */
4319 if (object_is_potion(q_ptr))
4321 if (hit_body || hit_wall || (randint1(100) < j))
4325 msg_format("%s¤ÏºÕ¤±»¶¤Ã¤¿¡ª", o_name);
4327 msg_format("The %s shatters!", o_name);
4331 if (potion_smash_effect(0, y, x, q_ptr->k_idx))
4333 monster_type *m_ptr = &m_list[cave[y][x].m_idx];
4335 /* ToDo (Robert): fix the invulnerability */
4336 if (cave[y][x].m_idx &&
4337 is_friendly(&m_list[cave[y][x].m_idx]) &&
4341 monster_desc(m_name, &m_list[cave[y][x].m_idx], 0);
4343 msg_format("%s¤ÏÅܤä¿¡ª", m_name);
4345 msg_format("%^s gets angry!", m_name);
4348 set_hostile(&m_list[cave[y][x].m_idx]);
4359 if (return_when_thrown)
4361 int back_chance = randint1(30)+20+((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4362 char o2_name[MAX_NLEN];
4363 bool super_boomerang = (((q_ptr->name1 == ART_MJOLLNIR) || (q_ptr->name1 == ART_AEGISFANG)) && boomerang);
4366 if (boomerang) back_chance += 4+randint1(5);
4367 if (super_boomerang) back_chance += 100;
4368 object_desc(o2_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
4370 if((back_chance > 30) && (!one_in_(100) || super_boomerang))
4372 for (i = cur_dis - 1; i > 0; i--)
4374 if (panel_contains(ny[i], nx[i]) && player_can_see_bold(ny[i], nx[i]))
4376 char c = object_char(q_ptr);
4377 byte a = object_attr(q_ptr);
4379 /* Draw, Hilite, Fresh, Pause, Erase */
4380 print_rel(c, a, ny[i], nx[i]);
4381 move_cursor_relative(ny[i], nx[i]);
4383 Term_xtra(TERM_XTRA_DELAY, msec);
4384 lite_spot(ny[i], nx[i]);
4389 /* Pause anyway, for consistancy */
4390 Term_xtra(TERM_XTRA_DELAY, msec);
4393 if((back_chance > 37) && !p_ptr->blind && (item >= 0))
4396 msg_format("%s¤¬¼ê¸µ¤ËÊ֤äƤ¤¿¡£", o2_name);
4398 msg_format("%s comes back to you.", o2_name);
4407 msg_format("%s¤ò¼õ¤±Â»¤Í¤¿¡ª", o2_name);
4409 msg_format("%s backs, but you can't catch!", o2_name);
4415 msg_format("%s¤¬Ê֤äƤ¤¿¡£", o2_name);
4417 msg_format("%s comes back.", o2_name);
4427 msg_format("%s¤¬Ê֤äƤ³¤Ê¤«¤Ã¤¿¡ª", o2_name);
4429 msg_format("%s doesn't back!", o2_name);
4436 if (item == INVEN_RARM || item == INVEN_LARM)
4438 /* Access the wield slot */
4439 o_ptr = &inventory[item];
4441 /* Wear the new stuff */
4442 object_copy(o_ptr, q_ptr);
4444 /* Increase the weight */
4445 p_ptr->total_weight += q_ptr->weight;
4447 /* Increment the equip counter by hand */
4450 /* Recalculate bonuses */
4451 p_ptr->update |= (PU_BONUS);
4453 /* Recalculate torch */
4454 p_ptr->update |= (PU_TORCH);
4456 /* Recalculate mana XXX */
4457 p_ptr->update |= (PU_MANA);
4460 p_ptr->window |= (PW_EQUIP);
4468 else if (equiped_item)
4474 /* Drop (or break) near that location */
4477 if (cave_have_flag_bold(y, x, FF_PROJECT))
4479 /* Drop (or break) near that location */
4480 (void)drop_near(q_ptr, j, y, x);
4484 /* Drop (or break) near that location */
4485 (void)drop_near(q_ptr, j, prev_y, prev_x);
4494 * Throw an object from the pack or floor.
4496 void do_cmd_throw(void)
4498 do_cmd_throw_aux(1, FALSE, 0);