From d1a194b598f18d42336687555326ae6ef3b99dbd Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 17 Apr 2011 16:47:53 +0000
Subject: [PATCH] Tactical display is now handled by entities (actors) display
 callback (no change for modules, except they can customize it as needed)
 Added lifebars to tactical display mode

git-svn-id: http://svn.net-core.org/repos/t-engine4@3220 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/Actor.lua | 37 +++++++++++++++
 game/engines/default/engine/Map.lua   | 36 ---------------
 game/modules/tome/class/Actor.lua     | 65 +++++++++++++++++++++++++++
 3 files changed, 102 insertions(+), 36 deletions(-)

diff --git a/game/engines/default/engine/Actor.lua b/game/engines/default/engine/Actor.lua
index 08085e66d8..5eb4ff4385 100644
--- a/game/engines/default/engine/Actor.lua
+++ b/game/engines/default/engine/Actor.lua
@@ -95,6 +95,12 @@ function _M:defineDisplayCallback()
 		ps[#ps+1] = e
 	end
 
+	local f_self = nil
+	local f_danger = nil
+	local f_friend = nil
+	local f_enemy = nil
+	local f_neutral = nil
+
 	self._mo:displayCallback(function(x, y, w, h)
 		local e
 		for i = 1, #ps do
@@ -103,6 +109,37 @@ function _M:defineDisplayCallback()
 			else self:removeParticles(e)
 			end
 		end
+
+		-- Tactical info
+		if game.level and game.level.map.view_faction then
+			local map = game.level.map
+
+			if not f_self then
+				f_self = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_self)
+				f_danger = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_danger)
+				f_friend = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_friend)
+				f_enemy = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_enemy)
+				f_neutral = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_neutral)
+			end
+
+			if self.faction then
+				local friend
+				if not map.actor_player then friend = Faction:factionReaction(map.view_faction, self.faction)
+				else friend = map.actor_player:reactionToward(self) end
+
+				if self == map.actor_player then
+					f_self:toScreen(x, y, w, h)
+				elseif map:faction_danger_check(self) then
+					f_danger:toScreen(x, y, w, h)
+				elseif friend > 0 then
+					f_friend:toScreen(x, y, w, h)
+				elseif friend < 0 then
+					f_enemy:toScreen(x, y, w, h)
+				else
+					f_neutral:toScreen(x, y, w, h)
+				end
+			end
+		end
 		return true
 	end)
 end
diff --git a/game/engines/default/engine/Map.lua b/game/engines/default/engine/Map.lua
index f05c103abb..360fdeee5f 100644
--- a/game/engines/default/engine/Map.lua
+++ b/game/engines/default/engine/Map.lua
@@ -459,42 +459,6 @@ function _M:display(x, y, nb_keyframe, always_show)
 	self.display_x, self.display_y = x or self.display_x, y or self.display_y
 
 	self._map:toScreen(self.display_x, self.display_y, nb_keyframe, always_show)
