From ff99b79563623519ce67d7aa41be1177e632b4bc Mon Sep 17 00:00:00 2001 From: lustlion Date: Thu, 10 Feb 2022 18:18:37 +0100 Subject: [PATCH] rope, moved entities from LoadedEntities to LoadedObjects.Entities --- data/scripts/debug.lua | 2 +- data/scripts/editor.lua | 2 +- data/scripts/entities/arrow.lua | 10 +-- data/scripts/entities/cursed_book.lua | 5 +- data/scripts/entities/decoration.lua | 6 +- data/scripts/entities/fairy.lua | 6 +- data/scripts/entities/kupo.lua | 6 +- data/scripts/entities/particle.lua | 1 - data/scripts/entities/player.lua | 100 ++++++++++++++++++++------ data/scripts/entity.lua | 25 ++++++- data/scripts/game.lua | 4 +- data/scripts/gameworld.lua | 2 +- data/scripts/keybind.lua | 5 +- data/scripts/math.lua | 10 +++ main.lua | 1 - 15 files changed, 143 insertions(+), 42 deletions(-) diff --git a/data/scripts/debug.lua b/data/scripts/debug.lua index 69e4c61..b2254d8 100644 --- a/data/scripts/debug.lua +++ b/data/scripts/debug.lua @@ -40,7 +40,7 @@ function DebugEntities() for _, particle in pairs(LoadedParticles) do particle:Debug() end - for _, enty in pairs(LoadedEntities) do + for _, enty in pairs(LoadedObjects.Entities) do enty:Debug() end end diff --git a/data/scripts/editor.lua b/data/scripts/editor.lua index af7ef9b..d86e999 100644 --- a/data/scripts/editor.lua +++ b/data/scripts/editor.lua @@ -108,7 +108,7 @@ function EditorDoEdit() elseif vertical < 0 then expand_v = vertical end - love.graphics.print("> " .. horizontal .. ", " .. vertical) + love.graphics.print("> " .. horizontal .. ", " .. vertical .. "; " .. math.floor(mouse_x / game.scale + Camera.pos.x) .. ", " .. math.floor(mouse_y / game.scale + Camera.pos.y)) love.graphics.print("> " .. LevelWidth .. "(" .. expand_h .. "), " .. LevelHeight .. "(".. expand_v .. ")", 0, 10) if not palette then diff --git a/data/scripts/entities/arrow.lua b/data/scripts/entities/arrow.lua index 1960473..66d1243 100644 --- a/data/scripts/entities/arrow.lua +++ b/data/scripts/entities/arrow.lua @@ -2,8 +2,10 @@ Arrow = Entity:New(x,y) function Arrow:New(x,y,rotation,speed) local o = Entity:New(x,y) - arrow = arrow + 1 - o.pos = {x = x, y = y} + + o.type = "arrow" + + o.pos = {x = x, y = y} o.speed = speed or 0 o.sprite_rotation = rotation or 0 o.vel = { @@ -17,8 +19,8 @@ Arrow = Entity:New(x,y) -- animations o.body = Animation:New(animation.kupo.arrow) - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self diff --git a/data/scripts/entities/cursed_book.lua b/data/scripts/entities/cursed_book.lua index 40d527a..626fae0 100644 --- a/data/scripts/entities/cursed_book.lua +++ b/data/scripts/entities/cursed_book.lua @@ -3,6 +3,7 @@ CursedBook = Entity:New(x,y) function CursedBook:New(x,y) local o = Entity:New(x,y) + o.type = "cursed_book" -- behaviour o.pos = {x = x, y = y} o.speed = 0.01 @@ -28,8 +29,8 @@ CursedBook = Entity:New(x,y) o.light_range = 500 o.light = CreateLight(o.pos.x,o.pos.y,o.light_range,2,HEX2RGB("#fe00d1")) - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self diff --git a/data/scripts/entities/decoration.lua b/data/scripts/entities/decoration.lua index 0ffc0d7..f255656 100644 --- a/data/scripts/entities/decoration.lua +++ b/data/scripts/entities/decoration.lua @@ -3,6 +3,8 @@ Decoration = Entity:New(x,y) function Decoration:New(x,y,animation,lightRange) local o = Entity:New(x,y) + o.type = "decoration" + o.pos = {x = x, y = y} -- animations @@ -15,8 +17,8 @@ function Decoration:New(x,y,animation,lightRange) o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange) end - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self diff --git a/data/scripts/entities/fairy.lua b/data/scripts/entities/fairy.lua index 1778ce9..0a7a17d 100644 --- a/data/scripts/entities/fairy.lua +++ b/data/scripts/entities/fairy.lua @@ -3,6 +3,8 @@ Fairy = Entity:New(x,y) function Fairy:New(x,y) local o = Entity:New(x,y) + o.type = "fairy" + -- behaviour o.pos = {x = x, y = y} o.speed = 1.4 @@ -24,8 +26,8 @@ Fairy = Entity:New(x,y) o.particle_timer = 0 o.particle_time = 5 - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self diff --git a/data/scripts/entities/kupo.lua b/data/scripts/entities/kupo.lua index 00e1deb..77c33bd 100644 --- a/data/scripts/entities/kupo.lua +++ b/data/scripts/entities/kupo.lua @@ -3,6 +3,8 @@ Kupo = Entity:New(x,y) function Kupo:New(x,y) local o = Entity:New(x,y) + o.type = "kupo" + o.pos = {x = x, y = y} o.speed = 20 o.range = 200 @@ -28,8 +30,8 @@ Kupo = Entity:New(x,y) o.lightRange = o.range/2 o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange) - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self diff --git a/data/scripts/entities/particle.lua b/data/scripts/entities/particle.lua index 4784417..804bb80 100644 --- a/data/scripts/entities/particle.lua +++ b/data/scripts/entities/particle.lua @@ -5,7 +5,6 @@ Particle = Entity:New(x,y) o.pos = {x = x, y = y} - o.speed = particle_data.speed or 0 o.direction = particle_data.direction or o.direction o.sprite_rotation = particle_data.sprite_rotation or o.sprite_rotation diff --git a/data/scripts/entities/player.lua b/data/scripts/entities/player.lua index e6985e0..e490357 100644 --- a/data/scripts/entities/player.lua +++ b/data/scripts/entities/player.lua @@ -3,9 +3,8 @@ function Player:New(x,y) local o = Entity:New(x,y) - Player.health = 3 - Player.coins = 0 + o.type = "player" -- physics o.moveSpeed = 1.3 -- gameworld pixels o.zeroSpeed = 0.01 -- gameworld pixels @@ -22,6 +21,7 @@ o.dashCooldownTime = 0.1 -- seconds o.dashCooldownTimer = 0 -- seconds + -- dash values o.dashTimer = 0 -- seconds o.dashTime = 0.15 -- seconds o.dashDistance = 40 -- gameworld pixels @@ -29,30 +29,36 @@ o.dashCount = 1 -- int o.dashAmount = 10 -- int + -- hook values + o.hookDistance = 100 + o.hookedDistance = 80 + o.hookAnchor = { + x = nil, + y = nil + } + o.boxCollision = { from = {x = -8, y = -16}, --gameworld pixels to = {x = 8, y = 0} -- gameworld pixels } - o.lightRange = 0 -- screen pixels + o.lightRange = 10 -- screen pixels -- status o.isDashing = false o.isJumping = false + o.isHooked = false o.isOnGround = true o.isOnLadder = false o.canJump = true o.canFall = true o.canFriction = true o.maskType = animation.moth_mask + o.anchorRespawn = { x = o.pos.x, y = o.pos.y } - o.anchorRope = { - x = nil, - y = nil - } -- sprite o.target_offset = {x = 0, y = 0} @@ -64,8 +70,8 @@ -- lights o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange) - table.insert(LoadedEntities,o) - o.id = #LoadedEntities + table.insert(LoadedObjects.Entities,o) + o.id = #LoadedObjects.Entities setmetatable(o, self) self.__index = self @@ -73,15 +79,24 @@ end function Player:Smart() - self:LightAdjust(-self.target_offset.x,-self.target_offset.y) + self:LightAdjust(self.target_offset.x,self.target_offset.y) + + -- reset coyoteValue + if self.isOnGround then + self.coyoteValue = self.coyoteAmount + elseif self.coyoteValue > 0 then + self.coyoteValue = self.coyoteValue - 1 + end if self.dashTimer <= 0 then + -- horizontal movement if Keybind:CheckDown(Keybind.move.left) then self.move_x = -self.moveSpeed elseif Keybind:CheckDown(Keybind.move.right) then self.move_x = self.moveSpeed end + -- jump if on ground (coyotevalue) if Keybind:CheckDown(Keybind.move.jump) then if self.coyoteValue > 0 then self.vel.y = -self.jumpImpulse @@ -90,19 +105,20 @@ function Player:Smart() end end - if self.isOnGround then - self.coyoteValue = self.coyoteAmount - elseif self.coyoteValue > 0 then - self.coyoteValue = self.coyoteValue - 1 - end - + -- dash timer self.dashCooldownTimer = math.max(0,self.dashCooldownTimer - current_dt) + + -- try to dash if Keybind:CheckDown(Keybind.move.dash) then if self.dashCooldownTimer == 0 and not self.isDashing and self.dashCount > 0 then + + -- state player self.dashCount = self.dashCount - 1 self.isDashing = true + + -- get dash direction local vertical = 0 if Keybind:CheckDown(Keybind.move.down) then vertical = vertical + 1 end if Keybind:CheckDown(Keybind.move.up) then vertical = vertical - 1 end @@ -110,16 +126,32 @@ function Player:Smart() if Keybind:CheckDown(Keybind.move.right) then horizontal = horizontal + 1 end if Keybind:CheckDown(Keybind.move.left) then horizontal = horizontal - 1 end + -- if no direction, then dash forward if horizontal == 0 and vertical == 0 then horizontal = self.sprite_flip.x end + -- set dash values self.dashDirection = GetAngleFromVector(horizontal, vertical) self.dashTimer = self.dashTime end else + -- not dashing! self.isDashing = false end + + if Keybind:CheckDown(Keybind.move.hook) then + local anchor = self:CheckNearest("decoration",self.hookDistance) + if anchor then + self.isHooked = true + self.hookAnchor = { + x = anchor.pos.x, + y = anchor.pos.y + } + end + else + self.isHooked = false + end end function Player:DoPhysics() @@ -131,13 +163,16 @@ function Player:DoPhysics() end if math.abs(self.vel.x) < self.zeroSpeed then self.vel.x = 0 end end + -- reset state + self.canFall = true self.isOnGround = false -- adjust timers self.dashTimer = self.dashTimer - current_dt -- DASH STATE if self.dashTimer > 0 then + self.canFall = false -- dash particle local particle_data = { animation = self.body, @@ -153,28 +188,44 @@ function Player:DoPhysics() -- dash movement self.vel.x = self.dashSpeed * math.cos(self.dashDirection) self.vel.y = self.dashSpeed * math.sin(self.dashDirection) - else - -- not in dash; fall normally + end + + -- hook state + if self.isHooked then + local hook = Vector(self.pos.x, self.pos.y, self.hookAnchor.x, self.hookAnchor.y) + if GetVectorValue(hook) > self.hookedDistance then + local hook_angle = GetAngleFromVector(hook[1],hook[2]) + self.pos.x = self.hookAnchor.x + self.hookedDistance * math.cos(-math.rad(180)+hook_angle) + self.pos.y = self.hookAnchor.y + self.hookedDistance * math.sin(-math.rad(180)+hook_angle) + end + end + + + if self.canFall then + -- not in dash or hook; fall normally self.dashTimer = 0 self.vel.y = self.vel.y + gravity end + -- horizontal collision if not self:isCollidingAt(self.pos.x + self.vel.x + self.move_x, self.pos.y, LoadedObjects.Collisions) then self.pos.x = self.pos.x + self.vel.x + self.move_x else self.vel.x = 0 end + -- vertical collision if not self:isCollidingAt(self.pos.x, self.pos.y + self.vel.y, LoadedObjects.Collisions) then self.pos.y = self.pos.y + self.vel.y else if self.vel.y > 0 then self.isOnGround = true self.dashCount = self.dashAmount - self.vel.y = 0 end + self.vel.y = 0 end + -- if u collision w hazard, respawn if self:isCollidingAt(self.pos.x, self.pos.y, LoadedObjects.Hazards) then self:Respawn() end @@ -190,8 +241,8 @@ function Player:HandleAnimation() if self.move_x ~= 0 then self.sprite_flip.x = math.sign(self.move_x) end -- animation priority - if self.vel.y > 1.25 then self.body = self.body:ChangeTo(animation.nancy.fall) + if self.vel.y > 1.25 then self.mask = self.mask:ChangeTo(self.maskType.fall) elseif self.vel.y < 0 then self.body = self.body:ChangeTo(animation.nancy.jump) @@ -209,6 +260,15 @@ function Player:HandleAnimation() if self.body.anim_speed < 0.5 then self.body.anim_speed = self.body.anim_speed + 0.001 end end + if self.isHooked then + love.graphics.line( + -Camera.pos.x + self.pos.x, + -Camera.pos.y + self.pos.y, + -Camera.pos.x + self.hookAnchor.x, + -Camera.pos.y + self.hookAnchor.y + ) + end + self.body:Animate() self:Draw(self.body) if self.dashCount > 0 then diff --git a/data/scripts/entity.lua b/data/scripts/entity.lua index b01fb4f..3e4d013 100644 --- a/data/scripts/entity.lua +++ b/data/scripts/entity.lua @@ -28,6 +28,27 @@ function Entity:New(x,y) return o end +function Entity:CheckNearest(type,maxdistance) + local return_entity = nil + local shortest = -1 + for _, entity in pairs(LoadedObjects.Entities) do + if not type or entity.type == type then + local distance_x = entity.pos.x - self.pos.x + local distance_y = entity.pos.y - self.pos.y + local distance = math.sqrt(distance_x ^ 2 + distance_y ^ 2) + + if not maxdistance or distance < maxdistance then + if shortest == -1 or distance < shortest then + shortest = distance + return_entity = entity + end + end + + end + end + return return_entity +end + function Entity:Smart() end @@ -63,12 +84,12 @@ function Entity:Kill() KillLight(self.light) end if self.id ~= nil then - for _, e in pairs(LoadedEntities) do + for _, e in pairs(LoadedObjects.Entities) do if e.id > self.id then e.id = e.id - 1 end end - table.remove(LoadedEntities,self.id) + table.remove(LoadedObjects.Entities,self.id) end self = nil end diff --git a/data/scripts/game.lua b/data/scripts/game.lua index 6c5e4ca..4d123b6 100644 --- a/data/scripts/game.lua +++ b/data/scripts/game.lua @@ -4,7 +4,7 @@ function GameStep() for _, particle in pairs(LoadedParticles) do particle:Smart() end - for _, enty in pairs(LoadedEntities) do + for _, enty in pairs(LoadedObjects.Entities) do enty:Smart() end end @@ -12,7 +12,7 @@ function GameStep() for _, particle in pairs(LoadedParticles) do particle:DoPhysics() end - for _, enty in pairs(LoadedEntities) do + for _, enty in pairs(LoadedObjects.Entities) do enty:DoPhysics() end diff --git a/data/scripts/gameworld.lua b/data/scripts/gameworld.lua index 9b74343..d556d8d 100644 --- a/data/scripts/gameworld.lua +++ b/data/scripts/gameworld.lua @@ -42,7 +42,7 @@ end function GameworldDrawEntities() love.graphics.setColor(1,1,1) - for _, enty in pairs(LoadedEntities) do + for _, enty in pairs(LoadedObjects.Entities) do enty:HandleAnimation() end end diff --git a/data/scripts/keybind.lua b/data/scripts/keybind.lua index 9259e34..7678110 100644 --- a/data/scripts/keybind.lua +++ b/data/scripts/keybind.lua @@ -53,19 +53,22 @@ function Keybind:Default() --Menu Keybind.menu.pause= { keys = {"escape"}} Keybind.menu.confirm= { keys = {"z", "space", 1}} + --Move Keybind.move.left = { keys = {"left", "a"}} Keybind.move.right = { keys = {"right", "d"}} Keybind.move.up = { keys = {"up", "w"}} Keybind.move.down = { keys = {"down", "s"}} Keybind.move.jump = { keys = {"z", "space"}} - Keybind.move.attack = { keys = {"x", 1}} + Keybind.move.hook = { keys = {"x", 1}} Keybind.move.dash = { keys = {"c", 2}} + --Debug Keybind.debug.debug = { keys = {"f1"}} Keybind.debug.reposition = { keys = {"f2"}} Keybind.debug.reload = { keys = {"f3"}} Keybind.debug.editor = { keys = {"f4"}} + -- Editor Keybind.editor.palette = { keys = {"tab"}} diff --git a/data/scripts/math.lua b/data/scripts/math.lua index 704a8f1..e88ca6f 100644 --- a/data/scripts/math.lua +++ b/data/scripts/math.lua @@ -8,6 +8,16 @@ function math.sign(x) end end +function Vector(init_x, init_y, final_x, final_y) + local distance_x = final_x - init_x + local distance_y = final_y - init_y + return {distance_x, distance_y} +end + +function GetVectorValue(vector) + return math.sqrt(vector[1] ^ 2 + vector[2] ^ 2) +end + function GetAngleFromVector(x,y) local reduce = 0 if x < 0 then diff --git a/main.lua b/main.lua index 0d60ecc..c4d512c 100644 --- a/main.lua +++ b/main.lua @@ -43,7 +43,6 @@ function love.load() levelNum = 1 currLevel = levelList[levelNum] logPrint("currLevel: "..currLevel) - LoadedEntities = {} LoadedParticles = {} LevelLoadTiles()