Compare commits

...

10 Commits

Author SHA1 Message Date
lustlion
9a20b172af fix fix
last commit
2022-03-17 11:53:48 +01:00
lustlion
a01599c001 fix last commit 2022-03-17 11:52:58 +01:00
lustlion
410c00dcd4 Replaced the id system with a simple flag for deletion 2022-03-17 11:46:10 +01:00
binarycat
8edcbe2d9b use class() in more places 2022-03-16 21:01:04 -04:00
lustlion
fa62e1428b swapped obsolete supertype for getAncestors() 2022-03-17 01:40:35 +01:00
binarycat
9be52e2b5f real real bugfix 2022-03-16 20:38:57 -04:00
binarycat
a3074acb3c real bugfix 2022-03-16 20:36:45 -04:00
binarycat
59726dc2b7 bugfix 2022-03-16 20:34:23 -04:00
lustlion
f0a9c1acf9 added getAncestors() 2022-03-17 01:26:59 +01:00
binarycat
1549976382 add class() for easy definition of classes 2022-03-16 19:59:42 -04:00
17 changed files with 138 additions and 115 deletions

17
code/class.lua Normal file
View File

@@ -0,0 +1,17 @@
function class(super, self)
assert(super == nil or super.__index == super)
self = self or {}
self.__index = self
setmetatable(self, super)
return self
end
function getAncestors(self)
local family = self
local list = {}
while family ~= nil do
family = getmetatable(family)
table.insert(list,family)
end
return list
end

View File

@@ -1,4 +1,4 @@
Collision = {}
Collision = class()
LoadedObjects.Collisions = {}
LoadedObjects.Platforms = {}
@@ -48,7 +48,6 @@ function Collision:new(ox,oy,tx,ty)
end
setmetatable(o, self)
self.__index = self
return o
end

View File

@@ -1,8 +1,7 @@
Arrow = {}
Arrow.type = "Arrow"
Arrow.supertype = Entity.type
Arrow.display = Animation:new(animation.kupo.arrow)
setmetatable(Arrow, Entity)
Arrow = class(Entity, {
type = "Arrow",
display = Animation:new(animation.kupo.arrow),
})
function Arrow:new(x,y,rotation,speed)

View File

@@ -1,8 +1,7 @@
CursedBook = {}
CursedBook.type = "CursedBook"
CursedBook.supertype = Entity.type
CursedBook.display = Animation:new(animation.cursed_book.flying)
setmetatable(CursedBook, Entity)
CursedBook = class(Entity, {
type = "CursedBook",
display = Animation:new(animation.cursed_book.flying),
})
function CursedBook:new(x,y)
local o = Entity:new(x,y)
@@ -37,8 +36,6 @@ function CursedBook:new(x,y)
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,8 +1,8 @@
Decoration = {}
Decoration.type = "Decoration"
Decoration.supertype = Entity.type
Decoration.display = Animation:new(animation.particle.simple)
setmetatable(Decoration, Entity)
Decoration = class(Entity, {
type = "Decoration",
supertype = Entity.type,
display = Animation:new(animation.particle.simple),
})
function Decoration:new(x,y,animation,light_data)
local o = Entity:new(x,y)
@@ -19,8 +19,6 @@ function Decoration:new(x,y,animation,light_data)
o.light = Light:new(o.pos.x,o.pos.y,light_data)
end
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,8 +1,7 @@
Candelabra = {}
Candelabra.type = "Candelabra"
Candelabra.supertype = Decoration.type
Candelabra.display = Animation:new(animation.decoration.candelabra)
setmetatable(Candelabra, Decoration)
Candelabra = class(Decoration, {
type = "Candelabra",
display = Animation:new(animation.decoration.candelabra),
})
function Candelabra:new(x,y)
local light_data = {}

View File

