Lighting system

This commit is contained in:
lustlion
2021-10-26 01:19:22 +02:00
parent 531555a1d0
commit f926723194
11 changed files with 946 additions and 828 deletions

View File

@@ -11,6 +11,7 @@ require "data/scripts/collision"
require "data/scripts/level"
-- data
require "data/scripts/camera"
require "data/scripts/lights"
require "data/scripts/objects"
-- UI functions
require "data/scripts/debug"

View File

@@ -1,4 +1,11 @@
function DebugUI()
for _, light in pairs(Lights) do
love.graphics.print(light.pos.x,light.pos.x,light.pos.y)
love.graphics.print(light.pos.y,light.pos.x,light.pos.y+20)
love.graphics.print(light.pos.x,light.pos.x,light.pos.y+40)
end
love.graphics.print("time: "..fps_total..", fps: "..fps_draw..", frametime: "..math.floor(current_dt* 1000).."ms", 10*textScale, 0*textScale, 0, textScale)
love.graphics.setColor(1,1,1)

View File

@@ -15,7 +15,7 @@ Arrow = Entity:New(x,y)
setmetatable(o, self)
self.__index = self
table.insert(LoadedEntities,o)
table.insert(LoadedEntities,o)
return o
end

View File

@@ -18,7 +18,11 @@ Kupo = Entity:New(x,y)
o.bow_speed = 1/10
o.bow_frames = 6
o.bow_extraframes = 18
o.bow_aim_frames = 8
o.bow_aim_frames = 8
o.lightRange = o.range
o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange)
setmetatable(o, self)
self.__index = self

View File

