summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-02 01:10:42 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-02 01:10:42 +0000
commit695043d0e495b29b0a7aa9e24acd93bdbf2e3e9f (patch)
tree2cb5e0ac7a399a90d678fad13f03a7f4262cd81d /crawl-ref/source
parentf861f518dc8853c8a6e28a9a8902b8cf3b85e2f3 (diff)
downloadcrawl-ref-695043d0e495b29b0a7aa9e24acd93bdbf2e3e9f.tar.gz
crawl-ref-695043d0e495b29b0a7aa9e24acd93bdbf2e3e9f.zip
Add new wizard targeting command 'm', to move monsters around (or to
move the player like wizard blink if there's no monster at the chosen square). Two monsters can be made to swap positions, and unseen monsters/squares can be targeted. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5423 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/command.cc1
-rw-r--r--crawl-ref/source/debug.cc79
-rw-r--r--crawl-ref/source/debug.h1
-rw-r--r--crawl-ref/source/directn.cc11
-rw-r--r--crawl-ref/source/enum.h1
5 files changed, 93 insertions, 0 deletions
diff --git a/crawl-ref/source/command.cc b/crawl-ref/source/command.cc
index db47d0442c..ca6f166666 100644
--- a/crawl-ref/source/command.cc
+++ b/crawl-ref/source/command.cc
@@ -660,6 +660,7 @@ static const char *targeting_help_1 =
"<w>s</w>: force monster to shout or speak\n"
"<w>F</w>: cycle monster friendly/good neutral/neutral/hostile\n"
"<w>P</w>: apply divine blessing to monster\n"
+ "<w>m</w>: move monster or player\n"
#endif
;
diff --git a/crawl-ref/source/debug.cc b/crawl-ref/source/debug.cc
index e2e369fd25..5d3a23f408 100644
--- a/crawl-ref/source/debug.cc
+++ b/crawl-ref/source/debug.cc
@@ -75,6 +75,7 @@
#include "monspeak.h"
#include "monstuff.h"
#include "mon-util.h"
+#include "mstuff2.h"
#include "mutation.h"
#include "newgame.h"
#include "ouch.h"
@@ -3796,6 +3797,84 @@ void wizard_give_monster_item(monsters *mon)
}
#endif
+#ifdef WIZARD
+
+static void _move_player(int x, int y)
+{
+ // no longer held in net
+ clear_trapping_net();
+
+ if (!you.can_pass_through_feat(grd[x][y]))
+ grd[x][y] = DNGN_FLOOR;
+ move_player_to_grid(x, y, false, true, true);
+}
+
+static void _move_monster(int x, int y, int mid1)
+{
+ dist moves;
+ direction(moves, DIR_NONE, TARG_ANY, -1, true, false,
+ "Move monster to where?");
+
+ if (!moves.isValid || !in_bounds(moves.tx, moves.ty))
+ return;
+
+ struct monsters* mon1 = &menv[mid1];
+ if (mons_is_caught(mon1))
+ mons_clear_trapping_net(mon1);
+
+ int mid2 = mgrd[moves.tx][moves.ty];
+ struct monsters* mon2 = NULL;
+
+ if (mid2 != NON_MONSTER)
+ {
+ mon2 = &menv[mid2];
+
+ if (mons_is_caught(mon2))
+ mons_clear_trapping_net(mon2);
+ }
+
+ mon1->x = moves.tx;
+ mon1->y = moves.ty;
+ mgrd[moves.tx][moves.ty] = mid1;
+ mon1->check_redraw(moves.target());
+
+ mgrd[x][y] = mid2;
+
+ if (mon2 != NULL)
+ {
+ mon2->x = x;
+ mon2->y = y;
+
+ mon1->check_redraw(coord_def(x, y));
+ }
+}
+
+void wizard_move_player_or_monster(int x, int y)
+{
+ crawl_state.cancel_cmd_again();
+ crawl_state.cancel_cmd_repeat();
+
+ static bool already_moving = false;
+
+ if (already_moving)
+ {
+ mpr("Already doing a move command.");
+ return;
+ }
+
+ already_moving = true;
+
+ int mid = mgrd[x][y];
+
+ if (mid == NON_MONSTER)
+ _move_player(x, y);
+ else
+ _move_monster(x, y, mid);
+
+ already_moving = false;
+}
+#endif
+
#ifdef DEBUG_DIAGNOSTICS
// Map statistics generation.
diff --git a/crawl-ref/source/debug.h b/crawl-ref/source/debug.h
index 3a89575998..6b4039bd8b 100644
--- a/crawl-ref/source/debug.h
+++ b/crawl-ref/source/debug.h
@@ -164,6 +164,7 @@ class monsters;
void debug_make_monster_shout(monsters* mon);
void debug_apply_monster_blessing(monsters* mon);
void wizard_give_monster_item(monsters* mon);
+void wizard_move_player_or_monster(int x, int y);
#ifdef DEBUG_DIAGNOSTICS
void generate_map_stats();
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index 30cad152a3..1cb11e4303 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -900,6 +900,16 @@ void direction(dist& moves, targeting_type restricts,
wizard_give_monster_item(&menv[mid]);
break;
+
+ case CMD_TARGET_WIZARD_MOVE:
+ if (!you.wizard || !in_bounds(moves.tx, moves.ty))
+ break;
+ wizard_move_player_or_monster(moves.tx, moves.ty);
+
+ loop_done = true;
+ skip_iter = true;
+
+ break;
#endif
case CMD_TARGET_DESCRIBE:
@@ -2464,6 +2474,7 @@ command_type targeting_behaviour::get_command(int key)
case 'P': return CMD_TARGET_WIZARD_BLESS_MONSTER;
case 's': return CMD_TARGET_WIZARD_MAKE_SHOUT;
case 'g': return CMD_TARGET_WIZARD_GIVE_ITEM;
+ case 'm': return CMD_TARGET_WIZARD_MOVE;
#endif
case 'v': return CMD_TARGET_DESCRIBE;
case '?': return CMD_TARGET_HELP;
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 425e92b957..873fb760cf 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -599,6 +599,7 @@ enum command_type
CMD_TARGET_WIZARD_BLESS_MONSTER,
CMD_TARGET_WIZARD_MAKE_SHOUT,
CMD_TARGET_WIZARD_GIVE_ITEM,
+ CMD_TARGET_WIZARD_MOVE,
CMD_TARGET_HELP,
#ifdef USE_TILE