-- TO DO: Afegir un contador per a saber quan de temps está parat el abad per a traure al Imp -- local arcade_config = require("arcade_config") cw = arcade_config.character_width ch = arcade_config.character_height require "dead" -- abad={ x=40, y=24, -- flip=false, -- frame=1, -- wait=0, -- respawning=0, -- hab=10, -- vides=3, -- energia=40, -- falling=0, -- step=0, -- mustep=1, -- hurting=0, -- update=nil, -- jumpfwd=false, -- anim={0,1,0,2}, -- bb={x=8,y=0,w=16,h=32}, -- safe={hab=10,x=40,y=24} } abad={} function abad_nop() end function abad_init() abad={ x=40, y=24, flip=false, frame=1, wait=0, respawning=0, hab=10, vides=3, energia=40, falling=0, step=0, mustep=1, stairs_flip=false, draw=abad.draw, hurting=0, update=nil, jumpfwd=false, step_length=1, vmove_space=1, max_jump_height=24, jump_height=0, jump_in_half_block=0, jump_in_half_block_used = false, max_shoot_cooldown=24, shoot_cooldown=25, anim={0,1,0,2}, bb={x=8,y=0,w=16,h=32}, safe={hab=10,x=40,y=24}, move=abad.move } abad.update=abad_state_normal abad.objects={} end function abad:move( x, y ) self.x = x self.y = y end function abad:draw() local flip = abad.flip if abad.update==abad_state_stairs then flip=abad.stairs_flip -- flip=(((abad.x>>1)+(abad.y>>1))%2)==0 if ((abad.x+abad.y)%12)==0 then abad.stairs_flip=not abad.stairs_flip end local msg = "-- "..abad.x.." "..abad.y if flip then msg = "FLIP"..abad.x.." "..abad.y end msg_print(0,35,msg,true) end if (abad.respawning==0) or (math.floor(abad.respawning/15)%2==0) then local x, y = viewp:screen_coords(self.x, self.y) draw.surf(abad.frame*cw,0,cw,ch,x,y,cw,ch,flip) end if abad.respawning > 0 then abad.respawning=abad.respawning-1 end end function abad_make_safe() if abad.safe.hab~=abad.hab then abad.safe.hab=abad.hab abad.safe.x=abad.x abad.safe.y=abad.y end end function abad_hurt(howmuch) if abad.hurting == 0 and abad.respawning==0 then sound.play(audio_abad_hit) abad.energia=abad.energia-howmuch -- abad.energia=abad.energia if abad.energia<=0 then abad.vides=abad.vides-1 if abad.vides==0 then --final de la partida dead.start() music.play(audio_game_over,0) else music.play(audio_life_lost,0) abad.energia=40 abad.hab=abad.safe.hab abad.x=abad.safe.x abad.y=abad.safe.y abad.hurting=60 abad.update=abad_state_normal abad.bb.y=0 abad.bb.h=16 abad.respawning=240 surf.cls(3) end else surf.cls(3) end end end function abad_do_jump ( jumpfwd ) jumpfwd = jumpfwd or false abad.jump_height = 0 abad.update=abad_state_jumping abad.step=0 abad.jumpfwd=jumpfwd if abad.jump then sound.stop(abad.jump) abad.jump=nil end sound.play(audio_abad_jump) end function abad_shot_cacau () sound.play(audio_abad_shot) abad.update=abad_state_fire abad.wait=0 cacau.init(abad.hab,abad.x+8,abad.y+8,abad.flip) end function abad_jump() local vspace = abad.vmove_space -- Els dos punts de dalt de l'abad local x1_check = abad.x+abad.bb.x local x2_check = abad.x+abad.bb.x+abad.bb.w local y_check = abad.y-vspace -- Comprovar on està pegant local tile1_hit_type= arc_check_tile(x1_check, y_check ) local tile2_hit_type= arc_check_tile(x2_check, y_check) local not_block_tile = tile1_hit_type ~= tiletype.block and tile2_hit_type ~= tiletype.block local switch_tile = tile1_hit_type == tiletype.switch or tile2_hit_type == tiletype.switch -- print("JUMP > "..x1_check..", "..x2_check..", "..y_check) -- print("T1= "..tile1_hit_type.." / T2= "..tile2_hit_type) -- local msg = "BLOCK TILE HITTED" -- if not_block_tile then msg="not block" end -- print(msg) -- Fer l'acció que correspon if not_block_tile then if switch_tile then local xx= x2_check local yy= y_check -- Executar el switch if tile1_hit_type == tiletype.switch then xx= x1_check end switches.start(xx, yy) else abad.y=abad.y-vspace end else local tile1_hit = arc_get_tile(x1_check, y_check ) local tile2_hit = arc_get_tile(x2_check, y_check) local half_block1 = mapa_is_half_block_tile(tile1_hit) local half_block2 = mapa_is_half_block_tile(tile2_hit) local full_block1 = tile1_hit_type == tiletype.block and not half_block1 local full_block2 = tile2_hit_type == tiletype.block and not half_block2 local full_block = full_block1 and full_block2 local half_block = half_block1 or half_block2 -- print("BLOCK TILE") -- msg = tile1_hit.." "..tile2_hit.." >> " -- if half_block1 then msg= msg.."half_block1 " end -- if half_block2 then msg= msg.."half_block2 " end -- if full_block1 then msg= msg.."full_block1 " end -- if full_block2 then msg= msg.."full_block2 " end -- if full_block then msg= msg.."full_block " end -- if half_block then msg= msg.."half_block " end -- if abad.jump_in_half_block_used then msg= msg.."jump_in_half_block_used " end -- print(msg) -- Si ninguno dels tiles tocats es un block complet -- i almenys un dels tiles tocats es mig tile -- permetre continuar en el salt if not full_block and half_block then if abad.jump_in_half_block==0 and not abad.jump_in_half_block_used then abad.jump_in_half_block = arcade_config.tiles_height>>1 end if abad.jump_in_half_block>0 then abad.y=abad.y-vspace abad.jump_in_half_block = abad.jump_in_half_block-1 end end end abad.jump_height = abad.jump_height+1 abad.jump_in_half_block_used = true end function abad_land () -- Els dos punts de baix de l'abad local x1_check = abad.x+abad.bb.x local x2_check = abad.x+abad.bb.x+abad.bb.w local y_check = abad.y+abad.bb.h -- Comprovar on està aterrant local tile1_hit= arc_check_tile(x1_check, y_check ) local tile2_hit= arc_check_tile(x2_check, y_check) local floor_tile = tile1_hit>=tiletype.half or tile2_hit>=tiletype.half -- Encara que siga un tile de piso s'ha de comprovar que -- la y es un múltiple de l'alt dels tiles local over_tile = (y_check & 0xF) == 0 local can_land = floor_tile and over_tile if can_land then abad.jump_in_half_block_used = false abad.jump_height = 0 end return can_land end function abad_advance() local step_length=abad.step_length; --lo que avança l'abad cada pas local limit=tiletype.block if abad.update~=abad_state_walking then limit=tiletype.half end local x_check = abad.x+abad.bb.x+abad.bb.w+step_length if abad.flip then step_length = -step_length x_check = abad.x+abad.bb.x+step_length end local y_check = abad.y+abad.bb.h-4 if arc_check_tile(x_check, y_check) 0 then abad.hurting=abad.hurting-1 return end if abad.falling>0 then if abad.falling>(abad.max_jump_height<<1) then abad_hurt(abad.falling-(abad.max_jump_height>>1)) end abad.falling=0 end abad_make_safe() if key.down(keyRight) or pad.down(btnRight) then abad.update=abad_state_walking abad.flip=false elseif key.down(keyLeft) or pad.down(btnLeft) then abad.update=abad_state_walking abad.flip=true elseif key.down(keyJump) or pad.down(btnJump) then abad_do_jump() elseif key.down(keyDown) or pad.down(btnDown) then abad.update=abad_state_crouch --elseif btn(KEY_Z) then -- abad.respawning=240 elseif key.down(keyShoot) or pad.down(btnShoot) and cacau.hab==-1 then abad_shot_cacau() end end function abad_state_crouch() abad.bb.y=8 abad.bb.h=24 abad.frame=5 abad.wait=0 abad.step=0 abad.jumpfwd=false abad.jump_height=0 if not (key.down(keyDown) or pad.down(btnDown)) then abad.update=abad_state_normal abad.bb.y=0 abad.bb.h=32 end end function abad_state_fire() abad.frame=6 abad.wait=abad.wait+1 if abad.wait==6 then abad.wait=0 abad.update=abad_state_normal end end function abad_state_walking() -- Limitar la velocitat de moviment abad.wait=abad.wait+1 -- representació del moviment if abad.wait==6 then abad.wait=0 abad.step=(abad.step+1)%2 if abad.step==0 then sound.play(audio_abad_step[abad.mustep],32) abad.mustep = abad.mustep + 1 if abad.mustep == 5 then abad.mustep=1 end end abad.frame=abad.anim[abad.step+1] end -- Comprovar dos punts de contacte de l'abad en el piso a vore si cau local x1_check = abad.x+abad.bb.x local x2_check = x1_check+abad.bb.w local y_check = abad.y+abad.bb.h; -- base de l'abad local tile1 = arc_check_tile(x1_check,y_check) local tile2 = arc_check_tile(x2_check,y_check) if tile1==tiletype.void and tile2==tiletype.void then abad.update=abad_state_falling return end abad_advance() -- guardar punt segur abad_make_safe() -- Gestionar accions mentre es camina if key.down(keyJump) or pad.down(btnJump) then abad_do_jump(true); -- jumping forward return elseif key.down(keyDown) or pad.down(btnDown) then abad.update=abad_state_crouch elseif key.down(keyShoot) or pad.down(btnShoot) and cacau.hab==-1 then abad_shot_cacau() end -- "Flipar" a l'Abad if key.down(keyRight) or pad.down(btnRight) then abad.flip=false elseif key.down(keyLeft) or pad.down(btnLeft) then abad.flip=true elseif abad.wait==0 then abad.update=abad_state_normal end end function abad_state_jumping() local step_length = abad.step_length abad.frame=3 abad.wait=abad.wait+1 abad.wait=0 if abad.jump_height=tiletype.half or -- ((abad.x+4)&7~=0 and -- arc_check_tile(abad.x+12,abad.y+16)>=tiletype.half) -- ) then -- abad.update=abad_state_normal -- return -- end -- abad.y=abad.y+2 -- abad.falling=abad.falling+1 -- else -- abad.hab=abad.hab+10 -- -- imp.reset() -- abad.y=0 -- end end if abad_land() then abad.update=abad_state_normal return end abad.y=abad.y+1 abad.jump_height = abad.jump_height-1 abad.falling=abad.falling+1 if abad.jumpfwd then abad_advance() end end function abad_state_stairs() abad.frame=4 abad.wait=abad.wait+1 if key.down(keyRight) or pad.down(btnRight) then abad.flip=false abad_advance() if abad.wait==6 then sound.play(audio_low) end elseif key.down(keyLeft) or pad.down(btnLeft) then abad.flip=true abad_advance() if abad.wait==6 then sound.play(audio_low) end elseif key.down(keyUp) or pad.down(btnUp) then if arc_check_tile(abad.x+4,abad.y+8)==tiletype.stair and arc_check_tile(abad.x+12,abad.y+8)==tiletype.stair then abad.y=abad.y-1 if abad.wait==6 then sound.play(audio_low) end end elseif key.down(keyDown) or pad.down(btnDown) then if arc_check_tile(abad.x+4,abad.y+abad.bb.h)==tiletype.stair and arc_check_tile(abad.x+12,abad.y+abad.bb.h)==tiletype.stair then abad.y=abad.y+1 if abad.wait==6 then sound.play(audio_low) end end end if abad.wait==6 then abad.wait=0 end end