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