OSDN Git Service

Second argument of disturb function is now for stopping or nonstopping flag of travel...
[hengband/hengband.git] / src / cmd1.c
1 /* File: cmd1.c */
2
3 /*
4  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research,
7  * and not for profit purposes provided that this copyright and statement
8  * are included in all such copies.  Other copyrights may also apply.
9  */
10
11 /* Purpose: Movement commands (part 1) */
12
13 #include "angband.h"
14 #define MAX_VAMPIRIC_DRAIN 50
15
16
17 /*
18  * Determine if the player "hits" a monster (normal combat).
19  * Note -- Always miss 5%, always hit 5%, otherwise random.
20  */
21 bool test_hit_fire(int chance, int ac, int vis)
22 {
23         int k;
24
25         /* Percentile dice */
26         k = randint0(100);
27
28         /* Hack -- Instant miss or hit */
29         if (k < 10) return (k < 5);
30
31         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
32                 if (one_in_(20)) return (FALSE);
33
34         /* Never hit */
35         if (chance <= 0) return (FALSE);
36
37         /* Invisible monsters are harder to hit */
38         if (!vis) chance = (chance + 1) / 2;
39
40         /* Power competes against armor */
41         if (randint0(chance) < (ac * 3 / 4)) return (FALSE);
42
43         /* Assume hit */
44         return (TRUE);
45 }
46
47
48
49 /*
50  * Determine if the player "hits" a monster (normal combat).
51  *
52  * Note -- Always miss 5%, always hit 5%, otherwise random.
53  */
54 bool test_hit_norm(int chance, int ac, int vis)
55 {
56         int k;
57
58         /* Percentile dice */
59         k = randint0(100);
60
61         /* Hack -- Instant miss or hit */
62         if (k < 10) return (k < 5);
63
64         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
65                 if (one_in_(20)) return (FALSE);
66
67         /* Wimpy attack never hits */
68         if (chance <= 0) return (FALSE);
69
70         /* Penalize invisible targets */
71         if (!vis) chance = (chance + 1) / 2;
72
73         /* Power must defeat armor */
74         if (randint0(chance) < (ac * 3 / 4)) return (FALSE);
75
76         /* Assume hit */
77         return (TRUE);
78 }
79
80
81
82 /*
83  * Critical hits (from objects thrown by player)
84  * Factor in item weight, total plusses, and player level.
85  */
86 s16b critical_shot(int weight, int plus, int dam)
87 {
88         int i, k;
89
90         /* Extract "shot" power */
91         i = ((p_ptr->to_h_b + plus) * 4) + (p_ptr->lev * 2);
92
93         /* Snipers can shot more critically with crossbows */
94         if (p_ptr->concent) i += ((i * p_ptr->concent) / 5);
95         if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->tval_ammo == TV_BOLT)) i *= 2;
96
97         /* Critical hit */
98         if (randint1(5000) <= i)
99         {
100                 k = weight * randint1(500);
101
102                 if (k < 900)
103                 {
104 #ifdef JP
105                         msg_print("¼ê¤´¤¿¤¨¤¬¤¢¤Ã¤¿¡ª");
106 #else
107                         msg_print("It was a good hit!");
108 #endif
109
110                         dam += (dam / 2);
111                 }
112                 else if (k < 1350)
113                 {
114 #ifdef JP
115                         msg_print("¤«¤Ê¤ê¤Î¼ê¤´¤¿¤¨¤¬¤¢¤Ã¤¿¡ª");
116 #else
117                         msg_print("It was a great hit!");
118 #endif
119
120                         dam *= 2;
121                 }
122                 else
123                 {
124 #ifdef JP
125                         msg_print("²ñ¿´¤Î°ì·â¤À¡ª");
126 #else
127                         msg_print("It was a superb hit!");
128 #endif
129
130                         dam *= 3;
131                 }
132         }
133
134         return (dam);
135 }
136
137
138
139 /*
140  * Critical hits (by player)
141  *
142  * Factor in weapon weight, total plusses, player level.
143  */
144 s16b critical_norm(int weight, int plus, int dam, s16b meichuu, int mode)
145 {
146         int i, k;
147
148         /* Extract "blow" power */
149         i = (weight + (meichuu * 3 + plus * 5) + (p_ptr->lev * 3));
150
151         /* Chance */
152         if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
153         {
154                 k = weight + randint1(650);
155                 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k+= randint1(650);
156
157                 if (k < 400)
158                 {
159 #ifdef JP
160                         msg_print("¼ê¤´¤¿¤¨¤¬¤¢¤Ã¤¿¡ª");
161 #else
162                         msg_print("It was a good hit!");
163 #endif
164
165                         dam = 2 * dam + 5;
166                 }
167                 else if (k < 700)
168                 {
169 #ifdef JP
170                         msg_print("¤«¤Ê¤ê¤Î¼ê¤´¤¿¤¨¤¬¤¢¤Ã¤¿¡ª");
171 #else
172                         msg_print("It was a great hit!");
173 #endif
174
175                         dam = 2 * dam + 10;
176                 }
177                 else if (k < 900)
178                 {
179 #ifdef JP
180                         msg_print("²ñ¿´¤Î°ì·â¤À¡ª");
181 #else
182                         msg_print("It was a superb hit!");
183 #endif
184
185                         dam = 3 * dam + 15;
186                 }
187                 else if (k < 1300)
188                 {
189 #ifdef JP
190                         msg_print("ºÇ¹â¤Î²ñ¿´¤Î°ì·â¤À¡ª");
191 #else
192                         msg_print("It was a *GREAT* hit!");
193 #endif
194
195                         dam = 3 * dam + 20;
196                 }
197                 else
198                 {
199 #ifdef JP
200                         msg_print("ÈæÎà¤Ê¤­ºÇ¹â¤Î²ñ¿´¤Î°ì·â¤À¡ª");
201 #else
202                         msg_print("It was a *SUPERB* hit!");
203 #endif
204
205                         dam = ((7 * dam) / 2) + 25;
206                 }
207         }
208
209         return (dam);
210 }
211
212
213
214 /*
215  * Extract the "total damage" from a given object hitting a given monster.
216  *
217  * Note that "flasks of oil" do NOT do fire damage, although they
218  * certainly could be made to do so.  XXX XXX
219  *
220  * Note that most brands and slays are x3, except Slay Animal (x2),
221  * Slay Evil (x2), and Kill dragon (x5).
222  */
223 s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode, bool thrown)
224 {
225         int mult = 10;
226
227         monster_race *r_ptr = &r_info[m_ptr->r_idx];
228
229         u32b flgs[TR_FLAG_SIZE];
230
231         /* Extract the flags */
232         object_flags(o_ptr, flgs);
233
234         /* Some "weapons" and "ammo" do extra damage */
235         switch (o_ptr->tval)
236         {
237                 case TV_SHOT:
238                 case TV_ARROW:
239                 case TV_BOLT:
240                 case TV_HAFTED:
241                 case TV_POLEARM:
242                 case TV_SWORD:
243                 case TV_DIGGING:
244                 {
245                         /* Slay Animal */
246                         if ((have_flag(flgs, TR_SLAY_ANIMAL)) &&
247                             (r_ptr->flags3 & RF3_ANIMAL))
248                         {
249                                 if (is_original_ap_and_seen(m_ptr))
250                                 {
251                                         r_ptr->r_flags3 |= RF3_ANIMAL;
252                                 }
253
254                                 if (mult < 25) mult = 25;
255                         }
256
257                         /* Execute Animal */
258                         if ((have_flag(flgs, TR_KILL_ANIMAL)) &&
259                             (r_ptr->flags3 & RF3_ANIMAL))
260                         {
261                                 if (is_original_ap_and_seen(m_ptr))
262                                 {
263                                         r_ptr->r_flags3 |= RF3_ANIMAL;
264                                 }
265
266                                 if (mult < 40) mult = 40;
267                         }
268
269                         /* Slay Evil */
270                         if ((have_flag(flgs, TR_SLAY_EVIL)) &&
271                             (r_ptr->flags3 & RF3_EVIL))
272                         {
273                                 if (is_original_ap_and_seen(m_ptr))
274                                 {
275                                         r_ptr->r_flags3 |= RF3_EVIL;
276                                 }
277
278                                 if (mult < 20) mult = 20;
279                         }
280
281                         /* Execute Evil */
282                         if ((have_flag(flgs, TR_KILL_EVIL)) &&
283                             (r_ptr->flags3 & RF3_EVIL))
284                         {
285                                 if (is_original_ap_and_seen(m_ptr))
286                                 {
287                                         r_ptr->r_flags3 |= RF3_EVIL;
288                                 }
289
290                                 if (mult < 35) mult = 35;
291                         }
292
293                         /* Slay Human */
294                         if ((have_flag(flgs, TR_SLAY_HUMAN)) &&
295                             (r_ptr->flags2 & RF2_HUMAN))
296                         {
297                                 if (is_original_ap_and_seen(m_ptr))
298                                 {
299                                         r_ptr->r_flags2 |= RF2_HUMAN;
300                                 }
301
302                                 if (mult < 25) mult = 25;
303                         }
304
305                         /* Execute Human */
306                         if ((have_flag(flgs, TR_KILL_HUMAN)) &&
307                             (r_ptr->flags2 & RF2_HUMAN))
308                         {
309                                 if (is_original_ap_and_seen(m_ptr))
310                                 {
311                                         r_ptr->r_flags2 |= RF2_HUMAN;
312                                 }
313
314                                 if (mult < 40) mult = 40;
315                         }
316
317                         /* Slay Undead */
318                         if ((have_flag(flgs, TR_SLAY_UNDEAD)) &&
319                             (r_ptr->flags3 & RF3_UNDEAD))
320                         {
321                                 if (is_original_ap_and_seen(m_ptr))
322                                 {
323                                         r_ptr->r_flags3 |= RF3_UNDEAD;
324                                 }
325
326                                 if (mult < 30) mult = 30;
327                         }
328
329                         /* Execute Undead */
330                         if ((have_flag(flgs, TR_KILL_UNDEAD)) &&
331                             (r_ptr->flags3 & RF3_UNDEAD))
332                         {
333                                 if (is_original_ap_and_seen(m_ptr))
334                                 {
335                                         r_ptr->r_flags3 |= RF3_UNDEAD;
336                                 }
337
338                                 if (mult < 50) mult = 50;
339                         }
340
341                         /* Slay Demon */
342                         if ((have_flag(flgs, TR_SLAY_DEMON)) &&
343                             (r_ptr->flags3 & RF3_DEMON))
344                         {
345                                 if (is_original_ap_and_seen(m_ptr))
346                                 {
347                                         r_ptr->r_flags3 |= RF3_DEMON;
348                                 }
349
350                                 if (mult < 30) mult = 30;
351                         }
352
353                         /* Execute Demon */
354                         if ((have_flag(flgs, TR_KILL_DEMON)) &&
355                             (r_ptr->flags3 & RF3_DEMON))
356                         {
357                                 if (is_original_ap_and_seen(m_ptr))
358                                 {
359                                         r_ptr->r_flags3 |= RF3_DEMON;
360                                 }
361
362                                 if (mult < 50) mult = 50;
363                         }
364
365                         /* Slay Orc */
366                         if ((have_flag(flgs, TR_SLAY_ORC)) &&
367                             (r_ptr->flags3 & RF3_ORC))
368                         {
369                                 if (is_original_ap_and_seen(m_ptr))
370                                 {
371                                         r_ptr->r_flags3 |= RF3_ORC;
372                                 }
373
374                                 if (mult < 30) mult = 30;
375                         }
376
377                         /* Execute Orc */
378                         if ((have_flag(flgs, TR_KILL_ORC)) &&
379                             (r_ptr->flags3 & RF3_ORC))
380                         {
381                                 if (is_original_ap_and_seen(m_ptr))
382                                 {
383                                         r_ptr->r_flags3 |= RF3_ORC;
384                                 }
385
386                                 if (mult < 50) mult = 50;
387                         }
388
389                         /* Slay Troll */
390                         if ((have_flag(flgs, TR_SLAY_TROLL)) &&
391                             (r_ptr->flags3 & RF3_TROLL))
392                         {
393                                 if (is_original_ap_and_seen(m_ptr))
394                                 {
395                                         r_ptr->r_flags3 |= RF3_TROLL;
396                                 }
397
398                                 if (mult < 30) mult = 30;
399                         }
400
401                         /* Execute Troll */
402                         if ((have_flag(flgs, TR_KILL_TROLL)) &&
403                             (r_ptr->flags3 & RF3_TROLL))
404                         {
405                                 if (is_original_ap_and_seen(m_ptr))
406                                 {
407                                         r_ptr->r_flags3 |= RF3_TROLL;
408                                 }
409
410                                 if (mult < 50) mult = 50;
411                         }
412
413                         /* Slay Giant */
414                         if ((have_flag(flgs, TR_SLAY_GIANT)) &&
415                             (r_ptr->flags3 & RF3_GIANT))
416                         {
417                                 if (is_original_ap_and_seen(m_ptr))
418                                 {
419                                         r_ptr->r_flags3 |= RF3_GIANT;
420                                 }
421
422                                 if (mult < 30) mult = 30;
423                         }
424
425                         /* Execute Giant */
426                         if ((have_flag(flgs, TR_KILL_GIANT)) &&
427                             (r_ptr->flags3 & RF3_GIANT))
428                         {
429                                 if (is_original_ap_and_seen(m_ptr))
430                                 {
431                                         r_ptr->r_flags3 |= RF3_GIANT;
432                                 }
433
434                                 if (mult < 50) mult = 50;
435                         }
436
437                         /* Slay Dragon  */
438                         if ((have_flag(flgs, TR_SLAY_DRAGON)) &&
439                             (r_ptr->flags3 & RF3_DRAGON))
440                         {
441                                 if (is_original_ap_and_seen(m_ptr))
442                                 {
443                                         r_ptr->r_flags3 |= RF3_DRAGON;
444                                 }
445
446                                 if (mult < 30) mult = 30;
447                         }
448
449                         /* Execute Dragon */
450                         if ((have_flag(flgs, TR_KILL_DRAGON)) &&
451                             (r_ptr->flags3 & RF3_DRAGON))
452                         {
453                                 if (is_original_ap_and_seen(m_ptr))
454                                 {
455                                         r_ptr->r_flags3 |= RF3_DRAGON;
456                                 }
457
458                                 if (mult < 50) mult = 50;
459
460                                 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
461                                         mult *= 3;
462                         }
463
464                         /* Hex - Slay Good (Runesword) */
465                         if (hex_spelling(HEX_RUNESWORD) &&
466                             (r_ptr->flags3 & RF3_GOOD))
467                         {
468                                 if (is_original_ap_and_seen(m_ptr))
469                                 {
470                                         r_ptr->r_flags3 |= RF3_GOOD;
471                                 }
472
473                                 if (mult < 20) mult = 20;
474                         }
475
476                         /* Brand (Acid) */
477                         if (have_flag(flgs, TR_BRAND_ACID) || ((p_ptr->special_attack & (ATTACK_ACID)) && !thrown))
478                         {
479                                 /* Notice immunity */
480                                 if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK)
481                                 {
482                                         if (is_original_ap_and_seen(m_ptr))
483                                         {
484                                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK);
485                                         }
486                                 }
487
488                                 /* Otherwise, take the damage */
489                                 else
490                                 {
491                                         if (mult < 25) mult = 25;
492                                 }
493                         }
494
495                         /* Brand (Elec) */
496                         if (have_flag(flgs, TR_BRAND_ELEC) || ((p_ptr->special_attack & (ATTACK_ELEC)) && !thrown) || (mode == HISSATSU_ELEC))
497                         {
498                                 /* Notice immunity */
499                                 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
500                                 {
501                                         if (is_original_ap_and_seen(m_ptr))
502                                         {
503                                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
504                                         }
505                                 }
506
507                                 /* Otherwise, take the damage */
508                                 else if ((have_flag(flgs, TR_BRAND_ELEC) || ((p_ptr->special_attack & (ATTACK_ELEC)) && !thrown)) && (mode == HISSATSU_ELEC))
509                                 {
510                                         if (mult < 70) mult = 70;
511                                 }
512                                 else if (mode == HISSATSU_ELEC)
513                                 {
514                                         if (mult < 50) mult = 50;
515                                 }
516
517                                 else
518                                 {
519                                         if (mult < 25) mult = 25;
520                                 }
521                         }
522
523                         /* Brand (Fire) */
524                         if (have_flag(flgs, TR_BRAND_FIRE) || ((p_ptr->special_attack & (ATTACK_FIRE)) && !thrown) || (mode == HISSATSU_FIRE))
525                         {
526                                 /* Notice immunity */
527                                 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
528                                 {
529                                         if (is_original_ap_and_seen(m_ptr))
530                                         {
531                                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
532                                         }
533                                 }
534
535                                 /* Otherwise, take the damage */
536                                 else if ((have_flag(flgs, TR_BRAND_FIRE) || ((p_ptr->special_attack & (ATTACK_FIRE)) && !thrown)) && (mode == HISSATSU_FIRE))
537                                 {
538                                         if (r_ptr->flags3 & RF3_HURT_FIRE)
539                                         {
540                                                 if (mult < 70) mult = 70;
541                                                 if (is_original_ap_and_seen(m_ptr))
542                                                 {
543                                                         r_ptr->r_flags3 |= RF3_HURT_FIRE;
544                                                 }
545                                         }
546                                         else if (mult < 35) mult = 35;
547                                 }
548                                 else
549                                 {
550                                         if (r_ptr->flags3 & RF3_HURT_FIRE)
551                                         {
552                                                 if (mult < 50) mult = 50;
553                                                 if (is_original_ap_and_seen(m_ptr))
554                                                 {
555                                                         r_ptr->r_flags3 |= RF3_HURT_FIRE;
556                                                 }
557                                         }
558                                         else if (mult < 25) mult = 25;
559                                 }
560                         }
561
562                         /* Brand (Cold) */
563                         if (have_flag(flgs, TR_BRAND_COLD) || ((p_ptr->special_attack & (ATTACK_COLD)) && !thrown) || (mode == HISSATSU_COLD))
564                         {
565                                 /* Notice immunity */
566                                 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
567                                 {
568                                         if (is_original_ap_and_seen(m_ptr))
569                                         {
570                                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
571                                         }
572                                 }
573                                 /* Otherwise, take the damage */
574                                 else if ((have_flag(flgs, TR_BRAND_COLD) || ((p_ptr->special_attack & (ATTACK_COLD)) && !thrown)) && (mode == HISSATSU_COLD))
575                                 {
576                                         if (r_ptr->flags3 & RF3_HURT_COLD)
577                                         {
578                                                 if (mult < 70) mult = 70;
579                                                 if (is_original_ap_and_seen(m_ptr))
580                                                 {
581                                                         r_ptr->r_flags3 |= RF3_HURT_COLD;
582                                                 }
583                                         }
584                                         else if (mult < 35) mult = 35;
585                                 }
586                                 else
587                                 {
588                                         if (r_ptr->flags3 & RF3_HURT_COLD)
589                                         {
590                                                 if (mult < 50) mult = 50;
591                                                 if (is_original_ap_and_seen(m_ptr))
592                                                 {
593                                                         r_ptr->r_flags3 |= RF3_HURT_COLD;
594                                                 }
595                                         }
596                                         else if (mult < 25) mult = 25;
597                                 }
598                         }
599
600                         /* Brand (Poison) */
601                         if (have_flag(flgs, TR_BRAND_POIS) || ((p_ptr->special_attack & (ATTACK_POIS)) && !thrown) || (mode == HISSATSU_POISON))
602                         {
603                                 /* Notice immunity */
604                                 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
605                                 {
606                                         if (is_original_ap_and_seen(m_ptr))
607                                         {
608                                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
609                                         }
610                                 }
611
612                                 /* Otherwise, take the damage */
613                                 else if ((have_flag(flgs, TR_BRAND_POIS) || ((p_ptr->special_attack & (ATTACK_POIS)) && !thrown)) && (mode == HISSATSU_POISON))
614                                 {
615                                         if (mult < 35) mult = 35;
616                                 }
617                                 else
618                                 {
619                                         if (mult < 25) mult = 25;
620                                 }
621                         }
622                         if ((mode == HISSATSU_ZANMA) && !monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL))
623                         {
624                                 if (mult < 15) mult = 25;
625                                 else if (mult < 50) mult = MIN(50, mult+20);
626                         }
627                         if (mode == HISSATSU_UNDEAD)
628                         {
629                                 if (r_ptr->flags3 & RF3_UNDEAD)
630                                 {
631                                         if (is_original_ap_and_seen(m_ptr))
632                                         {
633                                                 r_ptr->r_flags3 |= RF3_UNDEAD;
634                                         }
635                                         if (mult == 10) mult = 70;
636                                         else if (mult < 140) mult = MIN(140, mult+60);
637                                 }
638                                 if (mult == 10) mult = 40;
639                                 else if (mult < 60) mult = MIN(60, mult+30);
640                         }
641                         if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(r_ptr))
642                         {
643                                 int tmp = MIN(100, MAX(10, p_ptr->cut / 10));
644                                 if (mult < tmp) mult = tmp;
645                         }
646                         if ((mode == HISSATSU_HAGAN) && (r_ptr->flags3 & RF3_HURT_ROCK))
647                         {
648                                 if (is_original_ap_and_seen(m_ptr))
649                                 {
650                                         r_ptr->r_flags3 |= RF3_HURT_ROCK;
651                                 }
652                                 if (mult == 10) mult = 40;
653                                 else if (mult < 60) mult = 60;
654                         }
655                         if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
656                         {
657                                 p_ptr->csp -= (1+(o_ptr->dd * o_ptr->ds / 5));
658                                 p_ptr->redraw |= (PR_MANA);
659                                 mult = mult * 3 / 2 + 20;
660                         }
661                         break;
662                 }
663         }
664         if (mult > 150) mult = 150;
665
666         /* Return the total damage */
667         return (tdam * mult / 10);
668 }
669
670
671 /*
672  * Search for hidden things
673  */
674 void search(void)
675 {
676         int y, x, chance;
677
678         s16b this_o_idx, next_o_idx = 0;
679
680         cave_type *c_ptr;
681
682
683         /* Start with base search ability */
684         chance = p_ptr->skill_srh;
685
686         /* Penalize various conditions */
687         if (p_ptr->blind || no_lite()) chance = chance / 10;
688         if (p_ptr->confused || p_ptr->image) chance = chance / 10;
689
690         /* Search the nearby grids, which are always in bounds */
691         for (y = (py - 1); y <= (py + 1); y++)
692         {
693                 for (x = (px - 1); x <= (px + 1); x++)
694                 {
695                         /* Sometimes, notice things */
696                         if (randint0(100) < chance)
697                         {
698                                 /* Access the grid */
699                                 c_ptr = &cave[y][x];
700
701                                 /* Invisible trap */
702                                 if (c_ptr->mimic && is_trap(c_ptr->feat))
703                                 {
704                                         /* Pick a trap */
705                                         disclose_grid(y, x);
706
707                                         /* Message */
708 #ifdef JP
709                                         msg_print("¥È¥é¥Ã¥×¤òȯ¸«¤·¤¿¡£");
710 #else
711                                         msg_print("You have found a trap.");
712 #endif
713
714                                         /* Disturb */
715                                         disturb(0, 0);
716                                 }
717
718                                 /* Secret door */
719                                 if (is_hidden_door(c_ptr))
720                                 {
721                                         /* Message */
722 #ifdef JP
723                                         msg_print("±£¤·¥É¥¢¤òȯ¸«¤·¤¿¡£");
724 #else
725                                         msg_print("You have found a secret door.");
726 #endif
727
728                                         /* Disclose */
729                                         disclose_grid(y, x);
730
731                                         /* Disturb */
732                                         disturb(0, 0);
733                                 }
734
735                                 /* Scan all objects in the grid */
736                                 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
737                                 {
738                                         object_type *o_ptr;
739
740                                         /* Acquire object */
741                                         o_ptr = &o_list[this_o_idx];
742
743                                         /* Acquire next object */
744                                         next_o_idx = o_ptr->next_o_idx;
745
746                                         /* Skip non-chests */
747                                         if (o_ptr->tval != TV_CHEST) continue;
748
749                                         /* Skip non-trapped chests */
750                                         if (!chest_traps[o_ptr->pval]) continue;
751
752                                         /* Identify once */
753                                         if (!object_is_known(o_ptr))
754                                         {
755                                                 /* Message */
756 #ifdef JP
757                                                 msg_print("È¢¤Ë»Å³Ý¤±¤é¤ì¤¿¥È¥é¥Ã¥×¤òȯ¸«¤·¤¿¡ª");
758 #else
759                                                 msg_print("You have discovered a trap on the chest!");
760 #endif
761
762                                                 /* Know the trap */
763                                                 object_known(o_ptr);
764
765                                                 /* Notice it */
766                                                 disturb(0, 0);
767                                         }
768                                 }
769                         }
770                 }
771         }
772 }
773
774
775 /*
776  * Helper routine for py_pickup() and py_pickup_floor().
777  *
778  * Add the given dungeon object to the character's inventory.
779  *
780  * Delete the object afterwards.
781  */
782 void py_pickup_aux(int o_idx)
783 {
784         int slot, i;
785
786 #ifdef JP
787 /*
788  * ¥¢¥¤¥Æ¥à¤ò½¦¤Ã¤¿ºÝ¤Ë¡Ö£²¤Ä¤Î¥±¡¼¥­¤ò»ý¤Ã¤Æ¤¤¤ë¡×
789  * "You have two cakes." ¤È¥¢¥¤¥Æ¥à¤ò½¦¤Ã¤¿¸å¤Î¹ç·×¤Î¤ß¤Îɽ¼¨¤¬¥ª¥ê¥¸¥Ê¥ë
790  * ¤À¤¬¡¢°ãÏ´¶¤¬
791  * ¤¢¤ë¤È¤¤¤¦»ØŦ¤ò¤¦¤±¤¿¤Î¤Ç¡¢¡Ö¡Á¤ò½¦¤Ã¤¿¡¢¡Á¤ò»ý¤Ã¤Æ¤¤¤ë¡×¤È¤¤¤¦É½¼¨
792  * ¤Ë¤«¤¨¤Æ¤¢¤ë¡£¤½¤Î¤¿¤á¤ÎÇÛÎó¡£
793  */
794         char o_name[MAX_NLEN];
795         char old_name[MAX_NLEN];
796         char kazu_str[80];
797         int hirottakazu;
798 #else
799         char o_name[MAX_NLEN];
800 #endif
801
802         object_type *o_ptr;
803
804         o_ptr = &o_list[o_idx];
805
806 #ifdef JP
807         /* Describe the object */
808         object_desc(old_name, o_ptr, OD_NAME_ONLY);
809         object_desc_kosuu(kazu_str, o_ptr);
810         hirottakazu = o_ptr->number;
811 #endif
812         /* Carry the object */
813         slot = inven_carry(o_ptr);
814
815         /* Get the object again */
816         o_ptr = &inventory[slot];
817
818         /* Delete the object */
819         delete_object_idx(o_idx);
820
821         if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
822         {
823                 bool old_known = identify_item(o_ptr);
824
825                 /* Auto-inscription/destroy */
826                 autopick_alter_item(slot, (bool)(destroy_identify && !old_known));
827
828                 /* If it is destroyed, don't pick it up */
829                 if (o_ptr->marked & OM_AUTODESTROY) return;
830         }
831
832         /* Describe the object */
833         object_desc(o_name, o_ptr, 0);
834
835         /* Message */
836 #ifdef JP
837         if ((o_ptr->name1 == ART_CRIMSON) && (p_ptr->pseikaku == SEIKAKU_COMBAT))
838         {
839                 msg_format("¤³¤¦¤·¤Æ¡¢%s¤Ï¡Ø¥¯¥ê¥à¥¾¥ó¡Ù¤ò¼ê¤ËÆþ¤ì¤¿¡£", player_name);
840                 msg_print("¤·¤«¤·º£¡¢¡Øº®Æ٤Υµ¡¼¥Ú¥ó¥È¡Ù¤ÎÊü¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤¬¡¢");
841                 msg_format("%s¤Ë½±¤¤¤«¤«¤ë¡¥¡¥¡¥", player_name);
842         }
843         else
844         {
845                 if (plain_pickup)
846                 {
847                         msg_format("%s(%c)¤ò»ý¤Ã¤Æ¤¤¤ë¡£",o_name, index_to_label(slot));
848                 }
849                 else
850                 {
851                         if (o_ptr->number > hirottakazu) {
852                             msg_format("%s½¦¤Ã¤Æ¡¢%s(%c)¤ò»ý¤Ã¤Æ¤¤¤ë¡£",
853                                kazu_str, o_name, index_to_label(slot));
854                         } else {
855                                 msg_format("%s(%c)¤ò½¦¤Ã¤¿¡£", o_name, index_to_label(slot));
856                         }
857                 }
858         }
859         strcpy(record_o_name, old_name);
860 #else
861         msg_format("You have %s (%c).", o_name, index_to_label(slot));
862         strcpy(record_o_name, o_name);
863 #endif
864         record_turn = turn;
865
866
867         /* Check if completed a quest */
868         for (i = 0; i < max_quests; i++)
869         {
870                 if ((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) &&
871                     (quest[i].status == QUEST_STATUS_TAKEN) &&
872                            (quest[i].k_idx == o_ptr->name1))
873                 {
874                         if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_C, i, NULL);
875                         quest[i].status = QUEST_STATUS_COMPLETED;
876                         quest[i].complev = (byte)p_ptr->lev;
877 #ifdef JP
878                         msg_print("¥¯¥¨¥¹¥È¤òãÀ®¤·¤¿¡ª");
879 #else
880                         msg_print("You completed your quest!");
881 #endif
882
883                         msg_print(NULL);
884                 }
885         }
886 }
887
888
889 /*
890  * Player "wants" to pick up an object or gold.
891  * Note that we ONLY handle things that can be picked up.
892  * See "move_player()" for handling of other things.
893  */
894 void carry(bool pickup)
895 {
896         cave_type *c_ptr = &cave[py][px];
897
898         s16b this_o_idx, next_o_idx = 0;
899
900         char    o_name[MAX_NLEN];
901
902         /* Recenter the map around the player */
903         verify_panel();
904
905         /* Update stuff */
906         p_ptr->update |= (PU_MONSTERS);
907
908         /* Redraw map */
909         p_ptr->redraw |= (PR_MAP);
910
911         /* Window stuff */
912         p_ptr->window |= (PW_OVERHEAD);
913
914         /* Handle stuff */
915         handle_stuff();
916
917         /* Automatically pickup/destroy/inscribe items */
918         autopick_pickup_items(c_ptr);
919
920
921 #ifdef ALLOW_EASY_FLOOR
922
923         if (easy_floor)
924         {
925                 py_pickup_floor(pickup);
926                 return;
927         }
928
929 #endif /* ALLOW_EASY_FLOOR */
930
931         /* Scan the pile of objects */
932         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
933         {
934                 object_type *o_ptr;
935
936                 /* Acquire object */
937                 o_ptr = &o_list[this_o_idx];
938
939 #ifdef ALLOW_EASY_SENSE /* TNB */
940
941                 /* Option: Make item sensing easy */
942                 if (easy_sense)
943                 {
944                         /* Sense the object */
945                         (void)sense_object(o_ptr);
946                 }
947
948 #endif /* ALLOW_EASY_SENSE -- TNB */
949
950                 /* Describe the object */
951                 object_desc(o_name, o_ptr, 0);
952
953                 /* Acquire next object */
954                 next_o_idx = o_ptr->next_o_idx;
955
956                 /* Hack -- disturb */
957                 disturb(0, 0);
958
959                 /* Pick up gold */
960                 if (o_ptr->tval == TV_GOLD)
961                 {
962                         int value = (long)o_ptr->pval;
963
964                         /* Delete the gold */
965                         delete_object_idx(this_o_idx);
966
967                         /* Message */
968 #ifdef JP
969                 msg_format(" $%ld ¤Î²ÁÃͤ¬¤¢¤ë%s¤ò¸«¤Ä¤±¤¿¡£",
970                            (long)value, o_name);
971 #else
972                         msg_format("You collect %ld gold pieces worth of %s.",
973                                    (long)value, o_name);
974 #endif
975
976
977                         sound(SOUND_SELL);
978
979                         /* Collect the gold */
980                         p_ptr->au += value;
981
982                         /* Redraw gold */
983                         p_ptr->redraw |= (PR_GOLD);
984
985                         /* Window stuff */
986                         p_ptr->window |= (PW_PLAYER);
987                 }
988
989                 /* Pick up objects */
990                 else
991                 {
992                         /* Hack - some objects were handled in autopick_pickup_items(). */
993                         if (o_ptr->marked & OM_NOMSG)
994                         {
995                                 /* Clear the flag. */
996                                 o_ptr->marked &= ~OM_NOMSG;
997                         }
998                         /* Describe the object */
999                         else if (!pickup)
1000                         {
1001 #ifdef JP
1002                                 msg_format("%s¤¬¤¢¤ë¡£", o_name);
1003 #else
1004                                 msg_format("You see %s.", o_name);
1005 #endif
1006
1007                         }
1008
1009                         /* Note that the pack is too full */
1010                         else if (!inven_carry_okay(o_ptr))
1011                         {
1012 #ifdef JP
1013                                 msg_format("¥¶¥Ã¥¯¤Ë¤Ï%s¤òÆþ¤ì¤ë·ä´Ö¤¬¤Ê¤¤¡£", o_name);
1014 #else
1015                                 msg_format("You have no room for %s.", o_name);
1016 #endif
1017
1018                         }
1019
1020                         /* Pick up the item (if requested and allowed) */
1021                         else
1022                         {
1023                                 int okay = TRUE;
1024
1025                                 /* Hack -- query every item */
1026                                 if (carry_query_flag)
1027                                 {
1028                                         char out_val[MAX_NLEN+20];
1029 #ifdef JP
1030                                         sprintf(out_val, "%s¤ò½¦¤¤¤Þ¤¹¤«? ", o_name);
1031 #else
1032                                         sprintf(out_val, "Pick up %s? ", o_name);
1033 #endif
1034
1035                                         okay = get_check(out_val);
1036                                 }
1037
1038                                 /* Attempt to pick up an object. */
1039                                 if (okay)
1040                                 {
1041                                         /* Pick up the object */
1042                                         py_pickup_aux(this_o_idx);
1043                                 }
1044                         }
1045                 }
1046         }
1047 }
1048
1049
1050 /*
1051  * Determine if a trap affects the player.
1052  * Always miss 5% of the time, Always hit 5% of the time.
1053  * Otherwise, match trap power against player armor.
1054  */
1055 static int check_hit(int power)
1056 {
1057         int k, ac;
1058
1059         /* Percentile dice */
1060         k = randint0(100);
1061
1062         /* Hack -- 5% hit, 5% miss */
1063         if (k < 10) return (k < 5);
1064
1065         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
1066                 if (one_in_(20)) return (TRUE);
1067
1068         /* Paranoia -- No power */
1069         if (power <= 0) return (FALSE);
1070
1071         /* Total armor */
1072         ac = p_ptr->ac + p_ptr->to_a;
1073
1074         /* Power competes against Armor */
1075         if (randint1(power) > ((ac * 3) / 4)) return (TRUE);
1076
1077         /* Assume miss */
1078         return (FALSE);
1079 }
1080
1081
1082
1083 /*
1084  * Handle player hitting a real trap
1085  */
1086 static void hit_trap(bool break_trap)
1087 {
1088         int i, num, dam;
1089         int x = px, y = py;
1090
1091         /* Get the cave grid */
1092         cave_type *c_ptr = &cave[y][x];
1093         feature_type *f_ptr = &f_info[c_ptr->feat];
1094         int trap_feat_type = have_flag(f_ptr->flags, FF_TRAP) ? f_ptr->subtype : NOT_TRAP;
1095
1096 #ifdef JP
1097         cptr name = "¥È¥é¥Ã¥×";
1098 #else
1099         cptr name = "a trap";
1100 #endif
1101
1102         /* Disturb the player */
1103         disturb(0, 0);
1104
1105         cave_alter_feat(y, x, FF_HIT_TRAP);
1106
1107         /* Analyze XXX XXX XXX */
1108         switch (trap_feat_type)
1109         {
1110                 case TRAP_TRAPDOOR:
1111                 {
1112                         if (p_ptr->levitation)
1113                         {
1114 #ifdef JP
1115                                 msg_print("Íî¤È¤·¸Í¤òÈô¤Ó±Û¤¨¤¿¡£");
1116 #else
1117                                 msg_print("You fly over a trap door.");
1118 #endif
1119
1120                         }
1121                         else
1122                         {
1123 #ifdef JP
1124                                 msg_print("Íî¤È¤·¸Í¤ËÍî¤Á¤¿¡ª");
1125                                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
1126                                         msg_print("¤¯¤Ã¤½¡Á¡ª");
1127 #else
1128                                 msg_print("You have fallen through a trap door!");
1129 #endif
1130
1131                                 sound(SOUND_FALL);
1132                                 dam = damroll(2, 8);
1133 #ifdef JP
1134                                 name = "Íî¤È¤·¸Í";
1135 #else
1136                                 name = "a trap door";
1137 #endif
1138
1139                                 take_hit(DAMAGE_NOESCAPE, dam, name, -1);
1140
1141                                 /* Still alive and autosave enabled */
1142                                 if (autosave_l && (p_ptr->chp >= 0))
1143                                         do_cmd_save_game(TRUE);
1144
1145 #ifdef JP
1146                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "Íî¤È¤·¸Í¤ËÍî¤Á¤¿");
1147 #else
1148                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "You have fallen through a trap door!");
1149 #endif
1150                                 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
1151
1152                                 /* Leaving */
1153                                 p_ptr->leaving = TRUE;
1154                         }
1155                         break;
1156                 }
1157
1158                 case TRAP_PIT:
1159                 {
1160                         if (p_ptr->levitation)
1161                         {
1162 #ifdef JP
1163                                 msg_print("Íî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£");
1164 #else
1165                                 msg_print("You fly over a pit trap.");
1166 #endif
1167
1168                         }
1169                         else
1170                         {
1171 #ifdef JP
1172                                 msg_print("Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª");
1173 #else
1174                                 msg_print("You have fallen into a pit!");
1175 #endif
1176
1177                                 dam = damroll(2, 6);
1178 #ifdef JP
1179                                 name = "Íî¤È¤··ê";
1180 #else
1181                                 name = "a pit trap";
1182 #endif
1183
1184                                 take_hit(DAMAGE_NOESCAPE, dam, name, -1);
1185                         }
1186                         break;
1187                 }
1188
1189                 case TRAP_SPIKED_PIT:
1190                 {
1191                         if (p_ptr->levitation)
1192                         {
1193 #ifdef JP
1194                                 msg_print("¥È¥²¤Î¤¢¤ëÍî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£");
1195 #else
1196                                 msg_print("You fly over a spiked pit.");
1197 #endif
1198
1199                         }
1200                         else
1201                         {
1202 #ifdef JP
1203                                 msg_print("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª");
1204 #else
1205                                 msg_print("You fall into a spiked pit!");
1206 #endif
1207
1208
1209                                 /* Base damage */
1210 #ifdef JP
1211                                 name = "Íî¤È¤··ê";
1212 #else
1213                                 name = "a pit trap";
1214 #endif
1215
1216                                 dam = damroll(2, 6);
1217
1218                                 /* Extra spike damage */
1219                                 if (randint0(100) < 50)
1220                                 {
1221 #ifdef JP
1222                                         msg_print("¥¹¥Ñ¥¤¥¯¤¬»É¤µ¤Ã¤¿¡ª");
1223 #else
1224                                         msg_print("You are impaled!");
1225 #endif
1226
1227
1228 #ifdef JP
1229                                         name = "¥È¥²¤Î¤¢¤ëÍî¤È¤··ê";
1230 #else
1231                                         name = "a spiked pit";
1232 #endif
1233
1234                                         dam = dam * 2;
1235                                         (void)set_cut(p_ptr->cut + randint1(dam));
1236                                 }
1237
1238                                 /* Take the damage */
1239                                 take_hit(DAMAGE_NOESCAPE, dam, name, -1);
1240                         }
1241                         break;
1242                 }
1243
1244                 case TRAP_POISON_PIT:
1245                 {
1246                         if (p_ptr->levitation)
1247                         {
1248 #ifdef JP
1249                                 msg_print("¥È¥²¤Î¤¢¤ëÍî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£");
1250 #else
1251                                 msg_print("You fly over a spiked pit.");
1252 #endif
1253
1254                         }
1255                         else
1256                         {
1257 #ifdef JP
1258                         msg_print("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª");
1259 #else
1260                                 msg_print("You fall into a spiked pit!");
1261 #endif
1262
1263
1264                                 /* Base damage */
1265                                 dam = damroll(2, 6);
1266
1267 #ifdef JP
1268                                 name = "Íî¤È¤··ê";
1269 #else
1270                                 name = "a pit trap";
1271 #endif
1272
1273
1274                                 /* Extra spike damage */
1275                                 if (randint0(100) < 50)
1276                                 {
1277 #ifdef JP
1278                                         msg_print("ÆǤòÅɤé¤ì¤¿¥¹¥Ñ¥¤¥¯¤¬»É¤µ¤Ã¤¿¡ª");
1279 #else
1280                                         msg_print("You are impaled on poisonous spikes!");
1281 #endif
1282
1283
1284 #ifdef JP
1285                                         name = "¥È¥²¤Î¤¢¤ëÍî¤È¤··ê";
1286 #else
1287                                         name = "a spiked pit";
1288 #endif
1289
1290
1291                                         dam = dam * 2;
1292                                         (void)set_cut(p_ptr->cut + randint1(dam));
1293
1294                                         if (p_ptr->resist_pois || IS_OPPOSE_POIS())
1295                                         {
1296 #ifdef JP
1297                                                 msg_print("¤·¤«¤·ÆǤαƶÁ¤Ï¤Ê¤«¤Ã¤¿¡ª");
1298 #else
1299                                                 msg_print("The poison does not affect you!");
1300 #endif
1301
1302                                         }
1303
1304                                         else
1305                                         {
1306                                                 dam = dam * 2;
1307                                                 (void)set_poisoned(p_ptr->poisoned + randint1(dam));
1308                                         }
1309                                 }
1310
1311                                 /* Take the damage */
1312                                 take_hit(DAMAGE_NOESCAPE, dam, name, -1);
1313                         }
1314
1315                         break;
1316                 }
1317
1318                 case TRAP_TY_CURSE:
1319                 {
1320 #ifdef JP
1321                         msg_print("²¿¤«¤¬¥Ô¥«¥Ã¤È¸÷¤Ã¤¿¡ª");
1322 #else
1323                         msg_print("There is a flash of shimmering light!");
1324 #endif
1325
1326                         num = 2 + randint1(3);
1327                         for (i = 0; i < num; i++)
1328                         {
1329                                 (void)summon_specific(0, y, x, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
1330                         }
1331
1332                         if (dun_level > randint1(100)) /* No nasty effect for low levels */
1333                         {
1334                                 bool stop_ty = FALSE;
1335                                 int count = 0;
1336
1337                                 do
1338                                 {
1339                                         stop_ty = activate_ty_curse(stop_ty, &count);
1340                                 }
1341                                 while (one_in_(6));
1342                         }
1343                         break;
1344                 }
1345
1346                 case TRAP_TELEPORT:
1347                 {
1348 #ifdef JP
1349                         msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥È¥é¥Ã¥×¤Ë¤Ò¤Ã¤«¤«¤Ã¤¿¡ª");
1350 #else
1351                         msg_print("You hit a teleport trap!");
1352 #endif
1353
1354                         teleport_player(100, TELEPORT_PASSIVE);
1355                         break;
1356                 }
1357
1358                 case TRAP_FIRE:
1359                 {
1360 #ifdef JP
1361                         msg_print("±ê¤ËÊñ¤Þ¤ì¤¿¡ª");
1362 #else
1363                         msg_print("You are enveloped in flames!");
1364 #endif
1365
1366                         dam = damroll(4, 6);
1367 #ifdef JP
1368                         (void)fire_dam(dam, "±ê¤Î¥È¥é¥Ã¥×", -1);
1369 #else
1370                         (void)fire_dam(dam, "a fire trap", -1);
1371 #endif
1372
1373                         break;
1374                 }
1375
1376                 case TRAP_ACID:
1377                 {
1378 #ifdef JP
1379                         msg_print("»À¤¬¿á¤­¤«¤±¤é¤ì¤¿¡ª");
1380 #else
1381                         msg_print("You are splashed with acid!");
1382 #endif
1383
1384                         dam = damroll(4, 6);
1385 #ifdef JP
1386                         (void)acid_dam(dam, "»À¤Î¥È¥é¥Ã¥×", -1);
1387 #else
1388                         (void)acid_dam(dam, "an acid trap", -1);
1389 #endif
1390
1391                         break;
1392                 }
1393
1394                 case TRAP_SLOW:
1395                 {
1396                         if (check_hit(125))
1397                         {
1398 #ifdef JP
1399                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª");
1400 #else
1401                                 msg_print("A small dart hits you!");
1402 #endif
1403
1404                                 dam = damroll(1, 4);
1405 #ifdef JP
1406                                 take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1);
1407 #else
1408                                 take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1);
1409 #endif
1410
1411                                 if (!CHECK_MULTISHADOW()) (void)set_slow(p_ptr->slow + randint0(20) + 20, FALSE);
1412                         }
1413                         else
1414                         {
1415 #ifdef JP
1416                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£");
1417 #else
1418                                 msg_print("A small dart barely misses you.");
1419 #endif
1420
1421                         }
1422                         break;
1423                 }
1424
1425                 case TRAP_LOSE_STR:
1426                 {
1427                         if (check_hit(125))
1428                         {
1429 #ifdef JP
1430                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª");
1431 #else
1432                                 msg_print("A small dart hits you!");
1433 #endif
1434
1435                                 dam = damroll(1, 4);
1436 #ifdef JP
1437                                 take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1);
1438 #else
1439                                 take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1);
1440 #endif
1441
1442                                 if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_STR);
1443                         }
1444                         else
1445                         {
1446 #ifdef JP
1447                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£");
1448 #else
1449                                 msg_print("A small dart barely misses you.");
1450 #endif
1451
1452                         }
1453                         break;
1454                 }
1455
1456                 case TRAP_LOSE_DEX:
1457                 {
1458                         if (check_hit(125))
1459                         {
1460 #ifdef JP
1461                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª");
1462 #else
1463                                 msg_print("A small dart hits you!");
1464 #endif
1465
1466                                 dam = damroll(1, 4);
1467 #ifdef JP
1468                                 take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1);
1469 #else
1470                                 take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1);
1471 #endif
1472
1473                                 if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_DEX);
1474                         }
1475                         else
1476                         {
1477 #ifdef JP
1478                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£");
1479 #else
1480                                 msg_print("A small dart barely misses you.");
1481 #endif
1482
1483                         }
1484                         break;
1485                 }
1486
1487                 case TRAP_LOSE_CON:
1488                 {
1489                         if (check_hit(125))
1490                         {
1491 #ifdef JP
1492                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª");
1493 #else
1494                                 msg_print("A small dart hits you!");
1495 #endif
1496
1497                                 dam = damroll(1, 4);
1498 #ifdef JP
1499                                 take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1);
1500 #else
1501                                 take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1);
1502 #endif
1503
1504                                 if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_CON);
1505                         }
1506                         else
1507                         {
1508 #ifdef JP
1509                                 msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£");
1510 #else
1511                                 msg_print("A small dart barely misses you.");
1512 #endif
1513
1514                         }
1515                         break;
1516                 }
1517
1518                 case TRAP_BLIND:
1519                 {
1520 #ifdef JP
1521                         msg_print("¹õ¤¤¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
1522 #else
1523                         msg_print("A black gas surrounds you!");
1524 #endif
1525
1526                         if (!p_ptr->resist_blind)
1527                         {
1528                                 (void)set_blind(p_ptr->blind + randint0(50) + 25);
1529                         }
1530                         break;
1531                 }
1532
1533                 case TRAP_CONFUSE:
1534                 {
1535 #ifdef JP
1536                         msg_print("¤­¤é¤á¤¯¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
1537 #else
1538                         msg_print("A gas of scintillating colors surrounds you!");
1539 #endif
1540
1541                         if (!p_ptr->resist_conf)
1542                         {
1543                                 (void)set_confused(p_ptr->confused + randint0(20) + 10);
1544                         }
1545                         break;
1546                 }
1547
1548                 case TRAP_POISON:
1549                 {
1550 #ifdef JP
1551                         msg_print("»É·ãŪ¤ÊÎп§¤Î¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
1552 #else
1553                         msg_print("A pungent green gas surrounds you!");
1554 #endif
1555
1556                         if (!p_ptr->resist_pois && !IS_OPPOSE_POIS())
1557                         {
1558                                 (void)set_poisoned(p_ptr->poisoned + randint0(20) + 10);
1559                         }
1560                         break;
1561                 }
1562
1563                 case TRAP_SLEEP:
1564                 {
1565 #ifdef JP
1566                         msg_print("´ñ̯¤ÊÇò¤¤Ì¸¤ËÊñ¤Þ¤ì¤¿¡ª");
1567 #else
1568                         msg_print("A strange white mist surrounds you!");
1569 #endif
1570
1571                         if (!p_ptr->free_act)
1572                         {
1573 #ifdef JP
1574 msg_print("¤¢¤Ê¤¿¤Ï̲¤ê¤Ë½¢¤¤¤¿¡£");
1575 #else
1576                                 msg_print("You fall asleep.");
1577 #endif
1578
1579
1580                                 if (ironman_nightmare)
1581                                 {
1582 #ifdef JP
1583 msg_print("¿È¤ÎÌÓ¤â¤è¤À¤Ä¸÷·Ê¤¬Æ¬¤ËÉ⤫¤ó¤À¡£");
1584 #else
1585                                         msg_print("A horrible vision enters your mind.");
1586 #endif
1587
1588
1589                                         /* Pick a nightmare */
1590                                         get_mon_num_prep(get_nightmare, NULL);
1591
1592                                         /* Have some nightmares */
1593                                         have_nightmare(get_mon_num(MAX_DEPTH));
1594
1595                                         /* Remove the monster restriction */
1596                                         get_mon_num_prep(NULL, NULL);
1597                                 }
1598                                 (void)set_paralyzed(p_ptr->paralyzed + randint0(10) + 5);
1599                         }
1600                         break;
1601                 }
1602
1603                 case TRAP_TRAPS:
1604                 {
1605 #ifdef JP
1606 msg_print("¤Þ¤Ð¤æ¤¤Á®¸÷¤¬Áö¤Ã¤¿¡ª");
1607 #else
1608                         msg_print("There is a bright flash of light!");
1609 #endif
1610
1611                         /* Make some new traps */
1612                         project(0, 1, y, x, 0, GF_MAKE_TRAP, PROJECT_HIDE | PROJECT_JUMP | PROJECT_GRID, -1);
1613
1614                         break;
1615                 }
1616
1617                 case TRAP_ALARM:
1618                 {
1619 #ifdef JP
1620                         msg_print("¤±¤¿¤¿¤Þ¤·¤¤²»¤¬ÌĤê¶Á¤¤¤¿¡ª");
1621 #else
1622                         msg_print("An alarm sounds!");
1623 #endif
1624
1625                         aggravate_monsters(0);
1626
1627                         break;
1628                 }
1629
1630                 case TRAP_OPEN:
1631                 {
1632 #ifdef JP
1633                         msg_print("Âç²»¶Á¤È¶¦¤Ë¤Þ¤ï¤ê¤ÎÊɤ¬Êø¤ì¤¿¡ª");
1634 #else
1635                         msg_print("Suddenly, surrounding walls are opened!");
1636 #endif
1637                         (void)project(0, 3, y, x, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
1638                         (void)project(0, 3, y, x - 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
1639                         (void)project(0, 3, y, x + 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
1640                         aggravate_monsters(0);
1641
1642                         break;
1643                 }
1644
1645                 case TRAP_ARMAGEDDON:
1646                 {
1647                         static int levs[10] = {0, 0, 20, 10, 5, 3, 2, 1, 1, 1};
1648                         int evil_idx = 0, good_idx = 0;
1649
1650                         int lev;
1651 #ifdef JP
1652                         msg_print("ÆÍÁ³Å·³¦¤ÎÀïÁè¤Ë´¬¤­¹þ¤Þ¤ì¤¿¡ª");
1653 #else
1654                         msg_print("Suddenly, you are surrounded by immotal beings!");
1655 #endif
1656
1657                         /* Summon Demons and Angels */
1658                         for (lev = dun_level; lev >= 20; lev -= 1 + lev/16)
1659                         {
1660                                 num = levs[MIN(lev/10, 9)];
1661                                 for (i = 0; i < num; i++)
1662                                 {
1663                                         int x1 = rand_spread(x, 7);
1664                                         int y1 = rand_spread(y, 5);
1665
1666                                         /* Skip illegal grids */
1667                                         if (!in_bounds(y1, x1)) continue;
1668
1669                                         /* Require line of projection */
1670                                         if (!projectable(py, px, y1, x1)) continue;
1671
1672                                         if (summon_specific(0, y1, x1, lev, SUMMON_ARMAGE_EVIL, (PM_NO_PET)))
1673                                                 evil_idx = hack_m_idx_ii;
1674
1675                                         if (summon_specific(0, y1, x1, lev, SUMMON_ARMAGE_GOOD, (PM_NO_PET)))
1676                                         {
1677                                                 good_idx = hack_m_idx_ii;
1678                                         }
1679
1680                                         /* Let them fight each other */
1681                                         if (evil_idx && good_idx)
1682                                         {
1683                                                 monster_type *evil_ptr = &m_list[evil_idx];
1684                                                 monster_type *good_ptr = &m_list[good_idx];
1685                                                 evil_ptr->target_y = good_ptr->fy;
1686                                                 evil_ptr->target_x = good_ptr->fx;
1687                                                 good_ptr->target_y = evil_ptr->fy;
1688                                                 good_ptr->target_x = evil_ptr->fx;
1689                                         }
1690                                 }
1691                         }
1692                         break;
1693                 }
1694
1695                 case TRAP_PIRANHA:
1696                 {
1697 #ifdef JP
1698                         msg_print("ÆÍÁ³Êɤ«¤é¿å¤¬°î¤ì½Ð¤·¤¿¡ª¥Ô¥é¥Ë¥¢¤¬¤¤¤ë¡ª");
1699 #else
1700                         msg_print("Suddenly, the room is filled with water with piranhas!");
1701 #endif
1702
1703                         /* Water fills room */
1704                         fire_ball_hide(GF_WATER_FLOW, 0, 1, 10);
1705
1706                         /* Summon Piranhas */
1707                         num = 1 + dun_level/20;
1708                         for (i = 0; i < num; i++)
1709                         {
1710                                 (void)summon_specific(0, y, x, dun_level, SUMMON_PIRANHAS, (PM_ALLOW_GROUP | PM_NO_PET));
1711                         }
1712                         break;
1713                 }
1714         }
1715
1716         if (break_trap && is_trap(c_ptr->feat))
1717         {
1718                 cave_alter_feat(y, x, FF_DISARM);
1719 #ifdef JP
1720                 msg_print("¥È¥é¥Ã¥×¤òÊ´ºÕ¤·¤¿¡£");
1721 #else
1722                 msg_print("You destroyed the trap.");
1723 #endif
1724         }
1725 }
1726
1727
1728 static void touch_zap_player(monster_type *m_ptr)
1729 {
1730         int aura_damage = 0;
1731         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1732
1733         if (r_ptr->flags2 & RF2_AURA_FIRE)
1734         {
1735                 if (!p_ptr->immune_fire)
1736                 {
1737                         char aura_dam[80];
1738
1739                         aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1740
1741                         /* Hack -- Get the "died from" name */
1742                         monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
1743
1744 #ifdef JP
1745                         msg_print("ÆÍÁ³¤È¤Æ¤âÇ®¤¯¤Ê¤Ã¤¿¡ª");
1746 #else
1747                         msg_print("You are suddenly very hot!");
1748 #endif
1749
1750                         if (prace_is_(RACE_ENT)) aura_damage += aura_damage / 3;
1751                         if (IS_OPPOSE_FIRE()) aura_damage = (aura_damage + 2) / 3;
1752                         if (p_ptr->resist_fire) aura_damage = (aura_damage + 2) / 3;
1753
1754                         take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1);
1755                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= RF2_AURA_FIRE;
1756                         handle_stuff();
1757                 }
1758         }
1759
1760         if (r_ptr->flags3 & RF3_AURA_COLD)
1761         {
1762                 if (!p_ptr->immune_cold)
1763                 {
1764                         char aura_dam[80];
1765
1766                         aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1767
1768                         /* Hack -- Get the "died from" name */
1769                         monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
1770
1771 #ifdef JP
1772                         msg_print("ÆÍÁ³¤È¤Æ¤â´¨¤¯¤Ê¤Ã¤¿¡ª");
1773 #else
1774                         msg_print("You are suddenly very cold!");
1775 #endif
1776
1777                         if (IS_OPPOSE_COLD()) aura_damage = (aura_damage + 2) / 3;
1778                         if (p_ptr->resist_cold) aura_damage = (aura_damage + 2) / 3;
1779
1780                         take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1);
1781                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_AURA_COLD;
1782                         handle_stuff();
1783                 }
1784         }
1785
1786         if (r_ptr->flags2 & RF2_AURA_ELEC)
1787         {
1788                 if (!p_ptr->immune_elec)
1789                 {
1790                         char aura_dam[80];
1791
1792                         aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1793
1794                         /* Hack -- Get the "died from" name */
1795                         monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
1796
1797                         if (prace_is_(RACE_ANDROID)) aura_damage += aura_damage / 3;
1798                         if (IS_OPPOSE_ELEC()) aura_damage = (aura_damage + 2) / 3;
1799                         if (p_ptr->resist_elec) aura_damage = (aura_damage + 2) / 3;
1800
1801 #ifdef JP
1802                         msg_print("ÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª");
1803 #else
1804                         msg_print("You get zapped!");
1805 #endif
1806
1807                         take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1);
1808                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= RF2_AURA_ELEC;
1809                         handle_stuff();
1810                 }
1811         }
1812 }
1813
1814
1815 static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath)
1816 {
1817         int             k, bonus, chance;
1818         int             n_weight = 0;
1819         monster_type    *m_ptr = &m_list[m_idx];
1820         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
1821         char            m_name[80];
1822
1823         int             dss, ddd;
1824
1825         cptr            atk_desc;
1826
1827         switch (attack)
1828         {
1829                 case MUT2_SCOR_TAIL:
1830                         dss = 3;
1831                         ddd = 7;
1832                         n_weight = 5;
1833 #ifdef JP
1834                         atk_desc = "¿¬Èø";
1835 #else
1836                         atk_desc = "tail";
1837 #endif
1838
1839                         break;
1840                 case MUT2_HORNS:
1841                         dss = 2;
1842                         ddd = 6;
1843                         n_weight = 15;
1844 #ifdef JP
1845                         atk_desc = "³Ñ";
1846 #else
1847                         atk_desc = "horns";
1848 #endif
1849
1850                         break;
1851                 case MUT2_BEAK:
1852                         dss = 2;
1853                         ddd = 4;
1854                         n_weight = 5;
1855 #ifdef JP
1856                         atk_desc = "¥¯¥Á¥Ð¥·";
1857 #else
1858                         atk_desc = "beak";
1859 #endif
1860
1861                         break;
1862                 case MUT2_TRUNK:
1863                         dss = 1;
1864                         ddd = 4;
1865                         n_weight = 35;
1866 #ifdef JP
1867                         atk_desc = "¾Ý¤ÎÉ¡";
1868 #else
1869                         atk_desc = "trunk";
1870 #endif
1871
1872                         break;
1873                 case MUT2_TENTACLES:
1874                         dss = 2;
1875                         ddd = 5;
1876                         n_weight = 5;
1877 #ifdef JP
1878                         atk_desc = "¿¨¼ê";
1879 #else
1880                         atk_desc = "tentacles";
1881 #endif
1882
1883                         break;
1884                 default:
1885                         dss = ddd = n_weight = 1;
1886 #ifdef JP
1887                         atk_desc = "̤ÄêµÁ¤ÎÉô°Ì";
1888 #else
1889                         atk_desc = "undefined body part";
1890 #endif
1891
1892         }
1893
1894         /* Extract monster name (or "it") */
1895         monster_desc(m_name, m_ptr, 0);
1896
1897
1898         /* Calculate the "attack quality" */
1899         bonus = p_ptr->to_h_m;
1900         bonus += (p_ptr->lev * 6 / 5);
1901         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1902
1903         /* Test for hit */
1904         if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1905         {
1906                 /* Sound */
1907                 sound(SOUND_HIT);
1908
1909 #ifdef JP
1910                 msg_format("%s¤ò%s¤Ç¹¶·â¤·¤¿¡£", m_name, atk_desc);
1911 #else
1912                 msg_format("You hit %s with your %s.", m_name, atk_desc);
1913 #endif
1914
1915
1916                 k = damroll(ddd, dss);
1917                 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
1918
1919                 /* Apply the player damage bonuses */
1920                 k += p_ptr->to_d_m;
1921
1922                 /* No negative damage */
1923                 if (k < 0) k = 0;
1924
1925                 /* Modify the damage */
1926                 k = mon_damage_mod(m_ptr, k, FALSE);
1927
1928                 /* Complex message */
1929                 if (p_ptr->wizard)
1930                 {
1931 #ifdef JP
1932                                 msg_format("%d/%d ¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤¿¡£", k, m_ptr->hp);
1933 #else
1934                         msg_format("You do %d (out of %d) damage.", k, m_ptr->hp);
1935 #endif
1936
1937                 }
1938
1939                 /* Anger the monster */
1940                 if (k > 0) anger_monster(m_ptr);
1941
1942                 /* Damage, check for fear and mdeath */
1943                 switch (attack)
1944                 {
1945                         case MUT2_SCOR_TAIL:
1946                                 project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1947                                 *mdeath = (m_ptr->r_idx == 0);
1948                                 break;
1949                         case MUT2_HORNS:
1950                                 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1951                                 break;
1952                         case MUT2_BEAK:
1953                                 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1954                                 break;
1955                         case MUT2_TRUNK:
1956                                 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1957                                 break;
1958                         case MUT2_TENTACLES:
1959                                 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1960                                 break;
1961                         default:
1962                                 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1963                 }
1964
1965                 touch_zap_player(m_ptr);
1966         }
1967         /* Player misses */
1968         else
1969         {
1970                 /* Sound */
1971                 sound(SOUND_MISS);
1972
1973                 /* Message */
1974 #ifdef JP
1975                         msg_format("¥ß¥¹¡ª %s¤Ë¤«¤ï¤µ¤ì¤¿¡£", m_name);
1976 #else
1977                 msg_format("You miss %s.", m_name);
1978 #endif
1979
1980         }
1981 }
1982
1983
1984
1985 /*
1986  * Player attacks a (poor, defenseless) creature        -RAK-
1987  *
1988  * If no "weapon" is available, then "punch" the monster one time.
1989  */
1990 static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int mode)
1991 {
1992         int             num = 0, k, bonus, chance, vir;
1993
1994         cave_type       *c_ptr = &cave[y][x];
1995
1996         monster_type    *m_ptr = &m_list[c_ptr->m_idx];
1997         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
1998
1999         /* Access the weapon */
2000         object_type     *o_ptr = &inventory[INVEN_RARM + hand];
2001
2002         char            m_name[80];
2003
2004         bool            success_hit = FALSE;
2005         bool            backstab = FALSE;
2006         bool            vorpal_cut = FALSE;
2007         int             chaos_effect = 0;
2008         bool            stab_fleeing = FALSE;
2009         bool            fuiuchi = FALSE;
2010         bool            monk_attack = FALSE;
2011         bool            do_quake = FALSE;
2012         bool            weak = FALSE;
2013         bool            drain_msg = TRUE;
2014         int             drain_result = 0, drain_heal = 0;
2015         bool            can_drain = FALSE;
2016         int             num_blow;
2017         int             drain_left = MAX_VAMPIRIC_DRAIN;
2018         u32b flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
2019         bool            is_human = (r_ptr->d_char == 'p');
2020         bool            is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
2021         bool            zantetsu_mukou, e_j_mukou;
2022
2023         switch (p_ptr->pclass)
2024         {
2025         case CLASS_ROGUE:
2026         case CLASS_NINJA:
2027                 if (buki_motteruka(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
2028                 {
2029                         int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
2030                         if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
2031                         if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
2032                         if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
2033                         if (MON_CSLEEP(m_ptr) && m_ptr->ml)
2034                         {
2035                                 /* Can't backstab creatures that we can't see, right? */
2036                                 backstab = TRUE;
2037                         }
2038                         else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level+20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
2039                         {
2040                                 fuiuchi = TRUE;
2041                         }
2042                         else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
2043                         {
2044                                 stab_fleeing = TRUE;
2045                         }
2046                 }
2047                 break;
2048
2049         case CLASS_MONK:
2050         case CLASS_FORCETRAINER:
2051         case CLASS_BERSERKER:
2052                 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
2053                 break;
2054         }
2055
2056         if (!o_ptr->k_idx) /* Empty hand */
2057         {
2058                 if ((r_ptr->level + 10) > p_ptr->lev)
2059                 {
2060                         if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
2061                         {
2062                                 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
2063                                         p_ptr->skill_exp[GINOU_SUDE] += 40;
2064                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
2065                                         p_ptr->skill_exp[GINOU_SUDE] += 5;
2066                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
2067                                         p_ptr->skill_exp[GINOU_SUDE] += 1;
2068                                 else if ((p_ptr->lev > 34))
2069                                         if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
2070                                 p_ptr->update |= (PU_BONUS);
2071                         }
2072                 }
2073         }
2074         else if (object_is_melee_weapon(o_ptr))
2075         {
2076                 if ((r_ptr->level + 10) > p_ptr->lev)
2077                 {
2078                         int tval = inventory[INVEN_RARM+hand].tval - TV_WEAPON_BEGIN;
2079                         int sval = inventory[INVEN_RARM+hand].sval;
2080                         int now_exp = p_ptr->weapon_exp[tval][sval];
2081                         if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
2082                         {
2083                                 int amount = 0;
2084                                 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
2085                                 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
2086                                 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
2087                                 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
2088                                 p_ptr->weapon_exp[tval][sval] += amount;
2089                                 p_ptr->update |= (PU_BONUS);
2090                         }
2091                 }
2092         }
2093
2094         /* Disturb the monster */
2095         (void)set_monster_csleep(c_ptr->m_idx, 0);
2096
2097         /* Extract monster name (or "it") */
2098         monster_desc(m_name, m_ptr, 0);
2099
2100         /* Calculate the "attack quality" */
2101         bonus = p_ptr->to_h[hand] + o_ptr->to_h;
2102         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
2103         if (mode == HISSATSU_IAI) chance += 60;
2104         if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
2105
2106         if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
2107
2108         vir = virtue_number(V_VALOUR);
2109         if (vir)
2110         {
2111                 chance += (p_ptr->virtues[vir - 1]/10);
2112         }
2113
2114         zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
2115         e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
2116
2117         if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
2118         else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand]+2;
2119         else num_blow = p_ptr->num_blow[hand];
2120
2121         /* Hack -- DOKUBARI always hit once */
2122         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
2123
2124         /* Attack once for each legal blow */
2125         while ((num++ < num_blow) && !p_ptr->is_dead)
2126         {
2127                 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
2128                 {
2129                         int n = 1;
2130
2131                         if (p_ptr->migite && p_ptr->hidarite)
2132                         {
2133                                 n *= 2;
2134                         }
2135                         if (mode == HISSATSU_3DAN)
2136                         {
2137                                 n *= 2;
2138                         }
2139
2140                         success_hit = one_in_(n);
2141                 }
2142                 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
2143                 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
2144
2145                 if (mode == HISSATSU_MAJIN)
2146                 {
2147                         if (one_in_(2))
2148                                 success_hit = FALSE;
2149                 }
2150
2151                 /* Test for hit */
2152                 if (success_hit)
2153                 {
2154                         int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
2155
2156                         /* Sound */
2157                         sound(SOUND_HIT);
2158
2159                         /* Message */
2160 #ifdef JP
2161                         if (backstab) msg_format("¤¢¤Ê¤¿¤ÏÎä¹ó¤Ë¤â̲¤Ã¤Æ¤¤¤ë̵ÎϤÊ%s¤òÆͤ­»É¤·¤¿¡ª", m_name);
2162                         else if (fuiuchi) msg_format("ÉÔ°Õ¤òÆͤ¤¤Æ%s¤Ë¶¯Îõ¤Ê°ì·â¤ò¶ô¤é¤ï¤»¤¿¡ª", m_name);
2163                         else if (stab_fleeing) msg_format("ƨ¤²¤ë%s¤òÇØÃ椫¤éÆͤ­»É¤·¤¿¡ª", m_name);
2164                         else if (!monk_attack) msg_format("%s¤ò¹¶·â¤·¤¿¡£", m_name);
2165 #else
2166                         if (backstab) msg_format("You cruelly stab the helpless, sleeping %s!", m_name);
2167                         else if (fuiuchi) msg_format("You make surprise attack, and hit %s with a powerful blow!", m_name);
2168                         else if (stab_fleeing) msg_format("You backstab the fleeing %s!",  m_name);
2169                         else if (!monk_attack) msg_format("You hit %s.", m_name);
2170 #endif
2171
2172                         /* Hack -- bare hands do one damage */
2173                         k = 1;
2174
2175                         object_flags(o_ptr, flgs);
2176
2177                         /* Select a chaotic effect (50% chance) */
2178                         if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
2179                         {
2180                                 if (one_in_(10))
2181                                 chg_virtue(V_CHANCE, 1);
2182
2183                                 if (randint1(5) < 3)
2184                                 {
2185                                         /* Vampiric (20%) */
2186                                         chaos_effect = 1;
2187                                 }
2188                                 else if (one_in_(250))
2189                                 {
2190                                         /* Quake (0.12%) */
2191                                         chaos_effect = 2;
2192                                 }
2193                                 else if (!one_in_(10))
2194                                 {
2195                                         /* Confusion (26.892%) */
2196                                         chaos_effect = 3;
2197                                 }
2198                                 else if (one_in_(2))
2199                                 {
2200                                         /* Teleport away (1.494%) */
2201                                         chaos_effect = 4;
2202                                 }
2203                                 else
2204                                 {
2205                                         /* Polymorph (1.494%) */
2206                                         chaos_effect = 5;
2207                                 }
2208                         }
2209
2210                         /* Vampiric drain */
2211                         if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
2212                         {
2213                                 /* Only drain "living" monsters */
2214                                 if (monster_living(r_ptr))
2215                                         can_drain = TRUE;
2216                                 else
2217                                         can_drain = FALSE;
2218                         }
2219
2220                         if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance*3/2) == 1) && !zantetsu_mukou)
2221                                 vorpal_cut = TRUE;
2222                         else vorpal_cut = FALSE;
2223
2224                         if (monk_attack)
2225                         {
2226                                 int special_effect = 0, stun_effect = 0, times = 0, max_times;
2227                                 int min_level = 1;
2228                                 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
2229                                 int resist_stun = 0;
2230                                 int weight = 8;
2231
2232                                 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
2233                                 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
2234                                 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
2235                                 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
2236                                 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
2237                                         resist_stun += 66;
2238
2239                                 if (p_ptr->special_defense & KAMAE_BYAKKO)
2240                                         max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
2241                                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
2242                                         max_times = 1;
2243                                 else if (p_ptr->special_defense & KAMAE_GENBU)
2244                                         max_times = 1;
2245                                 else
2246                                         max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
2247                                 /* Attempt 'times' */
2248                                 for (times = 0; times < max_times; times++)
2249                                 {
2250                                         do
2251                                         {
2252                                                 ma_ptr = &ma_blows[randint0(MAX_MA)];
2253                                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
2254                                                 else min_level = ma_ptr->min_level;
2255                                         }
2256                                         while ((min_level > p_ptr->lev) ||
2257                                                (randint1(p_ptr->lev) < ma_ptr->chance));
2258
2259                                         /* keep the highest level attack available we found */
2260                                         if ((ma_ptr->min_level > old_ptr->min_level) &&
2261                                             !p_ptr->stun && !p_ptr->confused)
2262                                         {
2263                                                 old_ptr = ma_ptr;
2264
2265                                                 if (p_ptr->wizard && cheat_xtra)
2266                                                 {
2267 #ifdef JP
2268                                                         msg_print("¹¶·â¤òºÆÁªÂò¤·¤Þ¤·¤¿¡£");
2269 #else
2270                                                         msg_print("Attack re-selected.");
2271 #endif
2272                                                 }
2273                                         }
2274                                         else
2275                                         {
2276                                                 ma_ptr = old_ptr;
2277                                         }
2278                                 }
2279
2280                                 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
2281                                 else min_level = ma_ptr->min_level;
2282                                 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
2283                                 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
2284
2285                                 if (ma_ptr->effect == MA_KNEE)
2286                                 {
2287                                         if (r_ptr->flags1 & RF1_MALE)
2288                                         {
2289 #ifdef JP
2290                                                 msg_format("%s¤Ë¶âŪɨ½³¤ê¤ò¤¯¤é¤ï¤·¤¿¡ª", m_name);
2291 #else
2292                                                 msg_format("You hit %s in the groin with your knee!", m_name);
2293 #endif
2294
2295                                                 sound(SOUND_PAIN);
2296                                                 special_effect = MA_KNEE;
2297                                         }
2298                                         else
2299                                                 msg_format(ma_ptr->desc, m_name);
2300                                 }
2301
2302                                 else if (ma_ptr->effect == MA_SLOW)
2303                                 {
2304                                         if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
2305                                             my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
2306                                         {
2307 #ifdef JP
2308                                                 msg_format("%s¤Î­¼ó¤Ë´ØÀá½³¤ê¤ò¤¯¤é¤ï¤·¤¿¡ª", m_name);
2309 #else
2310                                                 msg_format("You kick %s in the ankle.", m_name);
2311 #endif
2312
2313                                                 special_effect = MA_SLOW;
2314                                         }
2315                                         else msg_format(ma_ptr->desc, m_name);
2316                                 }
2317                                 else
2318                                 {
2319                                         if (ma_ptr->effect)
2320                                         {
2321                                                 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
2322                                         }
2323
2324                                         msg_format(ma_ptr->desc, m_name);
2325                                 }
2326
2327                                 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
2328                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (p_ptr->magic_num1[0]))
2329                                 {
2330                                         weight += (p_ptr->magic_num1[0]/30);
2331                                         if (weight > 20) weight = 20;
2332                                 }
2333
2334                                 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
2335
2336                                 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
2337                                 {
2338 #ifdef JP
2339                                         msg_format("%^s¤Ï¶ìÄˤˤ¦¤á¤¤¤Æ¤¤¤ë¡ª", m_name);
2340 #else
2341                                         msg_format("%^s moans in agony!", m_name);
2342 #endif
2343
2344                                         stun_effect = 7 + randint1(13);
2345                                         resist_stun /= 3;
2346                                 }
2347
2348                                 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
2349                                 {
2350                                         if (!(r_ptr->flags1 & RF1_UNIQUE) &&
2351                                             (randint1(p_ptr->lev) > r_ptr->level) &&
2352                                             m_ptr->mspeed > 60)
2353                                         {
2354 #ifdef JP
2355                                                 msg_format("%^s¤Ï­¤ò¤Ò¤­¤º¤ê»Ï¤á¤¿¡£", m_name);
2356 #else
2357                                                 msg_format("%^s starts limping slower.", m_name);
2358 #endif
2359
2360                                                 m_ptr->mspeed -= 10;
2361                                         }
2362                                 }
2363
2364                                 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
2365                                 {
2366                                         if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
2367                                         {
2368                                                 if (set_monster_stunned(c_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
2369                                                 {
2370 #ifdef JP
2371                                                         msg_format("%^s¤Ï¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
2372 #else
2373                                                         msg_format("%^s is stunned.", m_name);
2374 #endif
2375                                                 }
2376                                                 else
2377                                                 {
2378 #ifdef JP
2379                                                         msg_format("%^s¤Ï¤µ¤é¤Ë¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
2380 #else
2381                                                         msg_format("%^s is more stunned.", m_name);
2382 #endif
2383                                                 }
2384                                         }
2385                                 }
2386                         }
2387
2388                         /* Handle normal weapon */
2389                         else if (o_ptr->k_idx)
2390                         {
2391                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2392                                 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
2393
2394                                 if (backstab)
2395                                 {
2396                                         k *= (3 + (p_ptr->lev / 20));
2397                                 }
2398                                 else if (fuiuchi)
2399                                 {
2400                                         k = k*(5+(p_ptr->lev*2/25))/2;
2401                                 }
2402                                 else if (stab_fleeing)
2403                                 {
2404                                         k = (3 * k) / 2;
2405                                 }
2406
2407                                 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
2408                                          (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
2409                                 {
2410                                         do_quake = TRUE;
2411                                 }
2412
2413                                 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
2414                                         k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2415
2416                                 drain_result = k;
2417
2418                                 if (vorpal_cut)
2419                                 {
2420                                         int mult = 2;
2421
2422                                         if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
2423                                         {
2424                                                 char chainsword_noise[1024];
2425 #ifdef JP
2426                                                 if (!get_rnd_line("chainswd_j.txt", 0, chainsword_noise))
2427 #else
2428                                                 if (!get_rnd_line("chainswd.txt", 0, chainsword_noise))
2429 #endif
2430                                                 {
2431                                                         msg_print(chainsword_noise);
2432                                                 }
2433                                         }
2434
2435                                         if (o_ptr->name1 == ART_VORPAL_BLADE)
2436                                         {
2437 #ifdef JP
2438                                                 msg_print("Ìܤˤâ»ß¤Þ¤é¤Ì¥ô¥©¡¼¥Ñ¥ë¥Ö¥ì¡¼¥É¡¢¼êÏ£¤ÎÁá¶È¡ª");
2439 #else
2440                                                 msg_print("Your Vorpal Blade goes snicker-snack!");
2441 #endif
2442                                         }
2443                                         else
2444                                         {
2445 #ifdef JP
2446                                                 msg_format("%s¤ò¥°¥Ã¥µ¥êÀÚ¤êÎö¤¤¤¿¡ª", m_name);
2447 #else
2448                                                 msg_format("Your weapon cuts deep into %s!", m_name);
2449 #endif
2450                                         }
2451
2452                                         /* Try to increase the damage */
2453                                         while (one_in_(vorpal_chance))
2454                                         {
2455                                                 mult++;
2456                                         }
2457
2458                                         k *= mult;
2459
2460                                         /* Ouch! */
2461                                         if (((r_ptr->flagsr & RFR_RES_ALL) ? k/100 : k) > m_ptr->hp)
2462                                         {
2463 #ifdef JP
2464                                                 msg_format("%s¤ò¿¿¤ÃÆó¤Ä¤Ë¤·¤¿¡ª", m_name);
2465 #else
2466                                                 msg_format("You cut %s in half!", m_name);
2467 #endif
2468                                         }
2469                                         else
2470                                         {
2471                                                 switch (mult)
2472                                                 {
2473 #ifdef JP
2474                                                 case 2: msg_format("%s¤ò»Â¤Ã¤¿¡ª", m_name); break;
2475                                                 case 3: msg_format("%s¤ò¤Ö¤Ã¤¿»Â¤Ã¤¿¡ª", m_name); break;
2476                                                 case 4: msg_format("%s¤ò¥á¥Ã¥¿»Â¤ê¤Ë¤·¤¿¡ª", m_name); break;
2477                                                 case 5: msg_format("%s¤ò¥á¥Ã¥¿¥á¥¿¤Ë»Â¤Ã¤¿¡ª", m_name); break;
2478                                                 case 6: msg_format("%s¤ò»É¿È¤Ë¤·¤¿¡ª", m_name); break;
2479                                                 case 7: msg_format("%s¤ò»Â¤Ã¤Æ»Â¤Ã¤Æ»Â¤ê¤Þ¤¯¤Ã¤¿¡ª", m_name); break;
2480                                                 default: msg_format("%s¤òºÙÀÚ¤ì¤Ë¤·¤¿¡ª", m_name); break;
2481 #else
2482                                                 case 2: msg_format("You gouge %s!", m_name); break;
2483                                                 case 3: msg_format("You maim %s!", m_name); break;
2484                                                 case 4: msg_format("You carve %s!", m_name); break;
2485                                                 case 5: msg_format("You cleave %s!", m_name); break;
2486                                                 case 6: msg_format("You smite %s!", m_name); break;
2487                                                 case 7: msg_format("You eviscerate %s!", m_name); break;
2488                                                 default: msg_format("You shred %s!", m_name); break;
2489 #endif
2490                                                 }
2491                                         }
2492                                         drain_result = drain_result * 3 / 2;
2493                                 }
2494
2495                                 k += o_ptr->to_d;
2496                                 drain_result += o_ptr->to_d;
2497                         }
2498
2499                         /* Apply the player damage bonuses */
2500                         k += p_ptr->to_d[hand];
2501                         drain_result += p_ptr->to_d[hand];
2502
2503                         if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
2504                         if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(r_ptr)) k = 0;
2505                         if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
2506
2507                         /* No negative damage */
2508                         if (k < 0) k = 0;
2509
2510                         if ((mode == HISSATSU_ZANMA) && !(!monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL)))
2511                         {
2512                                 k = 0;
2513                         }
2514
2515                         if (zantetsu_mukou)
2516                         {
2517 #ifdef JP
2518                                 msg_print("¤³¤ó¤ÊÆð¤é¤«¤¤¤â¤Î¤ÏÀÚ¤ì¤ó¡ª");
2519 #else
2520                                 msg_print("You cannot cut such a elastic thing!");
2521 #endif
2522                                 k = 0;
2523                         }
2524
2525                         if (e_j_mukou)
2526                         {
2527 #ifdef JP
2528                                 msg_print("ÃØéá¤Ï¶ì¼ê¤À¡ª");
2529 #else
2530                                 msg_print("Spiders are difficult for you to deal with!");
2531 #endif
2532                                 k /= 2;
2533                         }
2534
2535                         if (mode == HISSATSU_MINEUCHI)
2536                         {
2537                                 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
2538
2539                                 k = 0;
2540                                 anger_monster(m_ptr);
2541
2542                                 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
2543                                 {
2544                                         /* Get stunned */
2545                                         if (MON_STUNNED(m_ptr))
2546                                         {
2547 #ifdef JP
2548                                                 msg_format("%s¤Ï¤Ò¤É¤¯¤â¤¦¤í¤¦¤È¤·¤¿¡£", m_name);
2549 #else
2550                                                 msg_format("%s is more dazed.", m_name);
2551 #endif
2552
2553                                                 tmp /= 2;
2554                                         }
2555                                         else
2556                                         {
2557 #ifdef JP
2558                                                 msg_format("%s ¤Ï¤â¤¦¤í¤¦¤È¤·¤¿¡£", m_name);
2559 #else
2560                                                 msg_format("%s is dazed.", m_name);
2561 #endif
2562                                         }
2563
2564                                         /* Apply stun */
2565                                         (void)set_monster_stunned(c_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
2566                                 }
2567                                 else
2568                                 {
2569 #ifdef JP
2570                                         msg_format("%s ¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
2571 #else
2572                                         msg_format("%s is not effected.", m_name);
2573 #endif
2574                                 }
2575                         }
2576
2577                         /* Modify the damage */
2578                         k = mon_damage_mod(m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((p_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
2579                         if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
2580                         {
2581                                 if ((randint1(randint1(r_ptr->level/7)+5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
2582                                 {
2583                                         k = m_ptr->hp + 1;
2584 #ifdef JP
2585                                         msg_format("%s¤ÎµÞ½ê¤òÆͤ­»É¤·¤¿¡ª", m_name);
2586 #else
2587                                         msg_format("You hit %s on a fatal spot!", m_name);
2588 #endif
2589                                 }
2590                                 else k = 1;
2591                         }
2592                         else if ((p_ptr->pclass == CLASS_NINJA) && buki_motteruka(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
2593                         {
2594                                 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
2595                                 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
2596                                 {
2597                                         k *= 5;
2598                                         drain_result *= 2;
2599 #ifdef JP
2600                                         msg_format("¿Ï¤¬%s¤Ë¿¼¡¹¤ÈÆͤ­»É¤µ¤Ã¤¿¡ª", m_name);
2601 #else
2602                                         msg_format("You critically injured %s!", m_name);
2603 #endif
2604                                 }
2605                                 else if (((m_ptr->hp < maxhp/2) && one_in_((p_ptr->num_blow[0]+p_ptr->num_blow[1]+1)*10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
2606                                 {
2607                                         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp/2))
2608                                         {
2609                                                 k = MAX(k*5, m_ptr->hp/2);
2610                                                 drain_result *= 2;
2611 #ifdef JP
2612                                                 msg_format("%s¤ËÃ×Ì¿½ý¤òÉé¤ï¤»¤¿¡ª", m_name);
2613 #else
2614                                                 msg_format("You fatally injured %s!", m_name);
2615 #endif
2616                                         }
2617                                         else
2618                                         {
2619                                                 k = m_ptr->hp + 1;
2620 #ifdef JP
2621                                                 msg_format("¿Ï¤¬%s¤ÎµÞ½ê¤ò´Ó¤¤¤¿¡ª", m_name);
2622 #else
2623                                                 msg_format("You hit %s on a fatal spot!", m_name);
2624 #endif
2625                                         }
2626                                 }
2627                         }
2628
2629                         /* Complex message */
2630                         if (p_ptr->wizard || cheat_xtra)
2631                         {
2632 #ifdef JP
2633                                 msg_format("%d/%d ¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤¿¡£", k, m_ptr->hp);
2634 #else
2635                                 msg_format("You do %d (out of %d) damage.", k, m_ptr->hp);
2636 #endif
2637                         }
2638
2639                         if (k <= 0) can_drain = FALSE;
2640
2641                         if (drain_result > m_ptr->hp)
2642                                 drain_result = m_ptr->hp;
2643
2644                         /* Damage, check for fear and death */
2645                         if (mon_take_hit(c_ptr->m_idx, k, fear, NULL))
2646                         {
2647                                 *mdeath = TRUE;
2648                                 if ((p_ptr->pclass == CLASS_BERSERKER) && energy_use)
2649                                 {
2650                                         if (p_ptr->migite && p_ptr->hidarite)
2651                                         {
2652                                                 if (hand) energy_use = energy_use*3/5+energy_use*num*2/(p_ptr->num_blow[hand]*5);
2653                                                 else energy_use = energy_use*num*3/(p_ptr->num_blow[hand]*5);
2654                                         }
2655                                         else
2656                                         {
2657                                                 energy_use = energy_use*num/p_ptr->num_blow[hand];
2658                                         }
2659                                 }
2660                                 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
2661 #ifdef JP
2662                                         msg_print("¤Þ¤¿¤Ä¤Þ¤é¤Ì¤â¤Î¤ò»Â¤Ã¤Æ¤·¤Þ¤Ã¤¿¡¥¡¥¡¥");
2663 #else
2664                                         msg_print("Sigh... Another trifling thing I've cut....");
2665 #endif
2666                                 break;
2667                         }
2668
2669                         /* Anger the monster */
2670                         if (k > 0) anger_monster(m_ptr);
2671
2672                         touch_zap_player(m_ptr);
2673
2674                         /* Are we draining it?  A little note: If the monster is
2675                         dead, the drain does not work... */
2676
2677                         if (can_drain && (drain_result > 0))
2678                         {
2679                                 if (o_ptr->name1 == ART_MURAMASA)
2680                                 {
2681                                         if (is_human)
2682                                         {
2683                                                 int to_h = o_ptr->to_h;
2684                                                 int to_d = o_ptr->to_d;
2685                                                 int i, flag;
2686
2687                                                 flag = 1;
2688                                                 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
2689                                                 if (flag) to_h++;
2690
2691                                                 flag = 1;
2692                                                 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
2693                                                 if (flag) to_d++;
2694
2695                                                 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
2696                                                 {
2697 #ifdef JP
2698                                                         msg_print("ÍÅÅá¤Ï·ì¤òµÛ¤Ã¤Æ¶¯¤¯¤Ê¤Ã¤¿¡ª");
2699 #else
2700                                                         msg_print("Muramasa sucked blood, and became more powerful!");
2701 #endif
2702                                                         o_ptr->to_h = to_h;
2703                                                         o_ptr->to_d = to_d;
2704                                                 }
2705                                         }
2706                                 }
2707                                 else
2708                                 {
2709                                         if (drain_result > 5) /* Did we really hurt it? */
2710                                         {
2711                                                 drain_heal = damroll(2, drain_result / 6);
2712
2713                                                 /* Hex */
2714                                                 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
2715
2716                                                 if (cheat_xtra)
2717                                                 {
2718 #ifdef JP
2719                                                         msg_format("Draining left: %d", drain_left);
2720 #else
2721                                                         msg_format("Draining left: %d", drain_left);
2722 #endif
2723
2724                                                 }
2725
2726                                                 if (drain_left)
2727                                                 {
2728                                                         if (drain_heal < drain_left)
2729                                                         {
2730                                                                 drain_left -= drain_heal;
2731                                                         }
2732                                                         else
2733                                                         {
2734                                                                 drain_heal = drain_left;
2735                                                                 drain_left = 0;
2736                                                         }
2737
2738                                                         if (drain_msg)
2739                                                         {
2740 #ifdef JP
2741                                                                 msg_format("¿Ï¤¬%s¤«¤éÀ¸Ì¿ÎϤòµÛ¤¤¼è¤Ã¤¿¡ª", m_name);
2742 #else
2743                                                                 msg_format("Your weapon drains life from %s!", m_name);
2744 #endif
2745
2746                                                                 drain_msg = FALSE;
2747                                                         }
2748
2749                                                         drain_heal = (drain_heal * mutant_regenerate_mod) / 100;
2750
2751                                                         hp_player(drain_heal);
2752                                                         /* We get to keep some of it! */
2753                                                 }
2754                                         }
2755                                 }
2756                                 m_ptr->maxhp -= (k+7)/8;
2757                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
2758                                 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
2759                                 weak = TRUE;
2760                         }
2761                         can_drain = FALSE;
2762                         drain_result = 0;
2763
2764                         /* Confusion attack */
2765                         if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
2766                         {
2767                                 /* Cancel glowing hands */
2768                                 if (p_ptr->special_attack & ATTACK_CONFUSE)
2769                                 {
2770                                         p_ptr->special_attack &= ~(ATTACK_CONFUSE);
2771 #ifdef JP
2772                                         msg_print("¼ê¤Îµ±¤­¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£");
2773 #else
2774                                         msg_print("Your hands stop glowing.");
2775 #endif
2776                                         p_ptr->redraw |= (PR_STATUS);
2777
2778                                 }
2779
2780                                 /* Confuse the monster */
2781                                 if (r_ptr->flags3 & RF3_NO_CONF)
2782                                 {
2783                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
2784
2785 #ifdef JP
2786                                         msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
2787 #else
2788                                         msg_format("%^s is unaffected.", m_name);
2789 #endif
2790
2791                                 }
2792                                 else if (randint0(100) < r_ptr->level)
2793                                 {
2794 #ifdef JP
2795                                         msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
2796 #else
2797                                         msg_format("%^s is unaffected.", m_name);
2798 #endif
2799
2800                                 }
2801                                 else
2802                                 {
2803 #ifdef JP
2804                                         msg_format("%^s¤Ïº®Í𤷤¿¤è¤¦¤À¡£", m_name);
2805 #else
2806                                         msg_format("%^s appears confused.", m_name);
2807 #endif
2808
2809                                         (void)set_monster_confused(c_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
2810                                 }
2811                         }
2812
2813                         else if (chaos_effect == 4)
2814                         {
2815                                 bool resists_tele = FALSE;
2816
2817                                 if (r_ptr->flagsr & RFR_RES_TELE)
2818                                 {
2819                                         if (r_ptr->flags1 & RF1_UNIQUE)
2820                                         {
2821                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2822 #ifdef JP
2823                                                 msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
2824 #else
2825                                                 msg_format("%^s is unaffected!", m_name);
2826 #endif
2827
2828                                                 resists_tele = TRUE;
2829                                         }
2830                                         else if (r_ptr->level > randint1(100))
2831                                         {
2832                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2833 #ifdef JP
2834                                                 msg_format("%^s¤ÏÄñ¹³ÎϤò»ý¤Ã¤Æ¤¤¤ë¡ª", m_name);
2835 #else
2836                                                 msg_format("%^s resists!", m_name);
2837 #endif
2838
2839                                                 resists_tele = TRUE;
2840                                         }
2841                                 }
2842
2843                                 if (!resists_tele)
2844                                 {
2845 #ifdef JP
2846                                         msg_format("%^s¤Ï¾Ã¤¨¤¿¡ª", m_name);
2847 #else
2848                                         msg_format("%^s disappears!", m_name);
2849 #endif
2850
2851                                         teleport_away(c_ptr->m_idx, 50, TELEPORT_PASSIVE);
2852                                         num = num_blow + 1; /* Can't hit it anymore! */
2853                                         *mdeath = TRUE;
2854                                 }
2855                         }
2856
2857                         else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
2858                         {
2859                                 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
2860                                     !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
2861                                 {
2862                                         if (polymorph_monster(y, x))
2863                                         {
2864 #ifdef JP
2865                                                 msg_format("%^s¤ÏÊѲ½¤·¤¿¡ª", m_name);
2866 #else
2867                                                 msg_format("%^s changes!", m_name);
2868 #endif
2869
2870                                                 *fear = FALSE;
2871                                                 weak = FALSE;
2872                                         }
2873                                         else
2874                                         {
2875 #ifdef JP
2876                                                 msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
2877 #else
2878                                                 msg_format("%^s is unaffected.", m_name);
2879 #endif
2880                                         }
2881
2882                                         /* Hack -- Get new monster */
2883                                         m_ptr = &m_list[c_ptr->m_idx];
2884
2885                                         /* Oops, we need a different name... */
2886                                         monster_desc(m_name, m_ptr, 0);
2887
2888                                         /* Hack -- Get new race */
2889                                         r_ptr = &r_info[m_ptr->r_idx];
2890                                 }
2891                         }
2892                         else if (o_ptr->name1 == ART_G_HAMMER)
2893                         {
2894                                 monster_type *m_ptr = &m_list[c_ptr->m_idx];
2895
2896                                 if (m_ptr->hold_o_idx)
2897                                 {
2898                                         object_type *q_ptr = &o_list[m_ptr->hold_o_idx];
2899                                         char o_name[MAX_NLEN];
2900
2901                                         object_desc(o_name, q_ptr, OD_NAME_ONLY);
2902                                         q_ptr->held_m_idx = 0;
2903                                         q_ptr->marked = OM_TOUCHED;
2904                                         m_ptr->hold_o_idx = q_ptr->next_o_idx;
2905                                         q_ptr->next_o_idx = 0;
2906 #ifdef JP
2907                                         msg_format("%s¤òÃ¥¤Ã¤¿¡£", o_name);
2908 #else
2909                                         msg_format("You snatched %s.", o_name);
2910 #endif
2911                                         inven_carry(q_ptr);
2912                                 }
2913                         }
2914                 }
2915
2916                 /* Player misses */
2917                 else
2918                 {
2919                         backstab = FALSE; /* Clumsy! */
2920                         fuiuchi = FALSE; /* Clumsy! */
2921
2922                         if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2923                         {
2924                                 u32b flgs[TR_FLAG_SIZE];
2925
2926                                 /* Sound */
2927                                 sound(SOUND_HIT);
2928
2929                                 /* Message */
2930 #ifdef JP
2931                                 msg_format("¥ß¥¹¡ª %s¤Ë¤«¤ï¤µ¤ì¤¿¡£", m_name);
2932 #else
2933                                 msg_format("You miss %s.", m_name);
2934 #endif
2935                                 /* Message */
2936 #ifdef JP
2937                                 msg_print("¿¶¤ê²ó¤·¤¿Âç³ù¤¬¼«Ê¬¼«¿È¤ËÊ֤äƤ­¤¿¡ª");
2938 #else
2939                                 msg_print("Your scythe returns to you!");
2940 #endif
2941
2942                                 /* Extract the flags */
2943                                 object_flags(o_ptr, flgs);
2944
2945                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2946                                 {
2947                                         int mult;
2948                                         switch (p_ptr->mimic_form)
2949                                         {
2950                                         case MIMIC_NONE:
2951                                                 switch (p_ptr->prace)
2952                                                 {
2953                                                         case RACE_YEEK:
2954                                                         case RACE_KLACKON:
2955                                                         case RACE_HUMAN:
2956                                                         case RACE_AMBERITE:
2957                                                         case RACE_DUNADAN:
2958                                                         case RACE_BARBARIAN:
2959                                                         case RACE_BEASTMAN:
2960                                                                 mult = 25;break;
2961                                                         case RACE_HALF_ORC:
2962                                                         case RACE_HALF_TROLL:
2963                                                         case RACE_HALF_OGRE:
2964                                                         case RACE_HALF_GIANT:
2965                                                         case RACE_HALF_TITAN:
2966                                                         case RACE_CYCLOPS:
2967                                                         case RACE_IMP:
2968                                                         case RACE_SKELETON:
2969                                                         case RACE_ZOMBIE:
2970                                                         case RACE_VAMPIRE:
2971                                                         case RACE_SPECTRE:
2972                                                         case RACE_DEMON:
2973                                                         case RACE_DRACONIAN:
2974                                                                 mult = 30;break;
2975                                                         default:
2976                                                                 mult = 10;break;
2977                                                 }
2978                                                 break;
2979                                         case MIMIC_DEMON:
2980                                         case MIMIC_DEMON_LORD:
2981                                         case MIMIC_VAMPIRE:
2982                                                 mult = 30;break;
2983                                         default:
2984                                                 mult = 10;break;
2985                                         }
2986
2987                                         if (p_ptr->align < 0 && mult < 20)
2988                                                 mult = 20;
2989                                         if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2990                                                 mult = 25;
2991                                         if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2992                                                 mult = 25;
2993                                         if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2994                                                 mult = 25;
2995                                         if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2996                                                 mult = 25;
2997                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2998                                                 mult = 25;
2999
3000                                         if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (p_ptr->msp / 30)))
3001                                         {
3002                                                 p_ptr->csp -= (1+(p_ptr->msp / 30));
3003                                                 p_ptr->redraw |= (PR_MANA);
3004                                                 mult = mult * 3 / 2 + 20;
3005                                         }
3006                                         k *= mult;
3007                                         k /= 10;
3008                                 }
3009
3010                                 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
3011                                 if (one_in_(6))
3012                                 {
3013                                         int mult = 2;
3014 #ifdef JP
3015                                         msg_format("¥°¥Ã¥µ¥êÀÚ¤êÎö¤«¤ì¤¿¡ª");
3016 #else
3017                                         msg_format("Your weapon cuts deep into yourself!");
3018 #endif
3019                                         /* Try to increase the damage */
3020                                         while (one_in_(4))
3021                                         {
3022                                                 mult++;
3023                                         }
3024
3025                                         k *= mult;
3026                                 }
3027                                 k += (p_ptr->to_d[hand] + o_ptr->to_d);
3028
3029                                 if (k < 0) k = 0;
3030
3031 #ifdef JP
3032                                 take_hit(DAMAGE_FORCE, k, "»à¤ÎÂç³ù", -1);
3033 #else
3034                                 take_hit(DAMAGE_FORCE, k, "Death scythe", -1);
3035 #endif
3036
3037                                 redraw_stuff();
3038                         }
3039                         else
3040                         {
3041                                 /* Sound */
3042                                 sound(SOUND_MISS);
3043
3044                                 /* Message */
3045 #ifdef JP
3046                                 msg_format("¥ß¥¹¡ª %s¤Ë¤«¤ï¤µ¤ì¤¿¡£", m_name);
3047 #else
3048                                 msg_format("You miss %s.", m_name);
3049 #endif
3050                         }
3051                 }
3052                 backstab = FALSE;
3053                 fuiuchi = FALSE;
3054         }
3055
3056
3057         if (weak && !(*mdeath))
3058         {
3059 #ifdef JP
3060                 msg_format("%s¤Ï¼å¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£", m_name);
3061 #else
3062                 msg_format("%^s seems weakened.", m_name);
3063 #endif
3064         }
3065         if (drain_left != MAX_VAMPIRIC_DRAIN)
3066         {
3067                 if (one_in_(4))
3068                 {
3069                         chg_virtue(V_UNLIFE, 1);
3070                 }
3071         }
3072         /* Mega-Hack -- apply earthquake brand */
3073         if (do_quake)
3074         {
3075                 earthquake(py, px, 10);
3076                 if (!cave[y][x].m_idx) *mdeath = TRUE;
3077         }
3078 }
3079
3080 bool py_attack(int y, int x, int mode)
3081 {
3082         bool            fear = FALSE;
3083         bool            mdeath = FALSE;
3084         bool            stormbringer = FALSE;
3085
3086         cave_type       *c_ptr = &cave[y][x];
3087         monster_type    *m_ptr = &m_list[c_ptr->m_idx];
3088         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
3089         char            m_name[80];
3090
3091         /* Disturb the player */
3092         disturb(0, 0);
3093
3094         energy_use = 100;
3095
3096         if (!p_ptr->migite && !p_ptr->hidarite &&
3097             !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
3098         {
3099 #ifdef JP
3100                 msg_format("%s¹¶·â¤Ç¤­¤Ê¤¤¡£", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ" : "");
3101 #else
3102                 msg_print("You cannot do attacking.");
3103 #endif
3104                 return FALSE;
3105         }
3106
3107         /* Extract monster name (or "it") */
3108         monster_desc(m_name, m_ptr, 0);
3109
3110         if (m_ptr->ml)
3111         {
3112                 /* Auto-Recall if possible and visible */
3113                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
3114
3115                 /* Track a new monster */
3116                 health_track(c_ptr->m_idx);
3117         }
3118
3119         if ((r_ptr->flags1 & RF1_FEMALE) &&
3120             !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
3121         {
3122                 if ((inventory[INVEN_RARM].name1 == ART_ZANTETSU) || (inventory[INVEN_LARM].name1 == ART_ZANTETSU))
3123                 {
3124 #ifdef JP
3125                         msg_print("ÀÛ¼Ô¡¢¤ª¤Ê¤´¤Ï»Â¤ì¤Ì¡ª");
3126 #else
3127                         msg_print("I can not attack women!");
3128 #endif
3129                         return FALSE;
3130                 }
3131         }
3132
3133         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
3134         {
3135 #ifdef JP
3136                 msg_print("¤Ê¤¼¤«¹¶·â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¡£");
3137 #else
3138                 msg_print("Something prevent you from attacking.");
3139 #endif
3140                 return FALSE;
3141         }
3142
3143         /* Stop if friendly */
3144         if (!is_hostile(m_ptr) &&
3145             !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
3146             p_ptr->shero || !m_ptr->ml))
3147         {
3148                 if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
3149                 if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
3150                 if (stormbringer)
3151                 {
3152 #ifdef JP
3153                         msg_format("¹õ¤¤¿Ï¤Ï¶¯ÍߤË%s¤ò¹¶·â¤·¤¿¡ª", m_name);
3154 #else
3155                         msg_format("Your black blade greedily attacks %s!", m_name);
3156 #endif
3157                         chg_virtue(V_INDIVIDUALISM, 1);
3158                         chg_virtue(V_HONOUR, -1);
3159                         chg_virtue(V_JUSTICE, -1);
3160                         chg_virtue(V_COMPASSION, -1);
3161                 }
3162                 else if (p_ptr->pclass != CLASS_BERSERKER)
3163                 {
3164 #ifdef JP
3165                         if (get_check("ËÜÅö¤Ë¹¶·â¤·¤Þ¤¹¤«¡©"))
3166 #else
3167                         if (get_check("Really hit it? "))
3168 #endif
3169                         {
3170                                 chg_virtue(V_INDIVIDUALISM, 1);
3171                                 chg_virtue(V_HONOUR, -1);
3172                                 chg_virtue(V_JUSTICE, -1);
3173                                 chg_virtue(V_COMPASSION, -1);
3174                         }
3175                         else
3176                         {
3177 #ifdef JP
3178                                 msg_format("%s¤ò¹¶·â¤¹¤ë¤Î¤ò»ß¤á¤¿¡£", m_name);
3179 #else
3180                                 msg_format("You stop to avoid hitting %s.", m_name);
3181 #endif
3182                                 return FALSE;
3183                         }
3184                 }
3185         }
3186
3187
3188         /* Handle player fear */
3189         if (p_ptr->afraid)
3190         {
3191                 /* Message */
3192                 if (m_ptr->ml)
3193 #ifdef JP
3194                         msg_format("¶²¤¯¤Æ%s¤ò¹¶·â¤Ç¤­¤Ê¤¤¡ª", m_name);
3195 #else
3196                         msg_format("You are too afraid to attack %s!", m_name);
3197 #endif
3198
3199                 else
3200 #ifdef JP
3201                         msg_format ("¤½¤Ã¤Á¤Ë¤Ï²¿¤«¶²¤¤¤â¤Î¤¬¤¤¤ë¡ª");
3202 #else
3203                         msg_format ("There is something scary in your way!");
3204 #endif
3205
3206                 /* Disturb the monster */
3207                 (void)set_monster_csleep(c_ptr->m_idx, 0);
3208
3209                 /* Done */
3210                 return FALSE;
3211         }
3212
3213         if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
3214         {
3215                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
3216                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
3217         }
3218
3219         if (p_ptr->migite && p_ptr->hidarite)
3220         {
3221                 if ((p_ptr->skill_exp[GINOU_NITOURYU] < s_info[p_ptr->pclass].s_max[GINOU_NITOURYU]) && ((p_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_ptr->level))
3222                 {
3223                         if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
3224                                 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
3225                         else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
3226                                 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
3227                         else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
3228                                 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
3229                         else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
3230                                 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
3231                         p_ptr->update |= (PU_BONUS);
3232                 }
3233         }
3234
3235         /* Gain riding experience */
3236         if (p_ptr->riding)
3237         {
3238                 int cur = p_ptr->skill_exp[GINOU_RIDING];
3239                 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
3240
3241                 if (cur < max)
3242                 {
3243                         int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
3244                         int targetlevel = r_ptr->level;
3245                         int inc = 0;
3246
3247                         if ((cur / 200 - 5) < targetlevel)
3248                                 inc += 1;
3249
3250                         /* Extra experience */
3251                         if ((cur / 100) < ridinglevel)
3252                         {
3253                                 if ((cur / 100 + 15) < ridinglevel)
3254                                         inc += 1 + (ridinglevel - (cur / 100 + 15));
3255                                 else
3256                                         inc += 1;
3257                         }
3258
3259                         p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
3260
3261                         p_ptr->update |= (PU_BONUS);
3262                 }
3263         }
3264
3265         riding_t_m_idx = c_ptr->m_idx;
3266         if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
3267         if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
3268
3269         /* Mutations which yield extra 'natural' attacks */
3270         if (!mdeath)
3271         {
3272                 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
3273                         natural_attack(c_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
3274                 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
3275                         natural_attack(c_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
3276                 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
3277                         natural_attack(c_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
3278                 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
3279                         natural_attack(c_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
3280                 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
3281                         natural_attack(c_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
3282         }
3283
3284         /* Hack -- delay fear messages */
3285         if (fear && m_ptr->ml && !mdeath)
3286         {
3287                 /* Sound */
3288                 sound(SOUND_FLEE);
3289
3290                 /* Message */
3291 #ifdef JP
3292                 msg_format("%^s¤Ï¶²Éݤ·¤Æƨ¤²½Ð¤·¤¿¡ª", m_name);
3293 #else
3294                 msg_format("%^s flees in terror!", m_name);
3295 #endif
3296
3297         }
3298
3299         if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
3300         {
3301                 set_action(ACTION_NONE);
3302         }
3303
3304         return mdeath;
3305 }
3306
3307
3308 bool pattern_seq(int c_y, int c_x, int n_y, int n_x)
3309 {
3310         feature_type *cur_f_ptr = &f_info[cave[c_y][c_x].feat];
3311         feature_type *new_f_ptr = &f_info[cave[n_y][n_x].feat];
3312         bool is_pattern_tile_cur = have_flag(cur_f_ptr->flags, FF_PATTERN);
3313         bool is_pattern_tile_new = have_flag(new_f_ptr->flags, FF_PATTERN);
3314         int pattern_type_cur, pattern_type_new;
3315
3316         if (!is_pattern_tile_cur && !is_pattern_tile_new) return TRUE;
3317
3318         pattern_type_cur = is_pattern_tile_cur ? cur_f_ptr->subtype : NOT_PATTERN_TILE;
3319         pattern_type_new = is_pattern_tile_new ? new_f_ptr->subtype : NOT_PATTERN_TILE;
3320
3321         if (pattern_type_new == PATTERN_TILE_START)
3322         {
3323                 if (!is_pattern_tile_cur && !p_ptr->confused && !p_ptr->stun && !p_ptr->image)
3324                 {
3325 #ifdef JP
3326                         if (get_check("¥Ñ¥¿¡¼¥ó¤Î¾å¤òÊ⤭»Ï¤á¤ë¤È¡¢Á´¤Æ¤òÊ⤫¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤¤¤¤¤Ç¤¹¤«¡©"))
3327 #else
3328                         if (get_check("If you start walking the Pattern, you must walk the whole way. Ok? "))
3329 #endif
3330                                 return TRUE;
3331                         else
3332                                 return FALSE;
3333                 }
3334                 else
3335                         return TRUE;
3336         }
3337         else if ((pattern_type_new == PATTERN_TILE_OLD) ||
3338                  (pattern_type_new == PATTERN_TILE_END) ||
3339                  (pattern_type_new == PATTERN_TILE_WRECKED))
3340         {
3341                 if (is_pattern_tile_cur)
3342                 {
3343                         return TRUE;
3344                 }
3345                 else
3346                 {
3347 #ifdef JP
3348                         msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤òÊ⤯¤Ë¤Ï¥¹¥¿¡¼¥ÈÃÏÅÀ¤«¤éÊ⤭»Ï¤á¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£");
3349 #else
3350                         msg_print("You must start walking the Pattern from the startpoint.");
3351 #endif
3352
3353                         return FALSE;
3354                 }
3355         }
3356         else if ((pattern_type_new == PATTERN_TILE_TELEPORT) ||
3357                  (pattern_type_cur == PATTERN_TILE_TELEPORT))
3358         {
3359                 return TRUE;
3360         }
3361         else if (pattern_type_cur == PATTERN_TILE_START)
3362         {
3363                 if (is_pattern_tile_new)
3364                         return TRUE;
3365                 else
3366                 {
3367 #ifdef JP
3368                         msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤ÏÀµ¤·¤¤½ç½ø¤ÇÊ⤫¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó¡£");
3369 #else
3370                         msg_print("You must walk the Pattern in correct order.");
3371 #endif
3372
3373                         return FALSE;
3374                 }
3375         }
3376         else if ((pattern_type_cur == PATTERN_TILE_OLD) ||
3377                  (pattern_type_cur == PATTERN_TILE_END) ||
3378                  (pattern_type_cur == PATTERN_TILE_WRECKED))
3379         {
3380                 if (!is_pattern_tile_new)
3381                 {
3382 #ifdef JP
3383                         msg_print("¥Ñ¥¿¡¼¥ó¤òƧ¤ß³°¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£");
3384 #else
3385                         msg_print("You may not step off from the Pattern.");
3386 #endif
3387
3388                         return FALSE;
3389                 }
3390                 else
3391                 {
3392                         return TRUE;
3393                 }
3394         }
3395         else
3396         {
3397                 if (!is_pattern_tile_cur)
3398                 {
3399 #ifdef JP
3400                         msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤òÊ⤯¤Ë¤Ï¥¹¥¿¡¼¥ÈÃÏÅÀ¤«¤éÊ⤭»Ï¤á¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£");
3401 #else
3402                         msg_print("You must start walking the Pattern from the startpoint.");
3403 #endif
3404
3405                         return FALSE;
3406                 }
3407                 else
3408                 {
3409                         byte ok_move = PATTERN_TILE_START;
3410                         switch (pattern_type_cur)
3411                         {
3412                                 case PATTERN_TILE_1:
3413                                         ok_move = PATTERN_TILE_2;
3414                                         break;
3415                                 case PATTERN_TILE_2:
3416                                         ok_move = PATTERN_TILE_3;
3417                                         break;
3418                                 case PATTERN_TILE_3:
3419                                         ok_move = PATTERN_TILE_4;
3420                                         break;
3421                                 case PATTERN_TILE_4:
3422                                         ok_move = PATTERN_TILE_1;
3423                                         break;
3424                                 default:
3425                                         if (p_ptr->wizard)
3426 #ifdef JP
3427                                                 msg_format("¤ª¤«¤·¤Ê¥Ñ¥¿¡¼¥óÊâ¹Ô¡¢%d¡£", pattern_type_cur);
3428 #else
3429                                                 msg_format("Funny Pattern walking, %d.", pattern_type_cur);
3430 #endif
3431
3432                                         return TRUE; /* Goof-up */
3433                         }
3434
3435                         if ((pattern_type_new == ok_move) ||
3436                             (pattern_type_new == pattern_type_cur))
3437                                 return TRUE;
3438                         else
3439                         {
3440                                 if (!is_pattern_tile_new)
3441 #ifdef JP
3442                                         msg_print("¥Ñ¥¿¡¼¥ó¤òƧ¤ß³°¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£");
3443 #else
3444                                         msg_print("You may not step off from the Pattern.");
3445 #endif
3446                                 else
3447 #ifdef JP
3448                                         msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤ÏÀµ¤·¤¤½ç½ø¤ÇÊ⤫¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó¡£");
3449 #else
3450                                         msg_print("You must walk the Pattern in correct order.");
3451 #endif
3452
3453                                 return FALSE;
3454                         }
3455                 }
3456         }
3457 }
3458
3459
3460 bool player_can_enter(s16b feature, u16b mode)
3461 {
3462         feature_type *f_ptr = &f_info[feature];
3463
3464         if (p_ptr->riding) return monster_can_cross_terrain(feature, &r_info[m_list[p_ptr->riding].r_idx], mode | CEM_RIDING);
3465
3466         /* Pattern */
3467         if (have_flag(f_ptr->flags, FF_PATTERN))
3468         {
3469                 if (!(mode & CEM_P_CAN_ENTER_PATTERN)) return FALSE;
3470         }
3471
3472         /* "CAN" flags */
3473         if (have_flag(f_ptr->flags, FF_CAN_FLY) && p_ptr->levitation) return TRUE;
3474         if (have_flag(f_ptr->flags, FF_CAN_SWIM) && p_ptr->can_swim) return TRUE;
3475         if (have_flag(f_ptr->flags, FF_CAN_PASS) && p_ptr->pass_wall) return TRUE;
3476
3477         if (!have_flag(f_ptr->flags, FF_MOVE)) return FALSE;
3478
3479         return TRUE;
3480 }
3481
3482
3483 /*
3484  * Move the player
3485  */
3486 bool move_player_effect(int ny, int nx, u32b mpe_mode)
3487 {
3488         cave_type *c_ptr = &cave[ny][nx];
3489         feature_type *f_ptr = &f_info[c_ptr->feat];
3490
3491         if (!(mpe_mode & MPE_STAYING))
3492         {
3493                 int oy = py;
3494                 int ox = px;
3495                 cave_type *oc_ptr = &cave[oy][ox];
3496                 int om_idx = oc_ptr->m_idx;
3497                 int nm_idx = c_ptr->m_idx;
3498
3499                 /* Move the player */
3500                 py = ny;
3501                 px = nx;
3502
3503                 /* Hack -- For moving monster or riding player's moving */
3504                 if (!(mpe_mode & MPE_DONT_SWAP_MON))
3505                 {
3506                         /* Swap two monsters */
3507                         c_ptr->m_idx = om_idx;
3508                         oc_ptr->m_idx = nm_idx;
3509
3510                         if (om_idx > 0) /* Monster on old spot (or p_ptr->riding) */
3511                         {
3512                                 monster_type *om_ptr = &m_list[om_idx];
3513                                 om_ptr->fy = ny;
3514                                 om_ptr->fx = nx;
3515                                 update_mon(om_idx, TRUE);
3516                         }
3517
3518                         if (nm_idx > 0) /* Monster on new spot */
3519                         {
3520                                 monster_type *nm_ptr = &m_list[nm_idx];
3521                                 nm_ptr->fy = oy;
3522                                 nm_ptr->fx = ox;
3523                                 update_mon(nm_idx, TRUE);
3524                         }
3525                 }
3526
3527                 /* Redraw old spot */
3528                 lite_spot(oy, ox);
3529
3530                 /* Redraw new spot */
3531                 lite_spot(ny, nx);
3532
3533                 /* Check for new panel (redraw map) */
3534                 verify_panel();
3535
3536                 if (mpe_mode & MPE_FORGET_FLOW)
3537                 {
3538                         forget_flow();
3539
3540                         /* Mega-Hack -- Forget the view */
3541                         p_ptr->update |= (PU_UN_VIEW);
3542
3543                         /* Redraw map */
3544                         p_ptr->redraw |= (PR_MAP);
3545                 }
3546
3547                 /* Update stuff */
3548                 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_DISTANCE);
3549
3550                 /* Window stuff */
3551                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
3552
3553                 /* Remove "unsafe" flag */
3554                 if ((!p_ptr->blind && !no_lite()) || !is_trap(c_ptr->feat)) c_ptr->info &= ~(CAVE_UNSAFE);
3555
3556                 /* For get everything when requested hehe I'm *NASTY* */
3557                 if (dun_level && (d_info[dungeon_type].flags1 & DF1_FORGET)) wiz_dark();
3558
3559                 /* Handle stuff */
3560                 if (mpe_mode & MPE_HANDLE_STUFF) handle_stuff();
3561
3562                 if (p_ptr->pclass == CLASS_NINJA)
3563                 {
3564                         if (c_ptr->info & (CAVE_GLOW)) set_superstealth(FALSE);
3565                         else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
3566                 }
3567
3568                 if ((p_ptr->action == ACTION_HAYAGAKE) &&
3569                     (!have_flag(f_ptr->flags, FF_PROJECT) ||
3570                      (!p_ptr->levitation && have_flag(f_ptr->flags, FF_DEEP))))
3571                 {
3572 #ifdef JP
3573                         msg_print("¤³¤³¤Ç¤ÏÁÇÁ᤯ư¤±¤Ê¤¤¡£");
3574 #else
3575                         msg_print("You cannot run in here.");
3576 #endif
3577                         set_action(ACTION_NONE);
3578                 }
3579         }
3580
3581         if (mpe_mode & MPE_ENERGY_USE)
3582         {
3583                 if (music_singing(MUSIC_WALL))
3584                 {
3585                         (void)project(0, 0, py, px, (60 + p_ptr->lev), GF_DISINTEGRATE,
3586                                 PROJECT_KILL | PROJECT_ITEM, -1);
3587
3588                         if (!player_bold(ny, nx) || p_ptr->is_dead || p_ptr->leaving) return FALSE;
3589                 }
3590
3591                 /* Spontaneous Searching */
3592                 if ((p_ptr->skill_fos >= 50) || (0 == randint0(50 - p_ptr->skill_fos)))
3593                 {
3594                         search();
3595                 }
3596
3597                 /* Continuous Searching */
3598                 if (p_ptr->action == ACTION_SEARCH)
3599                 {
3600                         search();
3601                 }
3602         }
3603
3604         /* Handle "objects" */
3605         if (!(mpe_mode & MPE_DONT_PICKUP))
3606         {
3607                 carry((mpe_mode & MPE_DO_PICKUP) ? TRUE : FALSE);
3608         }
3609
3610         /* Handle "store doors" */
3611         if (have_flag(f_ptr->flags, FF_STORE))
3612         {
3613                 /* Disturb */
3614                 disturb(0, 0);
3615
3616                 energy_use = 0;
3617                 /* Hack -- Enter store */
3618                 command_new = SPECIAL_KEY_STORE;
3619         }
3620
3621         /* Handle "building doors" -KMW- */
3622         else if (have_flag(f_ptr->flags, FF_BLDG))
3623         {
3624                 /* Disturb */
3625                 disturb(0, 0);
3626
3627                 energy_use = 0;
3628                 /* Hack -- Enter building */
3629                 command_new = SPECIAL_KEY_BUILDING;
3630         }
3631
3632         /* Handle quest areas -KMW- */
3633         else if (have_flag(f_ptr->flags, FF_QUEST_ENTER))
3634         {
3635                 /* Disturb */
3636                 disturb(0, 0);
3637
3638                 energy_use = 0;
3639                 /* Hack -- Enter quest level */
3640                 command_new = SPECIAL_KEY_QUEST;
3641         }
3642
3643         else if (have_flag(f_ptr->flags, FF_QUEST_EXIT))
3644         {
3645                 if (quest[p_ptr->inside_quest].type == QUEST_TYPE_FIND_EXIT)
3646                 {
3647                         if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_C, p_ptr->inside_quest, NULL);
3648                         quest[p_ptr->inside_quest].status = QUEST_STATUS_COMPLETED;
3649                         quest[p_ptr->inside_quest].complev = (byte)p_ptr->lev;
3650 #ifdef JP
3651                         msg_print("¥¯¥¨¥¹¥È¤òãÀ®¤·¤¿¡ª");
3652 #else
3653                         msg_print("You accomplished your quest!");
3654 #endif
3655
3656                         msg_print(NULL);
3657                 }
3658
3659                 leave_quest_check();
3660
3661                 p_ptr->inside_quest = c_ptr->special;
3662                 dun_level = 0;
3663                 p_ptr->oldpx = 0;
3664                 p_ptr->oldpy = 0;
3665
3666                 p_ptr->leaving = TRUE;
3667         }
3668
3669         /* Set off a trap */
3670         else if (have_flag(f_ptr->flags, FF_HIT_TRAP) && !(mpe_mode & MPE_STAYING))
3671         {
3672                 /* Disturb */
3673                 disturb(0, 0);
3674
3675                 /* Hidden trap */
3676                 if (c_ptr->mimic || have_flag(f_ptr->flags, FF_SECRET))
3677                 {
3678                         /* Message */
3679 #ifdef JP
3680                         msg_print("¥È¥é¥Ã¥×¤À¡ª");
3681 #else
3682                         msg_print("You found a trap!");
3683 #endif
3684
3685                         /* Pick a trap */
3686                         disclose_grid(py, px);
3687                 }
3688
3689                 /* Hit the trap */
3690                 hit_trap((mpe_mode & MPE_BREAK_TRAP) ? TRUE : FALSE);
3691
3692                 if (!player_bold(ny, nx) || p_ptr->is_dead || p_ptr->leaving) return FALSE;
3693         }
3694
3695         /* Warn when leaving trap detected region */
3696         if (!(mpe_mode & MPE_STAYING) && (disturb_trap_detect || alert_trap_detect)
3697             && p_ptr->dtrap && !(c_ptr->info & CAVE_IN_DETECT))
3698         {
3699                 /* No duplicate warning */
3700                 p_ptr->dtrap = FALSE;
3701
3702                 /* You are just on the edge */
3703                 if (!(c_ptr->info & CAVE_UNSAFE))
3704                 {
3705                         if (alert_trap_detect)
3706                         {
3707 #ifdef JP
3708                                 msg_print("* Ãí°Õ:¤³¤ÎÀè¤Ï¥È¥é¥Ã¥×¤Î´¶ÃÎÈϰϳ°¤Ç¤¹¡ª *");
3709 #else
3710                                 msg_print("*Leaving trap detect region!*");
3711 #endif
3712                         }
3713
3714                         if (disturb_trap_detect) disturb(0, 0);
3715                 }
3716         }
3717
3718         return player_bold(ny, nx) && !p_ptr->is_dead && !p_ptr->leaving;
3719 }
3720
3721
3722 bool trap_can_be_ignored(int feat)
3723 {
3724         feature_type *f_ptr = &f_info[feat];
3725
3726         if (!have_flag(f_ptr->flags, FF_TRAP)) return TRUE;
3727
3728         switch (f_ptr->subtype)
3729         {
3730         case TRAP_TRAPDOOR:
3731         case TRAP_PIT:
3732         case TRAP_SPIKED_PIT:
3733         case TRAP_POISON_PIT:
3734                 if (p_ptr->levitation) return TRUE;
3735                 break;
3736         case TRAP_TELEPORT:
3737                 if (p_ptr->anti_tele) return TRUE;
3738                 break;
3739         case TRAP_FIRE:
3740                 if (p_ptr->immune_fire) return TRUE;
3741                 break;
3742         case TRAP_ACID:
3743                 if (p_ptr->immune_acid) return TRUE;
3744                 break;
3745         case TRAP_BLIND:
3746                 if (p_ptr->resist_blind) return TRUE;
3747                 break;
3748         case TRAP_CONFUSE:
3749                 if (p_ptr->resist_conf) return TRUE;
3750                 break;
3751         case TRAP_POISON:
3752                 if (p_ptr->resist_pois) return TRUE;
3753                 break;
3754         case TRAP_SLEEP:
3755                 if (p_ptr->free_act) return TRUE;
3756                 break;
3757         }
3758
3759         return FALSE;
3760 }
3761
3762
3763 /*
3764  * Determine if a "boundary" grid is "floor mimic"
3765  */
3766 #define boundary_floor(C, F, MF) \
3767         ((C)->mimic && permanent_wall(F) && \
3768          (have_flag((MF)->flags, FF_MOVE) || have_flag((MF)->flags, FF_CAN_FLY)) && \
3769          have_flag((MF)->flags, FF_PROJECT) && \
3770          !have_flag((MF)->flags, FF_OPEN))
3771
3772 /*
3773  * Move player in the given direction, with the given "pickup" flag.
3774  *
3775  * This routine should (probably) always induce energy expenditure.
3776  *
3777  * Note that moving will *always* take a turn, and will *always* hit
3778  * any monster which might be in the destination grid.  Previously,
3779  * moving into walls was "free" and did NOT hit invisible monsters.
3780  */
3781 void move_player(int dir, bool do_pickup, bool break_trap)
3782 {
3783         /* Find the result of moving */
3784         int y = py + ddy[dir];
3785         int x = px + ddx[dir];
3786
3787         /* Examine the destination */
3788         cave_type *c_ptr = &cave[y][x];
3789
3790         feature_type *f_ptr = &f_info[c_ptr->feat];
3791
3792         monster_type *m_ptr;
3793
3794         monster_type *riding_m_ptr = &m_list[p_ptr->riding];
3795         monster_race *riding_r_ptr = &r_info[p_ptr->riding ? riding_m_ptr->r_idx : 0]; /* Paranoia */
3796
3797         char m_name[80];
3798
3799         bool p_can_enter = player_can_enter(c_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
3800         bool p_can_kill_walls = FALSE;
3801         bool stormbringer = FALSE;
3802
3803         bool oktomove = TRUE;
3804         bool do_past = FALSE;
3805
3806         /* Exit the area */
3807         if (!dun_level && !p_ptr->wild_mode &&
3808                 ((x == 0) || (x == MAX_WID - 1) ||
3809                  (y == 0) || (y == MAX_HGT - 1)))
3810         {
3811                 /* Can the player enter the grid? */
3812                 if (c_ptr->mimic && player_can_enter(c_ptr->mimic, 0))
3813                 {
3814                         /* Hack: move to new area */
3815                         if ((y == 0) && (x == 0))
3816                         {
3817                                 p_ptr->wilderness_y--;
3818                                 p_ptr->wilderness_x--;
3819                                 p_ptr->oldpy = cur_hgt - 2;
3820                                 p_ptr->oldpx = cur_wid - 2;
3821                                 ambush_flag = FALSE;
3822                         }
3823
3824                         else if ((y == 0) && (x == MAX_WID - 1))
3825                         {
3826                                 p_ptr->wilderness_y--;
3827                                 p_ptr->wilderness_x++;
3828                                 p_ptr->oldpy = cur_hgt - 2;
3829                                 p_ptr->oldpx = 1;
3830                                 ambush_flag = FALSE;
3831                         }
3832
3833                         else if ((y == MAX_HGT - 1) && (x == 0))
3834                         {
3835                                 p_ptr->wilderness_y++;
3836                                 p_ptr->wilderness_x--;
3837                                 p_ptr->oldpy = 1;
3838                                 p_ptr->oldpx = cur_wid - 2;
3839                                 ambush_flag = FALSE;
3840                         }
3841
3842                         else if ((y == MAX_HGT - 1) && (x == MAX_WID - 1))
3843                         {
3844                                 p_ptr->wilderness_y++;
3845                                 p_ptr->wilderness_x++;
3846                                 p_ptr->oldpy = 1;
3847                                 p_ptr->oldpx = 1;
3848                                 ambush_flag = FALSE;
3849                         }
3850
3851                         else if (y == 0)
3852                         {
3853                                 p_ptr->wilderness_y--;
3854                                 p_ptr->oldpy = cur_hgt - 2;
3855                                 p_ptr->oldpx = x;
3856                                 ambush_flag = FALSE;
3857                         }
3858
3859                         else if (y == MAX_HGT - 1)
3860                         {
3861                                 p_ptr->wilderness_y++;
3862                                 p_ptr->oldpy = 1;
3863                                 p_ptr->oldpx = x;
3864                                 ambush_flag = FALSE;
3865                         }
3866
3867                         else if (x == 0)
3868                         {
3869                                 p_ptr->wilderness_x--;
3870                                 p_ptr->oldpx = cur_wid - 2;
3871                                 p_ptr->oldpy = y;
3872                                 ambush_flag = FALSE;
3873                         }
3874
3875                         else if (x == MAX_WID - 1)
3876                         {
3877                                 p_ptr->wilderness_x++;
3878                                 p_ptr->oldpx = 1;
3879                                 p_ptr->oldpy = y;
3880                                 ambush_flag = FALSE;
3881                         }
3882
3883                         p_ptr->leaving = TRUE;
3884                         energy_use = 100;
3885
3886                         return;
3887                 }
3888
3889                 /* "Blocked" message appears later */
3890                 /* oktomove = FALSE; */
3891                 p_can_enter = FALSE;
3892         }
3893
3894         /* Get the monster */
3895         m_ptr = &m_list[c_ptr->m_idx];
3896
3897
3898         if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
3899         if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
3900
3901         /* Player can not walk through "walls"... */
3902         /* unless in Shadow Form */
3903         p_can_kill_walls = p_ptr->kill_wall && have_flag(f_ptr->flags, FF_HURT_DISI) &&
3904                 (!p_can_enter || !have_flag(f_ptr->flags, FF_LOS)) &&
3905                 !have_flag(f_ptr->flags, FF_PERMANENT);
3906
3907         /* Hack -- attack monsters */
3908         if (c_ptr->m_idx && (m_ptr->ml || p_can_enter || p_can_kill_walls))
3909         {
3910                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3911
3912                 /* Attack -- only if we can see it OR it is not in a wall */
3913                 if (!is_hostile(m_ptr) &&
3914                     !(p_ptr->confused || p_ptr->image || !m_ptr->ml || p_ptr->stun ||
3915                     ((p_ptr->muta2 & MUT2_BERS_RAGE) && p_ptr->shero)) &&
3916                     pattern_seq(py, px, y, x) && (p_can_enter || p_can_kill_walls))
3917                 {
3918                         /* Disturb the monster */
3919                         (void)set_monster_csleep(c_ptr->m_idx, 0);
3920
3921                         /* Extract monster name (or "it") */
3922                         monster_desc(m_name, m_ptr, 0);
3923
3924                         if (m_ptr->ml)
3925                         {
3926                                 /* Auto-Recall if possible and visible */
3927                                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
3928
3929                                 /* Track a new monster */
3930                                 health_track(c_ptr->m_idx);
3931                         }
3932
3933                         /* displace? */
3934                         if ((stormbringer && (randint1(1000) > 666)) || (p_ptr->pclass == CLASS_BERSERKER))
3935                         {
3936                                 py_attack(y, x, 0);
3937                                 oktomove = FALSE;
3938                         }
3939                         else if (monster_can_cross_terrain(cave[py][px].feat, r_ptr, 0))
3940                         {
3941                                 do_past = TRUE;
3942                         }
3943                         else
3944                         {
3945 #ifdef JP
3946                                 msg_format("%^s¤¬¼ÙËâ¤À¡ª", m_name);
3947 #else
3948                                 msg_format("%^s is in your way!", m_name);
3949 #endif
3950
3951                                 energy_use = 0;
3952                                 oktomove = FALSE;
3953                         }
3954
3955                         /* now continue on to 'movement' */
3956                 }
3957                 else
3958                 {
3959                         py_attack(y, x, 0);
3960                         oktomove = FALSE;
3961                 }
3962         }
3963
3964         if (oktomove && p_ptr->riding)
3965         {
3966                 if (riding_r_ptr->flags1 & RF1_NEVER_MOVE)
3967                 {
3968 #ifdef JP
3969                         msg_print("Æ°¤±¤Ê¤¤¡ª");
3970 #else
3971                         msg_print("Can't move!");
3972 #endif
3973                         energy_use = 0;
3974                         oktomove = FALSE;
3975                         disturb(0, 0);
3976                 }
3977                 else if (MON_MONFEAR(riding_m_ptr))
3978                 {
3979                         char m_name[80];
3980
3981                         /* Acquire the monster name */
3982                         monster_desc(m_name, riding_m_ptr, 0);
3983
3984                         /* Dump a message */
3985 #ifdef JP
3986                         msg_format("%s¤¬¶²Éݤ·¤Æ¤¤¤ÆÀ©¸æ¤Ç¤­¤Ê¤¤¡£", m_name);
3987 #else
3988                         msg_format("%^s is too scared to control.", m_name);
3989 #endif
3990                         oktomove = FALSE;
3991                         disturb(0, 0);
3992                 }
3993                 else if (p_ptr->riding_ryoute)
3994                 {
3995                         oktomove = FALSE;
3996                         disturb(0, 0);
3997                 }
3998                 else if (have_flag(f_ptr->flags, FF_CAN_FLY) && (riding_r_ptr->flags7 & RF7_CAN_FLY))
3999                 {
4000                         /* Allow moving */
4001                 }
4002                 else if (have_flag(f_ptr->flags, FF_CAN_SWIM) && (riding_r_ptr->flags7 & RF7_CAN_SWIM))
4003                 {
4004                         /* Allow moving */
4005                 }
4006                 else if (have_flag(f_ptr->flags, FF_WATER) &&
4007                         !(riding_r_ptr->flags7 & RF7_AQUATIC) &&
4008                         (have_flag(f_ptr->flags, FF_DEEP) || (riding_r_ptr->flags2 & RF2_AURA_FIRE)))
4009                 {
4010 #ifdef JP
4011                         msg_format("%s¤Î¾å¤Ë¹Ô¤±¤Ê¤¤¡£", f_name + f_info[get_feat_mimic(c_ptr)].name);
4012 #else
4013                         msg_print("Can't swim.");
4014 #endif
4015                         energy_use = 0;
4016                         oktomove = FALSE;
4017                         disturb(0, 0);
4018                 }
4019                 else if (!have_flag(f_ptr->flags, FF_WATER) && (riding_r_ptr->flags7 & RF7_AQUATIC))
4020                 {
4021 #ifdef JP
4022                         msg_format("%s¤«¤é¾å¤¬¤ì¤Ê¤¤¡£", f_name + f_info[get_feat_mimic(&cave[py][px])].name);
4023 #else
4024                         msg_print("Can't land.");
4025 #endif
4026                         energy_use = 0;
4027                         oktomove = FALSE;
4028                         disturb(0, 0);
4029                 }
4030                 else if (have_flag(f_ptr->flags, FF_LAVA) && !(riding_r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4031                 {
4032 #ifdef JP
4033                         msg_format("%s¤Î¾å¤Ë¹Ô¤±¤Ê¤¤¡£", f_name + f_info[get_feat_mimic(c_ptr)].name);
4034 #else
4035                         msg_print("Too hot to go through.");
4036 #endif
4037                         energy_use = 0;
4038                         oktomove = FALSE;
4039                         disturb(0, 0);
4040                 }
4041
4042                 if (oktomove && MON_STUNNED(riding_m_ptr) && one_in_(2))
4043                 {
4044                         char m_name[80];
4045                         monster_desc(m_name, riding_m_ptr, 0);
4046 #ifdef JP
4047                         msg_format("%s¤¬Û¯Û°¤È¤·¤Æ¤¤¤Æ¤¦¤Þ¤¯Æ°¤±¤Ê¤¤¡ª",m_name);
4048 #else
4049                         msg_format("You cannot control stunned %s!",m_name);
4050 #endif
4051                         oktomove = FALSE;
4052                         disturb(0, 0);
4053                 }
4054         }
4055
4056         if (!oktomove)
4057         {
4058         }
4059
4060         else if (!have_flag(f_ptr->flags, FF_MOVE) && have_flag(f_ptr->flags, FF_CAN_FLY) && !p_ptr->levitation)
4061         {
4062 #ifdef JP
4063                 msg_format("¶õ¤òÈô¤Ð¤Ê¤¤¤È%s¤Î¾å¤Ë¤Ï¹Ô¤±¤Ê¤¤¡£", f_name + f_info[get_feat_mimic(c_ptr)].name);
4064 #else
4065                 msg_format("You need to fly to go through the %s.", f_name + f_info[get_feat_mimic(c_ptr)].name);
4066 #endif
4067
4068                 energy_use = 0;
4069                 running = 0;
4070                 oktomove = FALSE;
4071         }
4072
4073         /*
4074          * Player can move through trees and
4075          * has effective -10 speed
4076          * Rangers can move without penality
4077          */
4078         else if (have_flag(f_ptr->flags, FF_TREE) && !p_can_kill_walls)
4079         {
4080                 if ((p_ptr->pclass != CLASS_RANGER) && !p_ptr->levitation && (!p_ptr->riding || !(riding_r_ptr->flags8 & RF8_WILD_WOOD))) energy_use *= 2;
4081         }
4082
4083 #ifdef ALLOW_EASY_DISARM /* TNB */
4084
4085         /* Disarm a visible trap */
4086         else if ((do_pickup != easy_disarm) && have_flag(f_ptr->flags, FF_DISARM) && !c_ptr->mimic)
4087         {
4088                 if (!trap_can_be_ignored(c_ptr->feat))
4089                 {
4090                         (void)do_cmd_disarm_aux(y, x, dir);
4091                         return;
4092                 }
4093         }
4094
4095 #endif /* ALLOW_EASY_DISARM -- TNB */
4096
4097         /* Player can not walk through "walls" unless in wraith form...*/
4098         else if (!p_can_enter && !p_can_kill_walls)
4099         {
4100                 /* Feature code (applying "mimic" field) */
4101                 s16b feat = get_feat_mimic(c_ptr);
4102                 feature_type *mimic_f_ptr = &f_info[feat];
4103                 cptr name = f_name + mimic_f_ptr->name;
4104
4105                 oktomove = FALSE;
4106
4107                 /* Disturb the player */
4108                 disturb(0, 0);
4109
4110                 /* Notice things in the dark */
4111                 if (!(c_ptr->info & CAVE_MARK) && !player_can_see_bold(y, x))
4112                 {
4113                         /* Boundary floor mimic */
4114                         if (boundary_floor(c_ptr, f_ptr, mimic_f_ptr))
4115                         {
4116 #ifdef JP
4117                                 msg_print("¤½¤ì°Ê¾åÀè¤Ë¤Ï¿Ê¤á¤Ê¤¤¤è¤¦¤À¡£");
4118 #else
4119                                 msg_print("You feel you cannot go any more.");
4120 #endif
4121                         }
4122
4123                         /* Wall (or secret door) */
4124                         else
4125                         {
4126 #ifdef JP
4127                                 msg_format("%s¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£", name);
4128 #else
4129                                 msg_format("You feel %s %s blocking your way.",
4130                                         is_a_vowel(name[0]) ? "an" : "a", name);
4131 #endif
4132
4133                                 c_ptr->info |= (CAVE_MARK);
4134                                 lite_spot(y, x);
4135                         }
4136                 }
4137
4138                 /* Notice things */
4139                 else
4140                 {
4141                         /* Boundary floor mimic */
4142                         if (boundary_floor(c_ptr, f_ptr, mimic_f_ptr))
4143                         {
4144 #ifdef JP
4145                                 msg_print("¤½¤ì°Ê¾åÀè¤Ë¤Ï¿Ê¤á¤Ê¤¤¡£");
4146 #else
4147                                 msg_print("You cannot go any more.");
4148 #endif
4149
4150                                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
4151                                         energy_use = 0;
4152                         }
4153
4154                         /* Wall (or secret door) */
4155                         else
4156                         {
4157 #ifdef ALLOW_EASY_OPEN
4158                                 /* Closed doors */
4159                                 if (easy_open && is_closed_door(feat) && easy_open_door(y, x)) return;
4160 #endif /* ALLOW_EASY_OPEN */
4161
4162 #ifdef JP
4163                                 msg_format("%s¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¡£", name);
4164 #else
4165                                 msg_format("There is %s %s blocking your way.",
4166                                         is_a_vowel(name[0]) ? "an" : "a", name);
4167 #endif
4168
4169                                 /*
4170                                  * Well, it makes sense that you lose time bumping into
4171                                  * a wall _if_ you are confused, stunned or blind; but
4172                                  * typing mistakes should not cost you a turn...
4173                                  */
4174                                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
4175                                         energy_use = 0;
4176                         }
4177                 }
4178
4179                 /* Sound */
4180                 if (!boundary_floor(c_ptr, f_ptr, mimic_f_ptr)) sound(SOUND_HITWALL);
4181         }
4182
4183         /* Normal movement */
4184         if (oktomove && !pattern_seq(py, px, y, x))
4185         {
4186                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
4187                 {
4188                         energy_use = 0;
4189                 }
4190
4191                 /* To avoid a loop with running */
4192                 disturb(0, 0);
4193
4194                 oktomove = FALSE;
4195         }
4196
4197         /* Normal movement */
4198         if (oktomove)
4199         {
4200                 u32b mpe_mode = MPE_ENERGY_USE;
4201
4202                 if (p_ptr->warning)
4203                 {
4204                         if (!process_warning(x, y))
4205                         {
4206                                 energy_use = 25;
4207                                 return;
4208                         }
4209                 }
4210
4211                 if (do_past)
4212                 {
4213 #ifdef JP
4214                         msg_format("%s¤ò²¡¤·Âऱ¤¿¡£", m_name);
4215 #else
4216                         msg_format("You push past %s.", m_name);
4217 #endif
4218                 }
4219
4220                 /* Change oldpx and oldpy to place the player well when going back to big mode */
4221                 if (p_ptr->wild_mode)
4222                 {
4223                         if (ddy[dir] > 0)  p_ptr->oldpy = 1;
4224                         if (ddy[dir] < 0)  p_ptr->oldpy = MAX_HGT - 2;
4225                         if (ddy[dir] == 0) p_ptr->oldpy = MAX_HGT / 2;
4226                         if (ddx[dir] > 0)  p_ptr->oldpx = 1;
4227                         if (ddx[dir] < 0)  p_ptr->oldpx = MAX_WID - 2;
4228                         if (ddx[dir] == 0) p_ptr->oldpx = MAX_WID / 2;
4229                 }
4230
4231                 if (p_can_kill_walls)
4232                 {
4233                         cave_alter_feat(y, x, FF_HURT_DISI);
4234
4235                         /* Update some things -- similar to GF_KILL_WALL */
4236                         p_ptr->update |= (PU_FLOW);
4237                 }
4238
4239                 /* Sound */
4240                 /* sound(SOUND_WALK); */
4241
4242 #ifdef ALLOW_EASY_DISARM /* TNB */
4243
4244                 if (do_pickup != always_pickup) mpe_mode |= MPE_DO_PICKUP;
4245
4246 #else /* ALLOW_EASY_DISARM -- TNB */
4247
4248                 if (do_pickup) mpe_mode |= MPE_DO_PICKUP;
4249
4250 #endif /* ALLOW_EASY_DISARM -- TNB */
4251
4252                 if (break_trap) mpe_mode |= MPE_BREAK_TRAP;
4253
4254                 /* Move the player */
4255                 (void)move_player_effect(y, x, mpe_mode);
4256         }
4257 }
4258
4259
4260 static bool ignore_avoid_run;
4261
4262 /*
4263  * Hack -- Check for a "known wall" (see below)
4264  */
4265 static int see_wall(int dir, int y, int x)
4266 {
4267         cave_type   *c_ptr;
4268
4269         /* Get the new location */
4270         y += ddy[dir];
4271         x += ddx[dir];
4272
4273         /* Illegal grids are not known walls */
4274         if (!in_bounds2(y, x)) return (FALSE);
4275
4276         /* Access grid */
4277         c_ptr = &cave[y][x];
4278
4279         /* Must be known to the player */
4280         if (c_ptr->info & (CAVE_MARK))
4281         {
4282                 /* Feature code (applying "mimic" field) */
4283                 s16b         feat = get_feat_mimic(c_ptr);
4284                 feature_type *f_ptr = &f_info[feat];
4285
4286                 /* Wall grids are known walls */
4287                 if (!player_can_enter(feat, 0)) return !have_flag(f_ptr->flags, FF_DOOR);
4288
4289                 /* Don't run on a tree unless explicitly requested */
4290                 if (have_flag(f_ptr->flags, FF_AVOID_RUN) && !ignore_avoid_run)
4291                         return TRUE;
4292
4293                 /* Don't run in a wall */
4294                 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
4295                         return !have_flag(f_ptr->flags, FF_DOOR);
4296         }
4297
4298         return FALSE;
4299 }
4300
4301
4302 /*
4303  * Hack -- Check for an "unknown corner" (see below)
4304  */
4305 static int see_nothing(int dir, int y, int x)
4306 {
4307         /* Get the new location */
4308         y += ddy[dir];
4309         x += ddx[dir];
4310
4311         /* Illegal grids are unknown */
4312         if (!in_bounds2(y, x)) return (TRUE);
4313
4314         /* Memorized grids are always known */
4315         if (cave[y][x].info & (CAVE_MARK)) return (FALSE);
4316
4317         /* Viewable door/wall grids are known */
4318         if (player_can_see_bold(y, x)) return (FALSE);
4319
4320         /* Default */
4321         return (TRUE);
4322 }
4323
4324
4325
4326
4327
4328 /*
4329  * The running algorithm:                       -CJS-
4330  *
4331  * In the diagrams below, the player has just arrived in the
4332  * grid marked as '@', and he has just come from a grid marked
4333  * as 'o', and he is about to enter the grid marked as 'x'.
4334  *
4335  * Of course, if the "requested" move was impossible, then you
4336  * will of course be blocked, and will stop.
4337  *
4338  * Overview: You keep moving until something interesting happens.
4339  * If you are in an enclosed space, you follow corners. This is
4340  * the usual corridor scheme. If you are in an open space, you go
4341  * straight, but stop before entering enclosed space. This is
4342  * analogous to reaching doorways. If you have enclosed space on
4343  * one side only (that is, running along side a wall) stop if
4344  * your wall opens out, or your open space closes in. Either case
4345  * corresponds to a doorway.
4346  *
4347  * What happens depends on what you can really SEE. (i.e. if you
4348  * have no light, then running along a dark corridor is JUST like
4349  * running in a dark room.) The algorithm works equally well in
4350  * corridors, rooms, mine tailings, earthquake rubble, etc, etc.
4351  *
4352  * These conditions are kept in static memory:
4353  * find_openarea         You are in the open on at least one
4354  * side.
4355  * find_breakleft        You have a wall on the left, and will
4356  * stop if it opens
4357  * find_breakright       You have a wall on the right, and will
4358  * stop if it opens
4359  *
4360  * To initialize these conditions, we examine the grids adjacent
4361  * to the grid marked 'x', two on each side (marked 'L' and 'R').
4362  * If either one of the two grids on a given side is seen to be
4363  * closed, then that side is considered to be closed. If both
4364  * sides are closed, then it is an enclosed (corridor) run.
4365  *
4366  * LL           L
4367  * @x          LxR
4368  * RR          @R
4369  *
4370  * Looking at more than just the immediate squares is
4371  * significant. Consider the following case. A run along the
4372  * corridor will stop just before entering the center point,
4373  * because a choice is clearly established. Running in any of
4374  * three available directions will be defined as a corridor run.
4375  * Note that a minor hack is inserted to make the angled corridor
4376  * entry (with one side blocked near and the other side blocked
4377  * further away from the runner) work correctly. The runner moves
4378  * diagonally, but then saves the previous direction as being
4379  * straight into the gap. Otherwise, the tail end of the other
4380  * entry would be perceived as an alternative on the next move.
4381  *
4382  * #.#
4383  * ##.##
4384  * .@x..
4385  * ##.##
4386  * #.#
4387  *
4388  * Likewise, a run along a wall, and then into a doorway (two
4389  * runs) will work correctly. A single run rightwards from @ will
4390  * stop at 1. Another run right and down will enter the corridor
4391  * and make the corner, stopping at the 2.
4392  *
4393  * ##################
4394  * o@x       1
4395  * ########### ######
4396  * #2          #
4397  * #############
4398  *
4399  * After any move, the function area_affect is called to
4400  * determine the new surroundings, and the direction of
4401  * subsequent moves. It examines the current player location
4402  * (at which the runner has just arrived) and the previous
4403  * direction (from which the runner is considered to have come).
4404  *
4405  * Moving one square in some direction places you adjacent to
4406  * three or five new squares (for straight and diagonal moves
4407  * respectively) to which you were not previously adjacent,
4408  * marked as '!' in the diagrams below.
4409  *
4410  *   ...!              ...
4411  *   .o@!  (normal)    .o.!  (diagonal)
4412  *   ...!  (east)      ..@!  (south east)
4413  *                      !!!
4414  *
4415  * You STOP if any of the new squares are interesting in any way:
4416  * for example, if they contain visible monsters or treasure.
4417  *
4418  * You STOP if any of the newly adjacent squares seem to be open,
4419  * and you are also looking for a break on that side. (that is,
4420  * find_openarea AND find_break).
4421  *
4422  * You STOP if any of the newly adjacent squares do NOT seem to be
4423  * open and you are in an open area, and that side was previously
4424  * entirely open.
4425  *
4426  * Corners: If you are not in the open (i.e. you are in a corridor)
4427  * and there is only one way to go in the new squares, then turn in
4428  * that direction. If there are more than two new ways to go, STOP.
4429  * If there are two ways to go, and those ways are separated by a
4430  * square which does not seem to be open, then STOP.
4431  *
4432  * Otherwise, we have a potential corner. There are two new open
4433  * squares, which are also adjacent. One of the new squares is
4434  * diagonally located, the other is straight on (as in the diagram).
4435  * We consider two more squares further out (marked below as ?).
4436  *
4437  * We assign "option" to the straight-on grid, and "option2" to the
4438  * diagonal grid, and "check_dir" to the grid marked 's'.
4439  *
4440  * ##s
4441  * @x?
4442  * #.?
4443  *
4444  * If they are both seen to be closed, then it is seen that no benefit
4445  * is gained from moving straight. It is a known corner.  To cut the
4446  * corner, go diagonally, otherwise go straight, but pretend you
4447  * stepped diagonally into that next location for a full view next
4448  * time. Conversely, if one of the ? squares is not seen to be closed,
4449  * then there is a potential choice. We check to see whether it is a
4450  * potential corner or an intersection/room entrance.  If the square
4451  * two spaces straight ahead, and the space marked with 's' are both
4452  * unknown space, then it is a potential corner and enter if
4453  * find_examine is set, otherwise must stop because it is not a
4454  * corner. (find_examine option is removed and always is TRUE.)
4455  */
4456
4457
4458
4459
4460 /*
4461  * Hack -- allow quick "cycling" through the legal directions
4462  */
4463 static byte cycle[] =
4464 { 1, 2, 3, 6, 9, 8, 7, 4, 1, 2, 3, 6, 9, 8, 7, 4, 1 };
4465
4466 /*
4467  * Hack -- map each direction into the "middle" of the "cycle[]" array
4468  */
4469 static byte chome[] =
4470 { 0, 8, 9, 10, 7, 0, 11, 6, 5, 4 };
4471
4472 /*
4473  * The direction we are running
4474  */
4475 static byte find_current;
4476
4477 /*
4478  * The direction we came from
4479  */
4480 static byte find_prevdir;
4481
4482 /*
4483  * We are looking for open area
4484  */
4485 static bool find_openarea;
4486
4487 /*
4488  * We are looking for a break
4489  */
4490 static bool find_breakright;
4491 static bool find_breakleft;
4492
4493
4494
4495 /*
4496  * Initialize the running algorithm for a new direction.
4497  *
4498  * Diagonal Corridor -- allow diaginal entry into corridors.
4499  *
4500  * Blunt Corridor -- If there is a wall two spaces ahead and
4501  * we seem to be in a corridor, then force a turn into the side
4502  * corridor, must be moving straight into a corridor here. ???
4503  *
4504  * Diagonal Corridor    Blunt Corridor (?)
4505  *       # #                  #
4506  *       #x#                 @x#
4507  *       @p.                  p
4508  */
4509 static void run_init(int dir)
4510 {
4511         int             row, col, deepleft, deepright;
4512         int             i, shortleft, shortright;
4513
4514
4515         /* Save the direction */
4516         find_current = dir;
4517
4518         /* Assume running straight */
4519         find_prevdir = dir;
4520
4521         /* Assume looking for open area */
4522         find_openarea = TRUE;
4523
4524         /* Assume not looking for breaks */
4525         find_breakright = find_breakleft = FALSE;
4526
4527         /* Assume no nearby walls */
4528         deepleft = deepright = FALSE;
4529         shortright = shortleft = FALSE;
4530
4531         p_ptr->run_py = py;
4532         p_ptr->run_px = px;
4533
4534         /* Find the destination grid */
4535         row = py + ddy[dir];
4536         col = px + ddx[dir];
4537
4538         ignore_avoid_run = cave_have_flag_bold(row, col, FF_AVOID_RUN);
4539
4540         /* Extract cycle index */
4541         i = chome[dir];
4542
4543         /* Check for walls */
4544         if (see_wall(cycle[i+1], py, px))
4545         {
4546                 find_breakleft = TRUE;
4547                 shortleft = TRUE;
4548         }
4549         else if (see_wall(cycle[i+1], row, col))
4550         {
4551                 find_breakleft = TRUE;
4552                 deepleft = TRUE;
4553         }
4554
4555         /* Check for walls */
4556         if (see_wall(cycle[i-1], py, px))
4557         {
4558                 find_breakright = TRUE;
4559                 shortright = TRUE;
4560         }
4561         else if (see_wall(cycle[i-1], row, col))
4562         {
4563                 find_breakright = TRUE;
4564                 deepright = TRUE;
4565         }
4566
4567         /* Looking for a break */
4568         if (find_breakleft && find_breakright)
4569         {
4570                 /* Not looking for open area */
4571                 find_openarea = FALSE;
4572
4573                 /* Hack -- allow angled corridor entry */
4574                 if (dir & 0x01)
4575                 {
4576                         if (deepleft && !deepright)
4577                         {
4578                                 find_prevdir = cycle[i - 1];
4579                         }
4580                         else if (deepright && !deepleft)
4581                         {
4582                                 find_prevdir = cycle[i + 1];
4583                         }
4584                 }
4585
4586                 /* Hack -- allow blunt corridor entry */
4587                 else if (see_wall(cycle[i], row, col))
4588                 {
4589                         if (shortleft && !shortright)
4590                         {
4591                                 find_prevdir = cycle[i - 2];
4592                         }
4593                         else if (shortright && !shortleft)
4594                         {
4595                                 find_prevdir = cycle[i + 2];
4596                         }
4597                 }
4598         }
4599 }
4600
4601
4602 /*
4603  * Update the current "run" path
4604  *
4605  * Return TRUE if the running should be stopped
4606  */
4607 static bool run_test(void)
4608 {
4609         int         prev_dir, new_dir, check_dir = 0;
4610         int         row, col;
4611         int         i, max, inv;
4612         int         option = 0, option2 = 0;
4613         cave_type   *c_ptr;
4614         s16b        feat;
4615         feature_type *f_ptr;
4616
4617         /* Where we came from */
4618         prev_dir = find_prevdir;
4619
4620
4621         /* Range of newly adjacent grids */
4622         max = (prev_dir & 0x01) + 1;
4623
4624         /* break run when leaving trap detected region */
4625         if ((disturb_trap_detect || alert_trap_detect)
4626             && p_ptr->dtrap && !(cave[py][px].info & CAVE_IN_DETECT))
4627         {
4628                 /* No duplicate warning */
4629                 p_ptr->dtrap = FALSE;
4630
4631                 /* You are just on the edge */
4632                 if (!(cave[py][px].info & CAVE_UNSAFE))
4633                 {
4634                         if (alert_trap_detect)
4635                         {
4636 #ifdef JP
4637                                 msg_print("* Ãí°Õ:¤³¤ÎÀè¤Ï¥È¥é¥Ã¥×¤Î´¶ÃÎÈϰϳ°¤Ç¤¹¡ª *");
4638 #else
4639                                 msg_print("*Leaving trap detect region!*");
4640 #endif
4641                         }
4642
4643                         if (disturb_trap_detect)
4644                         {
4645                                 /* Break Run */
4646                                 return(TRUE);
4647                         }
4648                 }
4649         }
4650
4651         /* Look at every newly adjacent square. */
4652         for (i = -max; i <= max; i++)
4653         {
4654                 s16b this_o_idx, next_o_idx = 0;
4655
4656                 /* New direction */
4657                 new_dir = cycle[chome[prev_dir] + i];
4658
4659                 /* New location */
4660                 row = py + ddy[new_dir];
4661                 col = px + ddx[new_dir];
4662
4663                 /* Access grid */
4664                 c_ptr = &cave[row][col];
4665
4666                 /* Feature code (applying "mimic" field) */
4667                 feat = get_feat_mimic(c_ptr);
4668                 f_ptr = &f_info[feat];
4669
4670                 /* Visible monsters abort running */
4671                 if (c_ptr->m_idx)
4672                 {
4673                         monster_type *m_ptr = &m_list[c_ptr->m_idx];
4674
4675                         /* Visible monster */
4676                         if (m_ptr->ml) return (TRUE);
4677                 }
4678
4679                 /* Visible objects abort running */
4680                 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
4681                 {
4682                         object_type *o_ptr;
4683
4684                         /* Acquire object */
4685                         o_ptr = &o_list[this_o_idx];
4686
4687                         /* Acquire next object */
4688                         next_o_idx = o_ptr->next_o_idx;
4689
4690                         /* Visible object */
4691                         if (o_ptr->marked & OM_FOUND) return (TRUE);
4692                 }
4693
4694                 /* Assume unknown */
4695                 inv = TRUE;
4696
4697                 /* Check memorized grids */
4698                 if (c_ptr->info & (CAVE_MARK))
4699                 {
4700                         bool notice = have_flag(f_ptr->flags, FF_NOTICE);
4701
4702                         if (notice && have_flag(f_ptr->flags, FF_MOVE))
4703                         {
4704                                 /* Open doors */
4705                                 if (find_ignore_doors && have_flag(f_ptr->flags, FF_DOOR) && have_flag(f_ptr->flags, FF_CLOSE))
4706                                 {
4707                                         /* Option -- ignore */
4708                                         notice = FALSE;
4709                                 }
4710
4711                                 /* Stairs */
4712                                 else if (find_ignore_stairs && have_flag(f_ptr->flags, FF_STAIRS))
4713                                 {
4714                                         /* Option -- ignore */
4715                                         notice = FALSE;
4716                                 }
4717
4718                                 /* Lava */
4719                                 else if (have_flag(f_ptr->flags, FF_LAVA) && (p_ptr->immune_fire || IS_INVULN()))
4720                                 {
4721                                         /* Ignore */
4722                                         notice = FALSE;
4723                                 }
4724
4725                                 /* Deep water */
4726                                 else if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
4727                                          (p_ptr->levitation || p_ptr->can_swim || (p_ptr->total_weight <= weight_limit())))
4728                                 {
4729                                         /* Ignore */
4730                                         notice = FALSE;
4731                                 }
4732                         }
4733
4734                         /* Interesting feature */
4735                         if (notice) return (TRUE);
4736
4737                         /* The grid is "visible" */
4738                         inv = FALSE;
4739                 }
4740
4741                 /* Analyze unknown grids and floors considering mimic */
4742                 if (inv || !see_wall(0, row, col))
4743                 {
4744                         /* Looking for open area */
4745                         if (find_openarea)
4746                         {
4747                                 /* Nothing */
4748                         }
4749
4750                         /* The first new direction. */
4751                         else if (!option)
4752                         {
4753                                 option = new_dir;
4754                         }
4755
4756                         /* Three new directions. Stop running. */
4757                         else if (option2)
4758                         {
4759                                 return (TRUE);
4760                         }
4761
4762                         /* Two non-adjacent new directions.  Stop running. */
4763                         else if (option != cycle[chome[prev_dir] + i - 1])
4764                         {
4765                                 return (TRUE);
4766                         }
4767
4768                         /* Two new (adjacent) directions (case 1) */
4769                         else if (new_dir & 0x01)
4770                         {
4771                                 check_dir = cycle[chome[prev_dir] + i - 2];
4772                                 option2 = new_dir;
4773                         }
4774
4775                         /* Two new (adjacent) directions (case 2) */
4776                         else
4777                         {
4778                                 check_dir = cycle[chome[prev_dir] + i + 1];
4779                                 option2 = option;
4780                                 option = new_dir;
4781                         }
4782                 }
4783
4784                 /* Obstacle, while looking for open area */
4785                 else
4786                 {
4787                         if (find_openarea)
4788                         {
4789                                 if (i < 0)
4790                                 {
4791                                         /* Break to the right */
4792                                         find_breakright = TRUE;
4793                                 }
4794
4795                                 else if (i > 0)
4796                                 {
4797                                         /* Break to the left */
4798                                         find_breakleft = TRUE;
4799                                 }
4800                         }
4801                 }
4802         }
4803
4804         /* Looking for open area */
4805         if (find_openarea)
4806         {
4807                 /* Hack -- look again */
4808                 for (i = -max; i < 0; i++)
4809                 {
4810                         /* Unknown grid or non-wall */
4811                         if (!see_wall(cycle[chome[prev_dir] + i], py, px))
4812                         {
4813                                 /* Looking to break right */
4814                                 if (find_breakright)
4815                                 {
4816                                         return (TRUE);
4817                                 }
4818                         }
4819
4820                         /* Obstacle */
4821                         else
4822                         {
4823                                 /* Looking to break left */
4824                                 if (find_breakleft)
4825                                 {
4826                                         return (TRUE);
4827                                 }
4828                         }
4829                 }
4830
4831                 /* Hack -- look again */
4832                 for (i = max; i > 0; i--)
4833                 {
4834                         /* Unknown grid or non-wall */
4835                         if (!see_wall(cycle[chome[prev_dir] + i], py, px))
4836                         {
4837                                 /* Looking to break left */
4838                                 if (find_breakleft)
4839                                 {
4840                                         return (TRUE);
4841                                 }
4842                         }
4843
4844                         /* Obstacle */
4845                         else
4846                         {
4847                                 /* Looking to break right */
4848                                 if (find_breakright)
4849                                 {
4850                                         return (TRUE);
4851                                 }
4852                         }
4853                 }
4854         }
4855
4856         /* Not looking for open area */
4857         else
4858         {
4859                 /* No options */
4860                 if (!option)
4861                 {
4862                         return (TRUE);
4863                 }
4864
4865                 /* One option */
4866                 else if (!option2)
4867                 {
4868                         /* Primary option */
4869                         find_current = option;
4870
4871                         /* No other options */
4872                         find_prevdir = option;
4873                 }
4874
4875                 /* Two options, examining corners */
4876                 else if (!find_cut)
4877                 {
4878                         /* Primary option */
4879                         find_current = option;
4880
4881                         /* Hack -- allow curving */
4882                         find_prevdir = option2;
4883                 }
4884
4885                 /* Two options, pick one */
4886                 else
4887                 {
4888                         /* Get next location */
4889                         row = py + ddy[option];
4890                         col = px + ddx[option];
4891
4892                         /* Don't see that it is closed off. */
4893                         /* This could be a potential corner or an intersection. */
4894                         if (!see_wall(option, row, col) ||
4895                             !see_wall(check_dir, row, col))
4896                         {
4897                                 /* Can not see anything ahead and in the direction we */
4898                                 /* are turning, assume that it is a potential corner. */
4899                                 if (see_nothing(option, row, col) &&
4900                                     see_nothing(option2, row, col))
4901                                 {
4902                                         find_current = option;
4903                                         find_prevdir = option2;
4904                                 }
4905
4906                                 /* STOP: we are next to an intersection or a room */
4907                                 else
4908                                 {
4909                                         return (TRUE);
4910                                 }
4911                         }
4912
4913                         /* This corner is seen to be enclosed; we cut the corner. */
4914                         else if (find_cut)
4915                         {
4916                                 find_current = option2;
4917                                 find_prevdir = option2;
4918                         }
4919
4920                         /* This corner is seen to be enclosed, and we */
4921                         /* deliberately go the long way. */
4922                         else
4923                         {
4924                                 find_current = option;
4925                                 find_prevdir = option2;
4926                         }
4927                 }
4928         }
4929
4930         /* About to hit a known wall, stop */
4931         if (see_wall(find_current, py, px))
4932         {
4933                 return (TRUE);
4934         }
4935
4936         /* Failure */
4937         return (FALSE);
4938 }
4939
4940
4941
4942 /*
4943  * Take one step along the current "run" path
4944  */
4945 void run_step(int dir)
4946 {
4947         /* Start running */
4948         if (dir)
4949         {
4950                 /* Ignore AVOID_RUN on a first step */
4951                 ignore_avoid_run = TRUE;
4952
4953                 /* Hack -- do not start silly run */
4954                 if (see_wall(dir, py, px))
4955                 {
4956                         /* Message */
4957 #ifdef JP
4958                         msg_print("¤½¤ÎÊý¸þ¤Ë¤ÏÁö¤ì¤Þ¤»¤ó¡£");
4959 #else
4960                         msg_print("You cannot run in that direction.");
4961 #endif
4962
4963                         /* Disturb */
4964                         disturb(0, 0);
4965
4966                         /* Done */
4967                         return;
4968                 }
4969
4970                 /* Initialize */
4971                 run_init(dir);
4972         }
4973
4974         /* Keep running */
4975         else
4976         {
4977                 /* Update run */
4978                 if (run_test())
4979                 {
4980                         /* Disturb */
4981                         disturb(0, 0);
4982
4983                         /* Done */
4984                         return;
4985                 }
4986         }
4987
4988         /* Decrease the run counter */
4989         if (--running <= 0) return;
4990
4991         /* Take time */
4992         energy_use = 100;
4993
4994         /* Move the player, using the "pickup" flag */
4995 #ifdef ALLOW_EASY_DISARM /* TNB */
4996
4997         move_player(find_current, FALSE, FALSE);
4998
4999 #else /* ALLOW_EASY_DISARM -- TNB */
5000
5001         move_player(find_current, always_pickup, FALSE);
5002
5003 #endif /* ALLOW_EASY_DISARM -- TNB */
5004
5005         if (player_bold(p_ptr->run_py, p_ptr->run_px))
5006         {
5007                 p_ptr->run_py = 0;
5008                 p_ptr->run_px = 0;
5009                 disturb(0, 0);
5010         }
5011 }
5012
5013
5014 #ifdef TRAVEL
5015 /*
5016  * Test for traveling
5017  */
5018 static bool travel_test(void)
5019 {
5020         int prev_dir, new_dir, check_dir = 0;
5021         int row, col;
5022         int i, max;
5023         bool stop = TRUE;
5024         cave_type *c_ptr;
5025
5026         /* Where we came from */
5027         prev_dir = find_prevdir;
5028
5029         /* Range of newly adjacent grids */
5030         max = (prev_dir & 0x01) + 1;
5031
5032         for (i = 0; i < 8; i++)
5033         {
5034                 if (travel.cost[py+ddy_ddd[i]][px+ddx_ddd[i]] < travel.cost[py][px]) stop = FALSE;
5035         }
5036
5037         if (stop) return (TRUE);
5038
5039         /* break run when leaving trap detected region */
5040         if ((disturb_trap_detect || alert_trap_detect)
5041             && p_ptr->dtrap && !(cave[py][px].info & CAVE_IN_DETECT))
5042         {
5043                 /* No duplicate warning */
5044                 p_ptr->dtrap = FALSE;
5045
5046                 /* You are just on the edge */
5047                 if (!(cave[py][px].info & CAVE_UNSAFE))
5048                 {
5049                         if (alert_trap_detect)
5050                         {
5051 #ifdef JP
5052                                 msg_print("* Ãí°Õ:¤³¤ÎÀè¤Ï¥È¥é¥Ã¥×¤Î´¶ÃÎÈϰϳ°¤Ç¤¹¡ª *");
5053 #else
5054                                 msg_print("*Leaving trap detect region!*");
5055 #endif
5056                         }
5057
5058                         if (disturb_trap_detect)
5059                         {
5060                                 /* Break Run */
5061                                 return(TRUE);
5062                         }
5063                 }
5064         }
5065
5066         /* Cannot travel when blind */
5067         if (p_ptr->blind || no_lite())
5068         {
5069 #ifdef JP
5070                 msg_print("Ìܤ¬¸«¤¨¤Ê¤¤¡ª");
5071 #else
5072                 msg_print("You cannot see!");
5073 #endif
5074                 return (TRUE);
5075         }
5076
5077         /* Look at every newly adjacent square. */
5078         for (i = -max; i <= max; i++)
5079         {
5080                 /* New direction */
5081                 new_dir = cycle[chome[prev_dir] + i];
5082
5083                 /* New location */
5084                 row = py + ddy[new_dir];
5085                 col = px + ddx[new_dir];
5086
5087                 /* Access grid */
5088                 c_ptr = &cave[row][col];
5089
5090
5091                 /* Visible monsters abort running */
5092                 if (c_ptr->m_idx)
5093                 {
5094                         monster_type *m_ptr = &m_list[c_ptr->m_idx];
5095
5096                         /* Visible monster */
5097                         if (m_ptr->ml) return (TRUE);
5098                 }
5099         }
5100
5101         /* Failure */
5102         return (FALSE);
5103 }
5104
5105
5106 /*
5107  * Travel command
5108  */
5109 void travel_step(void)
5110 {
5111         int i;
5112         int dir = travel.dir;
5113         int old_run = travel.run;
5114
5115         find_prevdir = dir;
5116
5117         /* disturb */
5118         if (travel_test())
5119         {
5120                 if (travel.run == 255)
5121                 {
5122 #ifdef JP
5123                         msg_print("Æ»¶Ú¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡ª");
5124 #else
5125                         msg_print("No route is found!");
5126 #endif
5127                 }
5128                 disturb(0, 0);
5129                 return;
5130         }
5131
5132         energy_use = 100;
5133
5134         for (i = 1; i <= 9; i++)
5135         {
5136                 if (i == 5) continue;
5137
5138                 if (travel.cost[py+ddy[i]][px+ddx[i]] < travel.cost[py+ddy[dir]][px+ddx[dir]])
5139                 {
5140                         dir = i;
5141                 }
5142         }
5143
5144         /* Close door */
5145         if (!easy_open && is_closed_door(cave[py+ddy[dir]][px+ddx[dir]].feat))
5146         {
5147                 disturb(0, 0);
5148                 return;
5149         }
5150
5151         travel.dir = dir;
5152         move_player(dir, always_pickup, easy_disarm);
5153         /* travel.run = old_run; */
5154
5155         if ((py == travel.y) && (px == travel.x))
5156                 travel.run = 0;
5157         else if (travel.run > 0)
5158                 travel.run--;
5159 }
5160 #endif