2 * @brief モンスターの思い出を記憶する処理
7 #include "lore/lore-store.h"
8 #include "core/window-redrawer.h"
9 #include "monster-race/monster-race.h"
10 #include "monster-race/race-feature-mask.h"
11 #include "monster-race/race-flags1.h"
12 #include "monster/monster-info.h"
13 #include "system/floor-type-definition.h"
14 #include "system/monster-race-definition.h"
15 #include "system/monster-type-definition.h" //!< @todo 違和感、m_ptr は外から与えることとしたい.
16 #include "system/player-type-definition.h"
19 static int count_lore_mflag_group(const EnumClassFlagGroup<T> &flags, const EnumClassFlagGroup<T> &r_flags)
21 auto result_flags = flags;
22 auto num = result_flags.reset(r_flags).count();
27 * @brief モンスターの調査による思い出補完処理 / Learn about a monster (by "probing" it)
28 * @param player_ptr プレイヤーへの参照ポインタ
29 * @param r_idx 補完されるモンスター種族ID
30 * @return 明らかになった情報の度数
32 * Return the number of new flags learnt. -Mogami-
34 int lore_do_probe(PlayerType *player_ptr, MonsterRaceId r_idx)
37 auto *r_ptr = &monraces_info[r_idx];
38 if (r_ptr->r_wake != MAX_UCHAR) {
41 if (r_ptr->r_ignore != MAX_UCHAR) {
44 r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
46 for (int i = 0; i < 4; i++) {
47 if (r_ptr->blow[i].effect != RaceBlowEffectType::NONE || r_ptr->blow[i].method != RaceBlowMethodType::NONE) {
48 if (r_ptr->r_blows[i] != MAX_UCHAR) {
51 r_ptr->r_blows[i] = MAX_UCHAR;
55 byte tmp_byte = ((r_ptr->drop_flags.has(MonsterDropType::DROP_4D2) ? 8 : 0) + (r_ptr->drop_flags.has(MonsterDropType::DROP_3D2) ? 6 : 0) + (r_ptr->drop_flags.has(MonsterDropType::DROP_2D2) ? 4 : 0) + (r_ptr->drop_flags.has(MonsterDropType::DROP_1D2) ? 2 : 0) + (r_ptr->drop_flags.has(MonsterDropType::DROP_90) ? 1 : 0) + (r_ptr->drop_flags.has(MonsterDropType::DROP_60) ? 1 : 0));
57 if (r_ptr->drop_flags.has_not(MonsterDropType::ONLY_GOLD)) {
58 if (r_ptr->r_drop_item != tmp_byte) {
61 r_ptr->r_drop_item = tmp_byte;
63 if (r_ptr->drop_flags.has_not(MonsterDropType::ONLY_ITEM)) {
64 if (r_ptr->r_drop_gold != tmp_byte) {
67 r_ptr->r_drop_gold = tmp_byte;
70 if (r_ptr->r_cast_spell != MAX_UCHAR) {
73 r_ptr->r_cast_spell = MAX_UCHAR;
75 for (int i = 0; i < 32; i++) {
76 if (!(r_ptr->r_flags1 & (1UL << i)) && (r_ptr->flags1 & (1UL << i))) {
79 if (!(r_ptr->r_flags2 & (1UL << i)) && (r_ptr->flags2 & (1UL << i))) {
82 if (!(r_ptr->r_flags3 & (1UL << i)) && (r_ptr->flags3 & (1UL << i))) {
87 n += count_lore_mflag_group(r_ptr->resistance_flags, r_ptr->r_resistance_flags);
88 n += count_lore_mflag_group(r_ptr->ability_flags, r_ptr->r_ability_flags);
89 n += count_lore_mflag_group(r_ptr->behavior_flags, r_ptr->r_behavior_flags);
90 n += count_lore_mflag_group(r_ptr->drop_flags, r_ptr->r_drop_flags);
91 n += count_lore_mflag_group(r_ptr->feature_flags & feature_lore_flags2, r_ptr->r_feature_flags);
93 r_ptr->r_flags1 = r_ptr->flags1;
94 r_ptr->r_flags2 = r_ptr->flags2;
95 r_ptr->r_flags3 = r_ptr->flags3;
96 r_ptr->r_resistance_flags = r_ptr->resistance_flags;
97 r_ptr->r_ability_flags = r_ptr->ability_flags;
98 r_ptr->r_behavior_flags = r_ptr->behavior_flags;
99 r_ptr->r_drop_flags = r_ptr->drop_flags;
100 r_ptr->r_feature_flags.set(r_ptr->feature_flags & feature_lore_flags2);
102 if (!r_ptr->r_can_evolve) {
105 r_ptr->r_can_evolve = true;
107 if (player_ptr->monster_race_idx == r_idx) {
108 player_ptr->window_flags |= (PW_MONSTER);
115 * @brief モンスターの撃破に伴うドロップ情報の記憶処理 / Take note that the given monster just dropped some treasure
116 * @param player_ptr プレイヤーへの参照ポインタ
117 * @param m_idx モンスター情報のID
118 * @param num_item 手に入れたアイテム数
119 * @param num_gold 手に入れた財宝の単位数
121 void lore_treasure(PlayerType *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold)
123 auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
124 auto *r_ptr = &monraces_info[m_ptr->r_idx];
126 if (!m_ptr->is_original_ap()) {
130 if (num_item > r_ptr->r_drop_item) {
131 r_ptr->r_drop_item = num_item;
133 if (num_gold > r_ptr->r_drop_gold) {
134 r_ptr->r_drop_gold = num_gold;
137 if (r_ptr->drop_flags.has(MonsterDropType::DROP_GOOD)) {
138 r_ptr->r_drop_flags.set(MonsterDropType::DROP_GOOD);
140 if (r_ptr->drop_flags.has(MonsterDropType::DROP_GREAT)) {
141 r_ptr->r_drop_flags.set(MonsterDropType::DROP_GREAT);
143 if (player_ptr->monster_race_idx == m_ptr->r_idx) {
144 player_ptr->window_flags |= (PW_MONSTER);