From 89394e70f9762b8a3cd00761a969b71bd293a9b9 Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Wed, 5 Apr 2017 15:39:22 +0200
Subject: [PATCH] Fixed challenges sometimes auto-failing or auto-succeeding in
 the Infinite Dungeon

---
 game/engines/default/engine/Zone.lua              | 15 +++++++++++++++
 .../tome/data/zones/infinite-dungeon/zone.lua     |  7 +++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/game/engines/default/engine/Zone.lua b/game/engines/default/engine/Zone.lua
index 61df2a74af..b097edb2e8 100644
--- a/game/engines/default/engine/Zone.lua
+++ b/game/engines/default/engine/Zone.lua
@@ -1076,6 +1076,18 @@ function _M:newLevel(level_data, lev, old_lev, game)
 		end
 	end
 
+	if not self.__frelltest then
+	forceprint("-------------------------------------------------")
+	forceprint("-------------------------------------------------")
+	forceprint("-------------------------------------------------")
+	forceprint("REGEN")
+	forceprint("-------------------------------------------------")
+	forceprint("-------------------------------------------------")
+	forceprint("-------------------------------------------------")
+	self.__frelltest = true
+	return self:newLevel(level_data, lev, old_lev, game)
+end
+
 	-- Check for connectivity from entrance to exit
 	local a = Astar.new(map, game:getPlayer())
 	if not level_data.no_level_connectivity then
@@ -1107,6 +1119,9 @@ function _M:newLevel(level_data, lev, old_lev, game)
 	-- Delete the room_map if it's no longer needed
 	if not self._retain_level_room_map then map.room_map = nil end
 
+	-- Call a "post" finisher
+	if level_data.post_process_end then level_data.post_process_end(level, self) end
+
 	return level
 end
 
diff --git a/game/modules/tome/data/zones/infinite-dungeon/zone.lua b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
index 6df82483cb..a81e0fb406 100644
--- a/game/modules/tome/data/zones/infinite-dungeon/zone.lua
+++ b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
@@ -358,8 +358,6 @@ return {
 			level.data.effects = {effid}
 		end
 
-		game.state:infiniteDungeonChallengeFinish(zone, level)
-		
 		if config.settings.cheat then -- gather statistics
 			local block_count = 0
 			for i = 0, level.map.w - 1 do for j = 0, level.map.h - 1 do
@@ -369,5 +367,10 @@ return {
 			print(("[Infinite Dungeon] Open space calculation: (%s, %s, %dw x %dh) space -- (open:%2.1f%%, closed:%2.1f%%)"):format(level.data.id_layout_name, level.data.id_grids_name, level.map.w, level.map.h, open, closed))
 		end
 	end,
+	post_process_end = function(level, zone)
+		-- We delay it because at "post_process" the map can STILL decide to regenerate
+		-- and if it does, it's a new level and challenge is considered auto failed (or auto success heh)
+		game.state:infiniteDungeonChallengeFinish(zone, level)
+	end,
 }
 
-- 
GitLab