OSDN Git Service

For the Styx ogre, replaced "a" with "an" in the English description since it comes...
[hengband/hengband.git] / src / monster.h
1 #pragma once
2 #include "monsterrace.h"
3
4 typedef bool(*monsterrace_hook_type)(MONRACE_IDX r_idx);
5
6 extern MONSTER_IDX hack_m_idx;
7 extern MONSTER_IDX hack_m_idx_ii;
8
9 /* Maximum "Nazguls" number */
10 #define MAX_NAZGUL_NUM 5
11
12 #define MTIMED_CSLEEP   0 /* Monster is sleeping */
13 #define MTIMED_FAST     1 /* Monster is temporarily fast */
14 #define MTIMED_SLOW     2 /* Monster is temporarily slow */
15 #define MTIMED_STUNNED  3 /* Monster is stunned */
16 #define MTIMED_CONFUSED 4 /* Monster is confused */
17 #define MTIMED_MONFEAR  5 /* Monster is afraid */
18 #define MTIMED_INVULNER 6 /* Monster is temporarily invulnerable */
19
20 #define MAX_MTIMED      7
21
22 #define MON_CSLEEP(M_PTR)   ((M_PTR)->mtimed[MTIMED_CSLEEP])
23 #define MON_FAST(M_PTR)     ((M_PTR)->mtimed[MTIMED_FAST])
24 #define MON_SLOW(M_PTR)     ((M_PTR)->mtimed[MTIMED_SLOW])
25 #define MON_STUNNED(M_PTR)  ((M_PTR)->mtimed[MTIMED_STUNNED])
26 #define MON_CONFUSED(M_PTR) ((M_PTR)->mtimed[MTIMED_CONFUSED])
27 #define MON_MONFEAR(M_PTR)  ((M_PTR)->mtimed[MTIMED_MONFEAR])
28 #define MON_INVULNER(M_PTR) ((M_PTR)->mtimed[MTIMED_INVULNER])
29
30 /*
31  * Monster information, for a specific monster.
32  * Note: fy, fx constrain dungeon size to 256x256
33  * The "hold_o_idx" field points to the first object of a stack
34  * of objects (if any) being carried by the monster (see above).
35  */
36
37 typedef struct floor_type floor_type;
38 typedef struct
39 {
40         MONRACE_IDX r_idx;              /* Monster race index 0 = dead. */
41         MONRACE_IDX ap_r_idx;   /* Monster race appearance index */
42         floor_type *current_floor_ptr;
43
44         /* Sub-alignment flags for neutral monsters */
45         #define SUB_ALIGN_NEUTRAL 0x0000
46         #define SUB_ALIGN_EVIL    0x0001
47         #define SUB_ALIGN_GOOD    0x0002
48         BIT_FLAGS8 sub_align;           /* Sub-alignment for a neutral monster */
49
50         POSITION fy;            /* Y location on map */
51         POSITION fx;            /* X location on map */
52
53         HIT_POINT hp;           /* Current Hit points */
54         HIT_POINT maxhp;                /* Max Hit points */
55         HIT_POINT max_maxhp;            /* Max Max Hit points */
56         HIT_POINT dealt_damage;         /* Sum of damages dealt by player */
57
58         TIME_EFFECT mtimed[MAX_MTIMED]; /* Timed status counter */
59
60         SPEED mspeed;           /* Monster "speed" */
61         ACTION_ENERGY energy_need;      /* Monster "energy" */
62
63         POSITION cdis;          /* Current dis from player */
64
65         BIT_FLAGS8 mflag;       /* Extra monster flags */
66 #define MFLAG_VIEW      0x01    /* Monster is in line of sight */
67 #define MFLAG_LOS       0x02    /* Monster is marked for project_all_los(caster_ptr, ) */
68 #define MFLAG_XXX2      0x04    /* (unused) */
69 #define MFLAG_ETF       0x08    /* Monster is entering the field. */
70 #define MFLAG_BORN      0x10    /* Monster is still being born */
71 #define MFLAG_NICE      0x20    /* Monster is still being nice */
72
73         BIT_FLAGS8 mflag2;      /* Extra monster flags */
74 #define MFLAG2_KAGE      0x01    /* Monster is kage */
75 #define MFLAG2_NOPET     0x02    /* Cannot make monster pet */
76 #define MFLAG2_NOGENO    0x04    /* Cannot genocide */
77 #define MFLAG2_CHAMELEON 0x08    /* Monster is chameleon */
78 #define MFLAG2_NOFLOW    0x10    /* Monster is in no_flow_by_smell mode */
79 #define MFLAG2_SHOW      0x20    /* Monster is recently memorized */
80 #define MFLAG2_MARK      0x40    /* Monster is currently memorized */
81
82         bool ml;                /* Monster is "visible" */
83
84         OBJECT_IDX hold_o_idx;  /* Object being held (if any) */
85
86         POSITION target_y;              /* Can attack !los player */
87         POSITION target_x;              /* Can attack !los player */
88
89         STR_OFFSET nickname;            /* Monster's Nickname */
90
91         EXP exp;
92
93         /* TODO: クローン、ペット、有効化は意義が異なるので別変数に切り離すこと。save/loadのバージョン更新が面倒そうだけど */
94         BIT_FLAGS smart; /*!< Field for "smart_learn" - Some bit-flags for the "smart" field */
95 #define SM_RES_ACID             0x00000001 /*!< モンスターの学習フラグ: プレイヤーに酸耐性あり */
96 #define SM_RES_ELEC             0x00000002 /*!< モンスターの学習フラグ: プレイヤーに電撃耐性あり */
97 #define SM_RES_FIRE             0x00000004 /*!< モンスターの学習フラグ: プレイヤーに火炎耐性あり */
98 #define SM_RES_COLD             0x00000008 /*!< モンスターの学習フラグ: プレイヤーに冷気耐性あり */
99 #define SM_RES_POIS             0x00000010 /*!< モンスターの学習フラグ: プレイヤーに毒耐性あり */
100 #define SM_RES_NETH             0x00000020 /*!< モンスターの学習フラグ: プレイヤーに地獄耐性あり */
101 #define SM_RES_LITE             0x00000040 /*!< モンスターの学習フラグ: プレイヤーに閃光耐性あり */
102 #define SM_RES_DARK             0x00000080 /*!< モンスターの学習フラグ: プレイヤーに暗黒耐性あり */
103 #define SM_RES_FEAR             0x00000100 /*!< モンスターの学習フラグ: プレイヤーに恐怖耐性あり */
104 #define SM_RES_CONF             0x00000200 /*!< モンスターの学習フラグ: プレイヤーに混乱耐性あり */
105 #define SM_RES_CHAOS            0x00000400 /*!< モンスターの学習フラグ: プレイヤーにカオス耐性あり */
106 #define SM_RES_DISEN            0x00000800 /*!< モンスターの学習フラグ: プレイヤーに劣化耐性あり */
107 #define SM_RES_BLIND            0x00001000 /*!< モンスターの学習フラグ: プレイヤーに盲目耐性あり */
108 #define SM_RES_NEXUS            0x00002000 /*!< モンスターの学習フラグ: プレイヤーに因果混乱耐性あり */
109 #define SM_RES_SOUND            0x00004000 /*!< モンスターの学習フラグ: プレイヤーに轟音耐性あり */
110 #define SM_RES_SHARD            0x00008000 /*!< モンスターの学習フラグ: プレイヤーに破片耐性あり */
111 #define SM_OPP_ACID             0x00010000 /*!< モンスターの学習フラグ: プレイヤーに二重酸耐性あり */
112 #define SM_OPP_ELEC             0x00020000 /*!< モンスターの学習フラグ: プレイヤーに二重電撃耐性あり */
113 #define SM_OPP_FIRE             0x00040000 /*!< モンスターの学習フラグ: プレイヤーに二重火炎耐性あり */
114 #define SM_OPP_COLD             0x00080000 /*!< モンスターの学習フラグ: プレイヤーに二重冷気耐性あり */
115 #define SM_OPP_POIS             0x00100000 /*!< モンスターの学習フラグ: プレイヤーに二重毒耐性あり */
116 #define SM_OPP_XXX1             0x00200000 /*!< 未使用 / (unused) */
117 #define SM_CLONED               0x00400000 /*!< クローンである / Cloned */
118 #define SM_PET                  0x00800000 /*!< ペットである / Pet */
119 #define SM_IMM_ACID             0x01000000 /*!< モンスターの学習フラグ: プレイヤーに酸免疫あり */
120 #define SM_IMM_ELEC             0x02000000 /*!< モンスターの学習フラグ: プレイヤーに電撃免疫あり */
121 #define SM_IMM_FIRE             0x04000000 /*!< モンスターの学習フラグ: プレイヤーに火炎免疫あり */
122 #define SM_IMM_COLD             0x08000000 /*!< モンスターの学習フラグ: プレイヤーに冷気免疫あり */
123 #define SM_FRIENDLY             0x10000000 /*!< 友好的である / Friendly */
124 #define SM_IMM_REFLECT          0x20000000 /*!< モンスターの学習フラグ: プレイヤーに反射あり */
125 #define SM_IMM_FREE             0x40000000 /*!< モンスターの学習フラグ: プレイヤーに麻痺耐性あり */
126 #define SM_IMM_MANA             0x80000000 /*!< モンスターの学習フラグ: プレイヤーにMPがない */
127
128         MONSTER_IDX parent_m_idx;
129 } monster_type;
130
131 #define MON_BEGGAR        12
132 #define MON_LEPER         13
133 #define MON_LION_HEART    19
134 #define MON_NOV_PRIEST    45
135 #define MON_GRIP          53
136 #define MON_WOLF          54
137 #define MON_FANG          55
138 #define MON_LOUSE         69
139 #define MON_PIRANHA       70
140 #define MON_COPPER_COINS  85
141 #define MON_NOV_PALADIN   97
142 #define MON_NOV_PRIEST_G  109
143 #define MON_SILVER_COINS  117
144 #define MON_D_ELF         122
145 #define MON_MANES         128
146 #define MON_NOV_PALADIN_G 147
147 #define MON_PHANTOM_W     152
148 #define MON_WOUNDED_BEAR  159
149 #define MON_D_ELF_MAGE    178
150 #define MON_D_ELF_WARRIOR 182
151 #define MON_BLUE_HORROR   189
152 #define MON_GOLD_COINS    195
153 #define MON_MASTER_YEEK   224
154 #define MON_PRIEST        225
155 #define MON_D_ELF_PRIEST  226
156 #define MON_MITHRIL_COINS 239
157 #define MON_PINK_HORROR   242
158 #define MON_IMP           296
159 #define MON_LIZARD_KING   332
160 #define MON_WYVERN        334
161 #define MON_SABRE_TIGER   339
162 #define MON_D_ELF_LORD    348
163 #define MON_ARCH_VILE     357
164 #define MON_JADE_MONK     370
165 #define MON_D_ELF_WARLOCK 375
166 #define MON_MENELDOR      384
167 #define MON_PHANTOM_B     385
168 #define MON_D_ELF_DRUID   400
169 #define MON_GWAIHIR       410
170 #define MON_ADAMANT_COINS 423
171 #define MON_COLBRAN       435
172 #define MON_MITHRIL_GOLEM 464
173 #define MON_THORONDOR     468
174 #define MON_GHOUL_KING    483
175 #define MON_NINJA         485
176 #define MON_BICLOPS       490
177 #define MON_IVORY_MONK    492
178 #define MON_GOEMON        505
179 #define MON_WATER_ELEM    512
180 #define MON_BLOODLETTER   523
181 #define MON_RAAL          557
182 #define MON_NIGHTBLADE    564
183 #define MON_BARON_HELL    609
184 #define MON_G_C_DRAKE     646
185 #define MON_F_ANGEL       652
186 #define MON_D_ELF_SORC    657
187 #define MON_IRON_LICH     666
188 #define MON_DREADMASTER   690
189 #define MON_DROLEM        691
190 #define MON_DAWN          693
191 #define MON_NAZGUL        696
192 #define MON_SMAUG         697
193 #define MON_STORMBRINGER  698
194 #define MON_ULTRA_PALADIN 699
195 #define MON_G_TITAN       702
196 #define MON_S_TYRANNO     705
197 #define MON_FAFNER        712
198 #define MON_G_BALROG      720
199 #define MON_BULLGATES     732
200 #define MON_LORD_CHAOS    737
201 #define MON_NIGHTWALKER   768
202 #define MON_SHADOWLORD    774
203 #define MON_JABBERWOCK    778
204 #define MON_ULT_BEHOLDER  781
205 #define MON_SHAMBLER      786
206 #define MON_BLACK_REAVER  798
207 #define MON_UNMAKER       815
208 #define MON_CYBER         816
209 #define MON_ANGMAR        825
210 #define MON_WYRM_POWER    847
211 #define MON_JORMUNGAND    854
212 #define MON_SAURON        858
213 #define MON_UNICORN_ORD   859
214 #define MON_OBERON        860
215 #define MON_MORGOTH       861
216 #define MON_SERPENT       862
217 #define MON_ONE_RING      864
218 #define MON_EBONY_MONK    870
219 #define MON_HAGURE        871
220 #define MON_DIO           878
221 #define MON_OHMU          879
222 #define MON_WONG          880
223 #define MON_ZOMBI_SERPENT 883
224 #define MON_D_ELF_SHADE   886
225 #define MON_TROLL_KING    894
226 #define MON_ELF_LORD      900
227 #define MON_G_MASTER_MYS  917
228 #define MON_IE            921
229 #define MON_TSUCHINOKO    926
230 #define MON_LOCKE_CLONE   930
231 #define MON_CALDARM       931
232 #define MON_BANORLUPART   932
233 #define MON_BANOR         933
234 #define MON_LUPART        934
235 #define MON_KENSHIROU     936
236 #define MON_W_KNIGHT      938
237 #define MON_BIKETAL       945
238 #define MON_IKETA         949
239 #define MON_B_DEATH_SWORD 953
240 #define MON_YASE_HORSE    955
241 #define MON_HORSE         956
242 #define MON_BOTEI         963
243 #define MON_KAGE          964
244 #define MON_JAIAN         967
245 #define MON_FENGHUANG     988
246 #define MON_SUKE          1001
247 #define MON_KAKU          1002
248 #define MON_A_GOLD        1010
249 #define MON_A_SILVER      1011
250 #define MON_ROLENTO       1013
251 #define MON_RAOU          1018
252 #define MON_GRENADE       1023
253 #define MON_DEBBY         1032
254 #define MON_KNI_TEMPLAR   1037
255 #define MON_PALADIN       1038
256 #define MON_CHAMELEON     1040
257 #define MON_CHAMELEON_K   1041
258 #define MON_TOPAZ_MONK    1047
259 #define MON_M_MINDCRAFTER 1056
260 #define MON_ELDER_VAMPIRE 1058
261 #define MON_NOBORTA       1059
262 #define MON_MORI_TROLL    1060
263 #define MON_BARNEY        1061
264 #define MON_GROO          1062
265 #define MON_LOUSY         1063
266 #define MON_WYRM_SPACE    1064
267 #define MON_JIZOTAKO      1065
268 #define MON_TANUKI        1067
269 #define MON_ALIEN_JURAL   1082
270
271 /*
272  * Bit flags for the place_monster_???() (etc)
273  */
274 #define PM_ALLOW_SLEEP    0x00000001    /*!< モンスター生成フラグ: 眠っている状態で生成されても良い */
275 #define PM_ALLOW_GROUP    0x00000002    /*!< モンスター生成フラグ: 集団生成されても良い */
276 #define PM_FORCE_FRIENDLY 0x00000004    /*!< モンスター生成フラグ: 必ず友好的に生成される */
277 #define PM_FORCE_PET      0x00000008    /*!< モンスター生成フラグ: 必ずペットとして生成される */
278 #define PM_NO_KAGE        0x00000010    /*!< モンスター生成フラグ: 必ずあやしい影としては生成されない */
279 #define PM_NO_PET         0x00000020    /*!< モンスター生成フラグ: 必ずペットとして生成されない */
280 #define PM_ALLOW_UNIQUE   0x00000040    /*!< モンスター生成フラグ: ユニークの選択生成を許可する */
281 #define PM_IGNORE_TERRAIN 0x00000080    /*!< モンスター生成フラグ: 侵入可能地形を考慮せずに生成する */
282 #define PM_HASTE          0x00000100    /*!< モンスター生成フラグ: 加速状態で生成する */
283 #define PM_KAGE           0x00000200    /*!< モンスター生成フラグ: 必ずあやしい影として生成する */
284 #define PM_MULTIPLY       0x00000400    /*!< モンスター生成フラグ: 増殖処理時として生成する */
285 #define PM_JURAL          0x00000800    /*!< モンスター生成フラグ: ジュラル星人として誤認生成する */
286
287 extern bool place_monster_aux(player_type *player_ptr, MONSTER_IDX who, POSITION y, POSITION x, MONRACE_IDX r_idx, BIT_FLAGS mode);
288 extern bool place_monster(player_type *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode);
289 extern bool alloc_horde(player_type *player_ptr, POSITION y, POSITION x);
290 extern bool alloc_guardian(player_type *player_ptr, bool def_val);
291 extern bool alloc_monster(player_type *player_ptr, POSITION dis, BIT_FLAGS mode);
292
293 extern void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_FLAGS mode);
294 /* Bit flags for monster_desc() */
295 #define MD_OBJECTIVE      0x00000001 /* Objective (or Reflexive) */
296 #define MD_POSSESSIVE     0x00000002 /* Possessive (or Reflexive) */
297 #define MD_INDEF_HIDDEN   0x00000004 /* Use indefinites for hidden monsters ("something") */
298 #define MD_INDEF_VISIBLE  0x00000008 /* Use indefinites for visible monsters ("a kobold") */
299 #define MD_PRON_HIDDEN    0x00000010 /* Pronominalize hidden monsters */
300 #define MD_PRON_VISIBLE   0x00000020 /* Pronominalize visible monsters */
301 #define MD_ASSUME_HIDDEN  0x00000040 /* Assume the monster is hidden */
302 #define MD_ASSUME_VISIBLE 0x00000080 /* Assume the monster is visible */
303 #define MD_TRUE_NAME      0x00000100 /* Chameleon's true name */
304 #define MD_IGNORE_HALLU   0x00000200 /* Ignore hallucination, and penetrate shape change */
305
306 #define MD_WRONGDOER_NAME (MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE) /* 加害明記向け */
307
308 extern void monster_name(player_type *player_ptr, MONSTER_IDX m_idx, char* m_name);
309
310 extern void roff_top(MONRACE_IDX r_idx);
311 extern void screen_roff(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS mode);
312 extern void display_roff(player_type *player_ptr);
313 extern void output_monster_spoiler(player_type *player_ptr, MONRACE_IDX r_idx, void(*roff_func)(TERM_COLOR attr, concptr str));
314 extern concptr extract_note_dies(MONRACE_IDX r_idx);
315 extern void monster_death(player_type *player_ptr, MONSTER_IDX m_idx, bool drop_item);
316 extern monsterrace_hook_type get_monster_hook(player_type *player_ptr);
317 extern monsterrace_hook_type get_monster_hook2(player_type *player_ptr, POSITION y, POSITION x);
318 extern void set_friendly(monster_type *m_ptr);
319 extern void set_pet(player_type *player_ptr, monster_type *m_ptr);
320 extern void set_hostile(player_type *player_ptr, monster_type *m_ptr);
321 extern void anger_monster(player_type *player_ptr, monster_type *m_ptr);
322
323 /*
324  * Bit flags for the *_can_enter() and monster_can_cross_terrain()
325  */
326 #define CEM_RIDING              0x0001
327 #define CEM_P_CAN_ENTER_PATTERN 0x0002
328 extern bool monster_can_cross_terrain(player_type *player_ptr, FEAT_IDX feat, monster_race *r_ptr, BIT_FLAGS16 mode);
329 extern bool monster_can_enter(player_type *player_ptr, POSITION y, POSITION x, monster_race *r_ptr, BIT_FLAGS16 mode);
330
331 extern bool are_enemies(player_type *player_ptr, monster_type *m_ptr1, monster_type *m_ptr2);
332 extern bool monster_has_hostile_align(player_type *player_ptr, monster_type *m_ptr, int pa_good, int pa_evil, monster_race *r_ptr);
333 extern void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char* msg);
334 extern concptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode);
335 extern int get_monster_crowd_number(player_type *player_ptr, MONSTER_IDX m_idx);
336 extern void message_pain(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam);
337
338 /* monster2.c */
339 extern void set_target(monster_type *m_ptr, POSITION y, POSITION x);
340 extern void reset_target(monster_type *m_ptr);
341 extern monster_race *real_r_ptr(monster_type *m_ptr);
342 extern MONRACE_IDX real_r_idx(monster_type *m_ptr);
343 extern void delete_monster_idx(player_type *player_ptr, MONSTER_IDX i);
344 extern void compact_monsters(player_type *player_ptr, int size);
345 extern void wipe_monsters_list(player_type *player_ptr);
346 extern MONSTER_IDX m_pop(player_type *player_ptr);
347 extern errr get_mon_num_prep(player_type *player_ptr, monsterrace_hook_type monster_hook, monsterrace_hook_type monster_hook2);
348
349 #define GMN_ARENA 0x00000001 //!< 賭け闘技場向け生成 
350 extern MONRACE_IDX get_mon_num(player_type *player_ptr, DEPTH level, BIT_FLAGS option);
351
352 extern int lore_do_probe(player_type *player_ptr, MONRACE_IDX r_idx);
353 extern void lore_treasure(player_type *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold);
354 extern void update_monster(player_type *subject_ptr, MONSTER_IDX m_idx, bool full);
355 extern void update_monsters(player_type *player_ptr, bool full);
356 extern bool multiply_monster(player_type *player_ptr, MONSTER_IDX m_idx, bool clone, BIT_FLAGS mode);
357 extern bool summon_specific(player_type *player_ptr, MONSTER_IDX who, POSITION y1, POSITION x1, DEPTH lev, int type, BIT_FLAGS mode);
358 extern bool summon_named_creature(player_type *player_ptr, MONSTER_IDX who, POSITION oy, POSITION ox, MONRACE_IDX r_idx, BIT_FLAGS mode);
359
360 /*
361  * Some things which induce learning
362  */
363 #define DRS_ACID         1
364 #define DRS_ELEC         2
365 #define DRS_FIRE         3
366 #define DRS_COLD         4
367 #define DRS_POIS         5
368 #define DRS_NETH         6
369 #define DRS_LITE         7
370 #define DRS_DARK         8
371 #define DRS_FEAR         9
372 #define DRS_CONF        10
373 #define DRS_CHAOS       11
374 #define DRS_DISEN       12
375 #define DRS_BLIND       13
376 #define DRS_NEXUS       14
377 #define DRS_SOUND       15
378 #define DRS_SHARD       16
379 #define DRS_FREE        30
380 #define DRS_MANA        31
381 #define DRS_REFLECT     32
382 extern void update_smart_learn(player_type *player_ptr, MONSTER_IDX m_idx, int what);
383
384 extern void choose_new_monster(player_type *player_ptr, MONSTER_IDX m_idx, bool born, MONRACE_IDX r_idx);
385 extern SPEED get_mspeed(player_type *player_ptr, monster_race *r_ptr);
386 extern void monster_drop_carried_objects(player_type *player_ptr, monster_type *m_ptr);
387 extern bool is_original_ap_and_seen(player_type *player_ptr, monster_type *m_ptr);
388
389 #define is_friendly(A) \
390          (bool)(((A)->smart & SM_FRIENDLY) ? TRUE : FALSE)
391
392 #define is_pet(A) \
393          (bool)(((A)->smart & SM_PET) ? TRUE : FALSE)
394
395 #define is_hostile(A) \
396          (bool)((is_friendly(A) || is_pet(A)) ? FALSE : TRUE)
397
398 /* Hack -- Determine monster race appearance index is same as race index */
399 #define is_original_ap(A) \
400          (bool)(((A)->ap_r_idx == (A)->r_idx) ? TRUE : FALSE)