@@ -1,203 +1,214 @@
Player = Entity:New(x,y)
function Player:New(x,y)
local o = Entity:New(x,y)
Player.health = 3
Player.coins = 0
-- physics
o.vel = {
x = 0,
y = 0
}
-- constants
o.acc = 45
o.friction = 20
o.gravity = 9.81
o.climbHeight = 4
o.jumpForce = 5
o.maxSpeed = 600
o.jumpMaxSpeed = 9.5
o.zeroSpeed = 0.001
-- bools
o.isJumping = false
o.isOnGround = 0
o.coyoteValue = 5
o.isOnLadder = false
o.canJump = true
o.canFall = true
o.canFriction = true
-- sprite
o.sprite_offset = {x = 8, y = 16}
o.target_offset = {x = 4, y = 12}
setmetatable(o, self)
self.__index = self
return o
end
function Player:Smart()
-- PLATFORMER INPUT
if self.isOnGround > 0 then
-- apply friction
-- horizontal input (slide~~)
if love.keyboard.isDown('a',"left") then
self.vel.x = self.vel.x - self.acc*current_dt
end
if love.keyboard.isDown('d',"right") then
self.vel.x = self.vel.x + self.acc*current_dt
end
if self.canJump then
-- vertical input (jump!)
if love.keyboard.isDown("up", "w") and self.isJumping ~= true then
self.vel.y = self.vel.y - self.jumpForce
self.isOnGround = 0
self.isJumping = true
end
end
end
-- fall if down input on platforms
if not isThereCollisionAt(
self.pos.x,
self.pos.y + self.vel.y
) and not isThereLadderAt(
self.pos.x,
self.pos.y + self.vel.y
) and isTherePlatformAt(
self.pos.x,
self.pos.y + self.vel.y
) and love.keyboard.isDown("down", "s")
then
self.pos.y = self.pos.y + tileProperties.height/3
self.isOnGround = 0
end
end
function Player:HandleAnimation()
-- flip sprite to look in the direction is moving
if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end
-- animation manager
if self.isOnLadder then
self:LoadAnimation(animation.nancy.jump)
elseif self.isOnGround == 0 and self.isJumping and self.vel.y > 1.25 then
self:LoadAnimation(animation.nancy.fall)
elseif self.isOnGround == 0 and self.vel.y < 0 then
self:LoadAnimation(animation.nancy.jump)
elseif self.vel.x ~= 0 then
self:LoadAnimation(animation.nancy.run)
else
self:LoadAnimation(animation.nancy.idle)
end
-- special case: idle animation gets slower by time
if self.anim_path == animation.nancy.idle.path then
if self.anim_speed < 0.5 then self.anim_speed = self.anim_speed + 0.001 end
end
end
function Player:DoPhysics()
-- reset physics resolution
self.canFall = true
self.canJump = true
self.canFriction = true
-- reset flags
self.isOnLadder = false
-- truncate to max & min values
if math.abs(self.vel.x) > self.maxSpeed then
self.vel.x = self.maxSpeed * math.sign(self.vel.x)
end
if math.abs(self.vel.y) > self.maxSpeed then
self.vel.y = self.maxSpeed * math.sign(self.vel.y)
end
if math.abs(self.vel.x) < self.zeroSpeed then
self.vel.x = 0
end
if math.abs(self.vel.y) < self.zeroSpeed then
self.vel.y = 0
end
-- if on air, say so!
if self.vel.y > 5 then
self.isJumping = true
end
-- if its on ground, then say so.
if self.vel.y > 0 then
if isThereAnyCollisionAt(
self.pos.x,
self.pos.y + self.vel.y
) then
self.isOnGround = self.coyoteValue
self.isJumping = false
end
end
-- horizontal collisions
if isThereAnyCollisionAt(self.pos.x + self.vel.x, self.pos.y) then
-- checks for ladders
if isThereLadderAt(self.pos.x + self.vel.x, self.pos.y)
and self.vel.x ~= 0
and not isThereLadderAt(self.pos.x, self.pos.y)
then
self.vel.y = 0
self.vel.x = 0
self.pos.y = self.pos.y - 4 * current_dt
self.canFall = false
self.canJump = false
self.canFriction = false
self.isOnLadder = true
self.isOnGround = self.coyoteValue
end
-- checks for slopes
for i = 1, self.climbHeight do
if not isThereCollisionAt(self.pos.x + self.vel.x, self.pos.y - i)
and self.isOnGround > 0 then
self.pos.x = self.pos.x + self.vel.x * 4/5
self.pos.y = self.pos.y - i
self.canFriction = false
break
end
end
-- hey, you arent permanently stopped while collisioning, just lose a bit of force!
if self.canFriction then
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction/15, 1))
end
else
self.pos.x = self.pos.x + self.vel.x
end
-- vertical collision
if self.vel.y > 0
and isThereAnyCollisionAt(self.pos.x, self.pos.y + self.vel.y) then
self.isOnGround = self.coyoteValue
self.isJumping = false
self.vel.y = 0
else
self.pos.y = self.pos.y + self.vel.y
self.isOnGround = math.max(self.isOnGround - 1, 0)
end
-- drop.
if self.canFall then
self.vel.y = self.vel.y + 2*self.gravity * current_dt
end
-- friction hard in ground, soft in air
if self.isOnGround > 0 then
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction, 1))
else
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction/20, 1))
end
end
Player = Entity:New(x,y)
function Player:New(x,y)
local o = Entity:New(x,y)
Player.health = 3
Player.coins = 0
-- physics
o.vel = {
x = 0,
y = 0
}
-- constants
o.acc = 45
o.friction = 20
o.gravity = 9.81
o.climbHeight = 4
o.jumpForce = 5
o.maxSpeed = 600
o.jumpMaxSpeed = 9.5
o.zeroSpeed = 0.001
o.lightRange = 20
-- status
o.isJumping = false
o.isOnGround = 0
o.coyoteValue = 5
o.isOnLadder = false
o.canJump = true
o.canFall = true
o.canFriction = true
-- sprite
o.sprite_offset = {x = 8, y = 16}
o.target_offset = {x = 0, y = 12}
-- lights
o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange)
setmetatable(o, self)
self.__index = self
return o
end
function Player:Smart()
-- PLATFORMER INPUT
if self.isOnGround > 0 then
-- apply friction
-- horizontal input (slide~~)
if love.keyboard.isDown('a',"left") then
self.vel.x = self.vel.x - self.acc*current_dt
end
if love.keyboard.isDown('d',"right") then
self.vel.x = self.vel.x + self.acc*current_dt
end
if self.canJump then
-- vertical input (jump!)
if love.keyboard.isDown("up", "w") and self.isJumping ~= true then
self.vel.y = self.vel.y - self.jumpForce
self.isOnGround = 0
self.isJumping = true
end
end
end
-- fall if down input on platforms
if not isThereCollisionAt(
self.pos.x,
self.pos.y + self.vel.y
) and not isThereLadderAt(
self.pos.x,
self.pos.y + self.vel.y
) and isTherePlatformAt(
self.pos.x,
self.pos.y + self.vel.y
) and love.keyboard.isDown("down", "s")
then
self.pos.y = self.pos.y + tileProperties.height/3
self.isOnGround = 0
end
end
function Player:HandleAnimation()
-- move light to position, :D
self.light.pos.x = self.pos.x - self.target_offset.x
self.light.pos.y = self.pos.y - self.target_offset.y
-- flip sprite to look in the direction is moving
if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end
-- animation manager
if self.isOnLadder then
self:LoadAnimation(animation.nancy.jump)
elseif self.isOnGround == 0 and self.isJumping and self.vel.y > 1.25 then
self:LoadAnimation(animation.nancy.fall)
elseif self.isOnGround == 0 and self.vel.y < 0 then
self:LoadAnimation(animation.nancy.jump)
elseif self.vel.x ~= 0 then
self:LoadAnimation(animation.nancy.run)
else
self:LoadAnimation(animation.nancy.idle)
end
-- special case: idle animation gets slower by time
if self.anim_path == animation.nancy.idle.path then
if self.anim_speed < 0.5 then self.anim_speed = self.anim_speed + 0.001 end
end
end
function Player:DoPhysics()
-- reset physics resolution
self.canFall = true
self.canJump = true
self.canFriction = true
-- reset flags
self.isOnLadder = false
-- truncate to max & min values
if math.abs(self.vel.x) > self.maxSpeed then
self.vel.x = self.maxSpeed * math.sign(self.vel.x)
end
if math.abs(self.vel.y) > self.maxSpeed then
self.vel.y = self.maxSpeed * math.sign(self.vel.y)
end
if math.abs(self.vel.x) < self.zeroSpeed then
self.vel.x = 0
end
if math.abs(self.vel.y) < self.zeroSpeed then
self.vel.y = 0
end
-- if on air, say so!
if self.vel.y > 5 then
self.isJumping = true
end
-- if its on ground, then say so.
if self.vel.y > 0 then
if isThereAnyCollisionAt(
self.pos.x,
self.pos.y + self.vel.y
) then
self.isOnGround = self.coyoteValue
self.isJumping = false
end
end
-- horizontal collisions
if isThereAnyCollisionAt(self.pos.x + self.vel.x, self.pos.y) then
-- checks for ladders
if isThereLadderAt(self.pos.x + self.vel.x, self.pos.y)
and self.vel.x ~= 0
and not isThereLadderAt(self.pos.x, self.pos.y)
then
self.vel.y = 0
self.vel.x = 0
self.pos.y = self.pos.y - 4 * current_dt
self.canFall = false
self.canJump = false
self.canFriction = false
self.isOnLadder = true
self.isOnGround = self.coyoteValue
end
-- checks for slopes
for i = 1, self.climbHeight do
if not isThereCollisionAt(self.pos.x + self.vel.x, self.pos.y - i)
and self.isOnGround > 0 then
self.pos.x = self.pos.x + self.vel.x * 4/5
self.pos.y = self.pos.y - i
self.canFriction = false
break
end
end
-- hey, you arent permanently stopped while collisioning, just lose a bit of force!
if self.canFriction then
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction/15, 1))
end
else
self.pos.x = self.pos.x + self.vel.x
end
-- vertical collision
if self.vel.y > 0
and isThereAnyCollisionAt(self.pos.x, self.pos.y + self.vel.y) then
self.isOnGround = self.coyoteValue
self.isJumping = false
self.vel.y = 0
else
self.pos.y = self.pos.y + self.vel.y
self.isOnGround = math.max(self.isOnGround - 1, 0)
end
-- drop.
if self.canFall then
self.vel.y = self.vel.y + 2*self.gravity * current_dt
end
-- friction hard in ground, soft in air
if self.isOnGround > 0 then
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction, 1))
else
self.vel.x = self.vel.x * (1 - math.min(current_dt * self.friction/20, 1))
end
end

