OSDN Git Service

[Refactor] #40413 Separated display-messages.c/h from util.c/h
[hengband/hengband.git] / src / monster-floor / monster-death.c
1 #include "monster-floor/monster-death.h"
2 #include "art-definition/art-armor-types.h"
3 #include "art-definition/art-bow-types.h"
4 #include "art-definition/art-protector-types.h"
5 #include "art-definition/art-weapon-types.h"
6 #include "art-definition/random-art-effects.h"
7 #include "dungeon/dungeon.h"
8 #include "dungeon/quest.h"
9 #include "effect/effect-characteristics.h"
10 #include "floor/floor-object.h"
11 #include "floor/floor.h"
12 #include "game-option/birth-options.h"
13 #include "game-option/play-record-options.h"
14 #include "io/write-diary.h"
15 #include "lore/lore-store.h"
16 #include "main/music-definitions-table.h"
17 #include "main/sound-of-music.h"
18 #include "market/arena-info-table.h"
19 #include "monster-floor/monster-object.h"
20 #include "monster-floor/monster-summon.h"
21 #include "monster-floor/place-monster-types.h"
22 #include "monster-race/monster-race-hook.h"
23 #include "monster-race/race-flags1.h"
24 #include "monster-race/race-flags2.h"
25 #include "monster-race/race-flags7.h"
26 #include "monster-race/race-flags9.h"
27 #include "monster-race/race-indice-types.h"
28 #include "monster/monster-describer.h"
29 #include "monster/monster-description-types.h"
30 #include "monster/monster-flag-types.h"
31 #include "monster/monster-info.h"
32 #include "monster/monster-list.h"
33 #include "monster/smart-learn-types.h"
34 #include "object-enchant/apply-magic.h"
35 #include "object-enchant/artifact.h"
36 #include "object-enchant/item-apply-magic.h"
37 #include "object/object-generator.h"
38 #include "object/object-kind-hook.h"
39 #include "pet/pet-fall-off.h"
40 #include "player/patron.h"
41 #include "spell/process-effect.h"
42 #include "spell/spells-summon.h"
43 #include "spell/spell-types.h"
44 #include "sv-definition/sv-other-types.h"
45 #include "sv-definition/sv-protector-types.h"
46 #include "sv-definition/sv-scroll-types.h"
47 #include "sv-definition/sv-weapon-types.h"
48 #include "system/monster-type-definition.h"
49 #include "system/system-variables.h"
50 #include "view/display-messages.h"
51 #include "world/world.h"
52
53 /*!
54  * @brief モンスターを倒した際の財宝svalを返す
55  * @param r_idx 倒したモンスターの種族ID
56  * @return 財宝のsval
57  * @details
58  * Hack -- Return the "automatic coin type" of a monster race
59  * Used to allocate proper treasure when "Creeping coins" die
60  * Note the use of actual "monster names"
61  */
62 static OBJECT_SUBTYPE_VALUE get_coin_type(MONRACE_IDX r_idx)
63 {
64     switch (r_idx) {
65     case MON_COPPER_COINS:
66         return 2;
67     case MON_SILVER_COINS:
68         return 5;
69     case MON_GOLD_COINS:
70         return 10;
71     case MON_MITHRIL_COINS:
72     case MON_MITHRIL_GOLEM:
73         return 16;
74     case MON_ADAMANT_COINS:
75         return 17;
76     }
77
78     return 0;
79 }
80
81 /*!
82  * @brief モンスターが死亡した時の処理 /
83  * Handle the "death" of a monster.
84  * @param m_idx 死亡したモンスターのID
85  * @param drop_item TRUEならばモンスターのドロップ処理を行う
86  * @return 撃破されたモンスターの述語
87  * @details
88  * <pre>
89  * Disperse treasures centered at the monster location based on the
90  * various flags contained in the monster flags fields.
91  * Check for "Quest" completion when a quest monster is killed.
92  * Note that only the player can induce "monster_death()" on Uniques.
93  * Thus (for now) all Quest monsters should be Uniques.
94  * Note that monsters can now carry objects, and when a monster dies,
95  * it drops all of its objects, which may disappear in crowded rooms.
96  * </pre>
97  */
98 void monster_death(player_type *player_ptr, MONSTER_IDX m_idx, bool drop_item)
99 {
100     floor_type *floor_ptr = player_ptr->current_floor_ptr;
101     monster_type *m_ptr = &floor_ptr->m_list[m_idx];
102     monster_race *r_ptr = &r_info[m_ptr->r_idx];
103
104     bool do_gold = (!(r_ptr->flags1 & RF1_ONLY_ITEM));
105     bool do_item = (!(r_ptr->flags1 & RF1_ONLY_GOLD));
106     bool cloned = (m_ptr->smart & SM_CLONED) ? TRUE : FALSE;
107     int force_coin = get_coin_type(m_ptr->r_idx);
108
109     bool drop_chosen_item = drop_item && !cloned && !floor_ptr->inside_arena && !player_ptr->phase_out && !is_pet(m_ptr);
110
111     if (current_world_ptr->timewalk_m_idx && current_world_ptr->timewalk_m_idx == m_idx) {
112         current_world_ptr->timewalk_m_idx = 0;
113     }
114
115     if (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) {
116         player_ptr->update |= (PU_MON_LITE);
117     }
118
119     POSITION y = m_ptr->fy;
120     POSITION x = m_ptr->fx;
121
122     if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) {
123         GAME_TEXT m_name[MAX_NLEN];
124
125         monster_desc(player_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
126         exe_write_diary(player_ptr, DIARY_NAMED_PET, 3, m_name);
127     }
128
129     for (int i = 0; i < 4; i++) {
130         if (r_ptr->blow[i].method != RBM_EXPLODE)
131             continue;
132
133         BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
134         EFFECT_ID typ = mbe_info[r_ptr->blow[i].effect].explode_type;
135         DICE_NUMBER d_dice = r_ptr->blow[i].d_dice;
136         DICE_SID d_side = r_ptr->blow[i].d_side;
137         HIT_POINT damage = damroll(d_dice, d_side);
138
139         project(player_ptr, m_idx, 3, y, x, damage, typ, flg, -1);
140         break;
141     }
142
143     if (m_ptr->mflag2 & MFLAG2_CHAMELEON) {
144         choose_new_monster(player_ptr, m_idx, TRUE, MON_CHAMELEON);
145         r_ptr = &r_info[m_ptr->r_idx];
146     }
147
148     check_quest_completion(player_ptr, m_ptr);
149
150     object_type forge;
151     object_type *q_ptr;
152     if (floor_ptr->inside_arena && !is_pet(m_ptr)) {
153         player_ptr->exit_bldg = TRUE;
154         if (player_ptr->arena_number > MAX_ARENA_MONS) {
155             msg_print(_("素晴らしい!君こそ真の勝利者だ。", "You are a Genuine Champion!"));
156         } else {
157             msg_print(_("勝利!チャンピオンへの道を進んでいる。", "Victorious! You're on your way to becoming Champion."));
158         }
159
160         if (arena_info[player_ptr->arena_number].tval) {
161             q_ptr = &forge;
162             object_prep(q_ptr, lookup_kind(arena_info[player_ptr->arena_number].tval, arena_info[player_ptr->arena_number].sval));
163             apply_magic(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART);
164             (void)drop_near(player_ptr, q_ptr, -1, y, x);
165         }
166
167         if (player_ptr->arena_number > MAX_ARENA_MONS)
168             player_ptr->arena_number++;
169         player_ptr->arena_number++;
170         if (record_arena) {
171             GAME_TEXT m_name[MAX_NLEN];
172             monster_desc(player_ptr, m_name, m_ptr, MD_WRONGDOER_NAME);
173             exe_write_diary(player_ptr, DIARY_ARENA, player_ptr->arena_number, m_name);
174         }
175     }
176
177     if (m_idx == player_ptr->riding && process_fall_off_horse(player_ptr, -1, FALSE)) {
178         msg_print(_("地面に落とされた。", "You have fallen from the pet you were riding."));
179     }
180
181     bool is_drop_corpse = one_in_(r_ptr->flags1 & RF1_UNIQUE ? 1 : 4);
182     is_drop_corpse &= (r_ptr->flags9 & (RF9_DROP_CORPSE | RF9_DROP_SKELETON)) != 0;
183     is_drop_corpse &= !(floor_ptr->inside_arena || player_ptr->phase_out || cloned || ((m_ptr->r_idx == today_mon) && is_pet(m_ptr)));
184     if (is_drop_corpse) {
185         bool corpse = FALSE;
186
187         if (!(r_ptr->flags9 & RF9_DROP_SKELETON))
188             corpse = TRUE;
189         else if ((r_ptr->flags9 & RF9_DROP_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE))
190             corpse = TRUE;
191         else if (r_ptr->flags9 & RF9_DROP_CORPSE) {
192             if ((0 - ((m_ptr->maxhp) / 4)) > m_ptr->hp) {
193                 if (one_in_(5))
194                     corpse = TRUE;
195             } else {
196                 if (!one_in_(5))
197                     corpse = TRUE;
198             }
199         }
200
201         q_ptr = &forge;
202         object_prep(q_ptr, lookup_kind(TV_CORPSE, (corpse ? SV_CORPSE : SV_SKELETON)));
203         apply_magic(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART);
204         q_ptr->pval = m_ptr->r_idx;
205         (void)drop_near(player_ptr, q_ptr, -1, y, x);
206     }
207
208     monster_drop_carried_objects(player_ptr, m_ptr);
209
210     u32b mo_mode = 0L;
211     if (r_ptr->flags1 & RF1_DROP_GOOD)
212         mo_mode |= AM_GOOD;
213     if (r_ptr->flags1 & RF1_DROP_GREAT)
214         mo_mode |= AM_GREAT;
215
216     switch (m_ptr->r_idx) {
217     case MON_PINK_HORROR: {
218         if (floor_ptr->inside_arena || player_ptr->phase_out)
219             break;
220
221         bool notice = FALSE;
222         for (int i = 0; i < 2; i++) {
223             POSITION wy = y, wx = x;
224             bool pet = is_pet(m_ptr);
225             BIT_FLAGS mode = 0L;
226
227             if (pet) {
228                 mode |= PM_FORCE_PET;
229             }
230
231             if (summon_specific(player_ptr, (pet ? -1 : m_idx), wy, wx, 100, SUMMON_BLUE_HORROR, mode)) {
232                 if (player_can_see_bold(player_ptr, wy, wx))
233                     notice = TRUE;
234             }
235         }
236
237         if (notice) {
238             msg_print(_("ピンク・ホラーは分裂した!", "The Pink horror divides!"));
239         }
240
241         break;
242     }
243     case MON_BLOODLETTER: {
244         if (!drop_chosen_item || (randint1(100) >= 15))
245             break;
246
247         q_ptr = &forge;
248         object_prep(q_ptr, lookup_kind(TV_SWORD, SV_BLADE_OF_CHAOS));
249         apply_magic(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART | mo_mode);
250         (void)drop_near(player_ptr, q_ptr, -1, y, x);
251         break;
252     }
253     case MON_RAAL: {
254         if (!drop_chosen_item || (floor_ptr->dun_level <= 9))
255             break;
256
257         q_ptr = &forge;
258         object_wipe(q_ptr);
259         if ((floor_ptr->dun_level > 49) && one_in_(5))
260             get_obj_num_hook = kind_is_good_book;
261         else
262             get_obj_num_hook = kind_is_book;
263
264         make_object(player_ptr, q_ptr, mo_mode);
265         (void)drop_near(player_ptr, q_ptr, -1, y, x);
266         break;
267     }
268     case MON_DAWN: {
269         if (floor_ptr->inside_arena || player_ptr->phase_out)
270             break;
271         if (one_in_(7))
272             break;
273
274         POSITION wy = y, wx = x;
275         int attempts = 100;
276         bool pet = is_pet(m_ptr);
277         do {
278             scatter(player_ptr, &wy, &wx, y, x, 20, 0);
279         } while (!(in_bounds(floor_ptr, wy, wx) && is_cave_empty_bold2(player_ptr, wy, wx)) && --attempts);
280
281         if (attempts <= 0)
282             break;
283
284         BIT_FLAGS mode = 0L;
285         if (pet)
286             mode |= PM_FORCE_PET;
287
288         if (summon_specific(player_ptr, (pet ? -1 : m_idx), wy, wx, 100, SUMMON_DAWN, mode)) {
289             if (player_can_see_bold(player_ptr, wy, wx))
290                 msg_print(_("新たな戦士が現れた!", "A new warrior steps forth!"));
291         }
292
293         break;
294     }
295     case MON_UNMAKER: {
296         BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
297         (void)project(player_ptr, m_idx, 6, y, x, 100, GF_CHAOS, flg, -1);
298         break;
299     }
300     case MON_UNICORN_ORD:
301     case MON_MORGOTH:
302     case MON_ONE_RING: {
303         if (player_ptr->pseikaku != PERSONALITY_LAZY)
304             break;
305         if (!drop_chosen_item)
306             break;
307
308         ARTIFACT_IDX a_idx = 0;
309         artifact_type *a_ptr = NULL;
310         do {
311             switch (randint0(3)) {
312             case 0:
313                 a_idx = ART_NAMAKE_HAMMER;
314                 break;
315             case 1:
316                 a_idx = ART_NAMAKE_BOW;
317                 break;
318             case 2:
319                 a_idx = ART_NAMAKE_ARMOR;
320                 break;
321             }
322
323             a_ptr = &a_info[a_idx];
324         } while (a_ptr->cur_num);
325
326         if (create_named_art(player_ptr, a_idx, y, x)) {
327             a_ptr->cur_num = 1;
328             if (current_world_ptr->character_dungeon)
329                 a_ptr->floor_id = player_ptr->floor_id;
330         } else if (!preserve_mode)
331             a_ptr->cur_num = 1;
332
333         break;
334     }
335     case MON_SERPENT: {
336         if (!drop_chosen_item)
337             break;
338
339         q_ptr = &forge;
340         object_prep(q_ptr, lookup_kind(TV_HAFTED, SV_GROND));
341         q_ptr->name1 = ART_GROND;
342         apply_magic(player_ptr, q_ptr, -1, AM_GOOD | AM_GREAT);
343         (void)drop_near(player_ptr, q_ptr, -1, y, x);
344         q_ptr = &forge;
345         object_prep(q_ptr, lookup_kind(TV_CROWN, SV_CHAOS));
346         q_ptr->name1 = ART_CHAOS;
347         apply_magic(player_ptr, q_ptr, -1, AM_GOOD | AM_GREAT);
348         (void)drop_near(player_ptr, q_ptr, -1, y, x);
349         break;
350     }
351     case MON_B_DEATH_SWORD: {
352         if (!drop_chosen_item)
353             break;
354
355         q_ptr = &forge;
356         object_prep(q_ptr, lookup_kind(TV_SWORD, randint1(2)));
357         (void)drop_near(player_ptr, q_ptr, -1, y, x);
358         break;
359     }
360     case MON_A_GOLD:
361     case MON_A_SILVER: {
362         bool is_drop_can = drop_chosen_item;
363         bool is_silver = m_ptr->r_idx == MON_A_SILVER;
364         is_silver &= r_ptr->r_akills % 5 == 0;
365         is_drop_can &= (m_ptr->r_idx == MON_A_GOLD) || is_silver;
366         if (!is_drop_can)
367             break;
368
369         q_ptr = &forge;
370         object_prep(q_ptr, lookup_kind(TV_CHEST, SV_CHEST_KANDUME));
371         apply_magic(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART);
372         (void)drop_near(player_ptr, q_ptr, -1, y, x);
373         break;
374     }
375
376     case MON_ROLENTO: {
377         BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
378         (void)project(player_ptr, m_idx, 3, y, x, damroll(20, 10), GF_FIRE, flg, -1);
379         break;
380     }
381     default: {
382         if (!drop_chosen_item)
383             break;
384
385         switch (r_ptr->d_char) {
386         case '(': {
387             if (floor_ptr->dun_level <= 0)
388                 break;
389
390             q_ptr = &forge;
391             object_wipe(q_ptr);
392             get_obj_num_hook = kind_is_cloak;
393             make_object(player_ptr, q_ptr, mo_mode);
394             (void)drop_near(player_ptr, q_ptr, -1, y, x);
395             break;
396         }
397         case '/': {
398             if (floor_ptr->dun_level <= 4)
399                 break;
400
401             q_ptr = &forge;
402             object_wipe(q_ptr);
403             get_obj_num_hook = kind_is_polearm;
404             make_object(player_ptr, q_ptr, mo_mode);
405             (void)drop_near(player_ptr, q_ptr, -1, y, x);
406             break;
407         }
408         case '[': {
409             if (floor_ptr->dun_level <= 19)
410                 break;
411
412             q_ptr = &forge;
413             object_wipe(q_ptr);
414             get_obj_num_hook = kind_is_armor;
415             make_object(player_ptr, q_ptr, mo_mode);
416             (void)drop_near(player_ptr, q_ptr, -1, y, x);
417             break;
418         }
419         case '\\': {
420             if (floor_ptr->dun_level <= 4)
421                 break;
422             q_ptr = &forge;
423             object_wipe(q_ptr);
424             get_obj_num_hook = kind_is_hafted;
425             make_object(player_ptr, q_ptr, mo_mode);
426             (void)drop_near(player_ptr, q_ptr, -1, y, x);
427             break;
428         }
429         case '|': {
430             if (m_ptr->r_idx == MON_STORMBRINGER)
431                 break;
432
433             q_ptr = &forge;
434             object_wipe(q_ptr);
435             get_obj_num_hook = kind_is_sword;
436             make_object(player_ptr, q_ptr, mo_mode);
437             (void)drop_near(player_ptr, q_ptr, -1, y, x);
438             break;
439         }
440         }
441     }
442     }
443
444     if (drop_chosen_item) {
445         ARTIFACT_IDX a_idx = 0;
446         PERCENTAGE chance = 0;
447         for (int i = 0; i < 4; i++) {
448             if (!r_ptr->artifact_id[i])
449                 break;
450             a_idx = r_ptr->artifact_id[i];
451             chance = r_ptr->artifact_percent[i];
452             if (randint0(100) < chance || current_world_ptr->wizard) {
453                 artifact_type *a_ptr = &a_info[a_idx];
454                 if (!a_ptr->cur_num) {
455                     if (create_named_art(player_ptr, a_idx, y, x)) {
456                         a_ptr->cur_num = 1;
457                         if (current_world_ptr->character_dungeon)
458                             a_ptr->floor_id = player_ptr->floor_id;
459                     } else if (!preserve_mode) {
460                         a_ptr->cur_num = 1;
461                     }
462                 }
463             }
464         }
465
466         if ((r_ptr->flags7 & RF7_GUARDIAN) && (d_info[player_ptr->dungeon_idx].final_guardian == m_ptr->r_idx)) {
467             KIND_OBJECT_IDX k_idx = d_info[player_ptr->dungeon_idx].final_object != 0 ? d_info[player_ptr->dungeon_idx].final_object
468                                                                                       : lookup_kind(TV_SCROLL, SV_SCROLL_ACQUIREMENT);
469
470             if (d_info[player_ptr->dungeon_idx].final_artifact != 0) {
471                 a_idx = d_info[player_ptr->dungeon_idx].final_artifact;
472                 artifact_type *a_ptr = &a_info[a_idx];
473                 if (!a_ptr->cur_num) {
474                     if (create_named_art(player_ptr, a_idx, y, x)) {
475                         a_ptr->cur_num = 1;
476                         if (current_world_ptr->character_dungeon)
477                             a_ptr->floor_id = player_ptr->floor_id;
478                     } else if (!preserve_mode) {
479                         a_ptr->cur_num = 1;
480                     }
481
482                     if (!d_info[player_ptr->dungeon_idx].final_object)
483                         k_idx = 0;
484                 }
485             }
486
487             if (k_idx != 0) {
488                 q_ptr = &forge;
489                 object_prep(q_ptr, k_idx);
490                 apply_magic(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART | AM_GOOD);
491                 (void)drop_near(player_ptr, q_ptr, -1, y, x);
492             }
493
494             msg_format(_("あなたは%sを制覇した!", "You have conquered %s!"), d_name + d_info[player_ptr->dungeon_idx].name);
495         }
496     }
497
498     int number = 0;
499     if ((r_ptr->flags1 & RF1_DROP_60) && (randint0(100) < 60))
500         number++;
501     if ((r_ptr->flags1 & RF1_DROP_90) && (randint0(100) < 90))
502         number++;
503     if (r_ptr->flags1 & RF1_DROP_1D2)
504         number += damroll(1, 2);
505     if (r_ptr->flags1 & RF1_DROP_2D2)
506         number += damroll(2, 2);
507     if (r_ptr->flags1 & RF1_DROP_3D2)
508         number += damroll(3, 2);
509     if (r_ptr->flags1 & RF1_DROP_4D2)
510         number += damroll(4, 2);
511
512     if (cloned && !(r_ptr->flags1 & RF1_UNIQUE))
513         number = 0;
514
515     if (is_pet(m_ptr) || player_ptr->phase_out || floor_ptr->inside_arena)
516         number = 0;
517
518     if (!drop_item && (r_ptr->d_char != '$'))
519         number = 0;
520
521     if ((r_ptr->flags2 & (RF2_MULTIPLY)) && (r_ptr->r_akills > 1024))
522         number = 0;
523
524     coin_type = force_coin;
525     floor_ptr->object_level = (floor_ptr->dun_level + r_ptr->level) / 2;
526
527     int dump_item = 0;
528     int dump_gold = 0;
529     for (int i = 0; i < number; i++) {
530         q_ptr = &forge;
531         object_wipe(q_ptr);
532
533         if (do_gold && (!do_item || (randint0(100) < 50))) {
534             if (!make_gold(floor_ptr, q_ptr))
535                 continue;
536             dump_gold++;
537         } else {
538             if (!make_object(player_ptr, q_ptr, mo_mode))
539                 continue;
540             dump_item++;
541         }
542
543         (void)drop_near(player_ptr, q_ptr, -1, y, x);
544     }
545
546     floor_ptr->object_level = floor_ptr->base_level;
547     coin_type = 0;
548     bool visible = (m_ptr->ml && !player_ptr->image) || ((r_ptr->flags1 & RF1_UNIQUE) != 0);
549     if (visible && (dump_item || dump_gold)) {
550         lore_treasure(player_ptr, m_idx, dump_item, dump_gold);
551     }
552
553     if (!(r_ptr->flags1 & RF1_QUESTOR))
554         return;
555     if (player_ptr->phase_out)
556         return;
557     if ((m_ptr->r_idx != MON_SERPENT) || cloned)
558         return;
559
560     current_world_ptr->total_winner = TRUE;
561     player_ptr->redraw |= (PR_TITLE);
562     play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FINAL_QUEST_CLEAR);
563     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("見事に変愚蛮怒の勝利者となった!", "finally became *WINNER* of Hengband!"));
564     admire_from_patron(player_ptr);
565     msg_print(_("*** おめでとう ***", "*** CONGRATULATIONS ***"));
566     msg_print(_("あなたはゲームをコンプリートしました。", "You have won the game!"));
567     msg_print(_("準備が整ったら引退(自殺コマンド)しても結構です。", "You may retire (commit suicide) when you are ready."));
568 }
569
570 /*!
571  * @brief モンスターを撃破した際の述語メッセージを返す /
572  * Return monster death string
573  * @param r_ptr 撃破されたモンスターの種族情報を持つ構造体の参照ポインタ
574  * @return 撃破されたモンスターの述語
575  */
576 concptr extract_note_dies(MONRACE_IDX r_idx)
577 {
578     monster_race *r_ptr = &r_info[r_idx];
579     if (monster_living(r_idx))
580         return _("は死んだ。", " dies.");
581
582     for (int i = 0; i < 4; i++) {
583         if (r_ptr->blow[i].method == RBM_EXPLODE) {
584             return _("は爆発して粉々になった。", " explodes into tiny shreds.");
585         }
586     }
587
588     return _("を倒した。", " is destroyed.");
589 }