581 lines
18 KiB
Lua
581 lines
18 KiB
Lua
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
|