@@ -1,8 +1,7 @@
Fairy = {}
Fairy.type = "Fairy"
Fairy.supertype = Entity.type
Fairy.display = Animation:new(animation.fairy.flying)
setmetatable(Fairy, Entity)
Fairy = class(Entity, {
type = "Fairy",
display = Animation:new(animation.fairy.flying),
})
function Fairy:new(x,y)
local o = Entity:new(x,y)
@@ -32,8 +31,6 @@ function Fairy:new(x,y)
o.particle_timer = 0
o.particle_time = 5
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,8 +1,7 @@
HookAnchor = {}
HookAnchor.type = "HookAnchor"
HookAnchor.supertype = Entity.type
HookAnchor.display = Animation:new(animation.fairy.flying)
setmetatable(HookAnchor, Entity)
HookAnchor = class(Entity, {
type = "HookAnchor",
display = Animation:new(animation.fairy.flying),
})
function HookAnchor:new(x,y,hook_distance)
local o = Entity:new(x,y)
@@ -15,8 +14,6 @@ function HookAnchor:new(x,y,hook_distance)
o:centerOffset(o.body)
o:createBox(o.body)
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,8 +1,7 @@
Kupo = {}
Kupo.type = "Kupo"
Kupo.supertype = Entity.type
Kupo.display = Animation:new(animation.kupo.body)
setmetatable(Kupo, Entity)
Kupo = class(Entity, {
type = "Kupo",
display = Animation:new(animation.kupo.body),
})
function Kupo:new(x,y)
local o = Entity:new(x,y)
@@ -37,8 +36,6 @@ function Kupo:new(x,y)
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,9 +1,8 @@
LoadedObjects.Particles = {}
Particle = {}
Particle.type = "Particle"
Particle.supertype = Entity.type
Particle.display = Animation:new(animation.particle.simple)
setmetatable(Particle, Entity)
Particle = class(Entity, {
type = "Particle",
display = Animation:new(animation.particle.simple),
})
function Particle:new(x,y,particle_data)
local o = Entity:new(x,y)
@@ -23,7 +22,7 @@ function Particle:new(x,y,particle_data)
o.func = particle_data.func or nil
o.time = particle_data.time or nil
if o.time ~= nil then
if o.time then
if particle_data.time_unit ~= nil
and particle_data.time_unit == "frames" then
o.time = o.time
@@ -38,7 +37,7 @@ function Particle:new(x,y,particle_data)
y = o.speed * math.sin(o.direction)
}
if particle_data.light ~= nil then
if particle_data.light then
local light_data = {}
light_data.radius = particle_data.light
light_data.shine_radius = particle_data.light_shine or nil
@@ -48,34 +47,24 @@ function Particle:new(x,y,particle_data)
end
-- animations
if particle_data.animation ~= nil then
if particle_data.animation then
o.body = Animation:new(particle_data.animation,particle_data.animation_speed)
o:centerOffset(o.body)
o:createBox(o.body)
end
-- particle id handled differently from other entities
table.remove(LoadedObjects.Entities,#LoadedObjects.Entities)
table.insert(LoadedObjects.Particles,o)
o.id = #LoadedObjects.Particles
setmetatable(o, self)
self.__index = self
return o
end
function Particle:kill()
if self.light ~= nil then
if self.light then
self.light:kill()
end
if self.id ~= nil then
for _, e in pairs(LoadedObjects.Particles) do
if e.id > self.id then
e.id = e.id - 1
end
end
table.remove(LoadedObjects.Particles,self.id)
end
self = nil
self.dead = true
end
function Particle:handleAnimation()
@@ -85,7 +74,7 @@ function Particle:handleAnimation()
self.sprite_alpha = self.sprite_alpha_base*(self.time-self.timer)/self.time
end
if self.body ~= nil then
if self.body then
self.body:animate()
self:draw(self.body)
end
@@ -101,6 +90,15 @@ function Particle:doLogic()
end
end
function cleanDeadParticles()
for i=1, #LoadedObjects.Particles do
part = LoadedObjects.Particles[i]
if part.kill then
table.remove(LoadedObjects.Particles,i)
end
end
end
function Particle:doPhysics()
-- horizontal collision
self:moveX(
@@ -119,3 +117,16 @@ function Particle:debug()
love.graphics.setColor(0,1,1)
love.graphics.circle("fill", -Camera.pos.x + self.pos.x, -Camera.pos.y + self.pos.y, 1)
end
---------------
function cleanDeadParticles()
for i=1, #LoadedObjects.Particles do
part = LoadedObjects.Particles[i]
if part and part.dead then
table.remove(LoadedObjects.Particles,i)
end
end
end
---------------

View File

@@ -1,8 +1,7 @@
Player = {}
Player.type = "Player"
Player.supertype = Entity.type
Player.display = Animation:new(animation.nancy.idle)
setmetatable(Player, Entity)
Player = class(Entity, {
type = "Player",
display = Animation:new(animation.nancy.idle),
})
function Player:new(x,y)
local o = Entity:new(x,y)
@@ -81,8 +80,6 @@ function Player:new(x,y)
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self)
self.__index = self
return o

View File

@@ -1,6 +1,5 @@
LoadedObjects.Entities = {}
Entity = {}
Entity.type = "Entity"
Entity = class(nil, {type = "Entity"})
function Entity:new(x,y)
local o = {}
@@ -25,16 +24,12 @@ function Entity:new(x,y)
o.sprite_alpha = 1
o.sprite_flip = { x = 1, y = 1}
table.insert(LoadedObjects.Entities,o)
setmetatable(o, self)
self.__index = self
return o
end
function Entity:id()
table.insert(LoadedObjects.Entities,self)
self.id = #LoadedObjects.Entities
end
function Entity:checkNearest(type,maxdistance)
local return_entity = nil
local shortest = -1
@@ -66,9 +61,6 @@ function Entity:checkNearest(type,maxdistance)
return return_entity
end
function Entity:doLogic()
end
function Entity:moveX(amount, func)
self.move_remainder.x = self.move_remainder.x + amount
local move = math.round(self.move_remainder.x)
@@ -132,15 +124,7 @@ function Entity:kill()
if self.light ~= nil then
self.light:kill()
end
if self.id ~= nil then
table.remove(LoadedObjects.Entities,self.id)
for _, e in pairs(LoadedObjects.Entities) do
if e.id > self.id then
e.id = e.id - 1
end
end
end
self = nil
self.dead = true
end
function Entity:checkVisionLine(entity,range)
@@ -308,6 +292,9 @@ function Entity:debug()
end
end
function Entity:doLogic()
end
function Entity:doPhysics()
end
@@ -317,6 +304,19 @@ end
function Entity:drawBackground()
end
---------------
function cleanDeadEntities()
for i=1, #LoadedObjects.Entities do
enty = LoadedObjects.Entities[i]
if enty and enty.dead then
table.remove(LoadedObjects.Entities,i)
end
end
end
---------------
require "code/entities/kupo"
require "code/entities/arrow"
require "code/entities/decoration"

View File

@@ -68,6 +68,10 @@ function stepGame()
Demo:startPlayback()
end
end
cleanDeadParticles()
cleanDeadEntities()
cleanDeadLights()
end
function drawGame()

View File

@@ -1,4 +1,6 @@
Light = {}
Light = class(nil, {
type = "Light"
})
LoadedObjects.Lights = {}
function Light:new(x,y,data)
@@ -17,26 +19,12 @@ function Light:new(x,y,data)
o.flicker_time = 60/12
o.flicker_timer = 0
table.insert(LoadedObjects.Lights,o)
o.id = #LoadedObjects.Lights
setmetatable(o, self)
self.__index = self
table.insert(LoadedObjects.Lights,o)
return o
end
function Light:kill()
if self.id ~= nil then
table.remove(LoadedObjects.Lights,self.id)
for _, e in pairs(LoadedObjects.Lights) do
if e.id > self.id then
e.id = e.id - 1
end
end
end
self = nil
end
function Light:flicker()
self.flicker_timer = self.flicker_timer + 1
@@ -82,3 +70,20 @@ function Light:drawShine()
love.graphics.setShader()
end
end
function Light:kill()
self.dead = true
end
---------------
function cleanDeadLights()
for i=1, #LoadedObjects.Lights do
light = LoadedObjects.Lights[i]
if light and light.dead then
table.remove(LoadedObjects.Lights,i)
end
end
end
---------------

View File

@@ -7,6 +7,7 @@ require "data/sfx"
require "code/locale"
-- support functions
require "code/class"
require "code/math"
require "code/draw"
require "code/hex"

View File

@@ -244,7 +244,13 @@ function drawSpawns()
)
if spawn.selected then
local text = spawn.archetype.type.."\n("..spawn.archetype.supertype..")\n---\nPosition\n["..spawn.args[1]..","..spawn.args[2].."]"
local text = spawn.archetype.type .."\n("
local ancestors = getAncestors(spawn.archetype)
for i=1, #ancestors do
if i > 1 then text = text .. ", " end
text = text .. ancestors[i].type
end
text = text ..")\n---\nPosition\n["..spawn.args[1]..","..spawn.args[2].."]"
if #spawn.args > 2 then
text = text .. "\n---\nData:\n"
for i=3, #spawn.args do

View File

@@ -13,7 +13,7 @@ local function backspace(text)
return ""
end
Prompt = {
Prompt = class(nil, {
-- defaults for instance variables
pos = { x = 10, y = 10 },
input = "",
@@ -23,7 +23,7 @@ Prompt = {
color = {1,1,1,1},
background_color = {0,0,0,1},
active_prompt = nil,
}
})
function Prompt:cancelActive()
if Prompt.active_prompt then
Prompt.active_prompt.canceled = true
@@ -33,7 +33,6 @@ end
function Prompt:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end