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
10 int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type)
\r
12 s16b *cur_mproc_list = mproc_list[mproc_type];
\r
15 for (i = mproc_max[mproc_type] - 1; i >= 0; i--)
\r
17 if (cur_mproc_list[i] == m_idx) return i;
\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
29 static void mproc_add(MONSTER_IDX m_idx, int mproc_type)
\r
31 if (mproc_max[mproc_type] < max_m_idx) mproc_list[mproc_type][mproc_max[mproc_type]++] = (s16b)m_idx;
\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
41 static void mproc_remove(MONSTER_IDX m_idx, int mproc_type)
\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
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
52 void mproc_init(void)
\r
54 monster_type *m_ptr;
\r
58 /* Reset "mproc_max[]" */
\r
59 for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 0;
\r
61 /* Process the monsters (backwards) */
\r
62 for (i = m_max - 1; i >= 1; i--)
\r
64 /* Access the monster */
\r
67 /* Ignore "dead" monsters */
\r
68 if (!m_ptr->r_idx) continue;
\r
70 for (cmi = 0; cmi < MAX_MTIMED; cmi++)
\r
72 if (m_ptr->mtimed[cmi]) mproc_add(i, cmi);
\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
85 bool set_monster_csleep(MONSTER_IDX m_idx, int v)
\r
87 monster_type *m_ptr = &m_list[m_idx];
\r
88 bool notice = FALSE;
\r
90 /* Hack -- Force good values */
\r
91 v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
\r
96 if (!MON_CSLEEP(m_ptr))
\r
98 mproc_add(m_idx, MTIMED_CSLEEP);
\r
106 if (MON_CSLEEP(m_ptr))
\r
108 mproc_remove(m_idx, MTIMED_CSLEEP);
\r
113 /* Use the value */
\r
114 m_ptr->mtimed[MTIMED_CSLEEP] = (s16b)v;
\r
116 if (!notice) return FALSE;
\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
125 if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
\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
138 bool set_monster_fast(MONSTER_IDX m_idx, int v)
\r
140 monster_type *m_ptr = &m_list[m_idx];
\r
141 bool notice = FALSE;
\r
143 /* Hack -- Force good values */
\r
144 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
149 if (!MON_FAST(m_ptr))
\r
151 mproc_add(m_idx, MTIMED_FAST);
\r
159 if (MON_FAST(m_ptr))
\r
161 mproc_remove(m_idx, MTIMED_FAST);
\r
166 /* Use the value */
\r
167 m_ptr->mtimed[MTIMED_FAST] = (s16b)v;
\r
169 if (!notice) return FALSE;
\r
171 if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
\r
178 * Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes
\r
180 bool set_monster_slow(MONSTER_IDX m_idx, int v)
\r
182 monster_type *m_ptr = &m_list[m_idx];
\r
183 bool notice = FALSE;
\r
185 /* Hack -- Force good values */
\r
186 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
191 if (!MON_SLOW(m_ptr))
\r
193 mproc_add(m_idx, MTIMED_SLOW);
\r
201 if (MON_SLOW(m_ptr))
\r
203 mproc_remove(m_idx, MTIMED_SLOW);
\r
208 /* Use the value */
\r
209 m_ptr->mtimed[MTIMED_SLOW] = (s16b)v;
\r
211 if (!notice) return FALSE;
\r
213 if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
\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
226 bool set_monster_stunned(MONSTER_IDX m_idx, int v)
\r
228 monster_type *m_ptr = &m_list[m_idx];
\r
229 bool notice = FALSE;
\r
231 /* Hack -- Force good values */
\r
232 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
237 if (!MON_STUNNED(m_ptr))
\r
239 mproc_add(m_idx, MTIMED_STUNNED);
\r
247 if (MON_STUNNED(m_ptr))
\r
249 mproc_remove(m_idx, MTIMED_STUNNED);
\r
254 /* Use the value */
\r
255 m_ptr->mtimed[MTIMED_STUNNED] = (s16b)v;
\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
268 bool set_monster_confused(MONSTER_IDX m_idx, int v)
\r
270 monster_type *m_ptr = &m_list[m_idx];
\r
271 bool notice = FALSE;
\r
273 /* Hack -- Force good values */
\r
274 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
279 if (!MON_CONFUSED(m_ptr))
\r
281 mproc_add(m_idx, MTIMED_CONFUSED);
\r
289 if (MON_CONFUSED(m_ptr))
\r
291 mproc_remove(m_idx, MTIMED_CONFUSED);
\r
296 /* Use the value */
\r
297 m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)v;
\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
310 bool set_monster_monfear(MONSTER_IDX m_idx, int v)
\r
312 monster_type *m_ptr = &m_list[m_idx];
\r
313 bool notice = FALSE;
\r
315 /* Hack -- Force good values */
\r
316 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
321 if (!MON_MONFEAR(m_ptr))
\r
323 mproc_add(m_idx, MTIMED_MONFEAR);
\r
331 if (MON_MONFEAR(m_ptr))
\r
333 mproc_remove(m_idx, MTIMED_MONFEAR);
\r
338 /* Use the value */
\r
339 m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)v;
\r
341 if (!notice) return FALSE;
\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
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
362 bool set_monster_invulner(MONSTER_IDX m_idx, int v, bool energy_need)
\r
364 monster_type *m_ptr = &m_list[m_idx];
\r
365 bool notice = FALSE;
\r
367 /* Hack -- Force good values */
\r
368 v = (v > 200) ? 200 : (v < 0) ? 0 : v;
\r
373 if (!MON_INVULNER(m_ptr))
\r
375 mproc_add(m_idx, MTIMED_INVULNER);
\r
383 if (MON_INVULNER(m_ptr))
\r
385 mproc_remove(m_idx, MTIMED_INVULNER);
\r
386 if (energy_need && !p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();
\r
391 /* Use the value */
\r
392 m_ptr->mtimed[MTIMED_INVULNER] = (s16b)v;
\r
394 if (!notice) return FALSE;
\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
407 static u32b csleep_noise;
\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
415 static void process_monsters_mtimed_aux(MONSTER_IDX m_idx, int mtimed_idx)
\r
417 monster_type *m_ptr = &m_list[m_idx];
\r
419 switch (mtimed_idx)
\r
421 case MTIMED_CSLEEP:
\r
423 monster_race *r_ptr = &r_info[m_ptr->r_idx];
\r
425 /* Assume does not wake up */
\r
428 /* Hack -- Require proximity */
\r
429 if (m_ptr->cdis < AAF_LIMIT)
\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
434 /* We may wake up */
\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
441 /* We may wake up */
\r
448 u32b notice = randint0(1024);
\r
450 /* Nightmare monsters are more alert */
\r
451 if (ironman_nightmare) notice /= 2;
\r
453 /* Hack -- See if monster "notices" player */
\r
454 if ((notice * notice * notice) <= csleep_noise)
\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
460 /* Hack -- amount of "waking" is affected by speed of player */
\r
461 d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;
\r
464 /* Monster wakes up "a little bit" */
\r
467 if (!set_monster_csleep(m_idx, MON_CSLEEP(m_ptr) - d))
\r
469 /* Notice the "not waking up" */
\r
470 if (is_original_ap_and_seen(m_ptr))
\r
472 /* Hack -- Count the ignores */
\r
473 if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;
\r
480 /* Notice the "waking up" */
\r
485 /* Acquire the monster name */
\r
486 monster_desc(m_name, m_ptr, 0);
\r
488 /* Dump a message */
\r
489 msg_format(_("%^s
\82ª
\96Ú
\82ð
\8ao
\82Ü
\82µ
\82½
\81B", "%^s wakes up."), m_name);
\r
492 if (is_original_ap_and_seen(m_ptr))
\r
494 /* Hack -- Count the wakings */
\r
495 if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;
\r
504 /* Reduce by one, note if expires */
\r
505 if (set_monster_fast(m_idx, MON_FAST(m_ptr) - 1))
\r
507 if (is_seen(m_ptr))
\r
511 /* Acquire the monster name */
\r
512 monster_desc(m_name, m_ptr, 0);
\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
521 /* Reduce by one, note if expires */
\r
522 if (set_monster_slow(m_idx, MON_SLOW(m_ptr) - 1))
\r
524 if (is_seen(m_ptr))
\r
528 /* Acquire the monster name */
\r
529 monster_desc(m_name, m_ptr, 0);
\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
537 case MTIMED_STUNNED:
\r
539 int rlev = r_info[m_ptr->r_idx].level;
\r
541 /* Recover from stun */
\r
542 if (set_monster_stunned(m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (MON_STUNNED(m_ptr) - 1)))
\r
544 /* Message if visible */
\r
545 if (is_seen(m_ptr))
\r
549 /* Acquire the monster name */
\r
550 monster_desc(m_name, m_ptr, 0);
\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
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
563 /* Message if visible */
\r
564 if (is_seen(m_ptr))
\r
568 /* Acquire the monster name */
\r
569 monster_desc(m_name, m_ptr, 0);
\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
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
582 if (is_seen(m_ptr))
\r
588 /* Acquire the monster possessive */
\r
589 monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
\r
592 /* Acquire the monster name */
\r
593 monster_desc(m_name, m_ptr, 0);
\r
595 /* Dump a message */
\r
597 msg_format("%^s
\82Í
\97E
\8bC
\82ð
\8eæ
\82è
\96ß
\82µ
\82½
\81B", m_name);
\r
599 msg_format("%^s recovers %s courage.", m_name, m_poss);
\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
609 if (is_seen(m_ptr))
\r
613 /* Acquire the monster name */
\r
614 monster_desc(m_name, m_ptr, 0);
\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
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
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
633 void process_monsters_mtimed(int mtimed_idx)
\r
636 s16b *cur_mproc_list = mproc_list[mtimed_idx];
\r
638 /* Hack -- calculate the "player noise" */
\r
639 if (mtimed_idx == MTIMED_CSLEEP) csleep_noise = (1L << (30 - p_ptr->skill_stl));
\r
641 /* Process the monsters (backwards) */
\r
642 for (i = mproc_max[mtimed_idx] - 1; i >= 0; i--)
\r
644 /* Access the monster */
\r
645 process_monsters_mtimed_aux(cur_mproc_list[i], mtimed_idx);
\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
654 void dispel_monster_status(MONSTER_IDX m_idx)
\r
656 monster_type *m_ptr = &m_list[m_idx];
\r
659 monster_desc(m_name, m_ptr, 0);
\r
660 if (set_monster_invulner(m_idx, 0, TRUE))
\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
664 if (set_monster_fast(m_idx, 0))
\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
668 if (set_monster_slow(m_idx, 0))
\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
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
681 bool process_the_world(int num, int who, bool vs_player)
\r
683 monster_type *m_ptr = &m_list[hack_m_idx]; /* the world monster */
\r
685 if (world_monster) return (FALSE);
\r
690 monster_desc(m_name, m_ptr, 0);
\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
695 msg_format(_("
\81u
\8e\9e\82æ
\81I
\81v", "%s yells 'Time!'"), m_name);
\r
696 else msg_print("hek!");
\r
701 /* This monster cast spells */
\r
702 world_monster = hack_m_idx;
\r
704 if (vs_player) do_cmd_redraw();
\r
708 if (!m_ptr->r_idx) break;
\r
709 process_monster(world_monster);
\r
711 reset_target(m_ptr);
\r
714 if (p_ptr->notice) notice_stuff();
\r
717 if (p_ptr->update) update_stuff();
\r
720 if (p_ptr->redraw) redraw_stuff();
\r
723 if (p_ptr->window) window_stuff();
\r
726 if (vs_player) Term_xtra(TERM_XTRA_DELAY, 500);
\r
730 p_ptr->redraw |= (PR_MAP);
\r
732 /* Update monsters */
\r
733 p_ptr->update |= (PU_MONSTERS);
\r
736 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\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
741 msg_print(_("
\81u
\8e\9e\82Í
\93®
\82«
\82¾
\82·
\81c
\81v", "You feel time flowing around you once more."));
\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
756 void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)
\r
758 monster_type *m_ptr;
\r
759 monster_race *r_ptr;
\r
760 monster_race *s_ptr;
\r
764 if (m_idx <= 0 || s_idx <= 0) return;
\r
766 m_ptr = &m_list[m_idx];
\r
768 /* Paranoia -- Skip dead monsters */
\r
769 if (!m_ptr->r_idx) return;
\r
771 r_ptr = &r_info[m_ptr->r_idx];
\r
772 s_ptr = &r_info[s_idx];
\r
774 if (p_ptr->inside_battle) return;
\r
776 if (!r_ptr->next_exp) return;
\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
784 if (m_ptr->exp >= r_ptr->next_exp)
\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
792 /* Hack -- Reduce the racial counter of previous monster */
\r
793 real_r_ptr(m_ptr)->cur_num--;
\r
795 monster_desc(m_name, m_ptr, 0);
\r
796 m_ptr->r_idx = r_ptr->next_r_idx;
\r
798 /* Count the monsters on the level */
\r
799 real_r_ptr(m_ptr)->cur_num++;
\r
801 m_ptr->ap_r_idx = m_ptr->r_idx;
\r
802 r_ptr = &r_info[m_ptr->r_idx];
\r
804 if (r_ptr->flags1 & RF1_FORCE_MAXHP)
\r
806 m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
\r
810 m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
\r
812 if (ironman_nightmare)
\r
814 u32b hp = m_ptr->max_maxhp * 2L;
\r
816 m_ptr->max_maxhp = (s16b)MIN(30000, hp);
\r
818 m_ptr->maxhp = m_ptr->max_maxhp;
\r
819 m_ptr->hp = old_hp * m_ptr->maxhp / old_maxhp;
\r
821 /* dealt damage is 0 at initial*/
\r
822 m_ptr->dealt_damage = 0;
\r
824 /* Extract the monster base speed */
\r
825 m_ptr->mspeed = get_mspeed(r_ptr);
\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
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
839 if (is_pet(m_ptr) || m_ptr->ml)
\r
841 if (!ignore_unview || player_can_see_bold(m_ptr->fy, m_ptr->fx))
\r
845 monster_race *hallu_race;
\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
855 msg_format(_("%s
\82Í%s
\82É
\90i
\89»
\82µ
\82½
\81B", "%^s evolved into %s."), m_name, r_name + r_ptr->name);
\r
859 if (!p_ptr->image) r_info[old_r_idx].r_xtra1 |= MR1_SINKA;
\r
861 /* Now you feel very close to this pet. */
\r
862 m_ptr->parent_m_idx = 0;
\r
864 update_mon(m_idx, FALSE);
\r
865 lite_spot(m_ptr->fy, m_ptr->fx);
\r
867 if (m_idx == p_ptr->riding) p_ptr->update |= PU_BONUS;
\r