diff --git a/game/engines/default/engine/interface/PlayerRun.lua b/game/engines/default/engine/interface/PlayerRun.lua
index 5ecece6dab994f30990d7bb2a4774f0bc9c0ce9f..a8b8e84a2b6f1dece18654aeb09ab3e982a77df2 100644
--- a/game/engines/default/engine/interface/PlayerRun.lua
+++ b/game/engines/default/engine/interface/PlayerRun.lua
@@ -187,13 +187,27 @@ function _M:runStep()
 		if self.running.block_left then self.running.ignore_left = nil end
 		if self.running.ignore_left then
 			self.running.ignore_left = self.running.ignore_left - 1
-			if self.running.ignore_left <= 0 then self.running.ignore_left = nil end
+			if self.running.ignore_left <= 0 then
+				self.running.ignore_left = nil
+				-- We do this check here because it is path/time dependent, not terrain configuration dependent
+				if dir_is_cardinal and checkDir(self, sides[self.running.dir].soft_left) and checkDir(self, self.running.dir, 2) then
+					self:runStop("terrain change on the left")
+					return false
+				end
+			end
 			if checkDir(self, sides[self.running.dir].soft_left) and (not checkDir(self, self.running.dir) or not dir_is_cardinal) then self.running.block_left = true end
 		end
 		if self.running.block_right then self.running.ignore_right = nil end
 		if self.running.ignore_right then
 			self.running.ignore_right = self.running.ignore_right - 1
-			if self.running.ignore_right <= 0 then self.running.ignore_right = nil end
+			if self.running.ignore_right <= 0 then
+				self.running.ignore_right = nil
+				-- We do this check here because it is path/time dependent, not terrain configuration dependent
+				if dir_is_cardinal and checkDir(self, sides[self.running.dir].soft_right) and checkDir(self, self.running.dir, 2) then
+					self:runStop("terrain change on the right")
+					return false
+				end
+			end
 			if checkDir(self, sides[self.running.dir].soft_right) and (not checkDir(self, self.running.dir) or not dir_is_cardinal) then self.running.block_right = true end
 		end
 
@@ -278,18 +292,26 @@ function _M:runCheck()
 				-- Favor cardinal directions if possible, otherwise we may miss something interesting
 				if not dir_is_cardinal then
 					-- Turn soft left
-					if blocked_soft_right and blocked_hard_left and not blocked_soft_left and checkDir(self, sides[self.running.dir].soft_left, 2) and (not self.running.ignore_left or self.running.ignore_left ~= 2) then
-						self.running.dir = sides[self.running.dir].soft_left
-						self.running.block_left = true
-						self.running.block_right = true
-						return true
+					if blocked_soft_right and blocked_hard_left and not blocked_soft_left and (blocked_hard_right or self.running.ignore_right) and (not self.running.ignore_left or self.running.ignore_left ~= 2) then
+						if checkDir(self, sides[self.running.dir].soft_left, 2) then
+							self.running.dir = sides[self.running.dir].soft_left
+							self.running.block_left = true
+							self.running.block_right = true
+							return true
+						else
+							return false, "terrain changed ahead"
+						end
 					end
 					-- Turn soft right
-					if blocked_soft_left and blocked_hard_right and not blocked_soft_right and checkDir(self, sides[self.running.dir].soft_right, 2) and (not self.running.ignore_right or self.running.ignore_right ~= 2) then
-						self.running.dir = sides[self.running.dir].soft_right
-						self.running.block_left = true
-						self.running.block_right = true
-						return true
+					if blocked_soft_left and blocked_hard_right and not blocked_soft_right and (blocked_hard_left or self.running.ignore_left) and (not self.running.ignore_right or self.running.ignore_right ~= 2) then
+						if checkDir(self, sides[self.running.dir].soft_right, 2) then
+							self.running.dir = sides[self.running.dir].soft_right
+							self.running.block_left = true
+							self.running.block_right = true
+							return true
+						else
+							return false, "terrain changed ahead"
+						end
 					end
 				end
 				if checkDir(self, self.running.dir, 2) then