return (-1);
}
- q_idx = quest_number(creature_ptr->current_floor_ptr->dun_level);
+ q_idx = quest_number(creature_ptr, creature_ptr->current_floor_ptr->dun_level);
if (write_level)
{
disturb(creature_ptr, FALSE, TRUE);
/* Determine the level */
- if (!quest_number(floor_ptr->dun_level) && floor_ptr->dun_level)
+ if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
{
msg_print(_("世界が変わった!", "The world changes!"));
disturb(player_ptr, TRUE, TRUE);
/* Get index of current quest (if any) */
- quest_num = quest_number(player_ptr->current_floor_ptr->dun_level);
+ quest_num = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
/* Inside a quest? */
if (quest_num)
}
else
{
- place_trap(floor_ptr, *y, *x);
+ place_trap(player_ptr, *y, *x);
}
floor_ptr->object_level = floor_ptr->base_level;
/* Random trap */
else if (random & RANDOM_TRAP)
{
- place_trap(floor_ptr, *y, *x);
+ place_trap(player_ptr, *y, *x);
}
/* Hidden trap (or door) */
else if (letter[idx].trap)
if (current_world_ptr->game_turn < subject_ptr->feeling_turn + delay && !cheat_xtra) return;
/* Extract quest number (if any) */
- quest_num = quest_number(floor_ptr->dun_level);
+ quest_num = quest_number(subject_ptr, floor_ptr->dun_level);
/* No feeling in a quest */
if (quest_num &&
/*!
* @brief 外壁に隣接させて階段を生成する / Places some staircases near walls
+ * @param owner_ptr プレーヤーへの参照ポインタ
* @param feat 配置したい地形ID
* @param num 配置したい階段の数
* @param walls 最低減隣接させたい外壁の数
* @return 規定数通りに生成に成功したらTRUEを返す。
*/
-static bool alloc_stairs(floor_type *floor_ptr, FEAT_IDX feat, int num, int walls)
+static bool alloc_stairs(player_type *owner_ptr, FEAT_IDX feat, int num, int walls)
{
int i;
int shaft_num = 0;
feature_type *f_ptr = &f_info[feat];
+ floor_type *floor_ptr = owner_ptr->current_floor_ptr;
if (have_flag(f_ptr->flags, FF_LESS))
{
/* No up stairs in town or in ironman mode */
}
else if (have_flag(f_ptr->flags, FF_MORE))
{
- QUEST_IDX q_idx = quest_number(floor_ptr->dun_level);
+ QUEST_IDX q_idx = quest_number(owner_ptr, floor_ptr->dun_level);
/* No downstairs on quest levels */
if (floor_ptr->dun_level > 1 && q_idx)
/* No downstairs at the bottom */
if (floor_ptr->dun_level >= d_info[floor_ptr->dungeon_idx].maxdepth) return TRUE;
- if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth-1) && !quest_number(floor_ptr->dun_level+1))
+ if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth-1) && !quest_number(owner_ptr, floor_ptr->dun_level+1))
shaft_num = (randint1(num)+1)/2;
}
else return FALSE;
case ALLOC_TYP_TRAP:
{
- place_trap(floor_ptr, y, x);
+ place_trap(owner_ptr, y, x);
floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
break;
}
* @details There were moved from cave_gen().
* @return なし
*/
-static void gen_caverns_and_lakes(dungeon_type *dungeon_ptr, floor_type *floor_ptr)
+static void gen_caverns_and_lakes(dungeon_type *dungeon_ptr, player_type *owner_ptr)
{
+ floor_type *floor_ptr = owner_ptr->current_floor_ptr;
#ifdef ALLOW_CAVERNS_AND_LAKES
/* Possible "destroyed" level */
if ((floor_ptr->dun_level > 30) && one_in_(DUN_DEST*2) && (small_levels) && (dungeon_ptr->flags1 & DF1_DESTROY))
#endif /* ALLOW_CAVERNS_AND_LAKES */
/* Hack -- No destroyed "quest" levels */
- if (quest_number(floor_ptr->dun_level)) dun->destroyed = FALSE;
+ if (quest_number(owner_ptr, floor_ptr->dun_level)) dun->destroyed = FALSE;
}
}
/* Generate various caverns and lakes */
- gen_caverns_and_lakes(dungeon_ptr, floor_ptr);
+ gen_caverns_and_lakes(dungeon_ptr, player_ptr);
/* Build maze */
if (dungeon_ptr->flags1 & DF1_MAZE)
build_maze_vault(player_ptr, floor_ptr->width/2-1, floor_ptr->height/2-1, floor_ptr->width-4, floor_ptr->height-4, FALSE);
/* Place 3 or 4 down stairs near some walls */
- if (!alloc_stairs(floor_ptr, feat_down_stair, rand_range(2, 3), 3)) return FALSE;
+ if (!alloc_stairs(player_ptr, feat_down_stair, rand_range(2, 3), 3)) return FALSE;
/* Place 1 or 2 up stairs near some walls */
- if (!alloc_stairs(floor_ptr, feat_up_stair, 1, 3)) return FALSE;
+ if (!alloc_stairs(player_ptr, feat_up_stair, 1, 3)) return FALSE;
}
/* Build some rooms */
}
/* Place 3 or 4 down stairs near some walls */
- if (!alloc_stairs(floor_ptr, feat_down_stair, rand_range(3, 4), 3)) return FALSE;
+ if (!alloc_stairs(player_ptr, feat_down_stair, rand_range(3, 4), 3)) return FALSE;
/* Place 1 or 2 up stairs near some walls */
- if (!alloc_stairs(floor_ptr, feat_up_stair, rand_range(1, 2), 3)) return FALSE;
+ if (!alloc_stairs(player_ptr, feat_up_stair, rand_range(1, 2), 3)) return FALSE;
}
if (!dun->laketype)
/*** Create connected stairs ***/
/* No stairs down from Quest */
- if ((creature_ptr->change_floor_mode & CFM_UP) && !quest_number(creature_ptr->current_floor_ptr->dun_level))
+ if ((creature_ptr->change_floor_mode & CFM_UP) && !quest_number(creature_ptr, creature_ptr->current_floor_ptr->dun_level))
{
g_ptr->feat = (creature_ptr->change_floor_mode & CFM_SHAFT) ? feat_state(feat_down_stair, FF_SHAFT) : feat_down_stair;
}
* @param x 配置を試みたいマスのX座標
* @return なし
*/
-void place_random_stairs(floor_type *floor_ptr, POSITION y, POSITION x)
+void place_random_stairs(player_type *player_ptr, POSITION y, POSITION x)
{
bool up_stairs = TRUE;
bool down_stairs = TRUE;
grid_type *g_ptr;
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
if (!is_floor_grid(g_ptr) || g_ptr->o_idx) return;
if (!floor_ptr->dun_level) up_stairs = FALSE;
if (ironman_downward) up_stairs = FALSE;
if (floor_ptr->dun_level >= d_info[p_ptr->dungeon_idx].maxdepth) down_stairs = FALSE;
- if (quest_number(floor_ptr->dun_level) && (floor_ptr->dun_level > 1)) down_stairs = FALSE;
+ if (quest_number(player_ptr, floor_ptr->dun_level) && (floor_ptr->dun_level > 1)) down_stairs = FALSE;
/* We can't place both */
if (down_stairs && up_stairs)
* @details
* Only really called by some of the "vault" routines.
*/
-void vault_trap_aux(floor_type *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd)
+void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd)
{
int count = 0, y1 = y, x1 = x;
int dummy = 0;
grid_type *g_ptr;
/* Place traps */
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
for (count = 0; count <= 5; count++)
{
/* Get a location */
if (!is_floor_grid(g_ptr) || g_ptr->o_idx || g_ptr->m_idx) continue;
/* Place the trap */
- place_trap(floor_ptr, y1, x1);
+ place_trap(player_ptr, y1, x1);
break;
}
/*!
* @brief 特殊な部屋向けに各種アイテムを配置する(メインルーチン) / Place some traps with a given displacement of given location
+ * @param player_ptr プレーヤーへの参照ポインタ
* @param y トラップを配置したいマスの中心Y座標
* @param x トラップを配置したいマスの中心X座標
* @param yd Y方向の配置分散マス数
* @details
* Only really called by some of the "vault" routines.
*/
-void vault_traps(floor_type *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num)
+void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num)
{
int i;
for (i = 0; i < num; i++)
{
- vault_trap_aux(floor_ptr, y, x, yd, xd);
+ vault_trap_aux(player_ptr, y, x, yd, xd);
}
}
extern void place_secret_door(floor_type *floor_ptr, POSITION y, POSITION x, int type);
extern void place_locked_door(floor_type *floor_ptr, POSITION y, POSITION x);
extern void forget_flow(floor_type *floor_ptr);
-extern void place_random_stairs(floor_type *floor_ptr, POSITION y, POSITION x);
+extern void place_random_stairs(player_type *player_ptr, POSITION y, POSITION x);
extern bool los(floor_type* floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2);
extern bool projectable(floor_type *floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2);
extern void place_closed_door(floor_type *floor_ptr, POSITION y, POSITION x, int type);
extern void wipe_o_list(floor_type *floor_ptr);
-extern void vault_trap_aux(floor_type *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd);
+extern void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd);
extern bool get_is_floor(floor_type *floor_ptr, POSITION x, POSITION y);
extern void try_door(floor_type *floor_ptr, POSITION y, POSITION x);
extern void place_gold(floor_type *floor_ptr, POSITION y, POSITION x);
extern void delete_monster(floor_type *floor_ptr, POSITION y, POSITION x);
extern void compact_objects(floor_type *floor_ptr, int size);
-extern void vault_traps(floor_type *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num);
+extern void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num);
extern void scatter(floor_type *floor_ptr, POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION d, BIT_FLAGS mode);
/*!
* @brief メッセージログを読み込む / Read the dungeon (old method)
+ * @param creature_ptr プレーヤーへの参照ポインタ
* @return なし
* @details
* The monsters/objects must be loaded in the same order
* that they were stored, since the actual indexes matter.
*/
-static errr rd_dungeon_old(floor_type *floor_ptr)
+static errr rd_dungeon_old(player_type *creature_ptr)
{
int i, y, x;
int ymax, xmax;
/* Header info */
rd_s16b(&tmp16s);
+ floor_type *floor_ptr = creature_ptr->current_floor_ptr;
floor_ptr->dun_level = (DEPTH)tmp16s;
if (z_older_than(10, 3, 8)) p_ptr->dungeon_idx = DUNGEON_ANGBAND;
else
{
g_ptr->info &= ~CAVE_TRAP;
g_ptr->mimic = g_ptr->feat;
- g_ptr->feat = choose_random_trap(floor_ptr);
+ g_ptr->feat = choose_random_trap(creature_ptr);
}
/* Another hidden trap */
/* Older method */
if (h_older_than(1, 5, 0, 0))
{
- err = rd_dungeon_old(player_ptr->current_floor_ptr);
+ err = rd_dungeon_old(player_ptr);
/* Prepare floor_id of current floor */
if (player_ptr->dungeon_idx)
}
}
- if (quest_number(p_ptr->current_floor_ptr->dun_level))
+ if (quest_number(p_ptr, p_ptr->current_floor_ptr->dun_level))
{
- int hoge = quest_number(p_ptr->current_floor_ptr->dun_level);
+ int hoge = quest_number(p_ptr, p_ptr->current_floor_ptr->dun_level);
if ((quest[hoge].type == QUEST_TYPE_KILL_LEVEL) || (quest[hoge].type == QUEST_TYPE_RANDOM))
{
if(r_idx == quest[hoge].r_idx)
}
else
{
- QUEST_IDX q_idx = quest_number(creature_ptr->current_floor_ptr->dun_level);
+ QUEST_IDX q_idx = quest_number(creature_ptr, creature_ptr->current_floor_ptr->dun_level);
bool seppuku = streq(hit_from, "Seppuku");
bool winning_seppuku = current_world_ptr->total_winner && seppuku;
* @param level 検索対象になる階
* @return クエストIDを返す。該当がない場合0を返す。
*/
-QUEST_IDX quest_number(DEPTH level)
+QUEST_IDX quest_number(player_type *player_ptr, DEPTH level)
{
QUEST_IDX i;
- /* Check quests */
- if (p_ptr->current_floor_ptr->inside_quest)
- return (p_ptr->current_floor_ptr->inside_quest);
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ if (floor_ptr->inside_quest)
+ return (floor_ptr->inside_quest);
for (i = 0; i < max_q_idx; i++)
{
if ((quest[i].type == QUEST_TYPE_KILL_LEVEL) &&
!(quest[i].flags & QUEST_FLAG_PRESET) &&
(quest[i].level == level) &&
- (quest[i].dungeon == p_ptr->dungeon_idx))
+ (quest[i].dungeon == player_ptr->dungeon_idx))
return (i);
}
extern void check_quest_completion(player_type *player_ptr, monster_type *m_ptr);
extern void check_find_art_quest_completion(player_type *player_ptr, object_type *o_ptr);
extern void quest_discovery(QUEST_IDX q_idx);
-extern QUEST_IDX quest_number(DEPTH level);
+extern QUEST_IDX quest_number(player_type *player_ptr, DEPTH level);
extern QUEST_IDX random_quest_number(DEPTH level);
extern void leave_quest_check(player_type *player_ptr);
extern void leave_tower_check(void);
vault_monsters(floor_ptr, yval, xval, randint0(2) + 3);
/* Traps naturally */
- vault_traps(floor_ptr, yval, xval, 4, 4, randint0(3) + 2);
+ vault_traps(player_ptr, yval, xval, 4, 4, randint0(3) + 2);
break;
}
/* Stairs (20%) */
else
{
- place_random_stairs(floor_ptr, yval, xval);
+ place_random_stairs(player_ptr, yval, xval);
}
/* Traps to protect the treasure */
- vault_traps(floor_ptr, yval, xval, 4, 10, 2 + randint1(3));
+ vault_traps(player_ptr, yval, xval, 4, 10, 2 + randint1(3));
break;
}
vault_monsters(floor_ptr, yval, xval + 5, randint1(3));
/* Traps make them entertaining. */
- vault_traps(floor_ptr, yval, xval - 3, 2, 8, randint1(3));
- vault_traps(floor_ptr, yval, xval + 3, 2, 8, randint1(3));
+ vault_traps(player_ptr, yval, xval - 3, 2, 8, randint1(3));
+ vault_traps(player_ptr, yval, xval + 3, 2, 8, randint1(3));
/* Mazes should have some treasure too. */
vault_objects(player_ptr, yval, xval, 3);
vault_monsters(floor_ptr, y0, x0, randint0(2) + 3);
/* Traps naturally */
- vault_traps(floor_ptr, y0, x0, 4, 4, randint0(3) + 2);
+ vault_traps(player_ptr, y0, x0, 4, 4, randint0(3) + 2);
}
return TRUE;
}
-
}
else
{
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
}
break;
/* Trap */
case '^':
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
break;
/* Black market in a dungeon */
}
else
{
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
}
}
else if (value < 30)
floor_ptr->monster_level = floor_ptr->base_level + 5;
place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
floor_ptr->monster_level = floor_ptr->base_level;
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
}
else if (value < 40)
{
else if (value < 50)
{
/* Trap */
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
}
else
{
}
else if (randint0(100) < 50)
{
- place_trap(floor_ptr, y, x);
+ place_trap(player_ptr, y, x);
}
else if (randint0(100) < 50)
{
/* Forbid down staircases on quest level */
bool down = TRUE;
floor_type *floor_ptr = caster_ptr->current_floor_ptr;
- if (quest_number(floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[caster_ptr->dungeon_idx].maxdepth)) down = FALSE;
+ if (quest_number(caster_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[caster_ptr->dungeon_idx].maxdepth)) down = FALSE;
/* No effect out of standard dungeon floor */
if (!floor_ptr->dun_level || (!up && !down) ||
case GF_MAKE_TRAP:
{
- place_trap(floor_ptr, y, x);
+ place_trap(caster_ptr, y, x);
break;
}
}
/* Up only */
- else if (quest_number(creature_ptr->current_floor_ptr->dun_level) || (creature_ptr->current_floor_ptr->dun_level >= d_info[creature_ptr->dungeon_idx].maxdepth))
+ else if (quest_number(creature_ptr, creature_ptr->current_floor_ptr->dun_level) || (creature_ptr->current_floor_ptr->dun_level >= d_info[creature_ptr->dungeon_idx].maxdepth))
{
#ifdef JP
if (see_m) msg_format("%^sは天井を突き破って宙へ浮いていく。", m_name);
bool is_special_floor = floor_ptr->inside_arena || caster_ptr->phase_out ||
(floor_ptr->inside_quest && !random_quest_number(floor_ptr->dun_level));
bool is_invalid_floor = idx <= 0;
- is_invalid_floor &= quest_number(floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[caster_ptr->dungeon_idx].maxdepth);
+ is_invalid_floor &= quest_number(caster_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[caster_ptr->dungeon_idx].maxdepth);
is_invalid_floor &= caster_ptr->current_floor_ptr->dun_level >= 1;
is_invalid_floor &= ironman_downward;
return is_special_floor || is_invalid_floor;
* Actually, it is not this routine, but the "trap instantiation"\n
* code, which should also check for "trap doors" on quest levels.\n
*/
-FEAT_IDX choose_random_trap(floor_type *floor_ptr)
+FEAT_IDX choose_random_trap(player_type *trapped_ptr)
{
FEAT_IDX feat;
/* Pick a trap */
+ floor_type *floor_ptr = trapped_ptr->current_floor_ptr;
while (TRUE)
{
/* Hack -- pick a trap */
if (!have_flag(f_info[feat].flags, FF_MORE)) break;
/* Hack -- no trap doors on special levels */
- if (floor_ptr->inside_arena || quest_number(floor_ptr->dun_level)) continue;
+ if (floor_ptr->inside_arena || quest_number(trapped_ptr, floor_ptr->dun_level)) continue;
/* Hack -- no trap doors on the deepest level */
if (floor_ptr->dun_level >= d_info[floor_ptr->dungeon_idx].maxdepth) continue;
* when they are "discovered" (by detecting them or setting them off),\n
* the trap is "instantiated" as a visible, "typed", trap.\n
*/
-void place_trap(floor_type *floor_ptr, POSITION y, POSITION x)
+void place_trap(player_type *trapped_ptr, POSITION y, POSITION x)
{
+ floor_type *floor_ptr = trapped_ptr->current_floor_ptr;
grid_type *g_ptr = &floor_ptr->grid_array[y][x];
/* Paranoia -- verify location */
/* Place an invisible trap */
g_ptr->mimic = g_ptr->feat;
- g_ptr->feat = choose_random_trap(floor_ptr);
+ g_ptr->feat = choose_random_trap(trapped_ptr);
}
extern void init_normal_traps(void);
-extern FEAT_IDX choose_random_trap(floor_type *floor_ptr);
+extern FEAT_IDX choose_random_trap(player_type *trapped_ptr);
extern void disclose_grid(player_type *trapped_ptr, POSITION y, POSITION x);
-extern void place_trap(floor_type *floor_ptr, POSITION y, POSITION x);
+extern void place_trap(player_type *trapped_ptr, POSITION y, POSITION x);
extern void hit_trap(player_type *trapped_ptr, bool break_trap);
extern const int chest_traps[64];