local VictoryScreen = Object:extend() local TweenManager = require "game.modules.tweenmanager" local BATTLECOMPLETE_START = 2 local BATTLECOMPLETE_STOP = 4 local gui = require "game.modules.gui" local charutils = require "game.utils.characters" local tw, th = 280+48, 64 local rankWidth, rankHeight = 64, 48 local rankFactor = {1, 1.2, 1.5, 2} function VictoryScreen:new(scene) self.scene = scene self.assets = scene.assets self.turnSystem = scene.turns self:setVariables() self:getRewards() self.infoBox = self:createInfoBox() self.rankBox = gui.newTextBox("assets/gui/dialogbox.png", rankWidth, rankHeight) self.tweens = TweenManager(self) self:prepareAnimation() end function VictoryScreen:setVariables() -- Vignette Opacity self.vignetteOpacity = 0 -- Battle FInished Label self.labelOpacity = 0 local _, height = core.screen:getDimensions() self.labelY = height/2 -- Infobox self.tbSize = 0.6 self.tbOpacity = 0 -- Ranks self.rankOpacity = 0 self.rankSize = 4 self.addExp = false self.charDone = {} self.nbrCharDone = 0 end function VictoryScreen:prepareAnimation() -- Vignette self.tweens:newTween(0, 0.6, {vignetteOpacity=0.75}, 'inExpo') -- Label self.tweens:newTween(0, 0.6, {labelOpacity=1}, 'inExpo') self.tweens:newTween(0.9, 0.4, {labelY=32}, 'inExpo') -- Infobox self.tweens:newTween(1.4, 0.4, {tbSize=1, tbOpacity=1}, 'inExpo') -- Ranks self.tweens:newTween(1.9, 0.4, {rankSize=1, rankOpacity=1}, 'inExpo') self.tweens:newTween(2.4, 0.3, {shownExp=self.realExp, shownRings=self.realRings}, 'inExpo') self.tweens:newSwitch(2.7, {"addExp"}) end function VictoryScreen:getRewards() self.rank = self.turnSystem:getRank() local exp, rings = self.turnSystem:getRewards() self.shownExp, self.shownRings = exp, rings self.realExp = exp * rankFactor[self.rank] self.realRings = rings * rankFactor[self.rank] for i,character in ipairs(self.turnSystem.player.list) do character.targetExp = character.exp + self.realExp end game.loot.rings = game.loot.rings + self.realRings end function VictoryScreen:createInfoBox() local textBox = gui.newTextBox("assets/gui/dialogbox.png", tw, th) local canvas = love.graphics.newCanvas(tw, th) love.graphics.setCanvas(canvas) love.graphics.draw(textBox, 0, 0) self.assets.fonts["SA2font"]:print("ENNEMIES:", 6, 6) self.assets.fonts["SA2font"]:print(self.turnSystem.ennemies:count(), tw - 6, 6, "right") self.assets.fonts["SA2font"]:print("COMBOS:", 6, th - 6 - 22) self.assets.fonts["SA2font"]:print("0/0", tw - 6, th - 6 - 22, "right") love.graphics.setCanvas() local imagedata = canvas:newImageData() local texture = love.graphics.newImage( imagedata ) imagedata:release() canvas:release() return texture end function VictoryScreen:update(dt) self.tweens:update(dt) if ( self.addExp and (not self:allCharDone())) then for i,character in ipairs(self.turnSystem.player.list) do self:addCharacterExp(dt, character) end end if (self:allCharDone()) then local keys = self.scene:getKeys(1) if (keys["A"].isPressed) then --placeholder, pour l'instant on retourne juste au menu scenes.debug.menu() end end end function VictoryScreen:addCharacterExp(dt, character) if (self.charDone[character.name] == "done") then return 0 end local level = character.abstract.level local xpAddRatio = charutils.getLevelExpRange(level) * 0.5 local newExp = character.exp + (xpAddRatio * dt) if (newExp < character.targetExp) then character.exp = newExp local nextLevelExp = charutils.getExpValue(level + 1) if (character.exp >= nextLevelExp) then character.abstract:levelUp() end else character.exp = character.targetExp character.abstract.exp = character.exp self.charDone[character.name] = "done" self.nbrCharDone = self.nbrCharDone + 1 end end function VictoryScreen:allCharDone() return (self.nbrCharDone >= self.turnSystem.player:count()) end function VictoryScreen:draw() local width, height = core.screen:getDimensions() self:drawVignette(width, height) self:drawLabel(width/2, self.labelY, self.labelOpacity) self:drawInfobox(width/2, height/2 - 32, self.tbSize, self.tbOpacity) local startx = (width/2 - tw/2) local endx = (width/2 + tw/2) local scorex = startx + rankWidth + 8 local starty = height/2 + 8 local endy = starty + rankHeight self:drawRankBox(startx, starty, self.rankSize, self.tbOpacity, self.rankOpacity) self:drawText(scorex, starty, endx, "EXP:", math.floor(self.shownExp), self.tbOpacity) self:drawText(scorex, endy - 24, endx, "RINGS:", math.floor(self.shownRings), self.tbOpacity) for i,character in ipairs(self.turnSystem.player.list) do self:drawCharacterExp(startx + ((i-1)*84), endy + 8, character, self.tbOpacity) end if (self:allCharDone()) then self.assets.fonts["small"]:print("Press the A key to continue...", width/2, endy + 32, "center") end utils.graphics.resetColor() end function VictoryScreen:drawVignette(width, height) love.graphics.setColor(0, 0, 0, self.vignetteOpacity) love.graphics.rectangle("fill", 0, 0, width, height) end function VictoryScreen:drawLabel(x, y, opacity) love.graphics.setColor(1, 1, 1, opacity) local w, h = self.assets.images["battlecompleted"]:getDimensions() self.assets.images["battlecompleted"]:draw(x, y, 0, 1, 1, w/2, h/2) end function VictoryScreen:drawInfobox(x, y, size, opacity) love.graphics.setColor(1, 1, 1, opacity) love.graphics.draw(self.infoBox, x, y, 0, size, size, tw/2, th/2) end function VictoryScreen:drawRankBox(x, y, rankSize, boxOpacity, rankOpacity) love.graphics.setColor(1, 1, 1, boxOpacity) love.graphics.draw(self.rankBox, x, y) love.graphics.setColor(1, 1, 1, rankOpacity) self.assets.tileset["ranks"]:drawTile(self.rank, x + (rankWidth/2), y + (rankHeight/2), 0, rankSize, rankSize, 13, 13) end function VictoryScreen:drawText(x, y, x2, text1, text2, opacity) love.graphics.setColor(1, 1, 1, opacity) self.assets.fonts["SA2font"]:print(text1, x, y) self.assets.fonts["SA2font"]:print(text2, x2, y, "right") end function VictoryScreen:drawCharacterExp(x, y, character, opacity) love.graphics.setColor(1, 1, 1, opacity) self.assets.images["expbar"]:draw(x, y) character:drawIcon(x+1, y+6) love.graphics.setColor(0, 0.8, 0.1, opacity) local level = character.abstract.level local exp = character.exp local remainingExp = charutils.getRemainingExp(exp, level) local expRatio = charutils.getRelativeExpValue(exp, level) / charutils.getLevelExpRange(level) gui.drawBar(x + 22, y + 11, math.floor(56 * expRatio), 7) love.graphics.setColor(1, 1, 1, opacity) self.assets.fonts["hudnbrs_small"]:print(math.floor(remainingExp), x + 71, y + 11, "right") self.assets.fonts["hudnbrs_small"]:print(level, x + 72, y + 1, "right") end return VictoryScreen