OSDN Git Service

768c244863dc32b18b4dc18aa45bf4a76ecaccb5
[hengband/hengband.git] / src / lore / lore-store.c
1 /*!
2  * @brief モンスターの思い出を記憶する処理
3  * @date 2020/06/09
4  * @author Hourier
5  */
6
7 #include "lore/lore-store.h"
8 #include "floor/floor.h"
9 #include "monster-race/race-flags1.h"
10 #include "monster/monster-info.h"
11 #include "system/monster-type-definition.h"
12
13 /*!
14  * @brief モンスターの調査による思い出補完処理 / Learn about a monster (by "probing" it)
15  * @param player_ptr プレーヤーへの参照ポインタ
16  * @param r_idx 補完されるモンスター種族ID
17  * @return 明らかになった情報の度数
18  * @details
19  * Return the number of new flags learnt.  -Mogami-
20  */
21 int lore_do_probe(player_type *player_ptr, MONRACE_IDX r_idx)
22 {
23     int n = 0;
24     monster_race *r_ptr = &r_info[r_idx];
25     if (r_ptr->r_wake != MAX_UCHAR)
26         n++;
27     if (r_ptr->r_ignore != MAX_UCHAR)
28         n++;
29     r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
30
31     for (int i = 0; i < 4; i++) {
32         if (r_ptr->blow[i].effect || r_ptr->blow[i].method) {
33             if (r_ptr->r_blows[i] != MAX_UCHAR)
34                 n++;
35             r_ptr->r_blows[i] = MAX_UCHAR;
36         }
37     }
38
39     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)
40         + ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) + ((r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) + ((r_ptr->flags1 & RF1_DROP_60) ? 1 : 0));
41
42     if (!(r_ptr->flags1 & RF1_ONLY_GOLD)) {
43         if (r_ptr->r_drop_item != tmp_byte)
44             n++;
45         r_ptr->r_drop_item = tmp_byte;
46     }
47     if (!(r_ptr->flags1 & RF1_ONLY_ITEM)) {
48         if (r_ptr->r_drop_gold != tmp_byte)
49             n++;
50         r_ptr->r_drop_gold = tmp_byte;
51     }
52
53     if (r_ptr->r_cast_spell != MAX_UCHAR)
54         n++;
55     r_ptr->r_cast_spell = MAX_UCHAR;
56
57     for (int i = 0; i < 32; i++) {
58         if (!(r_ptr->r_flags1 & (1L << i)) && (r_ptr->flags1 & (1L << i)))
59             n++;
60         if (!(r_ptr->r_flags2 & (1L << i)) && (r_ptr->flags2 & (1L << i)))
61             n++;
62         if (!(r_ptr->r_flags3 & (1L << i)) && (r_ptr->flags3 & (1L << i)))
63             n++;
64         if (!(r_ptr->r_flags4 & (1L << i)) && (r_ptr->flags4 & (1L << i)))
65             n++;
66         if (!(r_ptr->r_flags5 & (1L << i)) && (r_ptr->a_ability_flags1 & (1L << i)))
67             n++;
68         if (!(r_ptr->r_flags6 & (1L << i)) && (r_ptr->a_ability_flags2 & (1L << i)))
69             n++;
70         if (!(r_ptr->r_flagsr & (1L << i)) && (r_ptr->flagsr & (1L << i)))
71             n++;
72     }
73
74     r_ptr->r_flags1 = r_ptr->flags1;
75     r_ptr->r_flags2 = r_ptr->flags2;
76     r_ptr->r_flags3 = r_ptr->flags3;
77     r_ptr->r_flags4 = r_ptr->flags4;
78     r_ptr->r_flags5 = r_ptr->a_ability_flags1;
79     r_ptr->r_flags6 = r_ptr->a_ability_flags2;
80     r_ptr->r_flagsr = r_ptr->flagsr;
81
82     if (!(r_ptr->r_xtra1 & MR1_EVOLUTION))
83         n++;
84     r_ptr->r_xtra1 |= MR1_EVOLUTION;
85
86     if (player_ptr->monster_race_idx == r_idx) {
87         player_ptr->window |= (PW_MONSTER);
88     }
89
90     return n;
91 }
92
93 /*!
94  * @brief モンスターの撃破に伴うドロップ情報の記憶処理 / Take note that the given monster just dropped some treasure
95  * @param player_ptr プレーヤーへの参照ポインタ
96  * @param m_idx モンスター情報のID
97  * @param num_item 手に入れたアイテム数
98  * @param num_gold 手に入れた財宝の単位数
99  * @return なし
100  */
101 void lore_treasure(player_type *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold)
102 {
103     monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
104     monster_race *r_ptr = &r_info[m_ptr->r_idx];
105
106     if (!is_original_ap(m_ptr))
107         return;
108
109     if (num_item > r_ptr->r_drop_item)
110         r_ptr->r_drop_item = num_item;
111     if (num_gold > r_ptr->r_drop_gold)
112         r_ptr->r_drop_gold = num_gold;
113
114     if (r_ptr->flags1 & (RF1_DROP_GOOD))
115         r_ptr->r_flags1 |= (RF1_DROP_GOOD);
116     if (r_ptr->flags1 & (RF1_DROP_GREAT))
117         r_ptr->r_flags1 |= (RF1_DROP_GREAT);
118     if (player_ptr->monster_race_idx == m_ptr->r_idx)
119         player_ptr->window |= (PW_MONSTER);
120 }