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 actionif (mover->confused())return false;// Right now just happens in sanctuaryif (!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-versaif (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()