View File

@@ -1,153 +1,153 @@
Entity = {
}
function Entity:New(x,y)
o = {}
o.pos = {x = x, y = y}
o.vel = {x = 0, y = 0}
o.class = "Entity"
o.anim = {}
o.anim.subframe = 0
o.anim.frame = 1
o.anim.imgs = {}
o.animations = {}
o.sprite_offset = {x = 0, y = 0}
o.sprite_scale = {x = 1, y = 1}
o.sprite_rotation = math.rad(0)
o.sprite_flip = { x = 1, y = 1}
setmetatable(o, self)
self.__index = self
return o
end
function Entity:Move(target, speed) -- target = {tx int, ty int} / speed = int
end
function Entity:Draw()
if self.sprite ~= nil then
local relative_position_x = self.pos.x - Camera.pos.x
local relative_position_y = self.pos.y - Camera.pos.y
local origin_compensation_x = - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation))
local origin_compensation_y = - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation))
local dimensions_x = self.sprite_scale.x * self.sprite_flip.x
local dimensions_y = self.sprite_scale.y * self.sprite_flip.y
love.graphics.draw(
self.sprite,
relative_position_x + origin_compensation_x * dimensions_x,
relative_position_y + origin_compensation_y * dimensions_y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
if debug_collision then
love.graphics.setColor(1, 0, 0)
love.graphics.circle( "line", relative_position_x, relative_position_y, 2 )
love.graphics.setColor(0, 1 ,0)
love.graphics.circle( "line",
relative_position_x + origin_compensation_x * dimensions_x,
relative_position_y + origin_compensation_y * dimensions_y,
2
)
end
love.graphics.setColor(1, 1 ,1)
end
end
function Entity:NewAnimation(anim,frames,speed)
local anim_data = {
frame = 1,
subframe = 1,
path = anim.path,
frames = anim.frames,
speed = anim.speed,
imgs = anim.imgs
}
self.animations[#self.animations+1] = anim_data
return self.animations[#self.animations]
end
function DrawAnimationFrame(animation, frame, x, y, rotate, sx, sy)
local x = x or 0
local y = y or 0
local sx = sx or 1
local sy = sy or 1
love.graphics.draw(
animation.imgs[frame],
x - Camera.pos.x,
y - Camera.pos.y,
rotate,
sx,
sy
)
end
function DrawAnimation(animation, x, y, rotate, sx, sy)
local x = x or 0
local y = y or 0
local sx = sx or 1
local sy = sy or 1
if game_paused ~= true then
-- try to animate
animation.subframe = animation.subframe + current_dt
if animation.subframe >= animation.speed then
animation.frame = animation.frame + 1
animation.subframe = animation.subframe - animation.speed
end
-- cycle
if animation.frame >= animation.frames+1 then
animation.frame = animation.frame - animation.frames
end
end
love.graphics.draw(
animation.imgs[animation.frame],
x - Camera.pos.x,
y - Camera.pos.y,
rotate,
sx,
sy
)
end
function Entity:Animate()
if game_paused ~= true then
-- try to animate
self.anim.subframe = self.anim.subframe + current_dt
if self.anim.subframe >= self.anim.speed then
self.anim.frame = self.anim.frame + 1
self.anim.subframe = self.anim.subframe - self.anim.speed
end
-- cycle
if self.anim.frame >= self.anim.frames+1 then
self.anim.frame = self.anim.frame - self.anim.frames
end
-- change
self.sprite = self.anim.imgs[self.anim.frame]
end
end
function Entity:LoadAnimation(anim,frames,speed)
if self.anim.path ~= anim and self.anim.path ~= anim.path then
if frames ~= nil and speed ~= nil then
self.anim.path = anim or nil
self.anim.frames = frames or 4
self.anim.speed = speed or frames
else
self.anim.path = anim.path
self.anim.frames = anim.frames
self.anim.speed = anim.speed
end
self.anim.imgs = anim.imgs
end
end
require "data/scripts/entities/kupo"
require "data/scripts/entities/arrow"
require "data/scripts/entities/player"
Entity = {
}
function Entity:New(x,y)
o = {}
o.pos = {x = x, y = y}
o.vel = {x = 0, y = 0}
o.class = "Entity"
o.anim = {}
o.anim.subframe = 0
o.anim.frame = 1
o.anim.imgs = {}
o.animations = {}
o.sprite_offset = {x = 0, y = 0}
o.sprite_scale = {x = 1, y = 1}
o.sprite_rotation = math.rad(0)
o.sprite_flip = { x = 1, y = 1}
setmetatable(o, self)
self.__index = self
return o
end
function Entity:Move(target, speed) -- target = {tx int, ty int} / speed = int
end
function Entity:Draw()
if self.sprite ~= nil then
local relative_position_x = self.pos.x - Camera.pos.x
local relative_position_y = self.pos.y - Camera.pos.y
local origin_compensation_x = - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation))
local origin_compensation_y = - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation))
local dimensions_x = self.sprite_scale.x * self.sprite_flip.x
local dimensions_y = self.sprite_scale.y * self.sprite_flip.y
love.graphics.draw(
self.sprite,
relative_position_x + origin_compensation_x * dimensions_x,
relative_position_y + origin_compensation_y * dimensions_y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
if debug_collision then
love.graphics.setColor(1, 0, 0)
love.graphics.circle( "line", relative_position_x, relative_position_y, 2 )
love.graphics.setColor(0, 1 ,0)
love.graphics.circle( "line",
relative_position_x + origin_compensation_x * dimensions_x,
relative_position_y + origin_compensation_y * dimensions_y,
2
)
end
love.graphics.setColor(1, 1 ,1)
end
end
function Entity:NewAnimation(anim,frames,speed)
local anim_data = {
frame = 1,
subframe = 1,
path = anim.path,
frames = anim.frames,
speed = anim.speed,
imgs = anim.imgs
}
self.animations[#self.animations+1] = anim_data
return self.animations[#self.animations]
end
function DrawAnimationFrame(animation, frame, x, y, rotate, sx, sy)
local x = x or 0
local y = y or 0
local sx = sx or 1
local sy = sy or 1
love.graphics.draw(
animation.imgs[frame],
x - Camera.pos.x,
y - Camera.pos.y,
rotate,
sx,
sy
)
end
function DrawAnimation(animation, x, y, rotate, sx, sy)
local x = x or 0
local y = y or 0
local sx = sx or 1
local sy = sy or 1
if game_paused ~= true then
-- try to animate
animation.subframe = animation.subframe + current_dt
if animation.subframe >= animation.speed then
animation.frame = animation.frame + 1
animation.subframe = animation.subframe - animation.speed
end
-- cycle
if animation.frame >= animation.frames+1 then
animation.frame = animation.frame - animation.frames
end
end
love.graphics.draw(
animation.imgs[animation.frame],
x - Camera.pos.x,
y - Camera.pos.y,
rotate,
sx,
sy
)
end
function Entity:Animate()
if game_paused ~= true then
-- try to animate
self.anim.subframe = self.anim.subframe + current_dt
if self.anim.subframe >= self.anim.speed then
self.anim.frame = self.anim.frame + 1
self.anim.subframe = self.anim.subframe - self.anim.speed
end
-- cycle
if self.anim.frame >= self.anim.frames+1 then
self.anim.frame = self.anim.frame - self.anim.frames
end
-- change
self.sprite = self.anim.imgs[self.anim.frame]
end
end
function Entity:LoadAnimation(anim,frames,speed)
if self.anim.path ~= anim and self.anim.path ~= anim.path then
if frames ~= nil and speed ~= nil then
self.anim.path = anim or nil
self.anim.frames = frames or 4
self.anim.speed = speed or frames
else
self.anim.path = anim.path
self.anim.frames = anim.frames
self.anim.speed = anim.speed
end
self.anim.imgs = anim.imgs
end
end
require "data/scripts/entities/kupo"
require "data/scripts/entities/arrow"
require "data/scripts/entities/player"

65
data/scripts/lights.lua Normal file
View File

@@ -0,0 +1,65 @@
Lights = {}
LightTimer = 0
function CreateDarkness()
return love.graphics.newCanvas(game.width/2, game.height/2)
end
function CreateLight(x,y,range)
local o = {}
o.pos = {
x = x,
y = y
}
o.range = range
o.flicker = 0
table.insert(Lights,o)
return o
end
function DoDarkness()
love.graphics.setColor(0,0,0)
love.graphics.rectangle("fill",0,0,game.width,game.height)
end
function DoLights()
LightTimer = LightTimer + 1
if LightTimer >= 3 then
LightTimer = LightTimer - 3
for _, light in pairs(Lights) do
light.flicker = math.random(-1,1)
end
end
love.graphics.setBlendMode("replace")
-- first, border
love.graphics.setColor(1,1,1)
for _, light in pairs(Lights) do
love.graphics.circle(
"fill",
light.pos.x - Camera.pos.x,
light.pos.y - Camera.pos.y,
light.range + light.flicker + 1
)
end
love.graphics.setColor(0,0,0,0)
-- then, light
for _, light in pairs(Lights) do
love.graphics.circle(
"fill",
light.pos.x - Camera.pos.x,
light.pos.y - Camera.pos.y,
light.range + light.flicker
)
end
love.graphics.setBlendMode("alpha")
end
function DoBorder()
end
function DrawDarkness()
love.graphics.draw(Canvas.Darkness, 0, 0, 0, 1, 1)
end

View File

@@ -1,332 +1,332 @@
return {
{
id = 1,
type = "whole",
depth = "foreground"
},
{
id = 2,
type = "whole",
depth = "foreground"
},
{
id = 3,
type = "whole",
depth = "foreground"
},
{
id = 4,
type = "whole",
depth = "foreground"
},
{
id = 5,
type = "whole",
depth = "foreground"
},
{
id = 6,
type = "whole",
depth = "foreground"
},
{
id = 7,
type = "whole",
depth = "foreground"
},
{
id = 8,
type = "whole",
depth = "foreground"
},
{
id = 9,
type = "whole",
depth = "foreground"
},
{
id = 10,
type = "half_bottom",
depth = "foreground"
},
{
id = 11,
type = "half_bottom",
depth = "foreground"
},
{
id = 12,
type = "whole",
depth = "foreground"
},
{
id = 13,
type = "whole",
depth = "foreground"
},
{
id = 14,
type = "whole",
depth = "foreground"
},
{
id = 15,
type = "half_right",
depth = "foreground"
},
{
id = 16,
type = "half_left",
depth = "foreground"
},
{
id = 17,
type = "half_bottom",
depth = "foreground"
},
{
id = 18,
type = "half_top",
depth = "foreground"
},
{
id = 19,
type = "whole",
depth = "foreground"
},
{
id = 20,
type = "whole",
depth = "foreground"
},
{
id = 21,
type = "whole",
depth = "foreground"
},
{
id = 22,
type = "whole",
depth = "foreground"
},
{
id = 23,
type = "half_top",
depth = "foreground"
},
{
id = 24,
type = "half_top",
depth = "foreground"
},
{
id = 25,
type = "whole",
depth = "foreground"
},
{
id = 26,
type = "whole",
depth = "foreground"
},
{
id = 27,
type = "ramp2_bot_right_half",
depth = "foreground"
},
{
id = 28,
type = "ramp2_bot_right_whole",
depth = "foreground"
},
{
id = 29,
type = "whole",
depth = "foreground"
},
{
id = 30,
type = "whole",
depth = "foreground"
},
{
id = 31,
type = "ramp2_bot_left_whole",
depth = "foreground"
},
{
id = 32,
type = "ramp2_bot_left_half",
depth = "foreground"
},
{
id = 33,
type = "empty",
depth = "foreground"
},
{
id = 34,
type = "empty",
depth = "foreground"
},
{
id = 35,
type = "empty",
depth = "foreground"
},
{
id = 36,
type = "empty",
depth = "foreground"
},
{
id = 37,
type = "empty",
depth = "foreground"
},
{
id = 38,
type = "empty",
depth = "foreground"
},
{
id = 39,
type = "whole",
depth = "foreground"
},
{
id = 40,
type = "empty",
depth = "foreground"
},
{
id = 41,
type = "empty",
depth = "foreground"
},
{
id = 42,
type = "empty",
depth = "foreground"
},
{
id = 43,
type = "empty",
depth = "foreground"
},
{
id = 44,
type = "empty",
depth = "foreground"
},
{
id = 45,
type = "empty",
depth = "foreground"
},
{
id = 46,
type = "empty",
depth = "foreground"
},
{
id = 47,
type = "empty",
depth = "foreground"
},
{
id = 48,
type = "empty",
depth = "foreground"
},
{
id = 49,
type = "whole",
depth = "foreground"
},
{
id = 50,
type = "whole",
depth = "foreground"
},
{
id = 51,
type = "whole",
depth = "foreground"
},
{
id = 52,
type = "whole",
depth = "foreground"
},
{
id = 53,
type = "empty",
depth = "foreground"
},
{
id = 54,
type = "empty",
depth = "foreground"
},
{
id = 55,
type = "empty",
depth = "foreground"
},
{
id = 56,
type = "empty",
depth = "foreground"
},
{
id = 57,
type = "empty",
depth = "foreground"
},
{
id = 58,
type = "empty",
depth = "foreground"
},
{
id = 59,
type = "empty",
depth = "foreground"
},
{
id = 60,
type = "empty",
depth = "foreground"
},
{
id = 61,
type = "empty",
depth = "foreground"
},
{
id = 62,
type = "empty",
depth = "foreground"
},
{
id = 63,
type = "empty",
depth = "foreground"
},
{
id = 64,
type = "empty",
depth = "foreground"
},
{
id = 65,
type = "whole",
depth = "foreground"
},
{
id = 119,
type = "whole",
depth = "foreground"
}
}
return {
{
id = 1,
type = "whole",
depth = "foreground"
},
{
id = 2,
type = "whole",
depth = "foreground"
},
{
id = 3,
type = "whole",
depth = "foreground"
},
{
id = 4,
type = "whole",
depth = "foreground"
},
{
id = 5,
type = "whole",
depth = "foreground"
},
{
id = 6,
type = "whole",
depth = "foreground"
},
{
id = 7,
type = "whole",
depth = "foreground"
},
{
id = 8,
type = "whole",
depth = "foreground"
},
{
id = 9,
type = "whole",
depth = "foreground"
},
{
id = 10,
type = "half_bottom",
depth = "foreground"
},
{
id = 11,
type = "half_bottom",
depth = "foreground"
},
{
id = 12,
type = "whole",
depth = "foreground"
},
{
id = 13,
type = "whole",
depth = "foreground"
},
{
id = 14,
type = "whole",
depth = "foreground"
},
{
id = 15,
type = "half_right",
depth = "foreground"
},
{
id = 16,
type = "half_left",
depth = "foreground"
},
{
id = 17,
type = "half_bottom",
depth = "foreground"
},
{
id = 18,
type = "half_top",
depth = "foreground"
},
{
id = 19,
type = "whole",
depth = "foreground"
},
{
id = 20,
type = "whole",
depth = "foreground"
},
{
id = 21,
type = "whole",
depth = "foreground"
},
{
id = 22,
type = "whole",
depth = "foreground"
},
{
id = 23,
type = "half_top",
depth = "foreground"
},
{
id = 24,
type = "half_top",
depth = "foreground"
},
{
id = 25,
type = "whole",
depth = "foreground"
},
{
id = 26,
type = "whole",
depth = "foreground"
},
{
id = 27,
type = "ramp2_bot_right_half",
depth = "foreground"
},
{
id = 28,
type = "ramp2_bot_right_whole",
depth = "foreground"
},
{
id = 29,
type = "whole",
depth = "foreground"
},
{
id = 30,
type = "whole",
depth = "foreground"
},
{
id = 31,
type = "ramp2_bot_left_whole",
depth = "foreground"
},
{
id = 32,
type = "ramp2_bot_left_half",
depth = "foreground"
},
{
id = 33,
type = "empty",
depth = "foreground"
},
{
id = 34,
type = "empty",
depth = "foreground"
},
{
id = 35,
type = "empty",
depth = "foreground"
},
{
id = 36,
type = "empty",
depth = "foreground"
},
{
id = 37,
type = "empty",
depth = "foreground"
},
{
id = 38,
type = "empty",
depth = "foreground"
},
{
id = 39,
type = "whole",
depth = "foreground"
},
{
id = 40,
type = "empty",
depth = "foreground"
},
{
id = 41,
type = "empty",
depth = "foreground"
},
{
id = 42,
type = "empty",
depth = "foreground"
},
{
id = 43,
type = "empty",
depth = "foreground"
},
{
id = 44,
type = "empty",
depth = "foreground"
},
{
id = 45,
type = "empty",
depth = "foreground"
},
{
id = 46,
type = "empty",
depth = "foreground"
},
{
id = 47,
type = "empty",
depth = "foreground"
},
{
id = 48,
type = "empty",
depth = "foreground"
},
{
id = 49,
type = "whole",
depth = "foreground"
},
{
id = 50,
type = "whole",
depth = "foreground"
},
{
id = 51,
type = "whole",
depth = "foreground"
},
{
id = 52,
type = "whole",
depth = "foreground"
},
{
id = 53,
type = "empty",
depth = "foreground"
},
{
id = 54,
type = "empty",
depth = "foreground"
},
{
id = 55,
type = "empty",
depth = "foreground"
},
{
id = 56,
type = "empty",
depth = "foreground"
},
{
id = 57,
type = "empty",
depth = "foreground"
},
{
id = 58,
type = "empty",
depth = "foreground"
},
{
id = 59,
type = "empty",
depth = "foreground"
},
{
id = 60,
type = "empty",
depth = "foreground"
},
{
id = 61,
type = "empty",
depth = "foreground"
},
{
id = 62,
type = "empty",
depth = "foreground"
},
{
id = 63,
type = "empty",
depth = "foreground"
},
{
id = 64,
type = "empty",
depth = "foreground"
},
{
id = 65,
type = "whole",
depth = "foreground"
},
{
id = 119,
type = "whole",
depth = "foreground"
}
}