1 #include "info-reader/race-info-tokens-table.h"
2 #include "monster-attack/monster-attack-effect.h"
3 #include "monster-attack/monster-attack-types.h"
4 #include "monster-race/race-ability-flags.h"
10 const std::unordered_map<std::string_view, rbm_type> r_info_blow_method = {
12 { "TOUCH", RBM_TOUCH },
13 { "PUNCH", RBM_PUNCH },
17 { "STING", RBM_STING },
18 { "SLASH", RBM_SLASH },
20 { "CRUSH", RBM_CRUSH },
21 { "ENGULF", RBM_ENGULF },
22 { "CHARGE", RBM_CHARGE },
23 { "CRAWL", RBM_CRAWL },
24 { "DROOL", RBM_DROOL },
26 { "EXPLODE", RBM_EXPLODE },
29 { "SPORE", RBM_SPORE },
32 { "INSULT", RBM_INSULT },
35 { "SHOOT", RBM_SHOOT },
40 * Monster Blow Effects
42 const std::unordered_map<std::string_view, rbe_type> r_info_blow_effect = {
44 { "POISON", RBE_POISON },
45 { "UN_BONUS", RBE_UN_BONUS },
46 { "UN_POWER", RBE_UN_POWER },
47 { "EAT_GOLD", RBE_EAT_GOLD },
48 { "EAT_ITEM", RBE_EAT_ITEM },
49 { "EAT_FOOD", RBE_EAT_FOOD },
50 { "EAT_LITE", RBE_EAT_LITE },
55 { "BLIND", RBE_BLIND },
56 { "CONFUSE", RBE_CONFUSE },
57 { "TERRIFY", RBE_TERRIFY },
58 { "PARALYZE", RBE_PARALYZE },
59 { "LOSE_STR", RBE_LOSE_STR },
60 { "LOSE_INT", RBE_LOSE_INT },
61 { "LOSE_WIS", RBE_LOSE_WIS },
62 { "LOSE_DEX", RBE_LOSE_DEX },
63 { "LOSE_CON", RBE_LOSE_CON },
64 { "LOSE_CHR", RBE_LOSE_CHR },
65 { "LOSE_ALL", RBE_LOSE_ALL },
66 { "SHATTER", RBE_SHATTER },
67 { "EXP_10", RBE_EXP_10 },
68 { "EXP_20", RBE_EXP_20 },
69 { "EXP_40", RBE_EXP_40 },
70 { "EXP_80", RBE_EXP_80 },
71 { "DISEASE", RBE_DISEASE },
73 { "EXP_VAMP", RBE_DR_LIFE },
74 { "DR_MANA", RBE_DR_MANA },
75 { "SUPERHURT", RBE_SUPERHURT },
76 { "INERTIA", RBE_INERTIA },
78 { "HUNGRY", RBE_HUNGRY },
79 { "FLAVOR", RBE_FLAVOR },
86 const std::unordered_map<std::string_view, race_flags1> r_info_flags1 = {
87 { "UNIQUE", RF1_UNIQUE },
88 { "QUESTOR", RF1_QUESTOR },
90 { "FEMALE", RF1_FEMALE },
91 { "CHAR_CLEAR", RF1_CHAR_CLEAR },
92 { "SHAPECHANGER", RF1_SHAPECHANGER },
93 { "ATTR_CLEAR", RF1_ATTR_CLEAR },
94 { "ATTR_MULTI", RF1_ATTR_MULTI },
95 { "FORCE_DEPTH", RF1_FORCE_DEPTH },
96 { "FORCE_MAXHP", RF1_FORCE_MAXHP },
97 { "PREVENT_SUDDEN_MAGIC", RF1_PREVENT_SUDDEN_MAGIC },
98 { "FORCE_EXTRA", RF1_FORCE_EXTRA },
99 { "ATTR_SEMIRAND", RF1_ATTR_SEMIRAND },
100 { "FRIENDS", RF1_FRIENDS },
101 { "ESCORT", RF1_ESCORT },
102 { "ESCORTS", RF1_ESCORTS },
103 { "NEVER_BLOW", RF1_NEVER_BLOW },
104 { "NEVER_MOVE", RF1_NEVER_MOVE },
105 { "RAND_25", RF1_RAND_25 },
106 { "RAND_50", RF1_RAND_50 },
107 { "ONLY_GOLD", RF1_ONLY_GOLD },
108 { "ONLY_ITEM", RF1_ONLY_ITEM },
109 { "DROP_60", RF1_DROP_60 },
110 { "DROP_90", RF1_DROP_90 },
111 { "DROP_1D2", RF1_DROP_1D2 },
112 { "DROP_2D2", RF1_DROP_2D2 },
113 { "DROP_3D2", RF1_DROP_3D2 },
114 { "DROP_4D2", RF1_DROP_4D2 },
115 { "DROP_GOOD", RF1_DROP_GOOD },
116 { "DROP_GREAT", RF1_DROP_GREAT },
123 const std::unordered_map<std::string_view, race_flags2> r_info_flags2 = {
124 { "STUPID", RF2_STUPID },
125 { "SMART", RF2_SMART },
126 { "CAN_SPEAK", RF2_CAN_SPEAK },
127 { "REFLECTING", RF2_REFLECTING },
128 { "INVISIBLE", RF2_INVISIBLE },
129 { "COLD_BLOOD", RF2_COLD_BLOOD },
130 { "EMPTY_MIND", RF2_EMPTY_MIND },
131 { "WEIRD_MIND", RF2_WEIRD_MIND },
132 { "MULTIPLY", RF2_MULTIPLY },
133 { "REGENERATE", RF2_REGENERATE },
134 { "CHAR_MULTI", RF2_CHAR_MULTI },
135 { "ATTR_ANY", RF2_ATTR_ANY },
136 { "POWERFUL", RF2_POWERFUL },
137 { "ELDRITCH_HORROR", RF2_ELDRITCH_HORROR },
138 { "AURA_FIRE", RF2_AURA_FIRE },
139 { "AURA_ELEC", RF2_AURA_ELEC },
140 { "OPEN_DOOR", RF2_OPEN_DOOR },
141 { "BASH_DOOR", RF2_BASH_DOOR },
142 { "PASS_WALL", RF2_PASS_WALL },
143 { "KILL_WALL", RF2_KILL_WALL },
144 { "MOVE_BODY", RF2_MOVE_BODY },
145 { "KILL_BODY", RF2_KILL_BODY },
146 { "TAKE_ITEM", RF2_TAKE_ITEM },
147 { "KILL_ITEM", RF2_KILL_ITEM },
148 { "HUMAN", RF2_HUMAN },
149 { "QUANTUM", RF2_QUANTUM }
156 const std::unordered_map<std::string_view, race_flags3> r_info_flags3 = {
158 { "TROLL", RF3_TROLL },
159 { "GIANT", RF3_GIANT },
160 { "DRAGON", RF3_DRAGON },
161 { "DEMON", RF3_DEMON },
162 { "UNDEAD", RF3_UNDEAD },
163 { "EVIL", RF3_EVIL },
164 { "ANIMAL", RF3_ANIMAL },
165 { "AMBERITE", RF3_AMBERITE },
166 { "GOOD", RF3_GOOD },
167 { "AURA_COLD", RF3_AURA_COLD },
168 { "NONLIVING", RF3_NONLIVING },
169 { "HURT_LITE", RF3_HURT_LITE },
170 { "HURT_ROCK", RF3_HURT_ROCK },
171 { "HURT_FIRE", RF3_HURT_FIRE },
172 { "HURT_COLD", RF3_HURT_COLD },
173 { "ANGEL", RF3_ANGEL },
174 { "NO_FEAR", RF3_NO_FEAR },
175 { "NO_STUN", RF3_NO_STUN },
176 { "NO_CONF", RF3_NO_CONF },
177 { "NO_SLEEP", RF3_NO_SLEEP }
181 * モンスター特性トークン (発動型能力) /
184 /* clang-format off */
185 const std::unordered_map<std::string_view, RF_ABILITY> r_info_ability_flags = {
186 {"SHRIEK", RF_ABILITY::SHRIEK },
187 {"XXX1", RF_ABILITY::XXX1 },
188 {"DISPEL", RF_ABILITY::DISPEL },
189 {"ROCKET", RF_ABILITY::ROCKET },
190 {"SHOOT", RF_ABILITY::SHOOT },
191 {"XXX2", RF_ABILITY::XXX2 },
192 {"XXX3", RF_ABILITY::XXX3 },
193 {"XXX4", RF_ABILITY::XXX4 },
194 {"BR_ACID", RF_ABILITY::BR_ACID },
195 {"BR_ELEC", RF_ABILITY::BR_ELEC },
196 {"BR_FIRE", RF_ABILITY::BR_FIRE },
197 {"BR_COLD", RF_ABILITY::BR_COLD },
198 {"BR_POIS", RF_ABILITY::BR_POIS },
199 {"BR_NETH", RF_ABILITY::BR_NETH },
200 {"BR_LITE", RF_ABILITY::BR_LITE },
201 {"BR_DARK", RF_ABILITY::BR_DARK },
202 {"BR_CONF", RF_ABILITY::BR_CONF },
203 {"BR_SOUN", RF_ABILITY::BR_SOUN },
204 {"BR_CHAO", RF_ABILITY::BR_CHAO },
205 {"BR_DISE", RF_ABILITY::BR_DISE },
206 {"BR_NEXU", RF_ABILITY::BR_NEXU },
207 {"BR_TIME", RF_ABILITY::BR_TIME },
208 {"BR_INER", RF_ABILITY::BR_INER },
209 {"BR_GRAV", RF_ABILITY::BR_GRAV },
210 {"BR_SHAR", RF_ABILITY::BR_SHAR },
211 {"BR_PLAS", RF_ABILITY::BR_PLAS },
212 {"BR_FORC", RF_ABILITY::BR_FORC },
213 {"BR_MANA", RF_ABILITY::BR_MANA },
214 {"BA_NUKE", RF_ABILITY::BA_NUKE },
215 {"BR_NUKE", RF_ABILITY::BR_NUKE },
216 {"BA_CHAO", RF_ABILITY::BA_CHAO },
217 {"BR_DISI", RF_ABILITY::BR_DISI },
219 {"BA_ACID", RF_ABILITY::BA_ACID },
220 {"BA_ELEC", RF_ABILITY::BA_ELEC },
221 {"BA_FIRE", RF_ABILITY::BA_FIRE },
222 {"BA_COLD", RF_ABILITY::BA_COLD },
223 {"BA_POIS", RF_ABILITY::BA_POIS },
224 {"BA_NETH", RF_ABILITY::BA_NETH },
225 {"BA_WATE", RF_ABILITY::BA_WATE },
226 {"BA_MANA", RF_ABILITY::BA_MANA },
227 {"BA_DARK", RF_ABILITY::BA_DARK },
228 {"DRAIN_MANA", RF_ABILITY::DRAIN_MANA },
229 {"MIND_BLAST", RF_ABILITY::MIND_BLAST },
230 {"BRAIN_SMASH", RF_ABILITY::BRAIN_SMASH },
231 {"CAUSE_1", RF_ABILITY::CAUSE_1 },
232 {"CAUSE_2", RF_ABILITY::CAUSE_2 },
233 {"CAUSE_3", RF_ABILITY::CAUSE_3 },
234 {"CAUSE_4", RF_ABILITY::CAUSE_4 },
235 {"BO_ACID", RF_ABILITY::BO_ACID },
236 {"BO_ELEC", RF_ABILITY::BO_ELEC },
237 {"BO_FIRE", RF_ABILITY::BO_FIRE },
238 {"BO_COLD", RF_ABILITY::BO_COLD },
239 {"BA_LITE", RF_ABILITY::BA_LITE },
240 {"BO_NETH", RF_ABILITY::BO_NETH },
241 {"BO_WATE", RF_ABILITY::BO_WATE },
242 {"BO_MANA", RF_ABILITY::BO_MANA },
243 {"BO_PLAS", RF_ABILITY::BO_PLAS },
244 {"BO_ICEE", RF_ABILITY::BO_ICEE },
245 {"MISSILE", RF_ABILITY::MISSILE },
246 {"SCARE", RF_ABILITY::SCARE },
247 {"BLIND", RF_ABILITY::BLIND },
248 {"CONF", RF_ABILITY::CONF },
249 {"SLOW", RF_ABILITY::SLOW },
250 {"HOLD", RF_ABILITY::HOLD },
252 {"HASTE", RF_ABILITY::HASTE },
253 {"HAND_DOOM", RF_ABILITY::HAND_DOOM },
254 {"HEAL", RF_ABILITY::HEAL },
255 {"INVULNER", RF_ABILITY::INVULNER },
256 {"BLINK", RF_ABILITY::BLINK },
257 {"TPORT", RF_ABILITY::TPORT },
258 {"WORLD", RF_ABILITY::WORLD },
259 {"SPECIAL", RF_ABILITY::SPECIAL },
260 {"TELE_TO", RF_ABILITY::TELE_TO },
261 {"TELE_AWAY", RF_ABILITY::TELE_AWAY },
262 {"TELE_LEVEL", RF_ABILITY::TELE_LEVEL },
263 {"PSY_SPEAR", RF_ABILITY::PSY_SPEAR },
264 {"DARKNESS", RF_ABILITY::DARKNESS },
265 {"TRAPS", RF_ABILITY::TRAPS },
266 {"FORGET", RF_ABILITY::FORGET },
267 {"ANIM_DEAD", RF_ABILITY::RAISE_DEAD /* ToDo: Implement ANIM_DEAD */ },
268 {"S_KIN", RF_ABILITY::S_KIN },
269 {"S_CYBER", RF_ABILITY::S_CYBER },
270 {"S_MONSTER", RF_ABILITY::S_MONSTER },
271 {"S_MONSTERS", RF_ABILITY::S_MONSTERS },
272 {"S_ANT", RF_ABILITY::S_ANT },
273 {"S_SPIDER", RF_ABILITY::S_SPIDER },
274 {"S_HOUND", RF_ABILITY::S_HOUND },
275 {"S_HYDRA", RF_ABILITY::S_HYDRA },
276 {"S_ANGEL", RF_ABILITY::S_ANGEL },
277 {"S_DEMON", RF_ABILITY::S_DEMON },
278 {"S_UNDEAD", RF_ABILITY::S_UNDEAD },
279 {"S_DRAGON", RF_ABILITY::S_DRAGON },
280 {"S_HI_UNDEAD", RF_ABILITY::S_HI_UNDEAD },
281 {"S_HI_DRAGON", RF_ABILITY::S_HI_DRAGON },
282 {"S_AMBERITES", RF_ABILITY::S_AMBERITES },
283 {"S_UNIQUE", RF_ABILITY::S_UNIQUE },
285 /* clang-format on */
290 * "GUARDIAN" ... init.c d_infoの FINAL_GUARDIAN_* にて自動指定
292 const std::unordered_map<std::string_view, race_flags7> r_info_flags7 = {
293 { "AQUATIC", RF7_AQUATIC },
294 { "CAN_SWIM", RF7_CAN_SWIM },
295 { "CAN_FLY", RF7_CAN_FLY },
296 { "FRIENDLY", RF7_FRIENDLY },
297 { "NAZGUL", RF7_NAZGUL },
298 { "UNIQUE2", RF7_UNIQUE2 },
299 { "RIDING", RF7_RIDING },
300 { "KAGE", RF7_KAGE },
301 { "HAS_LITE_1", RF7_HAS_LITE_1 },
302 { "SELF_LITE_1", RF7_SELF_LITE_1 },
303 { "HAS_LITE_2", RF7_HAS_LITE_2 },
304 { "SELF_LITE_2", RF7_SELF_LITE_2 },
305 { "CHAMELEON", RF7_CHAMELEON },
306 { "TANUKI", RF7_TANUKI },
307 { "HAS_DARK_1", RF7_HAS_DARK_1 },
308 { "SELF_DARK_1", RF7_SELF_DARK_1 },
309 { "HAS_DARK_2", RF7_HAS_DARK_2 },
310 { "SELF_DARK_2", RF7_SELF_DARK_2 },
317 const std::unordered_map<std::string_view, race_flags8> r_info_flags8 = {
318 { "WILD_ONLY", RF8_WILD_ONLY },
319 { "WILD_TOWN", RF8_WILD_TOWN },
320 { "NO_QUEST", RF8_NO_QUEST },
321 { "WILD_SHORE", RF8_WILD_SHORE },
322 { "WILD_OCEAN", RF8_WILD_OCEAN },
323 { "WILD_WASTE", RF8_WILD_WASTE },
324 { "WILD_WOOD", RF8_WILD_WOOD },
325 { "WILD_VOLCANO", RF8_WILD_VOLCANO },
326 { "WILD_MOUNTAIN", RF8_WILD_MOUNTAIN },
327 { "WILD_GRASS", RF8_WILD_GRASS },
328 { "WILD_SWAMP", RF8_WILD_SWAMP },
329 { "WILD_ALL", RF8_WILD_ALL },
336 const std::unordered_map<std::string_view, race_flags9> r_info_flags9 = {
337 { "DROP_CORPSE", RF9_DROP_CORPSE },
338 { "DROP_SKELETON", RF9_DROP_SKELETON },
339 { "EAT_BLIND", RF9_EAT_BLIND },
340 { "EAT_CONF", RF9_EAT_CONF },
341 { "EAT_MANA", RF9_EAT_MANA },
342 { "EAT_NEXUS", RF9_EAT_NEXUS },
343 // { "EAT_BLINK", RF9_EAT_BLINK }, //<! @note フラグ未定義
344 { "EAT_SLEEP", RF9_EAT_SLEEP },
345 { "EAT_BERSERKER", RF9_EAT_BERSERKER },
346 { "EAT_ACIDIC", RF9_EAT_ACIDIC },
347 { "EAT_SPEED", RF9_EAT_SPEED },
348 { "EAT_CURE", RF9_EAT_CURE },
349 { "EAT_FIRE_RES", RF9_EAT_FIRE_RES },
350 { "EAT_COLD_RES", RF9_EAT_COLD_RES },
351 { "EAT_ACID_RES", RF9_EAT_ACID_RES },
352 { "EAT_ELEC_RES", RF9_EAT_ELEC_RES },
353 { "EAT_POIS_RES", RF9_EAT_POIS_RES },
354 { "EAT_INSANITY", RF9_EAT_INSANITY },
355 { "EAT_DRAIN_EXP", RF9_EAT_DRAIN_EXP },
356 { "EAT_POISONOUS", RF9_EAT_POISONOUS },
357 { "EAT_GIVE_STR", RF9_EAT_GIVE_STR },
358 { "EAT_GIVE_INT", RF9_EAT_GIVE_INT },
359 { "EAT_GIVE_WIS", RF9_EAT_GIVE_WIS },
360 { "EAT_GIVE_DEX", RF9_EAT_GIVE_DEX },
361 { "EAT_GIVE_CON", RF9_EAT_GIVE_CON },
362 { "EAT_GIVE_CHR", RF9_EAT_GIVE_CHR },
363 { "EAT_LOSE_STR", RF9_EAT_LOSE_STR },
364 { "EAT_LOSE_INT", RF9_EAT_LOSE_INT },
365 { "EAT_LOSE_WIS", RF9_EAT_LOSE_WIS },
366 { "EAT_LOSE_DEX", RF9_EAT_LOSE_DEX },
367 { "EAT_LOSE_CON", RF9_EAT_LOSE_CON },
368 { "EAT_LOSE_CHR", RF9_EAT_LOSE_CHR },
369 { "EAT_DRAIN_MANA", RF9_EAT_DRAIN_MANA },
373 * モンスター特性トークンの定義R(耐性) /
376 const std::unordered_map<std::string_view, race_flags_resistance> r_info_flagsr = {
377 { "IM_ACID", RFR_IM_ACID },
378 { "IM_ELEC", RFR_IM_ELEC },
379 { "IM_FIRE", RFR_IM_FIRE },
380 { "IM_COLD", RFR_IM_COLD },
381 { "IM_POIS", RFR_IM_POIS },
382 { "RES_LITE", RFR_RES_LITE },
383 { "RES_DARK", RFR_RES_DARK },
384 { "RES_NETH", RFR_RES_NETH },
385 { "RES_WATE", RFR_RES_WATE },
386 { "RES_PLAS", RFR_RES_PLAS },
387 { "RES_SHAR", RFR_RES_SHAR },
388 { "RES_SOUN", RFR_RES_SOUN },
389 { "RES_CHAO", RFR_RES_CHAO },
390 { "RES_NEXU", RFR_RES_NEXU },
391 { "RES_DISE", RFR_RES_DISE },
392 { "RES_WALL", RFR_RES_WALL },
393 { "RES_INER", RFR_RES_INER },
394 { "RES_TIME", RFR_RES_TIME },
395 { "RES_GRAV", RFR_RES_GRAV },
396 { "RES_ALL", RFR_RES_ALL },
397 { "RES_TELE", RFR_RES_TELE },