OSDN Git Service

[Refactor] #40014 Separated monster-describer.c/h from monster2.c/h
[hengband/hengband.git] / src / spell-kind / spells-pet.c
1 #include "spell-kind/spells-pet.h"
2 #include "effect/effect-characteristics.h"
3 #include "floor/floor.h"
4 #include "io/write-diary.h"
5 #include "monster-race/race-flags1.h"
6 #include "monster/monster-describer.h"
7 #include "monster/monster-description-types.h"
8 #include "monster/monster2.h"
9 #include "monster/smart-learn-types.h"
10 #include "spell/process-effect.h"
11 #include "spell/spells-type.h"
12
13 /*!
14  * @brief ペット爆破処理 /
15  * @return なし
16  */
17 void discharge_minion(player_type *caster_ptr)
18 {
19     bool okay = TRUE;
20     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
21         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
22         if (!m_ptr->r_idx || !is_pet(m_ptr))
23             continue;
24         if (m_ptr->nickname)
25             okay = FALSE;
26     }
27
28     if (!okay || caster_ptr->riding) {
29         if (!get_check(_("本当に全ペットを爆破しますか?", "You will blast all pets. Are you sure? ")))
30             return;
31     }
32
33     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
34         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
35         if (!m_ptr->r_idx || !is_pet(m_ptr))
36             continue;
37
38         monster_race *r_ptr;
39         r_ptr = &r_info[m_ptr->r_idx];
40         if (r_ptr->flags1 & RF1_UNIQUE) {
41             GAME_TEXT m_name[MAX_NLEN];
42             monster_desc(caster_ptr, m_name, m_ptr, 0x00);
43             msg_format(_("%sは爆破されるのを嫌がり、勝手に自分の世界へと帰った。", "%^s resists being blasted and runs away."), m_name);
44             delete_monster_idx(caster_ptr, i);
45             continue;
46         }
47
48         HIT_POINT dam = m_ptr->maxhp / 2;
49         if (dam > 100)
50             dam = (dam - 100) / 2 + 100;
51         if (dam > 400)
52             dam = (dam - 400) / 2 + 400;
53         if (dam > 800)
54             dam = 800;
55         project(caster_ptr, i, 2 + (r_ptr->level / 20), m_ptr->fy, m_ptr->fx, dam, GF_PLASMA, PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
56
57         if (record_named_pet && m_ptr->nickname) {
58             GAME_TEXT m_name[MAX_NLEN];
59
60             monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
61             exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_BLAST, m_name);
62         }
63
64         delete_monster_idx(caster_ptr, i);
65     }
66 }