Compare commits

..

No commits in common. "d20e5392f8595b5e084d914edfe7c35478462a0e" and "918c63c535ae220c81c9b54c046e9ee12c6b56c6" have entirely different histories.

20 changed files with 105 additions and 208 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 B

After

Width:  |  Height:  |  Size: 92 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 B

After

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 B

After

Width:  |  Height:  |  Size: 97 B

View File

@ -10,8 +10,6 @@ function Animation:new(anim_data,speed)
o.frame = 1 o.frame = 1
o.speed = speed or 1 o.speed = speed or 1
o.was_updated = false
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o
@ -51,9 +49,6 @@ end
-- to linearly animate -- to linearly animate
function Animation:animate() function Animation:animate()
if self.was_updated then
self.was_updated = false
end
if self.frames[self.frame] ~= 0 then if self.frames[self.frame] ~= 0 then
-- try to animate -- try to animate
self.subframe = self.subframe + self.speed self.subframe = self.subframe + self.speed
@ -61,7 +56,6 @@ function Animation:animate()
if self.subframe > self.frames[self.frame]*game.framerate then if self.subframe > self.frames[self.frame]*game.framerate then
self.subframe = self.subframe - self.frames[self.frame]*game.framerate self.subframe = self.subframe - self.frames[self.frame]*game.framerate
self.frame = self.frame + 1 self.frame = self.frame + 1
self.was_updated = true
end end
-- cycle -- cycle

View File

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

View File

@ -1,8 +1,6 @@
CursedBook = {} CursedBook = Entity:new()
CursedBook.type = "CursedBook" CursedBook.type = "CursedBook"
CursedBook.supertype = Entity.type
CursedBook.display = Animation:new(animation.cursed_book.flying) CursedBook.display = Animation:new(animation.cursed_book.flying)
setmetatable(CursedBook, Entity)
function CursedBook:new(x,y) function CursedBook:new(x,y)
local o = Entity:new(x,y) local o = Entity:new(x,y)
@ -30,12 +28,8 @@ function CursedBook:new(x,y)
o:createBox(o.body) o:createBox(o.body)
-- light -- light
local light_data = {} o.light_range = 500
light_data.radius = 500 --o.light = Light:new(o.pos.x,o.pos.y,o.light_range,2,hex2rgb("#fe00d1"))
light_data.shine_radius = 0
light_data.flicker = nil
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id() o:id()

View File

@ -1,22 +1,20 @@
Decoration = {} Decoration = Entity:new()
Decoration.type = "Decoration" Decoration.type = "Decoration"
Decoration.supertype = Entity.type Decoration.display = nil
Decoration.display = Animation:new(animation.particle.simple)
setmetatable(Decoration, Entity)
function Decoration:new(x,y,animation,light_data) function Decoration:new(x,y,animation,light_radius)
local o = Entity:new(x,y) local o = Entity:new(x,y)
o.pos = {x = x, y = y} o.pos = {x = x, y = y}
if animation then -- animations
o.body = Animation:new(animation) o.body = Animation:new(animation)
o:centerOffset(o.body) o:centerOffset(o.body)
o:createBox(o.body) o:createBox(o.body)
end
if light_data then if light_radius ~= nil then
o.light = Light:new(o.pos.x,o.pos.y,light_data) o.light_radius = light_radius
o.light = Light:new(o.pos.x,o.pos.y,o.light_radius)
end end
o:id() o:id()
@ -31,4 +29,5 @@ function Decoration:handleAnimation()
self:draw(self.body) self:draw(self.body)
end end
require "code/entities/decorations/candelabra" function Decoration:doPhysics()
end

View File

