diff --git a/sonic-radiance.love/scenes/battlesystem/actors/hero.lua b/sonic-radiance.love/scenes/battlesystem/actors/hero.lua index 60d7cc7..452cd9d 100644 --- a/sonic-radiance.love/scenes/battlesystem/actors/hero.lua +++ b/sonic-radiance.love/scenes/battlesystem/actors/hero.lua @@ -1,6 +1,9 @@ local Battler = require("scenes.battlesystem.actors.battler") local Hero = Battler:extend() +-- INIT FUNCTIONS +-- Initialize the hero + function Hero:new(world, x, y, charid, charnumber) Hero.super.new(self, world, x, y, 0) self.isHero = true @@ -23,6 +26,151 @@ function Hero:new(world, x, y, charid, charnumber) self.charnumber = charnumber or 1 end +-- INFO FUNCTIONS +-- All functions to get information from the character + +function Hero:getStats() + return game.characters.list[self.charid].stats +end + +-- ACTIVITY FUNCTION +-- Function to set or unset activity to the character + +function Hero:setActive() + local gridsize = game.characters.list[self.charid].base_stats.move + if (gridsize == nil) then + gridsize = 3 + core.debug:warning("cbs/character", "move value is nil") + end + self.world.cursor:setGrid(self.x, self.y, "circle", gridsize, 1, self) + self.startx, self.starty = self.x, self.y + self.world.cursor:set(self.startx, self.starty) + self.currentAction = "selectDirection" + + self.directionPrevious = self.direction +end + +-- UPDATE FUNCTION +-- Update the hero + +function Hero:update(dt) + self.keys = self.scene:getKeys(1) + if (self.currentAction == "moving") then + self:updateMoving(dt) + elseif (self.currentAction == "selectAttack") then + self:updateActionSelection(dt) + elseif (self.currentAction == "selectDirection") then + self:updateDirectionSelection(dt) + end +end + +function Hero:updateMoving(dt) + -- Store previous position, in order to be able to go back here more easily + -- when needed + self.xprevious = self.x + self.yprevious = self.y + + -- Move the player toward its destination + self.x = (self.x) + ((self.dx) - (self.x)) * dt*15 + self.y = (self.y) + ((self.dy) - (self.y)) * dt*15 + + -- Calculate speed to calculate animation speed + local xspeed, yspeed = math.abs(self.x - self.xprevious), + math.abs(self.y - self.yprevious) + + local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 + self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) + + -- Handle direction + local direction = utils.math.sign(self.x - self.xprevious) + if direction ~= 0 then + self.direction = direction + end + + -- If the hero is near enough its final destination, switch to + -- action selection + if (math.abs(self.x - self.dx) < 0.01) and (math.abs(self.y - self.dy) < 0.01) then + self.x = self.dx + self.y = self.dy + self:setAnimation("idle") + self.currentAction = "selectAttack" + self.scene.menu:set( self ) + end +end + +function Hero:updateActionSelection(dt) + -- Change direction by pressing left or right when selecting the next action + if (self.keys["left"].isPressed) then + self.direction = -1 + elseif (self.keys["right"].isPressed) then + self.direction = 1 + end +end + +function Hero:updateDirectionSelection(dt) + self.xprevious = self.x + self.yprevious = self.y + + self.x = (self.x) + ((self.startx) - (self.x)) * dt*15 + self.y = (self.y) + ((self.starty) - (self.y)) * dt*15 + + local xspeed, yspeed = math.abs(self.x - self.xprevious), + math.abs(self.y - self.yprevious) + + local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 + self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) + local direction = utils.math.sign(self.x - self.xprevious) + if direction ~= 0 then + self.direction = direction + end + + if (math.abs(self.x - self.startx) < 0.01) and (math.abs(self.y - self.starty) < 0.01) then + self.x = self.startx + self.y = self.starty + self:setAnimation("idle") + self.direction = self.directionPrevious + end +end + +-- SIGNAL FUNCTIONS +-- All functions related to signal receiving + +function Hero:receiveSignal(action_type, id) + if id == nil then + core.debug:print("battler/hero", "action selected : " .. action_type) + else + core.debug:print("battler/hero", "action selected : " .. action_type .. " (" .. id .. ")") + end + if (action_type == "defend") then + self.turnAction = "defend" + self.world:switchActiveBattler( ) + else + self.world:switchActiveBattler( ) + end +end + +function Hero:receiveBackSignal() + self.currentAction = "selectDirection" + self.world.cursor:set(self.x, self.y) + self:setAnimation("walk") +end + +-- ACTION FUNCTIONS +-- All functions related to actions + +function Hero:validateAction() + if (self.currentAction == "selectDirection") then + self:setAnimation("walk") + self.currentAction = "moving" + self.dx, self.dy = self.world.cursor.x, self.world.cursor.y + + self.world.cursor:unset( ) + end +end + +-- DRAW FUNCTIONS +-- Draw everything related to the hero + function Hero:setAnimation(animation) if (self.animation ~= animation) then self.animation = animation @@ -41,110 +189,6 @@ function Hero:drawIcon(x, y) self.assets.tileset["charicons"]:drawTile(iconID, x, y) end -function Hero:setActive() - local gridsize = game.characters.list[self.charid].base_stats.move - if (gridsize == nil) then - gridsize = 3 - core.debug:warning("cbs/character", "move value is nil") - end - self.world.cursor:setGrid(self.x, self.y, "circle", gridsize, 1, self) - self.startx, self.starty = self.x, self.y - self.world.cursor:set(self.startx, self.starty) - self.currentAction = "selectDirection" - - self.directionPrevious = self.direction -end - -function Hero:update(dt) - self.keys = self.scene:getKeys(1) - if (self.currentAction == "moving") then - self.xprevious = self.x - self.yprevious = self.y - self.x = (self.x) + ((self.dx) - (self.x)) * dt*15 - self.y = (self.y) + ((self.dy) - (self.y)) * dt*15 - - local xspeed, yspeed = math.abs(self.x - self.xprevious), - math.abs(self.y - self.yprevious) - - local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 - self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) - local direction = utils.math.sign(self.x - self.xprevious) - if direction ~= 0 then - self.direction = direction - end - if (math.abs(self.x - self.dx) < 0.01) and (math.abs(self.y - self.dy) < 0.01) then - self.x = self.dx - self.y = self.dy - self:setAnimation("idle") - self.currentAction = "selectAttack" - self.scene.menu:set( self ) - end - - elseif (self.currentAction == "selectAttack") then - if (self.keys["B"].isPressed) then - --self.currentAction = "selectDirection" - --self.world.cursor:set(self.x, self.y) - end - elseif (self.currentAction == "selectDirection") then - self.xprevious = self.x - self.yprevious = self.y - - self.x = (self.x) + ((self.startx) - (self.x)) * dt*15 - self.y = (self.y) + ((self.starty) - (self.y)) * dt*15 - - local xspeed, yspeed = math.abs(self.x - self.xprevious), - math.abs(self.y - self.yprevious) - - local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 - self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) - local direction = utils.math.sign(self.x - self.xprevious) - if direction ~= 0 then - self.direction = direction - end - - if (math.abs(self.x - self.startx) < 0.01) and (math.abs(self.y - self.starty) < 0.01) then - self.x = self.startx - self.y = self.starty - self:setAnimation("idle") - self.direction = self.directionPrevious - end - end -end - -function Hero:validateAction() - if (self.currentAction == "selectDirection") then - self:setAnimation("walk") - self.currentAction = "moving" - self.dx, self.dy = self.world.cursor.x, self.world.cursor.y - - self.world.cursor:unset( ) - end -end - -function Hero:getStats() - return game.characters.list[self.charid].stats -end - -function Hero:getSignal(action_type, id) - --print(action_type .. " " .. id) - if (action_type == "back") then - self.currentAction = "selectDirection" - self.world.cursor:set(self.x, self.y) - self:setAnimation("walk") - elseif (action_type == "defend") then - self.turnAction = "defend" - self.world:switchActiveBattler( ) - else - self.world:switchActiveBattler( ) - end -end - -function Hero:getBackSignal() - self.currentAction = "selectDirection" - self.world.cursor:set(self.x, self.y) - self:setAnimation("walk") -end - function Hero:drawHUD() local HUDBASE = -8 local HUDSEP = 152 diff --git a/sonic-radiance.love/scenes/battlesystem/menu.lua b/sonic-radiance.love/scenes/battlesystem/menu.lua index a80eb8d..caa391c 100644 --- a/sonic-radiance.love/scenes/battlesystem/menu.lua +++ b/sonic-radiance.love/scenes/battlesystem/menu.lua @@ -151,7 +151,7 @@ function CharMenuWidget:drawCanvas() end function CharMenuWidget:action() - self.character:getSignal(self.menuname, self.label) + self.character:receiveSignal(self.actionType) self.scene:flushKeys() self.scene.menusystem:reset() end @@ -174,7 +174,7 @@ function BackMenuWidget:new(scene, menu_name, label, character) end function BackMenuWidget:action() - self.character:getBackSignal() + self.character:receiveBackSignal() self.scene:flushKeys() self.scene.menusystem:reset() end @@ -207,7 +207,7 @@ function SkillWidget:drawCanvas() end function SkillWidget:action() - self.character:getSignal(self.menuname, self.label) + self.character:receiveSignal("skill", self.actionType) self.scene:flushKeys() self.scene.menusystem:reset() end