OSDN Git Service

[Refactor] #38862 Moved spells-* to spell/
[hengband/hengband.git] / src / monster / quantum-effect.c
1 #include "system/angband.h"
2 #include "quantum-effect.h"
3 #include "spell/monster-spell.h"
4 #include "spell/spells3.h"
5
6 /*!
7  * @brief ユニークでない量子生物を消滅させる
8  * @param target_ptr プレーヤーへの参照ポインタ
9  * @param m_idx モンスターID
10  * @param see_m モンスターが視界内にいたらTRUE
11  * @return なし
12  */
13 static void vanish_nonunique(player_type *target_ptr, MONSTER_IDX m_idx, bool see_m)
14 {
15         monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
16         if (see_m)
17         {
18                 GAME_TEXT m_name[MAX_NLEN];
19                 monster_desc(target_ptr, m_name, m_ptr, 0);
20                 msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
21         }
22
23         monster_death(target_ptr, m_idx, FALSE);
24         delete_monster_idx(target_ptr, m_idx);
25         if (is_pet(m_ptr) && !(m_ptr->ml))
26         {
27                 msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment."));
28         }
29 }
30
31
32 /*!
33  * todo ユニークとプレーヤーとの間でしか効果が発生しない。ユニークとその他のモンスター間では何もしなくてよい?
34  * @brief 量子生物ユニークの量子的効果 (ショート・テレポートまたは距離10のテレポート・アウェイ)を実行する
35  * @param target_ptr プレーヤーへの参照ポインタ
36  * @param m_idx モンスターID
37  * @param see_m モンスターが視界内にいたらTRUE
38  * @return なし
39  * @details
40  * プレーヤーが量子生物を観測しているか、量子生物がプレーヤーを観測している場合、互いの相対的な位置を確定させる
41  * 波動関数の収縮はテレポートではないので反テレポート無効
42  * @notes
43  * パターンは収縮どころか拡散しているが、この際気にしてはいけない
44  */
45 static void produce_quantum_effect(player_type *target_ptr, MONSTER_IDX m_idx, bool see_m)
46 {
47         monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
48         bool coherent = los(target_ptr, m_ptr->fy, m_ptr->fx, target_ptr->y, target_ptr->x);
49         if (!see_m && !coherent) return;
50
51         if (see_m)
52         {
53                 GAME_TEXT m_name[MAX_NLEN];
54                 monster_desc(target_ptr, m_name, m_ptr, 0);
55                 msg_format(_("%sは量子的効果を起こした!", "%^s produced a decoherence!"), m_name);
56         }
57         else
58         {
59                 msg_print(_("量子的効果が起こった!", "A decoherence was produced!"));
60         }
61
62         bool target = one_in_(2);
63         const int blink = 32 * 5 + 4;
64         if (target)
65         {
66                 (void)monspell_to_monster(target_ptr, blink, m_ptr->fy, m_ptr->fx, m_idx, m_idx, TRUE);
67         }
68         else
69         {
70                 teleport_player_away(m_idx, target_ptr, 10, TRUE);
71         }
72 }
73
74
75 /*!
76  * @brief 量子生物の量子的効果を実行する
77  * @param target_ptr プレーヤーへの参照ポインタ
78  * @param m_idx モンスターID
79  * @param see_m モンスターが視界内にいたらTRUE
80  * @return モンスターが量子的効果により消滅したらTRUE
81  */
82 bool process_quantum_effect(player_type *target_ptr, MONSTER_IDX m_idx, bool see_m)
83 {
84         monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
85         monster_race *r_ptr = &r_info[m_ptr->r_idx];
86         if ((r_ptr->flags2 & RF2_QUANTUM) == 0) return FALSE;
87         if (!randint0(2)) return FALSE;
88         if (randint0((m_idx % 100) + 10)) return FALSE;
89
90         bool can_disappear = (r_ptr->flags1 & RF1_UNIQUE) == 0;
91         can_disappear &= (r_ptr->flags1 & RF1_QUESTOR) == 0;
92         if (can_disappear)
93         {
94                 vanish_nonunique(target_ptr, m_idx, see_m);
95                 return TRUE;
96         }
97
98         produce_quantum_effect(target_ptr, m_idx, see_m);
99         return FALSE;
100 }