Files
tramussos/data/batman.lua
2025-11-07 14:54:17 +01:00

243 lines
9.3 KiB
Lua

batman = {
states = {IDLE=1, WALK=2, JUMP=3, FALL=4, STAIRS=5, GRAPPLING=6, PROPELLED=7},
x = 7*8,
y = 14*8,
surface = nil,
flip = false,
frames = {0},
frame = 1,
state = 1,
jump_counter = 0,
ignore_first_tile = 0,
layer = 1,
grappling_length = 0,
init = function()
batman.surface = surf.load("batman.gif")
batman.frames = {0,1,2,3}
end,
draw = function()
surf.source(batman.surface)
local f = batman.frames[batman.frame]
draw.surf((f%8)*16,(f//8)*16,16,16,batman.x,batman.y,16,16,batman.flip)
if batman.grappling_length>0 then
draw.rect(batman.x+3, batman.y+7-batman.grappling_length*4, 1, batman.grappling_length*4, 64)
draw.rect(batman.x+2, batman.y+7-batman.grappling_length*4, 3, batman.grappling_length*4, 66)
end
--local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8)
--draw.rect((tx1)*8,ty*8,8,8, 4)
--draw.rect((tx2)*8,ty*8,8,8, 4)
end,
update = function()
batman.frame = batman.frame + 1
if batman.frame > #batman.frames then batman.frame = 1 end
-- Si està IDLE
if batman.state == batman.states.IDLE then
-- Mirem si comença a caminar
if key.down(key.RIGHT) then
batman.state = batman.states.WALK
batman.frames = {0,1,2,3}
batman.frame = 1
elseif key.down(key.LEFT) then
batman.state = batman.states.WALK
batman.frames = {0,1,2,3}
batman.frame = 1
elseif key.down(key.DOWN) then
local tx, ty = ((batman.x+4)//8), ((batman.y+8)//8)
if (mapa.isStairs(tx,ty)) then
batman.state = batman.states.STAIRS
batman.frames = {10}
batman.frame = 1
batman.x = ((batman.x+4)//8)*8
if (mapa.isStairs(tx-1,ty)) then
batman.x = batman.x - 8
end
elseif key.down(key.X) then
local tx, ty = ((batman.x+4)//8), ((batman.y+24)//8)
if (not mapa.isSolid(tx,ty)) then
batman.state = batman.states.FALL
batman.ignore_first_tile = 4
batman.layer = 2
end
end
elseif key.down(key.UP) then
local tx, ty = ((batman.x+4)//8), ((batman.y)//8)
if (mapa.isStairs(tx,ty)) then
batman.state = batman.states.STAIRS
batman.frames = {10}
batman.frame = 1
batman.x = ((batman.x+4)//8)*8
if (mapa.isStairs(tx-1,ty)) then
batman.x = batman.x - 8
end
elseif key.down(key.Z) then
batman.state = batman.states.GRAPPLING
batman.frames = {6}
batman.frame = 1
end
end
-- Mirem si ha de caure
local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8)
if (not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty)) then
batman.state = batman.states.FALL
end
-- Mirem si comença a botar
if (batman.state ~= batman.states.FALL) and (key.down(key.X)) then
batman.state = batman.states.JUMP
batman.jump_counter = 0
end
end
if batman.state == batman.states.WALK then
-- Mirem si comença a caminar
if key.down(key.RIGHT) then
batman.state = batman.states.WALK
batman.flip=false
local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8)
if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end
elseif key.down(key.LEFT) then
batman.state = batman.states.WALK
batman.flip=true
local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8)
if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end
else
-- Ha parat de caminar
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
end
-- Mirem si ha de caure
local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8)
if (not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty)) then
batman.state = batman.states.FALL
end
-- Mirem si comença a botar
if key.down(key.X) then
batman.state = batman.states.JUMP
batman.jump_counter = 0
end
end
if batman.state == batman.states.JUMP then
batman.y = batman.y - 4
batman.jump_counter = batman.jump_counter + 1
if batman.jump_counter == 5 then
batman.jump_counter = 0
batman.state = batman.states.FALL
batman.frames = {4}
batman.frame = 1
end
if key.down(key.RIGHT) then
batman.flip=false
local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8)
if not mapa.isBlock(tx,ty) then batman.x = batman.x + 2 end
elseif key.down(key.LEFT) then
batman.flip=true
local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8)
if not mapa.isBlock(tx,ty) then batman.x = batman.x - 2 end
end
end
if batman.state == batman.states.FALL then
if key.down(key.RIGHT) then
batman.flip=false
local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8)
if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end
elseif key.down(key.LEFT) then
batman.flip=true
local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8)
if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end
end
local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8)
if (batman.ignore_first_tile>0) or ((not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty))) then
if batman.ignore_first_tile>0 then
batman.ignore_first_tile = batman.ignore_first_tile - 1
else
batman.layer = 1
end
batman.state = batman.states.FALL
batman.frames = {4}
batman.frame = 1
batman.y = batman.y + 4
else
batman.y = (batman.y//8)*8
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
end
end
if batman.state == batman.states.STAIRS then
local moving = false
if key.down(key.DOWN) then
moving = true
local tx, ty = ((batman.x+4)//8), ((batman.y+16)//8)
if (mapa.isStairs(tx,ty)) then
if #batman.frames==1 then
batman.frames = {8,10,9,10}
batman.frame = 1
end
batman.y = batman.y + 2;
else
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
end
elseif key.down(key.UP) then
moving = true
local tx, ty = ((batman.x+4)//8), ((batman.y+7)//8)
if (mapa.isStairs(tx,ty)) then
if #batman.frames==1 then
batman.frames = {8,10,9,10}
batman.frame = 1
end
batman.y = batman.y - 2;
else
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
end
elseif key.down(key.X) then
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
end
if not moving then
batman.frames = {10}
batman.frame = 1
end
end
if batman.state == batman.states.GRAPPLING then
batman.grappling_length = batman.grappling_length + 1
local tx, ty = ((batman.x+2)//8), ((batman.y+7-batman.grappling_length*4)//8)
if mapa.isSolid(tx, ty) then
if mapa.isBlock(tx,ty) then
batman.grappling_length = 0
batman.state = batman.states.IDLE
batman.frames = {0}
batman.frame = 1
else
batman.layer = 2
batman.state = batman.states.PROPELLED
end
end
end
if batman.state == batman.states.PROPELLED then
batman.grappling_length = batman.grappling_length - 1
batman.y = batman.y - 4
if batman.grappling_length == 0 then
batman.state = batman.states.JUMP
batman.jump_counter = 0
end
end
end,
}