From 6ac7a811d9860385f58ca1f52bc5822011be691d Mon Sep 17 00:00:00 2001 From: JailGamer Date: Mon, 6 Apr 2026 01:58:49 +0200 Subject: [PATCH] [WIP] Lluita contra jefes. Casi implementat se serebro de la bestia --- data/abad.lua | 4 +- data/game.lua | 68 +++--- data/helpers.lua | 2 +- data/imp.lua | 529 ++++++++++++++++++++++++++++++++++++++++------- data/stage1.lua | 6 +- data/trigger.lua | 2 +- data/zombie.lua | 2 + 7 files changed, 498 insertions(+), 115 deletions(-) diff --git a/data/abad.lua b/data/abad.lua index b7c846f..23b8914 100644 --- a/data/abad.lua +++ b/data/abad.lua @@ -132,7 +132,7 @@ end function abad_hurt(howmuch) - -- howmuch = 0 + howmuch = 0 if abad.hurting == 0 and abad.respawning==0 then sound.play(audio_abad_hit) abad.energia=abad.energia-howmuch @@ -250,11 +250,11 @@ function abad_jump() if abad.jump_in_half_block>0 then abad.y=abad.y-vspace abad.jump_in_half_block = abad.jump_in_half_block-1 + abad.jump_in_half_block_used = true end end end abad.jump_height = abad.jump_height+1 - abad.jump_in_half_block_used = true end function abad_land () diff --git a/data/game.lua b/data/game.lua index 90f4203..06cb25e 100644 --- a/data/game.lua +++ b/data/game.lua @@ -309,43 +309,49 @@ end function special_keys() if key.press(key.N1) then - -- abad prev room - local hab = abad.hab-1 - if hab<0 then hab=0 end - local hab_x = 4 - local hab_y = 3 - local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + -- -- abad prev room + -- local hab = abad.hab-1 + -- if hab<0 then hab=0 end + -- local hab_x = 4 + -- local hab_y = 3 + -- local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) end if key.press(key.N2) then - -- abad next room - local hab = abad.hab+1 - if hab<0 then hab=0 end - local hab_x = 4 - local hab_y = 3 - local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) - end - if key.press(key.N9) then - mapa_restore_backup() - set_actors_enabled_by_room(true, "boss", 44, 55) - viewp:free_move() + -- -- abad next room + -- local hab = abad.hab+1 + -- if hab<0 then hab=0 end + -- local hab_x = 4 + -- local hab_y = 3 + -- local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) end if key.press(key.N8) then - -- abad go to room - local abad_x, abad_y = coords.room_to_world ( 31, 8, 3 ) - print(abad_x..", "..abad_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + -- local abad_x, abad_y = coords.room_to_world ( 31, 8, 3 ) + -- print(abad_x..", "..abad_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + imp.mode="away" + imp.mode_cooldown = 60000 + print("away") + end + if key.press(key.N9) then + -- mapa_restore_backup() + -- set_actors_enabled_by_room(true, "boss", 44, 55) + -- viewp:free_move() + imp.mode="chase" + imp.mode_cooldown = 60000 + print("chase") end if key.press(key.N0) then - -- abad go to room - local abad_x, abad_y = coords.room_to_world ( 34, 3, 3 ) - print(abad_x..", "..abad_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + -- abad go to room + -- local abad_x, abad_y = coords.room_to_world ( 34, 3, 3 ) + -- print(abad_x..", "..abad_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + imp.init() end end diff --git a/data/helpers.lua b/data/helpers.lua index 3865e12..bd6d3ad 100644 --- a/data/helpers.lua +++ b/data/helpers.lua @@ -298,7 +298,7 @@ function msg_print(x, y, msg, direct_print ) else scr_x, scr_y = viewp:screen_coords(x, y) end - draw.rectf(scr_x,scr_y,45,7,16) + draw.rectf(scr_x,scr_y,256,20,16) draw.text(msg,scr_x+1,scr_y+1,2) end diff --git a/data/imp.lua b/data/imp.lua index 95cb108..68b051e 100644 --- a/data/imp.lua +++ b/data/imp.lua @@ -1,28 +1,27 @@ -local arcade_config = require("arcade_config") -o2aX = arcade_config.org2arc_escala -cxr = arcade_config.character_per_row-1 cxr2 = arcade_config.character_per_row_base2 -cw = arcade_config.character_width -ch = arcade_config.character_height -- 4, 3 -imp={hab=75, - x=24, - y=24, - w=32, - h=32, - flip=true, - enabled=false, - counter=500, - frame=28, - wait=0, - step=0, - anim={28,29,28,30}, - bb={x=4,y=0,w=16,h=32}, - scene_intro=false, - scene_object=false, - mode="stop"} +-- imp={hab=75, +-- x=24, +-- y=24, +-- w=32, +-- h=32, +-- flip=true, +-- enabled=false, +-- counter=500, +-- frame=28, +-- wait=0, +-- step=0, +-- anim={28,29,28,30}, +-- bb={x=4,y=0,w=16,h=32}, +-- scene_intro=false, +-- scene_object=false, +-- fight_modes={"chase","away","super","shot"}, +-- mode="stop", +-- mode_cooldown=100} + +imp = {} function imp.reset() imp.hit=imp.hit @@ -33,68 +32,442 @@ function imp.reset() imp.counter=500 end -function imp.init() - -- imp.enabled=false - -- imp.hit=imp.hit - -- imp.update=imp.update - -- imp.draw=imp.draw - -- imp.hab=abad.hab - -- if abad.x<40 then - -- if check_tile(imp.hab,92,38)=tiletype.half then - -- imp.enabled=true - -- imp.flip=true - -- imp.x=92 - -- else - -- imp.reset() - -- end - -- else - -- if check_tile(imp.hab,0,38)=tiletype.half then - -- imp.enabled=true - -- imp.flip=false - -- imp.x=-12 - -- else - -- imp.reset() - -- end - -- end - imp.hab=55 - local world_x, world_y = coords.room_to_world(55,4,3) - imp.x=world_x - imp.y=world_y - imp.flip = true +function imp.new(_hab, _x, _y) + local world_x, world_y = coords.room_to_world(_hab,_x,_y) + _fight_modes={"chase","away","super","shot"} + for i,v in ipairs(_fight_modes) do _fight_modes[v] = i end + return { name="imp", + hab=_hab, + x=world_x, y=world_y, + w=32, h=32, + flip=true, + frame=28, + wait=0, + vides=1, + energia=6, + max_energia=6, + falling=0, + step=0, + hurting=0, + 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, + shot_power=1, + shot_num_shots=1, + shoot_cooldown=25, + anim={28,29,28,30}, + bb={x=8,y=0,w=16,h=32}, + scene_intro=false, + scene_object=false, + fight_modes=_fight_modes, + mode="stop", + mode_cooldown=100, + super_cooldown=2000, + shot_cooldown=500, + action="", + fight=imp.fight, + draw=imp.draw, + hit=imp.hit, + direccio=imp.direccio, + do_jump=imp.do_jump, + jump=imp.jump, + state_jumping=imp.state_jumping, + chase=imp.chase, + away=imp.away, + move=imp.move, + super=imp.super, + shot=imp.shot, + do_flip=imp.do_flip, + update=imp.state_normal, + land=imp.land, + mode_controller=imp.mode_controller, + movement=imp.movement, + advance=imp.advance, + reduce_cooldown=imp.reduce_cooldown, + -- imp.enabled=false + -- imp.counter=500 + } end -function imp.draw() - -- if imp.enabled then - -- -- draw.surf((imp.frame&7)*16,(imp.frame>>3)*16,16,16,imp.x,imp.y,16,16,imp.flip) - -- draw.surf((imp.frame&7)*cw,(imp.frame>>cxr2)*ch,cw,ch,imp.x*o2aX,imp.y*o2aX,cw,ch,imp.flip) - -- end - local scr_x, scr_y = viewp:screen_coords( imp.x, imp.y ) - draw.surf((imp.frame&7)*imp.w, (imp.frame>>cxr2)*imp.h, imp.w, imp.h, scr_x, scr_y, imp.w, imp.h, imp.flip) +function imp:fight() + print("FIGHTING MODE") + self.mode="away" end -function imp.hit() +function imp:draw() + local scr_x, scr_y = viewp:screen_coords( self.x, self.y ) + draw.surf((self.frame&7)*self.w, (self.frame>>cxr2)*self.h, self.w, self.h, scr_x, scr_y, self.w, self.h, self.flip) + draw.rect(scr_x+self.bb.x,scr_y+self.bb.y,self.bb.w,self.bb.h,3) end -function imp.update() - if mode=="chase" then - if abad.ximp.x then - imp.x=imp.x+1 +function imp:hit() + -- +end + +function imp:direccio( actor ) +msg_print(0,0,"direccio",true) + local check_side = "L" + -- definir el punts per a comprobar en el mapa + if self.fight_modes[self.mode]=="away" then + if actor.x>self.x then + -- caminar cap "enrere", check costat esq + check_side = "L" + else + -- caminar cap "endavant", check costat dret + check_side = "R" + end + elseif self.fight_modes[self.mode]=="chase" then + if actor.x>self.x then + -- caminar cap "endavant", check costat dret + check_side = "R" + else + -- caminar cap "enrere", check costat esq + check_side = "L" end end - -- imp.wait=imp.wait+1 - -- - -- if imp.wait==6 then - -- imp.wait=0 + + local step = 1 + if check_side=="L" then step = -step end + + return step +end + +function imp:do_jump ( jumpfwd ) +msg_print(0,0,"do_jump",true) + -- Inicialització de fer el salt + jumpfwd = jumpfwd or false + self.jump_height = 0 + self.update=imp.state_jumping + self.step=0 + self.jumpfwd=jumpfwd +end + +function imp:state_jumping() + msg_print(0,0,"state_jumping",true) + self:reduce_cooldown() + -- ?? + self.wait=self.wait+1 + self.wait=0 + + -- Pujar o caure + if self.jump_height0 then + self.y=self.y-vspace + self.jump_in_half_block = self.jump_in_half_block-1 + self.jump_in_half_block_used = true + end + end + end + + -- Registrar el desplaçament + self.jump_height = self.jump_height+1 +end + +function imp:state_walking() +msg_print(0,0,"state_walking",true) + self:reduce_cooldown() + + -- Limitar la velocitat de moviment + self.wait=self.wait+1 + + -- representació del moviment + -- if self.wait==6 then + -- self.wait=0 + -- self.step=(self.step+1)%2 + -- self.frame=self.anim[self.step+1] + -- end + + -- Selecció de frame + if self.wait==6 then + self.wait=0 + self.step=(self.step+1)%4 + self.frame=self.anim[self.step+1] + end + + -- Comprovar dos punts de contacte del personatge en el piso a vore si cau + local x1_check = self.x+self.bb.x + local x2_check = x1_check+self.bb.w + local y_check = self.y+self.bb.h; -- base del personatge + 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 + -- si no hi ha piso, caure + self.update=imp.state_falling + return + end + + self:advance() + self:move() +end + +function imp:state_falling() +msg_print(0,0,"state_falling",true) + self:reduce_cooldown() + + -- print("state_falling") + + self.frame=30 + self.wait=self.wait+1 + + -- Si toca terra canviar el mode + if self:land() then + self.update=imp.state_normal + return + end + + -- Seguir caiguent + self.y=self.y+1 + self.jump_height = self.jump_height-1 + self.falling=self.falling+1 + + -- Caiguent cap endavant? + if self.jumpfwd then self:advance() end +end + +function imp:land () +msg_print(0,0,"land",true) + -- Els dos punts de baix de l'abad + local x1_check = self.x+self.bb.x + local x2_check = self.x+self.bb.x+self.bb.w + local y_check = self.y+self.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 + self.jump_in_half_block_used = false + self.jump_height = 0 + end + + return can_land +end + +function imp:advance() +msg_print(0,0,"advance",true) + local step_length=self.step_length; --lo que avança l'abad cada pas + local limit=tiletype.block + + if self.update~=imp.state_walking then limit=tiletype.half end + + local x_check = self.x+self.bb.x+self.bb.w+step_length + -- if self.flip then + -- step_length = -step_length + -- x_check = self.x+self.bb.x+step_length + -- end + + -- self.action=="right" + if self.action=="left" then + step_length = -step_length + x_check = self.x+self.bb.x+step_length + end + + local y_check = self.y+self.bb.h-4 + + if arc_check_tile(x_check, y_check)abad.y + and arc_check_tile(self.x+(self.bb.x+(self.bb.w/2)),(self.y+(self.h/2)))~=tiletype.void then + action = "jump" + elseif self.y==abad.y and math.abs(self.x-abad.x)<=8 then + action = "jumpfwd" + else + if self.fight_modes[self.mode]=="away" then + if abad.xself.x then + action="right" + else + action="left" + end + end + end + elseif self.fight_modes[self.mode]=="super" then + action="super" + elseif self.fight_modes[self.mode]=="shot" then + action="shot" + end + + return action +end + +function imp:reduce_cooldown() + if self.mode=="stop" then return end + + self.mode_cooldown = self.mode_cooldown -1 + self.super_cooldown = self.super_cooldown -1 + self.shoot_cooldown = self.shoot_cooldown -1 +end + +function imp:mode_controller() + if self.mode=="stop" then return end + + if self.mode_cooldown <= 0 then + -- seleccionar mode d'acció + local last_mode=self.mode + self.mode_cooldown = 150+math.random(50)-1 + self.mode=math.random(#self.fight_modes) + + if self.mode==self.fight_modes["super"] and self.super_cooldown>0 then self.mode=self.fight_modes["shot"] end + if self.mode==self.fight_modes["shot"] and self.shot_cooldown>0 then self.mode=self.fight_modes["chase"] end + + print("cambiar modo => "..self.fight_modes[self.mode]) + end + -- -- if self.mode==last_mode then self.mode=((last_mode+1)%#self.fight_modes)+1 end + -- elseif self.mode_cooldown == 0 then + -- if self.shot_cooldown<=0 then self.mode=self.fight_modes["shot"] end; + -- end + + self:do_flip(abad) + -- self:movement(abad) + + -- comprovar colisio en l'abad + if viewp:inside(self.x, self.y, self.w, self.h) then + if collision(abad,self) then + abad_hurt(1) + end + end + + --if imp.wait==6 then + -- imp.wait=0 -- if not imp.enabled then -- imp.counter=imp.counter-1 -- local r = math.random(0,imp.counter-1) @@ -105,8 +478,8 @@ function imp.update() -- return -- end -- - -- imp.step=(imp.step+1)%4 - -- imp.frame=imp.anim[imp.step+1] + -- imp.step=(imp.step+1)%4 + -- imp.frame=imp.anim[imp.step+1] -- -- if imp.flip then -- imp.x=imp.x-2 @@ -128,6 +501,6 @@ function imp.update() -- end -- end -- - -- end + --end end diff --git a/data/stage1.lua b/data/stage1.lua index 91628b4..005d305 100644 --- a/data/stage1.lua +++ b/data/stage1.lua @@ -2,6 +2,7 @@ stages = {} stages.boss_ready = false stages.boss_loaded = false +boss = nil function stages.stage1_init() mapa = stage1_mapa @@ -25,8 +26,8 @@ function stages.stage1_init() elalien.init() table.insert(actors,elalien) - imp.init() - table.insert(actors,imp) + boss = imp.new(55,4,3) + table.insert( actors, boss ) --batman @@ -131,6 +132,7 @@ function stages.stage1_boss() -- actors_in_room_backup_and_remove(stage1_boss_mapa.r0.r,stage1_boss_mapa.r1.r) viewp:fixed({l=8,r=44,u=48,d=0}) stages.boss_loaded = true + boss:fight() end end diff --git a/data/trigger.lua b/data/trigger.lua index fd26d48..18616ec 100644 --- a/data/trigger.lua +++ b/data/trigger.lua @@ -4,7 +4,7 @@ function trigger.new(_hab,_x,_y,_action,_escena,_id,_type,_doors,_linked_id) local world_x, world_y = coords.room_to_world(_hab,_x,_y) _bb={x=0,y=0,w=16,h=16} --default -- if _type=="switch" then _bb={x=0,y=0,w=16,h=17} end - if _id then print("NEW => ".._id) end + -- if _id then print("NEW => ".._id) end _type = _type or "invisible" return { name="trigger", diff --git a/data/zombie.lua b/data/zombie.lua index 99e821c..1d6c81b 100644 --- a/data/zombie.lua +++ b/data/zombie.lua @@ -84,6 +84,8 @@ function zombie:update_normal() end end + self.hab = coords.world_to_room(self.x, self.y) + -- if self.hab==abad.hab then -- if aabb(abad,self) then -- abad_hurt(1)