int tele_impl(boolean wizard_tele, boolean run_next_to_u) { coord cc; /* Disable teleportation in stronghold && Vlad's Tower */ if (level->flags.noteleport) { if (!wizard_tele) { pline("A mysterious force prevents you from teleporting!"); return 1; } } /* don't show trap if "Sorry..." */ if (!Blinded) make_blinded(0L, FALSE); /* when it happens at all, happens too often to be worth a custom RNG */ if ((Uhave_amulet || On_W_tower_level(&u.uz)) && !rn2(3)) { pline("You feel disoriented for a moment."); return 1; } if ((Teleport_control && !Stunned) || wizard_tele) { if (u_helpless(hm_unconscious)) { pline("Being unconscious, you cannot control your teleport."); } else { pline("To what position do you%s want to be teleported?", u.usteed ? msgcat(" and ", mon_nam(u.usteed)) : ""); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, FALSE, "the desired position", FALSE) == NHCR_CLIENT_CANCEL) return 0; /* abort */ if (run_next_to_u) { if (!next_to_u()) { pline("You shudder for a moment."); return 1; } } /* possible extensions: introduce a small error if magic power is low; allow transfer to solid rock */ if (u_teleok(cc.x, cc.y, FALSE, wizard_tele)) { teleds(cc.x, cc.y, FALSE); return 1; } pline("Sorry..."); } } safe_teleds(FALSE); return 1; }
void tele(void) { coord cc; /* Disable teleportation in stronghold && Vlad's Tower */ if (level->flags.noteleport) { if (!wizard) { pline("A mysterious force prevents you from teleporting!"); return; } } /* don't show trap if "Sorry..." */ if (!Blinded) make_blinded(0L, FALSE); if ((u.uhave.amulet || On_W_tower_level(&u.uz)) && !rn2(3)) { pline("You feel disoriented for a moment."); return; } if ((Teleport_control && !Stunned) || wizard) { if (unconscious()) { pline("Being unconscious, you cannot control your teleport."); } else { char buf[BUFSZ]; if (u.usteed) sprintf(buf, " and %s", mon_nam(u.usteed)); pline("To what position do you%s want to be teleported?", u.usteed ? buf : ""); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the desired position") < 0) return; /* abort */ /* possible extensions: introduce a small error if magic power is low; allow transfer to solid rock */ if (teleok(cc.x, cc.y, FALSE)) { teleds(cc.x, cc.y, FALSE); return; } pline("Sorry..."); } } safe_teleds(FALSE); }