From 57bd5bef4e12b016b4bfa95f80c902260383abad Mon Sep 17 00:00:00 2001 From: JailGamer Date: Sat, 21 Mar 2026 23:59:21 +0100 Subject: [PATCH] [WIP] Moviment de l'Abad pel mapa --- data/abad.lua | 369 ++++++++++++++++++++++++++----------------------- data/cacau.lua | 59 ++++++++ data/game.lua | 95 ++++++++++++- data/mapa.lua | 54 +++++--- data/tiles.gif | Bin 11755 -> 11755 bytes 5 files changed, 372 insertions(+), 205 deletions(-) create mode 100644 data/cacau.lua diff --git a/data/abad.lua b/data/abad.lua index 2cb2622..54b2735 100644 --- a/data/abad.lua +++ b/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) 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)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_height6 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 \ No newline at end of file diff --git a/data/cacau.lua b/data/cacau.lua new file mode 100644 index 0000000..bbacb39 --- /dev/null +++ b/data/cacau.lua @@ -0,0 +1,59 @@ +local arcade_config = require("arcade_config") +o2aX = arcade_config.org2arc_escala + +cacau={ hab=-1, + x=0, + y=0, + wait=0, + flip=false, + bb={x=0,y=0,w=4,h=4}, + alive=false } + +function cacau.init(_hab,_x,_y,_flip) + if cacau.hab ~= -1 then return end + cacau.hab=_hab + cacau.x=_x + cacau.y=_y + cacau.flip=_flip + cacau.alive = true +end + +function cacau.draw() + draw.circf(cacau.x*o2aX,cacau.y*o2aX,2*o2aX,16) + draw.circf((cacau.x+2)*o2aX,cacau.y*o2aX,2*o2aX,16) + draw.circf(cacau.x*o2aX,cacau.y*o2aX,1*o2aX,6) + draw.circf((cacau.x+2)*o2aX,cacau.y*o2aX,1*o2aX,6) +end + +function cacau.update() + if cacau.hab == -1 then + cacau.alive = false + return + end + cacau.wait=cacau.wait+1 + + if cacau.wait==3 then + cacau.wait=0 + + if cacau.x>96 then + cacau.hab=-1 + cacau.alive = false + return + elseif check_tile(cacau.hab,cacau.x,cacau.y) void=0 / nonpc=1 / stair=2 / +-- -- switch=3 / half=4 / block=5 +-- +-- local tile=mapa_get_tile(hab,x,y) +-- if tile<8 then +-- return tiletype.half +-- elseif tile<15 then +-- return tiletype.stair +-- elseif tile==15 then +-- return tiletype.switch +-- elseif tile<64 then +-- return tiletype.block +-- elseif tile==111 then +-- return tiletype.nonpc +-- else +-- return tiletype.void +-- end +-- end function arc_mapa_get_coords ( hab, tile_x , tile_y ) -- La primera habitació es la 0 @@ -176,12 +181,17 @@ function arc_mapa_get_map_coords ( x, y ) return calc_room, calc_col, calc_row end -function arc_check_tile(x,y) +function arc_check_tile(world_x,world_y) -- local xx=math.min(11,math.max(0,math.floor(x/8))) -- local yy=math.min(5,math.max(0,math.floor(y/8))) --rect(xx*8,yy*8,xx*8+8,yy*8+8,3) - local hab, xx, yy = arc_mapa_get_map_coords(x, y) + + -- tiletype => void=0 / nonpc=1 / stair=2 / + -- switch=3 / half=4 / block=5 + + local hab, xx, yy = arc_mapa_get_map_coords(world_x, world_y) local tile=mapa_get_tile(hab,xx,yy) +-- print("ARC_CT= "..hab.."> "..x..", "..y.." => "..tile) if tile<8 then return tiletype.half elseif tile<15 then diff --git a/data/tiles.gif b/data/tiles.gif index 8a6bf5c9c1da15e4c87526209caff0586919b5d1..356c0b62bab9e4439f7ce89556ae45b83ce1a0e0 100644 GIT binary patch delta 21 ccmaDI{W_Y*-P6s&GLeCif$_P(MxOh+08{b@0{{R3 delta 21 ccmaDI{W_Y*-P6s&GLeCif$=%hMxOh+08^|6^#A|>