OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / monster-floor / monster-death-util.cpp
1 #include "monster-floor/monster-death-util.h"
2 #include "monster-race/monster-race.h"
3 #include "monster-race/race-flags1.h"
4 #include "monster-race/race-indice-types.h"
5 #include "monster/monster-info.h"
6 #include "monster/smart-learn-types.h"
7 #include "system/floor-type-definition.h"
8 #include "system/monster-entity.h"
9 #include "system/monster-race-info.h"
10 #include "system/player-type-definition.h"
11 #include "util/bit-flags-calculator.h"
12
13 /*!
14  * @brief モンスターを倒した際の財宝svalを返す
15  * @param r_idx 倒したモンスターの種族ID
16  * @return 財宝のsval
17  * @details
18  * Hack -- Return the "automatic coin type" of a monster race
19  * Used to allocate proper treasure when "Creeping coins" die
20  * Note the use of actual "monster names"
21  */
22 static int get_coin_type(MonsterRaceId r_idx)
23 {
24     switch (r_idx) {
25     case MonsterRaceId::COPPER_COINS:
26         return 2;
27     case MonsterRaceId::SILVER_COINS:
28         return 5;
29     case MonsterRaceId::GOLD_COINS:
30         return 10;
31     case MonsterRaceId::MITHRIL_COINS:
32     case MonsterRaceId::MITHRIL_GOLEM:
33         return 16;
34     case MonsterRaceId::ADAMANT_COINS:
35         return 17;
36     default:
37         return 0;
38     }
39 }
40
41 monster_death_type *initialize_monster_death_type(PlayerType *player_ptr, monster_death_type *md_ptr, MONSTER_IDX m_idx, bool drop_item)
42 {
43     auto *floor_ptr = player_ptr->current_floor_ptr;
44     md_ptr->m_idx = m_idx;
45     md_ptr->m_ptr = &floor_ptr->m_list[m_idx];
46     md_ptr->r_ptr = &monraces_info[md_ptr->m_ptr->r_idx];
47     md_ptr->do_gold = (md_ptr->r_ptr->drop_flags.has_none_of({ MonsterDropType::ONLY_ITEM, MonsterDropType::DROP_GOOD, MonsterDropType::DROP_GREAT }));
48     md_ptr->do_item = (md_ptr->r_ptr->drop_flags.has_not(MonsterDropType::ONLY_GOLD) || md_ptr->r_ptr->drop_flags.has_any_of({ MonsterDropType::DROP_GOOD, MonsterDropType::DROP_GREAT }));
49     md_ptr->cloned = md_ptr->m_ptr->mflag2.has(MonsterConstantFlagType::CLONED);
50     md_ptr->force_coin = get_coin_type(md_ptr->m_ptr->r_idx);
51     md_ptr->drop_chosen_item = drop_item && !md_ptr->cloned && !floor_ptr->inside_arena && !player_ptr->phase_out && !md_ptr->m_ptr->is_pet();
52     return md_ptr;
53 }