[WIP] Moviment de l'Abad pel mapa
This commit is contained in:
369
data/abad.lua
369
data/abad.lua
@@ -1,3 +1,5 @@
|
||||
-- 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")
|
||||
o2aX = arcade_config.org2arc_escala
|
||||
cxr = arcade_config.character_per_row-1
|
||||
@@ -7,23 +9,25 @@ 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=4,y=0,w=8,h=16},
|
||||
safe={hab=10,x=40,y=24} }
|
||||
-- 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
|
||||
@@ -40,12 +44,19 @@ function abad_init()
|
||||
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,
|
||||
max_shoot_cooldown=24,
|
||||
shoot_cooldown=25,
|
||||
anim={0,1,0,2},
|
||||
bb={x=4,y=0,w=8,h=16},
|
||||
bb={x=8,y=0,w=16,h=32},
|
||||
safe={hab=10,x=40,y=24},
|
||||
move=abad.move }
|
||||
abad.update=abad_state_normal
|
||||
@@ -58,14 +69,17 @@ function abad:move( x, y )
|
||||
end
|
||||
|
||||
function abad:draw()
|
||||
local flip=abad.flip
|
||||
local flip = abad.flip
|
||||
if abad.update==abad_state_stairs then
|
||||
flip=(((abad.x>>1)+(abad.y>>1))%2)==0
|
||||
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
|
||||
-- draw.surf(abad.frame*16,0,16,16,abad.x,abad.y,16,16,flip)
|
||||
local x, y = viewp:screen_coords(self.x, self.y)
|
||||
-- draw.surf(abad.frame*cw,0,cw,ch,abad.x*o2aX,abad.y*o2aX,cw,ch,flip)
|
||||
draw.surf(abad.frame*cw,0,cw,ch,x,y,cw,ch,flip)
|
||||
end
|
||||
|
||||
@@ -82,6 +96,7 @@ function abad_make_safe()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function abad_hurt(howmuch)
|
||||
if abad.hurting == 0 and abad.respawning==0 then
|
||||
sound.play(audio_abad_hit)
|
||||
@@ -112,22 +127,76 @@ function abad_hurt(howmuch)
|
||||
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_land ()
|
||||
-- abad.x
|
||||
-- abad.y
|
||||
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>12 then
|
||||
abad_hurt(abad.falling-12)
|
||||
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
|
||||
@@ -137,44 +206,34 @@ function abad_state_normal()
|
||||
abad.update=abad_state_walking
|
||||
abad.flip=true
|
||||
elseif key.down(keyJump) or pad.down(btnJump) then
|
||||
abad.update=abad_state_jumping
|
||||
abad.step=0
|
||||
abad.jumpfwd=false
|
||||
if abad.jump then
|
||||
sound.stop(abad.jump)
|
||||
abad.jump=nil
|
||||
end
|
||||
sound.play(audio_abad_jump)
|
||||
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
|
||||
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)
|
||||
abad_shot_cacau()
|
||||
end
|
||||
end
|
||||
|
||||
function abad_state_crouch()
|
||||
abad.bb.y=8
|
||||
abad.bb.h=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=16
|
||||
abad.bb.h=32
|
||||
end
|
||||
end
|
||||
|
||||
function abad_state_fire()
|
||||
abad.frame=6
|
||||
|
||||
abad.wait=abad.wait+1
|
||||
|
||||
if abad.wait==6 then
|
||||
@@ -183,37 +242,11 @@ function abad_state_fire()
|
||||
end
|
||||
end
|
||||
|
||||
function abad_advance()
|
||||
local inc=12 if abad.flip then inc=2 end
|
||||
local limit=tiletype.block
|
||||
if abad.update~=abad_state_walking then limit=tiletype.half end
|
||||
if not abad.flip and abad.x==84 then
|
||||
abad.hab=abad.hab+1
|
||||
-- imp.reset()
|
||||
abad.x=-4
|
||||
elseif arc_check_tile(abad.x+inc,abad.y+14)<limit then
|
||||
if abad.flip then
|
||||
abad.x=abad.x-2
|
||||
else
|
||||
abad.x=abad.x+2
|
||||
end
|
||||
if abad.x<-4 then
|
||||
abad.hab=abad.hab-1
|
||||
-- imp.reset()
|
||||
abad.x=84
|
||||
end
|
||||
end
|
||||
if arc_check_tile(abad.x+6,abad.y+8)==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
|
||||
|
||||
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
|
||||
@@ -222,38 +255,35 @@ function abad_state_walking()
|
||||
abad.mustep = abad.mustep + 1
|
||||
if abad.mustep == 5 then abad.mustep=1 end
|
||||
end
|
||||
abad.frame=abad.anim[abad.step+1]
|
||||
|
||||
abad_advance()
|
||||
|
||||
if arc_check_tile(abad.x+4,abad.y+16)==tiletype.void and ((abad.x+4)&7==0 or arc_check_tile(abad.x+12,abad.y+16)==tiletype.void) then
|
||||
abad.update=abad_state_falling
|
||||
return
|
||||
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
|
||||
if true then return end
|
||||
abad.update=abad_state_jumping
|
||||
abad.step=0
|
||||
abad.jumpfwd=true
|
||||
if abad.jump then
|
||||
sound.stop(abad.jump)
|
||||
abad.jump=nil
|
||||
end
|
||||
sound.play(audio_abad_jump)
|
||||
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
|
||||
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)
|
||||
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
|
||||
@@ -265,51 +295,33 @@ function abad_state_walking()
|
||||
end
|
||||
|
||||
function abad_state_jumping()
|
||||
local vspace = abad.vmove_space
|
||||
local step_length = abad.step_length
|
||||
abad.frame=3
|
||||
abad.wait=abad.wait+1
|
||||
--print(abad.x,1,50)
|
||||
--print(abad.y,10,50)
|
||||
if abad.wait==6 then
|
||||
abad.wait=0
|
||||
|
||||
if abad.jumpfwd then abad_advance() end
|
||||
|
||||
--local xx=math.floor((abad.x+4)/8)
|
||||
--local yy=math.floor(abad.y/8)
|
||||
--rect(xx*8,yy*8, (xx+2)*8,(yy+1)*8)
|
||||
if abad.step<6 then
|
||||
if abad.y>0 then
|
||||
if check_tile(abad.hab,abad.x+4,abad.y-2)~=tiletype.block then
|
||||
if (abad.x+4)&7==0 or check_tile(abad.hab,abad.x+12,abad.y-2)~=tiletype.block then
|
||||
abad.wait=0
|
||||
|
||||
if check_tile(abad.hab,abad.x+4,abad.y-2)==tiletype.switch then
|
||||
-- Executar el switch
|
||||
local xx=math.min(11,math.max(0,math.floor((abad.x+4)/8)))
|
||||
local yy=math.min(5,math.max(0,math.floor((abad.y-2)/8)))
|
||||
switches.start(abad.hab,1+xx+yy*12)
|
||||
--cls(4)
|
||||
elseif (abad.x+4)&7~=0 and check_tile(abad.hab,abad.x+12,abad.y-2)==tiletype.switch then
|
||||
-- Executar el switch
|
||||
local xx=math.min(11,math.max(0,math.floor((abad.x+12)/8)))
|
||||
local yy=math.min(5,math.max(0,math.floor((abad.y-2)/8)))
|
||||
switches.start(abad.hab,1+xx+yy*12)
|
||||
--cls(4)
|
||||
else
|
||||
abad.y=abad.y-2
|
||||
end
|
||||
if abad.jump_height<abad.max_jump_height then
|
||||
if arc_check_tile(abad.x+step_length,abad.y-vspace)~=tiletype.block then
|
||||
if arc_check_tile(abad.x+abad.bb.x+abad.bb.w,abad.y-vspace)~=tiletype.block then
|
||||
if arc_check_tile(abad.x+abad.bb.x,abad.y-vspace)==tiletype.switch then
|
||||
-- Executar el switch
|
||||
switches.start(abad.hab,1+xx+yy*12)
|
||||
else
|
||||
abad.jump_height = abad.jump_height+1
|
||||
end
|
||||
end
|
||||
else
|
||||
abad.hab=abad.hab-10
|
||||
imp.reset()
|
||||
abad.y=32
|
||||
end
|
||||
elseif abad.step>6 then
|
||||
abad.update=abad_state_falling
|
||||
abad.jump=sound.play(audio_abad_fall)
|
||||
end
|
||||
abad.step=abad.step+1
|
||||
else
|
||||
-- Canviar a mode caure
|
||||
abad.update=abad_state_falling
|
||||
abad.jump=sound.play(audio_abad_fall)
|
||||
end
|
||||
abad.step=abad.step+1
|
||||
abad.y=abad.y-vspace
|
||||
|
||||
if abad.jumpfwd then abad_advance() end
|
||||
|
||||
end
|
||||
|
||||
@@ -320,63 +332,68 @@ function abad_state_falling()
|
||||
if abad.wait==6 then
|
||||
abad.wait=0
|
||||
|
||||
if abad.jumpfwd then abad_advance() end
|
||||
|
||||
local xx=math.floor((abad.x+4)/8)
|
||||
local yy=math.floor((abad.y+16)/8)
|
||||
|
||||
if abad.y<32 then
|
||||
if (abad.y+16)&7==0 and (check_tile(abad.hab,abad.x+4,abad.y+16)>=tiletype.half or ((abad.x+4)&7~=0 and check_tile(abad.hab,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
|
||||
-- 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
|
||||
|
||||
local x_check = abad.x+abad.bb.x
|
||||
local y_check = abad.y+abad.bb.h
|
||||
local curr_tile = arc_check_tile(x_check,y_check)
|
||||
local next_tile = arc_check_tile(x_check+abad.bb.w,y_check)
|
||||
|
||||
local check_floor_curr_tile = curr_tile>=tiletype.half
|
||||
local check_floor_next_tile = next_tile>=tiletype.half
|
||||
|
||||
if check_floor_curr_tile or check_floor_next_tile 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 abad.wait==6 then
|
||||
abad.wait=0
|
||||
|
||||
if key.down(keyRight) or pad.down(btnRight) then
|
||||
abad.flip=false
|
||||
abad_advance()
|
||||
sound.play(audio_low)
|
||||
elseif key.down(keyLeft) or pad.down(btnLeft) then
|
||||
abad.flip=true
|
||||
abad_advance()
|
||||
sound.play(audio_low)
|
||||
elseif key.down(keyUp) or pad.down(btnUp) then
|
||||
if abad.y>0 then
|
||||
if check_tile(abad.hab,abad.x+4,abad.y+8)==tiletype.stair or (abad.x+4)&7~=0 and check_tile(abad.hab,abad.x+12,abad.y+8)==tiletype.stair then
|
||||
abad.y=abad.y-2
|
||||
sound.play(audio_low)
|
||||
end
|
||||
else
|
||||
abad.hab=abad.hab-10
|
||||
imp.reset()
|
||||
abad.y=32
|
||||
end
|
||||
elseif key.down(keyDown) or pad.down(btnDown) then
|
||||
if abad.y<32 then
|
||||
if check_tile(abad.hab,abad.x+4,abad.y+16)==tiletype.stair or (abad.x+4)&7~=0 and check_tile(abad.hab,abad.x+12,abad.y+16)==tiletype.stair then
|
||||
abad.y=abad.y+2
|
||||
sound.play(audio_low)
|
||||
end
|
||||
else
|
||||
abad.hab=abad.hab+10
|
||||
imp.reset()
|
||||
abad.y=0
|
||||
end
|
||||
end
|
||||
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
|
||||
Reference in New Issue
Block a user