2 * @brief モンスターの思い出を記憶する処理
7 #include "lore/lore-store.h"
8 #include "core/window-redrawer.h"
9 #include "monster-race/race-flags1.h"
10 #include "monster-race/monster-race.h"
11 #include "monster/monster-info.h"
12 #include "system/floor-type-definition.h"
13 #include "system/monster-type-definition.h" //!< @todo 違和感、m_ptr は外から与えることとしたい.
16 * @brief モンスターの調査による思い出補完処理 / Learn about a monster (by "probing" it)
17 * @param player_ptr プレーヤーへの参照ポインタ
18 * @param r_idx 補完されるモンスター種族ID
19 * @return 明らかになった情報の度数
21 * Return the number of new flags learnt. -Mogami-
23 int lore_do_probe(player_type *player_ptr, MONRACE_IDX r_idx)
26 monster_race *r_ptr = &r_info[r_idx];
27 if (r_ptr->r_wake != MAX_UCHAR)
29 if (r_ptr->r_ignore != MAX_UCHAR)
31 r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
33 for (int i = 0; i < 4; i++) {
34 if (r_ptr->blow[i].effect || r_ptr->blow[i].method) {
35 if (r_ptr->r_blows[i] != MAX_UCHAR)
37 r_ptr->r_blows[i] = MAX_UCHAR;
41 byte tmp_byte = (((r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) + ((r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) + ((r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0)
42 + ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) + ((r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) + ((r_ptr->flags1 & RF1_DROP_60) ? 1 : 0));
44 if (!(r_ptr->flags1 & RF1_ONLY_GOLD)) {
45 if (r_ptr->r_drop_item != tmp_byte)
47 r_ptr->r_drop_item = tmp_byte;
49 if (!(r_ptr->flags1 & RF1_ONLY_ITEM)) {
50 if (r_ptr->r_drop_gold != tmp_byte)
52 r_ptr->r_drop_gold = tmp_byte;
55 if (r_ptr->r_cast_spell != MAX_UCHAR)
57 r_ptr->r_cast_spell = MAX_UCHAR;
59 for (int i = 0; i < 32; i++) {
60 if (!(r_ptr->r_flags1 & (1UL << i)) && (r_ptr->flags1 & (1UL << i)))
62 if (!(r_ptr->r_flags2 & (1UL << i)) && (r_ptr->flags2 & (1UL << i)))
64 if (!(r_ptr->r_flags3 & (1UL << i)) && (r_ptr->flags3 & (1UL << i)))
66 if (!(r_ptr->r_flags4 & (1UL << i)) && (r_ptr->flags4 & (1UL << i)))
68 if (!(r_ptr->r_flags5 & (1UL << i)) && (r_ptr->a_ability_flags1 & (1UL << i)))
70 if (!(r_ptr->r_flags6 & (1UL << i)) && (r_ptr->a_ability_flags2 & (1UL << i)))
72 if (!(r_ptr->r_flagsr & (1UL << i)) && (r_ptr->flagsr & (1UL << i)))
76 r_ptr->r_flags1 = r_ptr->flags1;
77 r_ptr->r_flags2 = r_ptr->flags2;
78 r_ptr->r_flags3 = r_ptr->flags3;
79 r_ptr->r_flags4 = r_ptr->flags4;
80 r_ptr->r_flags5 = r_ptr->a_ability_flags1;
81 r_ptr->r_flags6 = r_ptr->a_ability_flags2;
82 r_ptr->r_flagsr = r_ptr->flagsr;
84 if (!(r_ptr->r_xtra1 & MR1_EVOLUTION))
86 r_ptr->r_xtra1 |= MR1_EVOLUTION;
88 if (player_ptr->monster_race_idx == r_idx) {
89 player_ptr->window_flags |= (PW_MONSTER);
96 * @brief モンスターの撃破に伴うドロップ情報の記憶処理 / Take note that the given monster just dropped some treasure
97 * @param player_ptr プレーヤーへの参照ポインタ
98 * @param m_idx モンスター情報のID
99 * @param num_item 手に入れたアイテム数
100 * @param num_gold 手に入れた財宝の単位数
103 void lore_treasure(player_type *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold)
105 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
106 monster_race *r_ptr = &r_info[m_ptr->r_idx];
108 if (!is_original_ap(m_ptr))
111 if (num_item > r_ptr->r_drop_item)
112 r_ptr->r_drop_item = num_item;
113 if (num_gold > r_ptr->r_drop_gold)
114 r_ptr->r_drop_gold = num_gold;
116 if (r_ptr->flags1 & (RF1_DROP_GOOD))
117 r_ptr->r_flags1 |= (RF1_DROP_GOOD);
118 if (r_ptr->flags1 & (RF1_DROP_GREAT))
119 r_ptr->r_flags1 |= (RF1_DROP_GREAT);
120 if (player_ptr->monster_race_idx == m_ptr->r_idx)
121 player_ptr->window_flags |= (PW_MONSTER);