- Reestructuració completa

This commit is contained in:
2026-03-12 21:04:15 +01:00
parent 6c5d7a305a
commit 88de5f262b
27 changed files with 696 additions and 707 deletions

232
data/modules/ia/hero.lua Normal file
View File

@@ -0,0 +1,232 @@
function ia.update_hero()
if sprites.hero.state == templates.DEAD then
if sprites.hero.cooldown > 0 then
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
local tile_under_me1 = map.tile(tx1,ty+2)
local tile_under_me2 = map.tile(tx2,ty+2)
if tile_under_me1 == 0 and tile_under_me2 == 0 then
if rooms.pos.y<84 and ty+2>rooms.pos.y+12 then
game.change_room(0,1)
else
if sprites.hero.cooldown % 4 == 0 then
sprites.hero.pos.y = sprites.hero.pos.y + 1
end
end
end
sprites.hero.cooldown = sprites.hero.cooldown - 1
if sprites.hero.cooldown == 0 then
sprites.lights_out()
end
end
return
end
-- Update hero
local anim = "hero_stand"
local move_anim = "hero_walk"
-- Si estem en cooldown desde l'ultim dispar, decrementem el contador
if sprites.hero.cooldown > 0 then
sprites.hero.cooldown = sprites.hero.cooldown - 1
end
-- Si estem en jump_throttle desde l'ultim bot, decrementem el contador
if sprites.hero.jump_throttle > 0 then
sprites.hero.jump_throttle = sprites.hero.jump_throttle - 1
end
if sprites.hero.state == templates.DYING then
if (sprites.hero.cooldown//5) % 2 == 0 then
sprites.hero.invisible = true
else
sprites.hero.invisible = nil
end
if sprites.hero.cooldown == 0 then
sprites.hero.state = templates.ALIVE
sprites.hero.invisible = nil
end
end
-- si està en l'animació de disparar, no podem fer res i eixim ja
if sprites.hero.shooting then
-- A no ser que siga l'ultim frame, en tal cas tornem a estar de peu i au
if sprites.hero.current_frame==3 then
sprites.hero.shooting = false
sprites.set_animation(sprites.hero, "hero_stand")
else
return
end
end
-- SI ESTÀ BOTANT...
if sprites.hero.jumping > 0 then
anim = "hero_jump"
move_anim = "hero_jump"
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
--draw.rect(tx1<<3,ty<<3,8,8,8)
--draw.rect(tx2<<3,ty<<3,8,8,28)
if map.tile(tx1,ty) == 0 and map.tile(tx2,ty) == 0 then
if ty+1<rooms.pos.y then
game.change_room(0,-1)
else
if sprites.hero.jumping > 1 then sprites.hero.pos.y = sprites.hero.pos.y - 1 end
end
else
sprites.hero.jumping = 0
sprites.hero.jump_throttle = 10
end
sprites.hero.jumping = sprites.hero.jumping - 1
else
-- SI NO ESTÀ BOTANT...
-- SI ESTÀ EN UNES ESCALERES...
local txm, ty = (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.y+8)>>3
if (map.tile(txm,ty) > 0 and map.tile(txm,ty) < 16) or (map.tile(txm,ty+1) > 0 and map.tile(txm,ty+1) < 16) then
anim = "hero_stairs_idle"
move_anim = "hero_stairs"
-- SI PULSA AMUNT...
if key.down(key.UP) or pad.down(pad.UP) then
anim = move_anim
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
if map.tile(tx1,ty) < 16 or map.tile(tx2,ty) < 16 then
if ty+1<rooms.pos.y then
game.change_room(0,-1)
else
sprites.hero.pos.y = sprites.hero.pos.y - 1
end
end
-- SI PULSA AVALL...
elseif key.down(key.DOWN) or pad.down(pad.DOWN) then
anim = move_anim
local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
if ty+2>rooms.pos.y+12 then
game.change_room(0,1)
else
sprites.hero.pos.y = sprites.hero.pos.y + 1
end
end
end
else
-- SI NO ESTÀ EN UNES ESCALERES...
local tx1, txm, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
-- SI ESTÀ CAIGUENT...
local tile_under_me1 = map.tile(tx1,ty+2)
local tile_under_me2 = map.tile(tx2,ty+2)
if tile_under_me1 == 0 and tile_under_me2 == 0 then
if rooms.pos.y<84 and ty+2>rooms.pos.y+12 then
game.change_room(0,1)
else
if sprites.hero.pos.y >= 808 then
sprites.hero.hit(0)
return
end
sprites.hero.pos.y = sprites.hero.pos.y + 2
end
else
-- SI NO ESTÀ CAIGUENT...
if tile_under_me1==84 then
map.tile(tx1,ty+2,68)
local broken_tile = templates.create("brick", {pos={x=tx1<<3, y=(ty+2)<<3}, flipped=sprites.hero.flipped})
table.insert(sprites.list, broken_tile)
end
if tile_under_me2==84 then
map.tile(tx2,ty+2,68)
local broken_tile = templates.create("brick", {pos={x=tx2<<3, y=(ty+2)<<3}, flipped=sprites.hero.flipped})
table.insert(sprites.list, broken_tile)
end
sprites.hero.pos.y = (ty<<3)-1
anim = "hero_stand"
-- SI ESTÀ SOBRE UNES ESCALERES I POLSA AVALL...
if (map.tile(txm,ty+2) < 16 and map.tile(txm,ty+2) > 0) then
if key.down(key.DOWN) or pad.down(pad.DOWN) then
anim = "hero_stairs"
--local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
--if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
sprites.hero.pos.x = (txm << 3)-4
sprites.hero.pos.y = sprites.hero.pos.y + 1
--end
end
end
-- SI POLSA BOTAR...
if ( key.down(key.X) or pad.down(pad.A) ) and sprites.hero.jump_throttle == 0 then
sprites.hero.jumping = 17
-- SI POLSA DISPAR...
elseif (sprites.hero.cooldown==0) and (key.down(key.Z) or pad.down(pad.B)) then
sprites.hero.shooting = true
sprites.hero.cooldown = 20
local bullet = templates.create("bullet", {pos={x=sprites.hero.pos.x, y=sprites.hero.pos.y+7}, flipped=sprites.hero.flipped})
table.insert(sprites.list, bullet)
anim = "hero_shoot"
end
end
end
end
-- ESTIGA COM ESTIGA, SI POLSA ESQUERRA O DRETA...
if not sprites.hero.shooting then
if key.down(key.LEFT) or pad.down(pad.LEFT) then
sprites.hero.flipped = true
anim = move_anim
local tx, ty = (sprites.hero.pos.x+3)>>3, (sprites.hero.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
if tx<rooms.pos.x then
game.change_room(-1,0)
else
sprites.hero.pos.x = sprites.hero.pos.x - 1
end
end
elseif key.down(key.RIGHT) or pad.down(pad.RIGHT) then
sprites.hero.flipped = false
anim = move_anim
local tx, ty = (sprites.hero.pos.x+12)>>3, (sprites.hero.pos.y+16)>>3
if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
if tx>rooms.pos.x+19 then
game.change_room(1,0)
else
sprites.hero.pos.x = sprites.hero.pos.x + 1
end
end
end
end
sprites.set_animation(sprites.hero, anim)
end
function ia.hero_hit(live)
live = live or sprites.hero.lives-1
local light_table = {[0]=20, 30, 50, 80, 100}
local red_table = {[0]=0, 0.25, 0.5, 0.75, 1}
if live==4 then
tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_white(value)end)
else
tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_red(value)end)
end
local start_light = light_table[sprites.hero.lives]
local start_red = red_table[sprites.hero.lives]
local end_light = light_table[live]
local end_red = red_table[live]
sprites.hero.lives = live
tweening.add(start_light,end_light,1,easing.linear,function(value,n,finished)sprites.hero.light = value end)
tweening.add(start_red,end_red,1,easing.linear,function(value,n,finished)palfade.fade_reddish(value)end)
if sprites.hero.lives == 0 then
sprites.hero.state = templates.DEAD
sprites.hero.surf = surf.load("gfx/mummy.gif")
sprites.set_animation(sprites.hero, "mummy_dying")
sprites.hero.jumping = 0
sprites.hero.cooldown = 120
elseif sprites.hero.lives < 4 then
sprites.hero.state = templates.DYING
sprites.hero.cooldown = 60
end
end
function ia.hero_give_key(color)
if sprites.hero.keys[color] then return false end
sprites.hero.keys[color] = true
tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_white(value)end)
return true
end