@ -1,55 +0,0 @@
Candelabra = {}
Candelabra.type = "Candelabra"
Candelabra.supertype = Decoration.type
Candelabra.display = Animation:new(animation.decoration.candelabra)
setmetatable(Candelabra, Decoration)
function Candelabra:new(x,y)
local light_data = {}
light_data.radius = 100
light_data.color = hex2rgb("#fed100")
local o = Decoration:new(x,y,animation.decoration.candelabra,light_data)
o.particle_rate = 5
o.particle_count = 0
setmetatable(o, self)
self.__index = self
return o
end
function Candelabra:handleAnimation()
if self.body.was_updated then
self.particle_count = self.particle_count + 1
while self.particle_count >= self.particle_rate do
local pos = math.floor(math.random(1,3))-2
local particle_data = {}
particle_data.animation = animation.particle.simple
particle_data.sprite_tint = hex2rgb("#ffffff")
particle_data.sprite_alpha_fade = true
particle_data.direction = -math.rad(90)
particle_data.speed = 0.5 + math.random(2)*0.005
particle_data.time = 0.5+math.random(0.5)
particle_data.animation_speed = 1/particle_data.time
particle_data.func = function(self)
--COSINE WAVE FUNCTION
--init variables and constants
self.t = self.t or 0
self.phase = self.phase or math.random(2*math.pi)
local dt = 0.5
local amplitude = 0.5
local frequency = 0.5/game.framerate
--calc
self.t = self.t + dt
self:moveX(amplitude*math.cos(2*math.pi*frequency*self.t+self.phase))
end
Particle:new(self.pos.x+pos*5,self.pos.y-3,particle_data)
self.particle_count = self.particle_count - self.particle_rate
end
end
Decoration.handleAnimation(self)
end

View File

@ -1,8 +1,6 @@
Fairy = {} Fairy = Entity:new()
Fairy.type = "Fairy" Fairy.type = "Fairy"
Fairy.supertype = Entity.type
Fairy.display = Animation:new(animation.fairy.flying) Fairy.display = Animation:new(animation.fairy.flying)
setmetatable(Fairy, Entity)
function Fairy:new(x,y) function Fairy:new(x,y)
local o = Entity:new(x,y) local o = Entity:new(x,y)
@ -21,12 +19,8 @@ function Fairy:new(x,y)
o:createBox(o.body) o:createBox(o.body)
-- light -- light
local light_data = {} o.light_radius = 80
light_data.radius = 80 o.light = Light:new(o.pos.x,o.pos.y,o.light_radius,nil,hex2rgb("#fed100"))
light_data.shine_radius = 80
light_data.flicker = nil
light_data.color = hex2rgb("#fed100")
o.light = Light:new(o.pos.x,o.pos.y,light_data)
-- timer -- timer
o.particle_timer = 0 o.particle_timer = 0
@ -94,19 +88,16 @@ function Fairy:handleAnimation()
local vector = vector(self.vel.x,self.vel.y) local vector = vector(self.vel.x,self.vel.y)
local angle = getAngleFromVector(vector) local angle = getAngleFromVector(vector)
self.particle_timer = 0 self.particle_timer = 0
local particle_data = {} local particle_data = {
particle_data.animation = animation.particle.simple animation = animation.particle.simple,
particle_data.animation_speed = 1 animation_speed = 1,
particle_data.sprite_tint = hex2rgb("#fed100") sprite_tint = hex2rgb("#fed100"),
particle_data.sprite_alpha_fade = true sprite_alpha_fade = true,
particle_data.direction = angle-math.rad(180+math.random(60)-30) direction = angle-math.rad(180+math.random(60)-30),
particle_data.speed = 1 speed = 1,
particle_data.time = 0.75 speed_increase = -0.01,
particle_data.func = function(self) time = 0.75
self.speed = self.speed - 0.01 }
self.vel.x = self.speed * math.cos(self.direction)
self.vel.y = self.speed * math.sin(self.direction)
end
Particle:new(self.pos.x,self.pos.y,particle_data) Particle:new(self.pos.x,self.pos.y,particle_data)
end end
end end

View File

@ -1,8 +1,6 @@
HookAnchor = {} HookAnchor = Entity:new()
HookAnchor.type = "HookAnchor" HookAnchor.type = "HookAnchor"
HookAnchor.supertype = Entity.type
HookAnchor.display = Animation:new(animation.fairy.flying) HookAnchor.display = Animation:new(animation.fairy.flying)
setmetatable(HookAnchor, Entity)
function HookAnchor:new(x,y,hook_distance) function HookAnchor:new(x,y,hook_distance)
local o = Entity:new(x,y) local o = Entity:new(x,y)

View File

