223 lines
7.1 KiB
Lua
223 lines
7.1 KiB
Lua
require "animations"
|
|
require "templates"
|
|
|
|
sprites = {
|
|
hero = nil,
|
|
list = {},
|
|
pause_ia = false,
|
|
}
|
|
|
|
function sprites.remove(sprite)
|
|
for i,v in ipairs(sprites.list) do
|
|
if v == sprite then
|
|
table.remove(sprites.list, i)
|
|
print("Sprite removed: "..sprite.type)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function sprites.remove_out_of_room()
|
|
--print("Current room: "..rooms.current())
|
|
--for i,v in ipairs(sprites.list) do
|
|
-- if v.room ~= rooms.current() then
|
|
-- table.remove(sprites.list, i)
|
|
-- local room = v.room or 0
|
|
-- print("Sprite at room "..room.." removed: "..v.type)
|
|
-- end
|
|
--end
|
|
end
|
|
|
|
function sprites.add_from_room(rx,ry)
|
|
sprites.list = {}
|
|
map.surf(rooms.surf_items)
|
|
for y = ry, ry+11 do
|
|
for x = rx, rx+19 do
|
|
if map.tile(x,y) ~= 0 then
|
|
local room = (rx//20) + (ry//12) * 8
|
|
local item = map.tile(x,y)
|
|
local flip = item > 0x7f
|
|
item = item & 0x7f
|
|
io.write("crear "..items[item].name.." en hab "..room.." ("..x..","..y..")...\n")
|
|
table.insert(sprites.list, templates.create(items[item].name, {pos={x=x*8, y=y*8},flipped=flip, room=room}))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function sprites.init()
|
|
sprites.hero = {
|
|
type = "hero",
|
|
pos = { x=28, y=4*13*8+79 },
|
|
size= { w=16, h=17 },
|
|
bbo = { left=3, top=2, right=3, bottom=0 },
|
|
current_frame = 1,
|
|
current_wait = 1,
|
|
flipped = false,
|
|
surf = surf.load("gfx/morcus.gif"),
|
|
animation = "hero_stand",
|
|
ia = ia.update_hero,
|
|
state = templates.ALIVE,
|
|
jumping = 0,
|
|
light = 100,
|
|
light_ox = 8,
|
|
light_oy = 8,
|
|
cooldown = 0,
|
|
jump_throttle = 0,
|
|
lives = 4,
|
|
keys = {},
|
|
stairs = false,
|
|
hit = ia.hero_hit,
|
|
give_key = ia.hero_give_key
|
|
}
|
|
end
|
|
|
|
function sprites.set_animation(sprite, animation)
|
|
if sprite.animation ~= animation then
|
|
sprite.animation_finished = nil
|
|
sprite.animation = animation
|
|
sprite.current_frame = 1
|
|
local cycle = animations[sprite.animation].cycle[1]
|
|
sprite.current_wait = animations[sprite.animation].frames[cycle].wait
|
|
end
|
|
end
|
|
|
|
function sprites.update()
|
|
if not sys.beat() then return end
|
|
|
|
sprites.update_sprite(sprites.hero)
|
|
for i,v in ipairs(sprites.list) do
|
|
sprites.update_sprite(v)
|
|
end
|
|
if not sprites.pause_ia then
|
|
sprites.hero.ia()
|
|
for i,v in ipairs(sprites.list) do
|
|
v.ia(v)
|
|
end
|
|
end
|
|
end
|
|
|
|
function sprites.update_sprite(sprite)
|
|
if sprite.animation_finished then return end
|
|
|
|
sprite.current_wait = sprite.current_wait - 1
|
|
if sprite.current_wait == 0 then
|
|
if sprite.current_frame < #animations[sprite.animation].cycle then
|
|
sprite.current_frame = sprite.current_frame + 1
|
|
else
|
|
if animations[sprite.animation].loop then
|
|
sprite.current_frame = 1
|
|
else
|
|
sprite.animation_finished = true
|
|
end
|
|
end
|
|
local cycle = animations[sprite.animation].cycle[sprite.current_frame]
|
|
sprite.current_wait = animations[sprite.animation].frames[cycle].wait
|
|
end
|
|
end
|
|
|
|
function sprites.lights_out()
|
|
for i,spr in ipairs(sprites.list) do
|
|
if spr.light then
|
|
tweening.add(spr.light,0,0.5,easing.linear,
|
|
function(value,n,finished)
|
|
spr.light = value
|
|
if finished then
|
|
spr.light = nil
|
|
end
|
|
end
|
|
)
|
|
end
|
|
end
|
|
tweening.add(sprites.hero.light,0,0.5,easing.linear,
|
|
function(value,n,finished)
|
|
sprites.hero.light = value
|
|
if finished then
|
|
sprites.hero.light = nil
|
|
end
|
|
end
|
|
)
|
|
end
|
|
|
|
function sprites.draw(ignore_selected)
|
|
if app.update ~= editor.update then
|
|
surf.target(game.circ_buf)
|
|
surf.cls()
|
|
surf.target(game.back_buf)
|
|
end
|
|
|
|
editor.item_hovered = nil
|
|
local mx,my = mouse.pos()
|
|
if (app.update == editor.update) and (editor.layer~=LAYER_ITEMS) then ignore_selected = true end
|
|
for i,v in ipairs(sprites.list) do
|
|
if not ignore_selected and app.update == editor.update and mx>=v.pos.x and mx<=v.pos.x+v.size.w and my>=v.pos.y and my<=v.pos.y+v.size.h then
|
|
editor.item_hovered = i
|
|
if editor.item_dragged == editor.item_hovered then
|
|
draw.mode(draw.PATTERN)
|
|
draw.pattern(editor.ants)
|
|
end
|
|
sprites.draw_sprite_selected(v)
|
|
draw.mode(draw.NORMAL)
|
|
else
|
|
if (not ignore_selected) or (not v.no_shadow) or (app.update ~= game.update) then
|
|
sprites.draw_sprite(v)
|
|
end
|
|
end
|
|
end
|
|
sprites.draw_sprite(sprites.hero)
|
|
end
|
|
|
|
function sprites.draw_sprite(sprite)
|
|
local cycle = animations[sprite.animation].cycle[sprite.current_frame]
|
|
local frame = animations[sprite.animation].frames[cycle]
|
|
local ox, oy = 0, 0
|
|
if frame.offset then
|
|
if sprite.flipped then
|
|
if frame.offset.flipped then ox,oy = frame.offset.flipped.x,frame.offset.flipped.y end
|
|
else
|
|
if frame.offset.normal then ox,oy = frame.offset.normal.x,frame.offset.normal.y end
|
|
end
|
|
end
|
|
|
|
if not frame then
|
|
print(sprite.current_frame)
|
|
end
|
|
local reversed = frame.reversed or false
|
|
if not sprite.invisible then
|
|
surf.source(sprite.surf)
|
|
if sprite.pattern then draw.pattern(sprite.pattern) end
|
|
if sprite.mode then draw.mode(sprite.mode) end
|
|
draw.surf(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h, sprite.pos.x+ox, sprite.pos.y+oy, frame.frame.w, frame.frame.h, (not reversed) ~= (not sprite.flipped))
|
|
draw.pattern(0xffff)
|
|
draw.mode(draw.NORMAL)
|
|
end
|
|
if cheats.showaabb then
|
|
local x,y,w,h = util.aabb(sprite)
|
|
draw.rect(x,y,w,h,8)
|
|
end
|
|
if (app.update ~= editor.update) and (sprite.light) then
|
|
game.draw_light(sprite.pos.x+sprite.light_ox, sprite.pos.y+sprite.light_oy,sprite.light)
|
|
end
|
|
end
|
|
|
|
function sprites.draw_sprite_selected(sprite)
|
|
pal.subpal(0,32,28)
|
|
|
|
local cycle = animations[sprite.animation].cycle[sprite.current_frame]
|
|
local frame = animations[sprite.animation].frames[cycle]
|
|
local reversed = frame.reversed or false
|
|
local x, y, w, h, sx, sy, f = sprite.pos.x, sprite.pos.y, frame.frame.w, frame.frame.h, frame.frame.x, frame.frame.y, (not reversed) ~= (not sprite.flipped)
|
|
surf.source(sprite.surf)
|
|
draw.surf(sx, sy, w, h, x-1, y-1, w, h, f)
|
|
draw.surf(sx, sy, w, h, x, y-1, w, h, f)
|
|
draw.surf(sx, sy, w, h, x+1, y-1, w, h, f)
|
|
draw.surf(sx, sy, w, h, x-1, y, w, h, f)
|
|
draw.surf(sx, sy, w, h, x+1, y, w, h, f)
|
|
draw.surf(sx, sy, w, h, x-1, y+1, w, h, f)
|
|
draw.surf(sx, sy, w, h, x, y, w, h, f)
|
|
draw.surf(sx, sy, w, h, x+1, y+1, w, h, f)
|
|
pal.subpal()
|
|
draw.mode(draw.NORMAL)
|
|
draw.surf(sx, sy, w, h, x, y, w, h, f)
|
|
end
|