OSDN Git Service

[Refactor] #40581 Separated special-death-switcher.c/h from monster-death.c
[hengband/hengband.git] / src / monster-floor / monster-death-util.c
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-type-definition.h"
9
10 /*!
11  * @brief \83\82\83\93\83X\83^\81[\82ð\93|\82µ\82½\8dÛ\82Ì\8dà\95ósval\82ð\95Ô\82·
12  * @param r_idx \93|\82µ\82½\83\82\83\93\83X\83^\81[\82Ì\8eí\91°ID
13  * @return \8dà\95ó\82Ìsval
14  * @details
15  * Hack -- Return the "automatic coin type" of a monster race
16  * Used to allocate proper treasure when "Creeping coins" die
17  * Note the use of actual "monster names"
18  */
19 static OBJECT_SUBTYPE_VALUE get_coin_type(MONRACE_IDX r_idx)
20 {
21     switch (r_idx) {
22     case MON_COPPER_COINS:
23         return 2;
24     case MON_SILVER_COINS:
25         return 5;
26     case MON_GOLD_COINS:
27         return 10;
28     case MON_MITHRIL_COINS:
29     case MON_MITHRIL_GOLEM:
30         return 16;
31     case MON_ADAMANT_COINS:
32         return 17;
33     }
34
35     return MON_PLAYER;
36 }
37
38 monster_death_type *initialize_monster_death_type(player_type *player_ptr, monster_death_type *md_ptr, MONSTER_IDX m_idx, bool drop_item)
39 {
40     floor_type *floor_ptr = player_ptr->current_floor_ptr;
41     md_ptr->m_idx = m_idx;
42     md_ptr->m_ptr = &floor_ptr->m_list[m_idx];
43     md_ptr->r_ptr = &r_info[md_ptr->m_ptr->r_idx];
44     md_ptr->do_gold = (!(md_ptr->r_ptr->flags1 & RF1_ONLY_ITEM));
45     md_ptr->do_item = (!(md_ptr->r_ptr->flags1 & RF1_ONLY_GOLD));
46     md_ptr->cloned = (md_ptr->m_ptr->smart & SM_CLONED) ? TRUE : FALSE;
47     md_ptr->force_coin = get_coin_type(md_ptr->m_ptr->r_idx);
48     md_ptr->drop_chosen_item = drop_item && !md_ptr->cloned && !floor_ptr->inside_arena && !player_ptr->phase_out && !is_pet(md_ptr->m_ptr);
49     return md_ptr;
50 }