/*!
* @brief モンスターにとって所定の地点が召還に相応しい地点かどうかを返す。 /
* Determine if there is a space near the player in which a summoned creature can appear
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param floor_ptr 現在フロアへの参照ポインタ
* @param y1 判定を行いたいマスのY座標
* @param x1 判定を行いたいマスのX座標
* @return 召還に相応しいならばTRUEを返す
*/
-bool summon_possible(POSITION y1, POSITION x1)
+bool summon_possible(floor_type *floor_ptr, POSITION y1, POSITION x1)
{
POSITION y, x;
for (x = x1 - 2; x <= x1 + 2; x++)
{
/* Ignore illegal locations */
- if (!in_bounds(p_ptr->current_floor_ptr, y, x)) continue;
+ if (!in_bounds(floor_ptr, y, x)) continue;
/* Only check a circular area */
if (distance(y1, x1, y, x)>2) continue;
if (pattern_tile(y, x)) continue;
/* Require empty floor grid in line of projection */
- if (cave_empty_bold(p_ptr->current_floor_ptr, y, x) && projectable(p_ptr->current_floor_ptr, y1, x1, y, x) && projectable(p_ptr->current_floor_ptr, y, x, y1, x1)) return TRUE;
+ if (cave_empty_bold(floor_ptr, y, x) && projectable(floor_ptr, y1, x1, y, x) && projectable(floor_ptr, y, x, y1, x1)) return TRUE;
}
}
/*!
* @brief モンスターにとって死者復活を行うべき状態かどうかを返す /
* Determine if there is a space near the player in which a summoned creature can appear
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param floor_type 現在フロアへの参照ポインタ
* @param m_ptr 判定を行いたいモンスターの構造体参照ポインタ
* @return 死者復活が有効な状態ならばTRUEを返す。
*/
-bool raise_possible(monster_type *m_ptr)
+bool raise_possible(floor_type *floor_ptr, monster_type *m_ptr)
{
POSITION xx, yy;
POSITION y = m_ptr->fy;
for (yy = y - 5; yy <= y + 5; yy++)
{
if (distance(y, x, yy, xx) > 5) continue;
- if (!los(p_ptr->current_floor_ptr, y, x, yy, xx)) continue;
- if (!projectable(p_ptr->current_floor_ptr, y, x, yy, xx)) continue;
+ if (!los(floor_ptr, y, x, yy, xx)) continue;
+ if (!projectable(floor_ptr, y, x, yy, xx)) continue;
- g_ptr = &p_ptr->current_floor_ptr->grid_array[yy][xx];
+ g_ptr = &floor_ptr->grid_array[yy][xx];
/* Scan the pile of objects */
for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
{
- object_type *o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
+ object_type *o_ptr = &floor_ptr->o_list[this_o_idx];
next_o_idx = o_ptr->next_o_idx;
/* Known to be worthless? */
}
}
}
+
return FALSE;
}
/* No spells left */
if (!f4 && !f5 && !f6) return FALSE;
+ floor_type *floor_ptr = target_ptr->current_floor_ptr;
if (!(r_ptr->flags2 & RF2_STUPID))
{
if (!target_ptr->csp) f5 &= ~(RF5_DRAIN_MANA);
if (((f4 & RF4_SUMMON_MASK) ||
(f5 & RF5_SUMMON_MASK) ||
(f6 & RF6_SUMMON_MASK)) &&
- !(summon_possible(y, x)))
+ !(summon_possible(floor_ptr, y, x)))
{
/* Remove summoning spells */
f4 &= ~(RF4_SUMMON_MASK);
}
/* Check for a possible raise dead */
- if ((f6 & RF6_RAISE_DEAD) && !raise_possible(m_ptr))
+ if ((f6 & RF6_RAISE_DEAD) && !raise_possible(floor_ptr, m_ptr))
{
/* Remove raise dead spell */
f6 &= ~(RF6_RAISE_DEAD);
/* Special moves restriction */
if (f6 & RF6_SPECIAL)
{
- if ((m_ptr->r_idx == MON_ROLENTO) && !summon_possible(y, x))
+ if ((m_ptr->r_idx == MON_ROLENTO) && !summon_possible(floor_ptr, y, x))
{
f6 &= ~(RF6_SPECIAL);
}
}
/* Hex: Anti Magic Barrier */
- if (!spell_is_inate(thrown_spell) && magic_barrier(p_ptr, m_idx))
+ if (!spell_is_inate(thrown_spell) && magic_barrier(target_ptr, m_idx))
{
msg_format(_("反魔法バリアが%^sの呪文をかき消した。", "Anti magic barrier cancels the spell which %^s casts."), m_name);
return TRUE;
/*!
* @brief バーノール・ルパートのRF6_SPECIALの処理。分裂・合体。 /
+* @param player_ptr プレーヤーへの参照ポインタ
* @param m_idx 呪文を唱えるモンスターID
*/
-HIT_POINT spell_RF6_SPECIAL_BANORLUPART(MONSTER_IDX m_idx)
+HIT_POINT spell_RF6_SPECIAL_BANORLUPART(player_type *target_ptr, MONSTER_IDX m_idx)
{
- monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+ floor_type *floor_ptr = target_ptr->current_floor_ptr;
+ monster_type *m_ptr = &floor_ptr->m_list[m_idx];
HIT_POINT dummy_hp, dummy_maxhp;
MONSTER_IDX k;
POSITION dummy_y = m_ptr->fy;
dummy_hp = (m_ptr->hp + 1) / 2;
dummy_maxhp = m_ptr->maxhp / 2;
- if (p_ptr->current_floor_ptr->inside_arena || p_ptr->phase_out || !summon_possible(m_ptr->fy, m_ptr->fx))
+ if (floor_ptr->inside_arena || target_ptr->phase_out || !summon_possible(floor_ptr, m_ptr->fy, m_ptr->fx))
return -1;
- delete_monster_idx(p_ptr->current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].m_idx);
+ delete_monster_idx(floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].m_idx);
summon_named_creature(0, dummy_y, dummy_x, MON_BANOR, mode);
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
+ floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
+ floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
summon_named_creature(0, dummy_y, dummy_x, MON_LUPART, mode);
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
+ floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
+ floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
msg_print(_("『バーノール・ルパート』が分裂した!","Banor=Rupart splits in two person!"));
break;
if (!r_info[MON_BANOR].cur_num || !r_info[MON_LUPART].cur_num)
return -1;
- for (k = 1; k < p_ptr->current_floor_ptr->m_max; k++)
+ for (k = 1; k < floor_ptr->m_max; k++)
{
- if (p_ptr->current_floor_ptr->m_list[k].r_idx == MON_BANOR || p_ptr->current_floor_ptr->m_list[k].r_idx == MON_LUPART)
+ if (floor_ptr->m_list[k].r_idx == MON_BANOR || floor_ptr->m_list[k].r_idx == MON_LUPART)
{
- dummy_hp += p_ptr->current_floor_ptr->m_list[k].hp;
- dummy_maxhp += p_ptr->current_floor_ptr->m_list[k].maxhp;
- if (p_ptr->current_floor_ptr->m_list[k].r_idx != m_ptr->r_idx)
+ dummy_hp += floor_ptr->m_list[k].hp;
+ dummy_maxhp += floor_ptr->m_list[k].maxhp;
+ if (floor_ptr->m_list[k].r_idx != m_ptr->r_idx)
{
- dummy_y = p_ptr->current_floor_ptr->m_list[k].fy;
- dummy_x = p_ptr->current_floor_ptr->m_list[k].fx;
+ dummy_y = floor_ptr->m_list[k].fy;
+ dummy_x = floor_ptr->m_list[k].fx;
}
delete_monster_idx(k);
}
}
summon_named_creature(0, dummy_y, dummy_x, MON_BANORLUPART, mode);
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
- p_ptr->current_floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
+ floor_ptr->m_list[hack_m_idx_ii].hp = dummy_hp;
+ floor_ptr->m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
msg_print(_("『バーノール』と『ルパート』が合体した!", "Banor and Rupart combine into one!"));
break;
}
+
return 0;
}
*/
HIT_POINT spell_RF6_SPECIAL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
{
- monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+ floor_type *floor_ptr = target_ptr->current_floor_ptr;
+ monster_type *m_ptr = &floor_ptr->m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- disturb(p_ptr, TRUE, TRUE);
+ disturb(target_ptr, TRUE, TRUE);
switch (m_ptr->r_idx)
{
case MON_OHMU:
case MON_BANORLUPART:
case MON_BANOR:
case MON_LUPART:
- return spell_RF6_SPECIAL_BANORLUPART(m_idx);
+ return spell_RF6_SPECIAL_BANORLUPART(target_ptr, m_idx);
case MON_ROLENTO:
return spell_RF6_SPECIAL_ROLENTO(y, x, m_idx, t_idx, TARGET_TYPE);
/*!
* @brief ナズグル戦隊召喚の処理。 /
+* @param target_ptr プレーヤーへの参照ポインタ
* @param y 対象の地点のy座標
* @param x 対象の地点のx座標
* @param m_idx 呪文を唱えるモンスターID
* @return 召喚したモンスターの数を返す。
*/
-MONSTER_NUMBER summon_NAZGUL(POSITION y, POSITION x, MONSTER_IDX m_idx)
+MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
{
BIT_FLAGS mode = 0L;
int count = 0, k;
GAME_TEXT m_name[MAX_NLEN];
monster_name(m_idx, m_name);
- if (p_ptr->blind)
+ if (target_ptr->blind)
msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
else
msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
msg_print(NULL);
+ floor_type *floor_ptr = target_ptr->current_floor_ptr;
for (k = 0; k < 30; k++)
{
- if (!summon_possible(cy, cx) || !cave_empty_bold(p_ptr->current_floor_ptr, cy, cx))
+ if (!summon_possible(floor_ptr, cy, cx) || !cave_empty_bold(floor_ptr, cy, cx))
{
int j;
for (j = 100; j > 0; j--)
{
- scatter(p_ptr->current_floor_ptr, &cy, &cx, y, x, 2, 0);
- if (cave_empty_bold(p_ptr->current_floor_ptr, cy, cx)) break;
+ scatter(floor_ptr, &cy, &cx, y, x, 2, 0);
+ if (cave_empty_bold(floor_ptr, cy, cx)) break;
}
if (!j) break;
}
- if (!cave_empty_bold(p_ptr->current_floor_ptr, cy, cx)) continue;
+ if (!cave_empty_bold(floor_ptr, cy, cx)) continue;
if (summon_named_creature(m_idx, cy, cx, MON_NAZGUL, mode))
{
/*!
* @brief RF6_S_HI_UNDEADの処理。強力なアンデッド召喚。 /
+* @param target_ptr プレーヤーへの参照ポインタ
* @param y 対象の地点のy座標
* @param x 対象の地点のx座標
* @param m_idx 呪文を唱えるモンスターID
* @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
* @return 召喚したモンスターの数を返す。
*/
-void spell_RF6_S_HI_UNDEAD(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
+void spell_RF6_S_HI_UNDEAD(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
{
bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
- monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+ floor_type *floor_ptr = target_ptr->current_floor_ptr;
+ monster_type *m_ptr = &floor_ptr->m_list[m_idx];
DEPTH rlev = monster_level_idx(m_idx);
int k, count = 0;
GAME_TEXT m_name[MAX_NLEN];
monster_name(m_idx, m_name);
- disturb(p_ptr, TRUE, TRUE);
+ disturb(target_ptr, TRUE, TRUE);
if (((m_ptr->r_idx == MON_MORGOTH) || (m_ptr->r_idx == MON_SAURON) || (m_ptr->r_idx == MON_ANGMAR)) &&
((r_info[MON_NAZGUL].cur_num + 2) < r_info[MON_NAZGUL].max_num) &&
mon_to_player)
{
- count += summon_NAZGUL(y, x, m_idx);
+ count += summon_NAZGUL(target_ptr, y, x, m_idx);
}
else
{
count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | monster_u_mode(m_idx)));
}
}
- if (p_ptr->blind && count && mon_to_player)
+ if (target_ptr->blind && count && mon_to_player)
{
msg_print(_("間近で何か多くのものが這い回る音が聞こえる。", "You hear many creepy things appear nearby."));
}
if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
- p_ptr->current_floor_ptr->monster_noise = TRUE;
+ floor_ptr->monster_noise = TRUE;
}
/*!
case RF6_SPELL_START + 25: spell_RF6_S_DEMON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_DEMON */
case RF6_SPELL_START + 26: spell_RF6_S_UNDEAD(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_UNDEAD */
case RF6_SPELL_START + 27: spell_RF6_S_DRAGON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_DRAGON */
- case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_HI_UNDEAD */
+ case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(target_ptr, y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_HI_UNDEAD */
case RF6_SPELL_START + 29: spell_RF6_S_HI_DRAGON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_HI_DRAGON */
case RF6_SPELL_START + 30: spell_RF6_S_AMBERITES(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_AMBERITES */
case RF6_SPELL_START + 31: spell_RF6_S_UNIQUE(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_UNIQUE */
case RF6_SPELL_START + 25: spell_RF6_S_DEMON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_DEMON */
case RF6_SPELL_START + 26: spell_RF6_S_UNDEAD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_UNDEAD */
case RF6_SPELL_START + 27: spell_RF6_S_DRAGON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_DRAGON */
- case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_HI_UNDEAD */
+ case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(target_ptr, y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_HI_UNDEAD */
case RF6_SPELL_START + 29: spell_RF6_S_HI_DRAGON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_HI_DRAGON */
case RF6_SPELL_START + 30: spell_RF6_S_AMBERITES(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_AMBERITES */
case RF6_SPELL_START + 31: spell_RF6_S_UNIQUE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_UNIQUE */