143 lines
3.7 KiB
Lua
143 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
|