Let monsters inside sanctuary swap places if they're (probably) going in opposite directions.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6329 c06c8d41-db1a-0410-9941-cceddc491573
NCRXRQNCAMQQOZCL7TBMKGM6TOGDAHR3GRXAVVB26FLGE2KUZC2QC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
QR6YCIDD2Z6XGJM6CIWIOWT7WG3TS2RJ6UGCEPZD3J3QISG5BURAC
PKHOZG6TIUP2NZZIP6CW5OIPZ3O6PCGWXXW5MH4I6P2WVM24HZEQC
static bool _swap_monsters(const int mover_idx, const int moved_idx)
{
monsters* mover = &menv[mover_idx];
monsters* moved = &menv[moved_idx];
// Can't swap with a stationary monster.
if (mons_is_stationary(moved))
return false;
// Swapping is a purposful action
if (mover->confused())
return false;
// Right now just happens in sanctuary
if (!is_sanctuary(mover->x, mover->y) || !is_sanctuary(moved->x, moved->y))
return false;
// A friendly or good-neutral monster moving past a fleeing hostile
// or neutral monster, or visa-versa
if (mons_wont_attack(mover) == mons_wont_attack(moved)
|| mons_is_fleeing(mover) == mons_is_fleeing(moved))
{
return false;
}
if (!mover->can_pass_through(moved->x, moved->y)
|| !moved->can_pass_through(mover->x, mover->y))
{
return false;
}
if (!monster_habitable_grid(mover, grd[moved->x][moved->y])
|| !monster_habitable_grid(moved, grd[mover->x][mover->y]))
{
return false;
}
// Okay, we can do the swap.
const coord_def mover_pos = mover->pos();
const coord_def moved_pos = moved->pos();
mover->x = moved_pos.x;
mover->y = moved_pos.y;
moved->x = mover_pos.x;
moved->y = mover_pos.y;
mgrd(mover->pos()) = mover_idx;
mgrd(moved->pos()) = moved_idx;
if (you.can_see(mover) && you.can_see(moved))
{
mprf("%s and %s swap places.", mover->name(DESC_CAP_THE).c_str(),
moved->name(DESC_NOCAP_THE).c_str());
}
return true;
} // bool _swap_monsters()