* 2014 Deskull rearranged comment for Doxygen.
*/
-
-#include "angband.h"
+#include "system/angband.h"
#include "util.h"
+#include "system/system-variables.h"
+#include "core/stuff-handler.h"
+#include "gameterm.h"
#include "targeting.h"
-#include "bldg.h"
+#include "market/building.h"
#include "cmd-pet.h"
-#include "dungeon-file.h"
-#include "object-curse.h"
-#include "object-flavor.h"
-#include "monster.h"
-#include "monsterrace-hook.h"
-#include "objectkind-hook.h"
+#include "dungeon/dungeon-file.h"
+#include "object/object-curse.h"
+#include "object/object-flavor.h"
+#include "monster/monster.h"
+#include "monster/monsterrace-hook.h"
+#include "object/object-kind-hook.h"
#include "sort.h"
-#include "spells-summon.h"
-#include "grid.h"
-#include "floor.h"
-#include "floor-events.h"
-#include "floor-town.h"
-#include "player-move.h"
-#include "player-status.h"
-#include "monster-status.h"
-#include "view-mainwindow.h"
-#include "feature.h"
+#include "spell/spells-summon.h"
+#include "grid/grid.h"
+#include "floor/floor.h"
+#include "floor/floor-events.h"
+#include "floor/floor-town.h"
+#include "player-inventory.h"
+#include "player/player-move.h"
+#include "player/player-status.h"
+#include "monster/monster-status.h"
+#include "view/display-main-window.h"
+#include "grid/feature.h"
#include "quest.h"
-#include "dungeon.h"
-#include "spells.h"
-
-/*!
- * @brief コンソール上におけるマップ表示の左上位置を返す /
- * Calculates current boundaries Called below and from "do_cmd_locate()".
- * @return なし
- */
+#include "dungeon/dungeon.h"
+#include "world/world.h"
+#include "effect/spells-effect-util.h"
+
+ /*!
+ * @brief コンソール上におけるマップ表示の左上位置を返す /
+ * Calculates current boundaries Called below and from "do_cmd_locate()".
+ * @return なし
+ */
void panel_bounds_center(void)
{
TERM_LEN wid, hgt;
/*!
* @brief フォーカスを当てるべきマップ描画の基準座標を指定する
+ * @param creature_ptr プレーヤーへの参照ポインタ
* @param y 変更先のフロアY座標
* @param x 変更先のフロアX座標
* @details
* Also used in do_cmd_locate
* @return 実際に再描画が必要だった場合TRUEを返す
*/
-static bool change_panel_xy(POSITION y, POSITION x)
+static bool change_panel_xy(player_type *creature_ptr, POSITION y, POSITION x)
{
POSITION dy = 0, dx = 0;
TERM_LEN wid, hgt;
-
get_screen_size(&wid, &hgt);
if (y < panel_row_min) dy = -1;
if (x < panel_col_min) dx = -1;
if (x > panel_col_max) dx = 1;
- if (!dy && !dx) return (FALSE);
+ if (!dy && !dx) return FALSE;
- return change_panel(dy, dx);
+ return change_panel(creature_ptr, dy, dx);
}
/*!
* @brief マップ描画のフォーカスを当てるべき座標を更新する
+ * @param creature_ptr プレーヤーへの参照ポインタ
* @details
* Given an row (y) and col (x), this routine detects when a move
* off the screen has occurred and figures new borders. -RAK-
* The map is reprinted if necessary, and "TRUE" is returned.
* @return 実際に再描画が必要だった場合TRUEを返す
*/
-void verify_panel(void)
+void verify_panel(player_type *creature_ptr)
{
- POSITION y = p_ptr->y;
- POSITION x = p_ptr->x;
+ POSITION y = creature_ptr->y;
+ POSITION x = creature_ptr->x;
TERM_LEN wid, hgt;
- int prow_min;
- int pcol_min;
- int max_prow_min;
- int max_pcol_min;
-
get_screen_size(&wid, &hgt);
- max_prow_min = current_floor_ptr->height - hgt;
- max_pcol_min = current_floor_ptr->width - wid;
+ int max_prow_min = creature_ptr->current_floor_ptr->height - hgt;
+ int max_pcol_min = creature_ptr->current_floor_ptr->width - wid;
/* Bounds checking */
+ int prow_min;
+ int pcol_min;
if (max_prow_min < 0) max_prow_min = 0;
if (max_pcol_min < 0) max_pcol_min = 0;
- /* Center on player */
- if (center_player && (center_running || !running))
+ /* Center on player */
+ if (center_player && (center_running || !creature_ptr->running))
{
/* Center vertically */
prow_min = y - hgt / 2;
/* Scroll screen when 2 grids from top/bottom edge */
if (y > panel_row_max - 2)
{
- while (y > prow_min + hgt-1 - 2)
+ while (y > prow_min + hgt - 1 - 2)
{
prow_min += (hgt / 2);
}
/* Scroll screen when 4 grids from left/right edge */
if (x > panel_col_max - 4)
{
- while (x > pcol_min + wid-1 - 4)
+ while (x > pcol_min + wid - 1 - 4)
{
pcol_min += (wid / 2);
}
}
-
+
if (x < panel_col_min + 4)
{
while (x < pcol_min + 4)
panel_col_min = pcol_min;
/* Hack -- optional disturb on "panel change" */
- if (disturb_panel && !center_player) disturb(FALSE, FALSE);
+ if (disturb_panel && !center_player) disturb(creature_ptr, FALSE, FALSE);
panel_bounds_center();
- p_ptr->update |= (PU_MONSTERS);
- p_ptr->redraw |= (PR_MAP);
- p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
}
-/*** Targeting Code ***/
-
/*
* Determine is a monster makes a reasonable target
*
* Future versions may restrict the ability to target "trappers"
* and "mimics", but the semantics is a little bit weird.
*/
-bool target_able(MONSTER_IDX m_idx)
+bool target_able(player_type *creature_ptr, MONSTER_IDX m_idx)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
+ monster_type *m_ptr = &floor_ptr->m_list[m_idx];
/* Monster must be alive */
- if (!monster_is_valid(m_ptr)) return (FALSE);
+ if (!monster_is_valid(m_ptr)) return FALSE;
/* Hack -- no targeting hallucinations */
- if (p_ptr->image) return (FALSE);
+ if (creature_ptr->image) return FALSE;
/* Monster must be visible */
- if (!m_ptr->ml) return (FALSE);
+ if (!m_ptr->ml) return FALSE;
- if (p_ptr->riding && (p_ptr->riding == m_idx)) return (TRUE);
+ if (creature_ptr->riding && (creature_ptr->riding == m_idx)) return TRUE;
/* Monster must be projectable */
- if (!projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)) return (FALSE);
+ if (!projectable(creature_ptr, creature_ptr->y, creature_ptr->x, m_ptr->fy, m_ptr->fx)) return FALSE;
/* Hack -- Never target trappers */
- /* if (CLEAR_ATTR && (CLEAR_CHAR)) return (FALSE); */
+ /* if (CLEAR_ATTR && (CLEAR_CHAR)) return FALSE; */
/* Assume okay */
- return (TRUE);
+ return TRUE;
}
-
+/*
+ * Targetting variables
+ */
+MONSTER_IDX target_who;
+POSITION target_col;
+POSITION target_row;
/*
* Update (if necessary) and verify (if possible) the target.
*
* We return TRUE if the target is "okay" and FALSE otherwise.
*/
-bool target_okay(void)
+bool target_okay(player_type *creature_ptr)
{
/* Accept stationary targets */
- if (target_who < 0) return (TRUE);
+ if (target_who < 0) return TRUE;
/* Check moving targets */
- if (target_who > 0)
- {
- /* Accept reasonable targets */
- if (target_able(target_who))
- {
- monster_type *m_ptr = ¤t_floor_ptr->m_list[target_who];
+ if (target_who <= 0) return FALSE;
- /* Acquire monster location */
- target_row = m_ptr->fy;
- target_col = m_ptr->fx;
+ /* Accept reasonable targets */
+ if (!target_able(creature_ptr, target_who)) return FALSE;
- /* Good target */
- return (TRUE);
- }
- }
+ monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[target_who];
+
+ /* Acquire monster location */
+ target_row = m_ptr->fy;
+ target_col = m_ptr->fx;
- /* Assume no target */
- return (FALSE);
+ /* Good target */
+ return TRUE;
}
*/
static POSITION_IDX target_pick(POSITION y1, POSITION x1, POSITION dy, POSITION dx)
{
- POSITION_IDX i, v;
- POSITION x2, y2, x3, y3, x4, y4;
- POSITION_IDX b_i = -1, b_v = 9999;
-
-
/* Scan the locations */
- for (i = 0; i < tmp_pos.n; i++)
+ POSITION_IDX b_i = -1, b_v = 9999;
+ for (POSITION_IDX i = 0; i < tmp_pos.n; i++)
{
/* Point 2 */
- x2 = tmp_pos.x[i];
- y2 = tmp_pos.y[i];
+ POSITION x2 = tmp_pos.x[i];
+ POSITION y2 = tmp_pos.y[i];
/* Directed distance */
- x3 = (x2 - x1);
- y3 = (y2 - y1);
+ POSITION x3 = (x2 - x1);
+ POSITION y3 = (y2 - y1);
/* Verify quadrant */
if (dx && (x3 * dx <= 0)) continue;
if (dy && (y3 * dy <= 0)) continue;
- x4 = ABS(x3);
- y4 = ABS(y3);
+ POSITION x4 = ABS(x3);
+ POSITION y4 = ABS(y3);
/* Verify quadrant */
if (dy && !dx && (x4 > y4)) continue;
if (dx && !dy && (y4 > x4)) continue;
/* Approximate Double Distance */
- v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4));
+ POSITION_IDX v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4));
/* Penalize location */
if ((b_i >= 0) && (v >= b_v)) continue;
b_i = i; b_v = v;
}
- return (b_i);
+
+ return b_i;
}
/*
* Hack -- determine if a given location is "interesting"
*/
-static bool target_set_accept(POSITION y, POSITION x)
+static bool target_set_accept(player_type *creature_ptr, POSITION y, POSITION x)
{
- grid_type *g_ptr;
- OBJECT_IDX this_o_idx, next_o_idx = 0;
-
- if (!(in_bounds(y, x))) return (FALSE);
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
+ if (!(in_bounds(floor_ptr, y, x))) return FALSE;
/* Player grid is always interesting */
- if (player_bold(y, x)) return (TRUE);
+ if (player_bold(creature_ptr, y, x)) return TRUE;
- if (p_ptr->image) return (FALSE);
+ if (creature_ptr->image) return FALSE;
- g_ptr = ¤t_floor_ptr->grid_array[y][x];
+ grid_type *g_ptr;
+ g_ptr = &floor_ptr->grid_array[y][x];
/* Visible monsters */
if (g_ptr->m_idx)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
+ monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
/* Visible monsters */
- if (m_ptr->ml) return (TRUE);
+ if (m_ptr->ml) return TRUE;
}
/* Scan all objects in the grid */
- for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
+ OBJECT_IDX next_o_idx = 0;
+ for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
{
object_type *o_ptr;
- o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
+ o_ptr = &floor_ptr->o_list[this_o_idx];
next_o_idx = o_ptr->next_o_idx;
/* Memorized object */
- if (o_ptr->marked & OM_FOUND) return (TRUE);
+ if (o_ptr->marked & OM_FOUND) return TRUE;
}
/* Interesting memorized features */
if (g_ptr->info & (CAVE_MARK))
{
/* Notice object features */
- if (g_ptr->info & CAVE_OBJECT) return (TRUE);
+ if (g_ptr->info & CAVE_OBJECT) return TRUE;
/* Feature code (applying "mimic" field) */
if (have_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_NOTICE)) return TRUE;
}
- return (FALSE);
+ return FALSE;
}
*
* Return the number of target_able monsters in the set.
*/
-static void target_set_prepare(BIT_FLAGS mode)
+static void target_set_prepare(player_type *creature_ptr, BIT_FLAGS mode)
{
- POSITION y, x;
POSITION min_hgt, max_hgt, min_wid, max_wid;
-
if (mode & TARGET_KILL)
{
/* Inner range */
- min_hgt = MAX((p_ptr->y - MAX_RANGE), 0);
- max_hgt = MIN((p_ptr->y + MAX_RANGE), current_floor_ptr->height - 1);
- min_wid = MAX((p_ptr->x - MAX_RANGE), 0);
- max_wid = MIN((p_ptr->x + MAX_RANGE), current_floor_ptr->width - 1);
+ min_hgt = MAX((creature_ptr->y - MAX_RANGE), 0);
+ max_hgt = MIN((creature_ptr->y + MAX_RANGE), creature_ptr->current_floor_ptr->height - 1);
+ min_wid = MAX((creature_ptr->x - MAX_RANGE), 0);
+ max_wid = MIN((creature_ptr->x + MAX_RANGE), creature_ptr->current_floor_ptr->width - 1);
}
else /* not targetting */
{
tmp_pos.n = 0;
/* Scan the current panel */
- for (y = min_hgt; y <= max_hgt; y++)
+ for (POSITION y = min_hgt; y <= max_hgt; y++)
{
- for (x = min_wid; x <= max_wid; x++)
+ for (POSITION x = min_wid; x <= max_wid; x++)
{
grid_type *g_ptr;
/* Require "interesting" contents */
- if (!target_set_accept(y, x)) continue;
+ if (!target_set_accept(creature_ptr, y, x)) continue;
- g_ptr = ¤t_floor_ptr->grid_array[y][x];
+ g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
/* Require target_able monsters for "TARGET_KILL" */
- if ((mode & (TARGET_KILL)) && !target_able(g_ptr->m_idx)) continue;
+ if ((mode & (TARGET_KILL)) && !target_able(creature_ptr, g_ptr->m_idx)) continue;
- if ((mode & (TARGET_KILL)) && !target_pet && is_pet(¤t_floor_ptr->m_list[g_ptr->m_idx])) continue;
+ if ((mode & (TARGET_KILL)) && !target_pet && is_pet(&creature_ptr->current_floor_ptr->m_list[g_ptr->m_idx])) continue;
/* Save the location */
tmp_pos.x[tmp_pos.n] = x;
ang_sort(tmp_pos.x, tmp_pos.y, tmp_pos.n, ang_sort_comp_importance, ang_sort_swap_distance);
}
- if (p_ptr->riding && target_pet && (tmp_pos.n > 1) && (mode & (TARGET_KILL)))
- {
- POSITION tmp;
-
- tmp = tmp_pos.y[0];
- tmp_pos.y[0] = tmp_pos.y[1];
- tmp_pos.y[1] = tmp;
- tmp = tmp_pos.x[0];
- tmp_pos.x[0] = tmp_pos.x[1];
- tmp_pos.x[1] = tmp;
- }
+ if (creature_ptr->riding == 0 || !target_pet || (tmp_pos.n <= 1) || !(mode & (TARGET_KILL)))
+ return;
+
+ POSITION tmp = tmp_pos.y[0];
+ tmp_pos.y[0] = tmp_pos.y[1];
+ tmp_pos.y[1] = tmp;
+ tmp = tmp_pos.x[0];
+ tmp_pos.x[0] = tmp_pos.x[1];
+ tmp_pos.x[1] = tmp;
}
-void target_set_prepare_look(void){
- target_set_prepare(TARGET_LOOK);
+
+void target_set_prepare_look(player_type *creature_ptr)
+{
+ target_set_prepare(creature_ptr, TARGET_LOOK);
}
/*
* Evaluate number of kill needed to gain level
*/
-static void evaluate_monster_exp(char *buf, monster_type *m_ptr)
+static void evaluate_monster_exp(player_type *creature_ptr, char *buf, monster_type *m_ptr)
{
monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
u32b num;
s32b exp_mon, exp_adv;
u32b exp_mon_frac, exp_adv_frac;
- if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->prace == RACE_ANDROID))
+ if ((creature_ptr->lev >= PY_MAX_LEVEL) || (creature_ptr->prace == RACE_ANDROID))
{
- sprintf(buf,"**");
+ sprintf(buf, "**");
return;
}
else if (!ap_r_ptr->r_tkills || (m_ptr->mflag2 & MFLAG2_KAGE))
{
- if (!p_ptr->wizard)
+ if (!current_world_ptr->wizard)
{
- sprintf(buf,"??");
+ sprintf(buf, "??");
return;
}
}
-
/* The monster's experience point (assuming average monster speed) */
exp_mon = ap_r_ptr->mexp * ap_r_ptr->level;
exp_mon_frac = 0;
- s64b_div(&exp_mon, &exp_mon_frac, 0, (p_ptr->max_plv + 2));
+ s64b_div(&exp_mon, &exp_mon_frac, 0, (creature_ptr->max_plv + 2));
/* Total experience value for next level */
- exp_adv = player_exp[p_ptr->lev -1] * p_ptr->expfact;
+ exp_adv = player_exp[creature_ptr->lev - 1] * creature_ptr->expfact;
exp_adv_frac = 0;
s64b_div(&exp_adv, &exp_adv_frac, 0, 100);
/* Experience value need to get */
- s64b_sub(&exp_adv, &exp_adv_frac, p_ptr->exp, p_ptr->exp_frac);
+ s64b_sub(&exp_adv, &exp_adv_frac, creature_ptr->exp, creature_ptr->exp_frac);
/* You need to kill at least one monster to get any experience */
num = MIN(999, exp_adv_frac);
/* Display the number */
- sprintf(buf,"%03ld", (long int)num);
+ sprintf(buf, "%03ld", (long int)num);
}
* recall info and the health bar info to track that monster.
*
* Eventually, we may allow multiple objects per grid, or objects
- * and terrain features in the same grid.
+ * and terrain features in the same grid.
*
* This function must handle blindness/hallucination.
*/
-static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, concptr info)
+static char target_set_aux(player_type *subject_ptr, POSITION y, POSITION x, BIT_FLAGS mode, concptr info)
{
- grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
- OBJECT_IDX this_o_idx, next_o_idx = 0;
+ OBJECT_IDX next_o_idx = 0;
concptr s1 = "", s2 = "", s3 = "", x_info = "";
bool boring = TRUE;
FEAT_IDX feat;
feature_type *f_ptr;
char query = '\001';
- char out_val[MAX_NLEN+80];
+ char out_val[MAX_NLEN + 80];
OBJECT_IDX floor_list[23];
ITEM_NUMBER floor_num = 0;
/* Scan all objects in the grid */
if (easy_floor)
{
- floor_num = scan_floor(floor_list, y, x, 0x02);
+ floor_num = scan_floor(subject_ptr, floor_list, y, x, 0x02, 0);
if (floor_num)
{
}
/* Hack -- under the player */
- if (player_bold(y, x))
+ if (player_bold(subject_ptr, y, x))
{
#ifdef JP
s1 = "あなたは";
}
/* Hack -- hallucination */
- if (p_ptr->image)
+ if (subject_ptr->image)
{
concptr name = _("何か奇妙な物", "something strange");
return 0;
}
-
/* Actual monsters */
- if (g_ptr->m_idx && current_floor_ptr->m_list[g_ptr->m_idx].ml)
+ grid_type *g_ptr = &subject_ptr->current_floor_ptr->grid_array[y][x];
+ if (g_ptr->m_idx && subject_ptr->current_floor_ptr->m_list[g_ptr->m_idx].ml)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
+ monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
GAME_TEXT m_name[MAX_NLEN];
bool recall = FALSE;
/* Not boring */
boring = FALSE;
- monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
- monster_race_track(m_ptr->ap_r_idx);
- health_track(g_ptr->m_idx);
- handle_stuff();
+ monster_desc(subject_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
+ monster_race_track(subject_ptr, m_ptr->ap_r_idx);
+ health_track(subject_ptr, g_ptr->m_idx);
+ handle_stuff(subject_ptr);
/* Interact */
- while (1)
+ while (TRUE)
{
char acount[10];
- /* Recall */
if (recall)
{
screen_save();
/* Recall on screen */
- screen_roff(m_ptr->ap_r_idx, 0);
+ screen_roff(subject_ptr, m_ptr->ap_r_idx, 0);
/* Hack -- Complete the prompt (again) */
Term_addstr(-1, TERM_WHITE, format(_(" [r思 %s%s]", " [r,%s%s]"), x_info, info));
/* Normal commands */
if (query != 'r') break;
- /* Toggle recall */
recall = FALSE;
/* Cleare recall text and repeat */
/*** Normal ***/
/* Describe, and prompt for recall */
- evaluate_monster_exp(acount, m_ptr);
+ evaluate_monster_exp(subject_ptr, acount, m_ptr);
#ifdef JP
sprintf(out_val, "[%s]%s%s(%s)%s%s [r思 %s%s]", acount, s1, m_name, look_mon_desc(m_ptr, 0x01), s2, s3, x_info, info);
/* Normal commands */
if (query != 'r') break;
- /* Toggle recall */
recall = TRUE;
}
s2 = "carrying ";
#endif
-
/* Scan all objects being carried */
- for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
+ for (OBJECT_IDX this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
{
GAME_TEXT o_name[MAX_NLEN];
object_type *o_ptr;
- o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
+ o_ptr = &subject_ptr->current_floor_ptr->o_list[this_o_idx];
next_o_idx = o_ptr->next_o_idx;
- object_desc(o_name, o_ptr, 0);
+ object_desc(subject_ptr, o_name, o_ptr, 0);
#ifdef JP
sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info);
{
int min_width = 0;
- while (1)
+ while (TRUE)
{
if (floor_num == 1)
{
GAME_TEXT o_name[MAX_NLEN];
object_type *o_ptr;
- o_ptr = ¤t_floor_ptr->o_list[floor_list[0]];
+ o_ptr = &subject_ptr->current_floor_ptr->o_list[floor_list[0]];
- object_desc(o_name, o_ptr, 0);
+ object_desc(subject_ptr, o_name, o_ptr, 0);
#ifdef JP
sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info);
/** Display list of items **/
/* Continue scrolling list if requested */
- while (1)
+ while (TRUE)
{
int i;
OBJECT_IDX o_idx;
/* Display */
show_gold_on_floor = TRUE;
- (void)show_floor(0, y, x, &min_width);
+ (void)show_floor(subject_ptr, 0, y, x, &min_width, 0);
show_gold_on_floor = FALSE;
/* Prompt */
/* Get the object being moved. */
o_idx = g_ptr->o_idx;
-
+
/* Only rotate a pile of two or more objects. */
- if (!(o_idx && current_floor_ptr->o_list[o_idx].next_o_idx)) continue;
+ if (!(o_idx && subject_ptr->current_floor_ptr->o_list[o_idx].next_o_idx)) continue;
/* Remove the first object from the list. */
- excise_object_idx(o_idx);
+ excise_object_idx(subject_ptr->current_floor_ptr, o_idx);
/* Find end of the list. */
i = g_ptr->o_idx;
- while (current_floor_ptr->o_list[i].next_o_idx)
- i = current_floor_ptr->o_list[i].next_o_idx;
+ while (subject_ptr->current_floor_ptr->o_list[i].next_o_idx)
+ i = subject_ptr->current_floor_ptr->o_list[i].next_o_idx;
/* Add after the last object. */
- current_floor_ptr->o_list[i].next_o_idx = o_idx;
+ subject_ptr->current_floor_ptr->o_list[i].next_o_idx = o_idx;
/* Loop and re-display the list */
}
}
/* Scan all objects in the grid */
- for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
+ for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
{
object_type *o_ptr;
- o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
+ o_ptr = &subject_ptr->current_floor_ptr->o_list[this_o_idx];
next_o_idx = o_ptr->next_o_idx;
if (o_ptr->marked & OM_FOUND)
/* Not boring */
boring = FALSE;
- object_desc(o_name, o_ptr, 0);
+ object_desc(subject_ptr, o_name, o_ptr, 0);
#ifdef JP
sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info);
}
}
-
/* Feature code (applying "mimic" field) */
feat = get_feat_mimic(g_ptr);
/* Require knowledge about grid, or ability to see grid */
- if (!(g_ptr->info & CAVE_MARK) && !player_can_see_bold(y, x))
+ if (!(g_ptr->info & CAVE_MARK) && !player_can_see_bold(subject_ptr, y, x))
{
/* Forget feature */
feat = feat_none;
f_ptr = &f_info[feat];
/* Terrain feature if needed */
- if (boring || have_flag(f_ptr->flags, FF_REMEMBER))
+ if (!boring && !have_flag(f_ptr->flags, FF_REMEMBER))
{
- concptr name;
-
- /* Hack -- special handling for quest entrances */
- if (have_flag(f_ptr->flags, FF_QUEST_ENTER))
- {
- /* Set the quest number temporary */
- IDX old_quest = p_ptr->inside_quest;
- int j;
+ if ((query != '\r') && (query != '\n')) return query;
+ return 0;
+ }
- /* Clear the text */
- for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
- quest_text_line = 0;
+ /* Hack -- special handling for quest entrances */
+ concptr name;
+ if (have_flag(f_ptr->flags, FF_QUEST_ENTER))
+ {
+ /* Set the quest number temporary */
+ IDX old_quest = subject_ptr->current_floor_ptr->inside_quest;
+ int j;
- p_ptr->inside_quest = g_ptr->special;
+ /* Clear the text */
+ for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
+ quest_text_line = 0;
- /* Get the quest text */
- init_flags = INIT_NAME_ONLY;
+ subject_ptr->current_floor_ptr->inside_quest = g_ptr->special;
- process_dungeon_file("q_info.txt", 0, 0, 0, 0);
+ /* Get the quest text */
+ init_flags = INIT_NAME_ONLY;
- name = format(_("クエスト「%s」(%d階相当)", "the entrance to the quest '%s'(level %d)"),
- quest[g_ptr->special].name, quest[g_ptr->special].level);
+ process_dungeon_file(subject_ptr, "q_info.txt", 0, 0, 0, 0);
- /* Reset the old quest number */
- p_ptr->inside_quest = old_quest;
- }
+ name = format(_("クエスト「%s」(%d階相当)", "the entrance to the quest '%s'(level %d)"),
+ quest[g_ptr->special].name, quest[g_ptr->special].level);
- /* Hack -- special handling for building doors */
- else if (have_flag(f_ptr->flags, FF_BLDG) && !p_ptr->inside_arena)
- {
- name = building[f_ptr->subtype].name;
- }
- else if (have_flag(f_ptr->flags, FF_ENTRANCE))
- {
- name = format(_("%s(%d階相当)", "%s(level %d)"), d_text + d_info[g_ptr->special].text, d_info[g_ptr->special].mindepth);
- }
- else if (have_flag(f_ptr->flags, FF_TOWN))
- {
- name = town_info[g_ptr->special].name;
- }
- else if (p_ptr->wild_mode && (feat == feat_floor))
- {
- name = _("道", "road");
- }
- else
- {
- name = f_name + f_ptr->name;
- }
+ /* Reset the old quest number */
+ subject_ptr->current_floor_ptr->inside_quest = old_quest;
+ }
+ /* Hack -- special handling for building doors */
+ else if (have_flag(f_ptr->flags, FF_BLDG) && !subject_ptr->current_floor_ptr->inside_arena)
+ {
+ name = building[f_ptr->subtype].name;
+ }
+ else if (have_flag(f_ptr->flags, FF_ENTRANCE))
+ {
+ name = format(_("%s(%d階相当)", "%s(level %d)"), d_text + d_info[g_ptr->special].text, d_info[g_ptr->special].mindepth);
+ }
+ else if (have_flag(f_ptr->flags, FF_TOWN))
+ {
+ name = town_info[g_ptr->special].name;
+ }
+ else if (subject_ptr->wild_mode && (feat == feat_floor))
+ {
+ name = _("道", "road");
+ }
+ else
+ {
+ name = f_name + f_ptr->name;
+ }
- /* Pick a prefix */
- if (*s2 &&
- ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) ||
- (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE)) ||
- have_flag(f_ptr->flags, FF_TOWN)))
- {
- s2 = _("の中", "in ");
- }
+ /* Pick a prefix */
+ if (*s2 &&
+ ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) ||
+ (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE)) ||
+ have_flag(f_ptr->flags, FF_TOWN)))
+ {
+ s2 = _("の中", "in ");
+ }
- /* Hack -- special introduction for store & building doors -KMW- */
- if (have_flag(f_ptr->flags, FF_STORE) ||
- have_flag(f_ptr->flags, FF_QUEST_ENTER) ||
- (have_flag(f_ptr->flags, FF_BLDG) && !p_ptr->inside_arena) ||
- have_flag(f_ptr->flags, FF_ENTRANCE))
- {
- s2 = _("の入口", "");
- }
-#ifndef JP
- else if (have_flag(f_ptr->flags, FF_FLOOR) ||
- have_flag(f_ptr->flags, FF_TOWN) ||
- have_flag(f_ptr->flags, FF_SHALLOW) ||
- have_flag(f_ptr->flags, FF_DEEP))
- {
- s3 ="";
- }
- else
- {
- /* Pick proper indefinite article */
- s3 = (is_a_vowel(name[0])) ? "an " : "a ";
- }
+ /* Hack -- special introduction for store & building doors -KMW- */
+ if (have_flag(f_ptr->flags, FF_STORE) ||
+ have_flag(f_ptr->flags, FF_QUEST_ENTER) ||
+ (have_flag(f_ptr->flags, FF_BLDG) && !subject_ptr->current_floor_ptr->inside_arena) ||
+ have_flag(f_ptr->flags, FF_ENTRANCE))
+ {
+ s2 = _("の入口", "");
+ }
+#ifdef JP
+#else
+ else if (have_flag(f_ptr->flags, FF_FLOOR) ||
+ have_flag(f_ptr->flags, FF_TOWN) ||
+ have_flag(f_ptr->flags, FF_SHALLOW) ||
+ have_flag(f_ptr->flags, FF_DEEP))
+ {
+ s3 = "";
+ }
+ else
+ {
+ /* Pick proper indefinite article */
+ s3 = (is_a_vowel(name[0])) ? "an " : "a ";
+ }
#endif
- /* Display a message */
- if (p_ptr->wizard)
- {
- char f_idx_str[32];
- if (g_ptr->mimic) sprintf(f_idx_str, "%d/%d", g_ptr->feat, g_ptr->mimic);
- else sprintf(f_idx_str, "%d", g_ptr->feat);
+ /* Display a message */
+ if (current_world_ptr->wizard)
+ {
+ char f_idx_str[32];
+ if (g_ptr->mimic) sprintf(f_idx_str, "%d/%d", g_ptr->feat, g_ptr->mimic);
+ else sprintf(f_idx_str, "%d", g_ptr->feat);
#ifdef JP
- sprintf(out_val, "%s%s%s%s[%s] %x %s %d %d %d (%d,%d) %d", s1, name, s2, s3, info, (unsigned int)g_ptr->info, f_idx_str, g_ptr->dist, g_ptr->cost, g_ptr->when, (int)y, (int)x, travel.cost[y][x]);
+ sprintf(out_val, "%s%s%s%s[%s] %x %s %d %d %d (%d,%d) %d", s1, name, s2, s3, info, (unsigned int)g_ptr->info, f_idx_str, g_ptr->dist, g_ptr->cost, g_ptr->when, (int)y, (int)x, travel.cost[y][x]);
#else
- sprintf(out_val, "%s%s%s%s [%s] %x %s %d %d %d (%d,%d)", s1, s2, s3, name, info, g_ptr->info, f_idx_str, g_ptr->dist, g_ptr->cost, g_ptr->when, (int)y, (int)x);
+ sprintf(out_val, "%s%s%s%s [%s] %x %s %d %d %d (%d,%d)", s1, s2, s3, name, info, g_ptr->info, f_idx_str, g_ptr->dist, g_ptr->cost, g_ptr->when, (int)y, (int)x);
#endif
- }
- else
+ }
+ else
#ifdef JP
- sprintf(out_val, "%s%s%s%s[%s]", s1, name, s2, s3, info);
+ sprintf(out_val, "%s%s%s%s[%s]", s1, name, s2, s3, info);
#else
- sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, info);
+ sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, info);
#endif
- prt(out_val, 0, 0);
- move_cursor_relative(y, x);
- query = inkey();
-
- /* Always stop at "normal" keys */
- if ((query != '\r') && (query != '\n') && (query != ' ')) return query;
- }
-
- /* Stop on everything but "return" */
- if ((query != '\r') && (query != '\n')) return query;
+ prt(out_val, 0, 0);
+ move_cursor_relative(y, x);
+ query = inkey();
- /* Repeat forever */
+ if ((query != '\r') && (query != '\n') && (query != ' ')) return query;
return 0;
}
*
* All locations must be on the current panel. Consider the use of
* "panel_bounds()" to allow "off-panel" targets, perhaps by using
- * some form of "scrolling" the map around the cursor.
+ * some form of "scrolling" the map around the cursor.
* That is, consider the possibility of "auto-scrolling" the screen
* while the cursor moves around. This may require changes in the
* "update_monster()" code to allow "visibility" even if off panel, and
* This command will cancel any old target, even if used from
* inside the "look" command.
*/
-bool target_set(BIT_FLAGS mode)
+bool target_set(player_type *creature_ptr, BIT_FLAGS mode)
{
- int i, d, m, t, bd;
- POSITION y = p_ptr->y;
- POSITION x = p_ptr->x;
+ int i, d, t, bd;
+ POSITION y = creature_ptr->y;
+ POSITION x = creature_ptr->x;
bool done = FALSE;
bool flag = TRUE;
char same_key;
grid_type *g_ptr;
TERM_LEN wid, hgt;
-
+
get_screen_size(&wid, &hgt);
/* Cancel target */
}
/* Prepare the "temp" array */
- target_set_prepare(mode);
+ target_set_prepare(creature_ptr, mode);
/* Start near the player */
- m = 0;
+ int m = 0;
/* Interact */
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
while (!done)
{
/* Interesting grids */
x = tmp_pos.x[m];
/* Set forcus */
- change_panel_xy(y, x);
+ change_panel_xy(creature_ptr, y, x);
- if (!(mode & TARGET_LOOK)) prt_path(y, x);
+ if (!(mode & TARGET_LOOK)) print_path(creature_ptr, y, x);
/* Access */
- g_ptr = ¤t_floor_ptr->grid_array[y][x];
+ g_ptr = &floor_ptr->grid_array[y][x];
/* Allow target */
- if (target_able(g_ptr->m_idx))
+ if (target_able(creature_ptr, g_ptr->m_idx))
{
strcpy(info, _("q止 t決 p自 o現 +次 -前", "q,t,p,o,+,-,<dir>"));
}
{
char cheatinfo[30];
sprintf(cheatinfo, " LOS:%d, PROJECTABLE:%d",
- los(p_ptr->y, p_ptr->x, y, x), projectable(p_ptr->y, p_ptr->x, y, x));
+ los(creature_ptr, creature_ptr->y, creature_ptr->x, y, x), projectable(creature_ptr, creature_ptr->y, creature_ptr->x, y, x));
strcat(info, cheatinfo);
}
-
+
/* Describe and Prompt */
- while (TRUE){
- query = target_set_aux(y, x, mode, info);
- if(query)break;
+ while (TRUE)
+ {
+ query = target_set_aux(creature_ptr, y, x, mode, info);
+ if (query)break;
}
/* Assume no "direction" */
if (use_menu)
{
if (query == '\r') query = 't';
- }
+ }
/* Analyze */
switch (query)
{
- case ESCAPE:
- case 'q':
+ case ESCAPE:
+ case 'q':
+ {
+ done = TRUE;
+ break;
+ }
+
+ case 't':
+ case '.':
+ case '5':
+ case '0':
+ {
+ if (target_able(creature_ptr, g_ptr->m_idx))
{
+ health_track(creature_ptr, g_ptr->m_idx);
+ target_who = g_ptr->m_idx;
+ target_row = y;
+ target_col = x;
done = TRUE;
- break;
}
-
- case 't':
- case '.':
- case '5':
- case '0':
+ else
{
- if (target_able(g_ptr->m_idx))
- {
- health_track(g_ptr->m_idx);
- target_who = g_ptr->m_idx;
- target_row = y;
- target_col = x;
- done = TRUE;
- }
- else
- {
- bell();
- }
- break;
+ bell();
}
+ break;
+ }
- case ' ':
- case '*':
- case '+':
+ case ' ':
+ case '*':
+ case '+':
+ {
+ if (++m == tmp_pos.n)
{
- if (++m == tmp_pos.n)
- {
- m = 0;
- if (!expand_list) done = TRUE;
- }
- break;
+ m = 0;
+ if (!expand_list) done = TRUE;
}
+ break;
+ }
- case '-':
+ case '-':
+ {
+ if (m-- == 0)
{
- if (m-- == 0)
- {
- m = tmp_pos.n - 1;
- if (!expand_list) done = TRUE;
- }
- break;
+ m = tmp_pos.n - 1;
+ if (!expand_list) done = TRUE;
}
+ break;
+ }
- case 'p':
- {
- /* Recenter the map around the player */
- verify_panel();
- p_ptr->update |= (PU_MONSTERS);
- p_ptr->redraw |= (PR_MAP);
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
-
- /* Recalculate interesting grids */
- target_set_prepare(mode);
-
- y = p_ptr->y;
- x = p_ptr->x;
- }
+ case 'p':
+ {
+ /* Recenter the map around the player */
+ verify_panel(creature_ptr);
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
+
+ /* Recalculate interesting grids */
+ target_set_prepare(creature_ptr, mode);
+
+ y = creature_ptr->y;
+ x = creature_ptr->x;
+ }
+ /* Fall through */
- case 'o':
- {
- flag = FALSE;
- break;
- }
+ case 'o':
+ {
+ flag = FALSE;
+ break;
+ }
- case 'm':
- {
- break;
- }
+ case 'm':
+ {
+ break;
+ }
- default:
+ default:
+ {
+ if (query == same_key)
{
- if(query == same_key)
+ if (++m == tmp_pos.n)
{
- if (++m == tmp_pos.n)
- {
- m = 0;
- if (!expand_list) done = TRUE;
- }
+ m = 0;
+ if (!expand_list) done = TRUE;
}
- else
- {
- /* Extract the action (if any) */
- d = get_keymap_dir(query);
+ }
+ else
+ {
+ /* Extract the action (if any) */
+ d = get_keymap_dir(query);
- if (!d) bell();
- break;
- }
+ if (!d) bell();
+ break;
}
}
+ }
/* Hack -- move around */
if (d)
{
while (flag && (i < 0))
{
/* Note the change */
- if (change_panel(ddy[d], ddx[d]))
+ if (change_panel(creature_ptr, ddy[d], ddx[d]))
{
int v = tmp_pos.y[m];
int u = tmp_pos.x[m];
/* Recalculate interesting grids */
- target_set_prepare(mode);
+ target_set_prepare(creature_ptr, mode);
/* Look at interesting grids */
flag = TRUE;
/* Use that grid */
if (i >= 0) m = i;
+ continue;
}
/* Nothing interesting */
- else
- {
- POSITION dx = ddx[d];
- POSITION dy = ddy[d];
+ POSITION dx = ddx[d];
+ POSITION dy = ddy[d];
- /* Restore previous position */
- panel_row_min = y2;
- panel_col_min = x2;
- panel_bounds_center();
+ /* Restore previous position */
+ panel_row_min = y2;
+ panel_col_min = x2;
+ panel_bounds_center();
- p_ptr->update |= (PU_MONSTERS);
- p_ptr->redraw |= (PR_MAP);
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
- /* Recalculate interesting grids */
- target_set_prepare(mode);
-
- /* Look at boring grids */
- flag = FALSE;
-
- /* Move */
- x += dx;
- y += dy;
-
- /* Do not move horizontally if unnecessary */
- if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
- ((x > panel_col_min + wid / 2) && (dx < 0)))
- {
- dx = 0;
- }
-
- /* Do not move vertically if unnecessary */
- if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
- ((y > panel_row_min + hgt / 2) && (dy < 0)))
- {
- dy = 0;
- }
-
- /* Apply the motion */
- if ((y >= panel_row_min+hgt) || (y < panel_row_min) ||
- (x >= panel_col_min+wid) || (x < panel_col_min))
- {
- if (change_panel(dy, dx)) target_set_prepare(mode);
- }
-
- /* Slide into legality */
- if (x >= current_floor_ptr->width-1) x = current_floor_ptr->width - 2;
- else if (x <= 0) x = 1;
-
- /* Slide into legality */
- if (y >= current_floor_ptr->height-1) y = current_floor_ptr->height- 2;
- else if (y <= 0) y = 1;
+ /* Recalculate interesting grids */
+ target_set_prepare(creature_ptr, mode);
+
+ /* Look at boring grids */
+ flag = FALSE;
+
+ /* Move */
+ x += dx;
+ y += dy;
+
+ /* Do not move horizontally if unnecessary */
+ if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
+ ((x > panel_col_min + wid / 2) && (dx < 0)))
+ {
+ dx = 0;
}
+
+ /* Do not move vertically if unnecessary */
+ if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
+ ((y > panel_row_min + hgt / 2) && (dy < 0)))
+ {
+ dy = 0;
+ }
+
+ /* Apply the motion */
+ if ((y >= panel_row_min + hgt) || (y < panel_row_min) ||
+ (x >= panel_col_min + wid) || (x < panel_col_min))
+ {
+ if (change_panel(creature_ptr, dy, dx)) target_set_prepare(creature_ptr, mode);
+ }
+
+ /* Slide into legality */
+ if (x >= floor_ptr->width - 1) x = floor_ptr->width - 2;
+ else if (x <= 0) x = 1;
+
+ /* Slide into legality */
+ if (y >= floor_ptr->height - 1) y = floor_ptr->height - 2;
+ else if (y <= 0) y = 1;
}
/* Use that grid */
m = i;
}
+
+ continue;
}
/* Arbitrary grids */
- else
- {
- bool move_fast = FALSE;
- if (!(mode & TARGET_LOOK)) prt_path(y, x);
+ bool move_fast = FALSE;
- /* Access */
- g_ptr = ¤t_floor_ptr->grid_array[y][x];
+ if (!(mode & TARGET_LOOK)) print_path(creature_ptr, y, x);
- /* Default prompt */
- strcpy(info, _("q止 t決 p自 m近 +次 -前", "q,t,p,m,+,-,<dir>"));
+ /* Access */
+ g_ptr = &floor_ptr->grid_array[y][x];
- if (cheat_sight)
- {
- char cheatinfo[30];
- sprintf(cheatinfo, " LOS:%d, PROJECTABLE:%d",
- los(p_ptr->y, p_ptr->x, y, x),
- projectable(p_ptr->y, p_ptr->x, y, x));
- strcat(info, cheatinfo);
- }
+ /* Default prompt */
+ strcpy(info, _("q止 t決 p自 m近 +次 -前", "q,t,p,m,+,-,<dir>"));
- /* Describe and Prompt (enable "TARGET_LOOK") */
- while ((query = target_set_aux(y, x, mode | TARGET_LOOK, info)) == 0);
+ if (cheat_sight)
+ {
+ char cheatinfo[100];
+ sprintf(cheatinfo, " LOS:%d, PROJECTABLE:%d, SPECIAL:%d",
+ los(creature_ptr, creature_ptr->y, creature_ptr->x, y, x),
+ projectable(creature_ptr, creature_ptr->y, creature_ptr->x, y, x), g_ptr->special);
+ strcat(info, cheatinfo);
+ }
- /* Assume no direction */
- d = 0;
+ /* Describe and Prompt (enable "TARGET_LOOK") */
+ while ((query = target_set_aux(creature_ptr, y, x, mode | TARGET_LOOK, info)) == 0);
- if (use_menu)
- {
- if (query == '\r') query = 't';
- }
+ /* Assume no direction */
+ d = 0;
- /* Analyze the keypress */
- switch (query)
- {
- case ESCAPE:
- case 'q':
- {
- done = TRUE;
- break;
- }
+ if (use_menu)
+ {
+ if (query == '\r') query = 't';
+ }
- case 't':
- case '.':
- case '5':
- case '0':
- {
- target_who = -1;
- target_row = y;
- target_col = x;
- done = TRUE;
- break;
- }
+ /* Analyze the keypress */
+ switch (query)
+ {
+ case ESCAPE:
+ case 'q':
+ {
+ done = TRUE;
+ break;
+ }
- case 'p':
- {
- /* Recenter the map around the player */
- verify_panel();
- p_ptr->update |= (PU_MONSTERS);
- p_ptr->redraw |= (PR_MAP);
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
+ case 't':
+ case '.':
+ case '5':
+ case '0':
+ {
+ target_who = -1;
+ target_row = y;
+ target_col = x;
+ done = TRUE;
+ break;
+ }
- /* Recalculate interesting grids */
- target_set_prepare(mode);
+ case 'p':
+ {
+ /* Recenter the map around the player */
+ verify_panel(creature_ptr);
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
+
+ /* Recalculate interesting grids */
+ target_set_prepare(creature_ptr, mode);
+
+ y = creature_ptr->y;
+ x = creature_ptr->x;
+ }
- y = p_ptr->y;
- x = p_ptr->x;
- }
+ case 'o':
+ {
+ break;
+ }
- case 'o':
- {
- break;
- }
+ case ' ':
+ case '*':
+ case '+':
+ case '-':
+ case 'm':
+ {
+ flag = TRUE;
- case ' ':
- case '*':
- case '+':
- case '-':
- case 'm':
+ m = 0;
+ bd = 999;
+
+ /* Pick a nearby monster */
+ for (i = 0; i < tmp_pos.n; i++)
+ {
+ t = distance(y, x, tmp_pos.y[i], tmp_pos.x[i]);
+
+ /* Pick closest */
+ if (t < bd)
{
- flag = TRUE;
+ m = i;
+ bd = t;
+ }
+ }
- m = 0;
- bd = 999;
+ /* Nothing interesting */
+ if (bd == 999) flag = FALSE;
- /* Pick a nearby monster */
- for (i = 0; i < tmp_pos.n; i++)
- {
- t = distance(y, x, tmp_pos.y[i], tmp_pos.x[i]);
-
- /* Pick closest */
- if (t < bd)
- {
- m = i;
- bd = t;
- }
- }
+ break;
+ }
- /* Nothing interesting */
- if (bd == 999) flag = FALSE;
+ default:
+ {
+ /* Extract the action (if any) */
+ d = get_keymap_dir(query);
- break;
- }
+ /* XTRA HACK MOVEFAST */
+ if (isupper(query)) move_fast = TRUE;
- default:
- {
- /* Extract the action (if any) */
- d = get_keymap_dir(query);
+ if (!d) bell();
+ break;
+ }
+ }
- /* XTRA HACK MOVEFAST */
- if (isupper(query)) move_fast = TRUE;
+ /* Handle "direction" */
+ if (d)
+ {
+ POSITION dx = ddx[d];
+ POSITION dy = ddy[d];
- if (!d) bell();
- break;
- }
+ /* XTRA HACK MOVEFAST */
+ if (move_fast)
+ {
+ int mag = MIN(wid / 2, hgt / 2);
+ x += dx * mag;
+ y += dy * mag;
}
-
- /* Handle "direction" */
- if (d)
+ else
{
- POSITION dx = ddx[d];
- POSITION dy = ddy[d];
-
- /* XTRA HACK MOVEFAST */
- if (move_fast)
- {
- int mag = MIN(wid / 2, hgt / 2);
- x += dx * mag;
- y += dy * mag;
- }
- else
- {
- x += dx;
- y += dy;
- }
+ x += dx;
+ y += dy;
+ }
- /* Do not move horizontally if unnecessary */
- if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
- ((x > panel_col_min + wid / 2) && (dx < 0)))
- {
- dx = 0;
- }
+ /* Do not move horizontally if unnecessary */
+ if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
+ ((x > panel_col_min + wid / 2) && (dx < 0)))
+ {
+ dx = 0;
+ }
- /* Do not move vertically if unnecessary */
- if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
- ((y > panel_row_min + hgt / 2) && (dy < 0)))
- {
- dy = 0;
- }
+ /* Do not move vertically if unnecessary */
+ if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
+ ((y > panel_row_min + hgt / 2) && (dy < 0)))
+ {
+ dy = 0;
+ }
- /* Apply the motion */
- if ((y >= panel_row_min + hgt) || (y < panel_row_min) ||
- (x >= panel_col_min + wid) || (x < panel_col_min))
- {
- if (change_panel(dy, dx)) target_set_prepare(mode);
- }
+ /* Apply the motion */
+ if ((y >= panel_row_min + hgt) || (y < panel_row_min) ||
+ (x >= panel_col_min + wid) || (x < panel_col_min))
+ {
+ if (change_panel(creature_ptr, dy, dx)) target_set_prepare(creature_ptr, mode);
+ }
- /* Slide into legality */
- if (x >= current_floor_ptr->width-1) x = current_floor_ptr->width - 2;
- else if (x <= 0) x = 1;
+ /* Slide into legality */
+ if (x >= floor_ptr->width - 1) x = floor_ptr->width - 2;
+ else if (x <= 0) x = 1;
- /* Slide into legality */
- if (y >= current_floor_ptr->height-1) y = current_floor_ptr->height- 2;
- else if (y <= 0) y = 1;
- }
+ /* Slide into legality */
+ if (y >= floor_ptr->height - 1) y = floor_ptr->height - 2;
+ else if (y <= 0) y = 1;
}
}
prt("", 0, 0);
/* Recenter the map around the player */
- verify_panel();
- p_ptr->update |= (PU_MONSTERS);
- p_ptr->redraw |= (PR_MAP);
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
+ verify_panel(creature_ptr);
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
- /* Failure to set target */
- if (!target_who) return (FALSE);
-
- /* Success */
- return (TRUE);
+ return target_who != 0;
}
*
* Note that confusion over-rides any (explicit?) user choice.
*/
-bool get_aim_dir(DIRECTION *dp)
+bool get_aim_dir(player_type *creature_ptr, DIRECTION *dp)
{
- DIRECTION dir;
- char command;
- concptr p;
- COMMAND_CODE code;
-
- (*dp) = 0;
-
/* Global direction */
- dir = command_dir;
+ DIRECTION dir = command_dir;
/* Hack -- auto-target if requested */
- if (use_old_target && target_okay()) dir = 5;
+ if (use_old_target && target_okay(creature_ptr)) dir = 5;
+ COMMAND_CODE code;
if (repeat_pull(&code))
{
/* Confusion? */
/* Verify */
- if (!(code == 5 && !target_okay()))
+ if (!(code == 5 && !target_okay(creature_ptr)))
{
-/* return (TRUE); */
+ /* return TRUE; */
dir = (DIRECTION)code;
}
}
+
*dp = (DIRECTION)code;
/* Ask until satisfied */
+ char command;
while (!dir)
{
/* Choose a prompt */
- if (!target_okay())
+ concptr p;
+ if (!target_okay(creature_ptr))
{
p = _("方向 ('*'でターゲット選択, ESCで中断)? ", "Direction ('*' to choose a target, Escape to cancel)? ");
}
if (use_menu)
{
if (command == '\r') command = 't';
- }
+ }
/* Convert various keys to "standard" keys */
switch (command)
{
/* Use current target */
- case 'T':
- case 't':
- case '.':
- case '5':
- case '0':
- {
- dir = 5;
- break;
- }
+ case 'T':
+ case 't':
+ case '.':
+ case '5':
+ case '0':
+ {
+ dir = 5;
+ break;
+ }
- /* Set new target */
- case '*':
- case ' ':
- case '\r':
- {
- if (target_set(TARGET_KILL)) dir = 5;
- break;
- }
+ /* Set new target */
+ case '*':
+ case ' ':
+ case '\r':
+ {
+ if (target_set(creature_ptr, TARGET_KILL)) dir = 5;
+ break;
+ }
- default:
- {
- /* Extract the action (if any) */
- dir = get_keymap_dir(command);
+ default:
+ {
+ /* Extract the action (if any) */
+ dir = get_keymap_dir(command);
- break;
- }
+ break;
+ }
}
/* Verify requested targets */
- if ((dir == 5) && !target_okay()) dir = 0;
+ if ((dir == 5) && !target_okay(creature_ptr)) dir = 0;
/* Error */
if (!dir) bell();
if (!dir)
{
project_length = 0; /* reset to default */
- return (FALSE);
+ return FALSE;
}
/* Save the direction */
command_dir = dir;
/* Check for confusion */
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Random direction */
dir = ddd[randint0(8)];
/* Save direction */
(*dp) = dir;
-/* repeat_push(dir); */
repeat_push((COMMAND_CODE)command_dir);
-
- /* A "valid" direction was entered */
- return (TRUE);
+ return TRUE;
}
-bool get_direction(DIRECTION *dp, bool allow_under, bool with_steed)
+bool get_direction(player_type *creature_ptr, DIRECTION *dp, bool allow_under, bool with_steed)
{
- DIRECTION dir;
- concptr prompt;
- COMMAND_CODE code;
-
- (*dp) = 0;
-
/* Global direction */
- dir = command_dir;
+ DIRECTION dir = command_dir;
+ COMMAND_CODE code;
if (repeat_pull(&code))
{
dir = (DIRECTION)code;
- /* return (TRUE); */
+ /* return TRUE; */
}
+
*dp = (DIRECTION)code;
+ concptr prompt;
if (allow_under)
{
prompt = _("方向 ('.'足元, ESCで中断)? ", "Direction ('.' at feet, Escape to cancel)? ");
if ((dir == 5) && (!allow_under)) dir = 0;
/* Aborted */
- if (!dir) return (FALSE);
+ if (!dir) return FALSE;
/* Save desired direction */
command_dir = dir;
/* Apply "confusion" */
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Standard confusion */
if (randint0(100) < 75)
dir = ddd[randint0(8)];
}
}
- else if (p_ptr->riding && with_steed)
+ else if (creature_ptr->riding && with_steed)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
+ monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
if (MON_CONFUSED(m_ptr))
/* Notice confusion */
if (command_dir != dir)
{
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Warn the user */
msg_print(_("あなたは混乱している。", "You are confused."));
else
{
GAME_TEXT m_name[MAX_NLEN];
- monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
+ monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(creature_ptr, m_name, m_ptr, 0);
if (MON_CONFUSED(m_ptr))
{
- msg_format(_("%sは混乱している。", "%^s is confusing."), m_name);
+ msg_format(_("%sは混乱している。", "%^s is confused."), m_name);
}
else
{
}
}
- /* Save direction */
- (*dp) = dir;
-
- /* repeat_push(dir); */
+ *dp = dir;
repeat_push((COMMAND_CODE)command_dir);
-
- /* Success */
- return (TRUE);
+ return TRUE;
}
+
/*
* @brief 進行方向を指定する(騎乗対象の混乱の影響を受ける) / Request a "movement" direction (1,2,3,4,6,7,8,9) from the user,
* and place it into "command_dir", unless we already have one.
* This function tracks and uses the "global direction", and uses
* that as the "desired direction", to which "confusion" is applied.
*/
-bool get_rep_dir(DIRECTION *dp, bool under)
+bool get_rep_dir(player_type *creature_ptr, DIRECTION *dp, bool under)
{
- DIRECTION dir;
- concptr prompt;
- COMMAND_CODE code;
-
- (*dp) = 0;
-
/* Global direction */
- dir = command_dir;
+ DIRECTION dir = command_dir;
+ COMMAND_CODE code;
if (repeat_pull(&code))
{
dir = (DIRECTION)code;
-/* return (TRUE); */
+ /* return TRUE; */
}
+
*dp = (DIRECTION)code;
+ concptr prompt;
if (under)
{
prompt = _("方向 ('.'足元, ESCで中断)? ", "Direction ('.' at feet, Escape to cancel)? ");
{
prompt = _("方向 (ESCで中断)? ", "Direction (Escape to cancel)? ");
}
-
+
/* Get a direction */
while (!dir)
{
if ((dir == 5) && (!under)) dir = 0;
/* Aborted */
- if (!dir) return (FALSE);
+ if (!dir) return FALSE;
/* Save desired direction */
command_dir = dir;
/* Apply "confusion" */
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Standard confusion */
if (randint0(100) < 75)
dir = ddd[randint0(8)];
}
}
- else if (p_ptr->riding)
+ else if (creature_ptr->riding)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
+ monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
if (MON_CONFUSED(m_ptr))
/* Notice confusion */
if (command_dir != dir)
{
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Warn the user */
msg_print(_("あなたは混乱している。", "You are confused."));
else
{
GAME_TEXT m_name[MAX_NLEN];
- monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
+ monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(creature_ptr, m_name, m_ptr, 0);
if (MON_CONFUSED(m_ptr))
{
- msg_format(_("%sは混乱している。", "%^s is confusing."), m_name);
+ msg_format(_("%sは混乱している。", "%^s is confused."), m_name);
}
else
{
}
}
- /* Save direction */
- (*dp) = dir;
-
-/* repeat_push(dir); */
+ *dp = dir;
repeat_push((COMMAND_CODE)command_dir);
-
- /* Success */
- return (TRUE);
+ return TRUE;
}
* XAngband: determine if a given location is "interesting"
* based on target_set_accept function.
*/
-static bool tgt_pt_accept(POSITION y, POSITION x)
+static bool tgt_pt_accept(player_type *creature_ptr, POSITION y, POSITION x)
{
- grid_type *g_ptr;
-
- if (!(in_bounds(y, x))) return (FALSE);
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
+ if (!(in_bounds(floor_ptr, y, x))) return FALSE;
/* Player grid is always interesting */
- if ((y == p_ptr->y) && (x == p_ptr->x)) return (TRUE);
+ if ((y == creature_ptr->y) && (x == creature_ptr->x)) return TRUE;
- if (p_ptr->image) return (FALSE);
+ if (creature_ptr->image) return FALSE;
- g_ptr = ¤t_floor_ptr->grid_array[y][x];
+ grid_type *g_ptr;
+ g_ptr = &floor_ptr->grid_array[y][x];
/* Interesting memorized features */
- if (g_ptr->info & (CAVE_MARK))
- {
- /* Notice stairs */
- if (cave_have_flag_grid(g_ptr, FF_LESS)) return (TRUE);
- if (cave_have_flag_grid(g_ptr, FF_MORE)) return (TRUE);
+ if (!(g_ptr->info & (CAVE_MARK))) return FALSE;
- /* Notice quest features */
- if (cave_have_flag_grid(g_ptr, FF_QUEST_ENTER)) return (TRUE);
- if (cave_have_flag_grid(g_ptr, FF_QUEST_EXIT)) return (TRUE);
- }
+ /* Notice stairs */
+ if (cave_have_flag_grid(g_ptr, FF_LESS)) return TRUE;
+ if (cave_have_flag_grid(g_ptr, FF_MORE)) return TRUE;
+
+ /* Notice quest features */
+ if (cave_have_flag_grid(g_ptr, FF_QUEST_ENTER)) return TRUE;
+ if (cave_have_flag_grid(g_ptr, FF_QUEST_EXIT)) return TRUE;
- return (FALSE);
+ return FALSE;
}
* XAngband: Prepare the "temp" array for "tget_pt"
* based on target_set_prepare funciton.
*/
-static void tgt_pt_prepare(void)
+static void tgt_pt_prepare(player_type *creature_ptr)
{
- POSITION y, x;
-
- /* Reset "temp" array */
tmp_pos.n = 0;
if (!expand_list) return;
/* Scan the current panel */
- for (y = 1; y < current_floor_ptr->height; y++)
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
+ for (POSITION y = 1; y < floor_ptr->height; y++)
{
- for (x = 1; x < current_floor_ptr->width; x++)
+ for (POSITION x = 1; x < floor_ptr->width; x++)
{
/* Require "interesting" contents */
- if (!tgt_pt_accept(y, x)) continue;
+ if (!tgt_pt_accept(creature_ptr, y, x)) continue;
/* Save the location */
tmp_pos.x[tmp_pos.n] = x;
}
}
- /* Sort the positions */
ang_sort(tmp_pos.x, tmp_pos.y, tmp_pos.n, ang_sort_comp_distance, ang_sort_swap_distance);
}
+
/*
* old -- from PsiAngband.
*/
-bool tgt_pt(POSITION *x_ptr, POSITION *y_ptr)
+bool tgt_pt(player_type *creature_ptr, POSITION *x_ptr, POSITION *y_ptr)
{
- char ch = 0;
- int d, n = 0;
- POSITION x, y;
- bool success = FALSE;
-
TERM_LEN wid, hgt;
-
get_screen_size(&wid, &hgt);
- x = p_ptr->x;
- y = p_ptr->y;
+ POSITION x = creature_ptr->x;
+ POSITION y = creature_ptr->y;
- if (expand_list)
- {
- tgt_pt_prepare();
- }
+ if (expand_list) tgt_pt_prepare(creature_ptr);
msg_print(_("場所を選んでスペースキーを押して下さい。", "Select a point and press space."));
msg_flag = FALSE; /* prevents "-more-" message. */
+ char ch = 0;
+ int n = 0;
+ bool success = FALSE;
while ((ch != ESCAPE) && !success)
{
bool move_fast = FALSE;
case '5':
case '0':
/* illegal place */
- if (player_bold(y, x)) ch = 0;
+ if (player_bold(creature_ptr, y, x)) ch = 0;
/* okay place */
else success = TRUE;
break;
- /* XAngband: Move cursor to stairs */
+ /* XAngband: Move cursor to stairs */
case '>':
case '<':
- if (expand_list && tmp_pos.n)
- {
- int dx, dy;
- int cx = (panel_col_min + panel_col_max) / 2;
- int cy = (panel_row_min + panel_row_max) / 2;
+ {
+ if (!expand_list || !tmp_pos.n) break;
- n++;
+ int dx, dy;
+ int cx = (panel_col_min + panel_col_max) / 2;
+ int cy = (panel_row_min + panel_row_max) / 2;
- /* Skip stairs which have defferent distance */
- for (; n < tmp_pos.n; ++ n)
- {
- grid_type *g_ptr = ¤t_floor_ptr->grid_array[tmp_pos.y[n]][tmp_pos.x[n]];
+ n++;
- if (cave_have_flag_grid(g_ptr, FF_STAIRS) &&
- cave_have_flag_grid(g_ptr, ch == '>' ? FF_MORE : FF_LESS))
- {
- /* Found */
- break;
- }
- }
+ /* Skip stairs which have defferent distance */
+ for (; n < tmp_pos.n; ++n)
+ {
+ grid_type *g_ptr = &creature_ptr->current_floor_ptr->grid_array[tmp_pos.y[n]][tmp_pos.x[n]];
- if (n == tmp_pos.n) /* Loop out taget list */
+ if (cave_have_flag_grid(g_ptr, FF_STAIRS) &&
+ cave_have_flag_grid(g_ptr, ch == '>' ? FF_MORE : FF_LESS))
{
- n = 0;
- y = p_ptr->y;
- x = p_ptr->x;
- verify_panel(); /* Move cursor to player */
+ /* Found */
+ break;
+ }
+ }
- p_ptr->update |= (PU_MONSTERS);
+ if (n == tmp_pos.n) /* Loop out taget list */
+ {
+ n = 0;
+ y = creature_ptr->y;
+ x = creature_ptr->x;
+ verify_panel(creature_ptr); /* Move cursor to player */
- p_ptr->redraw |= (PR_MAP);
+ creature_ptr->update |= (PU_MONSTERS);
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
- }
- else /* move cursor to next stair and change panel */
- {
- y = tmp_pos.y[n];
- x = tmp_pos.x[n];
+ creature_ptr->redraw |= (PR_MAP);
- dy = 2 * (y - cy) / hgt;
- dx = 2 * (x - cx) / wid;
- if (dy || dx) change_panel(dy, dx);
- }
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
}
+ else /* move cursor to next stair and change panel */
+ {
+ y = tmp_pos.y[n];
+ x = tmp_pos.x[n];
+
+ dy = 2 * (y - cy) / hgt;
+ dx = 2 * (x - cx) / wid;
+ if (dy || dx) change_panel(creature_ptr, dy, dx);
+ }
+
break;
+ }
default:
+ {
/* Look up the direction */
- d = get_keymap_dir(ch);
+ int d = get_keymap_dir(ch);
/* XTRA HACK MOVEFAST */
if (isupper(ch)) move_fast = TRUE;
/* Handle "direction" */
- if (d)
- {
- int dx = ddx[d];
- int dy = ddy[d];
+ if (d == 0) break;
- /* XTRA HACK MOVEFAST */
- if (move_fast)
- {
- int mag = MIN(wid / 2, hgt / 2);
- x += dx * mag;
- y += dy * mag;
- }
- else
- {
- x += dx;
- y += dy;
- }
+ int dx = ddx[d];
+ int dy = ddy[d];
- /* Do not move horizontally if unnecessary */
- if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
- ((x > panel_col_min + wid / 2) && (dx < 0)))
- {
- dx = 0;
- }
+ /* XTRA HACK MOVEFAST */
+ if (move_fast)
+ {
+ int mag = MIN(wid / 2, hgt / 2);
+ x += dx * mag;
+ y += dy * mag;
+ }
+ else
+ {
+ x += dx;
+ y += dy;
+ }
- /* Do not move vertically if unnecessary */
- if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
- ((y > panel_row_min + hgt / 2) && (dy < 0)))
- {
- dy = 0;
- }
+ /* Do not move horizontally if unnecessary */
+ if (((x < panel_col_min + wid / 2) && (dx > 0)) ||
+ ((x > panel_col_min + wid / 2) && (dx < 0)))
+ {
+ dx = 0;
+ }
- /* Apply the motion */
- if ((y >= panel_row_min + hgt) || (y < panel_row_min) ||
- (x >= panel_col_min + wid) || (x < panel_col_min))
- {
- /* if (change_panel(dy, dx)) target_set_prepare(mode); */
- change_panel(dy, dx);
- }
+ /* Do not move vertically if unnecessary */
+ if (((y < panel_row_min + hgt / 2) && (dy > 0)) ||
+ ((y > panel_row_min + hgt / 2) && (dy < 0)))
+ {
+ dy = 0;
+ }
- /* Slide into legality */
- if (x >= current_floor_ptr->width-1) x = current_floor_ptr->width - 2;
- else if (x <= 0) x = 1;
+ /* Apply the motion */
+ if ((y >= panel_row_min + hgt) || (y < panel_row_min) ||
+ (x >= panel_col_min + wid) || (x < panel_col_min))
+ {
+ change_panel(creature_ptr, dy, dx);
+ }
- /* Slide into legality */
- if (y >= current_floor_ptr->height-1) y = current_floor_ptr->height- 2;
- else if (y <= 0) y = 1;
+ /* Slide into legality */
+ if (x >= creature_ptr->current_floor_ptr->width - 1) x = creature_ptr->current_floor_ptr->width - 2;
+ else if (x <= 0) x = 1;
+
+ /* Slide into legality */
+ if (y >= creature_ptr->current_floor_ptr->height - 1) y = creature_ptr->current_floor_ptr->height - 2;
+ else if (y <= 0) y = 1;
- }
break;
}
+ }
}
- /* Clear the top line */
prt("", 0, 0);
-
- /* Recenter the map around the player */
- verify_panel();
-
- p_ptr->update |= (PU_MONSTERS);
-
- p_ptr->redraw |= (PR_MAP);
-
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
+ verify_panel(creature_ptr);
+ creature_ptr->update |= (PU_MONSTERS);
+ creature_ptr->redraw |= (PR_MAP);
+ creature_ptr->window |= (PW_OVERHEAD);
+ handle_stuff(creature_ptr);
*x_ptr = x;
*y_ptr = y;
}
-bool get_hack_dir(DIRECTION *dp)
+bool get_hack_dir(player_type *creature_ptr, DIRECTION *dp)
{
- DIRECTION dir;
- concptr p;
- char command;
-
- (*dp) = 0;
-
- /* Global direction */
- dir = 0;
-
- /* (No auto-targeting) */
+ *dp = 0;
/* Ask until satisfied */
+ char command;
+ DIRECTION dir = 0;
while (!dir)
{
/* Choose a prompt */
- if (!target_okay())
+ concptr p;
+ if (!target_okay(creature_ptr))
{
p = _("方向 ('*'でターゲット選択, ESCで中断)? ", "Direction ('*' to choose a target, Escape to cancel)? ");
}
if (use_menu)
{
if (command == '\r') command = 't';
- }
+ }
/* Convert various keys to "standard" keys */
switch (command)
{
/* Use current target */
- case 'T':
- case 't':
- case '.':
- case '5':
- case '0':
- {
- dir = 5;
- break;
- }
+ case 'T':
+ case 't':
+ case '.':
+ case '5':
+ case '0':
+ {
+ dir = 5;
+ break;
+ }
- /* Set new target */
- case '*':
- case ' ':
- case '\r':
- {
- if (target_set(TARGET_KILL)) dir = 5;
- break;
- }
+ /* Set new target */
+ case '*':
+ case ' ':
+ case '\r':
+ {
+ if (target_set(creature_ptr, TARGET_KILL)) dir = 5;
+ break;
+ }
- default:
- {
- /* Look up the direction */
- dir = get_keymap_dir(command);
+ default:
+ {
+ /* Look up the direction */
+ dir = get_keymap_dir(command);
- break;
- }
+ break;
+ }
}
/* Verify requested targets */
- if ((dir == 5) && !target_okay()) dir = 0;
+ if ((dir == 5) && !target_okay(creature_ptr)) dir = 0;
/* Error */
if (!dir) bell();
}
- /* No direction */
- if (!dir) return (FALSE);
+ if (!dir) return FALSE;
/* Save the direction */
command_dir = dir;
/* Check for confusion */
- if (p_ptr->confused)
+ if (creature_ptr->confused)
{
/* Random direction */
dir = ddd[randint0(8)];
msg_print(_("あなたは混乱している。", "You are confused."));
}
- /* Save direction */
- (*dp) = dir;
-
- /* A "valid" direction was entered */
- return (TRUE);
+ *dp = dir;
+ return TRUE;
}