2 #include "monsterrace.h"
4 typedef bool(*monsterrace_hook_type)(MONRACE_IDX r_idx);
6 extern MONSTER_IDX hack_m_idx;
7 extern MONSTER_IDX hack_m_idx_ii;
10 * Monster information, for a specific monster.
11 * Note: fy, fx constrain dungeon size to 256x256
12 * The "hold_o_idx" field points to the first object of a stack
13 * of objects (if any) being carried by the monster (see above).
16 typedef struct monster_type monster_type;
20 MONRACE_IDX r_idx; /* Monster race index 0 = dead. */
21 MONRACE_IDX ap_r_idx; /* Monster race appearance index */
23 /* Sub-alignment flags for neutral monsters */
24 #define SUB_ALIGN_NEUTRAL 0x0000
25 #define SUB_ALIGN_EVIL 0x0001
26 #define SUB_ALIGN_GOOD 0x0002
27 BIT_FLAGS8 sub_align; /* Sub-alignment for a neutral monster */
29 POSITION fy; /* Y location on map */
30 POSITION fx; /* X location on map */
32 HIT_POINT hp; /* Current Hit points */
33 HIT_POINT maxhp; /* Max Hit points */
34 HIT_POINT max_maxhp; /* Max Max Hit points */
35 HIT_POINT dealt_damage; /* Sum of damages dealt by player */
37 TIME_EFFECT mtimed[MAX_MTIMED]; /* Timed status counter */
39 SPEED mspeed; /* Monster "speed" */
40 ACTION_ENERGY energy_need; /* Monster "energy" */
42 POSITION cdis; /* Current dis from player */
44 BIT_FLAGS8 mflag; /* Extra monster flags */
45 #define MFLAG_VIEW 0x01 /* Monster is in line of sight */
46 #define MFLAG_LOS 0x02 /* Monster is marked for project_all_los() */
47 #define MFLAG_XXX2 0x04 /* (unused) */
48 #define MFLAG_ETF 0x08 /* Monster is entering the field. */
49 #define MFLAG_BORN 0x10 /* Monster is still being born */
50 #define MFLAG_NICE 0x20 /* Monster is still being nice */
52 BIT_FLAGS8 mflag2; /* Extra monster flags */
53 #define MFLAG2_KAGE 0x01 /* Monster is kage */
54 #define MFLAG2_NOPET 0x02 /* Cannot make monster pet */
55 #define MFLAG2_NOGENO 0x04 /* Cannot genocide */
56 #define MFLAG2_CHAMELEON 0x08 /* Monster is chameleon */
57 #define MFLAG2_NOFLOW 0x10 /* Monster is in no_flow_by_smell mode */
58 #define MFLAG2_SHOW 0x20 /* Monster is recently memorized */
59 #define MFLAG2_MARK 0x40 /* Monster is currently memorized */
61 bool ml; /* Monster is "visible" */
63 OBJECT_IDX hold_o_idx; /* Object being held (if any) */
65 POSITION target_y; /* Can attack !los player */
66 POSITION target_x; /* Can attack !los player */
68 STR_OFFSET nickname; /* Monster's Nickname */
72 /* TODO: クローン、ペット、有効化は意義が異なるので別変数に切り離すこと。save/loadのバージョン更新が面倒そうだけど */
73 BIT_FLAGS smart; /*!< Field for "smart_learn" - Some bit-flags for the "smart" field */
74 #define SM_RES_ACID 0x00000001 /*!< モンスターの学習フラグ: プレイヤーに酸耐性あり */
75 #define SM_RES_ELEC 0x00000002 /*!< モンスターの学習フラグ: プレイヤーに電撃耐性あり */
76 #define SM_RES_FIRE 0x00000004 /*!< モンスターの学習フラグ: プレイヤーに火炎耐性あり */
77 #define SM_RES_COLD 0x00000008 /*!< モンスターの学習フラグ: プレイヤーに冷気耐性あり */
78 #define SM_RES_POIS 0x00000010 /*!< モンスターの学習フラグ: プレイヤーに毒耐性あり */
79 #define SM_RES_NETH 0x00000020 /*!< モンスターの学習フラグ: プレイヤーに地獄耐性あり */
80 #define SM_RES_LITE 0x00000040 /*!< モンスターの学習フラグ: プレイヤーに閃光耐性あり */
81 #define SM_RES_DARK 0x00000080 /*!< モンスターの学習フラグ: プレイヤーに暗黒耐性あり */
82 #define SM_RES_FEAR 0x00000100 /*!< モンスターの学習フラグ: プレイヤーに恐怖耐性あり */
83 #define SM_RES_CONF 0x00000200 /*!< モンスターの学習フラグ: プレイヤーに混乱耐性あり */
84 #define SM_RES_CHAOS 0x00000400 /*!< モンスターの学習フラグ: プレイヤーにカオス耐性あり */
85 #define SM_RES_DISEN 0x00000800 /*!< モンスターの学習フラグ: プレイヤーに劣化耐性あり */
86 #define SM_RES_BLIND 0x00001000 /*!< モンスターの学習フラグ: プレイヤーに盲目耐性あり */
87 #define SM_RES_NEXUS 0x00002000 /*!< モンスターの学習フラグ: プレイヤーに因果混乱耐性あり */
88 #define SM_RES_SOUND 0x00004000 /*!< モンスターの学習フラグ: プレイヤーに轟音耐性あり */
89 #define SM_RES_SHARD 0x00008000 /*!< モンスターの学習フラグ: プレイヤーに破片耐性あり */
90 #define SM_OPP_ACID 0x00010000 /*!< モンスターの学習フラグ: プレイヤーに二重酸耐性あり */
91 #define SM_OPP_ELEC 0x00020000 /*!< モンスターの学習フラグ: プレイヤーに二重電撃耐性あり */
92 #define SM_OPP_FIRE 0x00040000 /*!< モンスターの学習フラグ: プレイヤーに二重火炎耐性あり */
93 #define SM_OPP_COLD 0x00080000 /*!< モンスターの学習フラグ: プレイヤーに二重冷気耐性あり */
94 #define SM_OPP_POIS 0x00100000 /*!< モンスターの学習フラグ: プレイヤーに二重毒耐性あり */
95 #define SM_OPP_XXX1 0x00200000 /*!< 未使用 / (unused) */
96 #define SM_CLONED 0x00400000 /*!< クローンである / Cloned */
97 #define SM_PET 0x00800000 /*!< ペットである / Pet */
98 #define SM_IMM_ACID 0x01000000 /*!< モンスターの学習フラグ: プレイヤーに酸免疫あり */
99 #define SM_IMM_ELEC 0x02000000 /*!< モンスターの学習フラグ: プレイヤーに電撃免疫あり */
100 #define SM_IMM_FIRE 0x04000000 /*!< モンスターの学習フラグ: プレイヤーに火炎免疫あり */
101 #define SM_IMM_COLD 0x08000000 /*!< モンスターの学習フラグ: プレイヤーに冷気免疫あり */
102 #define SM_FRIENDLY 0x10000000 /*!< 友好的である / Friendly */
103 #define SM_IMM_REFLECT 0x20000000 /*!< モンスターの学習フラグ: プレイヤーに反射あり */
104 #define SM_IMM_FREE 0x40000000 /*!< モンスターの学習フラグ: プレイヤーに麻痺耐性あり */
105 #define SM_IMM_MANA 0x80000000 /*!< モンスターの学習フラグ: プレイヤーにMPがない */
107 MONSTER_IDX parent_m_idx;
110 #define MON_BEGGAR 12
112 #define MON_BLACK_MARKET 14
113 #define MON_LION_HEART 19
115 #define MON_NOV_PRIEST 45
120 #define MON_PIRANHA 70
121 #define MON_COPPER_COINS 85
122 #define MON_NOV_PALADIN 97
123 #define MON_GREEN_G 100
124 #define MON_NOV_PRIEST_G 109
125 #define MON_SILVER_COINS 117
126 #define MON_D_ELF 122
127 #define MON_MANES 128
128 #define MON_LOST_SOUL 133
129 #define MON_ROBIN_HOOD 138
130 #define MON_NOV_PALADIN_G 147
131 #define MON_PHANTOM_W 152
132 #define MON_WOUNDED_BEAR 159
133 #define MON_D_ELF_MAGE 178
134 #define MON_D_ELF_WARRIOR 182
135 #define MON_BLUE_HORROR 189
136 #define MON_GOLD_COINS 195
137 #define MON_VORPAL_BUNNY 205
138 #define MON_MASTER_YEEK 224
139 #define MON_PRIEST 225
140 #define MON_D_ELF_PRIEST 226
141 #define MON_TIGER 230
142 #define MON_MITHRIL_COINS 239
143 #define MON_DRUID 241
144 #define MON_PINK_HORROR 242
145 #define MON_HILL_GIANT 255
146 #define MON_WERERAT 270
147 #define MON_UMBER_HULK 283
148 #define MON_ORC_CAPTAIN 285
149 #define MON_BERSERKER 293
151 #define MON_SHAGRAT 314
152 #define MON_GORBAG 315
153 #define MON_STONE_GIANT 321
154 #define MON_LIZARD_KING 332
155 #define MON_WYVERN 334
156 #define MON_SABRE_TIGER 339
157 #define MON_D_ELF_LORD 348
158 #define MON_FIRE_VOR 354
159 #define MON_WATER_VOR 355
160 #define MON_ARCH_VILE 357
161 #define MON_COLD_VOR 358
162 #define MON_ENERGY_VOR 359
163 #define MON_IRON_GOLEM 367
164 #define MON_JADE_MONK 370
165 #define MON_D_ELF_WARLOCK 375
166 #define MON_HAGEN 383
167 #define MON_MENELDOR 384
168 #define MON_PHANTOM_B 385
169 #define MON_C_CRAWLER 395
170 #define MON_XICLOTLAN 396
171 #define MON_D_ELF_DRUID 400
172 #define MON_TROLL_PRIEST 403
173 #define MON_GWAIHIR 410
174 #define MON_ANGEL 417
175 #define MON_ADAMANT_COINS 423
176 #define MON_COLBRAN 435
177 #define MON_SPIRIT_NAGA 436
178 #define MON_GACHAPIN 441
179 #define MON_BASILISK 453
180 #define MON_ARCHANGEL 456
181 #define MON_MITHRIL_GOLEM 464
182 #define MON_THORONDOR 468
183 #define MON_SHADOW_DRAKE 471
184 #define MON_GHOST 477
185 #define MON_OGRE_SHAMAN 479
186 #define MON_GHOUL_KING 483
187 #define MON_NINJA 485
188 #define MON_BICLOPS 490
189 #define MON_IVORY_MONK 492
190 #define MON_LOG_MASTER 498
191 #define MON_ETHER_DRAKE 504
192 #define MON_GOEMON 505
193 #define MON_CHERUB 511
194 #define MON_WATER_ELEM 512
197 #define MON_BLOODLETTER 523
198 #define MON_HALFLING_S 539
199 #define MON_GRAV_HOUND 540
200 #define MON_REVENANT 555
202 #define MON_COLOSSUS 558
203 #define MON_NIGHTBLADE 564
204 #define MON_ELDER_THING 569
205 #define MON_CRYPT_THING 577
206 #define MON_NEXUS_VOR 587
207 #define MON_PLASMA_VOR 588
208 #define MON_TIME_VOR 589
209 #define MON_M_MH_DRAGON 593
210 #define MON_MANDOR 598
211 #define MON_SHIM_VOR 600
212 #define MON_SERAPH 605
213 #define MON_BARON_HELL 609
214 #define MON_KAVLAX 616
215 #define MON_ETTIN 621
216 #define MON_VAMPIRE_LORD 623
217 #define MON_JUBJUB 640
218 #define MON_G_C_DRAKE 646
219 #define MON_CLUB_DEMON 648
220 #define MON_F_ANGEL 652
221 #define MON_D_ELF_SORC 657
222 #define MON_MASTER_LICH 658
223 #define MON_RINALDO 660
224 #define MON_ARCHON 661
225 #define MON_UND_BEHOLDER 664
226 #define MON_IRON_LICH 666
227 #define MON_JACK_SHADOWS 670
228 #define MON_LLOIGOR 682
229 #define MON_DREADMASTER 690
230 #define MON_DROLEM 691
232 #define MON_NAZGUL 696
233 #define MON_SMAUG 697
234 #define MON_STORMBRINGER 698
235 #define MON_ULTRA_PALADIN 699
236 #define MON_G_TITAN 702
237 #define MON_S_TYRANNO 705
238 #define MON_FAFNER 712
239 #define MON_G_BALROG 720
240 #define MON_TIME_HOUND 725
241 #define MON_PLASMA_HOUND 726
242 #define MON_BULLGATES 732
243 #define MON_SANTACLAUS 733
244 #define MON_LORD_CHAOS 737
245 #define MON_TINDALOS 739
246 #define MON_DEMILICH 742
247 #define MON_NIGHTCRAWLER 744
248 #define MON_CHAOS_VOR 751
249 #define MON_AETHER_VOR 752
250 #define MON_FUNDIN 762
251 #define MON_DWORKIN 763
252 #define MON_NIGHTWALKER 768
253 #define MON_RAPHAEL 769
254 #define MON_SARUMAN 771
255 #define MON_GANDALF 772
256 #define MON_BRAND 773
257 #define MON_SHADOWLORD 774
258 #define MON_ARCHLICH 776
259 #define MON_JABBERWOCK 778
260 #define MON_CHAOS_HOUND 779
261 #define MON_ULT_BEHOLDER 781
262 #define MON_SHAMBLER 786
263 #define MON_BLEYS 789
264 #define MON_FIONA 791
265 #define MON_SKY_DRAKE 793
266 #define MON_JULIAN 794
267 #define MON_BLACK_REAVER 798
268 #define MON_CAINE 799
269 #define MON_GERARD 807
270 #define MON_UNGOLIANT 808
271 #define MON_ATLACH_NACHA 809
272 #define MON_Y_GOLONAC 810
273 #define MON_AETHER_HOUND 811
274 #define MON_WARP_DEMON 812
276 #define MON_UNMAKER 815
277 #define MON_CYBER 816
278 #define MON_KLING 819
279 #define MON_CORWIN 820
280 #define MON_ANGMAR 825
281 #define MON_CANTORAS 830
282 #define MON_GODZILLA 832
283 #define MON_SPAWN_CTH 836
284 #define MON_SURTUR 837
285 #define MON_TARRASQUE 838
286 #define MON_LUNGORTHIN 839
287 #define MON_CYBER_KING 843
288 #define MON_WYRM_POWER 847
289 #define MON_NODENS 849
290 #define MON_JORMUNGAND 854
291 #define MON_DESTROYER 855
292 #define MON_GOTHMOG 856
293 #define MON_G_CTHULHU 857
294 #define MON_SAURON 858
295 #define MON_UNICORN_ORD 859
296 #define MON_OBERON 860
297 #define MON_MORGOTH 861
298 #define MON_SERPENT 862
299 #define MON_ONE_RING 864
300 #define MON_CAAWS 866
301 #define MON_CULVERIN 867
302 #define MON_EBONY_MONK 870
303 #define MON_HAGURE 871
304 #define MON_OROCHI 872
305 #define MON_ECHIZEN 873
306 #define MON_SPECT_WYRM 874
310 #define MON_ZOMBI_SERPENT 883
311 #define MON_D_ELF_SHADE 886
312 #define MON_MANA_HOUND 887
313 #define MON_VENOM_WYRM 890
314 #define MON_TROLL_KING 894
315 #define MON_BAZOOKER 896
316 #define MON_SHARD_VOR 897
317 #define MON_ELF_LORD 900
318 #define MON_MASTER_MYS 916
319 #define MON_G_MASTER_MYS 917
321 #define MON_TSUCHINOKO 926
322 #define MON_GCWADL 929
323 #define MON_LOCKE_CLONE 930
324 #define MON_CALDARM 931
325 #define MON_BANORLUPART 932
326 #define MON_BANOR 933
327 #define MON_LUPART 934
328 #define MON_KENSHIROU 936
329 #define MON_W_KNIGHT 938
330 #define MON_PLANETAR 942
331 #define MON_SOLAR 943
332 #define MON_BIKETAL 945
334 #define MON_IKETA 949
335 #define MON_B_DEATH_SWORD 953
336 #define MON_YASE_HORSE 955
337 #define MON_HORSE 956
338 #define MON_BOTEI 963
340 #define MON_JAIAN 967
342 #define MON_THAT_BAT 975
343 #define MON_SHUTEN 979
344 #define MON_FENGHUANG 988
345 #define MON_KIRIN 989
346 #define MON_BAHAMUT 1000
347 #define MON_SUKE 1001
348 #define MON_KAKU 1002
349 #define MON_GHOST_Q 1003
351 #define MON_A_GOLD 1010
352 #define MON_A_SILVER 1011
353 #define MON_ROLENTO 1013
354 #define MON_RAOU 1018
355 #define MON_SHURYUUDAN 1023
356 #define MON_WAHHA 1031
357 #define MON_DEBBY 1032
358 #define MON_KNI_TEMPLAR 1037
359 #define MON_PALADIN 1038
360 #define MON_CHAMELEON 1040
361 #define MON_CHAMELEON_K 1041
362 #define MON_TOPAZ_MONK 1047
363 #define MON_M_MINDCRAFTER 1056
364 #define MON_ELDER_VAMPIRE 1058
365 #define MON_NOBORTA 1059
366 #define MON_MORI_TROLL 1060
367 #define MON_BARNEY 1061
368 #define MON_GROO 1062
369 #define MON_LOUSY 1063
370 #define MON_WYRM_SPACE 1064
371 #define MON_JIZOTAKO 1065
372 #define MON_TANUKI 1067
373 #define MON_ALIEN_JURAL 1082
374 #define MON_HATOPOPPO 1083
375 #define MON_KOGAN 1096
378 * Bit flags for the place_monster_???() (etc)
380 #define PM_ALLOW_SLEEP 0x00000001 /*!< モンスター生成フラグ: 眠っている状態で生成されても良い */
381 #define PM_ALLOW_GROUP 0x00000002 /*!< モンスター生成フラグ: 集団生成されても良い */
382 #define PM_FORCE_FRIENDLY 0x00000004 /*!< モンスター生成フラグ: 必ず友好的に生成される */
383 #define PM_FORCE_PET 0x00000008 /*!< モンスター生成フラグ: 必ずペットとして生成される */
384 #define PM_NO_KAGE 0x00000010 /*!< モンスター生成フラグ: 必ずあやしい影としては生成されない */
385 #define PM_NO_PET 0x00000020 /*!< モンスター生成フラグ: 必ずペットとして生成されない */
386 #define PM_ALLOW_UNIQUE 0x00000040 /*!< モンスター生成フラグ: ユニークの選択生成を許可する */
387 #define PM_IGNORE_TERRAIN 0x00000080 /*!< モンスター生成フラグ: 侵入可能地形を考慮せずに生成する */
388 #define PM_HASTE 0x00000100 /*!< モンスター生成フラグ: 加速状態で生成する */
389 #define PM_KAGE 0x00000200 /*!< モンスター生成フラグ: 必ずあやしい影として生成する */
390 #define PM_MULTIPLY 0x00000400 /*!< モンスター生成フラグ: 増殖処理時として生成する */
392 extern bool place_monster_aux(MONSTER_IDX who, POSITION y, POSITION x, MONRACE_IDX r_idx, BIT_FLAGS mode);
393 extern bool place_monster(POSITION y, POSITION x, BIT_FLAGS mode);
394 extern bool alloc_horde(POSITION y, POSITION x);
395 extern bool alloc_guardian(bool def_val);
396 extern bool alloc_monster(POSITION dis, BIT_FLAGS mode);
398 extern void monster_desc(char *desc, monster_type *m_ptr, BIT_FLAGS mode);
399 /* Bit flags for monster_desc() */
400 #define MD_OBJECTIVE 0x00000001 /* Objective (or Reflexive) */
401 #define MD_POSSESSIVE 0x00000002 /* Possessive (or Reflexive) */
402 #define MD_INDEF_HIDDEN 0x00000004 /* Use indefinites for hidden monsters ("something") */
403 #define MD_INDEF_VISIBLE 0x00000008 /* Use indefinites for visible monsters ("a kobold") */
404 #define MD_PRON_HIDDEN 0x00000010 /* Pronominalize hidden monsters */
405 #define MD_PRON_VISIBLE 0x00000020 /* Pronominalize visible monsters */
406 #define MD_ASSUME_HIDDEN 0x00000040 /* Assume the monster is hidden */
407 #define MD_ASSUME_VISIBLE 0x00000080 /* Assume the monster is visible */
408 #define MD_TRUE_NAME 0x00000100 /* Chameleon's true name */
409 #define MD_IGNORE_HALLU 0x00000200 /* Ignore hallucination, and penetrate shape change */
411 #define MD_WRONGDOER_NAME (MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE) /* 加害明記向け */
413 extern void monster_name(MONSTER_IDX m_idx, char* m_name);
415 extern void roff_top(MONRACE_IDX r_idx);
416 extern void screen_roff(MONRACE_IDX r_idx, BIT_FLAGS mode);
417 extern void display_roff(MONRACE_IDX r_idx);
418 extern void output_monster_spoiler(MONRACE_IDX r_idx, void(*roff_func)(TERM_COLOR attr, concptr str));
419 extern concptr extract_note_dies(MONRACE_IDX r_idx);
420 extern void monster_death(MONSTER_IDX m_idx, bool drop_item);
421 extern monsterrace_hook_type get_monster_hook(void);
422 extern monsterrace_hook_type get_monster_hook2(POSITION y, POSITION x);
423 extern void set_friendly(monster_type *m_ptr);
424 extern void set_pet(monster_type *m_ptr);
425 extern void set_hostile(monster_type *m_ptr);
426 extern void anger_monster(monster_type *m_ptr);
429 * Bit flags for the *_can_enter() and monster_can_cross_terrain()
431 #define CEM_RIDING 0x0001
432 #define CEM_P_CAN_ENTER_PATTERN 0x0002
433 extern bool monster_can_cross_terrain(FEAT_IDX feat, monster_race *r_ptr, BIT_FLAGS16 mode);
434 extern bool monster_can_enter(POSITION y, POSITION x, monster_race *r_ptr, BIT_FLAGS16 mode);
436 extern bool are_enemies(monster_type *m_ptr1, monster_type *m_ptr2);
437 extern bool monster_has_hostile_align(monster_type *m_ptr, int pa_good, int pa_evil, monster_race *r_ptr);
438 extern void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char* msg);
439 extern concptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode);
440 extern int get_monster_crowd_number(MONSTER_IDX m_idx);
441 extern void message_pain(MONSTER_IDX m_idx, HIT_POINT dam);
444 extern void set_target(monster_type *m_ptr, POSITION y, POSITION x);
445 extern void reset_target(monster_type *m_ptr);
446 extern monster_race *real_r_ptr(monster_type *m_ptr);
447 extern MONRACE_IDX real_r_idx(monster_type *m_ptr);
448 extern void delete_monster_idx(MONSTER_IDX i);
449 extern void delete_monster(POSITION y, POSITION x);
450 extern void compact_monsters(int size);
451 extern void wipe_m_list(void);
452 extern MONSTER_IDX m_pop(void);
453 extern errr get_mon_num_prep(monsterrace_hook_type monster_hook, monsterrace_hook_type monster_hook2);
454 extern MONRACE_IDX get_mon_num(DEPTH level);
455 extern int lore_do_probe(MONRACE_IDX r_idx);
456 extern void lore_treasure(MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold);
457 extern void update_monster(MONSTER_IDX m_idx, bool full);
458 extern void update_monsters(bool full);
459 extern bool multiply_monster(MONSTER_IDX m_idx, bool clone, BIT_FLAGS mode);
463 * Some things which induce learning
483 #define DRS_REFLECT 32
484 extern void update_smart_learn(MONSTER_IDX m_idx, int what);
486 extern void choose_new_monster(MONSTER_IDX m_idx, bool born, MONRACE_IDX r_idx);
487 extern SPEED get_mspeed(monster_race *r_ptr);
488 extern void monster_drop_carried_objects(monster_type *m_ptr);
490 #define is_friendly(A) \
491 (bool)(((A)->smart & SM_FRIENDLY) ? TRUE : FALSE)
493 #define is_friendly_idx(IDX) \
494 (bool)((IDX) > 0 && is_friendly(¤t_floor_ptr->m_list[(IDX)]))
497 (bool)(((A)->smart & SM_PET) ? TRUE : FALSE)
499 #define is_hostile(A) \
500 (bool)((is_friendly(A) || is_pet(A)) ? FALSE : TRUE)
502 /* Hack -- Determine monster race appearance index is same as race index */
503 #define is_original_ap(A) \
504 (bool)(((A)->ap_r_idx == (A)->r_idx) ? TRUE : FALSE)
506 #define is_original_ap_and_seen(A) \
507 (bool)((A)->ml && !p_ptr->image && ((A)->ap_r_idx == (A)->r_idx))