sonic-bluestreak/sonic-bluestreak.love/scenes/overworld/actors/player/init.lua
2021-11-25 10:57:13 +01:00

142 lines
3.7 KiB
Lua

local Parent = require "scenes.overworld.actors.parent"
local Player = Parent:extend()
local TweenManager = require "birb.classes.time"
local Team = require "scenes.overworld.actors.player.team"
local Interactions = require "scenes.overworld.actors.player.interactions"
local Actions = require "scenes.overworld.actors.player.actions"
local Charset = require "scenes.overworld.actors.player.charset"
local Map = require "scenes.overworld.actors.player.map"
local Health = require "scenes.overworld.actors.player.health"
Player:implement(Team)
Player:implement(Interactions)
Player:implement(Actions)
Player:implement(Charset)
Player:implement(Map)
Player:implement(Health)
local FRICTION = 480 * 3
local GRAV = 10
local DEFAULT_GROUND_LEVEL = 0
local DEFAULT_GROUND_HEIGHT = 0
local RESPAWN_LIMIT = -32
function Player:new(world, x, y, id)
Player.super.new(self, world, "player", x, y, 16, 16, true)
self.groundLevel = DEFAULT_GROUND_LEVEL
self.groundHeight = DEFAULT_GROUND_HEIGHT
self.z = self.groundLevel
self.grav = GRAV
self.tweens = TweenManager(self)
self.onGround = true
self.xfrc, self.yfrc = FRICTION, FRICTION
self:initTeam()
self:initInteractions()
self:initActions()
self:initPlayerCharset()
self:initMap()
self:initHealth()
end
function Player:updateStart(dt)
self.interactionName = ""
self.tweens:update(dt)
self:updateTerrain()
self:updateActiveCharacter()
self:act()
self.world:getTileTypeAtPoint(self.x, self.y)
self:updateInteraction()
self:updateCurrentCharset()
self:updateCurrentMap()
self:updateOutsideMap()
end
-- PHYSICS FUNCTIONS
-- Some functions to hook up the physic system
function Player:goUpward(zsp)
self.zsp = zsp
self.grav = GRAV
self.onGround = false
end
function Player:applyGravity(dt)
local grav = self.grav * -1
self.zsp = self.zsp + (grav * dt)
if utils.math.sign(self.zsp) == utils.math.sign(grav) then
self:checkGround()
end
end
function Player:checkGround()
if (self.z + self.zsp <= self.groundLevel) then
self.onGround = true
self.z = self.groundLevel
self.zsp = 0
self:endJump()
if (self.z <= RESPAWN_LIMIT) then
self.x = self.lastPos.x
self.y = self.lastPos.y
self:takeDamage(self.fallDamage)
if (not utils.string.isEmpty(self.fallSound)) then
self.assets:playSFX(self.fallSound)
end
end
end
end
function Player:autoMove(dt)
Player.super.autoMove(self, dt)
self.z = self.z + self.zsp
end
-- RESPONSES
-- Reponse to timer and collisions
function Player:collisionResponse(col)
local hitbox = col.other
local other = col.other.owner
if (not other.isDestroyed) then
if (hitbox.type == "gizmo") then
self:collideWithGizmo(other)
elseif (hitbox.type == "btnInput" and other.needButton) then
self:talkToGizmo(other)
end
end
end
function Player:timerResponse(response)
if (response == "changeCharacter") then
self:endCharacterSwitchAnimation()
elseif (response == "endFly") then
self:endFly()
elseif (response == "endPunch") then
self:endPunch()
end
end
function Player:drawHUD(id)
self:drawHealth((424 - self.scene:getEmblemsPosition()) - 48, 168)
self:drawEmblems(self.scene:getEmblemsPosition(), 24)
if (not utils.string.isEmpty(self.interactionName)) then
local w = self.assets.fonts["small"]:getWidth(self.interactionName) + 16
love.graphics.setColor(0,0,0,0.5)
local x, y = 424 - w + 4, 240 - 24
love.graphics.rectangle("fill", x - w/2, y + 1, w, 15, 8, 8)
utils.graphics.resetColor()
self.assets.fonts["small"]:draw(self.interactionName, x, y, -1, "center")
end
end
function Player:draw()
Player.super.draw(self)
self:drawActionEffect()
end
return Player