summaryrefslogtreecommitdiffhomepage
path: root/not/Player.lua
diff options
context:
space:
mode:
Diffstat (limited to 'not/Player.lua')
-rw-r--r--not/Player.lua159
1 files changed, 159 insertions, 0 deletions
diff --git a/not/Player.lua b/not/Player.lua
new file mode 100644
index 0000000..2a4b2e6
--- /dev/null
+++ b/not/Player.lua
@@ -0,0 +1,159 @@
+--- `Player`
+-- Special `not.Hero` controllable by a player.
+Player = {
+ -- TODO: move functions and properties related to controls from `not.Hero`.
+ controllerSet = --[[Controller.sets.*]]nil,
+}
+
+-- `Player` is a child of `Hero`.
+require "not.Hero"
+Player.__index = Player
+setmetatable(Player, Hero)
+
+-- Constructor of `Player`.
+function Player:new (name, game, x, y)
+ local o = setmetatable({}, self)
+ o:init(name, game, x, y)
+ -- Load portraits statically to `not.Hero`.
+ -- TODO: this is heresy, put it into `load` method or something similar.
+ if Hero.portrait_sprite == nil then
+ Hero.portrait_sprite = love.graphics.newImage("assets/portraits.png")
+ Hero.portrait_frame = love.graphics.newImage("assets/menu.png")
+ end
+ return o
+end
+
+-- Initializer of `Player`.
+function Player:init (...)
+ Hero.init(self, ...)
+end
+
+-- Controller set manipulation.
+function Player:assignControllerSet (set)
+ self.controllerSet = set
+end
+function Player:getControllerSet ()
+ return self.controllerSet
+end
+
+-- Check if control of assigned controller is pressed.
+function Player:isControlDown (control)
+ return Controller.isDown(self:getControllerSet(), control)
+end
+
+-- Update of `Player`.
+function Player:update (dt)
+ Hero.update(self, dt) -- TODO: It would be probably a good idea to add return to update functions to terminate if something goes badly in parent's update.
+ if self.body:isDestroyed() then return end
+ local x, y = self:getLinearVelocity()
+ -- Jumping.
+ if self.isJumping and self.jumpTimer > 0 then
+ self:setLinearVelocity(x,-160)
+ self.jumpTimer = self.jumpTimer - dt
+ end
+
+ -- Walking.
+ if self:isControlDown("left") then
+ self.facing = -1
+ self:applyForce(-250, 0)
+ -- Controlled speed limit
+ if x < -self.max_velocity then
+ self:applyForce(250, 0)
+ end
+ end
+ if self:isControlDown("right") then
+ self.facing = 1
+ self:applyForce(250, 0)
+ -- Controlled speed limit
+ if x > self.max_velocity then
+ self:applyForce(-250, 0)
+ end
+ end
+end
+
+-- Controller callbacks.
+function Player:controlpressed (set, action, key)
+ if set ~= self:getControllerSet() then return end
+ -- Jumping
+ if action == "jump" then
+ if self.jumpCounter > 0 then
+ -- General jump logics
+ self.isJumping = true
+ --self:playSound(6)
+ -- Spawn proper effect
+ if not self.inAir then
+ self:createEffect("jump")
+ else
+ self:createEffect("doublejump")
+ end
+ -- Start salto if last jump
+ if self.jumpCounter == 1 then
+ self.salto = true
+ end
+ -- Animation clear
+ if (self.current == self.animations.attack) or
+ (self.current == self.animations.attack_up) or
+ (self.current == self.animations.attack_down) then
+ self:setAnimation("default")
+ end
+ -- Remove jump
+ self.jumpCounter = self.jumpCounter - 1
+ end
+ end
+
+ -- Walking
+ if (action == "left" or action == "right") then
+ self.isWalking = true
+ if (self.current ~= self.animations.attack) and
+ (self.current ~= self.animations.attack_up) and
+ (self.current ~= self.animations.attack_down) then
+ self:setAnimation("walk")
+ end
+ end
+
+ -- Punching
+ if action == "attack" and self.punchCooldown <= 0 then
+ local f = self.facing
+ self.salto = false
+ if self:isControlDown("up") then
+ -- Punch up
+ if self.current ~= self.animations.damage then
+ self:setAnimation("attack_up")
+ end
+ self:punch("up")
+ elseif self:isControlDown("down") then
+ -- Punch down
+ if self.current ~= self.animations.damage then
+ self:setAnimation("attack_down")
+ end
+ self:punch("down")
+ else
+ -- Punch horizontal
+ if self.current ~= self.animations.damage then
+ self:setAnimation("attack")
+ end
+ if f == 1 then
+ self:punch("right")
+ else
+ self:punch("left")
+ end
+ self.punchdir = 1
+ end
+ end
+end
+function Player:controlreleased (set, action, key)
+ if set ~= self:getControllerSet() then return end
+ -- Jumping
+ if action == "jump" then
+ self.isJumping = false
+ self.jumpTimer = Hero.jumpTimer -- take initial from metatable
+ end
+ -- Walking
+ if (action == "left" or action == "right") then
+ self.isWalking = false
+ if not (self:isControlDown("left") or self:isControlDown("right")) and
+ self.current == self.animations.walk then
+ self:setAnimation("default")
+ end
+ end
+end