local TurnController = Object:extend() local Player = require "scenes.battlesystem.controllers.player" local Ennemy = require "scenes.battlesystem.controllers.ennemy" local HUD = require "scenes.battlesystem.gui.hud" local maputils = require "scenes.battlesystem.utils" function TurnController:new(scene, battleData) self.scene = scene self.world = scene.world self.isActive = false self.currentlyPlaying = "" self.turns = {} self.turns.current = 1 self.turns.number = 0 self.turns.isFinished = true self.turns.changeBattler = true self.actionList = {} self.currentFighter = nil self.canFleeBattle = true self.hud = HUD(self) self.player = Player(self) self.ennemies = Ennemy(self, battleData) -- Change the seed at the start of each battle math.randomseed( os.time() ) self:applyDeath() end function TurnController:getChanceTooFlee(value) if (self.canFleeBattle) then local speedComparison = math.min(value / self.ennemies:getHighestSpeed(), 1.5) return 25 + (50 * speedComparison) end end function TurnController:fleeBattle() self.player:fleeBattle() self.scene:fleeBattle() end function TurnController:showMessage(message) self.hud:showMessage(message) end function TurnController:startBattle() self.isActive = true self.hud:movePlayerHUD(true) end function TurnController:finishBattle() self.isActive = false self.actionlist = {} self.hud:movePlayerHUD(false) self.scene:finishBattle() end function TurnController:looseBattle() self.isActive = false self.actionlist = {} self.hud:movePlayerHUD(false) self.scene:looseBattle() end function TurnController:update(dt) self.player:update(dt) self.ennemies:update(dt) self.hud:update(dt) if (self.isActive) then if (self.currentFighter ~= nil) then self.currentFighter:update(dt) else if (self.player:countAlive() > 0) then self:nextAction() else self:looseBattle() end end end end function TurnController:getRank() return 3 end function TurnController:getRewards() local exp, ring = 0, 0 for i, ennemy in ipairs(self.ennemies.list) do exp = exp + ennemy.abstract.data.giveExp ring = ring + ennemy.abstract.data.giveRings end return exp, ring end function TurnController:nextAction() if (self.turns.isFinished) or (self.turns.current >= #self.actionList) then self:startNewTurn() else self.turns.current = self.turns.current + 1 core.debug:print("cbs/turns", "switching to next action") end self:startAction() end function TurnController:startNewTurn() core.debug:print("cbs/turns", "New Turn Starting") self.turns.current = 1 self.turns.isFinished = false self.turns.number = self.turns.number + 1 self:calculateTurn() end function TurnController:calculateTurn() self.actionList = {} self.player:putActions(self.actionList) self.ennemies:putActions(self.actionList) table.sort(self.actionList, maputils.sortBattlers) end function TurnController:removeAllActionsFromFighter(fighterToRemove) for i, action in ipairs(self.actionlist) do if action.fighter == fighterToRemove then table.remove(self.actionlist, i) end end end function TurnController:applyDeath() local ennemiesAlive = self.ennemies:applyDeath() if (ennemiesAlive == 0) then self:finishBattle() end self.player:applyDeath() end function TurnController:startAction() core.debug:print("cbs/turns", "Starting action " .. self.turns.current) local nextAction = self.actionList[self.turns.current] print(nextAction) local nextFighter = nextAction.fighter if (not nextFighter:canFight()) then -- On skipe le personnage s'il a été detruit self:nextAction() else self.currentFighter = nextFighter core.debug:print("cbs/turns", "Activating " .. self.currentFighter.name) self.currentFighter:setActive() self.hud:moveBattleCursor(self.turns.current) end end function TurnController:endAction() self.currentFighter = nil end function TurnController:sendSignalToCurrentBattler(signal, subSignal) self.actionList[self.turns.current].actor:receiveSignal(signal, subSignal) end function TurnController:draw() self.player:draw() self.ennemies:draw() self.hud:draw() end return TurnController