@ -1,8 +1,6 @@
Kupo = {} Kupo = Entity:new()
Kupo.type = "Kupo" Kupo.type = "Kupo"
Kupo.supertype = Entity.type
Kupo.display = Animation:new(animation.kupo.body) Kupo.display = Animation:new(animation.kupo.body)
setmetatable(Kupo, Entity)
function Kupo:new(x,y) function Kupo:new(x,y)
local o = Entity:new(x,y) local o = Entity:new(x,y)
@ -29,13 +27,8 @@ function Kupo:new(x,y)
o.bow_aim_frames = 8 o.bow_aim_frames = 8
o.hostile = true o.hostile = true
-- light values o.light_radius = o.range/2
local light_data = {} o.light = Light:new(o.pos.x,o.pos.y,o.light_radius)
light_data.radius = 100
light_data.shine_radius = 20
light_data.flicker = nil
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id() o:id()

View File

@ -1,9 +1,8 @@
LoadedObjects.Particles = {} LoadedObjects.Particles = {}
Particle = {}
Particle = Entity:new()
Particle.type = "Particle" Particle.type = "Particle"
Particle.supertype = Entity.type
Particle.display = Animation:new(animation.particle.simple) Particle.display = Animation:new(animation.particle.simple)
setmetatable(Particle, Entity)
function Particle:new(x,y,particle_data) function Particle:new(x,y,particle_data)
local o = Entity:new(x,y) local o = Entity:new(x,y)
@ -11,18 +10,17 @@ function Particle:new(x,y,particle_data)
o.pos = {x = x, y = y} o.pos = {x = x, y = y}
o.speed = particle_data.speed or 0 o.speed = particle_data.speed or 0
o.direction = particle_data.direction or 0 o.direction = particle_data.direction or o.direction
o.sprite_rotation = particle_data.sprite_rotation or 0 o.sprite_rotation = particle_data.sprite_rotation or o.sprite_rotation
o.sprite_offset = particle_data.sprite_offset or vector(0,0) o.sprite_offset = particle_data.sprite_offset or o.sprite_offset
o.sprite_scale = particle_data.sprite_scale or vector(1,1) o.sprite_scale = particle_data.sprite_scale or o.sprite_scale
o.sprite_tint = particle_data.sprite_tint or {1,1,1} o.sprite_tint = particle_data.sprite_tint or o.sprite_tint
o.sprite_alpha = particle_data.sprite_alpha or 1 o.sprite_alpha = particle_data.sprite_alpha or o.sprite_alpha
o.sprite_alpha_fade = particle_data.sprite_alpha_fade or false o.sprite_alpha_fade = particle_data.sprite_alpha_fade or false
o.sprite_alpha_base = o.sprite_alpha o.sprite_alpha_base = o.sprite_alpha
o.sprite_flip = particle_data.sprite_flip or vector(1,1) o.sprite_flip = particle_data.sprite_flip or o.sprite_flip
o.func = particle_data.func or nil
o.time = particle_data.time or nil
o.time = particle_data.time or nil
if o.time ~= nil then if o.time ~= nil then
if particle_data.time_unit ~= nil if particle_data.time_unit ~= nil
and particle_data.time_unit == "frames" then and particle_data.time_unit == "frames" then
@ -38,13 +36,13 @@ function Particle:new(x,y,particle_data)
y = o.speed * math.sin(o.direction) y = o.speed * math.sin(o.direction)
} }
o.speed_increase = particle_data.speed_increase or 0
if particle_data.light ~= nil then if particle_data.light ~= nil then
local light_data = {} o.light_range = particle_data.light
light_data.radius = particle_data.light local flicker = particle_data.light_flicker or nil
light_data.shine_radius = particle_data.light_shine or nil local color = particle_data.light_color or nil
light_data.flicker = particle_data.light_flicer or nil o.light = Light:new(o.pos.x,o.pos.y,o.light_range,flicker,color)
light_data.color = particle_data.light_color or nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
end end
-- animations -- animations
@ -92,11 +90,14 @@ function Particle:handleAnimation()
end end
function Particle:doLogic() function Particle:doLogic()
if self.func then -- adjust speed
self:func() if self.speed_increase ~= 0 then
self.speed = self.speed + self.speed_increase
self.vel.x = self.speed * math.cos(self.direction)
self.vel.y = self.speed * math.sin(self.direction)
end end
if self.time then if self.time ~= nil then
if self.timer >= self.time then self:kill() end if self.timer >= self.time then self:kill() end
end end
end end

View File

