Let wandering mushrooms swap with toadstools.
authorSage <SageBasilMint@gmail.com>
Tue, 25 Feb 2014 23:57:38 +0000 (16:57 -0700)
committerSage <SageBasilMint@gmail.com>
Wed, 26 Feb 2014 00:00:33 +0000 (17:00 -0700)
...And not block your exit when you are swapping through toadstools.
Addresses annoyances while playing Fedhasites, after praying in
corridors and blocking off allied mushrooms, or getting blocked in by
mushrooms in a hole in a wall. Other allies are still blocked by
toadstools.

crawl-ref/source/mon-act.cc
crawl-ref/source/mon-act.h
crawl-ref/source/mon-pathfind.cc
crawl-ref/source/mon-stuff.cc

index 5d1c576..77ac046 100644 (file)
@@ -39,7 +39,6 @@
 #include "mon-place.h"
 #include "mon-project.h"
 #include "mgen_data.h"
-#include "mon-stuff.h"
 #include "mon-util.h"
 #include "notes.h"
 #include "player.h"
@@ -3130,6 +3129,14 @@ static bool _mons_can_displace(const monster* mpusher,
     if (invalid_monster_index(ipushee))
         return false;
 
+    if (mpusher->type == MONS_WANDERING_MUSHROOM
+        && mpushee->type == MONS_TOADSTOOL
+        || mpusher->type == MONS_TOADSTOOL
+           && mpushee->type == MONS_WANDERING_MUSHROOM)
+    {
+        return true;
+    }
+
     if (!mpushee->has_action_energy()
         && !_same_tentacle_parts(mpusher, mpushee))
     {
@@ -3346,6 +3353,10 @@ bool mon_can_move_to_pos(const monster* mons, const coord_def& delta,
         if (!summon_can_attack(mons, targ))
             return false;
 
+        if (targmonster->type == MONS_TOADSTOOL
+            && mons->type == MONS_WANDERING_MUSHROOM)
+            return true;
+
         // Cut down plants only when no alternative, or they're
         // our target.
         if (mons_is_firewood(targmonster) && mons->target != targ)
@@ -3487,7 +3498,7 @@ static void _jelly_grows(monster* mons)
     _jelly_divide(mons);
 }
 
-static bool _monster_swaps_places(monster* mon, const coord_def& delta)
+bool monster_swaps_places(monster* mon, const coord_def& delta, bool takes_time)
 {
     if (delta.origin())
         return false;
@@ -3522,11 +3533,14 @@ static bool _monster_swaps_places(monster* mon, const coord_def& delta)
     }
 
     // Okay, do the swap!
+    if (takes_time)
+    {
 #ifdef EUCLIDEAN
-    _swim_or_move_energy(mon, delta.abs() == 2);
+        _swim_or_move_energy(mon, delta.abs() == 2);
 #else
-    _swim_or_move_energy(mon);
+        _swim_or_move_energy(mon);
 #endif
+    }
 
     mon->set_position(n);
     mgrd(n) = mon->mindex();
@@ -3538,7 +3552,8 @@ static bool _monster_swaps_places(monster* mon, const coord_def& delta)
     const int m2i = m2->mindex();
     ASSERT_RANGE(m2i, 0, MAX_MONSTERS);
     mgrd(c) = m2i;
-    _swim_or_move_energy(m2);
+    if (takes_time)
+        _swim_or_move_energy(m2);
 
     mon->check_redraw(c, false);
     if (mon->is_wall_clinging())
@@ -4021,8 +4036,12 @@ static bool _monster_move(monster* mons)
                 && (!crawl_state.game_is_zotdef()
                     || !_may_cutdown(mons, targ)))
             {
+                bool takes_time = !(mons->type == MONS_WANDERING_MUSHROOM
+                                    && targ->type == MONS_TOADSTOOL
+                                    || mons->type == MONS_TOADSTOOL
+                                       && targ->type == MONS_WANDERING_MUSHROOM);
                 // Zotdef: monsters will cut down firewood
-                ret = _monster_swaps_places(mons, mmov);
+                ret = monster_swaps_places(mons, mmov, takes_time);
             }
             else
             {
index 9115e72..d0f3f0e 100644 (file)
@@ -20,6 +20,7 @@ public:
 bool mon_can_move_to_pos(const monster* mons, const coord_def& delta,
                          bool just_check = false);
 bool mons_can_move_towards_target(const monster* mon);
+bool monster_swaps_places(monster* mon, const coord_def& delta, bool takes_time = true);
 
 bool handle_throw(monster* mons, bolt &beem, bool teleport, bool check_only);
 
index 16c89b5..0ec477a 100644 (file)
@@ -430,6 +430,13 @@ bool monster_pathfind::traversable(const coord_def& p)
             return true;
         }
 
+        else if (mons && mons->type == MONS_WANDERING_MUSHROOM
+                 && monster_at(p)
+                 && monster_at(p)->type == MONS_TOADSTOOL)
+        {
+            return true;
+        }
+
         return false;
     }
 
index b4e9985..c3f04ed 100644 (file)
@@ -47,6 +47,7 @@
 #include "mgen_data.h"
 #include "misc.h"
 #include "mon-abil.h"
+#include "mon-act.h"
 #include "mon-behv.h"
 #include "mon-death.h"
 #include "mon-place.h"
@@ -3501,8 +3502,17 @@ bool swap_places(monster* mons, const coord_def &loc)
 
     if (monster_at(loc))
     {
-        mpr("Something prevents you from swapping places.");
-        return false;
+        if (mons->type == MONS_WANDERING_MUSHROOM
+            && monster_at(loc)->type == MONS_TOADSTOOL)
+        {
+            monster_swaps_places(mons, loc - mons->pos());
+            return true;
+        }
+        else
+        {
+            mpr("Something prevents you from swapping places.");
+            return false;
+        }
     }
 
     mpr("You swap places.");
@@ -3559,6 +3569,13 @@ bool swap_check(monster* mons, coord_def &loc, bool quiet)
     // First try: move monster onto your position.
     bool swap = !monster_at(loc) && monster_habitable_grid(mons, grd(loc));
 
+    if (monster_at(loc)
+        && monster_at(loc)->type == MONS_TOADSTOOL
+        && mons->type == MONS_WANDERING_MUSHROOM)
+    {
+        swap = monster_habitable_grid(mons, grd(loc));
+    }
+
     // Choose an appropriate habitat square at random around the target.
     if (!swap)
     {