OSDN Git Service

#37353 (2.2.0.26) Rename place_monster_okay() to place_monster_can_escort().
[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         /* Powerful monster */
3150         if (r_ptr->level > dun_level)
3151         {
3152                 /* Unique monsters */
3153                 if (r_ptr->flags1 & (RF1_UNIQUE))
3154                 {
3155                         /* Message for cheaters */
3156                         if (cheat_hear) msg_format(_("深層のユニーク・モンスター (%s)。", "Deep Unique (%s)."), name);
3157                 }
3158
3159                 /* Normal monsters */
3160                 else
3161                 {
3162                         /* Message for cheaters */
3163                         if (cheat_hear) msg_format(_("深層のモンスター (%s)。", "Deep Monster (%s)."), name);
3164                 }
3165         }
3166
3167         /* Note the monster */
3168         else if (r_ptr->flags1 & (RF1_UNIQUE))
3169         {
3170                 /* Unique monsters induce message */
3171                 if (cheat_hear) msg_format(_("ユニーク・モンスター (%s)。", "Unique (%s)."), name);
3172         }
3173
3174         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL) || (r_ptr->level < 10)) mode &= ~PM_KAGE;
3175
3176         /* Make a new monster */
3177         c_ptr->m_idx = m_pop();
3178         hack_m_idx_ii = c_ptr->m_idx;
3179
3180         /* Mega-Hack -- catch "failure" */
3181         if (!c_ptr->m_idx) return (FALSE);
3182
3183
3184         /* Get a new monster record */
3185         m_ptr = &m_list[c_ptr->m_idx];
3186
3187         /* Save the race */
3188         m_ptr->r_idx = r_idx;
3189         m_ptr->ap_r_idx = initial_r_appearance(r_idx);
3190
3191         /* No flags */
3192         m_ptr->mflag = 0;
3193         m_ptr->mflag2 = 0;
3194
3195         /* Hack -- Appearance transfer */
3196         if ((mode & PM_MULTIPLY) && (who > 0) && !is_original_ap(&m_list[who]))
3197         {
3198                 m_ptr->ap_r_idx = m_list[who].ap_r_idx;
3199
3200                 /* Hack -- Shadower spawns Shadower */
3201                 if (m_list[who].mflag2 & MFLAG2_KAGE) m_ptr->mflag2 |= MFLAG2_KAGE;
3202         }
3203
3204         /* Sub-alignment of a monster */
3205         if ((who > 0) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))
3206                 m_ptr->sub_align = m_list[who].sub_align;
3207         else
3208         {
3209                 m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
3210                 if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;
3211                 if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;
3212         }
3213
3214         /* Place the monster at the location */
3215         m_ptr->fy = y;
3216         m_ptr->fx = x;
3217
3218
3219         /* No "timed status" yet */
3220         for (cmi = 0; cmi < MAX_MTIMED; cmi++) m_ptr->mtimed[cmi] = 0;
3221
3222         /* Unknown distance */
3223         m_ptr->cdis = 0;
3224
3225         reset_target(m_ptr);
3226
3227         m_ptr->nickname = 0;
3228
3229         m_ptr->exp = 0;
3230
3231
3232         /* Your pet summons its pet. */
3233         if (who > 0 && is_pet(&m_list[who]))
3234         {
3235                 mode |= PM_FORCE_PET;
3236                 m_ptr->parent_m_idx = who;
3237         }
3238         else
3239         {
3240                 m_ptr->parent_m_idx = 0;
3241         }
3242
3243         if (r_ptr->flags7 & RF7_CHAMELEON)
3244         {
3245                 choose_new_monster(c_ptr->m_idx, TRUE, 0);
3246                 r_ptr = &r_info[m_ptr->r_idx];
3247                 m_ptr->mflag2 |= MFLAG2_CHAMELEON;
3248
3249                 /* Hack - Set sub_align to neutral when the Chameleon Lord is generated as "GUARDIAN" */
3250                 if ((r_ptr->flags1 & RF1_UNIQUE) && (who <= 0))
3251                         m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
3252         }
3253         else if ((mode & PM_KAGE) && !(mode & PM_FORCE_PET))
3254         {
3255                 m_ptr->ap_r_idx = MON_KAGE;
3256                 m_ptr->mflag2 |= MFLAG2_KAGE;
3257         }
3258
3259         if (mode & PM_NO_PET) m_ptr->mflag2 |= MFLAG2_NOPET;
3260
3261         /* Not visible */
3262         m_ptr->ml = FALSE;
3263
3264         /* Pet? */
3265         if (mode & PM_FORCE_PET)
3266         {
3267                 set_pet(m_ptr);
3268         }
3269         /* Friendly? */
3270         else if ((r_ptr->flags7 & RF7_FRIENDLY) ||
3271                  (mode & PM_FORCE_FRIENDLY) || is_friendly_idx(who))
3272         {
3273                 if (!monster_has_hostile_align(NULL, 0, -1, r_ptr)) set_friendly(m_ptr);
3274         }
3275
3276         /* Assume no sleeping */
3277         m_ptr->mtimed[MTIMED_CSLEEP] = 0;
3278
3279         /* Enforce sleeping if needed */
3280         if ((mode & PM_ALLOW_SLEEP) && r_ptr->sleep && !ironman_nightmare)
3281         {
3282                 int val = r_ptr->sleep;
3283                 (void)set_monster_csleep(c_ptr->m_idx, (val * 2) + randint1(val * 10));
3284         }
3285
3286         /* Assign maximal hitpoints */
3287         if (r_ptr->flags1 & RF1_FORCE_MAXHP)
3288         {
3289                 m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
3290         }
3291         else
3292         {
3293                 m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
3294         }
3295
3296         /* Monsters have double hitpoints in Nightmare mode */
3297         if (ironman_nightmare)
3298         {
3299                 u32b hp = m_ptr->max_maxhp * 2L;
3300
3301                 m_ptr->max_maxhp = (s16b)MIN(30000, hp);
3302         }
3303
3304         m_ptr->maxhp = m_ptr->max_maxhp;
3305
3306         /* And start out fully healthy */
3307         if (m_ptr->r_idx == MON_WOUNDED_BEAR)
3308                 m_ptr->hp = m_ptr->maxhp / 2;
3309         else m_ptr->hp = m_ptr->maxhp;
3310         
3311         
3312         /* dealt damage is 0 at initial*/
3313         m_ptr->dealt_damage = 0;
3314
3315
3316         /* Extract the monster base speed */
3317         m_ptr->mspeed = get_mspeed(r_ptr);
3318
3319         if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100);
3320
3321         /* Give a random starting energy */
3322         if (!ironman_nightmare)
3323         {
3324                 m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100);
3325         }
3326         else
3327         {
3328                 /* Nightmare monsters are more prepared */
3329                 m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100) * 2;
3330         }
3331
3332         /* Force monster to wait for player, unless in Nightmare mode */
3333         if ((r_ptr->flags1 & RF1_FORCE_SLEEP) && !ironman_nightmare)
3334         {
3335                 /* Monster is still being nice */
3336                 m_ptr->mflag |= (MFLAG_NICE);
3337
3338                 /* Must repair monsters */
3339                 repair_monsters = TRUE;
3340         }
3341
3342         /* Hack -- see "process_monsters()" */
3343         if (c_ptr->m_idx < hack_m_idx)
3344         {
3345                 /* Monster is still being born */
3346                 m_ptr->mflag |= (MFLAG_BORN);
3347         }
3348
3349
3350         if (r_ptr->flags7 & RF7_SELF_LD_MASK)
3351                 p_ptr->update |= (PU_MON_LITE);
3352         else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !MON_CSLEEP(m_ptr))
3353                 p_ptr->update |= (PU_MON_LITE);
3354
3355         /* Update the monster */
3356         update_mon(c_ptr->m_idx, TRUE);
3357
3358
3359         /* Count the monsters on the level */
3360         real_r_ptr(m_ptr)->cur_num++;
3361
3362         /*
3363          * Memorize location of the unique monster in saved floors.
3364          * A unique monster move from old saved floor.
3365          */
3366         if (character_dungeon &&
3367             ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)))
3368                 real_r_ptr(m_ptr)->floor_id = p_ptr->floor_id;
3369
3370         /* Hack -- Count the number of "reproducers" */
3371         if (r_ptr->flags2 & RF2_MULTIPLY) num_repro++;
3372
3373         /* Hack -- Notice new multi-hued monsters */
3374         {
3375                 monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
3376                 if (ap_r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER))
3377                         shimmer_monsters = TRUE;
3378         }
3379
3380         if (p_ptr->warning && character_dungeon)
3381         {
3382                 if (r_ptr->flags1 & RF1_UNIQUE)
3383                 {
3384                         cptr color;
3385                         object_type *o_ptr;
3386                         char o_name[MAX_NLEN];
3387
3388                         if (r_ptr->level > p_ptr->lev + 30)
3389                                 color = _("黒く", "black");
3390                         else if (r_ptr->level > p_ptr->lev + 15)
3391                                 color = _("紫色に", "purple");
3392                         else if (r_ptr->level > p_ptr->lev + 5)
3393                                 color = _("ルビー色に", "deep red");
3394                         else if (r_ptr->level > p_ptr->lev - 5)
3395                                 color = _("赤く", "red");
3396                         else if (r_ptr->level > p_ptr->lev - 15)
3397                                 color = _("ピンク色に", "pink");
3398                         else
3399                                 color = _("白く", "white");
3400
3401                         o_ptr = choose_warning_item();
3402                         if (o_ptr)
3403                         {
3404                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3405                                 msg_format(_("%sは%s光った。", "%s glows %s."), o_name, color);
3406                         }
3407                         else
3408                         {
3409                                 msg_format(_("%s光る物が頭に浮かんだ。", "An %s image forms in your mind."), color);
3410                         }
3411                 }
3412         }
3413
3414         if (is_explosive_rune_grid(c_ptr))
3415         {
3416                 /* Break the ward */
3417                 if (randint1(BREAK_MINOR_GLYPH) > r_ptr->level)
3418                 {
3419                         /* Describe observable breakage */
3420                         if (c_ptr->info & CAVE_MARK)
3421                         {
3422                                 msg_print(_("ルーンが爆発した!", "The rune explodes!"));
3423                                 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);
3424                         }
3425                 }
3426                 else
3427                 {
3428                         msg_print(_("爆発のルーンは解除された。", "An explosive rune was disarmed."));
3429                 }
3430
3431                 /* Forget the rune */
3432                 c_ptr->info &= ~(CAVE_MARK);
3433
3434                 /* Break the rune */
3435                 c_ptr->info &= ~(CAVE_OBJECT);
3436                 c_ptr->mimic = 0;
3437
3438                 note_spot(y, x);
3439                 lite_spot(y, x);
3440         }
3441
3442         /* Success */
3443         return (TRUE);
3444 }
3445
3446
3447
3448 #define MON_SCAT_MAXD 10 /*!< mon_scatter()関数によるモンスター配置で許される中心からの最大距離 */
3449
3450 /*!
3451  * @brief モンスター1体を目標地点に可能ながり近い位置に生成する / improved version of scatter() for place monster
3452  * @param r_idx 生成モンスター種族
3453  * @param yp 結果生成位置y座標
3454  * @param xp 結果生成位置x座標
3455  * @param y 中心生成位置y座標
3456  * @param x 中心生成位置x座標
3457  * @param max_dist 生成位置の最大半径
3458  * @return 成功したらtrue
3459  *  
3460  */
3461 static bool mon_scatter(int r_idx, int *yp, int *xp, int y, int x, int max_dist)
3462 {
3463         int place_x[MON_SCAT_MAXD];
3464         int place_y[MON_SCAT_MAXD];
3465         int num[MON_SCAT_MAXD];
3466         int i;
3467         int nx, ny;
3468
3469         if (max_dist >= MON_SCAT_MAXD)
3470                 return FALSE;
3471
3472         for (i = 0; i < MON_SCAT_MAXD; i++)
3473                 num[i] = 0;
3474
3475         for (nx = x - max_dist; nx <= x + max_dist; nx++)
3476         {
3477                 for (ny = y - max_dist; ny <= y + max_dist; ny++)
3478                 {
3479                         /* Ignore annoying locations */
3480                         if (!in_bounds(ny, nx)) continue;
3481
3482                         /* Require "line of projection" */
3483                         if (!projectable(y, x, ny, nx)) continue;
3484
3485                         if (r_idx > 0)
3486                         {
3487                                 monster_race *r_ptr = &r_info[r_idx];
3488
3489                                 /* Require empty space (if not ghostly) */
3490                                 if (!monster_can_enter(ny, nx, r_ptr, 0))
3491                                         continue;
3492                         }
3493                         else
3494                         {
3495                                 /* Walls and Monsters block flow */
3496                                 if (!cave_empty_bold2(ny, nx)) continue;
3497
3498                                 /* ... nor on the Pattern */
3499                                 if (pattern_tile(ny, nx)) continue;
3500                         }
3501
3502                         i = distance(y, x, ny, nx);
3503
3504                         if (i > max_dist)
3505                                 continue;
3506
3507                         num[i]++;
3508
3509                         /* random swap */
3510                         if (one_in_(num[i]))
3511                         {
3512                                 place_x[i] = nx;
3513                                 place_y[i] = ny;
3514                         }
3515                 }
3516         }
3517
3518         i = 0;
3519         while (i < MON_SCAT_MAXD && 0 == num[i])
3520                 i++;
3521         if (i >= MON_SCAT_MAXD)
3522                 return FALSE;
3523
3524         *xp = place_x[i];
3525         *yp = place_y[i];
3526
3527         return TRUE;
3528 }
3529
3530 #define GROUP_MAX 32 /*!< place_monster_group() 関数によるモンスターのGROUP生成時の配置最大数 / Maximum size of a group of monsters */
3531
3532 /*!
3533  * @brief モンスターを目標地点に集団生成する / Attempt to place a "group" of monsters around the given location
3534  * @param who 召喚主のモンスター情報ID
3535  * @param y 中心生成位置y座標
3536  * @param x 中心生成位置x座標
3537  * @param r_idx 生成モンスター種族
3538  * @param mode 生成オプション
3539  * @return 成功したらtrue
3540  */
3541 static bool place_monster_group(int who, int y, int x, int r_idx, u32b mode)
3542 {
3543         monster_race *r_ptr = &r_info[r_idx];
3544
3545         int n, i;
3546         int total = 0, extra = 0;
3547
3548         int hack_n = 0;
3549
3550         byte hack_y[GROUP_MAX];
3551         byte hack_x[GROUP_MAX];
3552
3553
3554         /* Pick a group size */
3555         total = randint1(10);
3556
3557         /* Hard monsters, small groups */
3558         if (r_ptr->level > dun_level)
3559         {
3560                 extra = r_ptr->level - dun_level;
3561                 extra = 0 - randint1(extra);
3562         }
3563
3564         /* Easy monsters, large groups */
3565         else if (r_ptr->level < dun_level)
3566         {
3567                 extra = dun_level - r_ptr->level;
3568                 extra = randint1(extra);
3569         }
3570
3571         /* Hack -- limit group reduction */
3572         if (extra > 9) extra = 9;
3573
3574         /* Modify the group size */
3575         total += extra;
3576
3577         /* Minimum size */
3578         if (total < 1) total = 1;
3579
3580         /* Maximum size */
3581         if (total > GROUP_MAX) total = GROUP_MAX;
3582
3583
3584         /* Start on the monster */
3585         hack_n = 1;
3586         hack_x[0] = x;
3587         hack_y[0] = y;
3588
3589         /* Puddle monsters, breadth first, up to total */
3590         for (n = 0; (n < hack_n) && (hack_n < total); n++)
3591         {
3592                 /* Grab the location */
3593                 int hx = hack_x[n];
3594                 int hy = hack_y[n];
3595
3596                 /* Check each direction, up to total */
3597                 for (i = 0; (i < 8) && (hack_n < total); i++)
3598                 {
3599                         int mx, my;
3600
3601                         scatter(&my, &mx, hy, hx, 4, 0);
3602
3603                         /* Walls and Monsters block flow */
3604                         if (!cave_empty_bold2(my, mx)) continue;
3605
3606                         /* Attempt to place another monster */
3607                         if (place_monster_one(who, my, mx, r_idx, mode))
3608                         {
3609                                 /* Add it to the "hack" set */
3610                                 hack_y[hack_n] = my;
3611                                 hack_x[hack_n] = mx;
3612                                 hack_n++;
3613                         }
3614                 }
3615         }
3616
3617
3618         /* Success */
3619         return (TRUE);
3620 }
3621
3622 /*!
3623  * @var place_monster_idx
3624  * @brief 護衛対象となるモンスター種族IDを渡すグローバル変数 / Hack -- help pick an escort type
3625  * @todo 関数ポインタの都合を配慮しながら、グローバル変数place_monster_idxを除去し、関数引数化する
3626  */
3627 static int place_monster_idx = 0;
3628
3629 /*!
3630  * @var place_monster_m_idx
3631  * @brief 護衛対象となるモンスターIDを渡すグローバル変数 / Hack -- help pick an escort type
3632  * @todo 関数ポインタの都合を配慮しながら、グローバル変数place_monster_m_idxを除去し、関数引数化する
3633  */
3634 static int place_monster_m_idx = 0;
3635
3636 /*!
3637  * @brief モンスター種族が召喚主の護衛となれるかどうかをチェックする / Hack -- help pick an escort type
3638  * @param r_idx チェックするモンスター種族のID
3639  * @return 護衛にできるならばtrue
3640  */
3641 static bool place_monster_can_escort(int r_idx)
3642 {
3643         monster_race *r_ptr = &r_info[place_monster_idx];
3644         monster_type *m_ptr = &m_list[place_monster_m_idx];
3645
3646         monster_race *z_ptr = &r_info[r_idx];
3647
3648         /* Hack - Escorts have to have the same dungeon flag */
3649         if (mon_hook_dungeon(place_monster_idx) != mon_hook_dungeon(r_idx)) return (FALSE);
3650
3651         /* Require similar "race" */
3652         if (z_ptr->d_char != r_ptr->d_char) return (FALSE);
3653
3654         /* Skip more advanced monsters */
3655         if (z_ptr->level > r_ptr->level) return (FALSE);
3656
3657         /* Skip unique monsters */
3658         if (z_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3659
3660         /* Paranoia -- Skip identical monsters */
3661         if (place_monster_idx == r_idx) return (FALSE);
3662
3663         /* Skip different alignment */
3664         if (monster_has_hostile_align(m_ptr, 0, 0, z_ptr)) return FALSE;
3665
3666         if (r_ptr->flags7 & RF7_FRIENDLY)
3667         {
3668                 if (monster_has_hostile_align(NULL, 1, -1, z_ptr)) return FALSE;
3669         }
3670
3671         if ((r_ptr->flags7 & RF7_CHAMELEON) && !(z_ptr->flags7 & RF7_CHAMELEON))
3672                 return FALSE;
3673
3674         /* Okay */
3675         return (TRUE);
3676 }
3677
3678
3679 /*!
3680  * @brief 一般的なモンスター生成処理のサブルーチン / Attempt to place a monster of the given race at the given location
3681  * @param who 召喚主のモンスター情報ID
3682  * @param y 生成地点y座標
3683  * @param x 生成地点x座標
3684  * @param r_idx 生成するモンスターの種族ID
3685  * @param mode 生成オプション
3686  * @return 生成に成功したらtrue
3687  * @details
3688  * Note that certain monsters are now marked as requiring "friends".
3689  * These monsters, if successfully placed, and if the "grp" parameter
3690  * is TRUE, will be surrounded by a "group" of identical monsters.
3691  *
3692  * Note that certain monsters are now marked as requiring an "escort",
3693  * which is a collection of monsters with similar "race" but lower level.
3694  *
3695  * Some monsters induce a fake "group" flag on their escorts.
3696  *
3697  * Note the "bizarre" use of non-recursion to prevent annoying output
3698  * when running a code profiler.
3699  *
3700  * Note the use of the new "monster allocation table" code to restrict
3701  * the "get_mon_num()" function to "legal" escort types.
3702  */
3703 bool place_monster_aux(int who, int y, int x, int r_idx, u32b mode)
3704 {
3705         int             i, j, n;
3706         monster_race    *r_ptr = &r_info[r_idx];
3707
3708         if (!(mode & PM_NO_KAGE) && one_in_(333))
3709                 mode |= PM_KAGE;
3710
3711         /* Place one monster, or fail */
3712         if (!place_monster_one(who, y, x, r_idx, mode)) return (FALSE);
3713
3714         /* Require the "group" flag */
3715         if (!(mode & PM_ALLOW_GROUP)) return (TRUE);
3716
3717         place_monster_m_idx = hack_m_idx_ii;
3718
3719         /* Reinforcement */
3720         for(i = 0; i < 6; i++)
3721         {
3722                 if(!r_ptr->reinforce_id[i]) break;
3723                 n = damroll(r_ptr->reinforce_dd[i], r_ptr->reinforce_ds[i]);
3724                 for(j = 0; j < n; j++)
3725                 {
3726                         int nx, ny, d = 7;
3727                         scatter(&ny, &nx, y, x, d, 0);
3728                         (void)place_monster_one(place_monster_m_idx, ny, nx, r_ptr->reinforce_id[i], mode);
3729                 }
3730         }
3731
3732         /* Friends for certain monsters */
3733         if (r_ptr->flags1 & (RF1_FRIENDS))
3734         {
3735                 /* Attempt to place a group */
3736                 (void)place_monster_group(who, y, x, r_idx, mode);
3737         }
3738
3739         /* Escorts for certain monsters */
3740         if (r_ptr->flags1 & (RF1_ESCORT))
3741         {
3742                 /* Set the escort index */
3743                 place_monster_idx = r_idx;
3744
3745                 /* Try to place several "escorts" */
3746                 for (i = 0; i < 32; i++)
3747                 {
3748                         int nx, ny, z, d = 3;
3749
3750                         /* Pick a location */
3751                         scatter(&ny, &nx, y, x, d, 0);
3752
3753                         /* Require empty grids */
3754                         if (!cave_empty_bold2(ny, nx)) continue;
3755
3756                         /* Prepare allocation table */
3757                         get_mon_num_prep(place_monster_can_escort, get_monster_hook2(ny, nx));
3758
3759                         /* Pick a random race */
3760                         z = get_mon_num(r_ptr->level);
3761
3762                         /* Handle failure */
3763                         if (!z) break;
3764
3765                         /* Place a single escort */
3766                         (void)place_monster_one(place_monster_m_idx, ny, nx, z, mode);
3767
3768                         /* Place a "group" of escorts if needed */
3769                         if ((r_info[z].flags1 & RF1_FRIENDS) ||
3770                             (r_ptr->flags1 & RF1_ESCORTS))
3771                         {
3772                                 /* Place a group of monsters */
3773                                 (void)place_monster_group(place_monster_m_idx, ny, nx, z, mode);
3774                         }
3775                 }
3776         }
3777
3778         /* Success */
3779         return (TRUE);
3780 }
3781
3782 /*!
3783  * @brief 一般的なモンスター生成処理のメインルーチン / Attempt to place a monster of the given race at the given location
3784  * @param y 生成地点y座標
3785  * @param x 生成地点x座標
3786  * @param mode 生成オプション
3787  * @return 生成に成功したらtrue
3788  */
3789 bool place_monster(int y, int x, u32b mode)
3790 {
3791         int r_idx;
3792
3793         /* Prepare allocation table */
3794         get_mon_num_prep(get_monster_hook(), get_monster_hook2(y, x));
3795
3796         /* Pick a monster */
3797         r_idx = get_mon_num(monster_level);
3798
3799         /* Handle failure */
3800         if (!r_idx) return (FALSE);
3801
3802         /* Attempt to place the monster */
3803         if (place_monster_aux(0, y, x, r_idx, mode)) return (TRUE);
3804
3805         /* Oops */
3806         return (FALSE);
3807 }
3808
3809
3810 #ifdef MONSTER_HORDES
3811
3812 /*!
3813  * @brief 指定地点に1種類のモンスター種族による群れを生成する
3814  * @param y 生成地点y座標
3815  * @param x 生成地点x座標
3816  * @return 生成に成功したらtrue
3817  */
3818 bool alloc_horde(int y, int x)
3819 {
3820         monster_race *r_ptr = NULL;
3821         int r_idx = 0;
3822         int m_idx;
3823         int attempts = 1000;
3824         int cy = y;
3825         int cx = x;
3826
3827         /* Prepare allocation table */
3828         get_mon_num_prep(get_monster_hook(), get_monster_hook2(y, x));
3829
3830         while (--attempts)
3831         {
3832                 /* Pick a monster */
3833                 r_idx = get_mon_num(monster_level);
3834
3835                 /* Handle failure */
3836                 if (!r_idx) return (FALSE);
3837
3838                 r_ptr = &r_info[r_idx];
3839
3840                 if (r_ptr->flags1 & RF1_UNIQUE) continue;
3841
3842                 if (r_idx == MON_HAGURE) continue;
3843                 break;
3844         }
3845         if (attempts < 1) return FALSE;
3846
3847         attempts = 1000;
3848
3849         while (--attempts)
3850         {
3851                 /* Attempt to place the monster */
3852                 if (place_monster_aux(0, y, x, r_idx, 0L)) break;
3853         }
3854
3855         if (attempts < 1) return FALSE;
3856
3857         m_idx = cave[y][x].m_idx;
3858
3859         if (m_list[m_idx].mflag2 & MFLAG2_CHAMELEON) r_ptr = &r_info[m_list[m_idx].r_idx];
3860         summon_kin_type = r_ptr->d_char;
3861
3862         for (attempts = randint1(10) + 5; attempts; attempts--)
3863         {
3864                 scatter(&cy, &cx, y, x, 5, 0);
3865
3866                 (void)summon_specific(m_idx, cy, cx, dun_level + 5, SUMMON_KIN, PM_ALLOW_GROUP);
3867
3868                 y = cy;
3869                 x = cx;
3870         }
3871
3872         return TRUE;
3873 }
3874
3875 #endif /* MONSTER_HORDES */
3876
3877
3878 /*!
3879  * @brief ダンジョンの主生成を試みる / Put the Guardian
3880  * @param def_val 現在の主の生成状態
3881  * @return 生成に成功したらtrue
3882  */
3883 bool alloc_guardian(bool def_val)
3884 {
3885         int guardian = d_info[dungeon_type].final_guardian;
3886
3887         if (guardian && (d_info[dungeon_type].maxdepth == dun_level) && (r_info[guardian].cur_num < r_info[guardian].max_num))
3888         {
3889                 int oy;
3890                 int ox;
3891                 int try_count = 4000;
3892
3893                 /* Find a good position */
3894                 while (try_count)
3895                 {
3896                         /* Get a random spot */
3897                         oy = randint1(cur_hgt - 4) + 2;
3898                         ox = randint1(cur_wid - 4) + 2;
3899
3900                         /* Is it a good spot ? */
3901                         if (cave_empty_bold2(oy, ox) && monster_can_cross_terrain(cave[oy][ox].feat, &r_info[guardian], 0))
3902                         {
3903                                 /* Place the guardian */
3904                                 if (place_monster_aux(0, oy, ox, guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) return TRUE;
3905                         }
3906
3907                         /* One less try count */
3908                         try_count--;
3909                 }
3910
3911                 return FALSE;
3912         }
3913
3914         return def_val;
3915 }
3916
3917
3918 /*!
3919  * @brief ダンジョンの初期配置モンスターを生成1回生成する / Attempt to allocate a random monster in the dungeon.
3920  * @param dis プレイヤーから離れるべき最低距離
3921  * @param mode 生成オプション
3922  * @return 生成に成功したらtrue
3923  * @details
3924  * Place the monster at least "dis" distance from the player.
3925  * Use "slp" to choose the initial "sleep" status
3926  * Use "monster_level" for the monster level
3927  */
3928 bool alloc_monster(int dis, u32b mode)
3929 {
3930         int                     y = 0, x = 0;
3931         int         attempts_left = 10000;
3932
3933         /* Put the Guardian */
3934         if (alloc_guardian(FALSE)) return TRUE;
3935
3936         /* Find a legal, distant, unoccupied, space */
3937         while (attempts_left--)
3938         {
3939                 /* Pick a location */
3940                 y = randint0(cur_hgt);
3941                 x = randint0(cur_wid);
3942
3943                 /* Require empty floor grid (was "naked") */
3944                 if (dun_level)
3945                 {
3946                         if (!cave_empty_bold2(y, x)) continue;
3947                 }
3948                 else
3949                 {
3950                         if (!cave_empty_bold(y, x)) continue;
3951                 }
3952
3953                 /* Accept far away grids */
3954                 if (distance(y, x, p_ptr->y, p_ptr->x) > dis) break;
3955         }
3956
3957         if (!attempts_left)
3958         {
3959                 if (cheat_xtra || cheat_hear)
3960                 {
3961                         msg_print(_("警告!新たなモンスターを配置できません。小さい階ですか?", "Warning! Could not allocate a new monster. Small level?"));
3962                 }
3963
3964                 return (FALSE);
3965         }
3966
3967
3968 #ifdef MONSTER_HORDES
3969         if (randint1(5000) <= dun_level)
3970         {
3971                 if (alloc_horde(y, x))
3972                 {
3973                         if (cheat_hear) msg_format(_("モンスターの大群(%c)", "Monster horde (%c)."), summon_kin_type);
3974                         return (TRUE);
3975                 }
3976         }
3977         else
3978         {
3979 #endif /* MONSTER_HORDES */
3980
3981                 /* Attempt to place the monster, allow groups */
3982                 if (place_monster(y, x, (mode | PM_ALLOW_GROUP))) return (TRUE);
3983
3984 #ifdef MONSTER_HORDES
3985         }
3986 #endif /* MONSTER_HORDES */
3987
3988         /* Nope */
3989         return (FALSE);
3990 }
3991
3992
3993 /*!
3994  * @brief モンスターが召喚の基本条件に合っているかをチェックする / Hack -- help decide if a monster race is "okay" to summon
3995  * @param r_idx チェックするモンスター種族ID
3996  * @return 召喚対象にできるならばTRUE
3997  */
3998 static bool summon_specific_okay(int r_idx)
3999 {
4000         monster_race *r_ptr = &r_info[r_idx];
4001
4002         /* Hack - Only summon dungeon monsters */
4003         if (!mon_hook_dungeon(r_idx)) return (FALSE);
4004
4005         /* Hack -- identify the summoning monster */
4006         if (summon_specific_who > 0)
4007         {
4008                 monster_type *m_ptr = &m_list[summon_specific_who];
4009
4010                 /* Do not summon enemies */
4011
4012                 /* Friendly vs. opposite aligned normal or pet */
4013                 if (monster_has_hostile_align(m_ptr, 0, 0, r_ptr)) return FALSE;
4014         }
4015         /* Use the player's alignment */
4016         else if (summon_specific_who < 0)
4017         {
4018                 /* Do not summon enemies of the pets */
4019                 if (monster_has_hostile_align(NULL, 10, -10, r_ptr))
4020                 {
4021                         if (!one_in_(ABS(p_ptr->align) / 2 + 1)) return FALSE;
4022                 }
4023         }
4024
4025         /* Hack -- no specific type specified */
4026         if (!summon_specific_type) return (TRUE);
4027
4028         if (!summon_unique_okay && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))) return FALSE;
4029
4030         if ((summon_specific_who < 0) &&
4031             ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) &&
4032             monster_has_hostile_align(NULL, 10, -10, r_ptr))
4033                 return FALSE;
4034
4035         if ((r_ptr->flags7 & RF7_CHAMELEON) && (d_info[dungeon_type].flags1 & DF1_CHAMELEON)) return TRUE;
4036
4037         return (summon_specific_aux(r_idx));
4038 }
4039
4040
4041 /*!
4042  * @brief モンスターを召喚により配置する / Place a monster (of the specified "type") near the given location. Return TRUE if a monster was actually summoned.
4043  * @param who 召喚主のモンスター情報ID
4044  * @param y1 目標地点y座標
4045  * @param x1 目標地点x座標
4046  * @param lev 相当生成階
4047  * @param type 召喚種別
4048  * @param mode 生成オプション 
4049  * @return 召喚できたらtrueを返す
4050  * @details
4051  *
4052  * We will attempt to place the monster up to 10 times before giving up.
4053  *
4054  * Note: SUMMON_UNIQUE and SUMMON_AMBERITES will summon Unique's
4055  * Note: SUMMON_HI_UNDEAD and SUMMON_HI_DRAGON may summon Unique's
4056  * Note: None of the other summon codes will ever summon Unique's.
4057  *
4058  * This function has been changed.  We now take the "monster level"
4059  * of the summoning monster as a parameter, and use that, along with
4060  * the current dungeon level, to help determine the level of the
4061  * desired monster.  Note that this is an upper bound, and also
4062  * tends to "prefer" monsters of that level.  Currently, we use
4063  * the average of the dungeon and monster levels, and then add
4064  * five to allow slight increases in monster power.
4065  *
4066  * Note that we use the new "monster allocation table" creation code
4067  * to restrict the "get_mon_num()" function to the set of "legal"
4068  * monsters, making this function much faster and more reliable.
4069  *
4070  * Note that this function may not succeed, though this is very rare.
4071  */
4072 bool summon_specific(int who, int y1, int x1, int lev, int type, u32b mode)
4073 {
4074         int x, y, r_idx;
4075
4076         if (p_ptr->inside_arena) return (FALSE);
4077
4078         if (!mon_scatter(0, &y, &x, y1, x1, 2)) return FALSE;
4079
4080         /* Save the summoner */
4081         summon_specific_who = who;
4082
4083         /* Save the "summon" type */
4084         summon_specific_type = type;
4085
4086         summon_unique_okay = (mode & PM_ALLOW_UNIQUE) ? TRUE : FALSE;
4087
4088         /* Prepare allocation table */
4089         get_mon_num_prep(summon_specific_okay, get_monster_hook2(y, x));
4090
4091         /* Pick a monster, using the level calculation */
4092         r_idx = get_mon_num((dun_level + lev) / 2 + 5);
4093
4094         /* Handle failure */
4095         if (!r_idx)
4096         {
4097                 summon_specific_type = 0;
4098                 return (FALSE);
4099         }
4100
4101         if ((type == SUMMON_BLUE_HORROR) || (type == SUMMON_DAWN)) mode |= PM_NO_KAGE;
4102
4103         /* Attempt to place the monster (awake, allow groups) */
4104         if (!place_monster_aux(who, y, x, r_idx, mode))
4105         {
4106                 summon_specific_type = 0;
4107                 return (FALSE);
4108         }
4109
4110         summon_specific_type = 0;
4111         /* Success */
4112         return (TRUE);
4113 }
4114
4115
4116 /*!
4117  * @brief 特定モンスター種族を召喚により生成する / A "dangerous" function, creates a pet of the specified type
4118  * @param who 召喚主のモンスター情報ID
4119  * @param oy 目標地点y座標
4120  * @param ox 目標地点x座標
4121  * @param r_idx 生成するモンスター種族ID
4122  * @param mode 生成オプション 
4123  * @return 召喚できたらtrueを返す
4124  */
4125 bool summon_named_creature (int who, int oy, int ox, int r_idx, u32b mode)
4126 {
4127         int x, y;
4128
4129         /* Paranoia */
4130         /* if (!r_idx) return; */
4131
4132         /* Prevent illegal monsters */
4133         if (r_idx >= max_r_idx) return FALSE;
4134
4135         if (p_ptr->inside_arena) return FALSE;
4136
4137         if (!mon_scatter(r_idx, &y, &x, oy, ox, 2)) return FALSE;
4138
4139         /* Place it (allow groups) */
4140         return place_monster_aux(who, y, x, r_idx, (mode | PM_NO_KAGE));
4141 }
4142
4143
4144 /*!
4145  * @brief モンスターを増殖生成する / Let the given monster attempt to reproduce.
4146  * @param m_idx 増殖するモンスター情報ID
4147  * @param clone クローン・モンスター処理ならばtrue
4148  * @param mode 生成オプション 
4149  * @return 生成できたらtrueを返す
4150  * @details
4151  * Note that "reproduction" REQUIRES empty space.
4152  */
4153 bool multiply_monster(int m_idx, bool clone, u32b mode)
4154 {
4155         monster_type    *m_ptr = &m_list[m_idx];
4156
4157         int y, x;
4158
4159         if (!mon_scatter(m_ptr->r_idx, &y, &x, m_ptr->fy, m_ptr->fx, 1))
4160                 return FALSE;
4161
4162         if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET;
4163
4164         /* Create a new monster (awake, no groups) */
4165         if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE | PM_MULTIPLY)))
4166                 return FALSE;
4167
4168         /* Hack -- Transfer "clone" flag */
4169         if (clone || (m_ptr->smart & SM_CLONED))
4170         {
4171                 m_list[hack_m_idx_ii].smart |= SM_CLONED;
4172                 m_list[hack_m_idx_ii].mflag2 |= MFLAG2_NOPET;
4173         }
4174
4175         return TRUE;
4176 }
4177
4178
4179
4180 /*!
4181  * @brief ダメージを受けたモンスターの様子を記述する / Dump a message describing a monster's reaction to damage
4182  * @param m_idx モンスター情報ID
4183  * @param dam 与えたダメージ
4184  * @return なし
4185  * @details
4186  * Technically should attempt to treat "Beholder"'s as jelly's
4187  */
4188 void message_pain(int m_idx, int dam)
4189 {
4190         long oldhp, newhp, tmp;
4191         int percentage;
4192
4193         monster_type *m_ptr = &m_list[m_idx];
4194         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4195
4196         char m_name[80];
4197
4198         /* Get the monster name */
4199         monster_desc(m_name, m_ptr, 0);
4200
4201         if(dam == 0) // Notice non-damage
4202         {
4203                 msg_format(_("%^sはダメージを受けていない。", "%^s is unharmed."), m_name);
4204                 return;
4205         }
4206
4207         /* Note -- subtle fix -CFT */
4208         newhp = (long)(m_ptr->hp);
4209         oldhp = newhp + (long)(dam);
4210         tmp = (newhp * 100L) / oldhp;
4211         percentage = (int)(tmp);
4212
4213         if(my_strchr(",ejmvwQ", r_ptr->d_char)) // Mushrooms, Eyes, Jellies, Molds, Vortices, Worms, Quylthulgs
4214         {
4215 #ifdef JP
4216                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4217                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4218                 else if(percentage > 50) msg_format("%^sは縮こまった。", m_name);
4219                 else if(percentage > 35) msg_format("%^sは痛みに震えた。", m_name);
4220                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4221                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4222                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4223 #else
4224                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4225                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4226                 else if(percentage > 50) msg_format("%^s squelches.", m_name);
4227                 else if(percentage > 35) msg_format("%^s quivers in pain.", m_name);
4228                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4229                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4230                 else msg_format("%^s jerks limply.", m_name);
4231 #endif
4232         }
4233
4234         else if(my_strchr("l", r_ptr->d_char)) // Fish
4235         {
4236 #ifdef JP
4237                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4238                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4239                 else if(percentage > 50) msg_format("%^sは躊躇した。", m_name);
4240                 else if(percentage > 35) msg_format("%^sは痛みに震えた。", m_name);
4241                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4242                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4243                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4244 #else
4245                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4246                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4247                 else if(percentage > 50) msg_format("%^s hesitates.", m_name);
4248                 else if(percentage > 35) msg_format("%^s quivers in pain.", m_name);
4249                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4250                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4251                 else msg_format("%^s jerks limply.", m_name);
4252 #endif          
4253         }
4254
4255         else if(my_strchr("g#+<>", r_ptr->d_char)) // Golems, Walls, Doors, Stairs
4256         {       
4257 #ifdef JP
4258                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4259                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4260                 else if(percentage > 50) msg_format("%^sは雷鳴のように吠えた。", m_name);
4261                 else if(percentage > 35) msg_format("%^sは苦しげに吠えた。", m_name);
4262                 else if(percentage > 20) msg_format("%^sはうめいた。", m_name);
4263                 else if(percentage > 10) msg_format("%^sは躊躇した。", m_name);
4264                 else msg_format("%^sはくしゃくしゃになった。", m_name);
4265 #else
4266                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4267                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4268                 else if(percentage > 50) msg_format("%^s roars thunderously.", m_name);
4269                 else if(percentage > 35) msg_format("%^s rumbles.", m_name);
4270                 else if(percentage > 20) msg_format("%^s grunts.", m_name);
4271                 else if(percentage > 10) msg_format("%^s hesitates.", m_name);
4272                 else msg_format("%^s crumples.", m_name);
4273 #endif
4274         }
4275
4276         else if(my_strchr("JMR", r_ptr->d_char) || !isalpha(r_ptr->d_char)) // Snakes, Hydrae, Reptiles, Mimics
4277         {
4278 #ifdef JP
4279                 if(percentage > 95) msg_format("%^sはほとんど気にとめていない。", m_name);
4280                 else if(percentage > 75) msg_format("%^sはシーッと鳴いた。", m_name);
4281                 else if(percentage > 50) msg_format("%^sは怒って頭を上げた。", m_name);
4282                 else if(percentage > 35) msg_format("%^sは猛然と威嚇した。", m_name);
4283                 else if(percentage > 20) msg_format("%^sは身もだえした。", m_name);
4284                 else if(percentage > 10) msg_format("%^sは苦痛で身もだえした。", m_name);
4285                 else msg_format("%^sはぐにゃぐにゃと痙攣した。", m_name);
4286 #else
4287                 if(percentage > 95) msg_format("%^s barely notices.", m_name);
4288                 else if(percentage > 75) msg_format("%^s hisses.", m_name);
4289                 else if(percentage > 50) msg_format("%^s rears up in anger.", m_name);
4290                 else if(percentage > 35) msg_format("%^s hisses furiously.", m_name);
4291                 else if(percentage > 20) msg_format("%^s writhes about.", m_name);
4292                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4293                 else msg_format("%^s jerks limply.", m_name);
4294 #endif
4295         }
4296
4297         else if(my_strchr("f", r_ptr->d_char))
4298         {
4299 #ifdef JP
4300                 if(percentage > 95) msg_format("%sは攻撃に肩をすくめた。", m_name);
4301                 else if(percentage > 75) msg_format("%^sは吠えた。", m_name);
4302                 else if(percentage > 50) msg_format("%^sは怒って吠えた。", m_name);
4303                 else if(percentage > 35) msg_format("%^sは痛みでシーッと鳴いた。", m_name);
4304                 else if(percentage > 20) msg_format("%^sは痛みで弱々しく鳴いた。", m_name);
4305                 else if(percentage > 10) msg_format("%^sは苦痛にうめいた。", m_name);
4306                 else msg_format("%sは哀れな鳴き声を出した。", m_name);
4307 #else
4308                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4309                 else if(percentage > 75) msg_format("%^s roars.", m_name);
4310                 else if(percentage > 50) msg_format("%^s growls angrily.", m_name);
4311                 else if(percentage > 35) msg_format("%^s hisses with pain.", m_name);
4312                 else if(percentage > 20) msg_format("%^s mewls in pain.", m_name);
4313                 else if(percentage > 10) msg_format("%^s hisses in agony.", m_name);
4314                 else msg_format("%^s mewls pitifully.", m_name);
4315 #endif
4316         }
4317
4318         else if(my_strchr("acFIKS", r_ptr->d_char)) // Ants, Centipedes, Flies, Insects, Beetles, Spiders
4319         {
4320 #ifdef JP
4321                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4322                 else if(percentage > 75) msg_format("%^sはキーキー鳴いた。", m_name);
4323                 else if(percentage > 50) msg_format("%^sはヨロヨロ逃げ回った。", m_name);
4324                 else if(percentage > 35) msg_format("%^sはうるさく鳴いた。", m_name);
4325                 else if(percentage > 20) msg_format("%^sは痛みに痙攣した。", m_name);
4326                 else if(percentage > 10) msg_format("%^sは苦痛で痙攣した。", m_name);
4327                 else msg_format("%^sはピクピクひきつった。", m_name);
4328 #else
4329                 if(percentage > 95)     msg_format("%^s ignores the attack.", m_name);
4330                 else if(percentage > 75) msg_format("%^s chitters.", m_name);
4331                 else if(percentage > 50) msg_format("%^s scuttles about.", m_name);
4332                 else if(percentage > 35) msg_format("%^s twitters.", m_name);
4333                 else if(percentage > 20) msg_format("%^s jerks in pain.", m_name);
4334                 else if(percentage > 10) msg_format("%^s jerks in agony.", m_name);
4335                 else msg_format("%^s twitches.", m_name);
4336 #endif
4337         }
4338
4339         else if(my_strchr("B", r_ptr->d_char)) // Birds
4340         {               
4341 #ifdef JP
4342                 if(percentage > 95) msg_format("%^sはさえずった。", m_name);
4343                 else if(percentage > 75) msg_format("%^sはピーピー鳴いた。", m_name);
4344                 else if(percentage > 50) msg_format("%^sはギャーギャー鳴いた。", m_name);
4345                 else if(percentage > 35) msg_format("%^sはギャーギャー鳴きわめいた。", m_name);
4346                 else if(percentage > 20) msg_format("%^sは苦しんだ。", m_name);
4347                 else if(percentage > 10) msg_format("%^sはのたうち回った。", m_name);
4348                 else msg_format("%^sはキーキーと鳴き叫んだ。", m_name);
4349 #else
4350                 if(percentage > 95)     msg_format("%^s chirps.", m_name);
4351                 else if(percentage > 75) msg_format("%^s twitters.", m_name);
4352                 else if(percentage > 50) msg_format("%^s squawks.", m_name);
4353                 else if(percentage > 35) msg_format("%^s chatters.", m_name);
4354                 else if(percentage > 20) msg_format("%^s jeers.", m_name);
4355                 else if(percentage > 10) msg_format("%^s flutters about.", m_name);
4356                 else msg_format("%^s squeaks.", m_name);
4357 #endif
4358         }
4359
4360         else if(my_strchr("duDLUW", r_ptr->d_char)) // Dragons, Demons, High Undead
4361         {       
4362 #ifdef JP
4363                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4364                 else if(percentage > 75) msg_format("%^sはしり込みした。", m_name);
4365                 else if(percentage > 50) msg_format("%^sは痛みでシーッと鳴いた。", m_name);
4366                 else if(percentage > 35) msg_format("%^sは痛みでうなった。", m_name);
4367                 else if(percentage > 20) msg_format("%^sは痛みに吠えた。", m_name);
4368                 else if(percentage > 10) msg_format("%^sは苦しげに叫んだ。", m_name);
4369                 else msg_format("%^sは弱々しくうなった。", m_name);
4370 #else
4371                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4372                 else if(percentage > 75) msg_format("%^s flinches.", m_name);
4373                 else if(percentage > 50) msg_format("%^s hisses in pain.", m_name);
4374                 else if(percentage > 35) msg_format("%^s snarls with pain.", m_name);
4375                 else if(percentage > 20) msg_format("%^s roars with pain.", m_name);
4376                 else if(percentage > 10) msg_format("%^s gasps.", m_name);
4377                 else msg_format("%^s snarls feebly.", m_name);
4378 #endif
4379         }
4380
4381         else if(my_strchr("s", r_ptr->d_char)) // Skeletons
4382         {
4383 #ifdef JP
4384                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4385                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4386                 else if(percentage > 50) msg_format("%^sはカタカタと笑った。", m_name);
4387                 else if(percentage > 35) msg_format("%^sはよろめいた。", m_name);
4388                 else if(percentage > 20) msg_format("%^sはカタカタ言った。", m_name);
4389                 else if(percentage > 10) msg_format("%^sはよろめいた。", m_name);
4390                 else msg_format("%^sはガタガタ言った。", m_name);
4391 #else
4392                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4393                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4394                 else if(percentage > 50) msg_format("%^s rattles.", m_name);
4395                 else if(percentage > 35) msg_format("%^s stumbles.", m_name);
4396                 else if(percentage > 20) msg_format("%^s rattles.", m_name);
4397                 else if(percentage > 10) msg_format("%^s staggers.", m_name);
4398                 else msg_format("%^s clatters.", m_name);
4399 #endif
4400         }
4401
4402         else if(my_strchr("z", r_ptr->d_char)) // Zombies
4403         {               
4404 #ifdef JP
4405                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4406                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4407                 else if(percentage > 50) msg_format("%^sはうめいた。", m_name);
4408                 else if(percentage > 35) msg_format("%sは苦しげにうめいた。", m_name);
4409                 else if(percentage > 20) msg_format("%^sは躊躇した。", m_name);
4410                 else if(percentage > 10) msg_format("%^sはうなった。", m_name);
4411                 else msg_format("%^sはよろめいた。", m_name);
4412 #else
4413                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4414                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4415                 else if(percentage > 50) msg_format("%^s groans.", m_name);
4416                 else if(percentage > 35) msg_format("%^s moans.", m_name);
4417                 else if(percentage > 20) msg_format("%^s hesitates.", m_name);
4418                 else if(percentage > 10) msg_format("%^s grunts.", m_name);
4419                 else msg_format("%^s staggers.", m_name);
4420 #endif
4421         }
4422
4423         else if(my_strchr("G", r_ptr->d_char)) // Ghosts
4424         {
4425 #ifdef JP
4426                 if(percentage > 95) msg_format("%sは攻撃を気にとめていない。", m_name);
4427                 else if(percentage > 75) msg_format("%sは攻撃に肩をすくめた。", m_name);
4428                 else if(percentage > 50) msg_format("%sはうめいた。", m_name);
4429                 else if(percentage > 35) msg_format("%^sは泣きわめいた。", m_name);
4430                 else if(percentage > 20) msg_format("%^sは吠えた。", m_name);
4431                 else if(percentage > 10) msg_format("%sは弱々しくうめいた。", m_name);
4432                 else msg_format("%^sはかすかにうめいた。", m_name);
4433 #else
4434                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4435                 else if(percentage > 75) msg_format("%^s shrugs off the attack.", m_name);
4436                 else if(percentage > 50)  msg_format("%^s moans.", m_name);
4437                 else if(percentage > 35) msg_format("%^s wails.", m_name);
4438                 else if(percentage > 20) msg_format("%^s howls.", m_name);
4439                 else if(percentage > 10) msg_format("%^s moans softly.", m_name);
4440                 else msg_format("%^s sighs.", m_name);
4441 #endif
4442         }
4443
4444         else if(my_strchr("CZ", r_ptr->d_char)) // Dogs and Hounds
4445         {
4446 #ifdef JP
4447                 if(percentage > 95) msg_format("%^sは攻撃に肩をすくめた。", m_name);
4448                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4449                 else if(percentage > 50) msg_format("%^sは痛みでキャンキャン吠えた。", m_name);
4450                 else if(percentage > 35) msg_format("%^sは痛みで鳴きわめいた。", m_name);
4451                 else if(percentage > 20) msg_format("%^sは苦痛のあまり鳴きわめいた。", m_name);
4452                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4453                 else msg_format("%^sは弱々しく吠えた。", m_name);
4454 #else
4455                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4456                 else if(percentage > 75) msg_format("%^s snarls with pain.", m_name);
4457                 else if(percentage > 50) msg_format("%^s yelps in pain.", m_name);
4458                 else if(percentage > 35) msg_format("%^s howls in pain.", m_name);
4459                 else if(percentage > 20) msg_format("%^s howls in agony.", m_name);
4460                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4461                 else msg_format("%^s yelps feebly.", m_name);
4462 #endif
4463         }
4464
4465         else if(my_strchr("Xbilqrt", r_ptr->d_char)) // One type of creatures (ignore,squeal,shriek)
4466         {
4467 #ifdef JP
4468                 if(percentage > 95) msg_format("%^sは攻撃を気にとめていない。", m_name);
4469                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4470                 else if(percentage > 50) msg_format("%^sは痛みで叫んだ。", m_name);
4471                 else if(percentage > 35) msg_format("%^sは痛みで絶叫した。", m_name);
4472                 else if(percentage > 20) msg_format("%^sは苦痛のあまり絶叫した。", m_name);
4473                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4474                 else msg_format("%^sは弱々しく叫んだ。", m_name);
4475 #else
4476                 if(percentage > 95) msg_format("%^s ignores the attack.", m_name);
4477                 else if(percentage > 75) msg_format("%^s grunts with pain.", m_name);
4478                 else if(percentage > 50) msg_format("%^s squeals in pain.", m_name);
4479                 else if(percentage > 35) msg_format("%^s shrieks in pain.", m_name);
4480                 else if(percentage > 20) msg_format("%^s shrieks in agony.", m_name);
4481                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4482                 else msg_format("%^s cries out feebly.", m_name);
4483 #endif
4484         }
4485
4486         else // Another type of creatures (shrug,cry,scream)
4487         {
4488 #ifdef JP
4489                 if(percentage > 95) msg_format("%^sは攻撃に肩をすくめた。", m_name);
4490                 else if(percentage > 75) msg_format("%^sは痛みでうなった。", m_name);
4491                 else if(percentage > 50) msg_format("%^sは痛みで叫んだ。", m_name);
4492                 else if(percentage > 35) msg_format("%^sは痛みで絶叫した。", m_name);
4493                 else if(percentage > 20) msg_format("%^sは苦痛のあまり絶叫した。", m_name);
4494                 else if(percentage > 10) msg_format("%^sは苦痛でもだえ苦しんだ。", m_name);
4495                 else msg_format("%^sは弱々しく叫んだ。", m_name);
4496 #else
4497                 if(percentage > 95) msg_format("%^s shrugs off the attack.", m_name);
4498                 else if(percentage > 75) msg_format("%^s grunts with pain.", m_name);
4499                 else if(percentage > 50) msg_format("%^s cries out in pain.", m_name);
4500                 else if(percentage > 35) msg_format("%^s screams in pain.", m_name);
4501                 else if(percentage > 20) msg_format("%^s screams in agony.", m_name);
4502                 else if(percentage > 10) msg_format("%^s writhes in agony.", m_name);
4503                 else msg_format("%^s cries out feebly.", m_name);
4504 #endif
4505         }
4506 }
4507
4508
4509
4510 /*!
4511  * @brief SMART(適格に攻撃を行う)モンスターの学習状況を更新する / Learn about an "observed" resistance.
4512  * @param m_idx 更新を行う「モンスター情報ID
4513  * @param what 学習対象ID
4514  * @return なし
4515  */
4516 void update_smart_learn(int m_idx, int what)
4517 {
4518         monster_type *m_ptr = &m_list[m_idx];
4519
4520         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4521
4522
4523         /* Not allowed to learn */
4524         if (!smart_learn) return;
4525
4526         /* Too stupid to learn anything */
4527         if (r_ptr->flags2 & (RF2_STUPID)) return;
4528
4529         /* Not intelligent, only learn sometimes */
4530         if (!(r_ptr->flags2 & (RF2_SMART)) && (randint0(100) < 50)) return;
4531
4532
4533         /* XXX XXX XXX */
4534
4535         /* Analyze the knowledge */
4536         switch (what)
4537         {
4538         case DRS_ACID:
4539                 if (p_ptr->resist_acid) m_ptr->smart |= (SM_RES_ACID);
4540                 if (IS_OPPOSE_ACID()) m_ptr->smart |= (SM_OPP_ACID);
4541                 if (p_ptr->immune_acid) m_ptr->smart |= (SM_IMM_ACID);
4542                 break;
4543
4544         case DRS_ELEC:
4545                 if (p_ptr->resist_elec) m_ptr->smart |= (SM_RES_ELEC);
4546                 if (IS_OPPOSE_ELEC()) m_ptr->smart |= (SM_OPP_ELEC);
4547                 if (p_ptr->immune_elec) m_ptr->smart |= (SM_IMM_ELEC);
4548                 break;
4549
4550         case DRS_FIRE:
4551                 if (p_ptr->resist_fire) m_ptr->smart |= (SM_RES_FIRE);
4552                 if (IS_OPPOSE_FIRE()) m_ptr->smart |= (SM_OPP_FIRE);
4553                 if (p_ptr->immune_fire) m_ptr->smart |= (SM_IMM_FIRE);
4554                 break;
4555
4556         case DRS_COLD:
4557                 if (p_ptr->resist_cold) m_ptr->smart |= (SM_RES_COLD);
4558                 if (IS_OPPOSE_COLD()) m_ptr->smart |= (SM_OPP_COLD);
4559                 if (p_ptr->immune_cold) m_ptr->smart |= (SM_IMM_COLD);
4560                 break;
4561
4562         case DRS_POIS:
4563                 if (p_ptr->resist_pois) m_ptr->smart |= (SM_RES_POIS);
4564                 if (IS_OPPOSE_POIS()) m_ptr->smart |= (SM_OPP_POIS);
4565                 break;
4566
4567
4568         case DRS_NETH:
4569                 if (p_ptr->resist_neth) m_ptr->smart |= (SM_RES_NETH);
4570                 break;
4571
4572         case DRS_LITE:
4573                 if (p_ptr->resist_lite) m_ptr->smart |= (SM_RES_LITE);
4574                 break;
4575
4576         case DRS_DARK:
4577                 if (p_ptr->resist_dark) m_ptr->smart |= (SM_RES_DARK);
4578                 break;
4579
4580         case DRS_FEAR:
4581                 if (p_ptr->resist_fear) m_ptr->smart |= (SM_RES_FEAR);
4582                 break;
4583
4584         case DRS_CONF:
4585                 if (p_ptr->resist_conf) m_ptr->smart |= (SM_RES_CONF);
4586                 break;
4587
4588         case DRS_CHAOS:
4589                 if (p_ptr->resist_chaos) m_ptr->smart |= (SM_RES_CHAOS);
4590                 break;
4591
4592         case DRS_DISEN:
4593                 if (p_ptr->resist_disen) m_ptr->smart |= (SM_RES_DISEN);
4594                 break;
4595
4596         case DRS_BLIND:
4597                 if (p_ptr->resist_blind) m_ptr->smart |= (SM_RES_BLIND);
4598                 break;
4599
4600         case DRS_NEXUS:
4601                 if (p_ptr->resist_nexus) m_ptr->smart |= (SM_RES_NEXUS);
4602                 break;
4603
4604         case DRS_SOUND:
4605                 if (p_ptr->resist_sound) m_ptr->smart |= (SM_RES_SOUND);
4606                 break;
4607
4608         case DRS_SHARD:
4609                 if (p_ptr->resist_shard) m_ptr->smart |= (SM_RES_SHARD);
4610                 break;
4611
4612         case DRS_FREE:
4613                 if (p_ptr->free_act) m_ptr->smart |= (SM_IMM_FREE);
4614                 break;
4615
4616         case DRS_MANA:
4617                 if (!p_ptr->msp) m_ptr->smart |= (SM_IMM_MANA);
4618                 break;
4619
4620         case DRS_REFLECT:
4621                 if (p_ptr->reflect) m_ptr-> smart |= (SM_IMM_REFLECT);
4622                 break;
4623         }
4624 }
4625
4626
4627 /*!
4628  * @brief プレイヤーを指定座標に配置する / Place the player in the dungeon XXX XXX
4629  * @param x 配置先X座標
4630  * @param y 配置先Y座標
4631  * @return 配置に成功したらTRUE
4632  */
4633 bool player_place(int y, int x)
4634 {
4635         /* Paranoia XXX XXX */
4636         if (cave[y][x].m_idx != 0) return FALSE;
4637
4638         /* Save player location */
4639         p_ptr->y = y;
4640         p_ptr->x = x;
4641
4642         /* Success */
4643         return TRUE;
4644 }
4645
4646
4647 /*!
4648  * @brief モンスターが盗みや拾いで確保していたアイテムを全てドロップさせる / Drop all items carried by a monster
4649  * @param m_ptr モンスター参照ポインタ
4650  * @return なし
4651  */
4652 void monster_drop_carried_objects(monster_type *m_ptr)
4653 {
4654         s16b this_o_idx, next_o_idx = 0;
4655         object_type forge;
4656         object_type *o_ptr;
4657         object_type *q_ptr;
4658
4659
4660         /* Drop objects being carried */
4661         for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
4662         {
4663                 /* Acquire object */
4664                 o_ptr = &o_list[this_o_idx];
4665
4666                 /* Acquire next object */
4667                 next_o_idx = o_ptr->next_o_idx;
4668
4669                 /* Get local object */
4670                 q_ptr = &forge;
4671
4672                 /* Copy the object */
4673                 object_copy(q_ptr, o_ptr);
4674
4675                 /* Forget monster */
4676                 q_ptr->held_m_idx = 0;
4677
4678                 /* Delete the object */
4679                 delete_object_idx(this_o_idx);
4680
4681                 /* Drop it */
4682                 (void)drop_near(q_ptr, -1, m_ptr->fy, m_ptr->fx);
4683         }
4684
4685         /* Forget objects */
4686         m_ptr->hold_o_idx = 0;
4687 }