465 lines
13 KiB
Lua
465 lines
13 KiB
Lua
-- 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)<limit then
|
|
abad.x=abad.x+step_length
|
|
end
|
|
|
|
if arc_check_tile(abad.x+abad.bb.x,abad.y+abad.bb.h)==tiletype.stair then
|
|
abad.update=abad_state_stairs
|
|
elseif abad.update==abad_state_stairs then
|
|
abad.update=abad_state_normal
|
|
abad.frame=0
|
|
end
|
|
end
|
|
|
|
-- Controlador principal de l'abad
|
|
function abad_state_normal()
|
|
abad.frame=0
|
|
abad.wait=0
|
|
abad.step=0
|
|
abad.shoot_cooldown = abad.shoot_cooldown + 1
|
|
abad.jumpfwd=false
|
|
abad.jump_height = 0
|
|
if abad.hurting > 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<abad.max_jump_height then
|
|
abad_jump()
|
|
else
|
|
-- Canviar a mode caure
|
|
abad.update=abad_state_falling
|
|
abad.jump=sound.play(audio_abad_fall)
|
|
end
|
|
abad.step=abad.step+1
|
|
|
|
if abad.jumpfwd then abad_advance() end
|
|
|
|
end
|
|
|
|
function abad_state_falling()
|
|
abad.frame=3
|
|
abad.wait=abad.wait+1
|
|
|
|
if abad.wait==6 then
|
|
abad.wait=0
|
|
|
|
-- if abad.y<32 then
|
|
-- if (abad.y+16)&7==0 and
|
|
-- (arc_check_tile(abad.x+4,abad.y+16)>=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 |