viewport= require("viewport") require "abad" require "cacau" require "llibre" require "gorro" require "peu" require "premiere" require "elalien" require "bol" require "gota" require "invisible" require "caco" require "zombie" require "score" require "switches" require "trigger" require "imp" require "stage1" local tile_w = arcade_config.tiles_width local tile_h = arcade_config.tiles_height local res_w = arcade_config.resolucion.width local res_h = arcade_config.resolucion.height local view_tile_id = false local view_checking_tile = false local stage= 1 local stage_loaded = 0 viewp = viewport.new(arcade_config.resolucion.width, arcade_config.resolucion.height) viewp:position(0,0) function actor_warp_draw(actor) local shrink_w = actor.w*actor.shrink local shrink_h = actor.h*actor.shrink local offset_x = math.floor((actor.w-shrink_w)/2) local offset_y = math.floor((actor.h-shrink_h)/2) local scr_x, scr_y = viewp:screen_coords( actor.x+offset_x, actor.y+offset_y ) shrink_w = math.floor(shrink_w) shrink_h = math.floor(shrink_h) if shrink_w>0 and shrink_h>0 then draw.surfrot((actor.frame&7)*cw, (actor.frame>>cxr2)*ch, cw, ch, scr_x, scr_y, actor.angle, shrink_w, shrink_h, actor.flip) end end function actor_warp_update(actor) -- warp, wait, respawn if actor.warping then if actor.step=360 then actor.angle = actor.angle % 360 end if actor.shrink<=0 then actor.shrink=1 actor.d_shrink=1 actor.angle=0 actor.d_angle=1 actor.warping = false actor.frame = -1 actor.step = 0 end end elseif actor.step=actor.death_time then actor.frame=actor.anim[1] actor.step=0 actor.wait=0 if actor.name=="caco" then actor.update=caco.update_normal elseif actor.name=="zombie" then actor.update=zombie.update_normal end actor.dying = false end end actors={} function game_exit() -- mapa_restore_backup() actors={} -- cameras={} end function game_init(menu) -- print("GAME INIT") actors={} abad_init() table.insert(actors,abad) llibre.init() table.insert(actors,llibre) gorro.init() table.insert(actors,gorro) peu.init() table.insert(actors,peu) premiere.init() table.insert(actors,premiere) elalien.init() table.insert(actors,elalien) imp.init() table.insert(actors,imp) --batman bol.init() table.insert(actors,bol) table.insert( actors, gota.new(70,5,1,20) ) table.insert( actors, gota.new(70,9,1,30) ) table.insert( actors, gota.new(63,5,1,25,2,-7) ) table.insert( actors, gota.new(63,9,1,20,0,-8) ) table.insert( actors, gota.new(64,3,1,10,0,-6) ) table.insert( actors, gota.new(64,6,1,25,-1,-5) ) table.insert( actors, gota.new(65,7,1,10,0,-7) ) table.insert( actors, gota.new(65,8,1,25,0,-7) ) table.insert( actors, gota.new(66,3,1,10,0,-7) ) table.insert( actors, gota.new(66,4,1,15,0,-7) ) table.insert( actors, gota.new(77,2,1,30,-5,-7) ) table.insert( actors, gota.new(77,9,1,25,-5,-7) ) -- FOC? table.insert(actors,invisible.new(77,5,4)) table.insert(actors,invisible.new(77,6,4)) table.insert(actors,invisible.new(58,2,4)) table.insert(actors,invisible.new(58,3,4)) table.insert( actors, caco.new(13,3,2,true ) ) table.insert( actors, caco.new(17,3,2,false) ) table.insert( actors, caco.new(20,3,2,false) ) table.insert( actors, caco.new(26,3,2,false) ) table.insert( actors, caco.new(37,3,2,false) ) table.insert( actors, caco.new(41,3,2,false) ) table.insert( actors, caco.new(50,3,2,false) ) table.insert( actors, caco.new(57,3,2,false) ) table.insert( actors, caco.new(61,3,2,false) ) table.insert( actors, zombie.new(2, 3, 3,false) ) table.insert( actors, zombie.new(28, 3, 3,false) ) table.insert( actors, zombie.new(32, 3, 3,false) ) table.insert( actors, zombie.new(44, 3, 3,false) ) table.insert( actors, zombie.new(46, 3, 3,false) ) table.insert( actors, zombie.new(54, 3, 3,false) ) table.insert( actors, zombie.new(68, 3, 3,false) ) table.insert( actors, zombie.new(73, 3, 3,false) ) -- TRIGGERS -- if not menu then table.insert(actors,trigger.new(10,57,32,triggers.escena_abad_inici)) end table.insert( actors, trigger.new(10,7,3,triggers.escena_abad_inici,"inici")) table.insert( actors, trigger.new(11,2,3,triggers.escena_abad_corfes,"corfes")) table.insert( actors, trigger.new(31,1,3,triggers.escena_abad_portes,"portes")) table.insert( actors, trigger.new(31,6,3,triggers.escena_abad_portes,"portes")) table.insert( actors, trigger.new(71,7,3,triggers.escena_abad_portes,"portes")) table.insert( actors, trigger.new(53,5,3,triggers.escena_abad_porta_casa,"porta casa")) table.insert( actors, trigger.new(56,4,3,triggers.escena_abad_porta_batman,"porta batman")) table.insert( actors, trigger.new(19,32,32,triggers.escena_habitacio_batman,"habitacio batman")) -- table.insert( actors, trigger.new(55,1,3,triggers.escena_lluita_imp,"lluita imp")) -- table.insert(actors,trigger.new(14,40,32,triggers.teleport_a)) -- table.insert(actors,trigger.new(67,8,32,triggers.teleport_b)) -- table.insert(actors,trigger.new(29,40,32,triggers.teleport_c)) -- table.insert(actors,trigger.new(61,8,32,triggers.teleport_d)) score.create() local abad_x, abad_y = coords.room_to_world ( 10, 4, 3 ) -- local abad_x, abad_y = coords.room_to_world ( 54, 8, 3 ) abad:move(abad_x, abad_y) abad_make_safe( true ) local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) -- game_update=update_game flow:next() end function render_map( sf_map, sf_tiles, x, y ) map.surf(sf_map) map.cell(16, 16) surf.source(sf_tiles) surf.target(0) view.origin(-x,-y) map.draw() view.origin(0,0) end function load_stage() local stage_init = stages["stage"..stage.."_init"] if stage_init then stage_init() stage_loaded = stage print("Stage "..stage.." loaded") else print("No se ha cargado la fase "..stage) end end function viewport_update() local vp_x = viewp.x local vp_y = viewp.y local vp_center_offset_x = (viewp.width >> 1) local vp_center_offset_y = (viewp.height >> 1) vp_x = abad.x - vp_center_offset_x if vp_x < 0 then vp_x = 0 end vp_y = abad.y - vp_center_offset_y if vp_y < 0 then vp_y = 0 end viewp:position(vp_x, vp_y) end function world_update() -- Actualitzar moviment del mapa (ex: tiles animats) arc_mapa_update() -- Moure a tots for key,actor in pairs(actors) do actor:update() -- Comprovar dispars contra "monstres" if viewp:inside(actor.x, actor.y, actor.w, actor.h) and actor~=abad then for _, cacau_shot in pairs(cacau.shots()) do if cacau_shot.alive and collision(actor,cacau_shot) then if actor.hit ~= nil and not actor.dying then actor:hit() if actor.can_warp then warp.open(actor) end cacau:kill(cacau_shot) end end end end end -- Actualizar el que queda cacau.update() switches.update() warp.update_all() end function world_draw() -- Pintar la finestra del mon render_map(sf_mapa, tiles, viewp.x, viewp.y) -- pintar warps for key,warp in pairs(warp.warp_list) do if viewp:inside(warp.x, warp.y, warp.w, warp.h) then warp:draw() end end --pintar actors for key,actor in pairs(actors) do if viewp:inside(actor.x, actor.y, actor.w, actor.h) then actor:draw() end end cacau:draw() end function update_game() if stage~=stage_loaded then load_stage() end surf.target(0) surf.cls(16) -- special_keys() world_update() -- Moure el viewport viewport_update() world_draw() score.draw() -- debug_info() end function pause() print("pause()") -- surf.source(0) -- surf.target(back) -- draw.surf(0,0,128,96,0,0) -- surf.target(0) -- surf.source(tiles) -- pausa_option=1 -- pause_old_update=game_update -- game_update=update_pause end function update_pause() draw.rectf(16,16,97,65,16) draw.rect(16,16,97,65,15) draw.text("PAUSA",54,20,15) menu_count=menu_count+1 local parpadeig=false if menu_count>=20 then parpadeig=true if menu_count>40 then menu_count=0 end end draw.rect(28,33+(10*(pausa_option-1)),73,9,14) if (not parpadeig) then draw.rect(28,33+(10*(pausa_option-1)),73,9,13) end --draw.rect(28,33+(10*(pausa_option-1)),73,9,13) draw.text("CONTINUAR",30,35,14) draw.text("MUSICA:",30,45,14) if music.enabled() then draw.text("SI",91,45,15) else draw.text("NO",91,45,15) end draw.text("SÓ:",30,55,14) if sound.enabled() then draw.text("SI",91,55,15) else draw.text("NO",91,55,15) end draw.text("EIXIR",30,65,14) if key.press(key.ESCAPE) then surf.source(back) draw.surf(0,0,128,96,0,0) surf.source(tiles) game_update = pause_old_update elseif key.press(keyDown) or pad.press(btnDown) then pausa_option = pausa_option + 1 if pausa_option == 5 then pausa_option = 1 end elseif key.press(keyUp) or pad.press(btnUp) then pausa_option = pausa_option - 1 if pausa_option == 0 then pausa_option = 4 end elseif key.press(keyShoot) or pad.press(btnShoot) then if pausa_option==1 then surf.source(back) draw.surf(0,0,128,96,0,0) surf.source(tiles) game_update = pause_old_update elseif pausa_option==2 then music.enabled(not music.enabled()) elseif pausa_option==3 then sound.enabled(not sound.enabled()) else game_exit() game_init(true) end end 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) 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.N0) then -- abad go to room local abad_x, abad_y = coords.room_to_world ( 70, 6, 3 ) print(abad_x..", "..abad_y) abad:move(abad_x, abad_y) local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) end end function debug_info() font.current(font_default) viewp:print() msg_print(0,14,"ABAD= "..abad.x..", "..abad.y, true) msg_print(0,21,"VIEW= "..viewp.x..", "..viewp.y, true) local hab, xx, yy = coords.world_to_tile(abad.x, abad.y) msg_print(0,28,hab.." ( "..xx..", "..yy.." )", true) msg_print(0,35,hab.." ( "..xx..", "..yy.." )", true) -- msg_print(0,42," JH= "..abad.jump_height,true) -- view_coord(abad.x+8, abad.y+0, 16, 32, 6) -- view_coord(abad.x+abad.bb.x, abad.y+abad.bb.h, 2, 2, 4) -- view_coord(abad.x+abad.bb.x+abad.bb.w, abad.y+abad.bb.h, 2, 2, 2) -- view_coord(abad.x, abad.y, 2, 2, 3) -- if key.press(key.T) then -- view_tile_id = not view_tile_id -- view_checking_tile = false -- end -- if key.press(key.C) then -- view_checking_tile = not view_checking_tile -- view_tile_id = false -- end -- -- if view_tile_id then -- write_tile(abad.x, abad.y, 0, true, "R") -- write_tile(abad.x, abad.y+16, 0, true, "R") -- write_tile(abad.x, abad.y+32, 0, true, "R") -- -- write_tile(abad.x+16, abad.y+32, 0, true, "C") -- -- write_tile(abad.x+32, abad.y, 0, true, "L") -- write_tile(abad.x+32, abad.y+16, 0, true, "L") -- write_tile(abad.x+32, abad.y+32, 0, true, "L") -- end -- -- if view_checking_tile then -- local msg = "FLIP= true" -- if not abad.flip then -- msg ="FLIP= false" -- view_coord(abad.x+abad.bb.w+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) -- else -- view_coord(abad.x+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) -- end -- msg_print(abad.x, abad.y-8,msg) -- end font.current(font_sf) end flow:registrar("game", {game_init, update_game} )