-
-	-- Tactical display
-	if self.view_faction then
-		local e
-		local z
-		local adx, ady
-		local friend
-		for i = self.mx, self.mx + self.viewport.mwidth do
-		for j = self.my, self.my + self.viewport.mheight do
-			local z = i + j * self.w
-
-			if self.seens[z] then
-				e = self(i, j, ACTOR)
-				if e and (not self.actor_player or self.actor_player:canSee(e)) then
-					-- Tactical overlay ?
-					if e.faction then
-						if not self.actor_player then friend = Faction:factionReaction(self.view_faction, e.faction)
-						else friend = self.actor_player:reactionToward(e) end
-						if e._mo then adx, ady = e._mo:getMoveAnim(self._map, i, j) else adx, ady = 0, 0 end -- Make sure we display on the real screen coords: handle current move anim position
-						if e == self.actor_player then
-							self.tilesTactic:get(nil, 0,0,0, 0,0,0, self.faction_self):toScreen(self.display_x + (adx + i - self.mx) * self.tile_w * self.zoom, self.display_y + (ady + j - self.my) * self.tile_h * self.zoom, self.tile_w * self.zoom, self.tile_h * self.zoom)
-						elseif self:faction_danger_check(e) then
-							self.tilesTactic:get(nil, 0,0,0, 0,0,0, self.faction_danger):toScreen(self.display_x + (adx + i - self.mx) * self.tile_w * self.zoom, self.display_y + (ady + j - self.my) * self.tile_h * self.zoom, self.tile_w * self.zoom, self.tile_h * self.zoom)
-						elseif friend > 0 then
-							self.tilesTactic:get(nil, 0,0,0, 0,0,0, self.faction_friend):toScreen(self.display_x + (adx + i - self.mx) * self.tile_w * self.zoom, self.display_y + (ady + j - self.my) * self.tile_h * self.zoom, self.tile_w * self.zoom, self.tile_h * self.zoom)
-						elseif friend < 0 then
-							self.tilesTactic:get(nil, 0,0,0, 0,0,0, self.faction_enemy):toScreen(self.display_x + (adx + i - self.mx) * self.tile_w * self.zoom, self.display_y + (ady + j - self.my) * self.tile_h * self.zoom, self.tile_w * self.zoom, self.tile_h * self.zoom)
-						else
-							self.tilesTactic:get(nil, 0,0,0, 0,0,0, self.faction_neutral):toScreen(self.display_x + (adx + i - self.mx) * self.tile_w * self.zoom, self.display_y + (ady + j - self.my) * self.tile_h * self.zoom, self.tile_w * self.zoom, self.tile_h * self.zoom)
-						end
-					end
-				end
-			end
-		end end
-	end
-
 	self:displayParticles(nb_keyframe)
 	self:displayEffects()
 	self:displayEmotes(nb_keyframe)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index fbabbcae2f..82b15723bd 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -392,6 +392,71 @@ function _M:act()
 	return true
 end
 
+--- Attach or remove a display callback
+-- Defines particles to display
+function _M:defineDisplayCallback()
+	if not self._mo then return end
+
+	local ps = {}
+	for e, _ in pairs(self.__particles) do
+		ps[#ps+1] = e
+	end
+
+	local f_self = nil
+	local f_danger = nil
+	local f_friend = nil
+	local f_enemy = nil
+	local f_neutral = nil
+
+	self._mo:displayCallback(function(x, y, w, h)
+		local e
+		for i = 1, #ps do
+			e = ps[i]
+			if e.ps:isAlive() then e.ps:toScreen(x + w / 2, y + h / 2, true)
+			else self:removeParticles(e)
+			end
+		end
+
+		-- Tactical info
+		if game.level and game.level.map.view_faction then
+			local map = game.level.map
+
+			-- Tactical life info
+			local dh = h * 0.1
+			core.display.drawQuad(x, y + h - dh, w, dh, 139, 210, 77, 128)
+			core.display.drawQuad(x, y + h - dh, w * self.life / self.max_life, dh, 50, 220, 77, 255)
+
+			if not f_self then
+				f_self = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_self)
+				f_danger = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_danger)
+				f_friend = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_friend)
+				f_enemy = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_enemy)
+				f_neutral = game.level.map.tilesTactic:get(nil, 0,0,0, 0,0,0, map.faction_neutral)
+			end
+
+			if self.faction then
+				local friend
+				if not map.actor_player then friend = Faction:factionReaction(map.view_faction, self.faction)
+				else friend = map.actor_player:reactionToward(self) end
+
+				if self == map.actor_player then
+					f_self:toScreen(x, y, w, h)
+				elseif map:faction_danger_check(self) then
+					f_danger:toScreen(x, y, w, h)
+				elseif friend > 0 then
+					f_friend:toScreen(x, y, w, h)
+				elseif friend < 0 then
+					f_enemy:toScreen(x, y, w, h)
+				else
+					f_neutral:toScreen(x, y, w, h)
+				end
+			end
+		end
+
+		return true
+	end)
+end
+
 function _M:move(x, y, force)
 	local moved = false
 	local ox, oy = self.x, self.y
-- 
GitLab