W:2
K:DESTROYED:*FLOOR*
K:SECRET:INVIS
-F:LOS | PROJECT | MOVE | PLACE | SECRET | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI
+F:LOS | PROJECT | MOVE | PLACE | SECRET | TRAP | HIT_TRAP | CAN_FLY |
+F:HURT_DISI | TELEPORTABLE
# 0x03 --> glyph of warding
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:MORE | HIT_TRAP | CAN_FLY | HURT_DISI
+F:MORE | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x11 --> visible trap -- open pit
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x12 --> visible trap -- spiked pit
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x13 --> visible trap -- poison pit
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x14 --> visible trap -- rune -- summon
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x15 --> visible trap -- rune -- teleport
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x16 --> visible trap -- spot -- fire
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x17 --> visible trap -- spot -- acid
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x18 --> visible trap -- dart -- slow
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x19 --> visible trap -- dart -- lose str
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1A --> visible trap -- dart -- lose dex
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1B --> visible trap -- dart -- lose con
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1C --> visible trap -- gas -- blind
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1D --> visible trap -- gas -- confuse
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1E --> visible trap -- gas -- poison
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1F --> visible trap -- gas -- sleep
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x2x --> locked door (power 0)
E:shallow water
G:~:B:LIT
W:2
-F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | REMEMBER | WATER | SHALLOW | CAN_FLY |
-F:CAN_SWIM | TELEPORTABLE
+F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | REMEMBER | WATER | SHALLOW |
+F:CAN_FLY | CAN_SWIM | TELEPORTABLE
N:85:DEEP_LAVA
J:¿¼¤¤ÍÏ´äί¤ê
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:91:TRAP_ALARM
J:·ÙÊóÁõÃÖ
W:2
K:DESTROYED:*FLOOR*
F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI
+F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:92:TRAP_OPEN
J:³«Ì祹¥¤¥Ã¥Á
W:10
K:DESTROYED:*FLOOR*
F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI
+F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:93:FLOWER
J:²Ö
F:POWER_31 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
-#### Special fake terrains ####
+#### Special fake terrains (160-166) ####
N:160:*FLOOR*
M:FLOOR
E:swamp
G:.:B:LIT
W:2
-F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | REMEMBER | WATER | SHALLOW | CAN_FLY |
-F:CAN_SWIM | TELEPORTABLE
+F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | REMEMBER | WATER | SHALLOW |
+F:CAN_FLY | CAN_SWIM | TELEPORTABLE
N:195:MIRROR
J:¶À
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI
+F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:198:TRAP_PIRANHA
J:¥Ô¥é¥Ë¥¢¡¦¥È¥é¥Ã¥×
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI
+F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
msg_print("It twists space around you...");
#endif
- teleport_player(100);
+ teleport_player(100, FALSE);
o_ptr->timeout = 45;
break;
}
msg_print("You hit a teleport trap!");
#endif
- teleport_player(100);
+ teleport_player(100, TRUE);
break;
}
}
+bool trap_can_be_ignored(int feat)
+{
+ switch (feat)
+ {
+ case FEAT_TRAP_TRAPDOOR:
+ case FEAT_TRAP_PIT:
+ case FEAT_TRAP_SPIKED_PIT:
+ case FEAT_TRAP_POISON_PIT:
+ if (p_ptr->ffall) return TRUE;
+ break;
+ case FEAT_TRAP_TELEPORT:
+ if (p_ptr->anti_tele) return TRUE;
+ break;
+ case FEAT_TRAP_FIRE:
+ if (p_ptr->immune_fire) return TRUE;
+ break;
+ case FEAT_TRAP_ACID:
+ if (p_ptr->immune_acid) return TRUE;
+ break;
+ case FEAT_TRAP_BLIND:
+ if (p_ptr->resist_blind) return TRUE;
+ break;
+ case FEAT_TRAP_CONFUSE:
+ if (p_ptr->resist_conf) return TRUE;
+ break;
+ case FEAT_TRAP_POISON:
+ if (p_ptr->resist_pois) return TRUE;
+ break;
+ case FEAT_TRAP_SLEEP:
+ if (p_ptr->free_act) return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+
/*
* Determine if a "boundary" grid is "floor mimic"
*/
/* Disarm a visible trap */
else if ((do_pickup != easy_disarm) && have_flag(f_ptr->flags, FF_DISARM) && !c_ptr->mimic)
{
- bool ignore = FALSE;
- switch (c_ptr->feat)
- {
- case FEAT_TRAP_TRAPDOOR:
- case FEAT_TRAP_PIT:
- case FEAT_TRAP_SPIKED_PIT:
- case FEAT_TRAP_POISON_PIT:
- if (p_ptr->ffall) ignore = TRUE;
- break;
- case FEAT_TRAP_TELEPORT:
- if (p_ptr->anti_tele) ignore = TRUE;
- break;
- case FEAT_TRAP_FIRE:
- if (p_ptr->immune_fire) ignore = TRUE;
- break;
- case FEAT_TRAP_ACID:
- if (p_ptr->immune_acid) ignore = TRUE;
- break;
- case FEAT_TRAP_BLIND:
- if (p_ptr->resist_blind) ignore = TRUE;
- break;
- case FEAT_TRAP_CONFUSE:
- if (p_ptr->resist_conf) ignore = TRUE;
- break;
- case FEAT_TRAP_POISON:
- if (p_ptr->resist_pois) ignore = TRUE;
- break;
- case FEAT_TRAP_SLEEP:
- if (p_ptr->free_act) ignore = TRUE;
- break;
- }
-
- if (!ignore)
+ if (!trap_can_be_ignored(c_ptr->feat))
{
(void)do_cmd_disarm_aux(y, x, dir);
return;
case 1:
case 2:
case 3:
- teleport_player(10);
+ teleport_player(10, TRUE);
break;
case 4:
case 5:
case 6:
- teleport_player(100);
+ teleport_player(100, TRUE);
break;
case 7:
case 8:
- teleport_player(200);
+ teleport_player(200, TRUE);
break;
case 9:
case 10:
(void)detect_monsters_normal(DETECT_RAD_DEFAULT);
break;
case 1: /* Phase Door */
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case 2: /* Detect Doors and Traps */
(void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
(void)confuse_monster(dir, (plev * 3) / 2);
break;
case 5: /* Teleport */
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case 6: /* Sleep Monster */
if (!get_aim_dir(&dir)) return FALSE;
damroll(8 + ((plev - 5) / 4), 8), 0);
break;
case 7: /* Teleport Self */
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case 8: /* Wonder */
{
case 0: /* Phase Door */
if (success)
{
- teleport_player(10);
+ teleport_player(10, FALSE);
}
break;
case 1: /* Trump Spiders */
msg_print("It's a teleport trump card.");
#endif
- teleport_player(10);
+ teleport_player(10, TRUE);
}
else if (die < 42)
{
msg_print("It's a teleport trump card.");
#endif
- teleport_player(100);
+ teleport_player(100, TRUE);
}
else if (die < 52)
{
msg_print("It's a teleport trump card.");
#endif
- teleport_player(200);
+ teleport_player(200, TRUE);
}
else if (die < 60)
{
case 4: /* Teleport Self */
if (success)
{
- teleport_player(plev * 4);
+ teleport_player(plev * 4, FALSE);
}
break;
case 5: /* Trump Spying */
(void)detect_monsters_normal(DETECT_RAD_DEFAULT);
break;
case 4: /* Blink */
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case 5: /* Light Area */
(void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
(void)set_cut((p_ptr->cut / 2) - 50);
break;
case 19: /* Teleport */
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case 20: /* Identify */
return ident_spell(FALSE);
(void)sleep_monsters_touch();
break;
case 5:
- teleport_player(25+plev/2);
+ teleport_player(25 + plev / 2, FALSE);
break;
case 6:
if (!get_aim_dir(&dir)) return FALSE;
ident = TRUE;
if (one_in_(3)) lose_all_info();
else wiz_dark();
- teleport_player(100);
+ teleport_player(100, TRUE);
wiz_dark();
#ifdef JP
msg_print("ÃΤé¤Ê¤¤¾ì½ê¤ÇÌܤ¬Àä᤿¡£Æ¬Äˤ¬¤¹¤ë¡£");
case SV_SCROLL_PHASE_DOOR:
{
- teleport_player(10);
+ teleport_player(10, FALSE);
ident = TRUE;
break;
}
case SV_SCROLL_TELEPORT:
{
- teleport_player(100);
+ teleport_player(100, FALSE);
ident = TRUE;
break;
}
case SV_STAFF_TELEPORTATION:
{
- teleport_player(100);
+ teleport_player(100, FALSE);
ident = TRUE;
break;
}
msg_print("Your cloak twists space around you...");
#endif
- teleport_player(100);
+ teleport_player(100, FALSE);
o_ptr->timeout = 45;
break;
}
switch (randint1(13))
{
case 1: case 2: case 3: case 4: case 5:
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case 6: case 7: case 8: case 9: case 10:
- teleport_player(222);
+ teleport_player(222, FALSE);
break;
case 11: case 12:
(void)stair_creation();
case ART_KAMUI:
{
- teleport_player(222);
+ teleport_player(222, FALSE);
o_ptr->timeout = 25;
break;
}
if (o_ptr->name2 == EGO_TRUMP)
{
- teleport_player(100);
+ teleport_player(100, FALSE);
o_ptr->timeout = 50 + randint1(50);
/* Window stuff */
if (o_ptr->name2 == EGO_JUMP)
{
- teleport_player(10);
+ teleport_player(10, FALSE);
o_ptr->timeout = 10 + randint1(10);
/* Window stuff */
o_ptr->timeout = 200;
break;
case EGO_AMU_JUMP:
- teleport_player(10);
+ teleport_player(10, FALSE);
o_ptr->timeout = randint0(10) + 10;
break;
case EGO_AMU_TELEPORT:
- teleport_player(100);
+ teleport_player(100, FALSE);
o_ptr->timeout = randint0(50) + 50;
break;
case EGO_AMU_D_DOOR:
#endif
{
- teleport_player(200);
+ teleport_player(200, FALSE);
return;
}
else
#endif
msg_print(NULL);
- teleport_player(40);
+ teleport_player(40, TRUE);
}
}
msg_print(NULL);
if (one_in_(3)) lose_all_info();
else wiz_dark();
- teleport_player(100);
+ teleport_player(100, TRUE);
wiz_dark();
#ifdef JP
msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£");
#endif
{
disturb(0, 0);
- teleport_player(50);
+ teleport_player(50, FALSE);
}
else
{
disturb(0, 0);
/* Teleport player */
- teleport_player(40);
+ teleport_player(40, TRUE);
}
/* Handle HP draining */
if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
extern bool pattern_seq(int c_y, int c_x, int n_y, int n_x);
extern bool player_can_enter(s16b feature, u16b mode);
extern bool move_player_effect(int oy, int ox, int ny, int nx, u32b mpe_mode);
+extern bool trap_can_be_ignored(int feat);
extern void move_player(int dir, bool do_pickup, bool break_trap);
extern void run_step(int dir);
/* spells3.c */
extern bool teleport_away(int m_idx, int dis, bool dec_valour);
extern void teleport_monster_to(int m_idx, int ty, int tx, int power);
-extern bool cave_teleportable_bold(int y, int x);
-extern void teleport_player(int dis);
-extern void teleport_player_to(int ny, int nx, bool no_tele);
+extern bool cave_teleportable_bold(int y, int x, bool passive);
+extern void teleport_player(int dis, bool passive);
+extern void teleport_player_to(int ny, int nx, bool no_tele, bool passive);
extern void teleport_level(int m_idx);
extern int choose_dungeon(cptr note, int y, int x);
extern bool recall_player(int turns);
bool new_player_spot(void)
{
int y, x;
- int max_attempts = 5000;
+ int max_attempts = 10000;
cave_type *c_ptr;
+ feature_type *f_ptr;
/* Place the player */
while (max_attempts--)
if (c_ptr->m_idx) continue;
if (dun_level)
{
- if (!have_flag(f_flags_grid(c_ptr), FF_MOVE)) continue;
- if (!have_flag(f_flags_grid(c_ptr), FF_TELEPORTABLE)) continue;
+ f_ptr = &f_info[c_ptr->feat];
+
+ if (max_attempts > 5000) /* Rule 1 */
+ {
+ if (!have_flag(f_ptr->flags, FF_FLOOR)) continue;
+ }
+ else /* Rule 2 */
+ {
+ if (!have_flag(f_ptr->flags, FF_MOVE)) continue;
+ if (have_flag(f_ptr->flags, FF_HIT_TRAP)) continue;
+ }
+
+ /* Refuse to start on anti-teleport grids in dungeon */
+ if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) continue;
}
if (!player_can_enter(c_ptr->feat, 0)) continue;
if (!in_bounds(y, x)) continue;
case 27:
{
if (!tgt_pt(&x, &y)) return FALSE;
- if (!cave_teleportable_bold(y, x) ||
+ if (!cave_teleportable_bold(y, x, FALSE) ||
(distance(y, x, py, px) > MAX_SIGHT / 2) ||
!projectable(py, px, y, x))
{
break;
}
project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
- teleport_player_to(y, x, TRUE);
+ teleport_player_to(y, x, TRUE, FALSE);
break;
}
case 28:
(void)set_invuln(randint1(7) + 7, FALSE);
break;
case MS_BLINK:
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case MS_TELEPORT:
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case MS_WORLD:
world_player = TRUE;
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
}
- if (is_mirror_grid(&cave[py][px])) {
- teleport_player(10);
+ if (is_mirror_grid(&cave[py][px]))
+ {
+ teleport_player(10, FALSE);
}
}
break;
case 2:
/* Minor displace */
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case 3:
/* Major displace */
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case 4:
/* Domination */
break;
/* warped mirror */
case 3:
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
/* mirror of light */
case 4:
break;
/* mirror of wandering */
case 5:
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
/* robe of dust */
case 6:
break;
case 2:
{
- teleport_player(10);
+ teleport_player(10, FALSE);
if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
break;
}
case 4:
{
- teleport_player(p_ptr->lev*5);
+ teleport_player(p_ptr->lev * 5, FALSE);
if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
break;
#endif
else
{
- teleport_player(30);
+ teleport_player(30, FALSE);
if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
}
break;
case 9:
fire_ball(GF_FIRE, 0, 50+plev, plev/10+2);
- teleport_player(30);
+ teleport_player(30, FALSE);
if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
set_oppose_fire(plev, FALSE);
fire_ball(GF_POIS, 0, 75+plev*2/3, plev/5+2);
fire_ball(GF_OLD_DRAIN, 0, 75+plev*2/3, plev/5+2);
fire_ball(GF_CONFUSION, 0, 75+plev*2/3, plev/5+2);
- teleport_player(30);
+ teleport_player(30, FALSE);
if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
break;
#else
msg_print("Weird visions seem to dance before your eyes...");
#endif
- teleport_player(10);
-
+ teleport_player(10, TRUE);
}
else if (b < 96)
{
for (i=INVEN_RARM;i<INVEN_TOTAL;i++)
{
o_ptr = &inventory[i];
- if(!cursed_p(o_ptr))
+ if (!cursed_p(o_ptr))
{
object_flags(o_ptr, flgs);
- if((have_flag(flgs, TR_TELEPORT)) || (p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR))
+ if ((have_flag(flgs, TR_TELEPORT)) || (p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR))
{
#ifdef JP
- if(get_check_strict("¤Ä¤¤¤Æ¤¤¤¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL))
+ if (get_check_strict("¤Ä¤¤¤Æ¤¤¤¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL))
#else
- if(get_check_strict("Do you follow it? ", CHECK_OKAY_CANCEL))
+ if (get_check_strict("Do you follow it? ", CHECK_OKAY_CANCEL))
#endif
{
if (one_in_(3))
{
- teleport_player(200);
+ teleport_player(200, TRUE);
#ifdef JP
msg_print("¼ºÇÔ¡ª");
#else
msg_print("Failed!");
#endif
}
- else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
+ else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, FALSE);
p_ptr->energy_need += ENERGY_NEED();
}
break;
msg_format("%^s holds you, and drops from the sky.", m_name);
#endif
dam = damroll(4, 8);
- teleport_player_to(m_ptr->fy, m_ptr->fx, FALSE);
+ teleport_player_to(m_ptr->fy, m_ptr->fx, FALSE, TRUE);
sound(SOUND_FALL);
msg_format("%^s commands you to return.", m_name);
#endif
- teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
+ teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, TRUE);
learn_spell(MS_TELE_TO);
break;
}
#endif
learn_spell(MS_TELE_AWAY);
- teleport_player(100);
+ teleport_player(100, TRUE);
break;
}
object_flags(o_ptr, flgs);
- if((have_flag(flgs, TR_TELEPORT)) || (p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR))
+ if ((have_flag(flgs, TR_TELEPORT)) || (p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR))
{
#ifdef JP
cptr msg = "¤Ä¤¤¤Æ¤¤¤¤Þ¤¹¤«¡©";
cptr msg = "Do you follow it? ";
#endif
- if(get_check_strict(msg, CHECK_OKAY_CANCEL))
+ if (get_check_strict(msg, CHECK_OKAY_CANCEL))
{
if (one_in_(3))
{
- teleport_player(200);
+ teleport_player(200, TRUE);
#ifdef JP
msg_print("¼ºÇÔ¡ª");
#else
msg_print("Failed!");
#endif
}
- else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
+ else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, FALSE);
p_ptr->energy_need = ENERGY_NEED();
}
break;
dam = damroll(4, 8);
- if (t_idx == p_ptr->riding) teleport_player_to(m_ptr->fy, m_ptr->fx, FALSE);
+ if (t_idx == p_ptr->riding) teleport_player_to(m_ptr->fy, m_ptr->fx, FALSE, TRUE);
else teleport_monster_to(t_idx, m_ptr->fy, m_ptr->fx, 100);
sound(SOUND_FALL);
if (!resists_tele)
{
- if (t_idx == p_ptr->riding) teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
+ if (t_idx == p_ptr->riding) teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, TRUE);
else teleport_monster_to(t_idx, m_ptr->fy, m_ptr->fx, 100);
}
if (!resists_tele)
{
- if (t_idx == p_ptr->riding) teleport_player(MAX_SIGHT * 2 + 5);
+ if (t_idx == p_ptr->riding) teleport_player(MAX_SIGHT * 2 + 5, TRUE);
else teleport_away(t_idx, MAX_SIGHT * 2 + 5, FALSE);
}
(void)set_invuln(randint1(4) + 4, FALSE);
break;
case MS_BLINK:
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case MS_TELEPORT:
- teleport_player(plev * 5);
+ teleport_player(plev * 5, FALSE);
break;
case MS_WORLD:
world_player = TRUE;
msg_print("You concentrate...");
#endif
- teleport_player(10 + 4 * lvl);
+ teleport_player(10 + 4 * lvl, FALSE);
break;
case MUT1_MIND_BLST:
break;
case MUT1_BLINK:
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case MUT1_EAT_ROCK:
#else
msg_print("You failed to teleport.");
#endif
- else teleport_player(30);
+ else teleport_player(30, FALSE);
}
else
{
#else
msg_print("You are failed to run away.");
#endif
- else teleport_player(30);
+ else teleport_player(30, FALSE);
}
else
{
msg_print("Blink!");
#endif
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
case RACE_HALF_ORC:
msg_print("Gravity warps around you.");
#endif
- teleport_player(5);
+ teleport_player(5, TRUE);
if (!p_ptr->ffall)
(void)set_slow(p_ptr->slow + randint0(4) + 4, FALSE);
if (!(p_ptr->resist_sound || p_ptr->ffall))
}
case 32: case 33:
if (!(*count))
- {
+ {
#ifdef JP
msg_print("¼þ°Ï¤Î¶õ´Ö¤¬ÏĤó¤À¡ª");
#else
msg_print("Space warps about you!");
#endif
- teleport_player(damroll(10, 10));
+ teleport_player(damroll(10, 10), TRUE);
if (randint0(13)) (*count) += activate_hi_summon(py, px, FALSE);
if (!one_in_(6)) break;
}
y = py;
x = px;
- teleport_player(10+randint1(90));
+ teleport_player(10 + randint1(90), FALSE);
object_wipe(q_ptr);
}
/* Move player before updating the monster */
- if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
+ if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE);
/* Update the monster */
update_mon(cave[ny][nx].m_idx, TRUE);
break;
}
- if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
+ if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE);
if (mdeath) *mdeath = tmp_mdeath;
return TRUE;
}
-bool cave_teleportable_bold(int y, int x)
+bool cave_teleportable_bold(int y, int x, bool passive)
{
cave_type *c_ptr = &cave[y][x];
feature_type *f_ptr = &f_info[c_ptr->feat];
if (c_ptr->m_idx) return FALSE;
- if (!player_can_enter(c_ptr->feat, 0)) return FALSE;
-
- if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP))
+ if (!passive)
{
- if (!p_ptr->ffall && !p_ptr->can_swim) return FALSE;
- }
+ if (!player_can_enter(c_ptr->feat, 0)) return FALSE;
- if (have_flag(f_ptr->flags, FF_LAVA) && !p_ptr->immune_fire && !IS_INVULN())
- {
- /* Always forbid deep lave */
- if (have_flag(f_ptr->flags, FF_DEEP)) return FALSE;
+ if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP))
+ {
+ if (!p_ptr->ffall && !p_ptr->can_swim) return FALSE;
+ }
- /* Forbid shallow lave when the player don't have levitation */
- if (!p_ptr->ffall) return FALSE;
+ if (have_flag(f_ptr->flags, FF_LAVA) && !p_ptr->immune_fire && !IS_INVULN())
+ {
+ /* Always forbid deep lava */
+ if (have_flag(f_ptr->flags, FF_DEEP)) return FALSE;
+
+ /* Forbid shallow lava when the player don't have levitation */
+ if (!p_ptr->ffall) return FALSE;
+ }
+
+ if (have_flag(f_ptr->flags, FF_HIT_TRAP))
+ {
+ if (!is_known_trap(c_ptr) || !trap_can_be_ignored(c_ptr->feat)) return FALSE;
+ }
}
return TRUE;
* we decrease the minimum acceptable distance to try to increase randomness.
* -GJW
*/
-void teleport_player(int dis)
+void teleport_player(int dis, bool passive)
{
int d, i, min, ox, oy;
int tries = 0;
/* Ignore illegal locations */
if (!in_bounds(y, x)) continue;
- if (!cave_teleportable_bold(y, x)) continue;
+ if (!cave_teleportable_bold(y, x, passive)) continue;
/* This grid looks good */
look = FALSE;
* This function is slightly obsessive about correctness.
* This function allows teleporting into vaults (!)
*/
-void teleport_player_to(int ny, int nx, bool no_tele)
+void teleport_player_to(int ny, int nx, bool no_tele, bool passive)
{
int y, x, dis = 0, ctr = 0;
if (p_ptr->wizard) break;
/* Accept teleportable floor grids */
- if (cave_teleportable_bold(y, x)) break;
+ if (cave_teleportable_bold(y, x, passive)) break;
/* Occasionally advance the distance */
if (++ctr > (4 * dis * dis + 4 * dis + 1))
{
case 1: case 2: case 3:
{
- teleport_player(200);
+ teleport_player(200, TRUE);
break;
}
case 4: case 5:
{
- teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
+ teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, TRUE);
break;
}
p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L);
- if (!cave_teleportable_bold(y, x) ||
+ if (!cave_teleportable_bold(y, x, FALSE) ||
(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);
+ teleport_player((plev + 2) * 2, TRUE);
/* Failed */
return FALSE;
}
else
{
- teleport_player_to(y, x, TRUE);
+ teleport_player_to(y, x, TRUE, FALSE);
/* Success */
return TRUE;
if (!tgt_pt(&x, &y)) return FALSE;
- teleport_player_to(y, x, FALSE);
+ teleport_player_to(y, x, FALSE, FALSE);
return (TRUE);
}
if (!target_who) return;
/* Teleport to the target */
- teleport_player_to(target_row, target_col, FALSE);
+ teleport_player_to(target_row, target_col, FALSE, FALSE);
}
/* Phase Door */
case 'p':
- teleport_player(10);
+ teleport_player(10, FALSE);
break;
#if 0
/* Teleport */
case 't':
- teleport_player(100);
+ teleport_player(100, FALSE);
break;
/* Very Good Objects */