require "abad" require "gps" require "gorro" require "peu" require "premiere" require "elalien" require "batman" require "bol" require "gota" require "invisibl" require "zombie" require "caco" require "trigger" require "score" require "imp" require "bambolla" require "cacau" require "fireball" require "switches" modes={playing=0,editing=1} --mode=modes.editing mode=modes.playing seltile = 0 actors={} cameras={} camera_names={[0]="GPS","Gorro","Peu de Paco","Premiere","EL_ALIEN","BatMan"} current_camera=0 mute=false function remove_actor(actor) for index, value in pairs(actors) do if value == actor then table.remove(actors,index) end end end function playmus(song,loop) if not mute then music.play(song,loop) end end function playsnd(snd,volume) if not mute then --print(sound) return sound.play(snd,volume) end end function game_init(menu) actors={} cameras={} camera_names={[0]="GPS","Gorro","Peu de Paco","Premiere","EL_ALIEN","BatMan"} current_camera=0 -- ACTORS PRINCIPALS abad_init() table.insert(actors,abad) gps.init() table.insert(actors,gps) gorro.init() table.insert(actors,gorro) peu.init() table.insert(actors,peu) premiere.init() table.insert(actors,premiere) elalien.init() table.insert(actors,elalien) batman.init() table.insert(actors,batman) bol.init() table.insert(actors,bol) -- MALOTES PERSISTENTS table.insert(actors,gota.new(70,40,8,20)) table.insert(actors,gota.new(70,72,8,30)) table.insert(actors,gota.new(63,40,4,25)) table.insert(actors,gota.new(63,72,4,20)) table.insert(actors,gota.new(64,24,4,10)) table.insert(actors,gota.new(64,48,4,25)) table.insert(actors,gota.new(65,56,4,10)) table.insert(actors,gota.new(65,63,4,25)) table.insert(actors,gota.new(66,24,4,10)) table.insert(actors,gota.new(66,32,4,15)) table.insert(actors,gota.new(77,16,4,30)) table.insert(actors,gota.new(77,72,4,25)) table.insert(actors,invisible.new(77,40,32)) table.insert(actors,invisible.new(77,48,32)) table.insert(actors,invisible.new(58,16,32)) table.insert(actors,invisible.new(58,16,32)) table.insert(actors,zombie.new(2,24,24,false)) table.insert(actors,caco.new(13,24,16,true)) table.insert(actors,caco.new(20,24,16,false)) table.insert(actors,zombie.new(32,24,24,false)) table.insert(actors,caco.new(41,24,16,false)) table.insert(actors,zombie.new(44,24,24,false)) table.insert(actors,caco.new(50,24,16,false)) table.insert(actors,caco.new(61,24,16,false)) table.insert(actors,zombie.new(73,24,24,false)) table.insert(actors,zombie.new(54,24,24,false)) table.insert(actors,zombie.new(68,24,24,false)) table.insert(actors,caco.new(57,24,16,false)) table.insert(actors,zombie.new(46,24,24,false)) table.insert(actors,caco.new(37,24,16,false)) table.insert(actors,caco.new(26,24,16,false)) table.insert(actors,zombie.new(28,24,24,false)) table.insert(actors,caco.new(17,24,16,false)) -- TRIGGERS if not menu then table.insert(actors,trigger.new(10,57,32,triggers.escena_abad_inici)) end table.insert(actors,trigger.new(11,16,32,triggers.escena_abad_corfes)) table.insert(actors,trigger.new(31,12,32,triggers.escena_abad_portes)) table.insert(actors,trigger.new(31,48,32,triggers.escena_abad_portes)) table.insert(actors,trigger.new(71,56,24,triggers.escena_abad_portes)) table.insert(actors,trigger.new(53,40,32,triggers.escena_abad_porta_casa)) table.insert(actors,trigger.new(56,32,32,triggers.escena_abad_porta_batman)) table.insert(actors,trigger.new(19,32,32,triggers.escena_habitacio_batman)) 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() cameras[0]=gps table.insert(cameras,gorro) table.insert(cameras,peu) table.insert(cameras,premiere) table.insert(cameras,elalien) table.insert(cameras,batman) mapa_do_backup() if menu then menu_sel=0 menu_state=0 abad.update = abad_nop game_update=update_menu menu_count=0 menu_change_room=300 menu_room=math.random(0,59) playmus(audio_main_song) else game_update=update_game music.stop() end --fade.fadein() end function draw_hab(hab,x,y,editing) view.origin(x,y) mapa_draw(hab) if not editing then for key,actor in pairs(actors) do if actor.hab==hab then actor:draw() end end if imp.hab==hab then imp.draw() end if bambolla.hab==hab then bambolla.draw() end if cacau.hab==hab then cacau:draw() end if fireball.hab==hab then fireball:draw() end end view.origin(0,0) end function update_dialog() draw.rectf(16,16,97,35,12) draw.rect(15,15,99,37,16) text("Save the map?",20,20,2) text("This cannot be undone",20,27,2) text("(Y)es (N)o",25,40,2) if key.press(key.N) then game_update=update_game elseif key.press(key.Y) then mapa_save() game_update=update_game end end scroll=0 function update_game() surf.cls(16) if mode==modes.editing then draw_hab(abad.hab,0,0,true) text(abad.hab,120,1,2) draw.surf(0,64+scroll*8,128,48,0,48) local xx=(seltile&15)*8 local yy=48+(seltile>>4)*8 draw.rect(xx,yy,9,9, 3) text("EDIT",100,1,3) local hx = abad.hab%10 local hy = math.floor(abad.hab/10) scroll=0 if key.press(key.RIGHT) and hx<9 then abad.hab=abad.hab+1 elseif key.press(key.LEFT) and hx>0 then abad.hab=abad.hab-1 elseif key.press(key.DOWN) and hy<7 then abad.hab=abad.hab+10 elseif key.press(key.UP) and hy>0 then abad.hab=abad.hab-10 elseif key.press(key.RETURN) then mode=modes.playing elseif key.press(key.S) and (key.down(key.LCTRL) or key.down(key.LGUI)) then game_update=update_dialog elseif key.press(key.C) then mapa_cycle_colors(abad.hab) elseif key.press(key.M) then mapa_create_minimap() return end if key.down(key.TAB) then scroll=2 end local mx,my=mouse.pos() if mx>>3 < 12 and my>>3 < 6 then text(mx>>3,100,10,2) text(my>>3,111,10,2) text((mx>>3)+(my>>3)*12,118,10,2) end if mouse.down(mouse.LEFT) then if my>=48 then seltile=(mx>>3)+((my-48+(scroll*8))>>3)*16 elseif mx<96 then mapa_set_tile(abad.hab,mx>>3,my>>3,seltile) end elseif mouse.down(mouse.RIGHT) then if my<48 and mx<96 then mapa_set_tile(abad.hab,mx>>3,my>>3,256) end end if mx>>3 < 12 and my>>3 < 6 then local tx,ty=(mx>>3)<<3,(my>>3)<<3 draw.rect(tx,ty,9,9,3) end else if abad.hurting == 0 then draw_hab(abad.hab,0,0) --text(abad.hab,1,1,2) draw_hab(cameras[current_camera].hab,0,48) text(camera_names[current_camera],2,49,8) score.draw() surf.source(tiles) draw.text("x"..abad.vides,114,13,2) draw.rectf(102+(abad.energia>>1),30,21-(abad.energia>>1),8,16) else draw.surf(0,0,16,9,50,40,16,9,true) if abad.hurting > 40 then draw.text("x"..abad.vides+1,63,43,3) elseif abad.hurting < 20 then draw.text("x"..abad.vides,63,43,2) end end mapa_update(abad.hab,cameras[current_camera].hab) for key,actor in pairs(actors) do actor:update() if actor.hab==cacau.hab and actor~=abad then if aabb(actor,cacau) then if actor.hit~=nil then actor:hit() cacau.hab=-1 end end end end imp.update() bambolla.update() cacau.update() fireball.update() switches.update() --local hx = abad.hab%10 --local hy = math.floor(abad.hab/10) --if btnp(KEY_RETURN) then -- mode=modes.editing -- mapa_restore_backup() --elseif btn(KEY_LSHIFT) and btnp(KEY_RIGHT) and hx<9 then -- abad.hab=abad.hab+1 --elseif btn(KEY_LSHIFT) and btnp(KEY_LEFT) and hx>0 then -- abad.hab=abad.hab-1 --elseif btn(KEY_LSHIFT) and btnp(KEY_DOWN) and hy<7 then -- abad.hab=abad.hab+10 --elseif btn(KEY_LSHIFT) and btnp(KEY_UP) and hy>0 then -- abad.hab=abad.hab-10 --elseif btnp(KEY_M) then -- mute = not mute --elseif btnp(KEY_ESCAPE) then -- pause() --end if key.press(key.ESCAPE) or pad.press(btnPause) then pause() end if abad.objects.gps~=nil then if key.press(key.N1) then if abad.objects.gorro==nil and abad.objects.clau_premiere==nil then current_camera=1 end elseif key.press(key.N2) then if abad.objects.peu==nil and abad.objects.clau_elalien==nil then current_camera=2 end elseif key.press(key.N3) then current_camera=3 elseif key.press(key.N4) then current_camera=4 elseif key.press(key.N5) then current_camera=5 end if pad.press(btnCycle1) then current_camera=current_camera+1 if current_camera==6 then current_camera=1 end if current_camera==1 and (abad.objects.gorro or abad.objects.clau_premiere) then current_camera=2 end if current_camera==2 and (abad.objects.peu or abad.objects.clau_elalien) then current_camera=3 end elseif pad.press(btnCycle2) then current_camera=current_camera-1 if current_camera==0 then current_camera=5 end if current_camera==2 and (abad.objects.peu or abad.objects.clau_elalien) then current_camera=1 end if current_camera==1 and (abad.objects.gorro or abad.objects.clau_premiere) then current_camera=5 end end end end end function redraw_menu_hab() draw_hab(menu_room,16,41) draw.rectf(0,0,15,97,16) draw.rectf(114,0,78,97,16) draw.rect(15,40,99,50,2) mapa_update(abad.hab,menu_room) for key,actor in pairs(actors) do actor:update() end imp.update() bambolla.update() cacau.update() fireball.update() switches.update() end function update_menu() menu_change_room=menu_change_room-1 if menu_change_room==0 then menu_room = math.random(0,59) menu_change_room=300 end surf.cls(16) text("C A C A U S", 42, 8, 15) if menu_state == 0 then 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 if (not parpadeig or menu_sel~=0) then text("JUGAR", 54, 16, 13) end if (not parpadeig or menu_sel~=1) then text("REDEFINIR TECLAT", 32, 24, 13) end if (not parpadeig or menu_sel~=2) then text("REDEFINIR GAMEPAD", 30, 32, 13) end redraw_menu_hab() if key.press(keyShoot) or key.press(key.SPACE) or pad.press(pad.A) or pad.press(btnShoot) then if menu_sel==0 then game_exit() game_init() fade.fadeoutin() elseif menu_sel==1 then menu_count=0 menu_state=1 else menu_count=0 menu_state=2 end elseif key.press(keyDown) or key.press(key.DOWN) or pad.press(pad.DOWN) or pad.press(btnDown) then menu_sel=menu_sel+1 if menu_sel==3 then menu_sel=0 end elseif key.press(keyUp) or key.press(key.UP) or pad.press(pad.UP) or pad.press(btnUp) then menu_sel=menu_sel-1 if menu_sel==-1 then menu_sel=2 end elseif key.press(key.M) then mute = not mute if mute then music.stop() else playmus(audio_main_song) end elseif key.press(key.ESCAPE) or pad.press(btnPause) then sys.quit() end elseif menu_state==1 then if key.press(key.ESCAPE) then menu_count = 0 menu_state = 0 end if menu_count==0 then text("PULSA TECLA PER A AMUNT", 20, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 1 keyUp=k config.key("keyup", keyUp) end elseif menu_count==1 then text("PULSA TECLA PER A AVALL", 20, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 2 keyDown=k config.key("keydown", keyDown) end elseif menu_count==2 then text("PULSA TECLA PER A ESQUERRA", 14, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 3 keyLeft=k config.key("keleft", keyLeft) end elseif menu_count==3 then text("PULSA TECLA PER A DRETA", 20, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 4 keyRight=k config.key("keyright", keyRight) end elseif menu_count==4 then text("PULSA TECLA PER A BOTAR", 20, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 5 keyJump=k config.key("keyjump", keyJump) end elseif menu_count==5 then text("PULSA TECLA PER A DISPAR", 18, 24, 13) local k = key.press(); if k ~= 0 and k~=key.ESCAPE then menu_count = 0 menu_state = 0 keyShoot=k config.key("keyshoot", keyShoot) end end else if key.press(key.ESCAPE) then menu_count = 0 menu_state = 0 end if menu_count==0 then text("PULSA BOTÓ PER A AMUNT", 22, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 1 btnUp=btn config.key("btnup", btnUp) end elseif menu_count==1 then text("PULSA BOTÓ PER A AVALL", 22, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 2 btnDown=btn config.key("btndown", btnDown) end elseif menu_count==2 then text("PULSA BOTÓ PER A ESQUERRA", 16, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 3 btnLeft=btn config.key("keleft", btnLeft) end elseif menu_count==3 then text("PULSA BOTÓ PER A DRETA", 22, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 4 btnRight=btn config.key("btnright", btnRight) end elseif menu_count==4 then text("PULSA BOTÓ PER A BOTAR", 22, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 5 btnJump=btn config.key("btnjump", btnJump) end elseif menu_count==5 then text("PULSA BOTÓ PER A DISPAR", 20, 24, 13) local btn = pad.press(); if btn ~= -1 then menu_count = 0 menu_state = 0 btnShoot=btn config.key("btnshoot", btnShoot) end end end end function game_exit() mapa_restore_backup() actors={} cameras={} end function aabb(a, b) return (a.x+a.bb.x+a.bb.w >= b.x+b.bb.x) and (a.x+a.bb.x <= b.x+b.bb.x+b.bb.w) and (a.y+a.bb.y+a.bb.h >= b.y+b.bb.y) and (a.y+a.bb.y <= b.y+b.bb.y+b.bb.h) end function 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,30,15) if pausa_option==1 then draw.rect(28,48,73,9,13) else draw.rect(28,58,73,9,13) end draw.text("CONTINUAR",30,50,14) draw.text("EIXIR",30,60,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 key.press(keyUp) or pad.press(btnDown) or pad.press(btnUp) then if pausa_option==1 then pausa_option=2 else pausa_option=1 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 else game_exit() game_init(true) end end end