OSDN Git Service

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