OSDN Git Service

Merge remote-tracking branch 'remotes/origin/For2.2.2-Fix-Hourier' into For2.2.2...
[hengband/hengband.git] / src / mspell / mspell-util.c
1 #include "mspell/mspell-util.h"
2 #include "core/disturbance.h"
3 #include "grid/grid.h"
4 #include "monster/monster-info.h"
5 #include "system/floor-type-definition.h"
6 #include "view/display-messages.h"
7
8 /*!
9 * @brief プレイヤーがモンスターを見ることができるかの判定 /
10 * @param floor_ptr 現在フロアへの参照ポインタ
11 * @param m_idx モンスターID
12 * @return プレイヤーがモンスターを見ることができるならTRUE、そうでなければFALSEを返す。
13 */
14 bool see_monster(player_type* player_ptr, MONSTER_IDX m_idx)
15 {
16     monster_type* m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
17     return is_seen(player_ptr, m_ptr);
18 }
19
20 /*!
21  * @brief モンスター2体がプレイヤーの近くに居るかの判定 /
22  * @param floor_ptr 現在フロアへの参照ポインタ
23  * @param m_idx モンスターID一体目
24  * @param t_idx モンスターID二体目
25  * @return モンスター2体のどちらかがプレイヤーの近くに居ればTRUE、どちらも遠ければFALSEを返す。
26  */
27 bool monster_near_player(floor_type* floor_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
28 {
29     monster_type* m_ptr = &floor_ptr->m_list[m_idx];
30     monster_type* t_ptr = &floor_ptr->m_list[t_idx];
31     return (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
32 }
33
34 /*!
35  * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数 /
36 * @param target_ptr プレーヤーへの参照ポインタ
37  * @param m_idx 呪文を唱えるモンスターID
38  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
39  * @param msg1 msg_flagがTRUEで、プレイヤーを対象とする場合のメッセージ
40  * @param msg2 msg_flagがTRUEで、モンスターを対象とする場合のメッセージ
41  * @param msg3 msg_flagがFALSEで、プレイヤーを対象とする場合のメッセージ
42  * @param msg4 msg_flagがFALSEで、モンスターを対象とする場合のメッセージ
43  * @param msg_flag_aux メッセージを分岐するためのフラグ
44  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
45  */
46 void monspell_message_base(player_type* target_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, concptr msg4, bool msg_flag_aux, int TARGET_TYPE)
47 {
48     floor_type* floor_ptr = target_ptr->current_floor_ptr;
49     bool known = monster_near_player(floor_ptr, m_idx, t_idx);
50     bool see_either = see_monster(target_ptr, m_idx) || see_monster(target_ptr, t_idx);
51     bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
52     bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
53     GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
54     monster_name(target_ptr, m_idx, m_name);
55     monster_name(target_ptr, t_idx, t_name);
56
57     if (mon_to_player || (mon_to_mon && known && see_either))
58         disturb(target_ptr, TRUE, TRUE);
59
60     if (msg_flag_aux) {
61         if (mon_to_player)
62             msg_format(msg1, m_name);
63         else if (mon_to_mon && known && see_either)
64             msg_format(msg2, m_name);
65     } else {
66         if (mon_to_player) {
67             msg_format(msg3, m_name);
68         } else if (mon_to_mon && known && see_either) {
69             msg_format(msg4, m_name, t_name);
70         }
71     }
72
73     if (mon_to_mon && known && !see_either)
74         floor_ptr->monster_noise = TRUE;
75 }
76
77 /*!
78 * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数。盲目時と通常時のメッセージを切り替える。 /
79 * @param target_ptr プレーヤーへの参照ポインタ
80 * @param m_idx 呪文を唱えるモンスターID
81 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
82 * @param msg1 プレイヤーが盲目状態のメッセージ
83 * @param msg2 プレイヤーが盲目でなく、プレイヤーを対象とする場合のメッセージ
84 * @param msg3 プレイヤーが盲目でなく、モンスター対象とする場合のメッセージ
85 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
86 */
87 void monspell_message(player_type* target_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, int TARGET_TYPE)
88 {
89     monspell_message_base(target_ptr, m_idx, t_idx, msg1, msg1, msg2, msg3, target_ptr->blind > 0, TARGET_TYPE);
90 }
91
92 /*!
93 * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数。対モンスターと対プレイヤーのメッセージを切り替える。 /
94 * @param target_ptr プレーヤーへの参照ポインタ
95 * @param m_idx 呪文を唱えるモンスターID
96 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
97 * @param msg1 プレイヤーを対象とする場合のメッセージ
98 * @param msg2 モンスター対象とする場合のメッセージ
99 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
100 */
101 void simple_monspell_message(player_type* target_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, int TARGET_TYPE)
102 {
103     monspell_message_base(target_ptr, m_idx, t_idx, msg1, msg2, msg1, msg2, target_ptr->blind > 0, TARGET_TYPE);
104 }