OSDN Git Service

ea454411145ef9c55195b446eba9c3aa76a9b77e
[hengband/hengband.git] / src / monster2.c
1 /*!
2  * @file monster2.c
3  * @brief モンスター処理 / misc code for monsters
4  * @date 2014/07/08
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
7  * This software may be copied and distributed for educational, research,
8  * and not for profit purposes provided that this copyright and statement
9  * are included in all such copies.  Other copyrights may also apply.
10  * 2014 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "angband.h"
14
15 #define HORDE_NOGOOD 0x01 /*!< (未実装フラグ)HORDE生成でGOODなモンスターの生成を禁止する? */
16 #define HORDE_NOEVIL 0x02 /*!< (未実装フラグ)HORDE生成でEVILなモンスターの生成を禁止する? */
17
18
19 /*!
20  * @var horror_desc
21  * @brief ELDRITCH HORROR効果時のモンスターの形容メッセージ(通常時)
22  */
23 cptr horror_desc[MAX_SAN_HORROR] =
24 {
25 #ifdef JP
26         "忌まわしい",
27         "底知れぬ",
28         "ぞっとする",
29         "破滅的な",
30         "冒涜的な",
31
32         "いやな",
33         "恐ろしい",
34         "不潔な",
35         "容赦のない",
36         "おぞましい",
37
38         "地獄の",
39         "身の毛もよだつ",
40         "地獄の",
41         "忌まわしい",
42         "悪夢のような",
43
44         "嫌悪を感じる",
45         "罰当たりな",
46         "恐い",
47         "不浄な",
48         "言うもおぞましい",
49 #else
50         "abominable",
51         "abysmal",
52         "appalling",
53         "baleful",
54         "blasphemous",
55
56         "disgusting",
57         "dreadful",
58         "filthy",
59         "grisly",
60         "hideous",
61
62         "hellish",
63         "horrible",
64         "infernal",
65         "loathsome",
66         "nightmarish",
67
68         "repulsive",
69         "sacrilegious",
70         "terrible",
71         "unclean",
72         "unspeakable",
73 #endif
74
75 };
76
77 /*!
78  * @var funny_desc
79  * @brief ELDRITCH HORROR効果時のモンスターの形容メッセージ(幻覚状態時)
80  */
81 cptr funny_desc[MAX_SAN_FUNNY] =
82 {
83 #ifdef JP
84         "間抜けな",
85         "滑稽な",
86         "ばからしい",
87         "無味乾燥な",
88         "馬鹿げた",
89
90         "笑える",
91         "ばかばかしい",
92         "ぶっとんだ",
93         "いかした",
94         "ポストモダンな",
95
96         "ファンタスティックな",
97         "ダダイズム的な",
98         "キュビズム的な",
99         "宇宙的な",
100         "卓越した",
101
102         "理解不能な",
103         "ものすごい",
104         "驚くべき",
105         "信じられない",
106         "カオティックな",
107
108         "野性的な",
109         "非常識な",
110 #else
111         "silly",
112         "hilarious",
113         "absurd",
114         "insipid",
115         "ridiculous",
116
117         "laughable",
118         "ludicrous",
119         "far-out",
120         "groovy",
121         "postmodern",
122
123         "fantastic",
124         "dadaistic",
125         "cubistic",
126         "cosmic",
127         "awesome",
128
129         "incomprehensible",
130         "fabulous",
131         "amazing",
132         "incredible",
133         "chaotic",
134
135         "wild",
136         "preposterous",
137 #endif
138
139 };
140
141 /*!
142  * @var funny_comments
143  * @brief ELDRITCH HORROR効果時の幻覚時間延長を示す錯乱表現
144  */
145 cptr funny_comments[MAX_SAN_COMMENT] =
146 {
147 #ifdef JP
148   /* nuke me */
149         "最高だぜ!",
150         "うひょー!",
151         "いかすぜ!",
152         "すんばらしい!",
153         "ぶっとびー!"
154 #else
155         "Wow, cosmic, man!",
156         "Rad!",
157         "Groovy!",
158         "Cool!",
159         "Far out!"
160 #endif
161
162 };
163
164
165 /*!
166  * @brief モンスターの目標地点をセットする / Set the target of counter attack
167  * @param m_ptr モンスターの参照ポインタ
168  * @param y 目標y座標
169  * @param x 目標x座標
170  * @return なし
171  */
172 void set_target(monster_type *m_ptr, int y, int x)
173 {
174         m_ptr->target_y = y;
175         m_ptr->target_x = x;
176 }
177
178
179 /*!
180  * @brief モンスターの目標地点をリセットする / Reset the target of counter attack
181  * @param m_ptr モンスターの参照ポインタ
182  * @return なし
183  */
184 void reset_target(monster_type *m_ptr)
185 {
186         set_target(m_ptr, 0, 0);
187 }
188
189
190 /*!
191  * @brief モンスターの真の種族を返す / Extract monster race pointer of a monster's true form
192  * @param m_ptr モンスターの参照ポインタ
193  * @return 本当のモンスター種族参照ポインタ
194  */
195 monster_race *real_r_ptr(monster_type *m_ptr)
196 {
197         monster_race *r_ptr = &r_info[m_ptr->r_idx];
198
199         /* Extract real race */
200         if (m_ptr->mflag2 & MFLAG2_CHAMELEON)
201         {
202                 if (r_ptr->flags1 & RF1_UNIQUE)
203                         return &r_info[MON_CHAMELEON_K];
204                 else
205                         return &r_info[MON_CHAMELEON];
206         }
207         else
208         {
209                 return r_ptr;
210         }
211 }
212
213
214 /*!
215  * @brief モンスター配列からモンスターを消去する / Delete a monster by index.
216  * @param i 消去するモンスターのID
217  * @return なし
218  * @details
219  * モンスターを削除するとそのモンスターが拾っていたアイテムも同時に削除される。 /
220  * When a monster is deleted, all of its objects are deleted.
221  */
222 void delete_monster_idx(int i)
223 {
224         int x, y;
225
226         monster_type *m_ptr = &m_list[i];
227
228         monster_race *r_ptr = &r_info[m_ptr->r_idx];
229
230         s16b this_o_idx, next_o_idx = 0;
231
232
233         /* Get location */
234         y = m_ptr->fy;
235         x = m_ptr->fx;
236
237
238         /* Hack -- Reduce the racial counter */
239         real_r_ptr(m_ptr)->cur_num--;
240
241         /* Hack -- count the number of "reproducers" */
242         if (r_ptr->flags2 & (RF2_MULTIPLY)) num_repro--;
243
244         if (MON_CSLEEP(m_ptr)) (void)set_monster_csleep(i, 0);
245         if (MON_FAST(m_ptr)) (void)set_monster_fast(i, 0);
246         if (MON_SLOW(m_ptr)) (void)set_monster_slow(i, 0);
247         if (MON_STUNNED(m_ptr)) (void)set_monster_stunned(i, 0);
248         if (MON_CONFUSED(m_ptr)) (void)set_monster_confused(i, 0);
249         if (MON_MONFEAR(m_ptr)) (void)set_monster_monfear(i, 0);
250         if (MON_INVULNER(m_ptr)) (void)set_monster_invulner(i, 0, FALSE);
251
252
253         /* Hack -- remove target monster */
254         if (i == target_who) target_who = 0;
255
256         /* Hack -- remove tracked monster */
257         if (i == p_ptr->health_who) health_track(0);
258
259         if (pet_t_m_idx == i ) pet_t_m_idx = 0;
260         if (riding_t_m_idx == i) riding_t_m_idx = 0;
261         if (p_ptr->riding == i) p_ptr->riding = 0;
262
263         /* Monster is gone */
264         cave[y][x].m_idx = 0;
265
266
267         /* Delete objects */
268         for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
269         {
270                 object_type *o_ptr;
271
272                 /* Acquire object */
273                 o_ptr = &o_list[this_o_idx];
274
275                 /* Acquire next object */
276                 next_o_idx = o_ptr->next_o_idx;
277
278                 /*
279                  * o_ptr->held_m_idx is needed in delete_object_idx()
280                  * to prevent calling lite_spot()
281                  */
282
283                 /* Delete the object */
284                 delete_object_idx(this_o_idx);
285         }
286
287
288         if (is_pet(m_ptr)) check_pets_num_and_align(m_ptr, FALSE);
289
290
291         /* Wipe the Monster */
292         (void)WIPE(m_ptr, monster_type);
293
294         /* Count monsters */
295         m_cnt--;
296
297         /* Visual update */
298         lite_spot(y, x);
299
300         /* Update some things */
301         if (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
302                 p_ptr->update |= (PU_MON_LITE);
303 }
304
305
306 /*!
307  * @brief 指定位置に存在するモンスターを削除する / Delete the monster, if any, at a given location
308  * @param x 削除位置x座標
309  * @param y 削除位置y座標
310  * @return なし
311  */
312 void delete_monster(int y, int x)
313 {
314         cave_type *c_ptr;
315
316         /* Paranoia */
317         if (!in_bounds(y, x)) return;
318
319         /* Check the grid */
320         c_ptr = &cave[y][x];
321
322         /* Delete the monster (if any) */
323         if (c_ptr->m_idx) delete_monster_idx(c_ptr->m_idx);
324 }
325
326
327 /*!
328  * @brief モンスター情報を配列内移動する / Move an object from index i1 to index i2 in the object list
329  * @param i1 配列移動元添字
330  * @param i2 配列移動先添字
331  * @return なし
332  */
333 static void compact_monsters_aux(int i1, int i2)
334 {
335         int y, x, i;
336
337         cave_type *c_ptr;
338
339         monster_type *m_ptr;
340
341         s16b this_o_idx, next_o_idx = 0;
342
343
344         /* Do nothing */
345         if (i1 == i2) return;
346
347
348         /* Old monster */
349         m_ptr = &m_list[i1];
350
351         /* Location */
352         y = m_ptr->fy;
353         x = m_ptr->fx;
354
355         /* Cave grid */
356         c_ptr = &cave[y][x];
357
358         /* Update the cave */
359         c_ptr->m_idx = i2;
360
361         /* Repair objects being carried by monster */
362         for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
363         {
364                 object_type *o_ptr;
365
366                 /* Acquire object */
367                 o_ptr = &o_list[this_o_idx];
368
369                 /* Acquire next object */
370                 next_o_idx = o_ptr->next_o_idx;
371
372                 /* Reset monster pointer */
373                 o_ptr->held_m_idx = i2;
374         }
375
376         /* Hack -- Update the target */
377         if (target_who == i1) target_who = i2;
378
379         /* Hack -- Update the target */
380         if (pet_t_m_idx == i1) pet_t_m_idx = i2;
381         if (riding_t_m_idx == i1) riding_t_m_idx = i2;
382
383         /* Hack -- Update the riding */
384         if (p_ptr->riding == i1) p_ptr->riding = i2;
385
386         /* Hack -- Update the health bar */
387         if (p_ptr->health_who == i1) health_track(i2);
388
389         /* Hack -- Update parent index */
390         if (is_pet(m_ptr))
391         {
392                 for (i = 1; i < m_max; i++)
393                 {
394                         monster_type *m2_ptr = &m_list[i];
395
396                         if (m2_ptr->parent_m_idx == i1)
397                                 m2_ptr->parent_m_idx = i2;
398                 }
399         }
400
401         /* Structure copy */
402         (void)COPY(&m_list[i2], &m_list[i1], monster_type);
403
404         /* Wipe the hole */
405         (void)WIPE(&m_list[i1], monster_type);
406
407         for (i = 0; i < MAX_MTIMED; i++)
408         {
409                 int mproc_idx = get_mproc_idx(i1, i);
410                 if (mproc_idx >= 0) mproc_list[i][mproc_idx] = i2;
411         }
412 }
413
414
415 /*!
416  * @brief モンスター情報配列を圧縮する / Compact and Reorder the monster list
417  * @param size 圧縮後のモンスター件数目標
418  * @return なし
419  * @details
420  * This function can be very dangerous, use with caution!
421  *
422  * When actually "compacting" monsters, we base the saving throw
423  * on a combination of monster level, distance from player, and
424  * current "desperation".
425  *
426  * After "compacting" (if needed), we "reorder" the monsters into a more
427  * compact order, and we reset the allocation info, and the "live" array.
428  */
429 void compact_monsters(int size)
430 {
431         int             i, num, cnt;
432         int             cur_lev, cur_dis, chance;
433
434         /* Message (only if compacting) */
435         if (size) msg_print(_("モンスター情報を圧縮しています...", "Compacting monsters..."));
436
437
438         /* Compact at least 'size' objects */
439         for (num = 0, cnt = 1; num < size; cnt++)
440         {
441                 /* Get more vicious each iteration */
442                 cur_lev = 5 * cnt;
443
444                 /* Get closer each iteration */
445                 cur_dis = 5 * (20 - cnt);
446
447                 /* Check all the monsters */
448                 for (i = 1; i < m_max; i++)
449                 {
450                         monster_type *m_ptr = &m_list[i];
451
452                         monster_race *r_ptr = &r_info[m_ptr->r_idx];
453
454                         /* Paranoia -- skip "dead" monsters */
455                         if (!m_ptr->r_idx) continue;
456
457                         /* Hack -- High level monsters start out "immune" */
458                         if (r_ptr->level > cur_lev) continue;
459
460                         if (i == p_ptr->riding) continue;
461
462                         /* Ignore nearby monsters */
463                         if ((cur_dis > 0) && (m_ptr->cdis < cur_dis)) continue;
464
465                         /* Saving throw chance */
466                         chance = 90;
467
468                         /* Only compact "Quest" Monsters in emergencies */
469                         if ((r_ptr->flags1 & (RF1_QUESTOR)) && (cnt < 1000)) chance = 100;
470
471                         /* Try not to compact Unique Monsters */
472                         if (r_ptr->flags1 & (RF1_UNIQUE)) chance = 100;
473
474                         /* All monsters get a saving throw */
475                         if (randint0(100) < chance) continue;
476
477                         if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
478                         {
479                                 char m_name[80];
480
481                                 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
482                                 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_COMPACT, m_name);
483                         }
484
485                         /* Delete the monster */
486                         delete_monster_idx(i);
487
488                         /* Count the monster */
489                         num++;
490                 }
491         }
492
493
494         /* Excise dead monsters (backwards!) */
495         for (i = m_max - 1; i >= 1; i--)
496         {
497                 /* Get the i'th monster */
498                 monster_type *m_ptr = &m_list[i];
499
500                 /* Skip real monsters */
501                 if (m_ptr->r_idx) continue;
502
503                 /* Move last monster into open hole */
504                 compact_monsters_aux(m_max - 1, i);
505
506                 /* Compress "m_max" */
507                 m_max--;
508         }
509 }
510
511
512 /*!
513  * @brief プレイヤーのフロア離脱に伴う全モンスター配列の消去 / Delete/Remove all the monsters when the player leaves the level
514  * @return なし
515  * @details
516  * This is an efficient method of simulating multiple calls to the
517  * "delete_monster()" function, with no visual effects.
518  */
519 void wipe_m_list(void)
520 {
521         int i;
522
523         /* Hack -- if Banor or Lupart dies, stay another dead */
524         if (!r_info[MON_BANORLUPART].max_num)
525         {
526                 if (r_info[MON_BANOR].max_num)
527                 {
528                         r_info[MON_BANOR].max_num = 0;
529                         r_info[MON_BANOR].r_pkills++;
530                         r_info[MON_BANOR].r_akills++;
531                         if (r_info[MON_BANOR].r_tkills < MAX_SHORT) r_info[MON_BANOR].r_tkills++;
532                 }
533                 if (r_info[MON_LUPART].max_num)
534                 {
535                         r_info[MON_LUPART].max_num = 0;
536                         r_info[MON_LUPART].r_pkills++;
537                         r_info[MON_LUPART].r_akills++;
538                         if (r_info[MON_LUPART].r_tkills < MAX_SHORT) r_info[MON_LUPART].r_tkills++;
539                 }
540         }
541
542         /* Delete all the monsters */
543         for (i = m_max - 1; i >= 1; i--)
544         {
545                 monster_type *m_ptr = &m_list[i];
546
547                 /* Skip dead monsters */
548                 if (!m_ptr->r_idx) continue;
549
550                 /* Monster is gone */
551                 cave[m_ptr->fy][m_ptr->fx].m_idx = 0;
552
553                 /* Wipe the Monster */
554                 (void)WIPE(m_ptr, monster_type);
555
556         }
557
558         /*
559          * Wiping racial counters of all monsters and incrementing of racial
560          * counters of monsters in party_mon[] are required to prevent multiple
561          * generation of unique monster who is the minion of player.
562          */
563
564         /* Hack -- Wipe the racial counter of all monster races */
565         for (i = 1; i < max_r_idx; i++) r_info[i].cur_num = 0;
566
567         /* Reset "m_max" */
568         m_max = 1;
569
570         /* Reset "m_cnt" */
571         m_cnt = 0;
572
573         /* Reset "mproc_max[]" */
574         for (i = 0; i < MAX_MTIMED; i++) mproc_max[i] = 0;
575
576         /* Hack -- reset "reproducer" count */
577         num_repro = 0;
578
579         /* Hack -- no more target */
580         target_who = 0;
581         pet_t_m_idx = 0;
582         riding_t_m_idx = 0;
583
584         /* Hack -- no more tracking */
585         health_track(0);
586 }
587
588
589 /*!
590  * @brief モンスター配列の空きを探す / Acquires and returns the index of a "free" monster.
591  * @return 利用可能なモンスター配列の添字
592  * @details
593  * This routine should almost never fail, but it *can* happen.
594  */
595 s16b m_pop(void)
596 {
597         int i;
598
599
600         /* Normal allocation */
601         if (m_max < max_m_idx)
602         {
603                 /* Access the next hole */
604                 i = m_max;
605
606                 /* Expand the array */
607                 m_max++;
608
609                 /* Count monsters */
610                 m_cnt++;
611
612                 /* Return the index */
613                 return (i);
614         }
615
616
617         /* Recycle dead monsters */
618         for (i = 1; i < m_max; i++)
619         {
620                 monster_type *m_ptr;
621
622                 /* Acquire monster */
623                 m_ptr = &m_list[i];
624
625                 /* Skip live monsters */
626                 if (m_ptr->r_idx) continue;
627
628                 /* Count monsters */
629                 m_cnt++;
630
631                 /* Use this monster */
632                 return (i);
633         }
634
635
636         /* Warn the player (except during dungeon creation) */
637         if (character_dungeon) msg_print(_("モンスターが多すぎる!", "Too many monsters!"));
638
639         /* Try not to crash */
640         return (0);
641 }
642
643
644
645
646 /*!
647  * @var summon_specific_type
648  * @brief 召喚条件を指定するグローバル変数 / Hack -- the "type" of the current "summon specific"
649  * @todo summon_specific_typeグローバル変数の除去と関数引数への代替を行う
650  */
651 static int summon_specific_type = 0;
652
653
654 /*!
655  * @var summon_specific_who
656  * @brief 召喚を行ったプレイヤーあるいはモンスターのIDを示すグローバル変数 / Hack -- the index of the summoning monster
657  * @todo summon_specific_who グローバル変数の除去と関数引数への代替を行う
658  */
659 static int summon_specific_who = -1;
660
661 /*!
662  * @var summon_unique_okay
663  * @brief 召喚対象にユニークを含めるかを示すグローバル変数 / summoning unique enable
664  * @todo summon_unique_okay グローバル変数の除去と関数引数への代替を行う
665  */
666 static bool summon_unique_okay = FALSE;
667
668 /*!
669  * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
670  * @return 召喚条件が一致するならtrue
671  * @details
672  */
673 static bool summon_specific_aux(int r_idx)
674 {
675         monster_race *r_ptr = &r_info[r_idx];
676         int okay = FALSE;
677
678         /* Check our requirements */
679         switch (summon_specific_type)
680         {
681                 case SUMMON_ANT:
682                 {
683                         okay = (r_ptr->d_char == 'a');
684                         break;
685                 }
686
687                 case SUMMON_SPIDER:
688                 {
689                         okay = (r_ptr->d_char == 'S');
690                         break;
691                 }
692
693                 case SUMMON_HOUND:
694                 {
695                         okay = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
696                         break;
697                 }
698
699                 case SUMMON_HYDRA:
700                 {
701                         okay = (r_ptr->d_char == 'M');
702                         break;
703                 }
704
705                 case SUMMON_ANGEL:
706                 {
707                         okay = (r_ptr->d_char == 'A' && ((r_ptr->flags3 & RF3_EVIL) || (r_ptr->flags3 & RF3_GOOD)));
708                         break;
709                 }
710
711                 case SUMMON_DEMON:
712                 {
713                         okay = (r_ptr->flags3 & RF3_DEMON);
714                         break;
715                 }
716
717                 case SUMMON_UNDEAD:
718                 {
719                         okay = (r_ptr->flags3 & RF3_UNDEAD);
720                         break;
721                 }
722
723                 case SUMMON_DRAGON:
724                 {
725                         okay = (r_ptr->flags3 & RF3_DRAGON);
726                         break;
727                 }
728
729                 case SUMMON_HI_UNDEAD:
730                 {
731                         okay = ((r_ptr->d_char == 'L') ||
732                                 (r_ptr->d_char == 'V') ||
733                                 (r_ptr->d_char == 'W'));
734                         break;
735                 }
736
737                 case SUMMON_HI_DRAGON:
738                 {
739                         okay = (r_ptr->d_char == 'D');
740                         break;
741                 }
742
743                 case SUMMON_HI_DEMON:
744                 {
745                         okay = (((r_ptr->d_char == 'U') ||
746                                  (r_ptr->d_char == 'H') ||
747                                  (r_ptr->d_char == 'B')) &&
748                                 (r_ptr->flags3 & RF3_DEMON)) ? TRUE : FALSE;
749                         break;
750                 }
751
752                 case SUMMON_AMBERITES:
753                 {
754                         okay = (r_ptr->flags3 & (RF3_AMBERITE)) ? TRUE : FALSE;
755                         break;
756                 }
757
758                 case SUMMON_UNIQUE:
759                 {
760                         okay = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
761                         break;
762                 }
763
764                 case SUMMON_MOLD:
765                 {
766                         okay = (r_ptr->d_char == 'm');
767                         break;
768                 }
769                 case SUMMON_BAT:
770                 {
771                         okay = (r_ptr->d_char == 'b');
772                         break;
773                 }
774                 case SUMMON_QUYLTHULG:
775                 {
776                         okay = (r_ptr->d_char == 'Q');
777                         break;
778                 }
779
780                 case SUMMON_COIN_MIMIC:
781                 {
782                         okay = (r_ptr->d_char == '$');
783                         break;
784                 }
785
786                 case SUMMON_MIMIC:
787                 {
788                         okay = ((r_ptr->d_char == '!') ||
789                                  (r_ptr->d_char == '?') ||
790                                  (r_ptr->d_char == '=') ||
791                                  (r_ptr->d_char == '$') ||
792                                  (r_ptr->d_char == '|'));
793                         break;
794                 }
795
796                 case SUMMON_GOLEM:
797                 {
798                         okay = (r_ptr->d_char == 'g');
799                         break;
800                 }
801
802                 case SUMMON_CYBER:
803                 {
804                         okay = ((r_ptr->d_char == 'U') &&
805                                 (r_ptr->flags4 & RF4_ROCKET));
806                         break;
807                 }
808
809
810                 case SUMMON_KIN:
811                 {
812                         okay = ((r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE));
813                         break;
814                 }
815
816                 case SUMMON_DAWN:
817                 {
818                         okay = (r_idx == MON_DAWN);
819                         break;
820                 }
821
822                 case SUMMON_ANIMAL:
823                 {
824                         okay = (r_ptr->flags3 & (RF3_ANIMAL));
825                         break;
826                 }
827
828                 case SUMMON_ANIMAL_RANGER:
829                 {
830                         okay = ((r_ptr->flags3 & (RF3_ANIMAL)) &&
831                                (my_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) &&
832                                !(r_ptr->flags3 & (RF3_DRAGON)) &&
833                                !(r_ptr->flags3 & (RF3_EVIL)) &&
834                                !(r_ptr->flags3 & (RF3_UNDEAD)) &&
835                                !(r_ptr->flags3 & (RF3_DEMON)) &&
836                                !(r_ptr->flags2 & (RF2_MULTIPLY)) &&
837                                !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
838                         break;
839                 }
840
841                 case SUMMON_HI_DRAGON_LIVING:
842                 {
843                         okay = ((r_ptr->d_char == 'D') && monster_living(r_ptr));
844                         break;
845                 }
846
847                 case SUMMON_LIVING:
848                 {
849                         okay = monster_living(r_ptr);
850                         break;
851                 }
852
853                 case SUMMON_PHANTOM:
854                 {
855                         okay = (r_idx == MON_PHANTOM_B || r_idx == MON_PHANTOM_W);
856                         break;
857                 }
858
859                 case SUMMON_BLUE_HORROR:
860                 {
861                         okay = (r_idx == MON_BLUE_HORROR);
862                         break;
863                 }
864
865                 case SUMMON_ELEMENTAL:
866                 {
867                         okay = (r_ptr->d_char == 'E');
868                         break;
869                 }
870
871                 case SUMMON_VORTEX:
872                 {
873                         okay = (r_ptr->d_char == 'v');
874                         break;
875                 }
876
877                 case SUMMON_HYBRID:
878                 {
879                         okay = (r_ptr->d_char == 'H');
880                         break;
881                 }
882
883                 case SUMMON_BIRD:
884                 {
885                         okay = (r_ptr->d_char == 'B');
886                         break;
887                 }
888
889                 case SUMMON_KAMIKAZE:
890                 {
891                         int i;
892                         for (i = 0; i < 4; i++)
893                                 if (r_ptr->blow[i].method == RBM_EXPLODE) okay = TRUE;
894                         break;
895                 }
896
897                 case SUMMON_KAMIKAZE_LIVING:
898                 {
899                         int i;
900
901                         for (i = 0; i < 4; i++)
902                                 if (r_ptr->blow[i].method == RBM_EXPLODE) okay = TRUE;
903                         okay = (okay && monster_living(r_ptr));
904                         break;
905                 }
906
907                 case SUMMON_MANES:
908                 {
909                         okay = (r_idx == MON_MANES);
910                         break;
911                 }
912
913                 case SUMMON_LOUSE:
914                 {
915                         okay = (r_idx == MON_LOUSE);
916                         break;
917                 }
918
919                 case SUMMON_GUARDIANS:
920                 {
921                         okay = (r_ptr->flags7 & RF7_GUARDIAN);
922                         break;
923                 }
924
925                 case SUMMON_KNIGHTS:
926                 {
927                         okay = ((r_idx == MON_NOV_PALADIN) ||
928                                 (r_idx == MON_NOV_PALADIN_G) ||
929                                 (r_idx == MON_PALADIN) ||
930                                 (r_idx == MON_W_KNIGHT) ||
931                                 (r_idx == MON_ULTRA_PALADIN) ||
932                                 (r_idx == MON_KNI_TEMPLAR));
933                         break;
934                 }
935
936                 case SUMMON_EAGLES:
937                 {
938                         okay = (r_ptr->d_char == 'B' &&
939                                 (r_ptr->flags8 & RF8_WILD_MOUNTAIN) &&
940                                 (r_ptr->flags8 & RF8_WILD_ONLY));
941                         break;
942                 }
943
944                 case SUMMON_PIRANHAS:
945                 {
946                         okay = (r_idx == MON_PIRANHA);
947                         break;
948                 }
949
950                 case SUMMON_ARMAGE_GOOD:
951                 {
952                         okay = (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_GOOD));
953                         break;
954                 }
955
956                 case SUMMON_ARMAGE_EVIL:
957                 {
958                         okay = ((r_ptr->flags3 & RF3_DEMON) ||
959                                 (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_EVIL)));
960                         break;
961                 }
962         }
963
964         /* Result */
965         /* Since okay is int, "return (okay);" is not correct. */
966         return (bool)(okay ? TRUE : FALSE);
967 }
968
969 /*!
970  * @var chameleon_change_m_idx
971  * @brief カメレオンの変身先モンスターIDを受け渡すためのグローバル変数
972  * @todo 変数渡しの問題などもあるができればchameleon_change_m_idxのグローバル変数を除去し、関数引き渡しに移行すること
973  */
974 static int chameleon_change_m_idx = 0;
975
976
977 /*!
978  * @brief 指定されたモンスター種族がダンジョンの制限にかかるかどうかをチェックする / Some dungeon types restrict the possible monsters.
979  * @param r_idx チェックするモンスター種族ID
980  * @return 召喚条件が一致するならtrue / Return TRUE is the monster is OK and FALSE otherwise
981  */
982 static bool restrict_monster_to_dungeon(int r_idx)
983 {
984         dungeon_info_type *d_ptr = &d_info[dungeon_type];
985         monster_race *r_ptr = &r_info[r_idx];
986         byte a;
987
988         if (d_ptr->flags1 & DF1_CHAMELEON)
989         {
990                 if (chameleon_change_m_idx) return TRUE;
991         }
992         if (d_ptr->flags1 & DF1_NO_MAGIC)
993         {
994                 if (r_idx != MON_CHAMELEON &&
995                     r_ptr->freq_spell && 
996                     !(r_ptr->flags4 & RF4_NOMAGIC_MASK) &&
997                     !(r_ptr->a_ability_flags1 & RF5_NOMAGIC_MASK) &&
998                     !(r_ptr->a_ability_flags2 & RF6_NOMAGIC_MASK))
999                         return FALSE;
1000         }
1001         if (d_ptr->flags1 & DF1_NO_MELEE)
1002         {
1003                 if (r_idx == MON_CHAMELEON) return TRUE;
1004                 if (!(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK)) &&
1005                     !(r_ptr->a_ability_flags1 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_CAUSE_1 | RF5_CAUSE_2 | RF5_CAUSE_3 | RF5_CAUSE_4 | RF5_MIND_BLAST | RF5_BRAIN_SMASH)) &&
1006                     !(r_ptr->a_ability_flags2 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK)))
1007                         return FALSE;
1008         }
1009         if (d_ptr->flags1 & DF1_BEGINNER)
1010         {
1011                 if (r_ptr->level > dun_level)
1012                         return FALSE;
1013         }
1014
1015         if (d_ptr->special_div >= 64) return TRUE;
1016         if (summon_specific_type && !(d_ptr->flags1 & DF1_CHAMELEON)) return TRUE;
1017
1018         switch (d_ptr->mode)
1019         {
1020         case DUNGEON_MODE_AND:
1021                 if (d_ptr->mflags1)
1022                 {
1023                         if ((d_ptr->mflags1 & r_ptr->flags1) != d_ptr->mflags1)
1024                                 return FALSE;
1025                 }
1026                 if (d_ptr->mflags2)
1027                 {
1028                         if ((d_ptr->mflags2 & r_ptr->flags2) != d_ptr->mflags2)
1029                                 return FALSE;
1030                 }
1031                 if (d_ptr->mflags3)
1032                 {
1033                         if ((d_ptr->mflags3 & r_ptr->flags3) != d_ptr->mflags3)
1034                                 return FALSE;
1035                 }
1036                 if (d_ptr->mflags4)
1037                 {
1038                         if ((d_ptr->mflags4 & r_ptr->flags4) != d_ptr->mflags4)
1039                                 return FALSE;
1040                 }
1041                 if (d_ptr->m_a_ability_flags1)
1042                 {
1043                         if ((d_ptr->m_a_ability_flags1 & r_ptr->a_ability_flags1) != d_ptr->m_a_ability_flags1)
1044                                 return FALSE;
1045                 }
1046                 if (d_ptr->m_a_ability_flags2)
1047                 {
1048                         if ((d_ptr->m_a_ability_flags2 & r_ptr->a_ability_flags2) != d_ptr->m_a_ability_flags2)
1049                                 return FALSE;
1050                 }
1051                 if (d_ptr->mflags7)
1052                 {
1053                         if ((d_ptr->mflags7 & r_ptr->flags7) != d_ptr->mflags7)
1054                                 return FALSE;
1055                 }
1056                 if (d_ptr->mflags8)
1057                 {
1058                         if ((d_ptr->mflags8 & r_ptr->flags8) != d_ptr->mflags8)
1059                                 return FALSE;
1060                 }
1061                 if (d_ptr->mflags9)
1062                 {
1063                         if ((d_ptr->mflags9 & r_ptr->flags9) != d_ptr->mflags9)
1064                                 return FALSE;
1065                 }
1066                 if (d_ptr->mflagsr)
1067                 {
1068                         if ((d_ptr->mflagsr & r_ptr->flagsr) != d_ptr->mflagsr)
1069                                 return FALSE;
1070                 }
1071                 for (a = 0; a < 5; a++)
1072                         if (d_ptr->r_char[a] && (d_ptr->r_char[a] != r_ptr->d_char)) return FALSE;
1073
1074                 return TRUE;
1075
1076         case DUNGEON_MODE_NAND:
1077                 if (d_ptr->mflags1)
1078                 {
1079                         if ((d_ptr->mflags1 & r_ptr->flags1) != d_ptr->mflags1)
1080                                 return TRUE;
1081                 }
1082                 if (d_ptr->mflags2)
1083                 {
1084                         if ((d_ptr->mflags2 & r_ptr->flags2) != d_ptr->mflags2)
1085                                 return TRUE;
1086                 }
1087                 if (d_ptr->mflags3)
1088                 {
1089                         if ((d_ptr->mflags3 & r_ptr->flags3) != d_ptr->mflags3)
1090                                 return TRUE;
1091                 }
1092                 if (d_ptr->mflags4)
1093                 {
1094                         if ((d_ptr->mflags4 & r_ptr->flags4) != d_ptr->mflags4)
1095                                 return TRUE;
1096                 }
1097                 if (d_ptr->m_a_ability_flags1)
1098                 {
1099                         if ((d_ptr->m_a_ability_flags1 & r_ptr->a_ability_flags1) != d_ptr->m_a_ability_flags1)
1100                                 return TRUE;
1101                 }
1102                 if (d_ptr->m_a_ability_flags2)
1103                 {
1104                         if ((d_ptr->m_a_ability_flags2 & r_ptr->a_ability_flags2) != d_ptr->m_a_ability_flags2)
1105                                 return TRUE;
1106                 }
1107                 if (d_ptr->mflags7)
1108                 {
1109                         if ((d_ptr->mflags7 & r_ptr->flags7) != d_ptr->mflags7)
1110                                 return TRUE;
1111                 }
1112                 if (d_ptr->mflags8)
1113                 {
1114                         if ((d_ptr->mflags8 & r_ptr->flags8) != d_ptr->mflags8)
1115                                 return TRUE;
1116                 }
1117                 if (d_ptr->mflags9)
1118                 {
1119                         if ((d_ptr->mflags9 & r_ptr->flags9) != d_ptr->mflags9)
1120                                 return TRUE;
1121                 }
1122                 if (d_ptr->mflagsr)
1123                 {
1124                         if ((d_ptr->mflagsr & r_ptr->flagsr) != d_ptr->mflagsr)
1125                                 return TRUE;
1126                 }
1127                 for (a = 0; a < 5; a++)
1128                         if (d_ptr->r_char[a] && (d_ptr->r_char[a] != r_ptr->d_char)) return TRUE;
1129
1130                 return FALSE;
1131
1132         case DUNGEON_MODE_OR:
1133                 if (r_ptr->flags1 & d_ptr->mflags1) return TRUE;
1134                 if (r_ptr->flags2 & d_ptr->mflags2) return TRUE;
1135                 if (r_ptr->flags3 & d_ptr->mflags3) return TRUE;
1136                 if (r_ptr->flags4 & d_ptr->mflags4) return TRUE;
1137                 if (r_ptr->a_ability_flags1 & d_ptr->m_a_ability_flags1) return TRUE;
1138                 if (r_ptr->a_ability_flags2 & d_ptr->m_a_ability_flags2) return TRUE;
1139                 if (r_ptr->flags7 & d_ptr->mflags7) return TRUE;
1140                 if (r_ptr->flags8 & d_ptr->mflags8) return TRUE;
1141                 if (r_ptr->flags9 & d_ptr->mflags9) return TRUE;
1142                 if (r_ptr->flagsr & d_ptr->mflagsr) return TRUE;
1143                 for (a = 0; a < 5; a++)
1144                         if (d_ptr->r_char[a] == r_ptr->d_char) return TRUE;
1145
1146                 return FALSE;
1147
1148         case DUNGEON_MODE_NOR:
1149                 if (r_ptr->flags1 & d_ptr->mflags1) return FALSE;
1150                 if (r_ptr->flags2 & d_ptr->mflags2) return FALSE;
1151                 if (r_ptr->flags3 & d_ptr->mflags3) return FALSE;
1152                 if (r_ptr->flags4 & d_ptr->mflags4) return FALSE;
1153                 if (r_ptr->a_ability_flags1 & d_ptr->m_a_ability_flags1) return FALSE;
1154                 if (r_ptr->a_ability_flags2 & d_ptr->m_a_ability_flags2) return FALSE;
1155                 if (r_ptr->flags7 & d_ptr->mflags7) return FALSE;
1156                 if (r_ptr->flags8 & d_ptr->mflags8) return FALSE;
1157                 if (r_ptr->flags9 & d_ptr->mflags9) return FALSE;
1158                 if (r_ptr->flagsr & d_ptr->mflagsr) return FALSE;
1159                 for (a = 0; a < 5; a++)
1160                         if (d_ptr->r_char[a] == r_ptr->d_char) return FALSE;
1161
1162                 return TRUE;
1163         }
1164
1165         return TRUE;
1166 }
1167
1168 /*!
1169  * @brief モンスター生成制限関数最大2つから / Apply a "monster restriction function" to the "monster allocation table"
1170  * @param monster_hook 制限関数1
1171  * @param monster_hook2 制限関数2
1172  * @return エラーコード
1173  */
1174 errr get_mon_num_prep(monster_hook_type monster_hook,
1175                                           monster_hook_type monster_hook2)
1176 {
1177         int i;
1178
1179         /* Todo: Check the hooks for non-changes */
1180
1181         /* Set the new hooks */
1182         get_mon_num_hook = monster_hook;
1183         get_mon_num2_hook = monster_hook2;
1184
1185         /* Scan the allocation table */
1186         for (i = 0; i < alloc_race_size; i++)
1187         {
1188                 monster_race    *r_ptr;
1189                 
1190                 /* Get the entry */
1191                 alloc_entry *entry = &alloc_race_table[i];
1192
1193                 entry->prob2 = 0;
1194                 r_ptr = &r_info[entry->index];
1195
1196                 /* Skip monsters which don't pass the restriction */
1197                 if ((get_mon_num_hook && !((*get_mon_num_hook)(entry->index))) ||
1198                     (get_mon_num2_hook && !((*get_mon_num2_hook)(entry->index))))
1199                         continue;
1200
1201                 if (!p_ptr->inside_battle && !chameleon_change_m_idx &&
1202                     summon_specific_type != SUMMON_GUARDIANS)
1203                 {
1204                         /* Hack -- don't create questors */
1205                         if (r_ptr->flags1 & RF1_QUESTOR)
1206                                 continue;
1207
1208                         if (r_ptr->flags7 & RF7_GUARDIAN)
1209                                 continue;
1210
1211                         /* Depth Monsters never appear out of depth */
1212                         if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) &&
1213                             (r_ptr->level > dun_level))
1214                                 continue;
1215                 }
1216
1217                 /* Accept this monster */
1218                 entry->prob2 = entry->prob1;
1219
1220                 if (dun_level && (!p_ptr->inside_quest || is_fixed_quest_idx(p_ptr->inside_quest)) && !restrict_monster_to_dungeon(entry->index) && !p_ptr->inside_battle)
1221                 {
1222                         int hoge = entry->prob2 * d_info[dungeon_type].special_div;
1223                         entry->prob2 = hoge / 64;
1224                         if (randint0(64) < (hoge & 0x3f)) entry->prob2++;
1225                 }
1226         }
1227
1228         /* Success */
1229         return (0);
1230 }
1231
1232 /*!
1233  * @brief 平方根を切り捨て整数で返す
1234  * @param n 数値
1235  * @return 平方根
1236  */
1237 static int mysqrt(int n)
1238 {
1239         int tmp = n>>1;
1240         int tasu = 10;
1241         int kaeriti = 1;
1242
1243         if (!tmp)
1244         {
1245                 if (n) return 1;
1246                 else return 0;
1247         }
1248
1249         while(tmp)
1250         {
1251                 if ((n/tmp) < tmp)
1252                 {
1253                         tmp >>= 1;
1254                 }
1255                 else break;
1256         }
1257         kaeriti = tmp;
1258         while(tasu)
1259         {
1260                 if ((n/tmp) < tmp)
1261                 {
1262                         tasu--;
1263                         tmp = kaeriti;
1264                 }
1265                 else
1266                 {
1267                         kaeriti = tmp;
1268                         tmp += tasu;
1269                 }
1270         }
1271         return kaeriti;
1272 }
1273
1274 /*!
1275  * @brief 生成モンスター種族を1種生成テーブルから選択する
1276  * @param level 生成階
1277  * @return 選択されたモンスター生成種族
1278  * @details
1279  * Choose a monster race that seems "appropriate" to the given level
1280  *
1281  * This function uses the "prob2" field of the "monster allocation table",
1282  * and various local information, to calculate the "prob3" field of the
1283  * same table, which is then used to choose an "appropriate" monster, in
1284  * a relatively efficient manner.
1285  *
1286  * Note that "town" monsters will *only* be created in the town, and
1287  * "normal" monsters will *never* be created in the town, unless the
1288  * "level" is "modified", for example, by polymorph or summoning.
1289  *
1290  * There is a small chance (1/50) of "boosting" the given depth by
1291  * a small amount (up to four levels), except in the town.
1292  *
1293  * It is (slightly) more likely to acquire a monster of the given level
1294  * than one of a lower level.  This is done by choosing several monsters
1295  * appropriate to the given level and keeping the "hardest" one.
1296  *
1297  * Note that if no monsters are "appropriate", then this function will
1298  * fail, and return zero, but this should *almost* never happen.
1299  */
1300 s16b get_mon_num(int level)
1301 {
1302         int                     i, j, p;
1303         int                     r_idx;
1304         long            value, total;
1305         monster_race    *r_ptr;
1306         alloc_entry             *table = alloc_race_table;
1307
1308         int pls_kakuritu, pls_level;
1309         int delay = mysqrt(level * 10000L) + 400L;
1310
1311         if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
1312
1313         pls_kakuritu = MAX(NASTY_MON_MAX, NASTY_MON_BASE - ((dungeon_turn / (TURNS_PER_TICK * 5000L) - delay / 10)));
1314         pls_level    = MIN(NASTY_MON_PLUS_MAX, 3 + dungeon_turn / (TURNS_PER_TICK * 40000L) - delay / 40 + MIN(5, level / 10)) ;
1315
1316         if (d_info[dungeon_type].flags1 & DF1_MAZE)
1317         {
1318                 pls_kakuritu = MIN(pls_kakuritu / 2, pls_kakuritu - 10);
1319                 if (pls_kakuritu < 2) pls_kakuritu = 2;
1320                 pls_level += 2;
1321                 level += 3;
1322         }
1323
1324         /* Boost the level */
1325         if (!p_ptr->inside_battle && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
1326         {
1327                 /* Nightmare mode allows more out-of depth monsters */
1328                 if (ironman_nightmare && !randint0(pls_kakuritu))
1329                 {
1330                         /* What a bizarre calculation */
1331                         level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
1332                 }
1333                 else
1334                 {
1335                         /* Occasional "nasty" monster */
1336                         if (!randint0(pls_kakuritu))
1337                         {
1338                                 /* Pick a level bonus */
1339                                 level += pls_level;
1340                         }
1341                 }
1342         }
1343
1344         /* Reset total */
1345         total = 0L;
1346
1347         /* Process probabilities */
1348         for (i = 0; i < alloc_race_size; i++)
1349         {
1350                 /* Monsters are sorted by depth */
1351                 if (table[i].level > level) break;
1352
1353                 /* Default */
1354                 table[i].prob3 = 0;
1355
1356                 /* Access the "r_idx" of the chosen monster */
1357                 r_idx = table[i].index;
1358
1359                 /* Access the actual race */
1360                 r_ptr = &r_info[r_idx];
1361
1362                 if (!p_ptr->inside_battle && !chameleon_change_m_idx)
1363                 {
1364                         /* Hack -- "unique" monsters must be "unique" */
1365                         if (((r_ptr->flags1 & (RF1_UNIQUE)) ||
1366                              (r_ptr->flags7 & (RF7_NAZGUL))) &&
1367                             (r_ptr->cur_num >= r_ptr->max_num))
1368                         {
1369                                 continue;
1370                         }
1371
1372                         if ((r_ptr->flags7 & (RF7_UNIQUE2)) &&
1373                             (r_ptr->cur_num >= 1))
1374                         {
1375                                 continue;
1376                         }
1377
1378                         if (r_idx == MON_BANORLUPART)
1379                         {
1380                                 if (r_info[MON_BANOR].cur_num > 0) continue;
1381                                 if (r_info[MON_LUPART].cur_num > 0) continue;
1382                         }
1383                 }
1384
1385                 /* Accept */
1386                 table[i].prob3 = table[i].prob2;
1387
1388                 /* Total */
1389                 total += table[i].prob3;
1390         }
1391
1392         /* No legal monsters */
1393         if (total <= 0) return (0);
1394
1395         /* Pick a monster */
1396         value = randint0(total);
1397
1398         /* Find the monster */
1399         for (i = 0; i < alloc_race_size; i++)
1400         {
1401                 /* Found the entry */
1402                 if (value < table[i].prob3) break;
1403
1404                 /* Decrement */
1405                 value = value - table[i].prob3;
1406         }
1407
1408         /* Power boost */
1409         p = randint0(100);
1410
1411         /* Try for a "harder" monster once (50%) or twice (10%) */
1412         if (p < 60)
1413         {
1414                 /* Save old */
1415                 j = i;
1416
1417                 /* Pick a monster */
1418                 value = randint0(total);
1419
1420                 /* Find the monster */
1421                 for (i = 0; i < alloc_race_size; i++)
1422                 {
1423                         /* Found the entry */
1424                         if (value < table[i].prob3) break;
1425
1426                         /* Decrement */
1427                         value = value - table[i].prob3;
1428                 }
1429
1430                 /* Keep the "best" one */
1431                 if (table[i].level < table[j].level) i = j;
1432         }
1433
1434         /* Try for a "harder" monster twice (10%) */
1435         if (p < 10)
1436         {
1437                 /* Save old */
1438                 j = i;
1439
1440                 /* Pick a monster */
1441                 value = randint0(total);
1442
1443                 /* Find the monster */
1444                 for (i = 0; i < alloc_race_size; i++)
1445                 {
1446                         /* Found the entry */
1447                         if (value < table[i].prob3) break;
1448
1449                         /* Decrement */
1450                         value = value - table[i].prob3;
1451                 }
1452
1453                 /* Keep the "best" one */
1454                 if (table[i].level < table[j].level) i = j;
1455         }
1456
1457         /* Result */
1458         return (table[i].index);
1459 }
1460
1461
1462 /*!
1463  * @brief モンスターの呼称を作成する / Build a string describing a monster in some way.
1464  * @param desc 記述出力先の文字列参照ポインタ
1465  * @param m_ptr モンスターの参照ポインタ
1466  * @param mode 呼称オプション
1467  * @return なし
1468  * @details
1469  * We can correctly describe monsters based on their visibility.
1470  * We can force all monsters to be treated as visible or invisible.
1471  * We can build nominatives, objectives, possessives, or reflexives.
1472  * We can selectively pronominalize hidden, visible, or all monsters.
1473  * We can use definite or indefinite descriptions for hidden monsters.
1474  * We can use definite or indefinite descriptions for visible monsters.
1475  *
1476  * Pronominalization involves the gender whenever possible and allowed,
1477  * so that by cleverly requesting pronominalization / visibility, you
1478  * can get messages like "You hit someone.  She screams in agony!".
1479  *
1480  * Reflexives are acquired by requesting Objective plus Possessive.
1481  *
1482  * If no m_ptr arg is given (?), the monster is assumed to be hidden,
1483  * unless the "Assume Visible" mode is requested.
1484  *
1485  * If no r_ptr arg is given, it is extracted from m_ptr and r_info
1486  * If neither m_ptr nor r_ptr is given, the monster is assumed to
1487  * be neuter, singular, and hidden (unless "Assume Visible" is set),
1488  * in which case you may be in trouble... :-)
1489  *
1490  * I am assuming that no monster name is more than 70 characters long,
1491  * so that "char desc[80];" is sufficiently large for any result.
1492  *
1493  * Mode Flags:
1494  *  MD_OBJECTIVE      --> Objective (or Reflexive)
1495  *  MD_POSSESSIVE     --> Possessive (or Reflexive)
1496  *  MD_INDEF_HIDDEN   --> Use indefinites for hidden monsters ("something")
1497  *  MD_INDEF_VISIBLE  --> Use indefinites for visible monsters ("a kobold")
1498  *  MD_PRON_HIDDEN    --> Pronominalize hidden monsters
1499  *  MD_PRON_VISIBLE   --> Pronominalize visible monsters
1500  *  MD_ASSUME_HIDDEN  --> Assume the monster is hidden
1501  *  MD_ASSUME_VISIBLE --> Assume the monster is visible
1502  *  MD_TRUE_NAME      --> Chameleon's true name
1503  *  MD_IGNORE_HALLU   --> Ignore hallucination, and penetrate shape change
1504  *
1505  * Useful Modes:
1506  *  0x00 --> Full nominative name ("the kobold") or "it"
1507  *  MD_INDEF_HIDDEN --> Full nominative name ("the kobold") or "something"
1508  *  MD_ASSUME_VISIBLE --> Genocide resistance name ("the kobold")
1509  *  MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE --> Killing name ("a kobold")
1510  *  MD_PRON_VISIBLE | MD_POSSESSIVE
1511  *    --> Possessive, genderized if visable ("his") or "its"
1512  *  MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE
1513  *    --> Reflexive, genderized if visable ("himself") or "itself"
1514  */
1515 void monster_desc(char *desc, monster_type *m_ptr, int mode)
1516 {
1517         cptr            res;
1518         monster_race    *r_ptr;
1519
1520         cptr            name;
1521         char            buf[128];
1522         char            silly_name[1024];
1523         bool            seen, pron;
1524         bool            named = FALSE;
1525
1526         r_ptr = &r_info[m_ptr->ap_r_idx];
1527
1528         /* Mode of MD_TRUE_NAME will reveal Chameleon's true name */
1529         if (mode & MD_TRUE_NAME) name = (r_name + real_r_ptr(m_ptr)->name);
1530         else name = (r_name + r_ptr->name);
1531
1532         /* Are we hallucinating? (Idea from Nethack...) */
1533         if (p_ptr->image && !(mode & MD_IGNORE_HALLU))
1534         {
1535                 if (one_in_(2))
1536                 {
1537                         if (!get_rnd_line(_("silly_j.txt", "silly.txt"), m_ptr->r_idx, silly_name))
1538                                 named = TRUE;
1539                 }
1540
1541                 if (!named)
1542                 {
1543                         monster_race *hallu_race;
1544
1545                         do
1546                         {
1547                                 hallu_race = &r_info[randint1(max_r_idx - 1)];
1548                         }
1549                         while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
1550
1551                         strcpy(silly_name, (r_name + hallu_race->name));
1552                 }
1553
1554                 /* Better not strcpy it, or we could corrupt r_info... */
1555                 name = silly_name;
1556         }
1557
1558         /* Can we "see" it (exists + forced, or visible + not unforced) */
1559         seen = (m_ptr && ((mode & MD_ASSUME_VISIBLE) || (!(mode & MD_ASSUME_HIDDEN) && m_ptr->ml)));
1560
1561         /* Sexed Pronouns (seen and allowed, or unseen and allowed) */
1562         pron = (m_ptr && ((seen && (mode & MD_PRON_VISIBLE)) || (!seen && (mode & MD_PRON_HIDDEN))));
1563
1564
1565         /* First, try using pronouns, or describing hidden monsters */
1566         if (!seen || pron)
1567         {
1568                 /* an encoding of the monster "sex" */
1569                 int kind = 0x00;
1570
1571                 /* Extract the gender (if applicable) */
1572                 if (r_ptr->flags1 & (RF1_FEMALE)) kind = 0x20;
1573                 else if (r_ptr->flags1 & (RF1_MALE)) kind = 0x10;
1574
1575                 /* Ignore the gender (if desired) */
1576                 if (!m_ptr || !pron) kind = 0x00;
1577
1578
1579                 /* Assume simple result */
1580                 res = _("何か", "it");
1581
1582                 /* Brute force: split on the possibilities */
1583                 switch (kind + (mode & (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE)))
1584                 {
1585                         /* Neuter, or unknown */
1586 #ifdef JP
1587                         case 0x00:                                                    res = "何か"; break;
1588                         case 0x00 + (MD_OBJECTIVE):                                   res = "何か"; break;
1589                         case 0x00 + (MD_POSSESSIVE):                                  res = "何かの"; break;
1590                         case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "何か自身"; break;
1591                         case 0x00 + (MD_INDEF_HIDDEN):                                res = "何か"; break;
1592                         case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "何か"; break;
1593                         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "何か"; break;
1594                         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "それ自身"; break;
1595 #else
1596                         case 0x00:                                                    res = "it"; break;
1597                         case 0x00 + (MD_OBJECTIVE):                                   res = "it"; break;
1598                         case 0x00 + (MD_POSSESSIVE):                                  res = "its"; break;
1599                         case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "itself"; break;
1600                         case 0x00 + (MD_INDEF_HIDDEN):                                res = "something"; break;
1601                         case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "something"; break;
1602                         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "something's"; break;
1603                         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "itself"; break;
1604 #endif
1605
1606
1607                         /* Male (assume human if vague) */
1608 #ifdef JP
1609                         case 0x10:                                                    res = "彼"; break;
1610                         case 0x10 + (MD_OBJECTIVE):                                   res = "彼"; break;
1611                         case 0x10 + (MD_POSSESSIVE):                                  res = "彼の"; break;
1612                         case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "彼自身"; break;
1613                         case 0x10 + (MD_INDEF_HIDDEN):                                res = "誰か"; break;
1614                         case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "誰か"; break;
1615                         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "誰かの"; break;
1616                         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "彼自身"; break;
1617 #else
1618                         case 0x10:                                                    res = "he"; break;
1619                         case 0x10 + (MD_OBJECTIVE):                                   res = "him"; break;
1620                         case 0x10 + (MD_POSSESSIVE):                                  res = "his"; break;
1621                         case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "himself"; break;
1622                         case 0x10 + (MD_INDEF_HIDDEN):                                res = "someone"; break;
1623                         case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "someone"; break;
1624                         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "someone's"; break;
1625                         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "himself"; break;
1626 #endif
1627
1628
1629                         /* Female (assume human if vague) */
1630 #ifdef JP
1631                         case 0x20:                                                    res = "彼女"; break;
1632                         case 0x20 + (MD_OBJECTIVE):                                   res = "彼女"; break;
1633                         case 0x20 + (MD_POSSESSIVE):                                  res = "彼女の"; break;
1634                         case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "彼女自身"; break;
1635                         case 0x20 + (MD_INDEF_HIDDEN):                                res = "誰か"; break;
1636                         case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "誰か"; break;
1637                         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "誰かの"; break;
1638                         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "彼女自身"; break;
1639 #else
1640                         case 0x20:                                                    res = "she"; break;
1641                         case 0x20 + (MD_OBJECTIVE):                                   res = "her"; break;
1642                         case 0x20 + (MD_POSSESSIVE):                                  res = "her"; break;
1643                         case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):                   res = "herself"; break;
1644                         case 0x20 + (MD_INDEF_HIDDEN):                                res = "someone"; break;
1645                         case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):                 res = "someone"; break;
1646                         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):                res = "someone's"; break;
1647                         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE): res = "herself"; break;
1648 #endif
1649                 }
1650
1651                 /* Copy the result */
1652                 (void)strcpy(desc, res);
1653         }
1654
1655
1656         /* Handle visible monsters, "reflexive" request */
1657         else if ((mode & (MD_POSSESSIVE | MD_OBJECTIVE)) == (MD_POSSESSIVE | MD_OBJECTIVE))
1658         {
1659                 /* The monster is visible, so use its gender */
1660 #ifdef JP
1661                 if (r_ptr->flags1 & (RF1_FEMALE)) strcpy(desc, "彼女自身");
1662                 else if (r_ptr->flags1 & (RF1_MALE)) strcpy(desc, "彼自身");
1663                 else strcpy(desc, "それ自身");
1664 #else
1665                 if (r_ptr->flags1 & RF1_FEMALE) strcpy(desc, "herself");
1666                 else if (r_ptr->flags1 & RF1_MALE) strcpy(desc, "himself");
1667                 else strcpy(desc, "itself");
1668 #endif
1669         }
1670
1671
1672         /* Handle all other visible monster requests */
1673         else
1674         {
1675                 /* Tanuki? */
1676                 if (is_pet(m_ptr) && !is_original_ap(m_ptr))
1677                 {
1678 #ifdef JP
1679                         char *t;
1680                         strcpy(buf, name);
1681                         t = buf;
1682                         while(strncmp(t, "』", 2) && *t) t++;
1683                         if (*t)
1684                         {
1685                                 *t = '\0';
1686                                 (void)sprintf(desc, "%s?』", buf);
1687                         }
1688                         else
1689                                 (void)sprintf(desc, "%s?", name);
1690 #else
1691                         (void)sprintf(desc, "%s?", name);
1692 #endif
1693                 }
1694                 else
1695
1696                 /* It could be a Unique */
1697                 if ((r_ptr->flags1 & RF1_UNIQUE) && !(p_ptr->image && !(mode & MD_IGNORE_HALLU)))
1698                 {
1699                         /* Start with the name (thus nominative and objective) */
1700                         if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && !(mode & MD_TRUE_NAME))
1701                         {
1702 #ifdef JP
1703                                 char *t;
1704                                 strcpy(buf, name);
1705                                 t = buf;
1706                                 while (strncmp(t, "』", 2) && *t) t++;
1707                                 if (*t)
1708                                 {
1709                                         *t = '\0';
1710                                         (void)sprintf(desc, "%s?』", buf);
1711                                 }
1712                                 else
1713                                         (void)sprintf(desc, "%s?", name);
1714 #else
1715                                 (void)sprintf(desc, "%s?", name);
1716 #endif
1717                         }
1718
1719                         /* Inside monster arena, and it is not your mount */
1720                         else if (p_ptr->inside_battle &&
1721                                  !(p_ptr->riding && (&m_list[p_ptr->riding] == m_ptr)))
1722                         {
1723                                 /* It is a fake unique monster */
1724                                 (void)sprintf(desc, _("%sもどき", "fake %s"), name);
1725                         }
1726
1727                         else
1728                         {
1729                                 (void)strcpy(desc, name);
1730                         }
1731                 }
1732
1733                 /* It could be an indefinite monster */
1734                 else if (mode & MD_INDEF_VISIBLE)
1735                 {
1736                         /* XXX Check plurality for "some" */
1737
1738                         /* Indefinite monsters need an indefinite article */
1739 #ifdef JP
1740                         (void)strcpy(desc, "");
1741 #else
1742                         (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
1743 #endif
1744
1745                         (void)strcat(desc, name);
1746                 }
1747
1748                 /* It could be a normal, definite, monster */
1749                 else
1750                 {
1751                         /* Definite monsters need a definite article */
1752                         if (is_pet(m_ptr))
1753                                 (void)strcpy(desc, _("あなたの", "your "));
1754                         else
1755                                 (void)strcpy(desc, _("", "the "));
1756
1757                         (void)strcat(desc, name);
1758                 }
1759
1760                 if (m_ptr->nickname)
1761                 {
1762                         sprintf(buf,_("「%s」", " called %s"),quark_str(m_ptr->nickname));
1763                         strcat(desc,buf);
1764                 }
1765
1766                 if (p_ptr->riding && (&m_list[p_ptr->riding] == m_ptr))
1767                 {
1768                         strcat(desc,_("(乗馬中)", "(riding)"));
1769                 }
1770
1771                 if ((mode & MD_IGNORE_HALLU) && (m_ptr->mflag2 & MFLAG2_CHAMELEON))
1772                 {
1773                         if (r_ptr->flags1 & RF1_UNIQUE)
1774                         {
1775                                 strcat(desc,_("(カメレオンの王)", "(Chameleon Lord)"));
1776                         }
1777                         else
1778                         {
1779                                 strcat(desc,_("(カメレオン)", "(Chameleon)"));
1780                         }
1781                 }
1782
1783                 if ((mode & MD_IGNORE_HALLU) && !is_original_ap(m_ptr))
1784                 {
1785                         strcat(desc, format("(%s)", r_name + r_info[m_ptr->r_idx].name));
1786                 }
1787
1788                 /* Handle the Possessive as a special afterthought */
1789                 if (mode & MD_POSSESSIVE)
1790                 {
1791                         /* XXX Check for trailing "s" */
1792                         
1793                         /* Simply append "apostrophe" and "s" */
1794                         (void)strcat(desc, _("の", "'s"));
1795                 }
1796         }
1797 }
1798
1799
1800
1801 /*!
1802  * @brief モンスターの調査による思い出補完処理 / Learn about a monster (by "probing" it)
1803  * @param r_idx 補完されるモンスター種族ID
1804  * @return 明らかになった情報の度数
1805  * @details
1806  * Return the number of new flags learnt.  -Mogami-
1807  */
1808 int lore_do_probe(int r_idx)
1809 {
1810         monster_race *r_ptr = &r_info[r_idx];
1811         int i, n = 0;
1812         byte tmp_byte;
1813
1814         /* Maximal info about awareness */
1815         if (r_ptr->r_wake != MAX_UCHAR) n++;
1816         if (r_ptr->r_ignore != MAX_UCHAR) n++;
1817         r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
1818
1819         /* Observe "maximal" attacks */
1820         for (i = 0; i < 4; i++)
1821         {
1822                 /* Examine "actual" blows */
1823                 if (r_ptr->blow[i].effect || r_ptr->blow[i].method)
1824                 {
1825                         /* Maximal observations */
1826                         if (r_ptr->r_blows[i] != MAX_UCHAR) n++;
1827                         r_ptr->r_blows[i] = MAX_UCHAR;
1828                 }
1829         }
1830
1831         /* Maximal drops */
1832         tmp_byte =
1833                 (((r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) +
1834                  ((r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) +
1835                  ((r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) +
1836                  ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) +
1837                  ((r_ptr->flags1 & RF1_DROP_90)  ? 1 : 0) +
1838                  ((r_ptr->flags1 & RF1_DROP_60)  ? 1 : 0));
1839
1840         /* Only "valid" drops */
1841         if (!(r_ptr->flags1 & RF1_ONLY_GOLD))
1842         {
1843                 if (r_ptr->r_drop_item != tmp_byte) n++;
1844                 r_ptr->r_drop_item = tmp_byte;
1845         }
1846         if (!(r_ptr->flags1 & RF1_ONLY_ITEM))
1847         {
1848                 if (r_ptr->r_drop_gold != tmp_byte) n++;
1849                 r_ptr->r_drop_gold = tmp_byte;
1850         }
1851
1852         /* Observe many spells */
1853         if (r_ptr->r_cast_spell != MAX_UCHAR) n++;
1854         r_ptr->r_cast_spell = MAX_UCHAR;
1855
1856         /* Count unknown flags */
1857         for (i = 0; i < 32; i++)
1858         {
1859                 if (!(r_ptr->r_flags1 & (1L << i)) &&
1860                     (r_ptr->flags1 & (1L << i))) n++;
1861                 if (!(r_ptr->r_flags2 & (1L << i)) &&
1862                     (r_ptr->flags2 & (1L << i))) n++;
1863                 if (!(r_ptr->r_flags3 & (1L << i)) &&
1864                     (r_ptr->flags3 & (1L << i))) n++;
1865                 if (!(r_ptr->r_flags4 & (1L << i)) &&
1866                     (r_ptr->flags4 & (1L << i))) n++;
1867                 if (!(r_ptr->r_flags5 & (1L << i)) &&
1868                     (r_ptr->a_ability_flags1 & (1L << i))) n++;
1869                 if (!(r_ptr->r_flags6 & (1L << i)) &&
1870                     (r_ptr->a_ability_flags2 & (1L << i))) n++;
1871                 if (!(r_ptr->r_flagsr & (1L << i)) &&
1872                     (r_ptr->flagsr & (1L << i))) n++;
1873
1874                 /* r_flags7 is actually unused */
1875 #if 0
1876                 if (!(r_ptr->r_flags7 & (1L << i)) &&
1877                     (r_ptr->flags7 & (1L << i))) n++;
1878 #endif
1879         }
1880
1881         /* Know all the flags */
1882         r_ptr->r_flags1 = r_ptr->flags1;
1883         r_ptr->r_flags2 = r_ptr->flags2;
1884         r_ptr->r_flags3 = r_ptr->flags3;
1885         r_ptr->r_flags4 = r_ptr->flags4;
1886         r_ptr->r_flags5 = r_ptr->a_ability_flags1;
1887         r_ptr->r_flags6 = r_ptr->a_ability_flags2;
1888         r_ptr->r_flagsr = r_ptr->flagsr;
1889
1890         /* r_flags7 is actually unused */
1891         /* r_ptr->r_flags7 = r_ptr->flags7; */
1892
1893         /* Know about evolution */
1894         if (!(r_ptr->r_xtra1 & MR1_SINKA)) n++;
1895         r_ptr->r_xtra1 |= MR1_SINKA;
1896
1897         /* Update monster recall window */
1898         if (p_ptr->monster_race_idx == r_idx)
1899         {
1900                 /* Window stuff */
1901                 p_ptr->window |= (PW_MONSTER);
1902         }
1903
1904         /* Return the number of new flags learnt */
1905         return n;
1906 }
1907
1908
1909 /*!
1910  * @brief モンスターの撃破に伴うドロップ情報の保管処理 / Take note that the given monster just dropped some treasure
1911  * @param m_idx モンスター情報のID
1912  * @param num_item 手に入れたアイテム数
1913  * @param num_gold 手に入れた財宝の単位数
1914  * @return なし
1915  * @details
1916  * Note that learning the "GOOD"/"GREAT" flags gives information
1917  * about the treasure (even when the monster is killed for the first
1918  * time, such as uniques, and the treasure has not been examined yet).
1919  *
1920  * This "indirect" method is used to prevent the player from learning
1921  * exactly how much treasure a monster can drop from observing only
1922  * a single example of a drop.  This method actually observes how much
1923  * gold and items are dropped, and remembers that information to be
1924  * described later by the monster recall code.
1925  */
1926 void lore_treasure(int m_idx, int num_item, int num_gold)
1927 {
1928         monster_type *m_ptr = &m_list[m_idx];
1929
1930         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1931
1932         /* If the monster doesn't have original appearance, don't note */
1933         if (!is_original_ap(m_ptr)) return;
1934
1935         /* Note the number of things dropped */
1936         if (num_item > r_ptr->r_drop_item) r_ptr->r_drop_item = num_item;
1937         if (num_gold > r_ptr->r_drop_gold) r_ptr->r_drop_gold = num_gold;
1938
1939         /* Hack -- memorize the good/great flags */
1940         if (r_ptr->flags1 & (RF1_DROP_GOOD)) r_ptr->r_flags1 |= (RF1_DROP_GOOD);
1941         if (r_ptr->flags1 & (RF1_DROP_GREAT)) r_ptr->r_flags1 |= (RF1_DROP_GREAT);
1942
1943         /* Update monster recall window */
1944         if (p_ptr->monster_race_idx == m_ptr->r_idx)
1945         {
1946                 /* Window stuff */
1947                 p_ptr->window |= (PW_MONSTER);
1948         }
1949 }
1950
1951
1952 /*!
1953  * @brief ELDRITCH_HORRORによるプレイヤーの精神破壊処理
1954  * @param m_ptr ELDRITCH_HORRORを引き起こしたモンスターの参照ポインタ
1955  * @param necro 暗黒領域魔法の詠唱失敗によるものならばTRUEを返す
1956  * @return なし
1957  */
1958 void sanity_blast(monster_type *m_ptr, bool necro)
1959 {
1960         bool happened = FALSE;
1961         int power = 100;
1962
1963         if (p_ptr->inside_battle || !character_dungeon) return;
1964
1965         if (!necro && m_ptr)
1966         {
1967                 char m_name[80];
1968                 monster_race *r_ptr = &r_info[m_ptr->ap_r_idx];
1969
1970                 power = r_ptr->level / 2;
1971
1972                 monster_desc(m_name, m_ptr, 0);
1973
1974                 if (!(r_ptr->flags1 & RF1_UNIQUE))
1975                 {
1976                         if (r_ptr->flags1 & RF1_FRIENDS)
1977                         power /= 2;
1978                 }
1979                 else power *= 2;
1980
1981                 if (!hack_mind)
1982                         return; /* No effect yet, just loaded... */
1983
1984                 if (!m_ptr->ml)
1985                         return; /* Cannot see it for some reason */
1986
1987                 if (!(r_ptr->flags2 & RF2_ELDRITCH_HORROR))
1988                         return; /* oops */
1989
1990                 if (is_pet(m_ptr))
1991                         return; /* Pet eldritch horrors are safe most of the time */
1992
1993                 if (randint1(100) > power) return;
1994
1995                 if (saving_throw(p_ptr->skill_sav - power))
1996                 {
1997                         return; /* Save, no adverse effects */
1998                 }
1999
2000                 if (p_ptr->image)
2001                 {
2002                         /* Something silly happens... */
2003 #ifdef JP
2004                         msg_format("%s%sの顔を見てしまった!",
2005                                 funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
2006 #else
2007                         msg_format("You behold the %s visage of %s!",
2008                                 funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
2009 #endif
2010
2011                         if (one_in_(3))
2012                         {
2013                                 msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
2014                                 p_ptr->image = p_ptr->image + randint1(r_ptr->level);
2015                         }
2016
2017                         return; /* Never mind; we can't see it clearly enough */
2018                 }
2019
2020                 /* Something frightening happens... */
2021 #ifdef JP
2022                 msg_format("%s%sの顔を見てしまった!",
2023                         horror_desc[randint0(MAX_SAN_HORROR)], m_name);
2024 #else
2025                 msg_format("You behold the %s visage of %s!",
2026                         horror_desc[randint0(MAX_SAN_HORROR)], m_name);
2027 #endif
2028
2029                 r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
2030
2031                 /* Demon characters are unaffected */
2032                 if (prace_is_(RACE_IMP) || prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)) return;
2033                 if (p_ptr->wizard) return;
2034
2035                 /* Undead characters are 50% likely to be unaffected */
2036                 if (prace_is_(RACE_SKELETON) || prace_is_(RACE_ZOMBIE)
2037                         || prace_is_(RACE_VAMPIRE) || prace_is_(RACE_SPECTRE) ||
2038                     (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD))
2039                 {
2040                         if (saving_throw(25 + p_ptr->lev)) return;
2041                 }
2042         }
2043         else if(!necro)
2044         {
2045                 monster_race *r_ptr;
2046                 char m_name[80];
2047                 cptr desc;
2048
2049                 get_mon_num_prep(get_nightmare, NULL);
2050
2051                 r_ptr = &r_info[get_mon_num(MAX_DEPTH)];
2052                 power = r_ptr->level + 10;
2053                 desc = r_name + r_ptr->name;
2054
2055                 get_mon_num_prep(NULL, NULL);
2056
2057                 /* Describe it */
2058 #ifndef JP
2059                 if (!(r_ptr->flags1 & RF1_UNIQUE))
2060                         sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
2061                 else
2062 #endif
2063                 sprintf(m_name, "%s", desc);
2064
2065                 if (!(r_ptr->flags1 & RF1_UNIQUE))
2066                 {
2067                         if (r_ptr->flags1 & RF1_FRIENDS) power /= 2;
2068                 }
2069                 else power *= 2;
2070
2071                 if (saving_throw(p_ptr->skill_sav * 100 / power))
2072                 {
2073                         msg_format(_("夢の中で%sに追いかけられた。", "%^s chases you through your dreams."), m_name);
2074                         /* Safe */
2075                         return;
2076                 }
2077
2078                 if (p_ptr->image)
2079                 {
2080                         /* Something silly happens... */
2081                         msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
2082                                                 funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
2083
2084                         if (one_in_(3))
2085                         {
2086                                 msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
2087                                 p_ptr->image = p_ptr->image + randint1(r_ptr->level);
2088                         }
2089
2090                         /* Never mind; we can't see it clearly enough */
2091                         return;
2092                 }
2093
2094                 /* Something frightening happens... */
2095                 msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
2096                                   horror_desc[randint0(MAX_SAN_HORROR)], desc);
2097
2098                 r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
2099
2100                 if (!p_ptr->mimic_form)
2101                 {
2102                         switch (p_ptr->prace)
2103                         {
2104                         /* Demons may make a saving throw */
2105                         case RACE_IMP:
2106                         case RACE_DEMON:
2107                                 if (saving_throw(20 + p_ptr->lev)) return;
2108                                 break;
2109                         /* Undead may make a saving throw */
2110                         case RACE_SKELETON:
2111                         case RACE_ZOMBIE:
2112                         case RACE_SPECTRE:
2113                         case RACE_VAMPIRE:
2114                                 if (saving_throw(10 + p_ptr->lev)) return;
2115                                 break;
2116                         }
2117                 }
2118                 else
2119                 {
2120                         /* Demons may make a saving throw */
2121                         if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)
2122                         {
2123                                 if (saving_throw(20 + p_ptr->lev)) return;
2124                         }
2125                         /* Undead may make a saving throw */
2126                         else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD)
2127                         {
2128                                 if (saving_throw(10 + p_ptr->lev)) return;
2129                         }
2130                 }
2131         }
2132         else
2133         {
2134                 msg_print(_("ネクロノミコンを読んで正気を失った!", "Your sanity is shaken by reading the Necronomicon!"));
2135         }
2136
2137         if (!saving_throw(p_ptr->skill_sav - power)) /* Mind blast */
2138         {
2139                 if (!p_ptr->resist_conf)
2140                 {
2141                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
2142                 }
2143                 if (!p_ptr->resist_chaos && one_in_(3))
2144                 {
2145                         (void)set_image(p_ptr->image + randint0(250) + 150);
2146                 }
2147                 return;
2148         }
2149
2150         if (!saving_throw(p_ptr->skill_sav - power)) /* Lose int & wis */
2151         {
2152                 do_dec_stat(A_INT);
2153                 do_dec_stat(A_WIS);
2154                 return;
2155         }
2156
2157         if (!saving_throw(p_ptr->skill_sav - power)) /* Brain smash */
2158         {
2159                 if (!p_ptr->resist_conf)
2160                 {
2161                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
2162                 }
2163                 if (!p_ptr->free_act)
2164                 {
2165                         (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
2166                 }
2167                 while (randint0(100) > p_ptr->skill_sav)
2168                         (void)do_dec_stat(A_INT);
2169                 while (randint0(100) > p_ptr->skill_sav)
2170                         (void)do_dec_stat(A_WIS);
2171                 if (!p_ptr->resist_chaos)
2172                 {
2173                         (void)set_image(p_ptr->image + randint0(250) + 150);
2174                 }
2175                 return;
2176         }
2177
2178         if (!saving_throw(p_ptr->skill_sav - power)) /* Amnesia */
2179         {
2180
2181                 if (lose_all_info())
2182                         msg_print(_("あまりの恐怖に全てのことを忘れてしまった!", "You forget everything in your utmost terror!"));
2183
2184                 return;
2185         }
2186
2187         if (saving_throw(p_ptr->skill_sav - power))
2188         {
2189                 return;
2190         }
2191
2192         /* Else gain permanent insanity */
2193         if ((p_ptr->muta3 & MUT3_MORONIC) && /*(p_ptr->muta2 & MUT2_BERS_RAGE) &&*/
2194                 ((p_ptr->muta2 & MUT2_COWARDICE) || (p_ptr->resist_fear)) &&
2195                 ((p_ptr->muta2 & MUT2_HALLU) || (p_ptr->resist_chaos)))
2196         {
2197                 /* The poor bastard already has all possible insanities! */
2198                 return;
2199         }
2200
2201         while (!happened)
2202         {
2203                 switch (randint1(21))
2204                 {
2205                         case 1:
2206                                 if (!(p_ptr->muta3 & MUT3_MORONIC) && one_in_(5))
2207                                 {
2208                                         if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4))
2209                                         {
2210                                                 msg_print(_("あなたは完璧な馬鹿になったような気がした。しかしそれは元々だった。", "You turn into an utter moron!"));
2211                                         }
2212                                         else
2213                                         {
2214                                                 msg_print(_("あなたは完璧な馬鹿になった!", "You turn into an utter moron!"));
2215                                         }
2216
2217                                         if (p_ptr->muta3 & MUT3_HYPER_INT)
2218                                         {
2219                                                 msg_print(_("あなたの脳は生体コンピュータではなくなった。", "Your brain is no longer a living computer."));
2220                                                 p_ptr->muta3 &= ~(MUT3_HYPER_INT);
2221                                         }
2222                                         p_ptr->muta3 |= MUT3_MORONIC;
2223                                         happened = TRUE;
2224                                 }
2225                                 break;
2226                         case 2:
2227                         case 3:
2228                         case 4:
2229                         case 5:
2230                         case 6:
2231                         case 7:
2232                         case 8:
2233                         case 9:
2234                         case 10:
2235                         case 11:
2236                                 if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear)
2237                                 {
2238                                         msg_print(_("あなたはパラノイアになった!", "You become paranoid!"));
2239
2240                                         /* Duh, the following should never happen, but anyway... */
2241                                         if (p_ptr->muta3 & MUT3_FEARLESS)
2242                                         {
2243                                                 msg_print(_("あなたはもう恐れ知らずではなくなった。", "You are no longer fearless."));
2244                                                 p_ptr->muta3 &= ~(MUT3_FEARLESS);
2245                                         }
2246
2247                                         p_ptr->muta2 |= MUT2_COWARDICE;
2248                                         happened = TRUE;
2249                                 }
2250                                 break;
2251                         case 12:
2252                         case 13:
2253                         case 14:
2254                         case 15:
2255                         case 16:
2256                         case 17:
2257                         case 18:
2258                         case 19:
2259                         case 20:
2260                         case 21:
2261                                 if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos)
2262                                 {
2263                                         msg_print(_("幻覚をひき起こす精神錯乱に陥った!", "You are afflicted by a hallucinatory insanity!"));
2264                                         p_ptr->muta2 |= MUT2_HALLU;
2265                                         happened = TRUE;
2266                                 }
2267                                 break;
2268                         default:
2269                                 if (!(p_ptr->muta2 & MUT2_BERS_RAGE))
2270                                 {
2271                                         msg_print(_("激烈な感情の発作におそわれるようになった!", "You become subject to fits of berserk rage!"));
2272                                         p_ptr->muta2 |= MUT2_BERS_RAGE;
2273                                         happened = TRUE;
2274                                 }
2275                                 break;
2276                 }
2277         }
2278
2279         p_ptr->update |= PU_BONUS;
2280         handle_stuff();
2281 }
2282
2283 /*!
2284  * @brief モンスターの各情報を更新する / This function updates the monster record of the given monster
2285  * @param m_idx 更新するモンスター情報のID
2286  * @param full プレイヤーとの距離更新を行うならばtrue
2287  * @return なし
2288  * @details
2289  * This involves extracting the distance to the player (if requested),
2290  * and then checking for visibility (natural, infravision, see-invis,
2291  * telepathy), updating the monster visibility flag, redrawing (or
2292  * erasing) the monster when its visibility changes, and taking note
2293  * of any interesting monster flags (cold-blooded, invisible, etc).
2294  *
2295  * Note the new "mflag" field which encodes several monster state flags,
2296  * including "view" for when the monster is currently in line of sight,
2297  * and "mark" for when the monster is currently visible via detection.
2298  *
2299  * The only monster fields that are changed here are "cdis" (the
2300  * distance from the player), "ml" (visible to the player), and
2301  * "mflag" (to maintain the "MFLAG_VIEW" flag).
2302  *
2303  * Note the special "update_monsters()" function which can be used to
2304  * call this function once for every monster.
2305  *
2306  * Note the "full" flag which requests that the "cdis" field be updated,
2307  * this is only needed when the monster (or the player) has moved.
2308  *
2309  * Every time a monster moves, we must call this function for that
2310  * monster, and update the distance, and the visibility.  Every time
2311  * the player moves, we must call this function for every monster, and
2312  * update the distance, and the visibility.  Whenever the player "state"
2313  * changes in certain ways ("blindness", "infravision", "telepathy",
2314  * and "see invisible"), we must call this function for every monster,
2315  * and update the visibility.
2316  *
2317  * Routines that change the "illumination" of a grid must also call this
2318  * function for any monster in that grid, since the "visibility" of some
2319  * monsters may be based on the illumination of their grid.
2320  *
2321  * Note that this function is called once per monster every time the
2322  * player moves.  When the player is running, this function is one
2323  * of the primary bottlenecks, along with "update_view()" and the
2324  * "process_monsters()" code, so efficiency is important.
2325  *
2326  * Note the optimized "inline" version of the "distance()" function.
2327  *
2328  * A monster is "visible" to the player if (1) it has been detected
2329  * by the player, (2) it is close to the player and the player has
2330  * telepathy, or (3) it is close to the player, and in line of sight
2331  * of the player, and it is "illuminated" by some combination of
2332  * infravision, torch light, or permanent light (invisible monsters
2333  * are only affected by "light" if the player can see invisible).
2334  *
2335  * Monsters which are not on the current panel may be "visible" to
2336  * the player, and their descriptions will include an "offscreen"
2337  * reference.  Currently, offscreen monsters cannot be targetted
2338  * or viewed directly, but old targets will remain set.  XXX XXX
2339  *
2340  * The player can choose to be disturbed by several things, including
2341  * "disturb_move" (monster which is viewable moves in some way), and
2342  * "disturb_near" (monster which is "easily" viewable moves in some
2343  * way).  Note that "moves" includes "appears" and "disappears".
2344  */
2345 void update_mon(int m_idx, bool full)
2346 {
2347         monster_type *m_ptr = &m_list[m_idx];
2348
2349         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2350
2351         bool do_disturb = disturb_move;
2352
2353         int d;
2354
2355         /* Current location */
2356         int fy = m_ptr->fy;
2357         int fx = m_ptr->fx;
2358
2359         /* Seen at all */
2360         bool flag = FALSE;
2361
2362         /* Seen by vision */
2363         bool easy = FALSE;
2364
2365         /* Non-Ninja player in the darkness */
2366         bool in_darkness = (d_info[dungeon_type].flags1 & DF1_DARKNESS) && !p_ptr->see_nocto;
2367
2368         /* Do disturb? */
2369         if (disturb_high)
2370         {
2371                 monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
2372
2373                 if (ap_r_ptr->r_tkills && ap_r_ptr->level >= p_ptr->lev)
2374                         do_disturb = TRUE;
2375         }
2376
2377         /* Compute distance */
2378         if (full)
2379         {
2380                 /* Distance components */
2381                 int dy = (p_ptr->y > fy) ? (p_ptr->y - fy) : (fy - p_ptr->y);
2382                 int dx = (p_ptr->x > fx) ? (p_ptr->x - fx) : (fx - p_ptr->x);
2383
2384                 /* Approximate distance */
2385                 d = (dy > dx) ? (dy + (dx>>1)) : (dx + (dy>>1));
2386
2387                 /* Restrict distance */
2388                 if (d > 255) d = 255;
2389
2390                 if (!d) d = 1;
2391
2392                 /* Save the distance */
2393                 m_ptr->cdis = d;
2394         }
2395
2396         /* Extract distance */
2397         else
2398         {
2399                 /* Extract the distance */
2400                 d = m_ptr->cdis;
2401         }
2402
2403
2404         /* Detected */
2405         if (m_ptr->mflag2 & (MFLAG2_MARK)) flag = TRUE;
2406
2407
2408         /* Nearby */
2409         if (d <= (in_darkness ? MAX_SIGHT / 2 : MAX_SIGHT))
2410         {
2411                 if (!in_darkness || (d <= MAX_SIGHT / 4))
2412                 {
2413                         if (p_ptr->special_defense & KATA_MUSOU)
2414                         {
2415                                 /* Detectable */
2416                                 flag = TRUE;
2417
2418                                 if (is_original_ap(m_ptr) && !p_ptr->image)
2419                                 {
2420                                         /* Hack -- Memorize mental flags */
2421                                         if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
2422                                         if (r_ptr->flags2 & (RF2_STUPID)) r_ptr->r_flags2 |= (RF2_STUPID);
2423                                 }
2424                         }
2425
2426                         /* Basic telepathy */
2427                         /* Snipers get telepathy when they concentrate deeper */
2428                         else if (p_ptr->telepathy)
2429                         {
2430                                 /* Empty mind, no telepathy */
2431                                 if (r_ptr->flags2 & (RF2_EMPTY_MIND))
2432                                 {
2433                                         /* Memorize flags */
2434                                         if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
2435                                 }
2436
2437                                 /* Weird mind, occasional telepathy */
2438                                 else if (r_ptr->flags2 & (RF2_WEIRD_MIND))
2439                                 {
2440                                         /* One in ten individuals are detectable */
2441                                         if ((m_idx % 10) == 5)
2442                                         {
2443                                                 /* Detectable */
2444                                                 flag = TRUE;
2445
2446                                                 if (is_original_ap(m_ptr) && !p_ptr->image)
2447                                                 {
2448                                                         /* Memorize flags */
2449                                                         r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
2450
2451                                                         /* Hack -- Memorize mental flags */
2452                                                         if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
2453                                                         if (r_ptr->flags2 & (RF2_STUPID)) r_ptr->r_flags2 |= (RF2_STUPID);
2454                                                 }
2455                                         }
2456                                 }
2457
2458                                 /* Normal mind, allow telepathy */
2459                                 else
2460                                 {
2461                                         /* Detectable */
2462                                         flag = TRUE;
2463
2464                                         if (is_original_ap(m_ptr) && !p_ptr->image)
2465                                         {
2466                                                 /* Hack -- Memorize mental flags */
2467                                                 if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
2468                                                 if (r_ptr->flags2 & (RF2_STUPID)) r_ptr->r_flags2 |= (RF2_STUPID);
2469                                         }
2470                                 }
2471                         }
2472
2473                         /* Magical sensing */
2474                         if ((p_ptr->esp_animal) && (r_ptr->flags3 & (RF3_ANIMAL)))
2475                         {
2476                                 flag = TRUE;
2477                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_ANIMAL);
2478                         }
2479
2480                         /* Magical sensing */
2481                         if ((p_ptr->esp_undead) && (r_ptr->flags3 & (RF3_UNDEAD)))
2482                         {
2483                                 flag = TRUE;
2484                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_UNDEAD);
2485                         }
2486
2487                         /* Magical sensing */
2488                         if ((p_ptr->esp_demon) && (r_ptr->flags3 & (RF3_DEMON)))
2489                         {
2490                                 flag = TRUE;
2491                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_DEMON);
2492                         }
2493
2494                         /* Magical sensing */
2495                         if ((p_ptr->esp_orc) && (r_ptr->flags3 & (RF3_ORC)))
2496                         {
2497                                 flag = TRUE;
2498                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_ORC);
2499                         }
2500
2501                         /* Magical sensing */
2502                         if ((p_ptr->esp_troll) && (r_ptr->flags3 & (RF3_TROLL)))
2503                         {
2504                                 flag = TRUE;
2505                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_TROLL);
2506                         }
2507
2508                         /* Magical sensing */
2509                         if ((p_ptr->esp_giant) && (r_ptr->flags3 & (RF3_GIANT)))
2510                         {
2511                                 flag = TRUE;
2512                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_GIANT);
2513                         }
2514
2515                         /* Magical sensing */
2516                         if ((p_ptr->esp_dragon) && (r_ptr->flags3 & (RF3_DRAGON)))
2517                         {
2518                                 flag = TRUE;
2519                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_DRAGON);
2520                         }
2521
2522                         /* Magical sensing */
2523                         if ((p_ptr->esp_human) && (r_ptr->flags2 & (RF2_HUMAN)))
2524                         {
2525                                 flag = TRUE;
2526                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags2 |= (RF2_HUMAN);
2527                         }
2528
2529                         /* Magical sensing */
2530                         if ((p_ptr->esp_evil) && (r_ptr->flags3 & (RF3_EVIL)))
2531                         {
2532                                 flag = TRUE;
2533                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_EVIL);
2534                         }
2535
2536                         /* Magical sensing */
2537                         if ((p_ptr->esp_good) && (r_ptr->flags3 & (RF3_GOOD)))
2538                         {
2539                                 flag = TRUE;
2540                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_GOOD);
2541                         }
2542
2543                         /* Magical sensing */
2544                         if ((p_ptr->esp_nonliving) &&
2545                             ((r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) == RF3_NONLIVING))
2546                         {
2547                                 flag = TRUE;
2548                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_NONLIVING);
2549                         }
2550
2551                         /* Magical sensing */
2552                         if ((p_ptr->esp_unique) && (r_ptr->flags1 & (RF1_UNIQUE)))
2553                         {
2554                                 flag = TRUE;
2555                                 if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags1 |= (RF1_UNIQUE);
2556                         }
2557                 }
2558
2559                 /* Normal line of sight, and not blind */
2560                 if (player_has_los_bold(fy, fx) && !p_ptr->blind)
2561                 {
2562                         bool do_invisible = FALSE;
2563                         bool do_cold_blood = FALSE;
2564
2565                         /* Snipers can see targets in darkness when they concentrate deeper */
2566                         if (p_ptr->concent >= CONCENT_RADAR_THRESHOLD)
2567                         {
2568                                 /* Easy to see */
2569                                 easy = flag = TRUE;
2570                         }
2571
2572                         /* Use "infravision" */
2573                         if (d <= p_ptr->see_infra)
2574                         {
2575                                 /* Handle "cold blooded" monsters */
2576                                 if ((r_ptr->flags2 & (RF2_COLD_BLOOD | RF2_AURA_FIRE)) == RF2_COLD_BLOOD)
2577                                 {
2578                                         /* Take note */
2579                                         do_cold_blood = TRUE;
2580                                 }
2581
2582                                 /* Handle "warm blooded" monsters */
2583                                 else
2584                                 {
2585                                         /* Easy to see */
2586                                         easy = flag = TRUE;
2587                                 }
2588                         }
2589
2590                         /* Use "illumination" */
2591                         if (player_can_see_bold(fy, fx))
2592                         {
2593                                 /* Handle "invisible" monsters */
2594                                 if (r_ptr->flags2 & (RF2_INVISIBLE))
2595                                 {
2596                                         /* Take note */
2597                                         do_invisible = TRUE;
2598
2599                                         /* See invisible */
2600                                         if (p_ptr->see_inv)
2601                                         {
2602                                                 /* Easy to see */
2603                                                 easy = flag = TRUE;
2604                                         }
2605                                 }
2606
2607                                 /* Handle "normal" monsters */
2608                                 else
2609                                 {
2610                                         /* Easy to see */
2611                                         easy = flag = TRUE;
2612                                 }
2613                         }
2614
2615                         /* Visible */
2616                         if (flag)
2617                         {
2618                                 if (is_original_ap(m_ptr) && !p_ptr->image)
2619                                 {
2620                                         /* Memorize flags */
2621                                         if (do_invisible) r_ptr->r_flags2 |= (RF2_INVISIBLE);
2622                                         if (do_cold_blood) r_ptr->r_flags2 |= (RF2_COLD_BLOOD);
2623                                 }
2624                         }
2625                 }
2626         }
2627
2628
2629         /* The monster is now visible */
2630         if (flag)
2631         {
2632                 /* It was previously unseen */
2633                 if (!m_ptr->ml)
2634                 {
2635                         /* Mark as visible */
2636                         m_ptr->ml = TRUE;
2637
2638                         /* Draw the monster */
2639                         lite_spot(fy, fx);
2640
2641                         /* Update health bar as needed */
2642                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2643                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2644
2645                         /* Hack -- Count "fresh" sightings */
2646                         if (!p_ptr->image)
2647                         {
2648                                 if ((m_ptr->ap_r_idx == MON_KAGE) && (r_info[MON_KAGE].r_sights < MAX_SHORT))
2649                                         r_info[MON_KAGE].r_sights++;
2650                                 else if (is_original_ap(m_ptr) && (r_ptr->r_sights < MAX_SHORT))
2651                                         r_ptr->r_sights++;
2652                         }
2653
2654                         /* Eldritch Horror */
2655                         if (r_info[m_ptr->ap_r_idx].flags2 & RF2_ELDRITCH_HORROR)
2656                         {
2657                                 sanity_blast(m_ptr, FALSE);
2658                         }
2659
2660                         /* Disturb on appearance */
2661                         if (disturb_near && (projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)))
2662                         {
2663                                 if (disturb_pets || is_hostile(m_ptr))
2664                                         disturb(1, 1);
2665                         }
2666                 }
2667         }
2668
2669         /* The monster is not visible */
2670         else
2671         {
2672                 /* It was previously seen */
2673                 if (m_ptr->ml)
2674                 {
2675                         /* Mark as not visible */
2676                         m_ptr->ml = FALSE;
2677
2678                         /* Erase the monster */
2679                         lite_spot(fy, fx);
2680
2681                         /* Update health bar as needed */
2682                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2683                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2684
2685                         /* Disturb on disappearance */
2686                         if (do_disturb)
2687                         {
2688                                 if (disturb_pets || is_hostile(m_ptr))
2689                                         disturb(1, 1);
2690                         }
2691                 }
2692         }
2693
2694
2695         /* The monster is now easily visible */
2696         if (easy)
2697         {
2698                 /* Change */
2699                 if (!(m_ptr->mflag & (MFLAG_VIEW)))
2700                 {
2701                         /* Mark as easily visible */
2702                         m_ptr->mflag |= (MFLAG_VIEW);
2703
2704                         /* Disturb on appearance */
2705                         if (do_disturb)
2706                         {
2707                                 if (disturb_pets || is_hostile(m_ptr))
2708                                         disturb(1, 1);
2709                         }
2710                 }
2711         }
2712
2713         /* The monster is not easily visible */
2714         else
2715         {
2716                 /* Change */
2717                 if (m_ptr->mflag & (MFLAG_VIEW))
2718                 {
2719                         /* Mark as not easily visible */
2720                         m_ptr->mflag &= ~(MFLAG_VIEW);
2721
2722                         /* Disturb on disappearance */
2723                         if (do_disturb)
2724                         {
2725                                 if (disturb_pets || is_hostile(m_ptr))
2726                                         disturb(1, 1);
2727                         }
2728                 }
2729         }
2730 }
2731
2732
2733 /*!
2734  * @brief 単純に生存している全モンスターの更新処理を行う / This function simply updates all the (non-dead) monsters (see above).
2735  * @param full 距離更新を行うならtrue
2736  * @return なし
2737  */
2738 void update_monsters(bool full)
2739 {
2740         int i;
2741
2742         /* Update each (live) monster */
2743         for (i = 1; i < m_max; i++)
2744         {
2745                 monster_type *m_ptr = &m_list[i];
2746
2747                 /* Skip dead monsters */
2748                 if (!m_ptr->r_idx) continue;
2749
2750                 /* Update the monster */
2751                 update_mon(i, full);
2752         }
2753 }
2754
2755
2756 /*!
2757  * @brief カメレオンの王の変身対象となるモンスターかどうか判定する / Hack -- the index of the summoning monster
2758  * @param r_idx モンスター種族ID
2759  * @return 対象にできるならtrueを返す
2760  */
2761 static bool monster_hook_chameleon_lord(int r_idx)
2762 {
2763         monster_race *r_ptr = &r_info[r_idx];
2764         monster_type *m_ptr = &m_list[chameleon_change_m_idx];
2765         monster_race *old_r_ptr = &r_info[m_ptr->r_idx];
2766
2767         if (!(r_ptr->flags1 & (RF1_UNIQUE))) return FALSE;
2768         if (r_ptr->flags7 & (RF7_FRIENDLY | RF7_CHAMELEON)) return FALSE;
2769
2770         if (ABS(r_ptr->level - r_info[MON_CHAMELEON_K].level) > 5) return FALSE;
2771
2772         if ((r_ptr->blow[0].method == RBM_EXPLODE) || (r_ptr->blow[1].method == RBM_EXPLODE) || (r_ptr->blow[2].method == RBM_EXPLODE) || (r_ptr->blow[3].method == RBM_EXPLODE))
2773                 return FALSE;
2774
2775         if (!monster_can_cross_terrain(cave[m_ptr->fy][m_ptr->fx].feat, r_ptr, 0)) return FALSE;
2776
2777         /* Not born */
2778         if (!(old_r_ptr->flags7 & RF7_CHAMELEON))
2779         {
2780                 if (monster_has_hostile_align(m_ptr, 0, 0, r_ptr)) return FALSE;
2781         }
2782
2783         /* Born now */
2784         else if (summon_specific_who > 0)
2785         {
2786                 if (monster_has_hostile_align(&m_list[summon_specific_who], 0, 0, r_ptr)) return FALSE;
2787         }
2788
2789         return TRUE;
2790 }
2791
2792 /*!
2793  * @brief カメレオンの変身対象となるモンスターかどうか判定する / Hack -- the index of the summoning monster
2794  * @param r_idx モンスター種族ID
2795  * @return 対象にできるならtrueを返す
2796  */
2797 static bool monster_hook_chameleon(int r_idx)
2798 {
2799         monster_race *r_ptr = &r_info[r_idx];
2800         monster_type *m_ptr = &m_list[chameleon_change_m_idx];
2801         monster_race *old_r_ptr = &r_info[m_ptr->r_idx];
2802
2803         if (r_ptr->flags1 & (RF1_UNIQUE)) return FALSE;
2804         if (r_ptr->flags2 & RF2_MULTIPLY) return FALSE;
2805         if (r_ptr->flags7 & (RF7_FRIENDLY | RF7_CHAMELEON)) return FALSE;
2806         
2807         if ((r_ptr->blow[0].method == RBM_EXPLODE) || (r_ptr->blow[1].method == RBM_EXPLODE) || (r_ptr->blow[2].method == RBM_EXPLODE) || (r_ptr->blow[3].method == RBM_EXPLODE))
2808                 return FALSE;
2809
2810         if (!monster_can_cross_terrain(cave[m_ptr->fy][m_ptr->fx].feat, r_ptr, 0)) return FALSE;
2811
2812         /* Not born */
2813         if (!(old_r_ptr->flags7 & RF7_CHAMELEON))
2814         {
2815                 if ((old_r_ptr->flags3 & RF3_GOOD) && !(r_ptr->flags3 & RF3_GOOD)) return FALSE;
2816                 if ((old_r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags3 & RF3_EVIL)) return FALSE;
2817                 if (!(old_r_ptr->flags3 & (RF3_GOOD | RF3_EVIL)) && (r_ptr->flags3 & (RF3_GOOD | RF3_EVIL))) return FALSE;
2818         }
2819
2820         /* Born now */
2821         else if (summon_specific_who > 0)
2822         {
2823                 if (monster_has_hostile_align(&m_list[summon_specific_who], 0, 0, r_ptr)) return FALSE;
2824         }
2825
2826         return (*(get_monster_hook()))(r_idx);
2827 }
2828
2829 /*!
2830  * @brief モンスターの変身処理
2831  * @param m_idx 変身処理を受けるモンスター情報のID
2832  * @param born 生成時の初変身先指定ならばtrue
2833  * @param r_idx 旧モンスター種族のID
2834  * @return なし
2835  */
2836 void choose_new_monster(int m_idx, bool born, int r_idx)
2837 {
2838         int oldmaxhp;
2839         monster_type *m_ptr = &m_list[m_idx];
2840         monster_race *r_ptr;
2841         char old_m_name[80];
2842         bool old_unique = FALSE;
2843         int old_r_idx = m_ptr->r_idx;
2844
2845         if (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE)
2846                 old_unique = TRUE;
2847         if (old_unique && (r_idx == MON_CHAMELEON)) r_idx = MON_CHAMELEON_K;
2848         r_ptr = &r_info[r_idx];
2849
2850         monster_desc(old_m_name, m_ptr, 0);
2851
2852         if (!r_idx)
2853         {
2854                 int level;
2855
2856                 chameleon_change_m_idx = m_idx;
2857                 if (old_unique)
2858                         get_mon_num_prep(monster_hook_chameleon_lord, NULL);
2859                 else
2860                         get_mon_num_prep(monster_hook_chameleon, NULL);
2861
2862                 if (old_unique)
2863                         level = r_info[MON_CHAMELEON_K].level;
2864                 else if (!dun_level)
2865                         level = wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].level;
2866                 else
2867                         level = dun_level;
2868
2869                 if (d_info[dungeon_type].flags1 & DF1_CHAMELEON) level+= 2+randint1(3);
2870
2871                 r_idx = get_mon_num(level);
2872                 r_ptr = &r_info[r_idx];
2873
2874                 chameleon_change_m_idx = 0;
2875
2876                 /* Paranoia */
2877                 if (!r_idx) return;
2878         }
2879
2880         if (is_pet(m_ptr)) check_pets_num_and_align(m_ptr, FALSE);
2881
2882         m_ptr->r_idx = r_idx;
2883         m_ptr->ap_r_idx = r_idx;
2884         update_mon(m_idx, FALSE);
2885         lite_spot(m_ptr->fy, m_ptr->fx);
2886
2887         if ((r_info[old_r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) ||
2888             (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)))
2889                 p_ptr->update |= (PU_MON_LITE);
2890
2891         if (is_pet(m_ptr)) check_pets_num_and_align(m_ptr, TRUE);
2892
2893         if (born)
2894         {
2895                 /* Sub-alignment of a chameleon */
2896                 if (r_ptr->flags3 & (RF3_EVIL | RF3_GOOD))
2897                 {
2898                         m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
2899                         if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;
2900                         if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;
2901                 }
2902                 return;
2903         }
2904
2905         if (m_idx == p_ptr->riding)
2906         {
2907                 char m_name[80];
2908                 monster_desc(m_name, m_ptr, 0);
2909                 msg_format(_("突然%sが変身した。", "Suddenly, %s transforms!"), old_m_name);
2910                 if (!(r_ptr->flags7 & RF7_RIDING))
2911                         if (rakuba(0, TRUE)) msg_format(_("地面に落とされた。", "You have fallen from %s."), m_name);
2912         }
2913
2914         /* Extract the monster base speed */
2915         m_ptr->mspeed = get_mspeed(r_ptr);
2916
2917         oldmaxhp = m_ptr->max_maxhp;
2918         /* Assign maximal hitpoints */
2919         if (r_ptr->flags1 & RF1_FORCE_MAXHP)
2920         {
2921                 m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
2922         }
2923         else
2924         {
2925                 m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
2926         }
2927
2928         /* Monsters have double hitpoints in Nightmare mode */
2929         if (ironman_nightmare)
2930         {
2931                 u32b hp = m_ptr->max_maxhp * 2L;
2932                 m_ptr->max_maxhp = (s16b)MIN(30000, hp);
2933         }
2934
2935         m_ptr->maxhp = (long)(m_ptr->maxhp * m_ptr->max_maxhp) / oldmaxhp;
2936         if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
2937         m_ptr->hp = (long)(m_ptr->hp * m_ptr->max_maxhp) / oldmaxhp;
2938         
2939         /* reset dealt_damage */
2940         m_ptr->dealt_damage = 0;
2941 }
2942
2943
2944 /*!
2945  * @brief たぬきの変身対象となるモンスターかどうか判定する / Hook for Tanuki
2946  * @param r_idx モンスター種族ID
2947  * @return 対象にできるならtrueを返す
2948  */
2949 static bool monster_hook_tanuki(int r_idx)
2950 {
2951         monster_race *r_ptr = &r_info[r_idx];
2952
2953         if (r_ptr->flags1 & (RF1_UNIQUE)) return FALSE;
2954         if (r_ptr->flags2 & RF2_MULTIPLY) return FALSE;
2955         if (r_ptr->flags7 & (RF7_FRIENDLY | RF7_CHAMELEON)) return FALSE;
2956         if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
2957         
2958         if ((r_ptr->blow[0].method == RBM_EXPLODE) || (r_ptr->blow[1].method == RBM_EXPLODE) || (r_ptr->blow[2].method == RBM_EXPLODE) || (r_ptr->blow[3].method == RBM_EXPLODE))
2959                 return FALSE;
2960
2961         return (*(get_monster_hook()))(r_idx);
2962 }
2963
2964
2965 /*!
2966  * @brief モンスターの表層IDを設定する / Set initial racial appearance of a monster
2967  * @param r_idx モンスター種族ID
2968  * @return モンスター種族の表層ID
2969  */
2970 static int initial_r_appearance(int r_idx)
2971 {
2972         int attempts = 1000;
2973
2974         int ap_r_idx;
2975         int min = MIN(base_level-5, 50);
2976
2977         if (!(r_info[r_idx].flags7 & RF7_TANUKI))
2978                 return r_idx;
2979
2980         get_mon_num_prep(monster_hook_tanuki, NULL);
2981
2982         while (--attempts)
2983         {
2984                 ap_r_idx = get_mon_num(base_level + 10);
2985                 if (r_info[ap_r_idx].level >= min) return ap_r_idx;
2986         }
2987
2988         return r_idx;
2989 }
2990
2991
2992 /*!
2993  * @brief モンスターの個体加速を設定する / Get initial monster speed
2994  * @param r_ptr モンスター種族の参照ポインタ
2995  * @return 加速値
2996  */
2997 byte get_mspeed(monster_race *r_ptr)
2998 {
2999         /* Extract the monster base speed */
3000         int mspeed = r_ptr->speed;
3001
3002         /* Hack -- small racial variety */
3003         if (!(r_ptr->flags1 & RF1_UNIQUE) && !p_ptr->inside_arena)
3004         {
3005                 /* Allow some small variation per monster */
3006                 int i = SPEED_TO_ENERGY(r_ptr->speed) / (one_in_(4) ? 3 : 10);
3007                 if (i) mspeed += rand_spread(0, i);
3008         }
3009
3010         if (mspeed > 199) mspeed = 199;
3011
3012         return (byte)mspeed;
3013 }
3014
3015
3016 /*!
3017  * @brief モンスターを一体生成する / Attempt to place a monster of the given race at the given location.
3018  * @param who 召喚を行ったモンスターID
3019  * @param y 生成位置y座標
3020  * @param x 生成位置x座標
3021  * @param r_idx 生成モンスター種族
3022  * @param mode 生成オプション
3023  * @return 成功したらtrue
3024  * @details 
3025  * To give the player a sporting chance, any monster that appears in
3026  * line-of-sight and is extremely dangerous can be marked as
3027  * "FORCE_SLEEP", which will cause them to be placed with low energy,
3028  * which often (but not always) lets the player move before they do.
3029  *
3030  * This routine refuses to place out-of-depth "FORCE_DEPTH" monsters.
3031  *
3032  * XXX XXX XXX Use special "here" and "dead" flags for unique monsters,
3033  * remove old "cur_num" and "max_num" fields.
3034  *
3035  * XXX XXX XXX Actually, do something similar for artifacts, to simplify
3036  * the "preserve" mode, and to make the "what artifacts" flag more useful.
3037  *
3038  * This is the only function which may place a monster in the dungeon,
3039  * except for the savefile loading code.
3040  */
3041 static bool place_monster_one(int who, int y, int x, int r_idx, u32b mode)
3042 {
3043         /* Access the location */
3044         cave_type               *c_ptr = &cave[y][x];
3045         monster_type    *m_ptr;
3046         monster_race    *r_ptr = &r_info[r_idx];
3047         cptr            name = (r_name + r_ptr->name);
3048
3049         int cmi;
3050
3051         /* DO NOT PLACE A MONSTER IN THE SMALL SCALE WILDERNESS !!! */
3052         if (p_ptr->wild_mode) return FALSE;
3053
3054         /* Verify location */
3055         if (!in_bounds(y, x)) return (FALSE);
3056
3057         /* Paranoia */
3058         if (!r_idx) return (FALSE);
3059
3060         /* Paranoia */
3061         if (!r_ptr->name) return (FALSE);
3062
3063         if (!(mode & PM_IGNORE_TERRAIN))
3064         {
3065                 /* Not on the Pattern */
3066                 if (pattern_tile(y, x)) return FALSE;
3067
3068                 /* Require empty space (if not ghostly) */
3069                 if (!monster_can_enter(y, x, r_ptr, 0)) return FALSE;
3070         }
3071
3072         if (!p_ptr->inside_battle)
3073         {
3074                 /* Hack -- "unique" monsters must be "unique" */
3075                 if (((r_ptr->flags1 & (RF1_UNIQUE)) ||
3076                      (r_ptr->flags7 & (RF7_NAZGUL))) &&
3077                     (r_ptr->cur_num >= r_ptr->max_num))
3078                 {
3079                         /* Cannot create */
3080                         return (FALSE);
3081                 }
3082
3083                 if ((r_ptr->flags7 & (RF7_UNIQUE2)) &&
3084                     (r_ptr->cur_num >= 1))
3085                 {
3086                         return (FALSE);
3087                 }
3088
3089                 if (r_idx == MON_BANORLUPART)
3090                 {
3091                         if (r_info[MON_BANOR].cur_num > 0) return FALSE;
3092                         if (r_info[MON_LUPART].cur_num > 0) return FALSE;
3093                 }
3094
3095                 /* Depth monsters may NOT be created out of depth, unless in Nightmare mode */
3096                 if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) && (dun_level < r_ptr->level) &&
3097                     (!ironman_nightmare || (r_ptr->flags1 & (RF1_QUESTOR))))
3098                 {
3099                         /* Cannot create */
3100                         return (FALSE);
3101                 }
3102         }
3103
3104         if (quest_number(dun_level))
3105         {
3106                 int hoge = quest_number(dun_level);
3107                 if ((quest[hoge].type == QUEST_TYPE_KILL_LEVEL) || (quest[hoge].type == QUEST_TYPE_RANDOM))
3108                 {
3109                         if(r_idx == quest[hoge].r_idx)
3110                         {
3111                                 int number_mon, i2, j2;
3112                                 number_mon = 0;
3113
3114                                 /* Count all quest monsters */
3115                                 for (i2 = 0; i2 < cur_wid; ++i2)
3116                                         for (j2 = 0; j2 < cur_hgt; j2++)
3117                                                 if (cave[j2][i2].m_idx > 0)
3118                                                         if (m_list[cave[j2][i2].m_idx].r_idx == quest[hoge].r_idx)
3119                                                                 number_mon++;
3120                                 if(number_mon + quest[hoge].cur_num >= quest[hoge].max_num)
3121                                         return FALSE;
3122                         }
3123                 }
3124         }
3125
3126         if (is_glyph_grid(c_ptr))
3127         {
3128                 if (randint1(BREAK_GLYPH) < (r_ptr->level+20))
3129                 {
3130                         /* Describe observable breakage */
3131                         if (c_ptr->info & CAVE_MARK)
3132                         {
3133                                 msg_print(_("守りのルーンが壊れた!", "The rune of protection is broken!"));
3134                         }
3135
3136                         /* Forget the rune */
3137                         c_ptr->info &= ~(CAVE_MARK);
3138
3139                         /* Break the rune */
3140                         c_ptr->info &= ~(CAVE_OBJECT);
3141                         c_ptr->mimic = 0;
3142
3143                         /* Notice */
3144                         note_spot(y, x);
3145                 }
3146                 else return FALSE;
3147         }
3148
3149         if (cheat_hear)
3150         {
3151                 msg_format(_("WIZ: モンスター (%s)[Lv%d]を生成しました。", "WIZ: Monster (%s)[Lv%d]."), name, r_ptr->level);
3152         }
3153
3154         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL) || (r_ptr->level < 10)) mode &= ~PM_KAGE;
3155
3156         /* Make a new monster */
3157         c_ptr->m_idx = m_pop();
3158         hack_m_idx_ii = c_ptr->m_idx;
3159
3160         /* Mega-Hack -- catch "failure" */
3161         if (!c_ptr->m_idx) return (FALSE);
3162
3163
3164         /* Get a new monster record */
3165         m_ptr = &m_list[c_ptr->m_idx];
3166
3167         /* Save the race */
3168         m_ptr->r_idx = r_idx;
3169         m_ptr->ap_r_idx = initial_r_appearance(r_idx);
3170
3171         /* No flags */
3172         m_ptr->mflag = 0;
3173         m_ptr->mflag2 = 0;
3174
3175         /* Hack -- Appearance transfer */
3176         if ((mode & PM_MULTIPLY) && (who > 0) && !is_original_ap(&m_list[who]))
3177         {
3178                 m_ptr->ap_r_idx = m_list[who].ap_r_idx;
3179
3180                 /* Hack -- Shadower spawns Shadower */
3181                 if (m_list[who].mflag2 & MFLAG2_KAGE) m_ptr->mflag2 |= MFLAG2_KAGE;
3182         }
3183
3184         /* Sub-alignment of a monster */
3185         if ((who > 0) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))
3186                 m_ptr->sub_align = m_list[who].sub_align;
3187         else
3188         {
3189                 m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
3190                 if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;
3191                 if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;
3192         }
3193
3194         /* Place the monster at the location */
3195         m_ptr->fy = y;
3196         m_ptr->fx = x;
3197
3198
3199         /* No "timed status" yet */
3200         for (cmi = 0; cmi < MAX_MTIMED; cmi++) m_ptr->mtimed[cmi] = 0;
3201
3202         /* Unknown distance */
3203         m_ptr->cdis = 0;
3204
3205         reset_target(m_ptr);
3206
3207         m_ptr->nickname = 0;
3208
3209         m_ptr->exp = 0;
3210
3211
3212         /* Your pet summons its pet. */
3213         if (who > 0 && is_pet(&m_list[who]))
3214         {
3215                 mode |= PM_FORCE_PET;
3216                 m_ptr->parent_m_idx = who;
3217         }
3218         else
3219         {
3220                 m_ptr->parent_m_idx = 0;
3221         }
3222
3223         if (r_ptr->flags7 & RF7_CHAMELEON)
3224         {
3225                 choose_new_monster(c_ptr->m_idx, TRUE, 0);
3226                 r_ptr = &r_info[m_ptr->r_idx];
3227                 m_ptr->mflag2 |= MFLAG2_CHAMELEON;
3228
3229                 /* Hack - Set sub_align to neutral when the Chameleon Lord is generated as "GUARDIAN" */
3230                 if ((r_ptr->flags1 & RF1_UNIQUE) && (who <= 0))
3231                         m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
3232         }
3233         else if ((mode & PM_KAGE) && !(mode & PM_FORCE_PET))
3234         {
3235                 m_ptr->ap_r_idx = MON_KAGE;
3236                 m_ptr->mflag2 |= MFLAG2_KAGE;
3237         }
3238
3239         if (mode & PM_NO_PET) m_ptr->mflag2 |= MFLAG2_NOPET;
3240
3241         /* Not visible */
3242         m_ptr->ml = FALSE;
3243
3244         /* Pet? */
3245         if (mode & PM_FORCE_PET)
3246         {
3247                 set_pet(m_ptr);
3248         }
3249         /* Friendly? */
3250         else if ((r_ptr->flags7 & RF7_FRIENDLY) ||
3251                  (mode & PM_FORCE_FRIENDLY) || is_friendly_idx(who))
3252         {
3253                 if (!monster_has_hostile_align(NULL, 0, -1, r_ptr)) set_friendly(m_ptr);
3254         }
3255
3256         /* Assume no sleeping */
3257         m_ptr->mtimed[MTIMED_CSLEEP] = 0;
3258
3259         /* Enforce sleeping if needed */
3260         if ((mode & PM_ALLOW_SLEEP) && r_ptr->sleep && !ironman_nightmare)
3261         {
3262                 int val = r_ptr->sleep;
3263                 (void)set_monster_csleep(c_ptr->m_idx, (val * 2) + randint1(val * 10));
3264         }
3265
3266         /* Assign maximal hitpoints */
3267         if (r_ptr->flags1 & RF1_FORCE_MAXHP)
3268         {
3269                 m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
3270         }
3271         else
3272         {
3273                 m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
3274         }
3275
3276         /* Monsters have double hitpoints in Nightmare mode */
3277         if (ironman_nightmare)
3278         {
3279                 u32b hp = m_ptr->max_maxhp * 2L;
3280
3281                 m_ptr->max_maxhp = (s16b)MIN(30000, hp);
3282         }
3283
3284         m_ptr->maxhp = m_ptr->max_maxhp;
3285
3286         /* And start out fully healthy */
3287         if (m_ptr->r_idx == MON_WOUNDED_BEAR)
3288                 m_ptr->hp = m_ptr->maxhp / 2;
3289         else m_ptr->hp = m_ptr->maxhp;
3290         
3291         
3292         /* dealt damage is 0 at initial*/
3293         m_ptr->dealt_damage = 0;
3294
3295
3296         /* Extract the monster base speed */
3297         m_ptr->mspeed = get_mspeed(r_ptr);
3298
3299         if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100);
3300
3301         /* Give a random starting energy */
3302         if (!ironman_nightmare)
3303         {
3304                 m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100);
3305         }
3306         else
3307         {
3308                 /* Nightmare monsters are more prepared */
3309                 m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100) * 2;
3310         }
3311
3312         /* Force monster to wait for player, unless in Nightmare mode */
3313         if ((r_ptr->flags1 & RF1_FORCE_SLEEP) && !ironman_nightmare)
3314         {
3315                 /* Monster is still being nice */
3316                 m_ptr->mflag |= (MFLAG_NICE);
3317
3318                 /* Must repair monsters */
3319                 repair_monsters = TRUE;
3320         }
3321
3322         /* Hack -- see "process_monsters()" */
3323         if (c_ptr->m_idx < hack_m_idx)
3324         {
3325                 /* Monster is still being born */
3326                 m_ptr->mflag |= (MFLAG_BORN);
3327         }
3328
3329
3330         if (r_ptr->flags7 & RF7_SELF_LD_MASK)
3331                 p_ptr->update |= (PU_MON_LITE);
3332         else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !MON_CSLEEP(m_ptr))
3333                 p_ptr->update |= (PU_MON_LITE);
3334
3335         /* Update the monster */
3336         update_mon(c_ptr->m_idx, TRUE);
3337
3338
3339         /* Count the monsters on the level */
3340         real_r_ptr(m_ptr)->cur_num++;
3341
3342         /*
3343          * Memorize location of the unique monster in saved floors.
3344          * A unique monster move from old saved floor.
3345          */
3346         if (character_dungeon &&
3347             ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)))
3348                 real_r_ptr(m_ptr)->floor_id = p_ptr->floor_id;
3349
3350         /* Hack -- Count the number of "reproducers" */
3351         if (r_ptr->flags2 & RF2_MULTIPLY) num_repro++;
3352
3353         /* Hack -- Notice new multi-hued monsters */
3354         {
3355                 monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
3356                 if (ap_r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER))
3357                         shimmer_monsters = TRUE;
3358         }
3359
3360         if (p_ptr->warning && character_dungeon)
3361         {
3362                 if (r_ptr->flags1 & RF1_UNIQUE)
3363                 {
3364                         cptr color;
3365                         object_type *o_ptr;
3366                         char o_name[MAX_NLEN];
3367
3368                         if (r_ptr->level > p_ptr->lev + 30)
3369                                 color = _("黒く", "black");
3370                         else if (r_ptr->level > p_ptr->lev + 15)
3371                                 color = _("紫色に", "purple");
3372                         else if (r_ptr->level > p_ptr->lev + 5)
3373                                 color = _("ルビー色に", "deep red");
3374                         else if (r_ptr->level > p_ptr->lev - 5)
3375                                 color = _("赤く", "red");
3376                         else if (r_ptr->level > p_ptr->lev - 15)
3377                                 color = _("ピンク色に", "pink");
3378                         else
3379                                 color = _("白く", "white");
3380
3381                         o_ptr = choose_warning_item();
3382                         if (o_ptr)
3383                         {
3384                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3385                                 msg_format(_("%sは%s光った。", "%s glows %s."), o_name, color);
3386                         }
3387                         else
3388                         {
3389                                 msg_format(_("%s光る物が頭に浮かんだ。", "An %s image forms in your mind."), color);
3390                         }
3391                 }
3392         }
3393
3394         if (is_explosive_rune_grid(c_ptr))
3395         {
3396                 /* Break the ward */
3397                 if (randint1(BREAK_MINOR_GLYPH) > r_ptr->level)
3398                 {
3399                         /* Describe observable breakage */
3400                         if (c_ptr->info & CAVE_MARK)
3401                         {
3402                                 msg_print(_("ルーンが爆発した!", "The rune explodes!"));
3403                                 project(0, 2, y, x, 2 * (p_ptr->lev + damroll(7, 7)), GF_MANA, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
3404                         }
3405                 }
3406                 else
3407                 {
3408                         msg_print(_("爆発のルーンは解除された。", "An explosive rune was disarmed."));
3409                 }
3410
3411                 /* Forget the rune */
3412                 c_ptr->info &= ~(CAVE_MARK);
3413
3414                 /* Break the rune */
3415                 c_ptr->info &= ~(CAVE_OBJECT);
3416                 c_ptr->mimic = 0;
3417
3418                 note_spot(y, x);
3419                 lite_spot(y, x);
3420         }
3421
3422         /* Success */
3423         return (TRUE);
3424 }
3425
3426
3427
3428 #define MON_SCAT_MAXD 10 /*!< mon_scatter()関数によるモンスター配置で許される中心からの最大距離 */
3429
3430 /*!
3431  * @brief モンスター1体を目標地点に可能ながり近い位置に生成する / improved version of scatter() for place monster
3432  * @param r_idx 生成モンスター種族
3433  * @param yp 結果生成位置y座標
3434  * @param xp 結果生成位置x座標
3435  * @param y 中心生成位置y座標
3436  * @param x 中心生成位置x座標
3437  * @param max_dist 生成位置の最大半径
3438  * @return 成功したらtrue
3439  *  
3440  */
3441 static bool mon_scatter(int r_idx, int *yp, int *xp, int y, int x, int max_dist)
3442 {
3443         int place_x[MON_SCAT_MAXD];
3444         int place_y[MON_SCAT_MAXD];
3445         int num[MON_SCAT_MAXD];
3446         int i;
3447         int nx, ny;
3448
3449         if (max_dist >= MON_SCAT_MAXD)
3450                 return FALSE;
3451
3452         for (i = 0; i < MON_SCAT_MAXD; i++)
3453                 num[i] = 0;
3454
3455         for (nx = x - max_dist; nx <= x + max_dist; nx++)
3456         {
3457                 for (ny = y - max_dist; ny <= y + max_dist; ny++)
3458                 {
3459                         /* Ignore annoying locations */
3460                         if (!in_bounds(ny, nx)) continue;
3461
3462                         /* Require "line of projection" */
3463                         if (!projectable(y, x, ny, nx)) continue;
3464
3465                         if (r_idx > 0)
3466                         {
3467                                 monster_race *r_ptr = &r_info[r_idx];
3468
3469                                 /* Require empty space (if not ghostly) */
3470                                 if (!monster_can_enter(ny, nx, r_ptr, 0))
3471                                         continue;
3472                         }
3473                         else
3474                         {
3475                                 /* Walls and Monsters block flow */
3476                                 if (!cave_empty_bold2(ny, nx)) continue;
3477
3478                                 /* ... nor on the Pattern */
3479                                 if (pattern_tile(ny, nx)) continue;
3480                         }
3481
3482                         i = distance(y, x, ny, nx);
3483
3484                         if (i > max_dist)
3485                                 continue;
3486
3487                         num[i]++;
3488
3489                         /* random swap */
3490                         if (one_in_(num[i]))
3491                         {
3492                                 place_x[i] = nx;
3493                                 place_y[i] = ny;
3494                         }
3495                 }
3496         }
3497
3498         i = 0;
3499         while (i < MON_SCAT_MAXD && 0 == num[i])
3500                 i++;
3501         if (i >= MON_SCAT_MAXD)
3502                 return FALSE;
3503
3504         *xp = place_x[i];
3505         *yp = place_y[i];
3506
3507         return TRUE;
3508 }
3509
3510 #define GROUP_MAX 32 /*!< place_monster_group() 関数によるモンスターのGROUP生成時の配置最大数 / Maximum size of a group of monsters */
3511
3512 /*!
3513  * @brief モンスターを目標地点に集団生成する / Attempt to place a "group" of monsters around the given location
3514  * @param who 召喚主のモンスター情報ID
3515  * @param y 中心生成位置y座標
3516  * @param x 中心生成位置x座標
3517  * @param r_idx 生成モンスター種族
3518  * @param mode 生成オプション
3519  * @return 成功したらtrue
3520  */
3521 static bool place_monster_group(int who, int y, int x, int r_idx, u32b mode)
3522 {
3523         monster_race *r_ptr = &r_info[r_idx];
3524
3525         int n, i;
3526         int total = 0, extra = 0;
3527
3528         int hack_n = 0;
3529
3530         byte hack_y[GROUP_MAX];
3531         byte hack_x[GROUP_MAX];
3532
3533
3534         /* Pick a group size */
3535         total = randint1(10);
3536
3537         /* Hard monsters, small groups */
3538         if (r_ptr->level > dun_level)
3539         {
3540                 extra = r_ptr->level - dun_level;
3541                 extra = 0 - randint1(extra);
3542         }
3543
3544         /* Easy monsters, large groups */
3545         else if (r_ptr->level < dun_level)
3546         {
3547                 extra = dun_level - r_ptr->level;
3548                 extra = randint1(extra);
3549         }
3550
3551         /* Hack -- limit group reduction */
3552         if (extra > 9) extra = 9;
3553
3554         /* Modify the group size */
3555         total += extra;
3556
3557         /* Minimum size */
3558         if (total < 1) total = 1;
3559
3560         /* Maximum size */
3561         if (total > GROUP_MAX) total = GROUP_MAX;
3562
3563
3564         /* Start on the monster */
3565         hack_n = 1;
3566         hack_x[0] = x;
3567         hack_y[0] = y;
3568
3569         /* Puddle monsters, breadth first, up to total */
3570         for (n = 0; (n < hack_n) && (hack_n < total); n++)
3571         {
3572                 /* Grab the location */
3573                 int hx = hack_x[n];
3574                 int hy = hack_y[n];
3575
3576                 /* Check each direction, up to total */
3577                 for (i = 0; (i < 8) && (hack_n < total); i++)
3578                 {
3579                         int mx, my;
3580
3581                         scatter(&my, &mx, hy, hx, 4, 0);
3582
3583                         /* Walls and Monsters block flow */
3584                         if (!cave_empty_bold2(my, mx)) continue;
3585
3586                         /* Attempt to place another monster */
3587                         if (place_monster_one(who, my, mx, r_idx, mode))
3588                         {
3589                                 /* Add it to the "hack" set */
3590                                 hack_y[hack_n] = my;
3591                                 hack_x[hack_n] = mx;
3592                                 hack_n++;
3593                         }
3594                 }
3595         }
3596
3597
3598         /* Success */
3599         return (TRUE);
3600 }
3601
3602 /*!
3603  * @var place_monster_idx
3604  * @brief 護衛対象となるモンスター種族IDを渡すグローバル変数 / Hack -- help pick an escort type
3605  * @todo 関数ポインタの都合を配慮しながら、グローバル変数place_monster_idxを除去し、関数引数化する
3606  */
3607 static int place_monster_idx = 0;
3608
3609 /*!
3610  * @var place_monster_m_idx
3611  * @brief 護衛対象となるモンスターIDを渡すグローバル変数 / Hack -- help pick an escort type
3612  * @todo 関数ポインタの都合を配慮しながら、グローバル変数place_monster_m_idxを除去し、関数引数化する
3613  */
3614 static int place_monster_m_idx = 0;
3615
3616 /*!
3617  * @brief モンスター種族が召喚主の護衛となれるかどうかをチェックする / Hack -- help pick an escort type
3618  * @param r_idx チェックするモンスター種族のID
3619  * @return 護衛にできるならばtrue
3620  */
3621 static bool place_monster_can_escort(int r_idx)
3622 {
3623         monster_race *r_ptr = &r_info[place_monster_idx];
3624         monster_type *m_ptr = &m_list[place_monster_m_idx];
3625
3626         monster_race *z_ptr = &r_info[r_idx];
3627
3628         /* Hack - Escorts have to have the same dungeon flag */
3629         if (mon_hook_dungeon(place_monster_idx) != mon_hook_dungeon(r_idx)) return (FALSE);
3630
3631         /* Require similar "race" */
3632         if (z_ptr->d_char != r_ptr->d_char) return (FALSE);
3633
3634         /* Skip more advanced monsters */
3635         if (z_ptr->level > r_ptr->level) return (FALSE);
3636
3637         /* Skip unique monsters */
3638         if (z_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3639
3640         /* Paranoia -- Skip identical monsters */
3641         if (place_monster_idx == r_idx) return (FALSE);
3642
3643         /* Skip different alignment */
3644         if (monster_has_hostile_align(m_ptr, 0, 0, z_ptr)) return FALSE;
3645
3646         if (r_ptr->flags7 & RF7_FRIENDLY)
3647         {
3648                 if (monster_has_hostile_align(NULL, 1, -1, z_ptr)) return FALSE;
3649         }
3650
3651         if ((r_ptr->flags7 & RF7_CHAMELEON) && !(z_ptr->flags7 & RF7_CHAMELEON))
3652                 return FALSE;
3653
3654         /* Okay */
3655         return (TRUE);
3656 }
3657
3658
3659 /*!
3660  * @brief 一般的なモンスター生成処理のサブルーチン / Attempt to place a monster of the given race at the given location
3661  * @param who 召喚主のモンスター情報ID
3662  * @param y 生成地点y座標
3663  * @param x 生成地点x座標
3664  * @param r_idx 生成するモンスターの種族ID
3665  * @param mode 生成オプション
3666  * @return 生成に成功したらtrue
3667  * @details
3668  * Note that certain monsters are now marked as requiring "friends".
3669  * These monsters, if successfully placed, and if the "grp" parameter
3670  * is TRUE, will be surrounded by a "group" of identical monsters.
3671  *
3672  * Note that certain monsters are now marked as requiring an "escort",
3673  * which is a collection of monsters with similar "race" but lower level.
3674  *
3675  * Some monsters induce a fake "group" flag on their escorts.
3676  *
3677  * Note the "bizarre" use of non-recursion to prevent annoying output
3678  * when running a code profiler.
3679  *
3680  * Note the use of the new "monster allocation table" code to restrict
3681  * the "get_mon_num()" function to "legal" escort types.
3682  */
3683 bool place_monster_aux(int who, int y, int x, int r_idx, u32b mode)
3684 {
3685         int             i, j, n;
3686         monster_race    *r_ptr = &r_info[r_idx];
3687
3688         if (!(mode & PM_NO_KAGE) && one_in_(333))
3689                 mode |= PM_KAGE;
3690
3691         /* Place one monster, or fail */
3692         if (!place_monster_one(who, y, x, r_idx, mode)) return (FALSE);
3693
3694         /* Require the "group" flag */
3695         if (!(mode & PM_ALLOW_GROUP)) return (TRUE);
3696
3697         place_monster_m_idx = hack_m_idx_ii;
3698
3699         /* Reinforcement */
3700         for(i = 0; i < 6; i++)
3701         {
3702                 if(!r_ptr->reinforce_id[i]) break;
3703                 n = damroll(r_ptr->reinforce_dd[i], r_ptr->reinforce_ds[i]);
3704                 for(j = 0; j < n; j++)
3705                 {
3706                         int nx, ny, d = 7;
3707                         scatter(&ny, &nx, y, x, d, 0);
3708                         (void)place_monster_one(place_monster_m_idx, ny, nx, r_ptr->reinforce_id[i], mode);
3709                 }
3710         }
3711
3712         /* Friends for certain monsters */
3713         if (r_ptr->flags1 & (RF1_FRIENDS))
3714         {
3715                 /* Attempt to place a group */
3716                 (void)place_monster_group(who, y, x, r_idx, mode);
3717         }
3718
3719         /* Escorts for certain monsters */
3720         if (r_ptr->flags1 & (RF1_ESCORT))
3721         {
3722                 /* Set the escort index */
3723                 place_monster_idx = r_idx;
3724
3725                 /* Try to place several "escorts" */
3726                 for (i = 0; i < 32; i++)
3727                 {
3728                         int nx, ny, z, d = 3;
3729
3730                         /* Pick a location */
3731                         scatter(&ny, &nx, y, x, d, 0);
3732
3733                         /* Require empty grids */
3734                         if (!cave_empty_bold2(ny, nx)) continue;
3735
3736                         /* Prepare allocation table */
3737                         get_mon_num_prep(place_monster_can_escort, get_monster_hook2(ny, nx));
3738
3739                         /* Pick a random race */
3740                         z = get_mon_num(r_ptr->level);
3741
3742                         /* Handle failure */
3743                         if (!z) break;
3744
3745                         /* Place a single escort */
3746                         (void)place_monster_one(place_monster_m_idx, ny, nx, z, mode);
3747
3748                         /* Place a "group" of escorts if needed */
3749                         if ((r_info[z].flags1 & RF1_FRIENDS) ||
3750                             (r_ptr->flags1 & RF1_ESCORTS))
3751                         {
3752                                 /* Place a group of monsters */
3753                                 (void)place_monster_group(place_monster_m_idx, ny, nx, z, mode);
3754                         }
3755                 }
3756         }
3757
3758         /* Success */
3759         return (TRUE);
3760 }
3761
3762 /*!
3763  * @brief 一般的なモンスター生成処理のメインルーチン / Attempt to place a monster of the given race at the given location
3764  * @param y 生成地点y座標
3765  * @param x 生成地点x座標
3766  * @param mode 生成オプション
3767  * @return 生成に成功したらtrue
3768  */
3769 bool place_monster(int y, int x, u32b mode)
3770 {
3771         int r_idx;
3772
3773         /* Prepare allocation table */
3774         get_mon_num_prep(get_monster_hook(), get_monster_hook2(y, x));
3775
3776         /* Pick a monster */
3777         r_idx = get_mon_num(monster_level);
3778
3779         /* Handle failure */
3780         if (!r_idx) return (FALSE);
3781
3782         /* Attempt to place the monster */
3783         if (place_monster_aux(0, y, x, r_idx, mode)) return (TRUE);
3784
3785         /* Oops */
3786         return (FALSE);
3787 }
3788
3789
3790 #ifdef MONSTER_HORDES
3791
3792 /*!
3793  * @brief 指定地点に1種類のモンスター種族による群れを生成する
3794  * @param y 生成地点y座標
3795  * @param x 生成地点x座標
3796  * @return 生成に成功したらtrue
3797  */
3798 bool alloc_horde(int y, int x)
3799 {
3800         monster_race *r_ptr = NULL;
3801         int r_idx = 0;
3802         int m_idx;
3803         int attempts = 1000;
3804         int cy = y;
3805         int cx = x;
3806
3807         /* Prepare allocation table */
3808         get_mon_num_prep(get_monster_hook(), get_monster_hook2(y, x));
3809
3810         while (--attempts)
3811         {
3812                 /* Pick a monster */
3813                 r_idx = get_mon_num(monster_level);
3814
3815                 /* Handle failure */
3816                 if (!r_idx) return (FALSE);
3817
3818                 r_ptr = &r_info[r_idx];
3819
3820                 if (r_ptr->flags1 & RF1_UNIQUE) continue;
3821
3822                 if (r_idx == MON_HAGURE) continue;
3823                 break;
3824         }
3825         if (attempts < 1) return FALSE;
3826
3827         attempts = 1000;
3828
3829         while (--attempts)
3830         {
3831                 /* Attempt to place the monster */
3832                 if (place_monster_aux(0, y, x, r_idx, 0L)) break;
3833         }
3834
3835         if (attempts < 1) return FALSE;
3836
3837         m_idx = cave[y][x].m_idx;
3838
3839         if (m_list[m_idx].mflag2 & MFLAG2_CHAMELEON) r_ptr = &r_info[m_list[m_idx].r_idx];
3840         summon_kin_type = r_ptr->d_char;
3841
3842         for (attempts = randint1(10) + 5; attempts; attempts--)
3843         {
3844                 scatter(&cy, &cx, y, x, 5, 0);
3845
3846                 (void)summon_specific(m_idx, cy, cx, dun_level + 5, SUMMON_KIN, PM_ALLOW_GROUP);
3847
3848                 y = cy;
3849                 x = cx;
3850         }
3851
3852         return TRUE;
3853 }
3854
3855 #endif /* MONSTER_HORDES */
3856
3857
3858 /*!
3859  * @brief ダンジョンの主生成を試みる / Put the Guardian
3860  * @param def_val 現在の主の生成状態
3861  * @return 生成に成功したらtrue
3862  */
3863 bool alloc_guardian(bool def_val)
3864 {
3865         int guardian = d_info[dungeon_type].final_guardian;
3866
3867         if (guardian && (d_info[dungeon_type].maxdepth == dun_level) && (r_info[guardian].cur_num < r_info[guardian].max_num))
3868         {
3869                 int oy;
3870                 int ox;
3871                 int try_count = 4000;
3872
3873                 /* Find a good position */
3874                 while (try_count)
3875                 {
3876                         /* Get a random spot */
3877                         oy = randint1(cur_hgt - 4) + 2;
3878                         ox = randint1(cur_wid - 4) + 2;
3879
3880                         /* Is it a good spot ? */
3881                         if (cave_empty_bold2(oy, ox) && monster_can_cross_terrain(cave[oy][ox].feat, &r_info[guardian], 0))
3882                         {
3883                                 /* Place the guardian */
3884                                 if (place_monster_aux(0, oy, ox, guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) return TRUE;
3885                         }
3886
3887                         /* One less try count */
3888                         try_count--;
3889                 }
3890
3891                 return FALSE;
3892         }
3893
3894         return def_val;
3895 }
3896
3897
3898 /*!
3899  * @brief ダンジョンの初期配置モンスターを生成1回生成する / Attempt to allocate a random monster in the dungeon.
3900  * @param dis プレイヤーから離れるべき最低距離
3901  * @param mode 生成オプション
3902  * @return 生成に成功したらtrue
3903  * @details
3904  * Place the monster at least "dis" distance from the player.
3905  * Use "slp" to choose the initial "sleep" status
3906  * Use "monster_level" for the monster level
3907  */
3908 bool alloc_monster(int dis, u32b mode)
3909 {
3910         int                     y = 0, x = 0;
3911         int         attempts_left = 10000;
3912
3913         /* Put the Guardian */
3914         if (alloc_guardian(FALSE)) return TRUE;
3915
3916         /* Find a legal, distant, unoccupied, space */
3917         while (attempts_left--)
3918         {
3919                 /* Pick a location */
3920                 y = randint0(cur_hgt);
3921                 x = randint0(cur_wid);
3922
3923                 /* Require empty floor grid (was "naked") */
3924                 if (dun_level)
3925                 {
3926                         if (!cave_empty_bold2(y, x)) continue;
3927                 }
3928                 else
3929                 {
3930                         if (!cave_empty_bold(y, x)) continue;
3931                 }
3932
3933                 /* Accept far away grids */
3934                 if (distance(y, x, p_ptr->y, p_ptr->x) > dis) break;
3935         }
3936
3937         if (!attempts_left)
3938         {
3939                 if (cheat_xtra || cheat_hear)
3940                 {
3941                         msg_print(_("警告!新たなモンスターを配置できません。小さい階ですか?", "Warning! Could not allocate a new monster. Small level?"));
3942                 }
3943
3944                 return (FALSE);
3945         }
3946
3947
3948 #ifdef MONSTER_HORDES
3949         if (randint1(5000) <= dun_level)
3950         {
3951                 if (alloc_horde(y, x))
3952                 {
3953                         if (cheat_hear) msg_format(_("モンスターの大群(%c)", "Monster horde (%c)."), summon_kin_type);
3954                         return (TRUE);
3955                 }
3956         }
3957         else
3958         {
3959 #endif /* MONSTER_HORDES */
3960
3961                 /* Attempt to place the monster, allow groups */
3962                 if (place_monster(y, x, (mode | PM_ALLOW_GROUP))) return (TRUE);
3963
3964 #ifdef MONSTER_HORDES
3965         }
3966 #endif /* MONSTER_HORDES */
3967
3968         /* Nope */
3969         return (FALSE);
3970 }
3971
3972
3973 /*!
3974  * @brief モンスターが召喚の基本条件に合っているかをチェックする / Hack -- help decide if a monster race is "okay" to summon
3975  * @param r_idx チェックするモンスター種族ID
3976  * @return 召喚対象にできるならばTRUE
3977  */
3978 static bool summon_specific_okay(int r_idx)
3979 {
3980         monster_race *r_ptr = &r_info[r_idx];
3981
3982         /* Hack - Only summon dungeon monsters */
3983         if (!mon_hook_dungeon(r_idx)) return (FALSE);
3984
3985         /* Hack -- identify the summoning monster */
3986         if (summon_specific_who > 0)
3987         {
3988                 monster_type *m_ptr = &m_list[summon_specific_who];
3989
3990                 /* Do not summon enemies */
3991
3992                 /* Friendly vs. opposite aligned normal or pet */
3993                 if (monster_has_hostile_align(m_ptr, 0, 0, r_ptr)) return FALSE;
3994         }
3995         /* Use the player's alignment */
3996         else if (summon_specific_who < 0)
3997         {
3998                 /* Do not summon enemies of the pets */
3999                 if (monster_has_hostile_align(NULL, 10, -10, r_ptr))
4000                 {
4001                         if (!one_in_(ABS(p_ptr->align) / 2 + 1)) return FALSE;
4002                 }
4003         }
4004
4005         /* Hack -- no specific type specified */
4006         if (!summon_specific_type) return (TRUE);
4007
4008         if (!summon_unique_okay && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))) return FALSE;
4009
4010         if ((summon_specific_who < 0) &&
4011             ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) &&
4012             monster_has_hostile_align(NULL, 10, -10, r_ptr))
4013                 return FALSE;
4014
4015         if ((r_ptr->flags7 & RF7_CHAMELEON) && (d_info[dungeon_type].flags1 & DF1_CHAMELEON)) return TRUE;
4016
4017         return (summon_specific_aux(r_idx));
4018 }
4019
4020
4021 /*!
4022  * @brief モンスターを召喚により配置する / Place a monster (of the specified "type") near the given location. Return TRUE if a monster was actually summoned.
4023  * @param who 召喚主のモンスター情報ID
4024  * @param y1 目標地点y座標
4025  * @param x1 目標地点x座標
4026  * @param lev 相当生成階
4027  * @param type 召喚種別
4028  * @param mode 生成オプション 
4029  * @return 召喚できたらtrueを返す
4030  * @details
4031  *
4032  * We will attempt to place the monster up to 10 times before giving up.
4033  *
4034  * Note: SUMMON_UNIQUE and SUMMON_AMBERITES will summon Unique's
4035  * Note: SUMMON_HI_UNDEAD and SUMMON_HI_DRAGON may summon Unique's
4036  * Note: None of the other summon codes will ever summon Unique's.
4037  *
4038  * This function has been changed.  We now take the "monster level"
4039  * of the summoning monster as a parameter, and use that, along with
4040  * the current dungeon level, to help determine the level of the
4041  * desired monster.  Note that this is an upper bound, and also
4042  * tends to "prefer" monsters of that level.  Currently, we use
4043  * the average of the dungeon and monster levels, and then add
4044  * five to allow slight increases in monster power.
4045  *
4046  * Note that we use the new "monster allocation table" creation code
4047  * to restrict the "get_mon_num()" function to the set of "legal"
4048  * monsters, making this function much faster and more reliable.
4049  *
4050  * Note that this function may not succeed, though this is very rare.
4051  */
4052 bool summon_specific(int who, int y1, int x1, int lev, int type, u32b mode)
4053 {
4054         int x, y, r_idx;
4055
4056         if (p_ptr->inside_arena) return (FALSE);
4057
4058         if (!mon_scatter(0, &y, &x, y1, x1, 2)) return FALSE;
4059
4060         /* Save the summoner */
4061         summon_specific_who = who;
4062
4063         /* Save the "summon" type */
4064         summon_specific_type = type;
4065
4066         summon_unique_okay = (mode & PM_ALLOW_UNIQUE) ? TRUE : FALSE;
4067
4068         /* Prepare allocation table */
4069         get_mon_num_prep(summon_specific_okay, get_monster_hook2(y, x));
4070
4071         /* Pick a monster, using the level calculation */
4072         r_idx = get_mon_num((dun_level + lev) / 2 + 5);
4073
4074         /* Handle failure */
4075         if (!r_idx)
4076         {
4077                 summon_specific_type = 0;
4078                 return (FALSE);
4079         }
4080
4081         if ((type == SUMMON_BLUE_HORROR) || (type == SUMMON_DAWN)) mode |= PM_NO_KAGE;
4082
4083         /* Attempt to place the monster (awake, allow groups) */
4084         if (!place_monster_aux(who, y, x, r_idx, mode))
4085         {
4086                 summon_specific_type = 0;
4087                 return (FALSE);
4088         }
4089
4090         summon_specific_type = 0;
4091         /* Success */
4092         return (TRUE);
4093 }
4094
4095
4096 /*!
4097  * @brief 特定モンスター種族を召喚により生成する / A "dangerous" function, creates a pet of the specified type
4098  * @param who 召喚主のモンスター情報ID
4099  * @param oy 目標地点y座標
4100  * @param ox 目標地点x座標
4101  * @param r_idx 生成するモンスター種族ID
4102  * @param mode 生成オプション 
4103  * @return 召喚できたらtrueを返す
4104  */
4105 bool summon_named_creature (int who, int oy, int ox, int r_idx, u32b mode)
4106 {
4107         int x, y;
4108
4109         /* Paranoia */
4110         /* if (!r_idx) return; */
4111
4112         /* Prevent illegal monsters */
4113         if (r_idx >= max_r_idx) return FALSE;
4114
4115         if (p_ptr->inside_arena) return FALSE;
4116
4117         if (!mon_scatter(r_idx, &y, &x, oy, ox, 2)) return FALSE;
4118
4119         /* Place it (allow groups) */
4120         return place_monster_aux(who, y, x, r_idx, (mode | PM_NO_KAGE));
4121 }
4122
4123
4124 /*!
4125  * @brief モンスターを増殖生成する / Let the given monster attempt to reproduce.
4126  * @param m_idx 増殖するモンスター情報ID
4127  * @param clone クローン・モンスター処理ならばtrue
4128  * @param mode 生成オプション 
4129  * @return 生成できたらtrueを返す
4130  * @details
4131  * Note that "reproduction" REQUIRES empty space.
4132  */
4133 bool multiply_monster(int m_idx, bool clone, u32b mode)
4134 {
4135         monster_type    *m_ptr = &m_list[m_idx];
4136
4137         int y, x;
4138
4139         if (!mon_scatter(m_ptr->r_idx, &y, &x, m_ptr->fy, m_ptr->fx, 1))
4140                 return FALSE;
4141
4142         if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET;
4143
4144         /* Create a new monster (awake, no groups) */
4145         if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE | PM_MULTIPLY)))
4146                 return FALSE;
4147
4148         /* Hack -- Transfer "clone" flag */
4149         if (clone || (m_ptr->smart & SM_CLONED))
4150         {
4151                 m_list[hack_m_idx_ii].smart |= SM_CLONED;
4152                 m_list[hack_m_idx_ii].mflag2 |= MFLAG2_NOPET;
4153         }
4154
4155         return TRUE;
4156 }
4157
4158
4159
4160 /*!
4161  * @brief ダメージを受けたモンスターの様子を記述する / Dump a message describing a monster's reaction to damage
4162  * @param m_idx モンスター情報ID
4163  * @param dam 与えたダメージ
4164  * @return なし
4165  * @details
4166  * Technically should attempt to treat "Beholder"'s as jelly's
4167  */
4168 void message_pain(int m_idx, int dam)
4169 {
4170         long oldhp, newhp, tmp;
4171         int percentage;
4172
4173         monster_type *m_ptr = &m_list[m_idx];
4174         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4175
4176         char m_name[80];
4177
4178         /* Get the monster name */
4179         monster_desc(m_name, m_ptr, 0);
4180
4181         if(dam == 0) // Notice non-damage
4182         {
4183                 msg_format(_("%^sはダメージを受けていない。", "%^s is unharmed."), m_name);
4184                 return;
4185         }
4186
4187         /* Note -- subtle fix -CFT */
4188         newhp = (long)(m_ptr->hp);
4189         oldhp = newhp + (long)(dam);
4190         tmp = (newhp * 100L) / oldhp;
4191         percentage = (int)(tmp);
4192
4193         if(my_strchr(",ejmvwQ", r_ptr->d_char)) // Mushrooms, Eyes, Jellies, Molds, Vortices, Worms, Quylthulgs
4194         {
4195 #ifdef JP
4196                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4197                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4198                 else if(percentage > 50) msg_format("%^sは縮こまった。", m_name);
4199                 else if(percentage > 35) msg_format("%^sは痛みに震えた。", m_name);
4200                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4201                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4202                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4203 #else
4204                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4205                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4206                 else if(percentage > 50) msg_format("%^s squelches.", m_name);
4207                 else if(percentage > 35) msg_format("%^s quivers in pain.", m_name);
4208                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4209                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4210                 else msg_format("%^s jerks limply.", m_name);
4211 #endif
4212         }
4213
4214         else if(my_strchr("l", r_ptr->d_char)) // Fish
4215         {
4216 #ifdef JP
4217                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4218                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4219                 else if(percentage > 50) msg_format("%^sは躊躇した。", m_name);
4220                 else if(percentage > 35) msg_format("%^sは痛みに震えた。", m_name);
4221                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4222                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4223                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4224 #else
4225                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4226                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4227                 else if(percentage > 50) msg_format("%^s hesitates.", m_name);
4228                 else if(percentage > 35) msg_format("%^s quivers in pain.", m_name);
4229                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4230                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4231                 else msg_format("%^s jerks limply.", m_name);
4232 #endif          
4233         }
4234
4235         else if(my_strchr("g#+<>", r_ptr->d_char)) // Golems, Walls, Doors, Stairs
4236         {       
4237 #ifdef JP
4238                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4239                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4240                 else if(percentage > 50) msg_format("%^sは雷鳴のように吠えた。", m_name);
4241                 else if(percentage > 35) msg_format("%^sは苦しげに吠えた。", m_name);
4242                 else if(percentage > 20) msg_format("%^sはうめいた。", m_name);
4243                 else if(percentage > 10) msg_format("%^sは躊躇した。", m_name);
4244                 else msg_format("%^sはくしゃくしゃになった。", m_name);
4245 #else
4246                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4247                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4248                 else if(percentage > 50) msg_format("%^s roars thunderously.", m_name);
4249                 else if(percentage > 35) msg_format("%^s rumbles.", m_name);
4250                 else if(percentage > 20) msg_format("%^s grunts.", m_name);
4251                 else if(percentage > 10) msg_format("%^s hesitates.", m_name);
4252                 else msg_format("%^s crumples.", m_name);
4253 #endif
4254         }
4255
4256         else if(my_strchr("JMR", r_ptr->d_char) || !isalpha(r_ptr->d_char)) // Snakes, Hydrae, Reptiles, Mimics
4257         {
4258 #ifdef JP
4259                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4260                 else if(percentage > 75) msg_format("%^sはシーッと鳴いた。", m_name);
4261                 else if(percentage > 50) msg_format("%^sは怒って頭を上げた。", m_name);
4262                 else if(percentage > 35) msg_format("%^sは猛然と威嚇した。", m_name);
4263                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4264                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4265                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4266 #else
4267                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4268                 else if(percentage > 75) msg_format("%^s hisses.", m_name);
4269                 else if(percentage > 50) msg_format("%^s rears up in anger.", m_name);
4270                 else if(percentage > 35) msg_format("%^s hisses furiously.", m_name);
4271                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4272                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4273                 else msg_format("%^s jerks limply.", m_name);
4274 #endif
4275         }
4276
4277         else if(my_strchr("f", r_ptr->d_char))
4278         {
4279 #ifdef JP
4280                 if(percentage > 95) msg_format("%sは攻撃に肩をすくめた。", m_name);
4281                 else if(percentage > 75) msg_format("%^sは吠えた。", m_name);
4282                 else if(percentage > 50) msg_format("%^sは怒って吠えた。", m_name);
4283                 else if(percentage > 35) msg_format("%^sは痛みでシーッと鳴いた。", m_name);
4284                 else if(percentage > 20) msg_format("%^sは痛みで弱々しく鳴いた。", m_name);
4285                 else if(percentage > 10) msg_format("%^sは苦痛にうめいた。", m_name);
4286                 else msg_format("%sは哀れな鳴き声を出した。", m_name);
4287 #else
4288                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4289                 else if(percentage > 75) msg_format("%^s roars.", m_name);
4290                 else if(percentage > 50) msg_format("%^s growls angrily.", m_name);
4291                 else if(percentage > 35) msg_format("%^s hisses with pain.", m_name);
4292                 else if(percentage > 20) msg_format("%^s mewls in pain.", m_name);
4293                 else if(percentage > 10) msg_format("%^s hisses in agony.", m_name);
4294                 else msg_format("%^s mewls pitifully.", m_name);
4295 #endif
4296         }
4297
4298         else if(my_strchr("acFIKS", r_ptr->d_char)) // Ants, Centipedes, Flies, Insects, Beetles, Spiders
4299         {
4300 #ifdef JP
4301                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4302                 else if(percentage > 75) msg_format("%^sはキーキー鳴いた。", m_name);
4303                 else if(percentage > 50) msg_format("%^sはヨロヨロ逃げ回った。", m_name);
4304                 else if(percentage > 35) msg_format("%^sはうるさく鳴いた。", m_name);
4305                 else if(percentage > 20) msg_format("%^sは痛みに痙攣した。", m_name);
4306                 else if(percentage > 10) msg_format("%^sは苦痛で痙攣した。", m_name);
4307                 else msg_format("%^sはピクピクひきつった。", m_name);
4308 #else
4309                 if(percentage > 95)     msg_format("%^s ignores the attack.", m_name);
4310                 else if(percentage > 75) msg_format("%^s chitters.", m_name);
4311                 else if(percentage > 50) msg_format("%^s scuttles about.", m_name);
4312                 else if(percentage > 35) msg_format("%^s twitters.", m_name);
4313                 else if(percentage > 20) msg_format("%^s jerks in pain.", m_name);
4314                 else if(percentage > 10) msg_format("%^s jerks in agony.", m_name);
4315                 else msg_format("%^s twitches.", m_name);
4316 #endif
4317         }
4318
4319         else if(my_strchr("B", r_ptr->d_char)) // Birds
4320         {               
4321 #ifdef JP
4322                 if(percentage > 95) msg_format("%^sはさえずった。", m_name);
4323                 else if(percentage > 75) msg_format("%^sはピーピー鳴いた。", m_name);
4324                 else if(percentage > 50) msg_format("%^sはギャーギャー鳴いた。", m_name);
4325                 else if(percentage > 35) msg_format("%^sはギャーギャー鳴きわめいた。", m_name);
4326                 else if(percentage > 20) msg_format("%^sは苦しんだ。", m_name);
4327                 else if(percentage > 10) msg_format("%^sはのたうち回った。", m_name);
4328                 else msg_format("%^sはキーキーと鳴き叫んだ。", m_name);
4329 #else
4330                 if(percentage > 95)     msg_format("%^s chirps.", m_name);
4331                 else if(percentage > 75) msg_format("%^s twitters.", m_name);
4332                 else if(percentage > 50) msg_format("%^s squawks.", m_name);
4333                 else if(percentage > 35) msg_format("%^s chatters.", m_name);
4334                 else if(percentage > 20) msg_format("%^s jeers.", m_name);
4335                 else if(percentage > 10) msg_format("%^s flutters about.", m_name);
4336                 else msg_format("%^s squeaks.", m_name);
4337 #endif
4338         }
4339
4340         else if(my_strchr("duDLUW", r_ptr->d_char)) // Dragons, Demons, High Undead
4341         {       
4342 #ifdef JP
4343                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4344                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4345                 else if(percentage > 50) msg_format("%^sは痛みでシーッと鳴いた。", m_name);
4346                 else if(percentage > 35) msg_format("%^sは痛みでうなった。", m_name);
4347                 else if(percentage > 20) msg_format("%^sは痛みに吠えた。", m_name);
4348                 else if(percentage > 10) msg_format("%^sは苦しげに叫んだ。", m_name);
4349                 else msg_format("%^sは弱々しくうなった。", m_name);
4350 #else
4351                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4352                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4353                 else if(percentage > 50) msg_format("%^s hisses in pain.", m_name);
4354                 else if(percentage > 35) msg_format("%^s snarls with pain.", m_name);
4355                 else if(percentage > 20) msg_format("%^s roars with pain.", m_name);
4356                 else if(percentage > 10) msg_format("%^s gasps.", m_name);
4357                 else msg_format("%^s snarls feebly.", m_name);
4358 #endif
4359         }
4360
4361         else if(my_strchr("s", r_ptr->d_char)) // Skeletons
4362         {
4363 #ifdef JP
4364                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4365                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4366                 else if(percentage > 50) msg_format("%^sはカタカタと笑った。", m_name);
4367                 else if(percentage > 35) msg_format("%^sはよろめいた。", m_name);
4368                 else if(percentage > 20) msg_format("%^sはカタカタ言った。", m_name);
4369                 else if(percentage > 10) msg_format("%^sはよろめいた。", m_name);
4370                 else msg_format("%^sはガタガタ言った。", m_name);
4371 #else
4372                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4373                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4374                 else if(percentage > 50) msg_format("%^s rattles.", m_name);
4375                 else if(percentage > 35) msg_format("%^s stumbles.", m_name);
4376                 else if(percentage > 20) msg_format("%^s rattles.", m_name);
4377                 else if(percentage > 10) msg_format("%^s staggers.", m_name);
4378                 else msg_format("%^s clatters.", m_name);
4379 #endif
4380         }
4381
4382         else if(my_strchr("z", r_ptr->d_char)) // Zombies
4383         {               
4384 #ifdef JP
4385                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4386                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4387                 else if(percentage > 50) msg_format("%^sはうめいた。", m_name);
4388                 else if(percentage > 35) msg_format("%sは苦しげにうめいた。", m_name);
4389                 else if(percentage > 20) msg_format("%^sは躊躇した。", m_name);
4390                 else if(percentage > 10) msg_format("%^sはうなった。", m_name);
4391                 else msg_format("%^sはよろめいた。", m_name);
4392 #else
4393                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4394                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4395                 else if(percentage > 50) msg_format("%^s groans.", m_name);
4396                 else if(percentage > 35) msg_format("%^s moans.", m_name);
4397                 else if(percentage > 20) msg_format("%^s hesitates.", m_name);
4398                 else if(percentage > 10) msg_format("%^s grunts.", m_name);
4399                 else msg_format("%^s staggers.", m_name);
4400 #endif
4401         }
4402
4403         else if(my_strchr("G", r_ptr->d_char)) // Ghosts
4404         {
4405 #ifdef JP
4406                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4407                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4408                 else if(percentage > 50) msg_format("%sはうめいた。", m_name);
4409                 else if(percentage > 35) msg_format("%^sは泣きわめいた。", m_name);
4410                 else if(percentage > 20) msg_format("%^sは吠えた。", m_name);
4411                 else if(percentage > 10) msg_format("%sは弱々しくうめいた。", m_name);
4412                 else msg_format("%^sはかすかにうめいた。", m_name);
4413 #else
4414                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4415                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4416                 else if(percentage > 50)  msg_format("%^s moans.", m_name);
4417                 else if(percentage > 35) msg_format("%^s wails.", m_name);
4418                 else if(percentage > 20) msg_format("%^s howls.", m_name);
4419                 else if(percentage > 10) msg_format("%^s moans softly.", m_name);
4420                 else msg_format("%^s sighs.", m_name);
4421 #endif
4422         }
4423
4424         else if(my_strchr("CZ", r_ptr->d_char)) // Dogs and Hounds
4425         {
4426 #ifdef JP
4427                 if(percentage > 95) msg_format("%^sは攻撃に肩をすくめた。", m_name);
4428                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4429                 else if(percentage > 50) msg_format("%^sは痛みでキャンキャン吠えた。", m_name);
4430                 else if(percentage > 35) msg_format("%^sは痛みで鳴きわめいた。", m_name);
4431                 else if(percentage > 20) msg_format("%^sは苦痛のあまり鳴きわめいた。", m_name);
4432                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4433                 else msg_format("%^sは弱々しく吠えた。", m_name);
4434 #else
4435                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4436                 else if(percentage > 75) msg_format("%^s snarls with pain.", m_name);
4437                 else if(percentage > 50) msg_format("%^s yelps in pain.", m_name);
4438                 else if(percentage > 35) msg_format("%^s howls in pain.", m_name);
4439                 else if(percentage > 20) msg_format("%^s howls in agony.", m_name);
4440                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4441                 else msg_format("%^s yelps feebly.", m_name);
4442 #endif
4443         }
4444
4445         else if(my_strchr("Xbilqrt", r_ptr->d_char)) // One type of creatures (ignore,squeal,shriek)
4446         {
4447 #ifdef JP
4448                 if(percentage > 95) msg_format("%^sは攻撃を気にとめていない。", m_name);
4449                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4450                 else if(percentage > 50) msg_format("%^sは痛みで叫んだ。", m_name);
4451                 else if(percentage > 35) msg_format("%^sは痛みで絶叫した。", m_name);
4452                 else if(percentage > 20) msg_format("%^sは苦痛のあまり絶叫した。", m_name);
4453                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4454                 else msg_format("%^sは弱々しく叫んだ。", m_name);
4455 #else
4456                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4457                 else if(percentage > 75) msg_format("%^s grunts with pain.", m_name);
4458                 else if(percentage > 50) msg_format("%^s squeals in pain.", m_name);
4459                 else if(percentage > 35) msg_format("%^s shrieks in pain.", m_name);
4460                 else if(percentage > 20) msg_format("%^s shrieks in agony.", m_name);
4461                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4462                 else msg_format("%^s cries out feebly.", m_name);
4463 #endif
4464         }
4465
4466         else // Another type of creatures (shrug,cry,scream)
4467         {
4468 #ifdef JP
4469                 if(percentage > 95) msg_format("%^sは攻撃に肩をすくめた。", m_name);
4470                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4471                 else if(percentage > 50) msg_format("%^sは痛みで叫んだ。", m_name);
4472                 else if(percentage > 35) msg_format("%^sは痛みで絶叫した。", m_name);
4473                 else if(percentage > 20) msg_format("%^sは苦痛のあまり絶叫した。", m_name);
4474                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4475                 else msg_format("%^sは弱々しく叫んだ。", m_name);
4476 #else
4477                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4478                 else if(percentage > 75) msg_format("%^s grunts with pain.", m_name);
4479                 else if(percentage > 50) msg_format("%^s cries out in pain.", m_name);
4480                 else if(percentage > 35) msg_format("%^s screams in pain.", m_name);
4481                 else if(percentage > 20) msg_format("%^s screams in agony.", m_name);
4482                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4483                 else msg_format("%^s cries out feebly.", m_name);
4484 #endif
4485         }
4486 }
4487
4488
4489
4490 /*!
4491  * @brief SMART(適格に攻撃を行う)モンスターの学習状況を更新する / Learn about an "observed" resistance.
4492  * @param m_idx 更新を行う「モンスター情報ID
4493  * @param what 学習対象ID
4494  * @return なし
4495  */
4496 void update_smart_learn(int m_idx, int what)
4497 {
4498         monster_type *m_ptr = &m_list[m_idx];
4499
4500         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4501
4502
4503         /* Not allowed to learn */
4504         if (!smart_learn) return;
4505
4506         /* Too stupid to learn anything */
4507         if (r_ptr->flags2 & (RF2_STUPID)) return;
4508
4509         /* Not intelligent, only learn sometimes */
4510         if (!(r_ptr->flags2 & (RF2_SMART)) && (randint0(100) < 50)) return;
4511
4512
4513         /* XXX XXX XXX */
4514
4515         /* Analyze the knowledge */
4516         switch (what)
4517         {
4518         case DRS_ACID:
4519                 if (p_ptr->resist_acid) m_ptr->smart |= (SM_RES_ACID);
4520                 if (IS_OPPOSE_ACID()) m_ptr->smart |= (SM_OPP_ACID);
4521                 if (p_ptr->immune_acid) m_ptr->smart |= (SM_IMM_ACID);
4522                 break;
4523
4524         case DRS_ELEC:
4525                 if (p_ptr->resist_elec) m_ptr->smart |= (SM_RES_ELEC);
4526                 if (IS_OPPOSE_ELEC()) m_ptr->smart |= (SM_OPP_ELEC);
4527                 if (p_ptr->immune_elec) m_ptr->smart |= (SM_IMM_ELEC);
4528                 break;
4529
4530         case DRS_FIRE:
4531                 if (p_ptr->resist_fire) m_ptr->smart |= (SM_RES_FIRE);
4532                 if (IS_OPPOSE_FIRE()) m_ptr->smart |= (SM_OPP_FIRE);
4533                 if (p_ptr->immune_fire) m_ptr->smart |= (SM_IMM_FIRE);
4534                 break;
4535
4536         case DRS_COLD:
4537                 if (p_ptr->resist_cold) m_ptr->smart |= (SM_RES_COLD);
4538                 if (IS_OPPOSE_COLD()) m_ptr->smart |= (SM_OPP_COLD);
4539                 if (p_ptr->immune_cold) m_ptr->smart |= (SM_IMM_COLD);
4540                 break;
4541
4542         case DRS_POIS:
4543                 if (p_ptr->resist_pois) m_ptr->smart |= (SM_RES_POIS);
4544                 if (IS_OPPOSE_POIS()) m_ptr->smart |= (SM_OPP_POIS);
4545                 break;
4546
4547
4548         case DRS_NETH:
4549                 if (p_ptr->resist_neth) m_ptr->smart |= (SM_RES_NETH);
4550                 break;
4551
4552         case DRS_LITE:
4553                 if (p_ptr->resist_lite) m_ptr->smart |= (SM_RES_LITE);
4554                 break;
4555
4556         case DRS_DARK:
4557                 if (p_ptr->resist_dark) m_ptr->smart |= (SM_RES_DARK);
4558                 break;
4559
4560         case DRS_FEAR:
4561                 if (p_ptr->resist_fear) m_ptr->smart |= (SM_RES_FEAR);
4562                 break;
4563
4564         case DRS_CONF:
4565                 if (p_ptr->resist_conf) m_ptr->smart |= (SM_RES_CONF);
4566                 break;
4567
4568         case DRS_CHAOS:
4569                 if (p_ptr->resist_chaos) m_ptr->smart |= (SM_RES_CHAOS);
4570                 break;
4571
4572         case DRS_DISEN:
4573                 if (p_ptr->resist_disen) m_ptr->smart |= (SM_RES_DISEN);
4574                 break;
4575
4576         case DRS_BLIND:
4577                 if (p_ptr->resist_blind) m_ptr->smart |= (SM_RES_BLIND);
4578                 break;
4579
4580         case DRS_NEXUS:
4581                 if (p_ptr->resist_nexus) m_ptr->smart |= (SM_RES_NEXUS);
4582                 break;
4583
4584         case DRS_SOUND:
4585                 if (p_ptr->resist_sound) m_ptr->smart |= (SM_RES_SOUND);
4586                 break;
4587
4588         case DRS_SHARD:
4589                 if (p_ptr->resist_shard) m_ptr->smart |= (SM_RES_SHARD);
4590                 break;
4591
4592         case DRS_FREE:
4593                 if (p_ptr->free_act) m_ptr->smart |= (SM_IMM_FREE);
4594                 break;
4595
4596         case DRS_MANA:
4597                 if (!p_ptr->msp) m_ptr->smart |= (SM_IMM_MANA);
4598                 break;
4599
4600         case DRS_REFLECT:
4601                 if (p_ptr->reflect) m_ptr-> smart |= (SM_IMM_REFLECT);
4602                 break;
4603         }
4604 }
4605
4606
4607 /*!
4608  * @brief プレイヤーを指定座標に配置する / Place the player in the dungeon XXX XXX
4609  * @param x 配置先X座標
4610  * @param y 配置先Y座標
4611  * @return 配置に成功したらTRUE
4612  */
4613 bool player_place(int y, int x)
4614 {
4615         /* Paranoia XXX XXX */
4616         if (cave[y][x].m_idx != 0) return FALSE;
4617
4618         /* Save player location */
4619         p_ptr->y = y;
4620         p_ptr->x = x;
4621
4622         /* Success */
4623         return TRUE;
4624 }
4625
4626
4627 /*!
4628  * @brief モンスターが盗みや拾いで確保していたアイテムを全てドロップさせる / Drop all items carried by a monster
4629  * @param m_ptr モンスター参照ポインタ
4630  * @return なし
4631  */
4632 void monster_drop_carried_objects(monster_type *m_ptr)
4633 {
4634         s16b this_o_idx, next_o_idx = 0;
4635         object_type forge;
4636         object_type *o_ptr;
4637         object_type *q_ptr;
4638
4639
4640         /* Drop objects being carried */
4641         for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
4642         {
4643                 /* Acquire object */
4644                 o_ptr = &o_list[this_o_idx];
4645
4646                 /* Acquire next object */
4647                 next_o_idx = o_ptr->next_o_idx;
4648
4649                 /* Get local object */
4650                 q_ptr = &forge;
4651
4652                 /* Copy the object */
4653                 object_copy(q_ptr, o_ptr);
4654
4655                 /* Forget monster */
4656                 q_ptr->held_m_idx = 0;
4657
4658                 /* Delete the object */
4659                 delete_object_idx(this_o_idx);
4660
4661                 /* Drop it */
4662                 (void)drop_near(q_ptr, -1, m_ptr->fy, m_ptr->fx);
4663         }
4664
4665         /* Forget objects */
4666         m_ptr->hold_o_idx = 0;
4667 }