@ -1,8 +1,6 @@
Player = {} Player = Entity:new()
Player.type = "Player" Player.type = "Player"
Player.supertype = Entity.type
Player.display = Animation:new(animation.nancy.idle) Player.display = Animation:new(animation.nancy.idle)
setmetatable(Player, Entity)
function Player:new(x,y) function Player:new(x,y)
local o = Entity:new(x,y) local o = Entity:new(x,y)
@ -43,6 +41,9 @@ function Player:new(x,y)
o.walljump_nodrift_amount = 12 o.walljump_nodrift_amount = 12
o.walljump_impulse = { x = 2.5, y = 3.5 } o.walljump_impulse = { x = 2.5, y = 3.5 }
-- light values
o.light_radius = 40 -- screen pixels
-- status -- status
o.can_jump = true o.can_jump = true
o.can_fall = true o.can_fall = true
@ -74,12 +75,7 @@ function Player:new(x,y)
o:createBox(o.body,0,4,-1,-5) o:createBox(o.body,0,4,-1,-5)
-- lights -- lights
local light_data = {} o.light = Light:new(o.pos.x,o.pos.y,o.light_radius)
light_data.radius = 40
light_data.shine_radius = 20
light_data.flicker = nil
light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id() o:id()

View File

@ -1,6 +1,5 @@
Entity = {class = "Entity"}
LoadedObjects.Entities = {} LoadedObjects.Entities = {}
Entity = {}
Entity.type = "Entity"
function Entity:new(x,y) function Entity:new(x,y)
local o = {} local o = {}
@ -24,9 +23,11 @@ function Entity:new(x,y)
o.sprite_tint = {1,1,1} o.sprite_tint = {1,1,1}
o.sprite_alpha = 1 o.sprite_alpha = 1
o.sprite_flip = { x = 1, y = 1} o.sprite_flip = { x = 1, y = 1}
o.illuminated = false
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o
end end

View File

@ -79,7 +79,19 @@ function drawGameworldDarkness()
love.graphics.setBlendMode("replace") love.graphics.setBlendMode("replace")
love.graphics.setColor(0,0,0,0) love.graphics.setColor(0,0,0,0)
for _, light in pairs(LoadedObjects.Lights) do for _, light in pairs(LoadedObjects.Lights) do
light:drawClear() if light.range ~= 0 then
local position = {
x = (light.pos.x - Camera.pos.x) / game.scale,
y = (light.pos.y - Camera.pos.y) / game.scale
}
local range = (light.range + light.flicker_value) / game.scale
love.graphics.circle(
"fill",
position.x,
position.y,
range
)
end
end end
Canvas.Darkness:endDrawing() Canvas.Darkness:endDrawing()
Canvas.Darkness:draw() Canvas.Darkness:draw()
@ -87,7 +99,23 @@ end
function drawGameworldLights() function drawGameworldLights()
for _, light in pairs(LoadedObjects.Lights) do for _, light in pairs(LoadedObjects.Lights) do
light:drawShine() if light.range ~= 0 then
love.graphics.setColor(light.color[1],light.color[2],light.color[3],1)
shader.circle_gradient:send("pos_x",- Camera.pos.x + light.pos.x)
shader.circle_gradient:send("pos_y",- Camera.pos.y + light.pos.y)
shader.circle_gradient:send("range",light.range)
shader.circle_gradient:send("scale",game.scale)
love.graphics.setShader(shader.circle_gradient)
love.graphics.circle(
"fill",
- Camera.pos.x + light.pos.x,
- Camera.pos.y + light.pos.y,
light.range
)
love.graphics.setShader()
end
end end
end end

View File

