#define HURT_CHANCE 16
-static bool cave_monster_teleportable_bold(int m_idx, int y, int x, bool passive)
+static bool cave_monster_teleportable_bold(int m_idx, int y, int x, u32b mode)
{
monster_type *m_ptr = &m_list[m_idx];
cave_type *c_ptr = &cave[y][x];
if (is_glyph_grid(c_ptr)) return FALSE;
if (is_explosive_rune_grid(c_ptr)) return FALSE;
- if (!passive)
+ if (!(mode & TELEPORT_PASSIVE))
{
if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], 0)) return FALSE;
}
*
* But allow variation to prevent infinite loops.
*/
-bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive)
+bool teleport_away(int m_idx, int dis, u32b mode)
{
int oy, ox, d, i, min;
int tries = 0;
/* Minimum distance */
min = dis / 2;
- if (dec_valour &&
+ if ((mode & TELEPORT_DEC_VALOUR) &&
(((p_ptr->chp * 10) / p_ptr->mhp) > 5) &&
(4+randint1(5) < ((p_ptr->chp * 10) / p_ptr->mhp)))
{
/* Ignore illegal locations */
if (!in_bounds(ny, nx)) continue;
- if (!cave_monster_teleportable_bold(m_idx, ny, nx, passive)) continue;
+ if (!cave_monster_teleportable_bold(m_idx, ny, nx, mode)) continue;
/* No teleporting into vaults and such */
if (!(p_ptr->inside_quest || p_ptr->inside_arena))
/*
* Teleport monster next to a grid near the given location
*/
-void teleport_monster_to(int m_idx, int ty, int tx, int power, bool passive)
+void teleport_monster_to(int m_idx, int ty, int tx, int power, u32b mode)
{
int ny, nx, oy, ox, d, i, min;
int attempts = 500;
/* Ignore illegal locations */
if (!in_bounds(ny, nx)) continue;
- if (!cave_monster_teleportable_bold(m_idx, ny, nx, passive)) continue;
+ if (!cave_monster_teleportable_bold(m_idx, ny, nx, mode)) continue;
/* No teleporting into vaults and such */
/* if (cave[ny][nx].info & (CAVE_ICKY)) continue; */
}
-bool cave_player_teleportable_bold(int y, int x, bool passive, bool nonmagical)
+bool cave_player_teleportable_bold(int y, int x, u32b mode)
{
cave_type *c_ptr = &cave[y][x];
feature_type *f_ptr = &f_info[c_ptr->feat];
if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) return FALSE;
/* No magical teleporting into vaults and such */
- if (!nonmagical && (c_ptr->info & CAVE_ICKY)) return FALSE;
+ if (!(mode & TELEPORT_NONMAGICAL) && (c_ptr->info & CAVE_ICKY)) return FALSE;
if (c_ptr->m_idx && (c_ptr->m_idx != p_ptr->riding)) return FALSE;
- if (!passive)
+ if (!(mode & TELEPORT_PASSIVE))
{
if (!player_can_enter(c_ptr->feat, 0)) return FALSE;
#define MAX_TELEPORT_DISTANCE 200
-bool teleport_player_aux(int dis, bool passive, bool nonmagical)
+bool teleport_player_aux(int dis, u32b mode)
{
int candidates_at[MAX_TELEPORT_DISTANCE + 1];
int total_candidates, cur_candidates;
if (p_ptr->wild_mode) return FALSE;
- if (p_ptr->anti_tele && !nonmagical)
+ if (p_ptr->anti_tele && !(mode & TELEPORT_NONMAGICAL))
{
#ifdef JP
msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
int d;
/* Skip illegal locations */
- if (!cave_player_teleportable_bold(y, x, passive, nonmagical)) continue;
+ if (!cave_player_teleportable_bold(y, x, mode)) continue;
/* Calculate distance */
d = distance(py, px, y, x);
int d;
/* Skip illegal locations */
- if (!cave_player_teleportable_bold(y, x, passive, nonmagical)) continue;
+ if (!cave_player_teleportable_bold(y, x, mode)) continue;
/* Calculate distance */
d = distance(py, px, y, x);
return TRUE;
}
-void teleport_player(int dis, bool passive)
+void teleport_player(int dis, u32b mode)
{
int yy, xx;
int oy = py;
int ox = px;
- if (!teleport_player_aux(dis, passive, FALSE)) return;
+ if (!teleport_player_aux(dis, mode)) return;
/* Monsters with teleport ability may follow the player */
for (xx = -1; xx < 2; xx++)
if ((r_ptr->flags6 & RF6_TPORT) &&
!(r_ptr->flagsr & RFR_RES_TELE))
{
- if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, FALSE);
+ if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, 0L);
}
}
}
int oy = py;
int ox = px;
- if (!teleport_player_aux(dis, TRUE, FALSE)) return;
+ if (!teleport_player_aux(dis, TELEPORT_PASSIVE)) return;
/* Monsters with teleport ability may follow the player */
for (xx = -1; xx < 2; xx++)
if ((r_ptr->flags6 & RF6_TPORT) &&
!(r_ptr->flagsr & RFR_RES_TELE))
{
- if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, FALSE);
+ if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, 0L);
}
}
}
* This function is slightly obsessive about correctness.
* This function allows teleporting into vaults (!)
*/
-void teleport_player_to(int ny, int nx, bool no_tele, bool passive)
+void teleport_player_to(int ny, int nx, u32b mode)
{
int y, x, dis = 0, ctr = 0;
- if (p_ptr->anti_tele && no_tele)
+ if (p_ptr->anti_tele && !(mode & TELEPORT_NONMAGICAL))
{
#ifdef JP
msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
}
/* Accept any grid when wizard mode */
- if (p_ptr->wizard && !passive && (!cave[y][x].m_idx || (cave[y][x].m_idx == p_ptr->riding))) break;
+ if (p_ptr->wizard && !(mode & TELEPORT_PASSIVE) && (!cave[y][x].m_idx || (cave[y][x].m_idx == p_ptr->riding))) break;
/* Accept teleportable floor grids */
- if (cave_player_teleportable_bold(y, x, passive, !no_tele)) break;
+ if (cave_player_teleportable_bold(y, x, mode)) break;
/* Occasionally advance the distance */
if (++ctr > (4 * dis * dis + 4 * dis + 1))
bool old_ml = m_ptr->ml;
int old_cdis = m_ptr->cdis;
- teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE, FALSE);
+ teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
- if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && los(py, px, oldfy, oldfx))
+ if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && !p_ptr->inside_battle && los(py, px, oldfy, oldfx))
{
bool follow = FALSE;
{
if (one_in_(3))
{
- teleport_player(200, TRUE);
+ teleport_player(200, TELEPORT_PASSIVE);
#ifdef JP
msg_print("¼ºÇÔ¡ª");
#else
msg_print("Failed!");
#endif
}
- else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, FALSE);
+ else teleport_player_to(m_ptr->fy, m_ptr->fx, 0L);
p_ptr->energy_need += ENERGY_NEED();
}
}
/* Check for quest completion */
check_quest_completion(m_ptr);
+ if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
+ {
+ char m2_name[80];
+
+ monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
+ do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_TELE_LEVEL, m2_name);
+ }
+
delete_monster_idx(m_idx);
}
{
case 1: case 2: case 3:
{
- teleport_player(200, TRUE);
+ teleport_player(200, TELEPORT_PASSIVE);
break;
}
case 4: case 5:
{
- teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, TRUE);
+ teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE);
break;
}
(void)set_monster_csleep(c_ptr->m_idx, 0);
/* Notice the "waking up" */
- if (is_seen(m_ptr))
+ if (m_ptr->ml)
{
/* Acquire the monster name */
monster_desc(m_name, m_ptr, 0);
/* Create a glyph */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_GLYPH;
+ cave[py][px].mimic = feat_glyph;
/* Notice */
note_spot(py, px);
/* Create a mirror */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_MIRROR;
+ cave[py][px].mimic = feat_mirror;
/* Turn on the light */
cave[py][px].info |= CAVE_GLOW;
/* Create a glyph */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_MINOR_GLYPH;
+ cave[py][px].mimic = feat_explosive_rune;
/* Notice */
note_spot(py, px);
else
item_tester_hook = item_tester_hook_identify;
- if (!can_get_item())
+ if (can_get_item())
+ {
+#ifdef JP
+ q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
+#else
+ q = "Identify which item? ";
+#endif
+ }
+ else
{
if (only_equip)
- {
item_tester_hook = object_is_weapon_armour_ammo;
- }
else
- {
item_tester_hook = NULL;
- }
+
+#ifdef JP
+ q = "¤¹¤Ù¤Æ´ÕÄêºÑ¤ß¤Ç¤¹¡£ ";
+#else
+ q = "All items are identified. ";
+#endif
}
/* Get an item */
#ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
-s = "´ÕÄꤹ¤ë¤Ù¤¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
+ s = "´ÕÄꤹ¤ë¤Ù¤¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
#else
- q = "Identify which item? ";
s = "You have nothing to identify.";
#endif
else
item_tester_hook = item_tester_hook_identify_fully;
- if (!can_get_item())
+ if (can_get_item())
+ {
+#ifdef JP
+ q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò*´ÕÄê*¤·¤Þ¤¹¤«? ";
+#else
+ q = "*Identify* which item? ";
+#endif
+ }
+ else
{
if (only_equip)
item_tester_hook = object_is_weapon_armour_ammo;
else
item_tester_hook = NULL;
+
+#ifdef JP
+ q = "¤¹¤Ù¤Æ*´ÕÄê*ºÑ¤ß¤Ç¤¹¡£ ";
+#else
+ q = "All items are *identified*. ";
+#endif
}
/* Get an item */
#ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
-s = "´ÕÄꤹ¤ë¤Ù¤¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
+ s = "*´ÕÄê*¤¹¤ë¤Ù¤¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
#else
- q = "Identify which item? ";
- s = "You have nothing to identify.";
+ s = "You have nothing to *identify*.";
#endif
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
object_type *o_ptr;
char o_name[MAX_NLEN];
- /* Multishadow effects is determined by turn */
- if( p_ptr->multishadow && (turn & 1) )return 0;
+ if (CHECK_MULTISHADOW()) return 0;
if (p_ptr->inside_arena) return 0;
if (p_ptr->resist_acid) dam = (dam + 2) / 3;
if (double_resist) dam = (dam + 2) / 3;
- if ((!(double_resist || p_ptr->resist_acid)) &&
- one_in_(HURT_CHANCE))
- (void)do_dec_stat(A_CHR);
+ if (!CHECK_MULTISHADOW())
+ {
+ if ((!(double_resist || p_ptr->resist_acid)) &&
+ one_in_(HURT_CHANCE))
+ (void)do_dec_stat(A_CHR);
- /* If any armor gets hit, defend the player */
- if (minus_ac()) dam = (dam + 1) / 2;
+ /* If any armor gets hit, defend the player */
+ if (minus_ac()) dam = (dam + 1) / 2;
+ }
/* Take damage */
- get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+ get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
/* Inventory damage */
if (!(double_resist && p_ptr->resist_acid))
if (double_resist) dam = (dam + 2) / 3;
if ((!(double_resist || p_ptr->resist_elec)) &&
- one_in_(HURT_CHANCE))
+ one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
(void)do_dec_stat(A_DEX);
/* Take damage */
- get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+ get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
/* Inventory damage */
if (!(double_resist && p_ptr->resist_elec))
if (double_resist) dam = (dam + 2) / 3;
if ((!(double_resist || p_ptr->resist_fire)) &&
- one_in_(HURT_CHANCE))
+ one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
(void)do_dec_stat(A_STR);
/* Take damage */
- get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+ get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
/* Inventory damage */
if (!(double_resist && p_ptr->resist_fire))
if (double_resist) dam = (dam + 2) / 3;
if ((!(double_resist || p_ptr->resist_cold)) &&
- one_in_(HURT_CHANCE))
+ one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
(void)do_dec_stat(A_STR);
/* Take damage */
- get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+ get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
/* Inventory damage */
if (!(double_resist && p_ptr->resist_cold))
if (new_r_idx != old_r_idx)
{
u32b mode = 0L;
+ bool preserve_hold_objects = back_m.hold_o_idx ? TRUE : FALSE;
+ s16b this_o_idx, next_o_idx = 0;
/* Get the monsters attitude */
if (is_friendly(m_ptr)) mode |= PM_FORCE_FRIENDLY;
if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET;
+ /* Mega-hack -- ignore held objects */
+ m_ptr->hold_o_idx = 0;
+
/* "Kill" the "old" monster */
delete_monster_idx(c_ptr->m_idx);
/* Create a new monster (no groups) */
if (place_monster_aux(0, y, x, new_r_idx, mode))
{
+ m_list[hack_m_idx_ii].nickname = back_m.nickname;
+ m_list[hack_m_idx_ii].parent_m_idx = back_m.parent_m_idx;
+ m_list[hack_m_idx_ii].hold_o_idx = back_m.hold_o_idx;
+
/* Success */
polymorphed = TRUE;
}
/* Re-initialize monster process */
mproc_init();
}
+ else preserve_hold_objects = FALSE;
+ }
+
+ /* Mega-hack -- preserve held objects */
+ if (preserve_hold_objects)
+ {
+ for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
+ {
+ /* Acquire object */
+ object_type *o_ptr = &o_list[this_o_idx];
+
+ /* Acquire next object */
+ next_o_idx = o_ptr->next_o_idx;
+
+ /* Held by new monster */
+ o_ptr->held_m_idx = hack_m_idx_ii;
+ }
+ }
+ else if (back_m.hold_o_idx) /* Failed (paranoia) */
+ {
+ /* Delete objects */
+ for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
+ {
+ /* Acquire next object */
+ next_o_idx = o_list[this_o_idx].next_o_idx;
+
+ /* Delete the object */
+ delete_object_idx(this_o_idx);
+ }
}
if (targeted) target_who = hack_m_idx_ii;
p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L);
- if (!cave_player_teleportable_bold(y, x, FALSE, FALSE) ||
+ if (!cave_player_teleportable_bold(y, x, 0L) ||
(distance(y, x, py, px) > plev / 2 + 10) ||
(!randint0(plev / 10 + 10)))
{
p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L);
- teleport_player((plev + 2) * 2, TRUE);
+ teleport_player((plev + 2) * 2, TELEPORT_PASSIVE);
/* Failed */
return FALSE;
}
else
{
- teleport_player_to(y, x, TRUE, FALSE);
+ teleport_player_to(y, x, 0L);
/* Success */
return TRUE;