OSDN Git Service

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