OSDN Git Service

[Refactor] #37353 モンスターステータス処理を melee2.c から monster-status.c/h へ分離。
[hengband/hengband.git] / src / monster-status.c
1 #include "angband.h"\r
2 \r
3 \r
4 /*!\r
5 * @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\82ð\8eæ\93¾\82·\82é\r
6 * @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
7 * @return mproc_type \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
8 * @return \8ec\82è\83^\81[\83\93\92l\r
9 */\r
10 int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type)\r
11 {\r
12         s16b *cur_mproc_list = mproc_list[mproc_type];\r
13         int i;\r
14 \r
15         for (i = mproc_max[mproc_type] - 1; i >= 0; i--)\r
16         {\r
17                 if (cur_mproc_list[i] == m_idx) return i;\r
18         }\r
19 \r
20         return -1;\r
21 }\r
22 \r
23 /*!\r
24 * @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\92Ç\89Á\82·\82é\r
25 * @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
26 * @return mproc_type \92Ç\89Á\82µ\82½\82¢\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
27 * @return \82È\82µ\r
28 */\r
29 static void mproc_add(MONSTER_IDX m_idx, int mproc_type)\r
30 {\r
31         if (mproc_max[mproc_type] < max_m_idx) mproc_list[mproc_type][mproc_max[mproc_type]++] = (s16b)m_idx;\r
32 }\r
33 \r
34 \r
35 /*!\r
36 * @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\8dí\8f\9c\r
37 * @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
38 * @return mproc_type \8dí\8f\9c\82µ\82½\82¢\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
39 * @return \82È\82µ\r
40 */\r
41 static void mproc_remove(MONSTER_IDX m_idx, int mproc_type)\r
42 {\r
43         int mproc_idx = get_mproc_idx(m_idx, mproc_type);\r
44         if (mproc_idx >= 0) mproc_list[mproc_type][mproc_idx] = mproc_list[mproc_type][--mproc_max[mproc_type]];\r
45 }\r
46 \r
47 \r
48 /*!\r
49 * @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\8f\89\8aú\89»\82·\82é / Initialize monster process\r
50 * @return \82È\82µ\r
51 */\r
52 void mproc_init(void)\r
53 {\r
54         monster_type *m_ptr;\r
55         MONSTER_IDX i;\r
56         int cmi;\r
57 \r
58         /* Reset "mproc_max[]" */\r
59         for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 0;\r
60 \r
61         /* Process the monsters (backwards) */\r
62         for (i = m_max - 1; i >= 1; i--)\r
63         {\r
64                 /* Access the monster */\r
65                 m_ptr = &m_list[i];\r
66 \r
67                 /* Ignore "dead" monsters */\r
68                 if (!m_ptr->r_idx) continue;\r
69 \r
70                 for (cmi = 0; cmi < MAX_MTIMED; cmi++)\r
71                 {\r
72                         if (m_ptr->mtimed[cmi]) mproc_add(i, cmi);\r
73                 }\r
74         }\r
75 }\r
76 \r
77 \r
78 /*!\r
79 * @brief \83\82\83\93\83X\83^\81[\82Ì\90\87\96°\8fó\91Ô\92l\82ð\83Z\83b\83g\82·\82é /\r
80 * Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes\r
81 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
82 * @param v \83Z\83b\83g\82·\82é\92l\r
83 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
84 */\r
85 bool set_monster_csleep(MONSTER_IDX m_idx, int v)\r
86 {\r
87         monster_type *m_ptr = &m_list[m_idx];\r
88         bool notice = FALSE;\r
89 \r
90         /* Hack -- Force good values */\r
91         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;\r
92 \r
93         /* Open */\r
94         if (v)\r
95         {\r
96                 if (!MON_CSLEEP(m_ptr))\r
97                 {\r
98                         mproc_add(m_idx, MTIMED_CSLEEP);\r
99                         notice = TRUE;\r
100                 }\r
101         }\r
102 \r
103         /* Shut */\r
104         else\r
105         {\r
106                 if (MON_CSLEEP(m_ptr))\r
107                 {\r
108                         mproc_remove(m_idx, MTIMED_CSLEEP);\r
109                         notice = TRUE;\r
110                 }\r
111         }\r
112 \r
113         /* Use the value */\r
114         m_ptr->mtimed[MTIMED_CSLEEP] = (s16b)v;\r
115 \r
116         if (!notice) return FALSE;\r
117 \r
118         if (m_ptr->ml)\r
119         {\r
120                 /* Update health bar as needed */\r
121                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
122                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
123         }\r
124 \r
125         if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);\r
126 \r
127         return TRUE;\r
128 }\r
129 \r
130 \r
131 /*!\r
132 * @brief \83\82\83\93\83X\83^\81[\82Ì\89Á\91¬\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
133 * Set "m_ptr->mtimed[MTIMED_FAST]", notice observable changes\r
134 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
135 * @param v \83Z\83b\83g\82·\82é\92l\r
136 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
137 */\r
138 bool set_monster_fast(MONSTER_IDX m_idx, int v)\r
139 {\r
140         monster_type *m_ptr = &m_list[m_idx];\r
141         bool notice = FALSE;\r
142 \r
143         /* Hack -- Force good values */\r
144         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
145 \r
146         /* Open */\r
147         if (v)\r
148         {\r
149                 if (!MON_FAST(m_ptr))\r
150                 {\r
151                         mproc_add(m_idx, MTIMED_FAST);\r
152                         notice = TRUE;\r
153                 }\r
154         }\r
155 \r
156         /* Shut */\r
157         else\r
158         {\r
159                 if (MON_FAST(m_ptr))\r
160                 {\r
161                         mproc_remove(m_idx, MTIMED_FAST);\r
162                         notice = TRUE;\r
163                 }\r
164         }\r
165 \r
166         /* Use the value */\r
167         m_ptr->mtimed[MTIMED_FAST] = (s16b)v;\r
168 \r
169         if (!notice) return FALSE;\r
170 \r
171         if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);\r
172 \r
173         return TRUE;\r
174 }\r
175 \r
176 \r
177 /*\r
178 * Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes\r
179 */\r
180 bool set_monster_slow(MONSTER_IDX m_idx, int v)\r
181 {\r
182         monster_type *m_ptr = &m_list[m_idx];\r
183         bool notice = FALSE;\r
184 \r
185         /* Hack -- Force good values */\r
186         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
187 \r
188         /* Open */\r
189         if (v)\r
190         {\r
191                 if (!MON_SLOW(m_ptr))\r
192                 {\r
193                         mproc_add(m_idx, MTIMED_SLOW);\r
194                         notice = TRUE;\r
195                 }\r
196         }\r
197 \r
198         /* Shut */\r
199         else\r
200         {\r
201                 if (MON_SLOW(m_ptr))\r
202                 {\r
203                         mproc_remove(m_idx, MTIMED_SLOW);\r
204                         notice = TRUE;\r
205                 }\r
206         }\r
207 \r
208         /* Use the value */\r
209         m_ptr->mtimed[MTIMED_SLOW] = (s16b)v;\r
210 \r
211         if (!notice) return FALSE;\r
212 \r
213         if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);\r
214 \r
215         return TRUE;\r
216 }\r
217 \r
218 \r
219 /*!\r
220 * @brief \83\82\83\93\83X\83^\81[\82Ì\9eN\9eO\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
221 * Set "m_ptr->mtimed[MTIMED_STUNNED]", notice observable changes\r
222 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
223 * @param v \83Z\83b\83g\82·\82é\92l\r
224 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
225 */\r
226 bool set_monster_stunned(MONSTER_IDX m_idx, int v)\r
227 {\r
228         monster_type *m_ptr = &m_list[m_idx];\r
229         bool notice = FALSE;\r
230 \r
231         /* Hack -- Force good values */\r
232         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
233 \r
234         /* Open */\r
235         if (v)\r
236         {\r
237                 if (!MON_STUNNED(m_ptr))\r
238                 {\r
239                         mproc_add(m_idx, MTIMED_STUNNED);\r
240                         notice = TRUE;\r
241                 }\r
242         }\r
243 \r
244         /* Shut */\r
245         else\r
246         {\r
247                 if (MON_STUNNED(m_ptr))\r
248                 {\r
249                         mproc_remove(m_idx, MTIMED_STUNNED);\r
250                         notice = TRUE;\r
251                 }\r
252         }\r
253 \r
254         /* Use the value */\r
255         m_ptr->mtimed[MTIMED_STUNNED] = (s16b)v;\r
256 \r
257         return notice;\r
258 }\r
259 \r
260 \r
261 /*!\r
262 * @brief \83\82\83\93\83X\83^\81[\82Ì\8d¬\97\90\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
263 * Set "m_ptr->mtimed[MTIMED_CONFUSED]", notice observable changes\r
264 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
265 * @param v \83Z\83b\83g\82·\82é\92l\r
266 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
267 */\r
268 bool set_monster_confused(MONSTER_IDX m_idx, int v)\r
269 {\r
270         monster_type *m_ptr = &m_list[m_idx];\r
271         bool notice = FALSE;\r
272 \r
273         /* Hack -- Force good values */\r
274         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
275 \r
276         /* Open */\r
277         if (v)\r
278         {\r
279                 if (!MON_CONFUSED(m_ptr))\r
280                 {\r
281                         mproc_add(m_idx, MTIMED_CONFUSED);\r
282                         notice = TRUE;\r
283                 }\r
284         }\r
285 \r
286         /* Shut */\r
287         else\r
288         {\r
289                 if (MON_CONFUSED(m_ptr))\r
290                 {\r
291                         mproc_remove(m_idx, MTIMED_CONFUSED);\r
292                         notice = TRUE;\r
293                 }\r
294         }\r
295 \r
296         /* Use the value */\r
297         m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)v;\r
298 \r
299         return notice;\r
300 }\r
301 \r
302 \r
303 /*!\r
304 * @brief \83\82\83\93\83X\83^\81[\82Ì\8b°\8dQ\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
305 * Set "m_ptr->mtimed[MTIMED_MONFEAR]", notice observable changes\r
306 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
307 * @param v \83Z\83b\83g\82·\82é\92l\r
308 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
309 */\r
310 bool set_monster_monfear(MONSTER_IDX m_idx, int v)\r
311 {\r
312         monster_type *m_ptr = &m_list[m_idx];\r
313         bool notice = FALSE;\r
314 \r
315         /* Hack -- Force good values */\r
316         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
317 \r
318         /* Open */\r
319         if (v)\r
320         {\r
321                 if (!MON_MONFEAR(m_ptr))\r
322                 {\r
323                         mproc_add(m_idx, MTIMED_MONFEAR);\r
324                         notice = TRUE;\r
325                 }\r
326         }\r
327 \r
328         /* Shut */\r
329         else\r
330         {\r
331                 if (MON_MONFEAR(m_ptr))\r
332                 {\r
333                         mproc_remove(m_idx, MTIMED_MONFEAR);\r
334                         notice = TRUE;\r
335                 }\r
336         }\r
337 \r
338         /* Use the value */\r
339         m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)v;\r
340 \r
341         if (!notice) return FALSE;\r
342 \r
343         if (m_ptr->ml)\r
344         {\r
345                 /* Update health bar as needed */\r
346                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
347                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
348         }\r
349 \r
350         return TRUE;\r
351 }\r
352 \r
353 \r
354 /*!\r
355 * @brief \83\82\83\93\83X\83^\81[\82Ì\96³\93G\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
356 * Set "m_ptr->mtimed[MTIMED_INVULNER]", notice observable changes\r
357 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
358 * @param v \83Z\83b\83g\82·\82é\92l\r
359 * @param energy_need TRUE\82È\82ç\82Î\96³\93G\89ð\8f\9c\8e\9e\82É\8ds\93®\83^\81[\83\93\8fÁ\94ï\82ð\8ds\82¤\r
360 * @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
361 */\r
362 bool set_monster_invulner(MONSTER_IDX m_idx, int v, bool energy_need)\r
363 {\r
364         monster_type *m_ptr = &m_list[m_idx];\r
365         bool notice = FALSE;\r
366 \r
367         /* Hack -- Force good values */\r
368         v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
369 \r
370         /* Open */\r
371         if (v)\r
372         {\r
373                 if (!MON_INVULNER(m_ptr))\r
374                 {\r
375                         mproc_add(m_idx, MTIMED_INVULNER);\r
376                         notice = TRUE;\r
377                 }\r
378         }\r
379 \r
380         /* Shut */\r
381         else\r
382         {\r
383                 if (MON_INVULNER(m_ptr))\r
384                 {\r
385                         mproc_remove(m_idx, MTIMED_INVULNER);\r
386                         if (energy_need && !p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();\r
387                         notice = TRUE;\r
388                 }\r
389         }\r
390 \r
391         /* Use the value */\r
392         m_ptr->mtimed[MTIMED_INVULNER] = (s16b)v;\r
393 \r
394         if (!notice) return FALSE;\r
395 \r
396         if (m_ptr->ml)\r
397         {\r
398                 /* Update health bar as needed */\r
399                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
400                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
401         }\r
402 \r
403         return TRUE;\r
404 }\r
405 \r
406 \r
407 static u32b csleep_noise;\r
408 \r
409 /*!\r
410 * @brief \83\82\83\93\83X\83^\81[\82Ì\8ae\8eí\8fó\91Ô\92l\82ð\8e\9e\8aÔ\8co\89ß\82É\82æ\82è\8dX\90V\82·\82é\83T\83u\83\8b\81[\83`\83\93\r
411 * @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
412 * @param mtimed_idx \8dX\90V\82·\82é\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
413 * @return \82È\82µ\r
414 */\r
415 static void process_monsters_mtimed_aux(MONSTER_IDX m_idx, int mtimed_idx)\r
416 {\r
417         monster_type *m_ptr = &m_list[m_idx];\r
418 \r
419         switch (mtimed_idx)\r
420         {\r
421         case MTIMED_CSLEEP:\r
422         {\r
423                 monster_race *r_ptr = &r_info[m_ptr->r_idx];\r
424 \r
425                 /* Assume does not wake up */\r
426                 bool test = FALSE;\r
427 \r
428                 /* Hack -- Require proximity */\r
429                 if (m_ptr->cdis < AAF_LIMIT)\r
430                 {\r
431                         /* Handle "sensing radius" */\r
432                         if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf))\r
433                         {\r
434                                 /* We may wake up */\r
435                                 test = TRUE;\r
436                         }\r
437 \r
438                         /* Handle "sight" and "aggravation" */\r
439                         else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx)))\r
440                         {\r
441                                 /* We may wake up */\r
442                                 test = TRUE;\r
443                         }\r
444                 }\r
445 \r
446                 if (test)\r
447                 {\r
448                         u32b notice = randint0(1024);\r
449 \r
450                         /* Nightmare monsters are more alert */\r
451                         if (ironman_nightmare) notice /= 2;\r
452 \r
453                         /* Hack -- See if monster "notices" player */\r
454                         if ((notice * notice * notice) <= csleep_noise)\r
455                         {\r
456                                 /* Hack -- amount of "waking" */\r
457                                 /* Wake up faster near the player */\r
458                                 int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1;\r
459 \r
460                                 /* Hack -- amount of "waking" is affected by speed of player */\r
461                                 d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;\r
462                                 if (d < 0) d = 1;\r
463 \r
464                                 /* Monster wakes up "a little bit" */\r
465 \r
466                                 /* Still asleep */\r
467                                 if (!set_monster_csleep(m_idx, MON_CSLEEP(m_ptr) - d))\r
468                                 {\r
469                                         /* Notice the "not waking up" */\r
470                                         if (is_original_ap_and_seen(m_ptr))\r
471                                         {\r
472                                                 /* Hack -- Count the ignores */\r
473                                                 if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;\r
474                                         }\r
475                                 }\r
476 \r
477                                 /* Just woke up */\r
478                                 else\r
479                                 {\r
480                                         /* Notice the "waking up" */\r
481                                         if (m_ptr->ml)\r
482                                         {\r
483                                                 char m_name[80];\r
484 \r
485                                                 /* Acquire the monster name */\r
486                                                 monster_desc(m_name, m_ptr, 0);\r
487 \r
488                                                 /* Dump a message */\r
489                                                 msg_format(_("%^s\82ª\96Ú\82ð\8ao\82Ü\82µ\82½\81B", "%^s wakes up."), m_name);\r
490                                         }\r
491 \r
492                                         if (is_original_ap_and_seen(m_ptr))\r
493                                         {\r
494                                                 /* Hack -- Count the wakings */\r
495                                                 if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;\r
496                                         }\r
497                                 }\r
498                         }\r
499                 }\r
500                 break;\r
501         }\r
502 \r
503         case MTIMED_FAST:\r
504                 /* Reduce by one, note if expires */\r
505                 if (set_monster_fast(m_idx, MON_FAST(m_ptr) - 1))\r
506                 {\r
507                         if (is_seen(m_ptr))\r
508                         {\r
509                                 char m_name[80];\r
510 \r
511                                 /* Acquire the monster name */\r
512                                 monster_desc(m_name, m_ptr, 0);\r
513 \r
514                                 /* Dump a message */\r
515                                 msg_format(_("%^s\82Í\82à\82¤\89Á\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer fast."), m_name);\r
516                         }\r
517                 }\r
518                 break;\r
519 \r
520         case MTIMED_SLOW:\r
521                 /* Reduce by one, note if expires */\r
522                 if (set_monster_slow(m_idx, MON_SLOW(m_ptr) - 1))\r
523                 {\r
524                         if (is_seen(m_ptr))\r
525                         {\r
526                                 char m_name[80];\r
527 \r
528                                 /* Acquire the monster name */\r
529                                 monster_desc(m_name, m_ptr, 0);\r
530 \r
531                                 /* Dump a message */\r
532                                 msg_format(_("%^s\82Í\82à\82¤\8c¸\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer slow."), m_name);\r
533                         }\r
534                 }\r
535                 break;\r
536 \r
537         case MTIMED_STUNNED:\r
538         {\r
539                 int rlev = r_info[m_ptr->r_idx].level;\r
540 \r
541                 /* Recover from stun */\r
542                 if (set_monster_stunned(m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (MON_STUNNED(m_ptr) - 1)))\r
543                 {\r
544                         /* Message if visible */\r
545                         if (is_seen(m_ptr))\r
546                         {\r
547                                 char m_name[80];\r
548 \r
549                                 /* Acquire the monster name */\r
550                                 monster_desc(m_name, m_ptr, 0);\r
551 \r
552                                 /* Dump a message */\r
553                                 msg_format(_("%^s\82Í\9eN\9eO\8fó\91Ô\82©\82ç\97§\82¿\92¼\82Á\82½\81B", "%^s is no longer stunned."), m_name);\r
554                         }\r
555                 }\r
556                 break;\r
557         }\r
558 \r
559         case MTIMED_CONFUSED:\r
560                 /* Reduce the confusion */\r
561                 if (set_monster_confused(m_idx, MON_CONFUSED(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))\r
562                 {\r
563                         /* Message if visible */\r
564                         if (is_seen(m_ptr))\r
565                         {\r
566                                 char m_name[80];\r
567 \r
568                                 /* Acquire the monster name */\r
569                                 monster_desc(m_name, m_ptr, 0);\r
570 \r
571                                 /* Dump a message */\r
572                                 msg_format(_("%^s\82Í\8d¬\97\90\82©\82ç\97§\82¿\92¼\82Á\82½\81B", "%^s is no longer confused."), m_name);\r
573                         }\r
574                 }\r
575                 break;\r
576 \r
577         case MTIMED_MONFEAR:\r
578                 /* Reduce the fear */\r
579                 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))\r
580                 {\r
581                         /* Visual note */\r
582                         if (is_seen(m_ptr))\r
583                         {\r
584                                 char m_name[80];\r
585 #ifndef JP\r
586                                 char m_poss[80];\r
587 \r
588                                 /* Acquire the monster possessive */\r
589                                 monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);\r
590 #endif\r
591 \r
592                                 /* Acquire the monster name */\r
593                                 monster_desc(m_name, m_ptr, 0);\r
594 \r
595                                 /* Dump a message */\r
596 #ifdef JP\r
597                                 msg_format("%^s\82Í\97E\8bC\82ð\8eæ\82è\96ß\82µ\82½\81B", m_name);\r
598 #else\r
599                                 msg_format("%^s recovers %s courage.", m_name, m_poss);\r
600 #endif\r
601                         }\r
602                 }\r
603                 break;\r
604 \r
605         case MTIMED_INVULNER:\r
606                 /* Reduce by one, note if expires */\r
607                 if (set_monster_invulner(m_idx, MON_INVULNER(m_ptr) - 1, TRUE))\r
608                 {\r
609                         if (is_seen(m_ptr))\r
610                         {\r
611                                 char m_name[80];\r
612 \r
613                                 /* Acquire the monster name */\r
614                                 monster_desc(m_name, m_ptr, 0);\r
615 \r
616                                 /* Dump a message */\r
617                                 msg_format(_("%^s\82Í\82à\82¤\96³\93G\82Å\82È\82¢\81B", "%^s is no longer invulnerable."), m_name);\r
618                         }\r
619                 }\r
620                 break;\r
621         }\r
622 }\r
623 \r
624 \r
625 /*!\r
626 * @brief \91S\83\82\83\93\83X\83^\81[\82Ì\8ae\8eí\8fó\91Ô\92l\82ð\8e\9e\8aÔ\8co\89ß\82É\82æ\82è\8dX\90V\82·\82é\83\81\83C\83\93\83\8b\81[\83`\83\93\r
627 * @param mtimed_idx \8dX\90V\82·\82é\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
628 * @return \82È\82µ\r
629 * @details\r
630 * Process the counters of monsters (once per 10 game turns)\n\r
631 * These functions are to process monsters' counters same as player's.\r
632 */\r
633 void process_monsters_mtimed(int mtimed_idx)\r
634 {\r
635         int  i;\r
636         s16b *cur_mproc_list = mproc_list[mtimed_idx];\r
637 \r
638         /* Hack -- calculate the "player noise" */\r
639         if (mtimed_idx == MTIMED_CSLEEP) csleep_noise = (1L << (30 - p_ptr->skill_stl));\r
640 \r
641         /* Process the monsters (backwards) */\r
642         for (i = mproc_max[mtimed_idx] - 1; i >= 0; i--)\r
643         {\r
644                 /* Access the monster */\r
645                 process_monsters_mtimed_aux(cur_mproc_list[i], mtimed_idx);\r
646         }\r
647 }\r
648 \r
649 /*!\r
650 * @brief \83\82\83\93\83X\83^\81[\82Ö\82Ì\96\82\97Í\8fÁ\8b\8e\8f\88\97\9d\r
651 * @param m_idx \96\82\97Í\8fÁ\8b\8e\82ð\8eó\82¯\82é\83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
652 * @return \82È\82µ\r
653 */\r
654 void dispel_monster_status(MONSTER_IDX m_idx)\r
655 {\r
656         monster_type *m_ptr = &m_list[m_idx];\r
657         char         m_name[80];\r
658 \r
659         monster_desc(m_name, m_ptr, 0);\r
660         if (set_monster_invulner(m_idx, 0, TRUE))\r
661         {\r
662                 if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\96³\93G\82Å\82Í\82È\82¢\81B", "%^s is no longer invulnerable."), m_name);\r
663         }\r
664         if (set_monster_fast(m_idx, 0))\r
665         {\r
666                 if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\89Á\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer fast."), m_name);\r
667         }\r
668         if (set_monster_slow(m_idx, 0))\r
669         {\r
670                 if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\8c¸\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer slow."), m_name);\r
671         }\r
672 }\r
673 \r
674 /*!\r
675 * @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8aÔ\92â\8e~\8f\88\97\9d\r
676 * @param num \8e\9e\8aÔ\92â\8e~\82ð\8ds\82Á\82½\93G\82ª\8ds\93®\82Å\82«\82é\89ñ\90\94\r
677 * @param who \8e\9e\8aÔ\92â\8e~\8f\88\97\9d\82Ì\8eå\91ÌID\r
678 * @param vs_player TRUE\82È\82ç\82Î\8e\9e\8aÔ\92â\8e~\8aJ\8en\8f\88\97\9d\82ð\8ds\82¤\r
679 * @return \8e\9e\8aÔ\92â\8e~\82ª\8ds\82í\82ê\82Ä\82¢\82é\8fó\91Ô\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
680 */\r
681 bool process_the_world(int num, int who, bool vs_player)\r
682 {\r
683         monster_type *m_ptr = &m_list[hack_m_idx];  /* the world monster */\r
684 \r
685         if (world_monster) return (FALSE);\r
686 \r
687         if (vs_player)\r
688         {\r
689                 char m_name[80];\r
690                 monster_desc(m_name, m_ptr, 0);\r
691 \r
692                 if (who == 1)\r
693                         msg_format(_("\81u\81w\83U\81E\83\8f\81[\83\8b\83h\81x\81I\8e\9e\82Í\8e~\82Ü\82Á\82½\81I\81v", "%s yells 'The World! Time has stopped!'"), m_name);\r
694                 else if (who == 3)\r
695                         msg_format(_("\81u\8e\9e\82æ\81I\81v", "%s yells 'Time!'"), m_name);\r
696                 else msg_print("hek!");\r
697 \r
698                 msg_print(NULL);\r
699         }\r
700 \r
701         /* This monster cast spells */\r
702         world_monster = hack_m_idx;\r
703 \r
704         if (vs_player) do_cmd_redraw();\r
705 \r
706         while (num--)\r
707         {\r
708                 if (!m_ptr->r_idx) break;\r
709                 process_monster(world_monster);\r
710 \r
711                 reset_target(m_ptr);\r
712 \r
713                 /* Notice stuff */\r
714                 if (p_ptr->notice) notice_stuff();\r
715 \r
716                 /* Update stuff */\r
717                 if (p_ptr->update) update_stuff();\r
718 \r
719                 /* Redraw stuff */\r
720                 if (p_ptr->redraw) redraw_stuff();\r
721 \r
722                 /* Redraw stuff */\r
723                 if (p_ptr->window) window_stuff();\r
724 \r
725                 /* Delay */\r
726                 if (vs_player) Term_xtra(TERM_XTRA_DELAY, 500);\r
727         }\r
728 \r
729         /* Redraw map */\r
730         p_ptr->redraw |= (PR_MAP);\r
731 \r
732         /* Update monsters */\r
733         p_ptr->update |= (PU_MONSTERS);\r
734 \r
735         /* Window stuff */\r
736         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
737 \r
738         world_monster = 0;\r
739         if (vs_player || (player_has_los_bold(m_ptr->fy, m_ptr->fx) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)))\r
740         {\r
741                 msg_print(_("\81u\8e\9e\82Í\93®\82«\82¾\82·\81c\81v", "You feel time flowing around you once more."));\r
742                 msg_print(NULL);\r
743         }\r
744 \r
745         handle_stuff();\r
746 \r
747         return (TRUE);\r
748 }\r
749 \r
750 /*!\r
751 * @brief \83\82\83\93\83X\83^\81[\82Ì\8co\8c±\92l\8eæ\93¾\8f\88\97\9d\r
752 * @param m_idx \8co\8c±\92l\82ð\93¾\82é\83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
753 * @param s_idx \8c\82\94j\82³\82ê\82½\83\82\83\93\83X\83^\81[\8eí\91°\82Ì\8eQ\8fÆID\r
754 * @return \82È\82µ\r
755 */\r
756 void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)\r
757 {\r
758         monster_type *m_ptr;\r
759         monster_race *r_ptr;\r
760         monster_race *s_ptr;\r
761         int new_exp;\r
762 \r
763         /* Paranoia */\r
764         if (m_idx <= 0 || s_idx <= 0) return;\r
765 \r
766         m_ptr = &m_list[m_idx];\r
767 \r
768         /* Paranoia -- Skip dead monsters */\r
769         if (!m_ptr->r_idx) return;\r
770 \r
771         r_ptr = &r_info[m_ptr->r_idx];\r
772         s_ptr = &r_info[s_idx];\r
773 \r
774         if (p_ptr->inside_battle) return;\r
775 \r
776         if (!r_ptr->next_exp) return;\r
777 \r
778         new_exp = s_ptr->mexp * s_ptr->level / (r_ptr->level + 2);\r
779         if (m_idx == p_ptr->riding) new_exp = (new_exp + 1) / 2;\r
780         if (!dun_level) new_exp /= 5;\r
781         m_ptr->exp += new_exp;\r
782         if (m_ptr->mflag2 & MFLAG2_CHAMELEON) return;\r
783 \r
784         if (m_ptr->exp >= r_ptr->next_exp)\r
785         {\r
786                 char m_name[80];\r
787                 int old_hp = m_ptr->hp;\r
788                 int old_maxhp = m_ptr->max_maxhp;\r
789                 int old_r_idx = m_ptr->r_idx;\r
790                 byte old_sub_align = m_ptr->sub_align;\r
791 \r
792                 /* Hack -- Reduce the racial counter of previous monster */\r
793                 real_r_ptr(m_ptr)->cur_num--;\r
794 \r
795                 monster_desc(m_name, m_ptr, 0);\r
796                 m_ptr->r_idx = r_ptr->next_r_idx;\r
797 \r
798                 /* Count the monsters on the level */\r
799                 real_r_ptr(m_ptr)->cur_num++;\r
800 \r
801                 m_ptr->ap_r_idx = m_ptr->r_idx;\r
802                 r_ptr = &r_info[m_ptr->r_idx];\r
803 \r
804                 if (r_ptr->flags1 & RF1_FORCE_MAXHP)\r
805                 {\r
806                         m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);\r
807                 }\r
808                 else\r
809                 {\r
810                         m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);\r
811                 }\r
812                 if (ironman_nightmare)\r
813                 {\r
814                         u32b hp = m_ptr->max_maxhp * 2L;\r
815 \r
816                         m_ptr->max_maxhp = (s16b)MIN(30000, hp);\r
817                 }\r
818                 m_ptr->maxhp = m_ptr->max_maxhp;\r
819                 m_ptr->hp = old_hp * m_ptr->maxhp / old_maxhp;\r
820 \r
821                 /* dealt damage is 0 at initial*/\r
822                 m_ptr->dealt_damage = 0;\r
823 \r
824                 /* Extract the monster base speed */\r
825                 m_ptr->mspeed = get_mspeed(r_ptr);\r
826 \r
827                 /* Sub-alignment of a monster */\r
828                 if (!is_pet(m_ptr) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))\r
829                         m_ptr->sub_align = old_sub_align;\r
830                 else\r
831                 {\r
832                         m_ptr->sub_align = SUB_ALIGN_NEUTRAL;\r
833                         if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;\r
834                         if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;\r
835                 }\r
836 \r
837                 m_ptr->exp = 0;\r
838 \r
839                 if (is_pet(m_ptr) || m_ptr->ml)\r
840                 {\r
841                         if (!ignore_unview || player_can_see_bold(m_ptr->fy, m_ptr->fx))\r
842                         {\r
843                                 if (p_ptr->image)\r
844                                 {\r
845                                         monster_race *hallu_race;\r
846 \r
847                                         do\r
848                                         {\r
849                                                 hallu_race = &r_info[randint1(max_r_idx - 1)];\r
850                                         } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));\r
851                                         msg_format(_("%s\82Í%s\82É\90i\89»\82µ\82½\81B", "%^s evolved into %s."), m_name, r_name + hallu_race->name);\r
852                                 }\r
853                                 else\r
854                                 {\r
855                                         msg_format(_("%s\82Í%s\82É\90i\89»\82µ\82½\81B", "%^s evolved into %s."), m_name, r_name + r_ptr->name);\r
856                                 }\r
857                         }\r
858 \r
859                         if (!p_ptr->image) r_info[old_r_idx].r_xtra1 |= MR1_SINKA;\r
860 \r
861                         /* Now you feel very close to this pet. */\r
862                         m_ptr->parent_m_idx = 0;\r
863                 }\r
864                 update_mon(m_idx, FALSE);\r
865                 lite_spot(m_ptr->fy, m_ptr->fx);\r
866         }\r
867         if (m_idx == p_ptr->riding) p_ptr->update |= PU_BONUS;\r
868 }\r