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 { "FLAVOR", RBE_FLAVOR },
85 const std::unordered_map<std::string_view, race_flags1> r_info_flags1 = {
86 { "UNIQUE", RF1_UNIQUE },
87 { "QUESTOR", RF1_QUESTOR },
89 { "FEMALE", RF1_FEMALE },
90 { "CHAR_CLEAR", RF1_CHAR_CLEAR },
91 { "SHAPECHANGER", RF1_SHAPECHANGER },
92 { "ATTR_CLEAR", RF1_ATTR_CLEAR },
93 { "ATTR_MULTI", RF1_ATTR_MULTI },
94 { "FORCE_DEPTH", RF1_FORCE_DEPTH },
95 { "FORCE_MAXHP", RF1_FORCE_MAXHP },
96 { "PREVENT_SUDDEN_MAGIC", RF1_PREVENT_SUDDEN_MAGIC },
97 { "FORCE_EXTRA", RF1_FORCE_EXTRA },
98 { "ATTR_SEMIRAND", RF1_ATTR_SEMIRAND },
99 { "FRIENDS", RF1_FRIENDS },
100 { "ESCORT", RF1_ESCORT },
101 { "ESCORTS", RF1_ESCORTS },
102 { "NEVER_BLOW", RF1_NEVER_BLOW },
103 { "NEVER_MOVE", RF1_NEVER_MOVE },
104 { "RAND_25", RF1_RAND_25 },
105 { "RAND_50", RF1_RAND_50 },
106 { "ONLY_GOLD", RF1_ONLY_GOLD },
107 { "ONLY_ITEM", RF1_ONLY_ITEM },
108 { "DROP_60", RF1_DROP_60 },
109 { "DROP_90", RF1_DROP_90 },
110 { "DROP_1D2", RF1_DROP_1D2 },
111 { "DROP_2D2", RF1_DROP_2D2 },
112 { "DROP_3D2", RF1_DROP_3D2 },
113 { "DROP_4D2", RF1_DROP_4D2 },
114 { "DROP_GOOD", RF1_DROP_GOOD },
115 { "DROP_GREAT", RF1_DROP_GREAT },
122 const std::unordered_map<std::string_view, race_flags2> r_info_flags2 = {
123 { "STUPID", RF2_STUPID },
124 { "SMART", RF2_SMART },
125 { "CAN_SPEAK", RF2_CAN_SPEAK },
126 { "REFLECTING", RF2_REFLECTING },
127 { "INVISIBLE", RF2_INVISIBLE },
128 { "COLD_BLOOD", RF2_COLD_BLOOD },
129 { "EMPTY_MIND", RF2_EMPTY_MIND },
130 { "WEIRD_MIND", RF2_WEIRD_MIND },
131 { "MULTIPLY", RF2_MULTIPLY },
132 { "REGENERATE", RF2_REGENERATE },
133 { "CHAR_MULTI", RF2_CHAR_MULTI },
134 { "ATTR_ANY", RF2_ATTR_ANY },
135 { "POWERFUL", RF2_POWERFUL },
136 { "ELDRITCH_HORROR", RF2_ELDRITCH_HORROR },
137 { "AURA_FIRE", RF2_AURA_FIRE },
138 { "AURA_ELEC", RF2_AURA_ELEC },
139 { "OPEN_DOOR", RF2_OPEN_DOOR },
140 { "BASH_DOOR", RF2_BASH_DOOR },
141 { "PASS_WALL", RF2_PASS_WALL },
142 { "KILL_WALL", RF2_KILL_WALL },
143 { "MOVE_BODY", RF2_MOVE_BODY },
144 { "KILL_BODY", RF2_KILL_BODY },
145 { "TAKE_ITEM", RF2_TAKE_ITEM },
146 { "KILL_ITEM", RF2_KILL_ITEM },
147 { "HUMAN", RF2_HUMAN },
148 { "QUANTUM", RF2_QUANTUM }
155 const std::unordered_map<std::string_view, race_flags3> r_info_flags3 = {
157 { "TROLL", RF3_TROLL },
158 { "GIANT", RF3_GIANT },
159 { "DRAGON", RF3_DRAGON },
160 { "DEMON", RF3_DEMON },
161 { "UNDEAD", RF3_UNDEAD },
162 { "EVIL", RF3_EVIL },
163 { "ANIMAL", RF3_ANIMAL },
164 { "AMBERITE", RF3_AMBERITE },
165 { "GOOD", RF3_GOOD },
166 { "AURA_COLD", RF3_AURA_COLD },
167 { "NONLIVING", RF3_NONLIVING },
168 { "HURT_LITE", RF3_HURT_LITE },
169 { "HURT_ROCK", RF3_HURT_ROCK },
170 { "HURT_FIRE", RF3_HURT_FIRE },
171 { "HURT_COLD", RF3_HURT_COLD },
172 { "ANGEL", RF3_ANGEL },
173 { "NO_FEAR", RF3_NO_FEAR },
174 { "NO_STUN", RF3_NO_STUN },
175 { "NO_CONF", RF3_NO_CONF },
176 { "NO_SLEEP", RF3_NO_SLEEP }
180 * モンスター特性トークン (発動型能力) /
183 /* clang-format off */
184 const std::unordered_map<std::string_view, RF_ABILITY> r_info_ability_flags = {
185 {"SHRIEK", RF_ABILITY::SHRIEK },
186 {"XXX1", RF_ABILITY::XXX1 },
187 {"DISPEL", RF_ABILITY::DISPEL },
188 {"ROCKET", RF_ABILITY::ROCKET },
189 {"SHOOT", RF_ABILITY::SHOOT },
190 {"XXX2", RF_ABILITY::XXX2 },
191 {"XXX3", RF_ABILITY::XXX3 },
192 {"XXX4", RF_ABILITY::XXX4 },
193 {"BR_ACID", RF_ABILITY::BR_ACID },
194 {"BR_ELEC", RF_ABILITY::BR_ELEC },
195 {"BR_FIRE", RF_ABILITY::BR_FIRE },
196 {"BR_COLD", RF_ABILITY::BR_COLD },
197 {"BR_POIS", RF_ABILITY::BR_POIS },
198 {"BR_NETH", RF_ABILITY::BR_NETH },
199 {"BR_LITE", RF_ABILITY::BR_LITE },
200 {"BR_DARK", RF_ABILITY::BR_DARK },
201 {"BR_CONF", RF_ABILITY::BR_CONF },
202 {"BR_SOUN", RF_ABILITY::BR_SOUN },
203 {"BR_CHAO", RF_ABILITY::BR_CHAO },
204 {"BR_DISE", RF_ABILITY::BR_DISE },
205 {"BR_NEXU", RF_ABILITY::BR_NEXU },
206 {"BR_TIME", RF_ABILITY::BR_TIME },
207 {"BR_INER", RF_ABILITY::BR_INER },
208 {"BR_GRAV", RF_ABILITY::BR_GRAV },
209 {"BR_SHAR", RF_ABILITY::BR_SHAR },
210 {"BR_PLAS", RF_ABILITY::BR_PLAS },
211 {"BR_FORC", RF_ABILITY::BR_FORC },
212 {"BR_MANA", RF_ABILITY::BR_MANA },
213 {"BA_NUKE", RF_ABILITY::BA_NUKE },
214 {"BR_NUKE", RF_ABILITY::BR_NUKE },
215 {"BA_CHAO", RF_ABILITY::BA_CHAO },
216 {"BR_DISI", RF_ABILITY::BR_DISI },
218 {"BA_ACID", RF_ABILITY::BA_ACID },
219 {"BA_ELEC", RF_ABILITY::BA_ELEC },
220 {"BA_FIRE", RF_ABILITY::BA_FIRE },
221 {"BA_COLD", RF_ABILITY::BA_COLD },
222 {"BA_POIS", RF_ABILITY::BA_POIS },
223 {"BA_NETH", RF_ABILITY::BA_NETH },
224 {"BA_WATE", RF_ABILITY::BA_WATE },
225 {"BA_MANA", RF_ABILITY::BA_MANA },
226 {"BA_DARK", RF_ABILITY::BA_DARK },
227 {"DRAIN_MANA", RF_ABILITY::DRAIN_MANA },
228 {"MIND_BLAST", RF_ABILITY::MIND_BLAST },
229 {"BRAIN_SMASH", RF_ABILITY::BRAIN_SMASH },
230 {"CAUSE_1", RF_ABILITY::CAUSE_1 },
231 {"CAUSE_2", RF_ABILITY::CAUSE_2 },
232 {"CAUSE_3", RF_ABILITY::CAUSE_3 },
233 {"CAUSE_4", RF_ABILITY::CAUSE_4 },
234 {"BO_ACID", RF_ABILITY::BO_ACID },
235 {"BO_ELEC", RF_ABILITY::BO_ELEC },
236 {"BO_FIRE", RF_ABILITY::BO_FIRE },
237 {"BO_COLD", RF_ABILITY::BO_COLD },
238 {"BA_LITE", RF_ABILITY::BA_LITE },
239 {"BO_NETH", RF_ABILITY::BO_NETH },
240 {"BO_WATE", RF_ABILITY::BO_WATE },
241 {"BO_MANA", RF_ABILITY::BO_MANA },
242 {"BO_PLAS", RF_ABILITY::BO_PLAS },
243 {"BO_ICEE", RF_ABILITY::BO_ICEE },
244 {"MISSILE", RF_ABILITY::MISSILE },
245 {"SCARE", RF_ABILITY::SCARE },
246 {"BLIND", RF_ABILITY::BLIND },
247 {"CONF", RF_ABILITY::CONF },
248 {"SLOW", RF_ABILITY::SLOW },
249 {"HOLD", RF_ABILITY::HOLD },
251 {"HASTE", RF_ABILITY::HASTE },
252 {"HAND_DOOM", RF_ABILITY::HAND_DOOM },
253 {"HEAL", RF_ABILITY::HEAL },
254 {"INVULNER", RF_ABILITY::INVULNER },
255 {"BLINK", RF_ABILITY::BLINK },
256 {"TPORT", RF_ABILITY::TPORT },
257 {"WORLD", RF_ABILITY::WORLD },
258 {"SPECIAL", RF_ABILITY::SPECIAL },
259 {"TELE_TO", RF_ABILITY::TELE_TO },
260 {"TELE_AWAY", RF_ABILITY::TELE_AWAY },
261 {"TELE_LEVEL", RF_ABILITY::TELE_LEVEL },
262 {"PSY_SPEAR", RF_ABILITY::PSY_SPEAR },
263 {"DARKNESS", RF_ABILITY::DARKNESS },
264 {"TRAPS", RF_ABILITY::TRAPS },
265 {"FORGET", RF_ABILITY::FORGET },
266 {"ANIM_DEAD", RF_ABILITY::RAISE_DEAD /* ToDo: Implement ANIM_DEAD */ },
267 {"S_KIN", RF_ABILITY::S_KIN },
268 {"S_CYBER", RF_ABILITY::S_CYBER },
269 {"S_MONSTER", RF_ABILITY::S_MONSTER },
270 {"S_MONSTERS", RF_ABILITY::S_MONSTERS },
271 {"S_ANT", RF_ABILITY::S_ANT },
272 {"S_SPIDER", RF_ABILITY::S_SPIDER },
273 {"S_HOUND", RF_ABILITY::S_HOUND },
274 {"S_HYDRA", RF_ABILITY::S_HYDRA },
275 {"S_ANGEL", RF_ABILITY::S_ANGEL },
276 {"S_DEMON", RF_ABILITY::S_DEMON },
277 {"S_UNDEAD", RF_ABILITY::S_UNDEAD },
278 {"S_DRAGON", RF_ABILITY::S_DRAGON },
279 {"S_HI_UNDEAD", RF_ABILITY::S_HI_UNDEAD },
280 {"S_HI_DRAGON", RF_ABILITY::S_HI_DRAGON },
281 {"S_AMBERITES", RF_ABILITY::S_AMBERITES },
282 {"S_UNIQUE", RF_ABILITY::S_UNIQUE },
284 /* clang-format on */
289 * "GUARDIAN" ... init.c d_infoの FINAL_GUARDIAN_* にて自動指定
291 const std::unordered_map<std::string_view, race_flags7> r_info_flags7 = {
292 { "AQUATIC", RF7_AQUATIC },
293 { "CAN_SWIM", RF7_CAN_SWIM },
294 { "CAN_FLY", RF7_CAN_FLY },
295 { "FRIENDLY", RF7_FRIENDLY },
296 { "NAZGUL", RF7_NAZGUL },
297 { "UNIQUE2", RF7_UNIQUE2 },
298 { "RIDING", RF7_RIDING },
299 { "KAGE", RF7_KAGE },
300 { "HAS_LITE_1", RF7_HAS_LITE_1 },
301 { "SELF_LITE_1", RF7_SELF_LITE_1 },
302 { "HAS_LITE_2", RF7_HAS_LITE_2 },
303 { "SELF_LITE_2", RF7_SELF_LITE_2 },
304 { "CHAMELEON", RF7_CHAMELEON },
305 { "TANUKI", RF7_TANUKI },
306 { "HAS_DARK_1", RF7_HAS_DARK_1 },
307 { "SELF_DARK_1", RF7_SELF_DARK_1 },
308 { "HAS_DARK_2", RF7_HAS_DARK_2 },
309 { "SELF_DARK_2", RF7_SELF_DARK_2 },
316 const std::unordered_map<std::string_view, race_flags8> r_info_flags8 = {
317 { "WILD_ONLY", RF8_WILD_ONLY },
318 { "WILD_TOWN", RF8_WILD_TOWN },
319 { "WILD_SHORE", RF8_WILD_SHORE },
320 { "WILD_OCEAN", RF8_WILD_OCEAN },
321 { "WILD_WASTE", RF8_WILD_WASTE },
322 { "WILD_WOOD", RF8_WILD_WOOD },
323 { "WILD_VOLCANO", RF8_WILD_VOLCANO },
324 { "WILD_MOUNTAIN", RF8_WILD_MOUNTAIN },
325 { "WILD_GRASS", RF8_WILD_GRASS },
326 { "WILD_SWAMP", RF8_WILD_SWAMP },
327 { "WILD_ALL", RF8_WILD_ALL },
334 const std::unordered_map<std::string_view, race_flags9> r_info_flags9 = {
335 { "DROP_CORPSE", RF9_DROP_CORPSE },
336 { "DROP_SKELETON", RF9_DROP_SKELETON },
337 { "EAT_BLIND", RF9_EAT_BLIND },
338 { "EAT_CONF", RF9_EAT_CONF },
339 { "EAT_MANA", RF9_EAT_MANA },
340 { "EAT_NEXUS", RF9_EAT_NEXUS },
341 // { "EAT_BLINK", RF9_EAT_BLINK }, //<! @note フラグ未定義
342 { "EAT_SLEEP", RF9_EAT_SLEEP },
343 { "EAT_BERSERKER", RF9_EAT_BERSERKER },
344 { "EAT_ACIDIC", RF9_EAT_ACIDIC },
345 { "EAT_SPEED", RF9_EAT_SPEED },
346 { "EAT_CURE", RF9_EAT_CURE },
347 { "EAT_FIRE_RES", RF9_EAT_FIRE_RES },
348 { "EAT_COLD_RES", RF9_EAT_COLD_RES },
349 { "EAT_ACID_RES", RF9_EAT_ACID_RES },
350 { "EAT_ELEC_RES", RF9_EAT_ELEC_RES },
351 { "EAT_POIS_RES", RF9_EAT_POIS_RES },
352 { "EAT_INSANITY", RF9_EAT_INSANITY },
353 { "EAT_DRAIN_EXP", RF9_EAT_DRAIN_EXP },
354 { "EAT_POISONOUS", RF9_EAT_POISONOUS },
355 { "EAT_GIVE_STR", RF9_EAT_GIVE_STR },
356 { "EAT_GIVE_INT", RF9_EAT_GIVE_INT },
357 { "EAT_GIVE_WIS", RF9_EAT_GIVE_WIS },
358 { "EAT_GIVE_DEX", RF9_EAT_GIVE_DEX },
359 { "EAT_GIVE_CON", RF9_EAT_GIVE_CON },
360 { "EAT_GIVE_CHR", RF9_EAT_GIVE_CHR },
361 { "EAT_LOSE_STR", RF9_EAT_LOSE_STR },
362 { "EAT_LOSE_INT", RF9_EAT_LOSE_INT },
363 { "EAT_LOSE_WIS", RF9_EAT_LOSE_WIS },
364 { "EAT_LOSE_DEX", RF9_EAT_LOSE_DEX },
365 { "EAT_LOSE_CON", RF9_EAT_LOSE_CON },
366 { "EAT_LOSE_CHR", RF9_EAT_LOSE_CHR },
367 { "EAT_DRAIN_MANA", RF9_EAT_DRAIN_MANA },
371 * モンスター特性トークンの定義R(耐性) /
374 const std::unordered_map<std::string_view, race_flags_resistance> r_info_flagsr = {
375 { "IM_ACID", RFR_IM_ACID },
376 { "IM_ELEC", RFR_IM_ELEC },
377 { "IM_FIRE", RFR_IM_FIRE },
378 { "IM_COLD", RFR_IM_COLD },
379 { "IM_POIS", RFR_IM_POIS },
380 { "RES_LITE", RFR_RES_LITE },
381 { "RES_DARK", RFR_RES_DARK },
382 { "RES_NETH", RFR_RES_NETH },
383 { "RES_WATE", RFR_RES_WATE },
384 { "RES_PLAS", RFR_RES_PLAS },
385 { "RES_SHAR", RFR_RES_SHAR },
386 { "RES_SOUN", RFR_RES_SOUN },
387 { "RES_CHAO", RFR_RES_CHAO },
388 { "RES_NEXU", RFR_RES_NEXU },
389 { "RES_DISE", RFR_RES_DISE },
390 { "RES_WALL", RFR_RES_WALL },
391 { "RES_INER", RFR_RES_INER },
392 { "RES_TIME", RFR_RES_TIME },
393 { "RES_GRAV", RFR_RES_GRAV },
394 { "RES_ALL", RFR_RES_ALL },
395 { "RES_TELE", RFR_RES_TELE },