@ -1,17 +1,16 @@
Light = {} Light = {}
LoadedObjects.Lights = {} LoadedObjects.Lights = {}
function Light:new(x,y,data) function Light:new(x,y,range,flicker,color,lum)
local o = {} local o = {}
o.pos = { o.pos = {
x = x, x = x,
y = y y = y
} }
o.radius = data.radius o.range = range
o.shine_radius = data.shine_radius or 0 o.lum = lum or 1
o.lum = data.lum or 1 o.color = color or {1,1,1}
o.color = data.color or {1,1,1} o.flicker_amount = flicker or 2
o.flicker_amount = data.flicker or 2
o.flicker_value = 0 o.flicker_value = 0
o.dim = 0 o.dim = 0
o.flicker_time = 60/12 o.flicker_time = 60/12
@ -46,39 +45,3 @@ function Light:flicker()
self.flicker_value = math.min(math.max(self.flicker_value, -self.flicker_amount), self.flicker_amount) self.flicker_value = math.min(math.max(self.flicker_value, -self.flicker_amount), self.flicker_amount)
end end
end end
function Light:drawClear()
if self.radius ~= 0 then
local position = {
x = (self.pos.x - Camera.pos.x) / game.scale,
y = (self.pos.y - Camera.pos.y) / game.scale
}
local radius = (self.radius + self.flicker_value) / game.scale
love.graphics.circle(
"fill",
position.x,
position.y,
radius
)
end
end
function Light:drawShine()
if self.radius ~= 0 then
love.graphics.setColor(self.color[1],self.color[2],self.color[3],1)
shader.circle_gradient:send("pos_x",- Camera.pos.x + self.pos.x)
shader.circle_gradient:send("pos_y",- Camera.pos.y + self.pos.y)
shader.circle_gradient:send("radius",self.shine_radius)
shader.circle_gradient:send("scale",game.scale)
love.graphics.setShader(shader.circle_gradient)
love.graphics.circle(
"fill",
- Camera.pos.x + self.pos.x,
- Camera.pos.y + self.pos.y,
self.radius
)
love.graphics.setShader()
end
end

View File

@ -24,7 +24,7 @@ function selectSpawns(rect)
local x, y = rect:getPoints() local x, y = rect:getPoints()
local select_rect = Rect:fromPoints(x-{x=Camera.pos.x,y=Camera.pos.y},y-{x=Camera.pos.x,y=Camera.pos.y}) local select_rect = Rect:fromPoints(x-{x=Camera.pos.x,y=Camera.pos.y},y-{x=Camera.pos.x,y=Camera.pos.y})
select_rect:fix() select_rect:fix()
for _, spawn in pairs(LoadedObjects.Spawns) do for _, spawn in pairs(LoadedObjects.Spawns) do
local offset_x, offset_y = spawn.archetype.display:getCenteredOffset() local offset_x, offset_y = spawn.archetype.display:getCenteredOffset()
@ -244,7 +244,7 @@ function drawSpawns()
) )
if spawn.selected then 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---\nPosition\n["..spawn.args[1]..","..spawn.args[2].."]"
if #spawn.args > 2 then if #spawn.args > 2 then
text = text .. "\n---\nData:\n" text = text .. "\n---\nData:\n"
for i=3, #spawn.args do for i=3, #spawn.args do

View File

@ -2,7 +2,7 @@ return {
name = "Dev Level", name = "Dev Level",
tileset = tileset.library, tileset = tileset.library,
properties = { properties = {
darkness = true darkness = false
}, },
tiles = { tiles = {
{ 1, 4, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, { 1, 4, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
@ -32,8 +32,7 @@ return {
spawns = { spawns = {
{Fairy,{100,88}}, {Fairy,{100,88}},
{HookAnchor,{200,89,100}}, {HookAnchor,{200,89,100}},
{HookAnchor,{400,89,120}}, {HookAnchor,{400,89,120}}
{Candelabra,{328,297}}
}, },
rooms = { rooms = {
{{96,64},{544,320}}, {{96,64},{544,320}},

View File

@ -2,7 +2,7 @@ shader = {}
shader.circle_gradient = love.graphics.newShader[[ shader.circle_gradient = love.graphics.newShader[[
uniform float pos_x; uniform float pos_x;
uniform float pos_y; uniform float pos_y;
uniform float radius; uniform float range;
uniform float scale; uniform float scale;
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ){ vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ){
@ -12,13 +12,11 @@ shader.circle_gradient = love.graphics.newShader[[
float distance_x = pos_x - screen_coords.x / scale; float distance_x = pos_x - screen_coords.x / scale;
float distance_y = pos_y - screen_coords.y / scale; float distance_y = pos_y - screen_coords.y / scale;
float distance = sqrt( pow(distance_x,2) + pow(distance_y,2) ) ; float distance = sqrt( pow(distance_x,2) + pow(distance_y,2) ) ;
if (distance < radius){ if (distance < range){
float alpha = 1-(5*distance/radius); float alpha = 1-(5*distance/range);
if (pixel.a > alpha){ if (pixel.a > alpha){
pixel.a = alpha; pixel.a = alpha;
} }
} else {
pixel.a = 0;
} }
return pixel * color * color; return pixel * color * color;
} }