sonic-radiance/sonic-radiance.love/scenes/overworld/actors/player/actions.lua
2021-08-21 17:05:49 +02:00

234 lines
7.3 KiB
Lua

local PlayerActions = Object:extend()
local BASE_SPEED = 120
local RUN_FACTOR = 2.5
local JMP_STRENGHT = 2.5
local ACTIONS = {}
ACTIONS["speedster"] = {"run"}
ACTIONS["technic"] = {"fly"}
ACTIONS["power"] = {"punch"}
function PlayerActions:initActions()
self.currentAction = "idle"
self.canJump = true
self.canAct = true
self.speedFactor = 1
self.forceAction = nil
self.dashJustStarted = false
end
function PlayerActions:canDoAction(action)
local classCanDoAction = utils.table.contain(ACTIONS[self:getCurrentCharType()], action)
local playerCanDoAction = utils.table.contain(game.actions, action)
return (classCanDoAction and playerCanDoAction)
end
function PlayerActions:act()
if (self.forceAction ~= nil) then
self:forcedAction()
else
self:actionMove()
self:actionJump()
self:actionSwitch()
self:actionRun()
self:actionPunch()
end
end
function PlayerActions:forcedAction()
local charSpeed = BASE_SPEED * self.speedFactor
if (self.forceAction == "slide") then
if (self.xsp ~= 0 or self.ysp ~= 0) then
if (self.currentAction == "run") then
charSpeed = charSpeed * RUN_FACTOR
end
self.xsp, self.ysp = utils.math.lengthdir(charSpeed, math.rad(self.charsetManager.angle[self.charDir]))
self.xsp = -self.xsp
else
self:actionMove()
end
end
end
function PlayerActions:actionMove()
local charSpeed = BASE_SPEED * self.speedFactor
if (self.currentAction == "punch") then
return
end
if (self.currentAction == "jumpdash" or self.currentAction == "run") then
local xsp, ysp = self:getDash()
if (utils.table.contain({"up", "down"}, self.charDir)) then
if self.keys["left"].isDown then
xsp = -charSpeed
end
if self.keys["right"].isDown then
xsp = charSpeed
end
if (self.ysp == 0) then
if (self.currentAction == "jumpdash") then
self.currentAction = "jump"
else
self.currentAction = "idle"
end
elseif (self.dashJustStarted) then
self.dashJustStarted = false
self.assets.sfx["dash"]:play()
end
else
if self.keys["up"].isDown then
ysp = -charSpeed
end
if self.keys["down"].isDown then
ysp = charSpeed
end
if (self.xsp == 0) then
if (self.currentAction == "jumpdash") then
self.currentAction = "jump"
else
self.currentAction = "idle"
end
elseif (self.dashJustStarted) then
self.dashJustStarted = false
self.assets.sfx["dash"]:play()
end
end
self.xsp, self.ysp = xsp, ysp
else
if self.keys["up"].isDown then
self.ysp = -charSpeed
self.charDir = "up"
end
if self.keys["down"].isDown then
self.ysp = charSpeed
self.charDir = "down"
end
if self.keys["left"].isDown then
self.xsp = -charSpeed
self.charDir = "left"
end
if self.keys["right"].isDown then
self.xsp = charSpeed
self.charDir = "right"
end
end
end
function PlayerActions:getCharspeed()
return BASE_SPEED * self.speedFactor
end
function PlayerActions:getDash()
local xsp, ysp = utils.math.lengthdir(self:getCharspeed() * RUN_FACTOR, math.rad(self.charsetManager.angle[self.charDir]))
return -xsp, ysp
end
function PlayerActions:actionJump()
if self.keys["B"].isPressed then
if (self.onGround and self.canJump) then
self:goUpward(JMP_STRENGHT)
self.assets.sfx["jump"]:play()
if (self.currentAction == "run") then
self.currentAction = "jumpdash"
else
self.currentAction = "jump"
end
elseif (self.currentAction == "jump" and self:canDoAction("fly")) then
self.currentAction = "fly"
self.grav = 0
self.zsp = 0
self.tweens:newTimer(0.75, "endFly")
self.assets.sfx["fly"]:play()
end
end
if self.keys["B"].isReleased then
self:endFly()
end
end
function PlayerActions:endFly()
if (self.currentAction == "fly") then
self:goUpward(0)
self.currentAction = "idle"
end
end
function PlayerActions:actionSwitch()
if self.keys["select"].isPressed and (self.currentAction == "idle") then
self:switchActiveCharacter()
end
end
function PlayerActions:actionRun()
if self.keys["C"].isPressed then
if (self:canDoAction("run") and self.speedFactor > 0) then
self.dashJustStarted = true
if (utils.table.contain({"run", "idle"}, self.currentAction)) then
self.currentAction = "run"
elseif (utils.table.contain({"jumpdash", "jump"}, self.currentAction)) then
self.currentAction = "jumpdash"
end
self.xsp, self.ysp = self:getDash()
end
elseif (not self.keys["C"].isDown) then
if (self.currentAction == "run") then
self.currentAction = "idle"
elseif (self.currentAction == "jumpdash") then
self.currentAction = "jump"
end
end
end
function PlayerActions:actionPunch()
if self.keys["C"].isPressed then
if (self:canDoAction("punch")) then
self.assets.sfx["hit"]:play()
self.xsp, self.ysp = utils.math.lengthdir(BASE_SPEED * RUN_FACTOR, math.rad(self.charsetManager.angle[self.charDir]))
self.xsp = -self.xsp
self.currentAction = "punch"
self.tweens:newTimer(0.15, "endPunch")
self.assets.sprites["punch"]:changeAnimation("default", true)
end
end
end
function PlayerActions:endPunch()
if (self.currentAction == "punch") then
self.currentAction = "idle"
end
end
function PlayerActions:endJump()
if (self.currentAction == "jump") then
self.currentAction = "idle"
elseif (self.currentAction == "jumpdash") then
self.currentAction = "run"
end
end
function PlayerActions:drawActionEffect()
if (((self.currentAction == "run") or (self.currentAction == "jumpdash")) and (self.xsp ~= 0 or self.ysp ~= 0)) then
local dx, dy = utils.math.lengthdir(20, math.rad(self.charsetManager.angle[self.charDir]))
if (self.charDir == "down") then
dy = 8
elseif (self.charDir == "left" or self.charDir == "right") then
dy = -8
end
local x, y = self.x + 8 - dx, self.y + 8 - self.z + dy
self.assets.sprites["dash"]:draw(x, y, math.rad(self.charsetManager.angle[self.charDir]))
end
if (self.currentAction == "punch") then
local dx, dy = utils.math.lengthdir(20, math.rad(self.charsetManager.angle[self.charDir]))
if (self.charDir == "down") then
dy = 8
end
local x, y = self.x + 8 - dx, self.y + 8 - self.z + dy
self.assets.sprites["punch"]:draw(x, y, math.rad(self.charsetManager.angle[self.charDir]))
end
end
return PlayerActions