OSDN Git Service

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