summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/teleport.cc
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-14 14:00:19 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-14 14:35:32 +0100
commitde8f8489a0d497cd8288f55a2054747c2e59b19c (patch)
tree99a08496fdbbfd578d076965673e49db08127949 /crawl-ref/source/teleport.cc
parent32f2619586aa20a912638ecfd26ca7ae090274f4 (diff)
downloadcrawl-ref-de8f8489a0d497cd8288f55a2054747c2e59b19c.tar.gz
crawl-ref-de8f8489a0d497cd8288f55a2054747c2e59b19c.zip
Add actor::blink_to for handling blink movement and messaging.
Diffstat (limited to 'crawl-ref/source/teleport.cc')
-rw-r--r--crawl-ref/source/teleport.cc44
1 files changed, 44 insertions, 0 deletions
diff --git a/crawl-ref/source/teleport.cc b/crawl-ref/source/teleport.cc
index 30941b1d20..3d0f4d5164 100644
--- a/crawl-ref/source/teleport.cc
+++ b/crawl-ref/source/teleport.cc
@@ -13,6 +13,8 @@
#include "env.h"
#include "fprop.h"
#include "los.h"
+#include "monster.h"
+#include "mon-stuff.h"
#include "player.h"
#include "random.h"
#include "random-weight.h"
@@ -46,6 +48,48 @@ static coord_def random_close_space(actor* victim, actor* target)
return (choice ? *choice : coord_def(0, 0));
}
+bool player::blink_to(const coord_def& dest, bool quiet)
+{
+ // We rely on the non-generalized move_player_to_cell.
+ ASSERT(this == &you);
+
+ if (dest == pos())
+ return (false);
+ if (!quiet)
+ mpr("You blink.");
+ const coord_def origin = pos();
+ if (!move_player_to_grid(dest, false, true, true))
+ return (false);
+ place_cloud(CLOUD_TLOC_ENERGY, origin, 1 + random2(3), KC_YOU);
+ return (true);
+}
+
+bool monsters::blink_to(const coord_def& dest, bool quiet)
+{
+ if (dest == pos())
+ return (false);
+ if (!quiet)
+ simple_monster_message(this, " blinks!");
+
+ if (!(flags & MF_WAS_IN_VIEW))
+ seen_context = "thin air";
+
+ const coord_def oldplace = pos();
+ if (!move_to_pos(dest))
+ return (false);
+
+ // Leave a purple cloud.
+ place_cloud(CLOUD_TLOC_ENERGY, oldplace, 1 + random2(3),
+ kill_alignment());
+
+ check_redraw(oldplace);
+ apply_location_effects(oldplace);
+
+ mons_relocated(this);
+
+ return (true);
+}
+
// Blink the player closer to the monster at target.
void blink_closer(const coord_def &target)
{