OSDN Git Service

[Implement] ウサウサストライカー召喚処理を追加
[hengbandforosx/hengbandosx.git] / src / lore / lore-util.h
1 #pragma once
2
3 #include "monster-attack/monster-attack-table.h"
4 #include "monster-race/monster-aura-types.h"
5 #include "monster-race/race-ability-flags.h"
6 #include "monster-race/race-behavior-flags.h"
7 #include "monster-race/race-brightness-flags.h"
8 #include "monster-race/race-drop-flags.h"
9 #include "monster-race/race-feature-flags.h"
10 #include "monster-race/race-flags-resistance.h"
11 #include "monster-race/race-kind-flags.h"
12 #include "monster-race/race-misc-flags.h"
13 #include "monster-race/race-special-flags.h"
14 #include "monster-race/race-visual-flags.h"
15 #include "system/angband.h"
16 #include "util/flag-group.h"
17 #include <string>
18 #include <string_view>
19 #include <unordered_map>
20
21 enum class MonsterRaceId : int16_t;
22
23 enum monster_sex {
24     MSEX_NONE = 0,
25     MSEX_MALE = 1,
26     MSEX_FEMALE = 2,
27 };
28
29 enum monster_lore_mode {
30     MONSTER_LORE_NONE,
31     MONSTER_LORE_NORMAL,
32     MONSTER_LORE_RESEARCH,
33     MONSTER_LORE_DEBUG
34 };
35
36 class MonsterRaceInfo;
37 struct lore_type {
38     lore_type(MonsterRaceId r_idx, monster_lore_mode mode);
39
40 #ifndef JP
41     bool sin = false;
42 #endif
43
44     bool reinforce = false;
45     bool know_everything = false;
46     bool old = false;
47     int count = 0;
48     bool shoot = false;
49     bool rocket = false;
50     int vn = 0;
51     byte color[96]{};
52     concptr vp[96]{};
53     char tmp_msg[96][96]{};
54     bool breath = false;
55     bool magic = false;
56     int drop_quantity = 0;
57     concptr drop_quality = "";
58     concptr p = "";
59     byte pc = 0;
60     concptr q = "";
61     byte qc = 0;
62
63     MonsterRaceId r_idx;
64     BIT_FLAGS mode;
65     monster_sex msex;
66     RaceBlowMethodType method;
67
68     bool nightmare;
69     MonsterRaceInfo *r_ptr;
70     byte speed;
71     ITEM_NUMBER drop_gold;
72     ITEM_NUMBER drop_item;
73     BIT_FLAGS flags1;
74     BIT_FLAGS flags2;
75     BIT_FLAGS flags3;
76     BIT_FLAGS flags7;
77     EnumClassFlagGroup<MonsterAbilityType> ability_flags;
78     EnumClassFlagGroup<MonsterAuraType> aura_flags;
79     EnumClassFlagGroup<MonsterBehaviorType> behavior_flags;
80     EnumClassFlagGroup<MonsterVisualType> visual_flags;
81     EnumClassFlagGroup<MonsterKindType> kind_flags;
82     EnumClassFlagGroup<MonsterResistanceType> resistance_flags;
83     EnumClassFlagGroup<MonsterDropType> drop_flags;
84     EnumClassFlagGroup<MonsterFeatureType> feature_flags;
85     EnumClassFlagGroup<MonsterBrightnessType> brightness_flags;
86     EnumClassFlagGroup<MonsterSpecialType> special_flags;
87     EnumClassFlagGroup<MonsterMiscType> misc_flags;
88 };
89
90 using hook_c_roff_pf = void (*)(TERM_COLOR attr, std::string_view str);
91 extern hook_c_roff_pf hook_c_roff;
92
93 void hooked_roff(std::string_view str);
94
95 enum WHO_WORD_TYPE { WHO = 0,
96     WHOSE = 1,
97     WHOM = 2 };
98 using who_word_definition = std::unordered_map<WHO_WORD_TYPE, const std::unordered_map<bool, const std::unordered_map<monster_sex, std::string>>>;
99
100 class Who {
101 public:
102     static const who_word_definition words;
103
104     /*!
105      * @brief 三人称主格を取得(単数のみ)
106      * @param msex モンスターの性別
107      * @return 主語
108      */
109     static concptr who(monster_sex msex)
110     {
111         return who(msex, false);
112     }
113
114     /*!
115      * @brief 三人称主格を取得
116      * @param msex モンスターの性別
117      * @param multi 複数かどうか
118      * @return 主語
119      */
120     static concptr who(monster_sex msex, bool multi)
121     {
122         return words.at(WHO_WORD_TYPE::WHO).at(multi).at(msex).data();
123     }
124
125     /*!
126      * @brief 三人称所有格を取得(単数のみ)
127      * @param msex モンスターの性別
128      * @return 所有格
129      */
130     static concptr whose(monster_sex msex)
131     {
132         return whose(msex, false);
133     }
134
135     /*!
136      * @brief 三人称所有格を取得
137      * @param msex モンスターの性別
138      * @param multi 複数かどうか
139      * @return 所有格
140      */
141     static concptr whose(monster_sex msex, bool multi)
142     {
143         return words.at(WHO_WORD_TYPE::WHOSE).at(multi).at(msex).data();
144     }
145
146     /*!
147      * @brief 三人称目的格を取得(単数のみ)
148      * @param msex モンスターの性別
149      * @return 目的語
150      */
151     static concptr whom(monster_sex msex)
152     {
153         return whom(msex, false);
154     }
155
156     /*!
157      * @brief 三人称目的格を取得
158      * @param msex モンスターの性別
159      * @param multi 複数かどうか
160      * @return 目的語
161      */
162     static concptr whom(monster_sex msex, bool multi)
163     {
164         return words.at(WHO_WORD_TYPE::WHOM).at(multi).at(msex).data();
165     }
166 };