require "batarang" batman = { states = {IDLE=1, WALK=2, JUMP=3, FALL=4, STAIRS=5, GRAPPLING=6, PROPELLED=7, SHOOT=8}, 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 if batman.state == batman.states.SHOOT then if batman.frame == 3 then batarang.new(batman.x+8, batman.y+8, batman.flip) elseif batman.frame == 5 then batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end 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 elseif key.down(key.Z) then --if batarang.cooldown==0 then batman.state = batman.states.SHOOT batman.frames = {5,6,7,7,7} 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 elseif key.down(key.Z) then --if batarang.cooldown==0 then batman.state = batman.states.SHOOT batman.frames = {5,6,7,7,7} batman.frame = 1 -- end 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, }