Files
paku/data/sprites.lua
Raimon Zamora cf103dd02c - [NEW] (EDITOR) selector de items
- [WIP] borrat i creació de items segons s'eix o entra de les habitacions
- [FIX] Items indexats per número, per a poder-se guardar en un mapa
- [NEW] room.current()
- [NEW] resaltat del item seleccionat
2025-11-13 12:08:43 +01:00

347 lines
14 KiB
Lua

require "animations"
require "templates"
sprites = {
hero = nil,
list = {},
pause_ia = false,
remove = function(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,
remove_out_of_room = function()
for i,v in ipairs(sprites.list) do
if v.room ~= rooms.current() then
table.remove(sprites.list, i)
print("Sprite removed: "..v.type)
end
end
end,
add_from_room = function()
end,
init = function()
sprites.hero = {
type = "hero",
pos = { x=28, y=4*12*8+71 },
size= { w=16, h=17 },
bbo = { left=3, top=2, right=3, bottom=0 },
current_frame = 1,
current_wait = 1,
flipped = false,
animation = "hero_stand",
ia = sprites.update_hero,
jumping = 0,
stairs = false
}
table.insert(sprites.list, templates.create("mummy", {pos={x=100, y=4*12*8+71},flipped=true}))
--local mummy = {
-- pos = { x=100, y=4*12*8+71 },
-- size = { w=16,h=17 },
-- bbo = { left=3, top=2, right=3, bottom=0 },
-- current_frame = 1,
-- current_wait = 1,
-- flipped = true,
-- animation = "mummy_walk",
-- ia = sprites.update_mummy
--}
--table.insert(sprites.list, mummy)
end,
set_animation=function(sprite, animation)
if sprite.animation ~= animation then
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,
check_sprite_collision = function()
return false
end,
check_tile_collision = function()
end,
update = function()
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,
update_sprite = function(sprite)
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
sprite.current_frame = 1
end
local cycle = animations[sprite.animation].cycle[sprite.current_frame]
sprite.current_wait = animations[sprite.animation].frames[cycle].wait
end
end,
update_mummy = function(spr)
if spr.state == templates.ALIVE then
if spr.flipped then
local tx, ty = (spr.pos.x+3)>>3, (spr.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then
spr.pos.x = spr.pos.x - 1
else
spr.flipped = not spr.flipped
end
else
local tx, ty = (spr.pos.x+12)>>3, (spr.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then
spr.pos.x = spr.pos.x + 1
else
spr.flipped = not spr.flipped
end
end
elseif spr.state == templates.DYING then
if spr.animation ~= "mummy_dying" then
sprites.set_animation(spr, "mummy_dying")
else
if spr.current_frame == 8 then
sprites.set_animation(spr, "mummy_dead")
spr.state = templates.DEAD
end
end
elseif spr.state == templates.DEAD then
if spr.current_wait == 1 then
sprites.set_animation(spr, "mummy_undying")
spr.state = templates.RESURRECTING
end
elseif spr.state == templates.RESURRECTING then
if spr.current_frame == 13 then
sprites.set_animation(spr, "mummy_walk")
spr.state = templates.ALIVE
end
end
end,
update_bullet = function(spr)
local tx, ty = (spr.pos.x+2)>>3, (spr.pos.y+1)>>3
if rooms.is_outside(tx,ty) then sprites.remove(spr) return end
local x1,y1,w1,h1 = util.aabb(spr)
for i,v in ipairs(sprites.list) do
if v.enemy and v.state ~= templates.DEAD then
local x2,y2,w2,h2 = util.aabb(v)
if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then
if v.state == templates.ALIVE then v.state = templates.DYING end
sprites.remove(spr)
return
end
end
end
if map.tile(tx,ty) < 16 then
if spr.flipped then
spr.pos.x = spr.pos.x - 8
else
spr.pos.x = spr.pos.x + 8
end
else
sprites.remove(spr)
end
end,
update_hero = function()
-- Update hero
local anim = "hero_stand"
local move_anim = "hero_walk"
if sprites.hero.shooting then
if sprites.hero.current_frame==3 then
sprites.hero.shooting = false
if sprites.hero.flipped then sprites.hero.pos.x=sprites.hero.pos.x+8 end
sprites.set_animation(sprites.hero, "hero_stand")
else
return
end
end
-- SI ESTÀ BOTANT...
if sprites.hero.jumping > 0 then
anim = "hero_jump"
move_anim = "hero_jump"
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
--draw.rect(tx1<<3,ty<<3,8,8,8)
--draw.rect(tx2<<3,ty<<3,8,8,28)
if map.tile(tx1,ty) == 0 and map.tile(tx2,ty) == 0 then
if ty+1<rooms.pos.y then
game.change_room(0,-1)
else
if sprites.hero.jumping > 1 then sprites.hero.pos.y = sprites.hero.pos.y - 1 end
end
end
sprites.hero.jumping = sprites.hero.jumping - 1
else
-- SI NO ESTÀ BOTANT...
-- SI ESTÀ EN UNES ESCALERES...
local txm, ty = (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.y+8)>>3
if (map.tile(txm,ty) > 0 and map.tile(txm,ty) < 16) or (map.tile(txm,ty+1) > 0 and map.tile(txm,ty+1) < 16) then
anim = "hero_stairs_idle"
move_anim = "hero_stairs"
-- SI PULSA AMUNT...
if key.down(key.UP) or pad.down(pad.UP) then
anim = move_anim
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
if map.tile(tx1,ty) < 16 or map.tile(tx2,ty) < 16 then
if ty+1<rooms.pos.y then
game.change_room(0,-1)
else
sprites.hero.pos.y = sprites.hero.pos.y - 1
end
end
-- SI PULSA AVALL...
elseif key.down(key.DOWN) or pad.down(pad.DOWN) then
anim = move_anim
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
if ty+2>rooms.pos.y+11 then
game.change_room(0,1)
else
sprites.hero.pos.y = sprites.hero.pos.y + 1
end
end
end
else
-- SI NO ESTÀ EN UNES ESCALERES...
local tx1, txm, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
--draw.rect(tx1<<3, (ty+2)<<3,8,8,8)
--draw.rect(tx2<<3, (ty+2)<<3,8,8,28)
-- SI ESTÀ CAIGUENT...
if map.tile(tx1,ty+2) == 0 and map.tile(tx2,ty+2) == 0 then
if ty+2>rooms.pos.y+11 then
game.change_room(0,1)
else
sprites.hero.pos.y = sprites.hero.pos.y + 2
end
else
-- SI NO ESTÀ CAIGUENT...
sprites.hero.pos.y = (ty<<3)-1
anim = "hero_stand"
-- SI ESTÀ SOBRE UNES ESCALERES I POLSA AVALL...
if (map.tile(txm,ty+2) < 16 and map.tile(txm,ty+2) > 0) then
if key.down(key.DOWN) or pad.down(pad.DOWN) then
anim = "hero_stairs"
--local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
--if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
sprites.hero.pos.x = (txm << 3)-4
sprites.hero.pos.y = sprites.hero.pos.y + 1
--end
end
end
-- SI POLSA BOTAR...
if key.down(key.Z) or pad.down(pad.A) then
sprites.hero.jumping = 17
-- SI POLSA DISPAR...
elseif key.down(key.X) or pad.down(pad.B) then
sprites.hero.shooting = true
local x = sprites.hero.flipped and sprites.hero.pos.x+8 or sprites.hero.pos.x-8
local bullet = templates.create("bullet", {pos={x=sprites.hero.pos.x, y=sprites.hero.pos.y+8}, flipped=sprites.hero.flipped})
table.insert(sprites.list, bullet)
if sprites.hero.flipped then sprites.hero.pos.x=sprites.hero.pos.x-8 end
anim = "hero_shoot"
end
end
end
end
-- ESTIGA COM ESTIGA, SI POLSA ESQUERRA O DRETA...
if not sprites.hero.shooting then
if key.down(key.LEFT) or pad.down(pad.LEFT) then
sprites.hero.flipped = true
anim = move_anim
local tx, ty = (sprites.hero.pos.x+3)>>3, (sprites.hero.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
if tx<rooms.pos.x then
game.change_room(-1,0)
else
sprites.hero.pos.x = sprites.hero.pos.x - 1
end
end
elseif key.down(key.RIGHT) or pad.down(pad.RIGHT) then
sprites.hero.flipped = false
anim = move_anim
local tx, ty = (sprites.hero.pos.x+12)>>3, (sprites.hero.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
if tx>rooms.pos.x+19 then
game.change_room(1,0)
else
sprites.hero.pos.x = sprites.hero.pos.x + 1
end
end
end
end
sprites.set_animation(sprites.hero, anim)
end,
draw = function(ignore_selected)
local mx,my = mouse.pos()
surf.source(surf_sprites)
if editor.item_selected or 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
sprites.draw_sprite_selected(v)
else
sprites.draw_sprite(v)
end
end
sprites.draw_sprite(sprites.hero)
end,
draw_sprite = function(sprite)
local cycle = animations[sprite.animation].cycle[sprite.current_frame]
local frame = animations[sprite.animation].frames[cycle]
if not frame then
print(sprite.current_frame)
end
local reversed = frame.reversed or false
draw.surf(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h, sprite.pos.x, sprite.pos.y, frame.frame.w, frame.frame.h, (not reversed) ~= (not sprite.flipped))
local x,y,w,h = util.aabb(sprite)
--draw.rect(x,y,w,h,8)
end,
draw_sprite_selected = function(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)
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.surf(sx, sy, w, h, x, y, w, h, f)
end
}