OSDN Git Service

f420d210a4dce459942b08c0b84b8e9f2777b2c0
[hengband/hengband.git] / src / cmd1.c
1 /*!
2  *  @file cmd1.c
3  *  @brief プレイヤーのコマンド処理1 / Movement commands (part 1)
4  *  @date 2014/01/02
5  *  @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research,
9  * and not for profit purposes provided that this copyright and statement
10  * are included in all such copies.  Other copyrights may also apply.
11  * @note
12  * <pre>
13  * The running algorithm:                       -CJS-
14  *
15  * In the diagrams below, the player has just arrived in the
16  * grid marked as '@', and he has just come from a grid marked
17  * as 'o', and he is about to enter the grid marked as 'x'.
18  *
19  * Of course, if the "requested" move was impossible, then you
20  * will of course be blocked, and will stop.
21  *
22  * Overview: You keep moving until something interesting happens.
23  * If you are in an enclosed space, you follow corners. This is
24  * the usual corridor scheme. If you are in an open space, you go
25  * straight, but stop before entering enclosed space. This is
26  * analogous to reaching doorways. If you have enclosed space on
27  * one side only (that is, running along side a wall) stop if
28  * your wall opens out, or your open space closes in. Either case
29  * corresponds to a doorway.
30  *
31  * What happens depends on what you can really SEE. (i.e. if you
32  * have no light, then running along a dark corridor is JUST like
33  * running in a dark room.) The algorithm works equally well in
34  * corridors, rooms, mine tailings, earthquake rubble, etc, etc.
35  *
36  * These conditions are kept in static memory:
37  * find_openarea         You are in the open on at least one
38  * side.
39  * find_breakleft        You have a wall on the left, and will
40  * stop if it opens
41  * find_breakright       You have a wall on the right, and will
42  * stop if it opens
43  *
44  * To initialize these conditions, we examine the grids adjacent
45  * to the grid marked 'x', two on each side (marked 'L' and 'R').
46  * If either one of the two grids on a given side is seen to be
47  * closed, then that side is considered to be closed. If both
48  * sides are closed, then it is an enclosed (corridor) run.
49  *
50  * LL           L
51  * @@x          LxR
52  * RR          @@R
53  *
54  * Looking at more than just the immediate squares is
55  * significant. Consider the following case. A run along the
56  * corridor will stop just before entering the center point,
57  * because a choice is clearly established. Running in any of
58  * three available directions will be defined as a corridor run.
59  * Note that a minor hack is inserted to make the angled corridor
60  * entry (with one side blocked near and the other side blocked
61  * further away from the runner) work correctly. The runner moves
62  * diagonally, but then saves the previous direction as being
63  * straight into the gap. Otherwise, the tail end of the other
64  * entry would be perceived as an alternative on the next move.
65  *
66  * \#.\#
67  * \#\#.\#\#
68  * \.\@x..
69  * \#\#.\#\#
70  * \#.\#
71  *
72  * Likewise, a run along a wall, and then into a doorway (two
73  * runs) will work correctly. A single run rightwards from \@ will
74  * stop at 1. Another run right and down will enter the corridor
75  * and make the corner, stopping at the 2.
76  *
77  * \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
78  * o@@x       1
79  * \#\#\#\#\#\#\#\#\#\#\# \#\#\#\#\#\#
80  * \#2          \#
81  * \#\#\#\#\#\#\#\#\#\#\#\#\#
82  *
83  * After any move, the function area_affect is called to
84  * determine the new surroundings, and the direction of
85  * subsequent moves. It examines the current player location
86  * (at which the runner has just arrived) and the previous
87  * direction (from which the runner is considered to have come).
88  *
89  * Moving one square in some direction places you adjacent to
90  * three or five new squares (for straight and diagonal moves
91  * respectively) to which you were not previously adjacent,
92  * marked as '!' in the diagrams below.
93  *
94  *   ...!              ...
95  *   .o@@!  (normal)    .o.!  (diagonal)
96  *   ...!  (east)      ..@@!  (south east)
97  *                      !!!
98  *
99  * You STOP if any of the new squares are interesting in any way:
100  * for example, if they contain visible monsters or treasure.
101  *
102  * You STOP if any of the newly adjacent squares seem to be open,
103  * and you are also looking for a break on that side. (that is,
104  * find_openarea AND find_break).
105  *
106  * You STOP if any of the newly adjacent squares do NOT seem to be
107  * open and you are in an open area, and that side was previously
108  * entirely open.
109  *
110  * Corners: If you are not in the open (i.e. you are in a corridor)
111  * and there is only one way to go in the new squares, then turn in
112  * that direction. If there are more than two new ways to go, STOP.
113  * If there are two ways to go, and those ways are separated by a
114  * square which does not seem to be open, then STOP.
115  *
116  * Otherwise, we have a potential corner. There are two new open
117  * squares, which are also adjacent. One of the new squares is
118  * diagonally located, the other is straight on (as in the diagram).
119  * We consider two more squares further out (marked below as ?).
120  *
121  * We assign "option" to the straight-on grid, and "option2" to the
122  * diagonal grid, and "check_dir" to the grid marked 's'.
123  *
124  * \#\#s
125  * @@x?
126  * \#.?
127  *
128  * If they are both seen to be closed, then it is seen that no benefit
129  * is gained from moving straight. It is a known corner.  To cut the
130  * corner, go diagonally, otherwise go straight, but pretend you
131  * stepped diagonally into that next location for a full view next
132  * time. Conversely, if one of the ? squares is not seen to be closed,
133  * then there is a potential choice. We check to see whether it is a
134  * potential corner or an intersection/room entrance.  If the square
135  * two spaces straight ahead, and the space marked with 's' are both
136  * unknown space, then it is a potential corner and enter if
137  * find_examine is set, otherwise must stop because it is not a
138  * corner. (find_examine option is removed and always is TRUE.)
139  * </pre>
140  */
141
142 #include "angband.h"
143 #include "trap.h"
144
145
146
147 /*!
148  * @brief プレイヤー攻撃の種族スレイング倍率計算
149  * @param mult 算出前の基本倍率(/10倍)
150  * @param flgs スレイフラグ配列
151  * @param m_ptr 目標モンスターの構造体参照ポインタ
152  * @return スレイング加味後の倍率(/10倍)
153  */
154 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
155 {
156         static const struct slay_table_t {
157                 int slay_flag;
158                 BIT_FLAGS affect_race_flag;
159                 MULTIPLY slay_mult;
160                 size_t flag_offset;
161                 size_t r_flag_offset;
162         } slay_table[] = {
163 #define OFFSET(X) offsetof(monster_race, X)
164                 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
165                 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
166                 {TR_SLAY_EVIL,   RF3_EVIL,   20, OFFSET(flags3), OFFSET(r_flags3)},
167                 {TR_KILL_EVIL,   RF3_EVIL,   35, OFFSET(flags3), OFFSET(r_flags3)},
168                 {TR_SLAY_GOOD,   RF3_GOOD,   20, OFFSET(flags3), OFFSET(r_flags3)},
169                 {TR_KILL_GOOD,   RF3_GOOD,   35, OFFSET(flags3), OFFSET(r_flags3)},
170                 {TR_SLAY_HUMAN,  RF2_HUMAN,  25, OFFSET(flags2), OFFSET(r_flags2)},
171                 {TR_KILL_HUMAN,  RF2_HUMAN,  40, OFFSET(flags2), OFFSET(r_flags2)},
172                 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
173                 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
174                 {TR_SLAY_DEMON,  RF3_DEMON,  30, OFFSET(flags3), OFFSET(r_flags3)},
175                 {TR_KILL_DEMON,  RF3_DEMON,  50, OFFSET(flags3), OFFSET(r_flags3)},
176                 {TR_SLAY_ORC,    RF3_ORC,    30, OFFSET(flags3), OFFSET(r_flags3)},
177                 {TR_KILL_ORC,    RF3_ORC,    50, OFFSET(flags3), OFFSET(r_flags3)},
178                 {TR_SLAY_TROLL,  RF3_TROLL,  30, OFFSET(flags3), OFFSET(r_flags3)},
179                 {TR_KILL_TROLL,  RF3_TROLL,  50, OFFSET(flags3), OFFSET(r_flags3)},
180                 {TR_SLAY_GIANT,  RF3_GIANT,  30, OFFSET(flags3), OFFSET(r_flags3)},
181                 {TR_KILL_GIANT,  RF3_GIANT,  50, OFFSET(flags3), OFFSET(r_flags3)},
182                 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
183                 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
184 #undef OFFSET
185         };
186         int i;
187         monster_race* r_ptr = &r_info[m_ptr->r_idx];
188
189         for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++ i)
190         {
191                 const struct slay_table_t* p = &slay_table[i];
192
193                 if ((have_flag(flgs, p->slay_flag)) &&
194                     (atoffset(u32b, r_ptr, p->flag_offset) & p->affect_race_flag))
195                 {
196                         if (is_original_ap_and_seen(m_ptr))
197                         {
198                                 atoffset(u32b, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
199                         }
200
201                         mult = MAX(mult, p->slay_mult);
202                 }
203         }
204
205         return mult;
206 }
207
208 /*!
209  * @brief プレイヤー攻撃の属性スレイング倍率計算
210  * @param mult 算出前の基本倍率(/10倍)
211  * @param flgs スレイフラグ配列
212  * @param m_ptr 目標モンスターの構造体参照ポインタ
213  * @return スレイング加味後の倍率(/10倍)
214  */
215 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
216 {
217         static const struct brand_table_t {
218                 int brand_flag;
219                 BIT_FLAGS resist_mask;
220                 BIT_FLAGS hurt_flag;
221         } brand_table[] = {
222                 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U           },
223                 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U           },
224                 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
225                 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
226                 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U           },
227         };
228         int i;
229         monster_race* r_ptr = &r_info[m_ptr->r_idx];
230
231         for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++ i)
232         {
233                 const struct brand_table_t* p = &brand_table[i];
234
235                 if (have_flag(flgs, p->brand_flag))
236                 {
237                         /* Notice immunity */
238                         if (r_ptr->flagsr & p->resist_mask)
239                         {
240                                 if (is_original_ap_and_seen(m_ptr))
241                                 {
242                                         r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
243                                 }
244                         }
245
246                         /* Otherwise, take the damage */
247                         else if (r_ptr->flags3 & p->hurt_flag)
248                         {
249                                 if (is_original_ap_and_seen(m_ptr))
250                                 {
251                                         r_ptr->r_flags3 |= p->hurt_flag;
252                                 }
253
254                                 mult = MAX(mult, 50);
255                         }
256                         else
257                         {
258                                 mult = MAX(mult, 25);
259                         }
260                 }
261         }
262
263         return mult;
264 }
265
266 /*!
267  * @brief ダメージにスレイ要素を加える総合処理ルーチン /
268  * Extract the "total damage" from a given object hitting a given monster.
269  * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
270  * @param tdam 現在算出途中のダメージ値
271  * @param m_ptr 目標モンスターの構造体参照ポインタ
272  * @param mode 剣術のID
273  * @param thrown 射撃処理ならばTRUEを指定する
274  * @return 総合的なスレイを加味したダメージ値
275  * @note
276  * Note that "flasks of oil" do NOT do fire damage, although they\n
277  * certainly could be made to do so.  XXX XXX\n
278  *\n
279  * Note that most brands and slays are x3, except Slay Animal (x2),\n
280  * Slay Evil (x2), and Kill dragon (x5).\n
281  */
282 HIT_POINT tot_dam_aux(object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
283 {
284         MULTIPLY mult = 10;
285
286         BIT_FLAGS flgs[TR_FLAG_SIZE];
287
288         /* Extract the flags */
289         object_flags(o_ptr, flgs);
290         torch_flags(o_ptr, flgs); /* torches has secret flags */
291
292         if (!thrown)
293         {
294                 /* Magical Swords */
295                 if (p_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
296                 if (p_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
297                 if (p_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
298                 if (p_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
299                 if (p_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
300         }
301
302         /* Hex - Slay Good (Runesword) */
303         if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
304
305         /* Some "weapons" and "ammo" do extra damage */
306         switch (o_ptr->tval)
307         {
308                 case TV_SHOT:
309                 case TV_ARROW:
310                 case TV_BOLT:
311                 case TV_HAFTED:
312                 case TV_POLEARM:
313                 case TV_SWORD:
314                 case TV_DIGGING:
315                 case TV_LITE:
316                 {
317                         /* Slaying */
318                         mult = mult_slaying(mult, flgs, m_ptr);
319
320                         /* Elemental Brand */
321                         mult = mult_brand(mult, flgs, m_ptr);
322
323                         /* Hissatsu */
324                         if (p_ptr->pclass == CLASS_SAMURAI)
325                         {
326                                 mult = mult_hissatsu(mult, flgs, m_ptr, mode);
327                         }
328
329                         /* Force Weapon */
330                         if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
331                         {
332                                 p_ptr->csp -= (1+(o_ptr->dd * o_ptr->ds / 5));
333                                 p_ptr->redraw |= (PR_MANA);
334                                 mult = mult * 3 / 2 + 20;
335                         }
336
337                         /* Hack -- The Nothung cause special damage to Fafner */
338                         if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
339                                 mult = 150;
340                         break;
341                 }
342         }
343         if (mult > 150) mult = 150;
344
345         /* Return the total damage */
346         return (tdam * mult / 10);
347 }
348
349
350 /*!
351  * @brief 地形やその上のアイテムの隠された要素を明かす /
352  * Search for hidden things
353  * @param y 対象となるマスのY座標
354  * @param x 対象となるマスのX座標
355  * @return なし
356  */
357 static void discover_hidden_things(POSITION y, POSITION x)
358 {
359         OBJECT_IDX this_o_idx, next_o_idx = 0;
360         cave_type *c_ptr;
361
362         /* Access the grid */
363         c_ptr = &cave[y][x];
364
365         /* Invisible trap */
366         if (c_ptr->mimic && is_trap(c_ptr->feat))
367         {
368                 /* Pick a trap */
369                 disclose_grid(y, x);
370
371                 msg_print(_("トラップを発見した。", "You have found a trap."));
372
373                 disturb(FALSE, TRUE);
374         }
375
376         /* Secret door */
377         if (is_hidden_door(c_ptr))
378         {
379                 msg_print(_("隠しドアを発見した。", "You have found a secret door."));
380
381                 /* Disclose */
382                 disclose_grid(y, x);
383
384                 disturb(FALSE, FALSE);
385         }
386
387         /* Scan all objects in the grid */
388         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
389         {
390                 object_type *o_ptr;
391
392                 /* Acquire object */
393                 o_ptr = &o_list[this_o_idx];
394
395                 /* Acquire next object */
396                 next_o_idx = o_ptr->next_o_idx;
397
398                 /* Skip non-chests */
399                 if (o_ptr->tval != TV_CHEST) continue;
400
401                 /* Skip non-trapped chests */
402                 if (!chest_traps[o_ptr->pval]) continue;
403
404                 /* Identify once */
405                 if (!object_is_known(o_ptr))
406                 {
407                         msg_print(_("箱に仕掛けられたトラップを発見した!", "You have discovered a trap on the chest!"));
408
409                         /* Know the trap */
410                         object_known(o_ptr);
411
412                         /* Notice it */
413                         disturb(FALSE, FALSE);
414                 }
415         }
416 }
417
418 /*!
419  * @brief プレイヤーの探索処理判定
420  * @return なし
421  */
422 void search(void)
423 {
424         DIRECTION i;
425         PERCENTAGE chance;
426
427         /* Start with base search ability */
428         chance = p_ptr->skill_srh;
429
430         /* Penalize various conditions */
431         if (p_ptr->blind || no_lite()) chance = chance / 10;
432         if (p_ptr->confused || p_ptr->image) chance = chance / 10;
433
434         /* Search the nearby grids, which are always in bounds */
435         for (i = 0; i < 9; ++ i)
436         {
437                 /* Sometimes, notice things */
438                 if (randint0(100) < chance)
439                 {
440                         discover_hidden_things(p_ptr->y + ddy_ddd[i], p_ptr->x + ddx_ddd[i]);
441                 }
442         }
443 }
444
445
446 /*!
447  * @brief プレイヤーがオブジェクトを拾った際のメッセージ表示処理 /
448  * Helper routine for py_pickup() and py_pickup_floor().
449  * @param o_idx 取得したオブジェクトの参照ID
450  * @return なし
451  * @details
452  * アイテムを拾った際に「2つのケーキを持っている」\n
453  * "You have two cakes." とアイテムを拾った後の合計のみの表示がオリジナル\n
454  * だが、違和感が\n
455  * あるという指摘をうけたので、「~を拾った、~を持っている」という表示\n
456  * にかえてある。そのための配列。\n
457  * Add the given dungeon object to the character's inventory.\n
458  * Delete the object afterwards.\n
459  */
460 void py_pickup_aux(OBJECT_IDX o_idx)
461 {
462         INVENTORY_IDX slot;
463
464 #ifdef JP
465         char o_name[MAX_NLEN];
466         char old_name[MAX_NLEN];
467         char kazu_str[80];
468         int hirottakazu;
469 #else
470         char o_name[MAX_NLEN];
471 #endif
472
473         object_type *o_ptr;
474
475         o_ptr = &o_list[o_idx];
476
477 #ifdef JP
478         object_desc(old_name, o_ptr, OD_NAME_ONLY);
479         object_desc_kosuu(kazu_str, o_ptr);
480         hirottakazu = o_ptr->number;
481 #endif
482         /* Carry the object */
483         slot = inven_carry(o_ptr);
484
485         /* Get the object again */
486         o_ptr = &inventory[slot];
487
488         delete_object_idx(o_idx);
489
490         if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
491         {
492                 bool old_known = identify_item(o_ptr);
493
494                 /* Auto-inscription/destroy */
495                 autopick_alter_item(slot, (bool)(destroy_identify && !old_known));
496
497                 /* If it is destroyed, don't pick it up */
498                 if (o_ptr->marked & OM_AUTODESTROY) return;
499         }
500
501         object_desc(o_name, o_ptr, 0);
502
503 #ifdef JP
504         if ((o_ptr->name1 == ART_CRIMSON) && (p_ptr->pseikaku == SEIKAKU_COMBAT))
505         {
506                 msg_format("こうして、%sは『クリムゾン』を手に入れた。", p_ptr->name);
507                 msg_print("しかし今、『混沌のサーペント』の放ったモンスターが、");
508                 msg_format("%sに襲いかかる...", p_ptr->name);
509         }
510         else
511         {
512                 if (plain_pickup)
513                 {
514                         msg_format("%s(%c)を持っている。",o_name, index_to_label(slot));
515                 }
516                 else
517                 {
518                         if (o_ptr->number > hirottakazu) {
519                             msg_format("%s拾って、%s(%c)を持っている。",
520                                kazu_str, o_name, index_to_label(slot));
521                         } else {
522                                 msg_format("%s(%c)を拾った。", o_name, index_to_label(slot));
523                         }
524                 }
525         }
526         strcpy(record_o_name, old_name);
527 #else
528         msg_format("You have %s (%c).", o_name, index_to_label(slot));
529         strcpy(record_o_name, o_name);
530 #endif
531         record_turn = turn;
532
533
534         check_find_art_quest_completion(o_ptr);
535 }
536
537
538 /*!
539  * @brief プレイヤーがオブジェクト上に乗った際の表示処理
540  * @param pickup 自動拾い処理を行うならばTRUEとする
541  * @return なし
542  * @details
543  * Player "wants" to pick up an object or gold.
544  * Note that we ONLY handle things that can be picked up.
545  * See "move_player()" for handling of other things.
546  */
547 void carry(bool pickup)
548 {
549         cave_type *c_ptr = &cave[p_ptr->y][p_ptr->x];
550
551         OBJECT_IDX this_o_idx, next_o_idx = 0;
552
553         char    o_name[MAX_NLEN];
554
555         /* Recenter the map around the player */
556         verify_panel();
557
558         p_ptr->update |= (PU_MONSTERS);
559
560         /* Redraw map */
561         p_ptr->redraw |= (PR_MAP);
562
563         p_ptr->window |= (PW_OVERHEAD);
564
565         /* Handle stuff */
566         handle_stuff();
567
568         /* Automatically pickup/destroy/inscribe items */
569         autopick_pickup_items(c_ptr);
570
571         if (easy_floor)
572         {
573                 py_pickup_floor(pickup);
574                 return;
575         }
576
577         /* Scan the pile of objects */
578         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
579         {
580                 object_type *o_ptr;
581
582                 /* Acquire object */
583                 o_ptr = &o_list[this_o_idx];
584
585 #ifdef ALLOW_EASY_SENSE /* TNB */
586
587                 /* Option: Make item sensing easy */
588                 if (easy_sense)
589                 {
590                         /* Sense the object */
591                         (void)sense_object(o_ptr);
592                 }
593
594 #endif /* ALLOW_EASY_SENSE -- TNB */
595
596                 object_desc(o_name, o_ptr, 0);
597
598                 /* Acquire next object */
599                 next_o_idx = o_ptr->next_o_idx;
600
601                 /* Hack -- disturb */
602                 disturb(FALSE, FALSE);
603
604                 /* Pick up gold */
605                 if (o_ptr->tval == TV_GOLD)
606                 {
607                         int value = (long)o_ptr->pval;
608
609                         /* Delete the gold */
610                         delete_object_idx(this_o_idx);
611
612                         msg_format(_(" $%ld の価値がある%sを見つけた。", "You collect %ld gold pieces worth of %s."),
613                            (long)value, o_name);
614
615                         sound(SOUND_SELL);
616
617                         /* Collect the gold */
618                         p_ptr->au += value;
619
620                         /* Redraw gold */
621                         p_ptr->redraw |= (PR_GOLD);
622
623                         p_ptr->window |= (PW_PLAYER);
624                 }
625
626                 /* Pick up objects */
627                 else
628                 {
629                         /* Hack - some objects were handled in autopick_pickup_items(). */
630                         if (o_ptr->marked & OM_NOMSG)
631                         {
632                                 /* Clear the flag. */
633                                 o_ptr->marked &= ~OM_NOMSG;
634                         }
635                         else if (!pickup)
636                         {
637                                 msg_format(_("%sがある。", "You see %s."), o_name);
638                         }
639
640                         /* Note that the pack is too full */
641                         else if (!inven_carry_okay(o_ptr))
642                         {
643                                 msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name);
644                         }
645
646                         /* Pick up the item (if requested and allowed) */
647                         else
648                         {
649                                 int okay = TRUE;
650
651                                 /* Hack -- query every item */
652                                 if (carry_query_flag)
653                                 {
654                                         char out_val[MAX_NLEN+20];
655                                         sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name);
656                                         okay = get_check(out_val);
657                                 }
658
659                                 /* Attempt to pick up an object. */
660                                 if (okay)
661                                 {
662                                         /* Pick up the object */
663                                         py_pickup_aux(this_o_idx);
664                                 }
665                         }
666                 }
667         }
668 }
669
670
671 /*!
672  * @brief パターンによる移動制限処理
673  * @param c_y プレイヤーの移動元Y座標
674  * @param c_x プレイヤーの移動元X座標
675  * @param n_y プレイヤーの移動先Y座標
676  * @param n_x プレイヤーの移動先X座標
677  * @return 移動処理が可能である場合(可能な場合に選択した場合)TRUEを返す。
678  */
679 bool pattern_seq(POSITION c_y, POSITION c_x, POSITION n_y, POSITION n_x)
680 {
681         feature_type *cur_f_ptr = &f_info[cave[c_y][c_x].feat];
682         feature_type *new_f_ptr = &f_info[cave[n_y][n_x].feat];
683         bool is_pattern_tile_cur = have_flag(cur_f_ptr->flags, FF_PATTERN);
684         bool is_pattern_tile_new = have_flag(new_f_ptr->flags, FF_PATTERN);
685         int pattern_type_cur, pattern_type_new;
686
687         if (!is_pattern_tile_cur && !is_pattern_tile_new) return TRUE;
688
689         pattern_type_cur = is_pattern_tile_cur ? cur_f_ptr->subtype : NOT_PATTERN_TILE;
690         pattern_type_new = is_pattern_tile_new ? new_f_ptr->subtype : NOT_PATTERN_TILE;
691
692         if (pattern_type_new == PATTERN_TILE_START)
693         {
694                 if (!is_pattern_tile_cur && !p_ptr->confused && !p_ptr->stun && !p_ptr->image)
695                 {
696                         if (get_check(_("パターンの上を歩き始めると、全てを歩かなければなりません。いいですか?", 
697                                                         "If you start walking the Pattern, you must walk the whole way. Ok? ")))
698                                 return TRUE;
699                         else
700                                 return FALSE;
701                 }
702                 else
703                         return TRUE;
704         }
705         else if ((pattern_type_new == PATTERN_TILE_OLD) ||
706                  (pattern_type_new == PATTERN_TILE_END) ||
707                  (pattern_type_new == PATTERN_TILE_WRECKED))
708         {
709                 if (is_pattern_tile_cur)
710                 {
711                         return TRUE;
712                 }
713                 else
714                 {
715                         msg_print(_("パターンの上を歩くにはスタート地点から歩き始めなくてはなりません。",
716                                                 "You must start walking the Pattern from the startpoint."));
717
718                         return FALSE;
719                 }
720         }
721         else if ((pattern_type_new == PATTERN_TILE_TELEPORT) ||
722                  (pattern_type_cur == PATTERN_TILE_TELEPORT))
723         {
724                 return TRUE;
725         }
726         else if (pattern_type_cur == PATTERN_TILE_START)
727         {
728                 if (is_pattern_tile_new)
729                         return TRUE;
730                 else
731                 {
732                         msg_print(_("パターンの上は正しい順序で歩かねばなりません。", "You must walk the Pattern in correct order."));
733                         return FALSE;
734                 }
735         }
736         else if ((pattern_type_cur == PATTERN_TILE_OLD) ||
737                  (pattern_type_cur == PATTERN_TILE_END) ||
738                  (pattern_type_cur == PATTERN_TILE_WRECKED))
739         {
740                 if (!is_pattern_tile_new)
741                 {
742                         msg_print(_("パターンを踏み外してはいけません。", "You may not step off from the Pattern."));
743                         return FALSE;
744                 }
745                 else
746                 {
747                         return TRUE;
748                 }
749         }
750         else
751         {
752                 if (!is_pattern_tile_cur)
753                 {
754                         msg_print(_("パターンの上を歩くにはスタート地点から歩き始めなくてはなりません。",
755                                                 "You must start walking the Pattern from the startpoint."));
756
757                         return FALSE;
758                 }
759                 else
760                 {
761                         byte ok_move = PATTERN_TILE_START;
762                         switch (pattern_type_cur)
763                         {
764                                 case PATTERN_TILE_1:
765                                         ok_move = PATTERN_TILE_2;
766                                         break;
767                                 case PATTERN_TILE_2:
768                                         ok_move = PATTERN_TILE_3;
769                                         break;
770                                 case PATTERN_TILE_3:
771                                         ok_move = PATTERN_TILE_4;
772                                         break;
773                                 case PATTERN_TILE_4:
774                                         ok_move = PATTERN_TILE_1;
775                                         break;
776                                 default:
777                                         if (p_ptr->wizard)
778                                                 msg_format(_("おかしなパターン歩行、%d。", "Funny Pattern walking, %d."), pattern_type_cur);
779
780                                         return TRUE; /* Goof-up */
781                         }
782
783                         if ((pattern_type_new == ok_move) ||
784                             (pattern_type_new == pattern_type_cur))
785                                 return TRUE;
786                         else
787                         {
788                                 if (!is_pattern_tile_new)
789                                         msg_print(_("パターンを踏み外してはいけません。", "You may not step off from the Pattern."));
790                                 else
791                                         msg_print(_("パターンの上は正しい順序で歩かねばなりません。", "You must walk the Pattern in correct order."));
792
793                                 return FALSE;
794                         }
795                 }
796         }
797 }
798
799
800 /*!
801  * @brief プレイヤーが地形踏破可能かを返す
802  * @param feature 判定したい地形ID
803  * @param mode 移動に関するオプションフラグ
804  * @return 移動可能ならばTRUEを返す
805  */
806 bool player_can_enter(s16b feature, u16b mode)
807 {
808         feature_type *f_ptr = &f_info[feature];
809
810         if (p_ptr->riding) return monster_can_cross_terrain(feature, &r_info[m_list[p_ptr->riding].r_idx], mode | CEM_RIDING);
811
812         /* Pattern */
813         if (have_flag(f_ptr->flags, FF_PATTERN))
814         {
815                 if (!(mode & CEM_P_CAN_ENTER_PATTERN)) return FALSE;
816         }
817
818         /* "CAN" flags */
819         if (have_flag(f_ptr->flags, FF_CAN_FLY) && p_ptr->levitation) return TRUE;
820         if (have_flag(f_ptr->flags, FF_CAN_SWIM) && p_ptr->can_swim) return TRUE;
821         if (have_flag(f_ptr->flags, FF_CAN_PASS) && p_ptr->pass_wall) return TRUE;
822
823         if (!have_flag(f_ptr->flags, FF_MOVE)) return FALSE;
824
825         return TRUE;
826 }
827
828
829 /*!
830  * @brief 移動に伴うプレイヤーのステータス変化処理
831  * @param ny 移動先Y座標
832  * @param nx 移動先X座標
833  * @param mpe_mode 移動オプションフラグ
834  * @return プレイヤーが死亡やフロア離脱を行わず、実際に移動が可能ならばTRUEを返す。
835  */
836 bool move_player_effect(POSITION ny, POSITION nx, BIT_FLAGS mpe_mode)
837 {
838         cave_type *c_ptr = &cave[ny][nx];
839         feature_type *f_ptr = &f_info[c_ptr->feat];
840
841         if (!(mpe_mode & MPE_STAYING))
842         {
843                 POSITION oy = p_ptr->y;
844                 POSITION ox = p_ptr->x;
845                 cave_type *oc_ptr = &cave[oy][ox];
846                 IDX om_idx = oc_ptr->m_idx;
847                 IDX nm_idx = c_ptr->m_idx;
848
849                 /* Move the player */
850                 p_ptr->y = ny;
851                 p_ptr->x = nx;
852
853                 /* Hack -- For moving monster or riding player's moving */
854                 if (!(mpe_mode & MPE_DONT_SWAP_MON))
855                 {
856                         /* Swap two monsters */
857                         c_ptr->m_idx = om_idx;
858                         oc_ptr->m_idx = nm_idx;
859
860                         if (om_idx > 0) /* Monster on old spot (or p_ptr->riding) */
861                         {
862                                 monster_type *om_ptr = &m_list[om_idx];
863                                 om_ptr->fy = ny;
864                                 om_ptr->fx = nx;
865                                 update_mon(om_idx, TRUE);
866                         }
867
868                         if (nm_idx > 0) /* Monster on new spot */
869                         {
870                                 monster_type *nm_ptr = &m_list[nm_idx];
871                                 nm_ptr->fy = oy;
872                                 nm_ptr->fx = ox;
873                                 update_mon(nm_idx, TRUE);
874                         }
875                 }
876
877                 /* Redraw old spot */
878                 lite_spot(oy, ox);
879
880                 /* Redraw new spot */
881                 lite_spot(ny, nx);
882
883                 /* Check for new panel (redraw map) */
884                 verify_panel();
885
886                 if (mpe_mode & MPE_FORGET_FLOW)
887                 {
888                         forget_flow();
889
890                         /* Mega-Hack -- Forget the view */
891                         p_ptr->update |= (PU_UN_VIEW);
892
893                         /* Redraw map */
894                         p_ptr->redraw |= (PR_MAP);
895                 }
896
897                 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_DISTANCE);
898
899                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
900
901                 /* Remove "unsafe" flag */
902                 if ((!p_ptr->blind && !no_lite()) || !is_trap(c_ptr->feat)) c_ptr->info &= ~(CAVE_UNSAFE);
903
904                 /* For get everything when requested hehe I'm *NASTY* */
905                 if (dun_level && (d_info[dungeon_type].flags1 & DF1_FORGET)) wiz_dark();
906
907                 /* Handle stuff */
908                 if (mpe_mode & MPE_HANDLE_STUFF) handle_stuff();
909
910                 if (p_ptr->pclass == CLASS_NINJA)
911                 {
912                         if (c_ptr->info & (CAVE_GLOW)) set_superstealth(FALSE);
913                         else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
914                 }
915
916                 if ((p_ptr->action == ACTION_HAYAGAKE) &&
917                     (!have_flag(f_ptr->flags, FF_PROJECT) ||
918                      (!p_ptr->levitation && have_flag(f_ptr->flags, FF_DEEP))))
919                 {
920                         msg_print(_("ここでは素早く動けない。", "You cannot run in here."));
921                         set_action(ACTION_NONE);
922                 }
923         }
924
925         if (mpe_mode & MPE_ENERGY_USE)
926         {
927                 if (music_singing(MUSIC_WALL))
928                 {
929                         (void)project(0, 0, p_ptr->y, p_ptr->x, (60 + p_ptr->lev), GF_DISINTEGRATE,
930                                 PROJECT_KILL | PROJECT_ITEM, -1);
931
932                         if (!player_bold(ny, nx) || p_ptr->is_dead || p_ptr->leaving) return FALSE;
933                 }
934
935                 /* Spontaneous Searching */
936                 if ((p_ptr->skill_fos >= 50) || (0 == randint0(50 - p_ptr->skill_fos)))
937                 {
938                         search();
939                 }
940
941                 /* Continuous Searching */
942                 if (p_ptr->action == ACTION_SEARCH)
943                 {
944                         search();
945                 }
946         }
947
948         /* Handle "objects" */
949         if (!(mpe_mode & MPE_DONT_PICKUP))
950         {
951                 carry((mpe_mode & MPE_DO_PICKUP) ? TRUE : FALSE);
952         }
953
954         /* Handle "store doors" */
955         if (have_flag(f_ptr->flags, FF_STORE))
956         {
957                 disturb(FALSE, TRUE);
958
959                 p_ptr->energy_use = 0;
960                 /* Hack -- Enter store */
961                 command_new = SPECIAL_KEY_STORE;
962         }
963
964         /* Handle "building doors" -KMW- */
965         else if (have_flag(f_ptr->flags, FF_BLDG))
966         {
967                 disturb(FALSE, TRUE);
968
969                 p_ptr->energy_use = 0;
970                 /* Hack -- Enter building */
971                 command_new = SPECIAL_KEY_BUILDING;
972         }
973
974         /* Handle quest areas -KMW- */
975         else if (have_flag(f_ptr->flags, FF_QUEST_ENTER))
976         {
977                 disturb(FALSE, TRUE);
978
979                 p_ptr->energy_use = 0;
980                 /* Hack -- Enter quest level */
981                 command_new = SPECIAL_KEY_QUEST;
982         }
983
984         else if (have_flag(f_ptr->flags, FF_QUEST_EXIT))
985         {
986                 if (quest[p_ptr->inside_quest].type == QUEST_TYPE_FIND_EXIT)
987                 {
988                         complete_quest(p_ptr->inside_quest);
989                 }
990
991                 leave_quest_check();
992
993                 p_ptr->inside_quest = c_ptr->special;
994                 dun_level = 0;
995                 p_ptr->oldpx = 0;
996                 p_ptr->oldpy = 0;
997
998                 p_ptr->leaving = TRUE;
999         }
1000
1001         /* Set off a trap */
1002         else if (have_flag(f_ptr->flags, FF_HIT_TRAP) && !(mpe_mode & MPE_STAYING))
1003         {
1004                 disturb(FALSE, TRUE);
1005
1006                 /* Hidden trap */
1007                 if (c_ptr->mimic || have_flag(f_ptr->flags, FF_SECRET))
1008                 {
1009                         msg_print(_("トラップだ!", "You found a trap!"));
1010
1011                         /* Pick a trap */
1012                         disclose_grid(p_ptr->y, p_ptr->x);
1013                 }
1014
1015                 /* Hit the trap */
1016                 hit_trap((mpe_mode & MPE_BREAK_TRAP) ? TRUE : FALSE);
1017
1018                 if (!player_bold(ny, nx) || p_ptr->is_dead || p_ptr->leaving) return FALSE;
1019         }
1020
1021         /* Warn when leaving trap detected region */
1022         if (!(mpe_mode & MPE_STAYING) && (disturb_trap_detect || alert_trap_detect)
1023             && p_ptr->dtrap && !(c_ptr->info & CAVE_IN_DETECT))
1024         {
1025                 /* No duplicate warning */
1026                 p_ptr->dtrap = FALSE;
1027
1028                 /* You are just on the edge */
1029                 if (!(c_ptr->info & CAVE_UNSAFE))
1030                 {
1031                         if (alert_trap_detect)
1032                         {
1033                                 msg_print(_("* 注意:この先はトラップの感知範囲外です! *", "*Leaving trap detect region!*"));
1034                         }
1035
1036                         if (disturb_trap_detect) disturb(FALSE, TRUE);
1037                 }
1038         }
1039
1040         return player_bold(ny, nx) && !p_ptr->is_dead && !p_ptr->leaving;
1041 }
1042
1043 /*!
1044  * @brief 該当地形のトラップがプレイヤーにとって無効かどうかを判定して返す
1045  * @param feat 地形ID
1046  * @return トラップが自動的に無効ならばTRUEを返す
1047  */
1048 bool trap_can_be_ignored(FEAT_IDX feat)
1049 {
1050         feature_type *f_ptr = &f_info[feat];
1051
1052         if (!have_flag(f_ptr->flags, FF_TRAP)) return TRUE;
1053
1054         switch (f_ptr->subtype)
1055         {
1056         case TRAP_TRAPDOOR:
1057         case TRAP_PIT:
1058         case TRAP_SPIKED_PIT:
1059         case TRAP_POISON_PIT:
1060                 if (p_ptr->levitation) return TRUE;
1061                 break;
1062         case TRAP_TELEPORT:
1063                 if (p_ptr->anti_tele) return TRUE;
1064                 break;
1065         case TRAP_FIRE:
1066                 if (p_ptr->immune_fire) return TRUE;
1067                 break;
1068         case TRAP_ACID:
1069                 if (p_ptr->immune_acid) return TRUE;
1070                 break;
1071         case TRAP_BLIND:
1072                 if (p_ptr->resist_blind) return TRUE;
1073                 break;
1074         case TRAP_CONFUSE:
1075                 if (p_ptr->resist_conf) return TRUE;
1076                 break;
1077         case TRAP_POISON:
1078                 if (p_ptr->resist_pois) return TRUE;
1079                 break;
1080         case TRAP_SLEEP:
1081                 if (p_ptr->free_act) return TRUE;
1082                 break;
1083         }
1084
1085         return FALSE;
1086 }
1087
1088
1089 /*
1090  * Determine if a "boundary" grid is "floor mimic"
1091  */
1092 #define boundary_floor(C, F, MF) \
1093         ((C)->mimic && permanent_wall(F) && \
1094          (have_flag((MF)->flags, FF_MOVE) || have_flag((MF)->flags, FF_CAN_FLY)) && \
1095          have_flag((MF)->flags, FF_PROJECT) && \
1096          !have_flag((MF)->flags, FF_OPEN))
1097
1098
1099 /*!
1100  * @brief 該当地形のトラップがプレイヤーにとって無効かどうかを判定して返す /
1101  * Move player in the given direction, with the given "pickup" flag.
1102  * @param dir 移動方向ID
1103  * @param do_pickup 罠解除を試みながらの移動ならばTRUE
1104  * @param break_trap トラップ粉砕処理を行うならばTRUE
1105  * @return 実際に移動が行われたならばTRUEを返す。
1106  * @note
1107  * This routine should (probably) always induce energy expenditure.\n
1108  * @details
1109  * Note that moving will *always* take a turn, and will *always* hit\n
1110  * any monster which might be in the destination grid.  Previously,\n
1111  * moving into walls was "free" and did NOT hit invisible monsters.\n
1112  */
1113 void move_player(DIRECTION dir, bool do_pickup, bool break_trap)
1114 {
1115         /* Find the result of moving */
1116         POSITION y = p_ptr->y + ddy[dir];
1117         POSITION x = p_ptr->x + ddx[dir];
1118
1119         /* Examine the destination */
1120         cave_type *c_ptr = &cave[y][x];
1121
1122         feature_type *f_ptr = &f_info[c_ptr->feat];
1123
1124         monster_type *m_ptr;
1125
1126         monster_type *riding_m_ptr = &m_list[p_ptr->riding];
1127         monster_race *riding_r_ptr = &r_info[p_ptr->riding ? riding_m_ptr->r_idx : 0]; /* Paranoia */
1128
1129         char m_name[80];
1130
1131         bool p_can_enter = player_can_enter(c_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
1132         bool p_can_kill_walls = FALSE;
1133         bool stormbringer = FALSE;
1134
1135         bool oktomove = TRUE;
1136         bool do_past = FALSE;
1137
1138         /* Exit the area */
1139         if (!dun_level && !p_ptr->wild_mode &&
1140                 ((x == 0) || (x == MAX_WID - 1) ||
1141                  (y == 0) || (y == MAX_HGT - 1)))
1142         {
1143                 /* Can the player enter the grid? */
1144                 if (c_ptr->mimic && player_can_enter(c_ptr->mimic, 0))
1145                 {
1146                         /* Hack: move to new area */
1147                         if ((y == 0) && (x == 0))
1148                         {
1149                                 p_ptr->wilderness_y--;
1150                                 p_ptr->wilderness_x--;
1151                                 p_ptr->oldpy = cur_hgt - 2;
1152                                 p_ptr->oldpx = cur_wid - 2;
1153                                 ambush_flag = FALSE;
1154                         }
1155
1156                         else if ((y == 0) && (x == MAX_WID - 1))
1157                         {
1158                                 p_ptr->wilderness_y--;
1159                                 p_ptr->wilderness_x++;
1160                                 p_ptr->oldpy = cur_hgt - 2;
1161                                 p_ptr->oldpx = 1;
1162                                 ambush_flag = FALSE;
1163                         }
1164
1165                         else if ((y == MAX_HGT - 1) && (x == 0))
1166                         {
1167                                 p_ptr->wilderness_y++;
1168                                 p_ptr->wilderness_x--;
1169                                 p_ptr->oldpy = 1;
1170                                 p_ptr->oldpx = cur_wid - 2;
1171                                 ambush_flag = FALSE;
1172                         }
1173
1174                         else if ((y == MAX_HGT - 1) && (x == MAX_WID - 1))
1175                         {
1176                                 p_ptr->wilderness_y++;
1177                                 p_ptr->wilderness_x++;
1178                                 p_ptr->oldpy = 1;
1179                                 p_ptr->oldpx = 1;
1180                                 ambush_flag = FALSE;
1181                         }
1182
1183                         else if (y == 0)
1184                         {
1185                                 p_ptr->wilderness_y--;
1186                                 p_ptr->oldpy = cur_hgt - 2;
1187                                 p_ptr->oldpx = x;
1188                                 ambush_flag = FALSE;
1189                         }
1190
1191                         else if (y == MAX_HGT - 1)
1192                         {
1193                                 p_ptr->wilderness_y++;
1194                                 p_ptr->oldpy = 1;
1195                                 p_ptr->oldpx = x;
1196                                 ambush_flag = FALSE;
1197                         }
1198
1199                         else if (x == 0)
1200                         {
1201                                 p_ptr->wilderness_x--;
1202                                 p_ptr->oldpx = cur_wid - 2;
1203                                 p_ptr->oldpy = y;
1204                                 ambush_flag = FALSE;
1205                         }
1206
1207                         else if (x == MAX_WID - 1)
1208                         {
1209                                 p_ptr->wilderness_x++;
1210                                 p_ptr->oldpx = 1;
1211                                 p_ptr->oldpy = y;
1212                                 ambush_flag = FALSE;
1213                         }
1214
1215                         p_ptr->leaving = TRUE;
1216                         p_ptr->energy_use = 100;
1217
1218                         return;
1219                 }
1220
1221                 /* "Blocked" message appears later */
1222                 /* oktomove = FALSE; */
1223                 p_can_enter = FALSE;
1224         }
1225
1226         /* Get the monster */
1227         m_ptr = &m_list[c_ptr->m_idx];
1228
1229
1230         if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1231         if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1232
1233         /* Player can not walk through "walls"... */
1234         /* unless in Shadow Form */
1235         p_can_kill_walls = p_ptr->kill_wall && have_flag(f_ptr->flags, FF_HURT_DISI) &&
1236                 (!p_can_enter || !have_flag(f_ptr->flags, FF_LOS)) &&
1237                 !have_flag(f_ptr->flags, FF_PERMANENT);
1238
1239         /* Hack -- attack monsters */
1240         if (c_ptr->m_idx && (m_ptr->ml || p_can_enter || p_can_kill_walls))
1241         {
1242                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1243
1244                 /* Attack -- only if we can see it OR it is not in a wall */
1245                 if (!is_hostile(m_ptr) &&
1246                     !(p_ptr->confused || p_ptr->image || !m_ptr->ml || p_ptr->stun ||
1247                     ((p_ptr->muta2 & MUT2_BERS_RAGE) && p_ptr->shero)) &&
1248                     pattern_seq(p_ptr->y, p_ptr->x, y, x) && (p_can_enter || p_can_kill_walls))
1249                 {
1250                         /* Disturb the monster */
1251                         (void)set_monster_csleep(c_ptr->m_idx, 0);
1252
1253                         /* Extract monster name (or "it") */
1254                         monster_desc(m_name, m_ptr, 0);
1255
1256                         if (m_ptr->ml)
1257                         {
1258                                 /* Auto-Recall if possible and visible */
1259                                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
1260
1261                                 /* Track a new monster */
1262                                 health_track(c_ptr->m_idx);
1263                         }
1264
1265                         /* displace? */
1266                         if ((stormbringer && (randint1(1000) > 666)) || (p_ptr->pclass == CLASS_BERSERKER))
1267                         {
1268                                 py_attack(y, x, 0);
1269                                 oktomove = FALSE;
1270                         }
1271                         else if (monster_can_cross_terrain(cave[p_ptr->y][p_ptr->x].feat, r_ptr, 0))
1272                         {
1273                                 do_past = TRUE;
1274                         }
1275                         else
1276                         {
1277                                 msg_format(_("%^sが邪魔だ!", "%^s is in your way!"), m_name);
1278                                 p_ptr->energy_use = 0;
1279                                 oktomove = FALSE;
1280                         }
1281
1282                         /* now continue on to 'movement' */
1283                 }
1284                 else
1285                 {
1286                         py_attack(y, x, 0);
1287                         oktomove = FALSE;
1288                 }
1289         }
1290
1291         if (oktomove && p_ptr->riding)
1292         {
1293                 if (riding_r_ptr->flags1 & RF1_NEVER_MOVE)
1294                 {
1295                         msg_print(_("動けない!", "Can't move!"));
1296                         p_ptr->energy_use = 0;
1297                         oktomove = FALSE;
1298                         disturb(FALSE, TRUE);
1299                 }
1300                 else if (MON_MONFEAR(riding_m_ptr))
1301                 {
1302                         char steed_name[80];
1303
1304                         /* Acquire the monster name */
1305                         monster_desc(steed_name, riding_m_ptr, 0);
1306
1307                         /* Dump a message */
1308                         msg_format(_("%sが恐怖していて制御できない。", "%^s is too scared to control."), steed_name);
1309                         oktomove = FALSE;
1310                         disturb(FALSE, TRUE);
1311                 }
1312                 else if (p_ptr->riding_ryoute)
1313                 {
1314                         oktomove = FALSE;
1315                         disturb(FALSE, TRUE);
1316                 }
1317                 else if (have_flag(f_ptr->flags, FF_CAN_FLY) && (riding_r_ptr->flags7 & RF7_CAN_FLY))
1318                 {
1319                         /* Allow moving */
1320                 }
1321                 else if (have_flag(f_ptr->flags, FF_CAN_SWIM) && (riding_r_ptr->flags7 & RF7_CAN_SWIM))
1322                 {
1323                         /* Allow moving */
1324                 }
1325                 else if (have_flag(f_ptr->flags, FF_WATER) &&
1326                         !(riding_r_ptr->flags7 & RF7_AQUATIC) &&
1327                         (have_flag(f_ptr->flags, FF_DEEP) || (riding_r_ptr->flags2 & RF2_AURA_FIRE)))
1328                 {
1329                         msg_format(_("%sの上に行けない。", "Can't swim."), f_name + f_info[get_feat_mimic(c_ptr)].name);
1330                         p_ptr->energy_use = 0;
1331                         oktomove = FALSE;
1332                         disturb(FALSE, TRUE);
1333                 }
1334                 else if (!have_flag(f_ptr->flags, FF_WATER) && (riding_r_ptr->flags7 & RF7_AQUATIC))
1335                 {
1336                         msg_format(_("%sから上がれない。", "Can't land."), f_name + f_info[get_feat_mimic(&cave[p_ptr->y][p_ptr->x])].name);
1337                         p_ptr->energy_use = 0;
1338                         oktomove = FALSE;
1339                         disturb(FALSE, TRUE);
1340                 }
1341                 else if (have_flag(f_ptr->flags, FF_LAVA) && !(riding_r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
1342                 {
1343                         msg_format(_("%sの上に行けない。", "Too hot to go through."), f_name + f_info[get_feat_mimic(c_ptr)].name);
1344                         p_ptr->energy_use = 0;
1345                         oktomove = FALSE;
1346                         disturb(FALSE, TRUE);
1347                 }
1348
1349                 if (oktomove && MON_STUNNED(riding_m_ptr) && one_in_(2))
1350                 {
1351                         char steed_name[80];
1352                         monster_desc(steed_name, riding_m_ptr, 0);
1353                         msg_format(_("%sが朦朧としていてうまく動けない!", "You cannot control stunned %s!"), steed_name);
1354                         oktomove = FALSE;
1355                         disturb(FALSE, TRUE);
1356                 }
1357         }
1358
1359         if (!oktomove)
1360         {
1361         }
1362
1363         else if (!have_flag(f_ptr->flags, FF_MOVE) && have_flag(f_ptr->flags, FF_CAN_FLY) && !p_ptr->levitation)
1364         {
1365                 msg_format(_("空を飛ばないと%sの上には行けない。", "You need to fly to go through the %s."), f_name + f_info[get_feat_mimic(c_ptr)].name);
1366                 p_ptr->energy_use = 0;
1367                 running = 0;
1368                 oktomove = FALSE;
1369         }
1370
1371         /*
1372          * Player can move through trees and
1373          * has effective -10 speed
1374          * Rangers can move without penality
1375          */
1376         else if (have_flag(f_ptr->flags, FF_TREE) && !p_can_kill_walls)
1377         {
1378                 if ((p_ptr->pclass != CLASS_RANGER) && !p_ptr->levitation && (!p_ptr->riding || !(riding_r_ptr->flags8 & RF8_WILD_WOOD))) p_ptr->energy_use *= 2;
1379         }
1380
1381
1382         /* Disarm a visible trap */
1383         else if ((do_pickup != easy_disarm) && have_flag(f_ptr->flags, FF_DISARM) && !c_ptr->mimic)
1384         {
1385                 if (!trap_can_be_ignored(c_ptr->feat))
1386                 {
1387                         (void)do_cmd_disarm_aux(y, x, dir);
1388                         return;
1389                 }
1390         }
1391
1392
1393         /* Player can not walk through "walls" unless in wraith form...*/
1394         else if (!p_can_enter && !p_can_kill_walls)
1395         {
1396                 /* Feature code (applying "mimic" field) */
1397                 FEAT_IDX feat = get_feat_mimic(c_ptr);
1398                 feature_type *mimic_f_ptr = &f_info[feat];
1399                 cptr name = f_name + mimic_f_ptr->name;
1400
1401                 oktomove = FALSE;
1402
1403                 /* Notice things in the dark */
1404                 if (!(c_ptr->info & CAVE_MARK) && !player_can_see_bold(y, x))
1405                 {
1406                         /* Boundary floor mimic */
1407                         if (boundary_floor(c_ptr, f_ptr, mimic_f_ptr))
1408                         {
1409                                 msg_print(_("それ以上先には進めないようだ。", "You feel you cannot go any more."));
1410                         }
1411
1412                         /* Wall (or secret door) */
1413                         else
1414                         {
1415 #ifdef JP
1416                                 msg_format("%sが行く手をはばんでいるようだ。", name);
1417 #else
1418                                 msg_format("You feel %s %s blocking your way.",
1419                                         is_a_vowel(name[0]) ? "an" : "a", name);
1420 #endif
1421
1422                                 c_ptr->info |= (CAVE_MARK);
1423                                 lite_spot(y, x);
1424                         }
1425                 }
1426
1427                 /* Notice things */
1428                 else
1429                 {
1430                         /* Boundary floor mimic */
1431                         if (boundary_floor(c_ptr, f_ptr, mimic_f_ptr))
1432                         {
1433                                 msg_print(_("それ以上先には進めない。", "You cannot go any more."));
1434                                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
1435                                         p_ptr->energy_use = 0;
1436                         }
1437
1438                         /* Wall (or secret door) */
1439                         else
1440                         {
1441                                 /* Closed doors */
1442                                 if (easy_open && is_closed_door(feat) && easy_open_door(y, x)) return;
1443
1444 #ifdef JP
1445                                 msg_format("%sが行く手をはばんでいる。", name);
1446 #else
1447                                 msg_format("There is %s %s blocking your way.",
1448                                         is_a_vowel(name[0]) ? "an" : "a", name);
1449 #endif
1450
1451                                 /*
1452                                  * Well, it makes sense that you lose time bumping into
1453                                  * a wall _if_ you are confused, stunned or blind; but
1454                                  * typing mistakes should not cost you a turn...
1455                                  */
1456                                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
1457                                         p_ptr->energy_use = 0;
1458                         }
1459                 }
1460
1461                 disturb(FALSE, TRUE);
1462
1463                 if (!boundary_floor(c_ptr, f_ptr, mimic_f_ptr)) sound(SOUND_HITWALL);
1464         }
1465
1466         /* Normal movement */
1467         if (oktomove && !pattern_seq(p_ptr->y, p_ptr->x, y, x))
1468         {
1469                 if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
1470                 {
1471                         p_ptr->energy_use = 0;
1472                 }
1473
1474                 /* To avoid a loop with running */
1475                 disturb(FALSE, TRUE);
1476
1477                 oktomove = FALSE;
1478         }
1479
1480         /* Normal movement */
1481         if (oktomove)
1482         {
1483                 u32b mpe_mode = MPE_ENERGY_USE;
1484
1485                 if (p_ptr->warning)
1486                 {
1487                         if (!process_warning(x, y))
1488                         {
1489                                 p_ptr->energy_use = 25;
1490                                 return;
1491                         }
1492                 }
1493
1494                 if (do_past)
1495                 {
1496                         msg_format(_("%sを押し退けた。", "You push past %s."), m_name);
1497                 }
1498
1499                 /* Change oldpx and oldpy to place the player well when going back to big mode */
1500                 if (p_ptr->wild_mode)
1501                 {
1502                         if (ddy[dir] > 0)  p_ptr->oldpy = 1;
1503                         if (ddy[dir] < 0)  p_ptr->oldpy = MAX_HGT - 2;
1504                         if (ddy[dir] == 0) p_ptr->oldpy = MAX_HGT / 2;
1505                         if (ddx[dir] > 0)  p_ptr->oldpx = 1;
1506                         if (ddx[dir] < 0)  p_ptr->oldpx = MAX_WID - 2;
1507                         if (ddx[dir] == 0) p_ptr->oldpx = MAX_WID / 2;
1508                 }
1509
1510                 if (p_can_kill_walls)
1511                 {
1512                         cave_alter_feat(y, x, FF_HURT_DISI);
1513
1514                         /* Update some things -- similar to GF_KILL_WALL */
1515                         p_ptr->update |= (PU_FLOW);
1516                 }
1517
1518                 /* sound(SOUND_WALK); */
1519
1520                 if (do_pickup != always_pickup) mpe_mode |= MPE_DO_PICKUP;
1521                 if (break_trap) mpe_mode |= MPE_BREAK_TRAP;
1522
1523                 /* Move the player */
1524                 (void)move_player_effect(y, x, mpe_mode);
1525         }
1526 }
1527
1528
1529 static bool ignore_avoid_run;
1530
1531 /*!
1532  * @brief ダッシュ移動処理中、移動先のマスが既知の壁かどうかを判定する /
1533  * Hack -- Check for a "known wall" (see below)
1534  * @param dir 想定する移動方向ID
1535  * @param y 移動元のY座標
1536  * @param x 移動元のX座標
1537  * @return 移動先が既知の壁ならばTRUE
1538  */
1539 static bool see_wall(DIRECTION dir, POSITION y, POSITION x)
1540 {
1541         cave_type *c_ptr;
1542
1543         /* Get the new location */
1544         y += ddy[dir];
1545         x += ddx[dir];
1546
1547         /* Illegal grids are not known walls */
1548         if (!in_bounds2(y, x)) return (FALSE);
1549
1550         /* Access grid */
1551         c_ptr = &cave[y][x];
1552
1553         /* Must be known to the player */
1554         if (c_ptr->info & (CAVE_MARK))
1555         {
1556                 /* Feature code (applying "mimic" field) */
1557                 s16b         feat = get_feat_mimic(c_ptr);
1558                 feature_type *f_ptr = &f_info[feat];
1559
1560                 /* Wall grids are known walls */
1561                 if (!player_can_enter(feat, 0)) return !have_flag(f_ptr->flags, FF_DOOR);
1562
1563                 /* Don't run on a tree unless explicitly requested */
1564                 if (have_flag(f_ptr->flags, FF_AVOID_RUN) && !ignore_avoid_run)
1565                         return TRUE;
1566
1567                 /* Don't run in a wall */
1568                 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1569                         return !have_flag(f_ptr->flags, FF_DOOR);
1570         }
1571
1572         return FALSE;
1573 }
1574
1575
1576 /*!
1577  * @brief ダッシュ移動処理中、移動先のマスか未知の地形かどうかを判定する /
1578  * Hack -- Check for an "unknown corner" (see below)
1579  * @param dir 想定する移動方向ID
1580  * @param y 移動元のY座標
1581  * @param x 移動元のX座標
1582  * @return 移動先が未知の地形ならばTRUE
1583  */
1584 static bool see_nothing(DIRECTION dir, POSITION y, POSITION x)
1585 {
1586         /* Get the new location */
1587         y += ddy[dir];
1588         x += ddx[dir];
1589
1590         /* Illegal grids are unknown */
1591         if (!in_bounds2(y, x)) return (TRUE);
1592
1593         /* Memorized grids are always known */
1594         if (cave[y][x].info & (CAVE_MARK)) return (FALSE);
1595
1596         /* Viewable door/wall grids are known */
1597         if (player_can_see_bold(y, x)) return (FALSE);
1598
1599         /* Default */
1600         return (TRUE);
1601 }
1602
1603
1604 /*
1605  * Hack -- allow quick "cycling" through the legal directions
1606  */
1607 static byte cycle[] = { 1, 2, 3, 6, 9, 8, 7, 4, 1, 2, 3, 6, 9, 8, 7, 4, 1 };
1608
1609 /*
1610  * Hack -- map each direction into the "middle" of the "cycle[]" array
1611  */
1612 static byte chome[] = { 0, 8, 9, 10, 7, 0, 11, 6, 5, 4 };
1613
1614 /*
1615  * The direction we are running
1616  */
1617 static DIRECTION find_current;
1618
1619 /*
1620  * The direction we came from
1621  */
1622 static DIRECTION find_prevdir;
1623
1624 /*
1625  * We are looking for open area
1626  */
1627 static bool find_openarea;
1628
1629 /*
1630  * We are looking for a break
1631  */
1632 static bool find_breakright;
1633 static bool find_breakleft;
1634
1635 /*!
1636  * @brief ダッシュ処理の導入 /
1637  * Initialize the running algorithm for a new direction.
1638  * @param dir 導入の移動先
1639  * @details
1640  * Diagonal Corridor -- allow diaginal entry into corridors.\n
1641  *\n
1642  * Blunt Corridor -- If there is a wall two spaces ahead and\n
1643  * we seem to be in a corridor, then force a turn into the side\n
1644  * corridor, must be moving straight into a corridor here. ???\n
1645  *\n
1646  * Diagonal Corridor    Blunt Corridor (?)\n
1647  *       \# \#                  \#\n
1648  *       \#x\#                  \@x\#\n
1649  *       \@\@p.                  p\n
1650  */
1651 static void run_init(DIRECTION dir)
1652 {
1653         int row, col, deepleft, deepright;
1654         int i, shortleft, shortright;
1655
1656         /* Save the direction */
1657         find_current = dir;
1658
1659         /* Assume running straight */
1660         find_prevdir = dir;
1661
1662         /* Assume looking for open area */
1663         find_openarea = TRUE;
1664
1665         /* Assume not looking for breaks */
1666         find_breakright = find_breakleft = FALSE;
1667
1668         /* Assume no nearby walls */
1669         deepleft = deepright = FALSE;
1670         shortright = shortleft = FALSE;
1671
1672         p_ptr->run_py = p_ptr->y;
1673         p_ptr->run_px = p_ptr->x;
1674
1675         /* Find the destination grid */
1676         row = p_ptr->y + ddy[dir];
1677         col = p_ptr->x + ddx[dir];
1678
1679         ignore_avoid_run = cave_have_flag_bold(row, col, FF_AVOID_RUN);
1680
1681         /* Extract cycle index */
1682         i = chome[dir];
1683
1684         /* Check for walls */
1685         if (see_wall(cycle[i+1], p_ptr->y, p_ptr->x))
1686         {
1687                 find_breakleft = TRUE;
1688                 shortleft = TRUE;
1689         }
1690         else if (see_wall(cycle[i+1], row, col))
1691         {
1692                 find_breakleft = TRUE;
1693                 deepleft = TRUE;
1694         }
1695
1696         /* Check for walls */
1697         if (see_wall(cycle[i-1], p_ptr->y, p_ptr->x))
1698         {
1699                 find_breakright = TRUE;
1700                 shortright = TRUE;
1701         }
1702         else if (see_wall(cycle[i-1], row, col))
1703         {
1704                 find_breakright = TRUE;
1705                 deepright = TRUE;
1706         }
1707
1708         /* Looking for a break */
1709         if (find_breakleft && find_breakright)
1710         {
1711                 /* Not looking for open area */
1712                 find_openarea = FALSE;
1713
1714                 /* Hack -- allow angled corridor entry */
1715                 if (dir & 0x01)
1716                 {
1717                         if (deepleft && !deepright)
1718                         {
1719                                 find_prevdir = cycle[i - 1];
1720                         }
1721                         else if (deepright && !deepleft)
1722                         {
1723                                 find_prevdir = cycle[i + 1];
1724                         }
1725                 }
1726
1727                 /* Hack -- allow blunt corridor entry */
1728                 else if (see_wall(cycle[i], row, col))
1729                 {
1730                         if (shortleft && !shortright)
1731                         {
1732                                 find_prevdir = cycle[i - 2];
1733                         }
1734                         else if (shortright && !shortleft)
1735                         {
1736                                 find_prevdir = cycle[i + 2];
1737                         }
1738                 }
1739         }
1740 }
1741
1742
1743 /*!
1744  * @brief ダッシュ移動が継続できるかどうかの判定 /
1745  * Update the current "run" path
1746  * @return
1747  * ダッシュ移動が継続できるならばTRUEを返す。
1748  * Return TRUE if the running should be stopped
1749  */
1750 static bool run_test(void)
1751 {
1752         DIRECTION prev_dir, new_dir, check_dir = 0;
1753         int row, col;
1754         int i, max, inv;
1755         int option = 0, option2 = 0;
1756         cave_type *c_ptr;
1757         FEAT_IDX feat;
1758         feature_type *f_ptr;
1759
1760         /* Where we came from */
1761         prev_dir = find_prevdir;
1762
1763
1764         /* Range of newly adjacent grids */
1765         max = (prev_dir & 0x01) + 1;
1766
1767         /* break run when leaving trap detected region */
1768         if ((disturb_trap_detect || alert_trap_detect)
1769             && p_ptr->dtrap && !(cave[p_ptr->y][p_ptr->x].info & CAVE_IN_DETECT))
1770         {
1771                 /* No duplicate warning */
1772                 p_ptr->dtrap = FALSE;
1773
1774                 /* You are just on the edge */
1775                 if (!(cave[p_ptr->y][p_ptr->x].info & CAVE_UNSAFE))
1776                 {
1777                         if (alert_trap_detect)
1778                         {
1779                                 msg_print(_("* 注意:この先はトラップの感知範囲外です! *", "*Leaving trap detect region!*"));
1780                         }
1781
1782                         if (disturb_trap_detect)
1783                         {
1784                                 /* Break Run */
1785                                 return(TRUE);
1786                         }
1787                 }
1788         }
1789
1790         /* Look at every newly adjacent square. */
1791         for (i = -max; i <= max; i++)
1792         {
1793                 OBJECT_IDX this_o_idx, next_o_idx = 0;
1794
1795                 /* New direction */
1796                 new_dir = cycle[chome[prev_dir] + i];
1797
1798                 /* New location */
1799                 row = p_ptr->y + ddy[new_dir];
1800                 col = p_ptr->x + ddx[new_dir];
1801
1802                 /* Access grid */
1803                 c_ptr = &cave[row][col];
1804
1805                 /* Feature code (applying "mimic" field) */
1806                 feat = get_feat_mimic(c_ptr);
1807                 f_ptr = &f_info[feat];
1808
1809                 /* Visible monsters abort running */
1810                 if (c_ptr->m_idx)
1811                 {
1812                         monster_type *m_ptr = &m_list[c_ptr->m_idx];
1813
1814                         /* Visible monster */
1815                         if (m_ptr->ml) return (TRUE);
1816                 }
1817
1818                 /* Visible objects abort running */
1819                 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
1820                 {
1821                         object_type *o_ptr;
1822
1823                         /* Acquire object */
1824                         o_ptr = &o_list[this_o_idx];
1825
1826                         /* Acquire next object */
1827                         next_o_idx = o_ptr->next_o_idx;
1828
1829                         /* Visible object */
1830                         if (o_ptr->marked & OM_FOUND) return (TRUE);
1831                 }
1832
1833                 /* Assume unknown */
1834                 inv = TRUE;
1835
1836                 /* Check memorized grids */
1837                 if (c_ptr->info & (CAVE_MARK))
1838                 {
1839                         bool notice = have_flag(f_ptr->flags, FF_NOTICE);
1840
1841                         if (notice && have_flag(f_ptr->flags, FF_MOVE))
1842                         {
1843                                 /* Open doors */
1844                                 if (find_ignore_doors && have_flag(f_ptr->flags, FF_DOOR) && have_flag(f_ptr->flags, FF_CLOSE))
1845                                 {
1846                                         /* Option -- ignore */
1847                                         notice = FALSE;
1848                                 }
1849
1850                                 /* Stairs */
1851                                 else if (find_ignore_stairs && have_flag(f_ptr->flags, FF_STAIRS))
1852                                 {
1853                                         /* Option -- ignore */
1854                                         notice = FALSE;
1855                                 }
1856
1857                                 /* Lava */
1858                                 else if (have_flag(f_ptr->flags, FF_LAVA) && (p_ptr->immune_fire || IS_INVULN()))
1859                                 {
1860                                         /* Ignore */
1861                                         notice = FALSE;
1862                                 }
1863
1864                                 /* Deep water */
1865                                 else if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1866                                          (p_ptr->levitation || p_ptr->can_swim || (p_ptr->total_weight <= weight_limit())))
1867                                 {
1868                                         /* Ignore */
1869                                         notice = FALSE;
1870                                 }
1871                         }
1872
1873                         /* Interesting feature */
1874                         if (notice) return (TRUE);
1875
1876                         /* The grid is "visible" */
1877                         inv = FALSE;
1878                 }
1879
1880                 /* Analyze unknown grids and floors considering mimic */
1881                 if (inv || !see_wall(0, row, col))
1882                 {
1883                         /* Looking for open area */
1884                         if (find_openarea)
1885                         {
1886                                 /* Nothing */
1887                         }
1888
1889                         /* The first new direction. */
1890                         else if (!option)
1891                         {
1892                                 option = new_dir;
1893                         }
1894
1895                         /* Three new directions. Stop running. */
1896                         else if (option2)
1897                         {
1898                                 return (TRUE);
1899                         }
1900
1901                         /* Two non-adjacent new directions.  Stop running. */
1902                         else if (option != cycle[chome[prev_dir] + i - 1])
1903                         {
1904                                 return (TRUE);
1905                         }
1906
1907                         /* Two new (adjacent) directions (case 1) */
1908                         else if (new_dir & 0x01)
1909                         {
1910                                 check_dir = cycle[chome[prev_dir] + i - 2];
1911                                 option2 = new_dir;
1912                         }
1913
1914                         /* Two new (adjacent) directions (case 2) */
1915                         else
1916                         {
1917                                 check_dir = cycle[chome[prev_dir] + i + 1];
1918                                 option2 = option;
1919                                 option = new_dir;
1920                         }
1921                 }
1922
1923                 /* Obstacle, while looking for open area */
1924                 else
1925                 {
1926                         if (find_openarea)
1927                         {
1928                                 if (i < 0)
1929                                 {
1930                                         /* Break to the right */
1931                                         find_breakright = TRUE;
1932                                 }
1933
1934                                 else if (i > 0)
1935                                 {
1936                                         /* Break to the left */
1937                                         find_breakleft = TRUE;
1938                                 }
1939                         }
1940                 }
1941         }
1942
1943         /* Looking for open area */
1944         if (find_openarea)
1945         {
1946                 /* Hack -- look again */
1947                 for (i = -max; i < 0; i++)
1948                 {
1949                         /* Unknown grid or non-wall */
1950                         if (!see_wall(cycle[chome[prev_dir] + i], p_ptr->y, p_ptr->x))
1951                         {
1952                                 /* Looking to break right */
1953                                 if (find_breakright)
1954                                 {
1955                                         return (TRUE);
1956                                 }
1957                         }
1958
1959                         /* Obstacle */
1960                         else
1961                         {
1962                                 /* Looking to break left */
1963                                 if (find_breakleft)
1964                                 {
1965                                         return (TRUE);
1966                                 }
1967                         }
1968                 }
1969
1970                 /* Hack -- look again */
1971                 for (i = max; i > 0; i--)
1972                 {
1973                         /* Unknown grid or non-wall */
1974                         if (!see_wall(cycle[chome[prev_dir] + i], p_ptr->y, p_ptr->x))
1975                         {
1976                                 /* Looking to break left */
1977                                 if (find_breakleft)
1978                                 {
1979                                         return (TRUE);
1980                                 }
1981                         }
1982
1983                         /* Obstacle */
1984                         else
1985                         {
1986                                 /* Looking to break right */
1987                                 if (find_breakright)
1988                                 {
1989                                         return (TRUE);
1990                                 }
1991                         }
1992                 }
1993         }
1994
1995         /* Not looking for open area */
1996         else
1997         {
1998                 /* No options */
1999                 if (!option)
2000                 {
2001                         return (TRUE);
2002                 }
2003
2004                 /* One option */
2005                 else if (!option2)
2006                 {
2007                         /* Primary option */
2008                         find_current = option;
2009
2010                         /* No other options */
2011                         find_prevdir = option;
2012                 }
2013
2014                 /* Two options, examining corners */
2015                 else if (!find_cut)
2016                 {
2017                         /* Primary option */
2018                         find_current = option;
2019
2020                         /* Hack -- allow curving */
2021                         find_prevdir = option2;
2022                 }
2023
2024                 /* Two options, pick one */
2025                 else
2026                 {
2027                         /* Get next location */
2028                         row = p_ptr->y + ddy[option];
2029                         col = p_ptr->x + ddx[option];
2030
2031                         /* Don't see that it is closed off. */
2032                         /* This could be a potential corner or an intersection. */
2033                         if (!see_wall(option, row, col) ||
2034                             !see_wall(check_dir, row, col))
2035                         {
2036                                 /* Can not see anything ahead and in the direction we */
2037                                 /* are turning, assume that it is a potential corner. */
2038                                 if (see_nothing(option, row, col) &&
2039                                     see_nothing(option2, row, col))
2040                                 {
2041                                         find_current = option;
2042                                         find_prevdir = option2;
2043                                 }
2044
2045                                 /* STOP: we are next to an intersection or a room */
2046                                 else
2047                                 {
2048                                         return (TRUE);
2049                                 }
2050                         }
2051
2052                         /* This corner is seen to be enclosed; we cut the corner. */
2053                         else if (find_cut)
2054                         {
2055                                 find_current = option2;
2056                                 find_prevdir = option2;
2057                         }
2058
2059                         /* This corner is seen to be enclosed, and we */
2060                         /* deliberately go the long way. */
2061                         else
2062                         {
2063                                 find_current = option;
2064                                 find_prevdir = option2;
2065                         }
2066                 }
2067         }
2068
2069         /* About to hit a known wall, stop */
2070         if (see_wall(find_current, p_ptr->y, p_ptr->x))
2071         {
2072                 return (TRUE);
2073         }
2074
2075         /* Failure */
2076         return (FALSE);
2077 }
2078
2079
2080
2081 /*!
2082  * @brief 継続的なダッシュ処理 /
2083  * Take one step along the current "run" path
2084  * @param dir 移動を試みる方向ID
2085  * @return なし
2086  */
2087 void run_step(DIRECTION dir)
2088 {
2089         /* Start running */
2090         if (dir)
2091         {
2092                 /* Ignore AVOID_RUN on a first step */
2093                 ignore_avoid_run = TRUE;
2094
2095                 /* Hack -- do not start silly run */
2096                 if (see_wall(dir, p_ptr->y, p_ptr->x))
2097                 {
2098                         sound(SOUND_HITWALL);
2099
2100                         msg_print(_("その方向には走れません。", "You cannot run in that direction."));
2101
2102                         disturb(FALSE, FALSE);
2103
2104                         return;
2105                 }
2106
2107                 run_init(dir);
2108         }
2109
2110         /* Keep running */
2111         else
2112         {
2113                 /* Update run */
2114                 if (run_test())
2115                 {
2116                         disturb(FALSE, FALSE);
2117
2118                         return;
2119                 }
2120         }
2121
2122         /* Decrease the run counter */
2123         if (--running <= 0) return;
2124
2125         /* Take time */
2126         p_ptr->energy_use = 100;
2127
2128         /* Move the player, using the "pickup" flag */
2129         move_player(find_current, FALSE, FALSE);
2130
2131         if (player_bold(p_ptr->run_py, p_ptr->run_px))
2132         {
2133                 p_ptr->run_py = 0;
2134                 p_ptr->run_px = 0;
2135                 disturb(FALSE, FALSE);
2136         }
2137 }
2138
2139
2140 #ifdef TRAVEL
2141
2142 /*!
2143  * @brief トラベル機能の判定処理 /
2144  * Test for traveling
2145  * @param prev_dir 前回移動を行った元の方角ID
2146  * @return 次の方向
2147  */
2148 static DIRECTION travel_test(DIRECTION prev_dir)
2149 {
2150         DIRECTION new_dir = 0;
2151         int i, max;
2152         const cave_type *c_ptr;
2153         int cost;
2154
2155         /* Cannot travel when blind */
2156         if (p_ptr->blind || no_lite())
2157         {
2158                 msg_print(_("目が見えない!", "You cannot see!"));
2159                 return (0);
2160         }
2161
2162         /* break run when leaving trap detected region */
2163         if ((disturb_trap_detect || alert_trap_detect)
2164             && p_ptr->dtrap && !(cave[p_ptr->y][p_ptr->x].info & CAVE_IN_DETECT))
2165         {
2166                 /* No duplicate warning */
2167                 p_ptr->dtrap = FALSE;
2168
2169                 /* You are just on the edge */
2170                 if (!(cave[p_ptr->y][p_ptr->x].info & CAVE_UNSAFE))
2171                 {
2172                         if (alert_trap_detect)
2173                         {
2174                                 msg_print(_("* 注意:この先はトラップの感知範囲外です! *", "*Leaving trap detect region!*"));
2175                         }
2176
2177                         if (disturb_trap_detect)
2178                         {
2179                                 /* Break Run */
2180                                 return (0);
2181                         }
2182                 }
2183         }
2184
2185         /* Range of newly adjacent grids */
2186         max = (prev_dir & 0x01) + 1;
2187
2188         /* Look at every newly adjacent square. */
2189         for (i = -max; i <= max; i++)
2190         {
2191                 /* New direction */
2192                 DIRECTION dir = cycle[chome[prev_dir] + i];
2193
2194                 /* New location */
2195                 POSITION row = p_ptr->y + ddy[dir];
2196                 POSITION col = p_ptr->x + ddx[dir];
2197
2198                 /* Access grid */
2199                 c_ptr = &cave[row][col];
2200
2201                 /* Visible monsters abort running */
2202                 if (c_ptr->m_idx)
2203                 {
2204                         monster_type *m_ptr = &m_list[c_ptr->m_idx];
2205
2206                         /* Visible monster */
2207                         if (m_ptr->ml) return (0);
2208                 }
2209
2210         }
2211
2212         /* Travel cost of current grid */
2213         cost = travel.cost[p_ptr->y][p_ptr->x];
2214
2215         /* Determine travel direction */
2216         for (i = 0; i < 8; ++ i) {
2217                 int dir_cost = travel.cost[p_ptr->y+ddy_ddd[i]][p_ptr->x+ddx_ddd[i]];
2218
2219                 if (dir_cost < cost)
2220                 {
2221                         new_dir = ddd[i];
2222                         cost = dir_cost;
2223                 }
2224         }
2225
2226         if (!new_dir) return (0);
2227
2228         /* Access newly move grid */
2229         c_ptr = &cave[p_ptr->y+ddy[new_dir]][p_ptr->x+ddx[new_dir]];
2230
2231         /* Close door abort traveling */
2232         if (!easy_open && is_closed_door(c_ptr->feat)) return (0);
2233
2234         /* Visible and unignorable trap abort tarveling */
2235         if (!c_ptr->mimic && !trap_can_be_ignored(c_ptr->feat)) return (0);
2236
2237         /* Move new grid */
2238         return (new_dir);
2239 }
2240
2241
2242 /*!
2243  * @brief トラベル機能の実装 /
2244  * Travel command
2245  * @return なし
2246  */
2247 void travel_step(void)
2248 {
2249         /* Get travel direction */
2250         travel.dir = travel_test(travel.dir);
2251
2252         if (!travel.dir)
2253         {
2254                 if (travel.run == 255)
2255                 {
2256                         msg_print(_("道筋が見つかりません!", "No route is found!"));
2257                         travel.y = travel.x = 0;
2258                 }
2259                 disturb(FALSE, TRUE);
2260                 return;
2261         }
2262
2263         p_ptr->energy_use = 100;
2264
2265         move_player(travel.dir, always_pickup, FALSE);
2266
2267         if ((p_ptr->y == travel.y) && (p_ptr->x == travel.x))
2268         {
2269                 travel.run = 0;
2270                 travel.y = travel.x = 0;
2271         }
2272         else if (travel.run > 0)
2273                 travel.run--;
2274
2275         /* Travel Delay */
2276         Term_xtra(TERM_XTRA_DELAY, delay_factor);
2277 }
2278 #endif