diff --git a/data/main.lua b/data/main.lua index 41ef2eb..1763eca 100644 --- a/data/main.lua +++ b/data/main.lua @@ -1,9 +1,9 @@ -require "app" -require "score" -require "rooms" -require "editor" -require "game" -require "palfade" +require "utils.app" +require "modules.score" +require "modules.rooms" +require "stages.editor" +require "stages.game" +require "utils.palfade" function reload_textures() diff --git a/data/animations.lua b/data/modules/animations.lua similarity index 100% rename from data/animations.lua rename to data/modules/animations.lua diff --git a/data/modules/ia/brick.lua b/data/modules/ia/brick.lua new file mode 100644 index 0000000..ade2e82 --- /dev/null +++ b/data/modules/ia/brick.lua @@ -0,0 +1,14 @@ + +function ia.update_brick(spr) + if spr.timeout > 0 then + spr.timeout = spr.timeout - 1 + if spr.timeout == 0 then + local tx, ty = spr.pos.x>>3, spr.pos.y>>3 + map.tile(tx,ty,0) + end + else + spr.pos.y = spr.pos.y + 2 + local tx, ty = (spr.pos.x+2)>>3, (spr.pos.y)>>3 + if rooms.is_outside(tx,ty) then sprites.remove(spr) return end + end +end diff --git a/data/modules/ia/bullet.lua b/data/modules/ia/bullet.lua new file mode 100644 index 0000000..24aef4d --- /dev/null +++ b/data/modules/ia/bullet.lua @@ -0,0 +1,29 @@ + +function ia.update_bullet(spr) + local tx, ty, ty2 = (spr.pos.x+2)>>3, (spr.pos.y+1)>>3, (spr.pos.y+2)>>3 + + if rooms.is_outside(tx,ty) then sprites.remove(spr) return end + + local x1,y1,w1,h1 = util.aabb(spr) + for i,v in ipairs(sprites.list) do + if v.enemy and v.state ~= templates.DEAD then + local x2,y2,w2,h2 = util.aabb(v) + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + if v.state == templates.ALIVE then v.state = templates.DYING end + sprites.remove(spr) + return + end + end + end + + if map.tile(tx,ty) < 16 or map.tile(tx,ty2) < 16 then + if spr.flipped then + spr.pos.x = spr.pos.x - 8 + else + spr.pos.x = spr.pos.x + 8 + end + else + sprites.remove(spr) + end +end + diff --git a/data/modules/ia/clau.lua b/data/modules/ia/clau.lua new file mode 100644 index 0000000..df066e3 --- /dev/null +++ b/data/modules/ia/clau.lua @@ -0,0 +1,15 @@ + +function ia.update_clau(spr) + if spr.state == templates.ALIVE then + local x1,y1,w1,h1 = util.aabb(spr) + local x2,y2,w2,h2 = util.aabb(sprites.hero) + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + if sprites.hero.give_key(spr.color) then + local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 + map.surf(rooms.surf_items) + map.tile(tx,ty,0) + sprites.remove(spr) + end + end + end +end diff --git a/data/modules/ia/coin.lua b/data/modules/ia/coin.lua new file mode 100644 index 0000000..2cbc399 --- /dev/null +++ b/data/modules/ia/coin.lua @@ -0,0 +1,26 @@ + +function ia.update_coin(spr) + if spr.state == templates.ALIVE then + local x1,y1,w1,h1 = util.aabb(spr) + local x2,y2,w2,h2 = util.aabb(sprites.hero) + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 + map.surf(rooms.surf_items) + map.tile(tx,ty,0) + + spr.state = templates.DYING + sprites.set_animation(spr, "coin_picked") + spr.pos.y=spr.pos.y-16 + spr.pos.x=spr.pos.x-4 + spr.timer = 0 + score.inc(10) + return + end + elseif spr.state == templates.DYING then + spr.pos.y = spr.pos.y - 0.5 + spr.timer = spr.timer + 1 + if spr.timer == 32 then + sprites.remove(spr) + end + end +end diff --git a/data/modules/ia/hero.lua b/data/modules/ia/hero.lua new file mode 100644 index 0000000..29061b4 --- /dev/null +++ b/data/modules/ia/hero.lua @@ -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 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>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>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 diff --git a/data/modules/ia/mummy.lua b/data/modules/ia/mummy.lua new file mode 100644 index 0000000..1471e6a --- /dev/null +++ b/data/modules/ia/mummy.lua @@ -0,0 +1,49 @@ + +function ia.update_mummy(spr) + map.surf(rooms.surf_foreground) + if spr.state == templates.ALIVE then + if sprites.hero.state == templates.ALIVE then + local x1,y1,w1,h1 = util.aabb(spr) -- El meu aabb + local x2,y2,w2,h2 = util.aabb(sprites.hero) -- el aabb del heroi + -- Si toca al heroi... + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + sprites.hero.hit() + end + end + + if spr.flipped then + local tx, ty = (spr.pos.x+3)>>3, (spr.pos.y+15)>>3 + if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then + spr.pos.x = spr.pos.x - 1 + else + spr.flipped = not spr.flipped + end + else + local tx, ty = (spr.pos.x+12)>>3, (spr.pos.y+15)>>3 + if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then + spr.pos.x = spr.pos.x + 1 + else + spr.flipped = not spr.flipped + end + end + elseif spr.state == templates.DYING then + if spr.animation ~= "mummy_dying" then + sprites.set_animation(spr, "mummy_dying") + else + if spr.current_frame == 8 then + sprites.set_animation(spr, "mummy_dead") + spr.state = templates.DEAD + end + end + elseif spr.state == templates.DEAD then + if spr.current_wait == 1 then + sprites.set_animation(spr, "mummy_undying") + spr.state = templates.RESURRECTING + end + elseif spr.state == templates.RESURRECTING then + if spr.current_frame == 13 then + sprites.set_animation(spr, "mummy_walk") + spr.state = templates.ALIVE + end + end +end diff --git a/data/modules/ia/porta.lua b/data/modules/ia/porta.lua new file mode 100644 index 0000000..e76c9a6 --- /dev/null +++ b/data/modules/ia/porta.lua @@ -0,0 +1,24 @@ + +function ia.update_porta(spr) + if spr.state == templates.ALIVE then + local x1,y1,w1,h1 = util.aabb(spr) + local x2,y2,w2,h2 = util.aabb(sprites.hero) + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + if sprites.hero.keys[spr.color] then + sprites.hero.keys[spr.color] = nil + sprites.set_animation(spr, "porta_obrint") + spr.state = templates.DYING + end + end + elseif spr.state == templates.DYING then + if spr.current_frame == 15 then + local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 + map.surf(rooms.surf_items) + map.tile(tx,ty,0) + map.surf(rooms.surf_foreground) + map.tile(tx,ty,0) + map.tile(tx,ty+1,0) + sprites.remove(spr) + end + end +end diff --git a/data/modules/ia/sucubo.lua b/data/modules/ia/sucubo.lua new file mode 100644 index 0000000..370184a --- /dev/null +++ b/data/modules/ia/sucubo.lua @@ -0,0 +1,36 @@ + +function ia.update_sucubo(spr) + map.surf(rooms.surf_foreground) + if spr.state == templates.ALIVE then + if sprites.hero.state == templates.ALIVE then + local x1,y1,w1,h1 = util.aabb(spr) -- El meu aabb + local x2,y2,w2,h2 = util.aabb(sprites.hero) -- el aabb del heroi + -- Si toca al heroi... + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + sprites.hero.hit() + end + end + + elseif spr.state == templates.DYING then + if spr.animation ~= "mummy_dying" then + sprites.set_animation(spr, "mummy_dying") + spr.surf = surf.load("gfx/mummy.gif") + else + if spr.current_frame == 8 then + sprites.set_animation(spr, "mummy_dead") + spr.state = templates.DEAD + end + end + elseif spr.state == templates.DEAD then + if spr.current_wait == 1 then + sprites.set_animation(spr, "mummy_undying") + spr.state = templates.RESURRECTING + end + elseif spr.state == templates.RESURRECTING then + if spr.current_frame == 13 then + sprites.set_animation(spr, "sucubo_stand") + spr.surf = surf.load("gfx/sucubo.gif") + spr.state = templates.ALIVE + end + end +end diff --git a/data/modules/ia/torxa.lua b/data/modules/ia/torxa.lua new file mode 100644 index 0000000..da69d43 --- /dev/null +++ b/data/modules/ia/torxa.lua @@ -0,0 +1,19 @@ + +function ia.update_torxa(spr) + if spr.state == templates.ALIVE then + if sprites.hero.lives == 4 then return end + local x1,y1,w1,h1 = util.aabb(spr) + local x2,y2,w2,h2 = util.aabb(sprites.hero) + if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then + sprites.hero.hit(4) + spr.state = templates.DYING + spr.timer = 0 + return + end + elseif spr.state == templates.DYING then + spr.timer = spr.timer + 1 + if spr.timer == 32 then + spr.state = templates.ALIVE + end + end +end diff --git a/data/items.lua b/data/modules/items.lua similarity index 100% rename from data/items.lua rename to data/modules/items.lua diff --git a/data/menu.lua b/data/modules/menu.lua similarity index 99% rename from data/menu.lua rename to data/modules/menu.lua index f27168e..1997af5 100644 --- a/data/menu.lua +++ b/data/modules/menu.lua @@ -1,4 +1,4 @@ -require "ui" +require "..utils.ui" menu = { hidden = true, diff --git a/data/rooms.lua b/data/modules/rooms.lua similarity index 100% rename from data/rooms.lua rename to data/modules/rooms.lua diff --git a/data/score.lua b/data/modules/score.lua similarity index 100% rename from data/score.lua rename to data/modules/score.lua diff --git a/data/modules/sprites.lua b/data/modules/sprites.lua new file mode 100644 index 0000000..46ee096 --- /dev/null +++ b/data/modules/sprites.lua @@ -0,0 +1,218 @@ +require "animations" +require "templates" + +sprites = { + hero = nil, + list = {}, + pause_ia = false, +} + +function sprites.remove(sprite) + for i,v in ipairs(sprites.list) do + if v == sprite then + table.remove(sprites.list, i) + print("Sprite removed: "..sprite.type) + return + end + end +end + +function sprites.remove_out_of_room() + --print("Current room: "..rooms.current()) + --for i,v in ipairs(sprites.list) do + -- if v.room ~= rooms.current() then + -- table.remove(sprites.list, i) + -- local room = v.room or 0 + -- print("Sprite at room "..room.." removed: "..v.type) + -- end + --end +end + +function sprites.add_from_room(rx,ry) + sprites.list = {} + map.surf(rooms.surf_items) + for y = ry, ry+11 do + for x = rx, rx+19 do + if map.tile(x,y) ~= 0 then + local room = (rx//20) + (ry//12) * 8 + local item = map.tile(x,y) + local flip = item > 0x7f + item = item & 0x7f + io.write("crear "..items[item].name.." en hab "..room.." ("..x..","..y..")...\n") + table.insert(sprites.list, templates.create(items[item].name, {pos={x=x*8, y=y*8},flipped=flip, room=room})) + end + end + end +end + +function sprites.init() + sprites.hero = { + type = "hero", + pos = { x=28, y=4*13*8+79 }, + size= { w=16, h=17 }, + bbo = { left=3, top=2, right=3, bottom=0 }, + current_frame = 1, + current_wait = 1, + flipped = false, + surf = surf.load("gfx/morcus.gif"), + animation = "hero_stand", + ia = ia.update_hero, + state = templates.ALIVE, + jumping = 0, + light = 100, + light_ox = 8, + light_oy = 8, + cooldown = 0, + jump_throttle = 0, + lives = 4, + keys = {}, + stairs = false, + hit = ia.hero_hit, + give_key = ia.hero_give_key + } +end + +function sprites.set_animation(sprite, animation) + if sprite.animation ~= animation then + sprite.animation_finished = nil + sprite.animation = animation + sprite.current_frame = 1 + local cycle = animations[sprite.animation].cycle[1] + sprite.current_wait = animations[sprite.animation].frames[cycle].wait + end +end + +function sprites.update() + if not sys.beat() then return end + + sprites.update_sprite(sprites.hero) + for i,v in ipairs(sprites.list) do + sprites.update_sprite(v) + end + if not sprites.pause_ia then + sprites.hero.ia() + for i,v in ipairs(sprites.list) do + v.ia(v) + end + end +end + +function sprites.update_sprite(sprite) + if sprite.animation_finished then return end + + sprite.current_wait = sprite.current_wait - 1 + if sprite.current_wait == 0 then + if sprite.current_frame < #animations[sprite.animation].cycle then + sprite.current_frame = sprite.current_frame + 1 + else + if animations[sprite.animation].loop then + sprite.current_frame = 1 + else + sprite.animation_finished = true + end + end + local cycle = animations[sprite.animation].cycle[sprite.current_frame] + sprite.current_wait = animations[sprite.animation].frames[cycle].wait + end +end + +function sprites.lights_out() + for i,spr in ipairs(sprites.list) do + if spr.light then + tweening.add(spr.light,0,0.5,easing.linear, + function(value,n,finished) + spr.light = value + if finished then + spr.light = nil + end + end + ) + end + end + tweening.add(sprites.hero.light,0,0.5,easing.linear, + function(value,n,finished) + sprites.hero.light = value + if finished then + sprites.hero.light = nil + end + end + ) +end + +function sprites.draw(ignore_selected) + if app.update ~= editor.update then + surf.target(game.circ_buf) + surf.cls() + surf.target(game.back_buf) + end + + editor.item_hovered = nil + local mx,my = mouse.pos() + if (app.update == editor.update) and (editor.layer~=LAYER_ITEMS) then ignore_selected = true end + for i,v in ipairs(sprites.list) do + if not ignore_selected and app.update == editor.update and mx>=v.pos.x and mx<=v.pos.x+v.size.w and my>=v.pos.y and my<=v.pos.y+v.size.h then + editor.item_hovered = i + if editor.item_dragged == editor.item_hovered then + draw.mode(draw.PATTERN) + draw.pattern(editor.ants) + end + sprites.draw_sprite_selected(v) + draw.mode(draw.NORMAL) + else + if (not ignore_selected) or (not v.no_shadow) or (app.update ~= game.update) then + sprites.draw_sprite(v) + end + end + end + sprites.draw_sprite(sprites.hero) +end + +function sprites.draw_sprite(sprite) + local cycle = animations[sprite.animation].cycle[sprite.current_frame] + local frame = animations[sprite.animation].frames[cycle] + local ox, oy = 0, 0 + if frame.offset then + if sprite.flipped then + if frame.offset.flipped then ox,oy = frame.offset.flipped.x,frame.offset.flipped.y end + else + if frame.offset.normal then ox,oy = frame.offset.normal.x,frame.offset.normal.y end + end + end + + if not frame then + print(sprite.current_frame) + end + local reversed = frame.reversed or false + if not sprite.invisible then + surf.source(sprite.surf) + draw.surf(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h, sprite.pos.x+ox, sprite.pos.y+oy, frame.frame.w, frame.frame.h, (not reversed) ~= (not sprite.flipped)) + end + if cheats.showaabb then + local x,y,w,h = util.aabb(sprite) + draw.rect(x,y,w,h,8) + end + if (app.update ~= editor.update) and (sprite.light) then + game.draw_light(sprite.pos.x+sprite.light_ox, sprite.pos.y+sprite.light_oy,sprite.light) + end +end + +function sprites.draw_sprite_selected(sprite) + pal.subpal(0,32,28) + + local cycle = animations[sprite.animation].cycle[sprite.current_frame] + local frame = animations[sprite.animation].frames[cycle] + local reversed = frame.reversed or false + local x, y, w, h, sx, sy, f = sprite.pos.x, sprite.pos.y, frame.frame.w, frame.frame.h, frame.frame.x, frame.frame.y, (not reversed) ~= (not sprite.flipped) + surf.source(sprite.surf) + draw.surf(sx, sy, w, h, x-1, y-1, w, h, f) + draw.surf(sx, sy, w, h, x, y-1, w, h, f) + draw.surf(sx, sy, w, h, x+1, y-1, w, h, f) + draw.surf(sx, sy, w, h, x-1, y, w, h, f) + draw.surf(sx, sy, w, h, x+1, y, w, h, f) + draw.surf(sx, sy, w, h, x-1, y+1, w, h, f) + draw.surf(sx, sy, w, h, x, y, w, h, f) + draw.surf(sx, sy, w, h, x+1, y+1, w, h, f) + pal.subpal() + draw.mode(draw.NORMAL) + draw.surf(sx, sy, w, h, x, y, w, h, f) +end diff --git a/data/templates.lua b/data/modules/templates.lua similarity index 93% rename from data/templates.lua rename to data/modules/templates.lua index e294de8..a775952 100644 --- a/data/templates.lua +++ b/data/modules/templates.lua @@ -1,3 +1,7 @@ +ia = {} + +require "ia.*" + templates = { ALIVE = 0, DYING = 1, @@ -23,7 +27,7 @@ function me.create(type, options) state = me.ALIVE, enemy = true, room = options.room, - ia = sprites.update_mummy + ia = ia.update_mummy } elseif key == "bullet" then sprite = { @@ -36,7 +40,7 @@ function me.create(type, options) flipped = options.flipped, surf = surf.load("gfx/morcus.gif"), animation = "bullet", - ia = sprites.update_bullet + ia = ia.update_bullet } elseif key == "coin" then sprite = { @@ -54,7 +58,7 @@ function me.create(type, options) light = 15, light_ox = 4, light_oy = 4, - ia = sprites.update_coin + ia = ia.update_coin } elseif key == "brick" then sprite = { @@ -69,7 +73,7 @@ function me.create(type, options) animation = "brick", state = me.ALIVE, timeout = 10, - ia = sprites.update_brick + ia = ia.update_brick } elseif key == "torxa" then sprite = { @@ -87,7 +91,7 @@ function me.create(type, options) light_ox = 4, light_oy = 4, no_shadow = true, - ia = sprites.update_torxa + ia = ia.update_torxa } elseif key == "clau" then sprite = { @@ -105,7 +109,7 @@ function me.create(type, options) light = 15, light_ox = 7, light_oy = 4, - ia = sprites.update_clau + ia = ia.update_clau } elseif key == "porta" then sprite = { @@ -120,7 +124,7 @@ function me.create(type, options) surf = surf.load("gfx/"..value..".gif"), animation = "porta", state = me.ALIVE, - ia = sprites.update_porta + ia = ia.update_porta } elseif key == "sucubo" then sprite = { @@ -137,7 +141,7 @@ function me.create(type, options) timer = 0, enemy = true, room = options.room, - ia = sprites.update_sucubo + ia = ia.update_sucubo } else error("Template not recognized") diff --git a/data/sprites.lua b/data/sprites.lua deleted file mode 100644 index 5093bce..0000000 --- a/data/sprites.lua +++ /dev/null @@ -1,680 +0,0 @@ -require "animations" -require "templates" - -sprites = { - hero = nil, - list = {}, - pause_ia = false, - - remove = function(sprite) - for i,v in ipairs(sprites.list) do - if v == sprite then - table.remove(sprites.list, i) - print("Sprite removed: "..sprite.type) - return - end - end - end, - - remove_out_of_room = function() - --print("Current room: "..rooms.current()) - --for i,v in ipairs(sprites.list) do - -- if v.room ~= rooms.current() then - -- table.remove(sprites.list, i) - -- local room = v.room or 0 - -- print("Sprite at room "..room.." removed: "..v.type) - -- end - --end - end, - - add_from_room = function(rx,ry) - sprites.list = {} - map.surf(rooms.surf_items) - for y = ry, ry+11 do - for x = rx, rx+19 do - if map.tile(x,y) ~= 0 then - local room = (rx//20) + (ry//12) * 8 - local item = map.tile(x,y) - local flip = item > 0x7f - item = item & 0x7f - io.write("crear "..items[item].name.." en hab "..room.." ("..x..","..y..")...\n") - table.insert(sprites.list, templates.create(items[item].name, {pos={x=x*8, y=y*8},flipped=flip, room=room})) - end - end - --io.write("\n") - end - end, - - init = function() - sprites.hero = { - type = "hero", - pos = { x=28, y=4*13*8+79 }, - size= { w=16, h=17 }, - bbo = { left=3, top=2, right=3, bottom=0 }, - current_frame = 1, - current_wait = 1, - flipped = false, - surf = surf.load("gfx/morcus.gif"), - animation = "hero_stand", - ia = sprites.update_hero, - state = templates.ALIVE, - jumping = 0, - light = 100, - light_ox = 8, - light_oy = 8, - cooldown = 0, - jump_throttle = 0, - lives = 4, - keys = {}, - stairs = false - } - --table.insert(sprites.list, templates.create("mummy", {pos={x=100, y=4*12*8+71},flipped=true})) - - --local mummy = { - -- pos = { x=100, y=4*12*8+71 }, - -- size = { w=16,h=17 }, - -- bbo = { left=3, top=2, right=3, bottom=0 }, - -- current_frame = 1, - -- current_wait = 1, - -- flipped = true, - -- animation = "mummy_walk", - -- ia = sprites.update_mummy - --} - --table.insert(sprites.list, mummy) - end, - - set_animation=function(sprite, animation) - if sprite.animation ~= animation then - sprite.animation_finished = nil - sprite.animation = animation - sprite.current_frame = 1 - local cycle = animations[sprite.animation].cycle[1] - sprite.current_wait = animations[sprite.animation].frames[cycle].wait - end - end, - - check_sprite_collision = function() - return false - end, - - check_tile_collision = function() - - end, - - update = function() - if not sys.beat() then return end - - sprites.update_sprite(sprites.hero) - for i,v in ipairs(sprites.list) do - sprites.update_sprite(v) - end - if not sprites.pause_ia then - sprites.hero.ia() - for i,v in ipairs(sprites.list) do - v.ia(v) - end - end - end, - - update_sprite = function(sprite) - if sprite.animation_finished then return end - - sprite.current_wait = sprite.current_wait - 1 - if sprite.current_wait == 0 then - if sprite.current_frame < #animations[sprite.animation].cycle then - sprite.current_frame = sprite.current_frame + 1 - else - if animations[sprite.animation].loop then - sprite.current_frame = 1 - else - sprite.animation_finished = true - end - end - local cycle = animations[sprite.animation].cycle[sprite.current_frame] - sprite.current_wait = animations[sprite.animation].frames[cycle].wait - end - end, - - hero_hit = function(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, - - hero_give_key = function(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, - - lights_out = function() - for i,spr in ipairs(sprites.list) do - if spr.light then - tweening.add(spr.light,0,0.5,easing.linear, - function(value,n,finished) - spr.light = value - if finished then - spr.light = nil - end - end - ) - end - end - tweening.add(sprites.hero.light,0,0.5,easing.linear, - function(value,n,finished) - sprites.hero.light = value - if finished then - sprites.hero.light = nil - end - end - ) - end, - - update_mummy = function(spr) - map.surf(rooms.surf_foreground) - if spr.state == templates.ALIVE then - if sprites.hero.state == templates.ALIVE then - local x1,y1,w1,h1 = util.aabb(spr) -- El meu aabb - local x2,y2,w2,h2 = util.aabb(sprites.hero) -- el aabb del heroi - -- Si toca al heroi... - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - sprites.hero_hit() - end - end - - if spr.flipped then - local tx, ty = (spr.pos.x+3)>>3, (spr.pos.y+15)>>3 - if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then - spr.pos.x = spr.pos.x - 1 - else - spr.flipped = not spr.flipped - end - else - local tx, ty = (spr.pos.x+12)>>3, (spr.pos.y+15)>>3 - if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 and map.tile(tx,ty+1) > 0 then - spr.pos.x = spr.pos.x + 1 - else - spr.flipped = not spr.flipped - end - end - elseif spr.state == templates.DYING then - if spr.animation ~= "mummy_dying" then - sprites.set_animation(spr, "mummy_dying") - else - if spr.current_frame == 8 then - sprites.set_animation(spr, "mummy_dead") - spr.state = templates.DEAD - end - end - elseif spr.state == templates.DEAD then - if spr.current_wait == 1 then - sprites.set_animation(spr, "mummy_undying") - spr.state = templates.RESURRECTING - end - elseif spr.state == templates.RESURRECTING then - if spr.current_frame == 13 then - sprites.set_animation(spr, "mummy_walk") - spr.state = templates.ALIVE - end - end - end, - - update_bullet = function(spr) - local tx, ty, ty2 = (spr.pos.x+2)>>3, (spr.pos.y+1)>>3, (spr.pos.y+2)>>3 - - if rooms.is_outside(tx,ty) then sprites.remove(spr) return end - - local x1,y1,w1,h1 = util.aabb(spr) - for i,v in ipairs(sprites.list) do - if v.enemy and v.state ~= templates.DEAD then - local x2,y2,w2,h2 = util.aabb(v) - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - if v.state == templates.ALIVE then v.state = templates.DYING end - sprites.remove(spr) - return - end - end - end - - if map.tile(tx,ty) < 16 or map.tile(tx,ty2) < 16 then - if spr.flipped then - spr.pos.x = spr.pos.x - 8 - else - spr.pos.x = spr.pos.x + 8 - end - else - sprites.remove(spr) - end - end, - - update_coin = function(spr) - if spr.state == templates.ALIVE then - local x1,y1,w1,h1 = util.aabb(spr) - local x2,y2,w2,h2 = util.aabb(sprites.hero) - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 - map.surf(rooms.surf_items) - map.tile(tx,ty,0) - - spr.state = templates.DYING - sprites.set_animation(spr, "coin_picked") - spr.pos.y=spr.pos.y-16 - spr.pos.x=spr.pos.x-4 - spr.timer = 0 - score.inc(10) - return - end - elseif spr.state == templates.DYING then - spr.pos.y = spr.pos.y - 0.5 - spr.timer = spr.timer + 1 - if spr.timer == 32 then - sprites.remove(spr) - end - end - end, - - update_torxa = function(spr) - if spr.state == templates.ALIVE then - if sprites.hero.lives == 4 then return end - local x1,y1,w1,h1 = util.aabb(spr) - local x2,y2,w2,h2 = util.aabb(sprites.hero) - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - sprites.hero_hit(4) - spr.state = templates.DYING - spr.timer = 0 - return - end - elseif spr.state == templates.DYING then - spr.timer = spr.timer + 1 - if spr.timer == 32 then - spr.state = templates.ALIVE - end - end - end, - - update_clau = function(spr) - if spr.state == templates.ALIVE then - local x1,y1,w1,h1 = util.aabb(spr) - local x2,y2,w2,h2 = util.aabb(sprites.hero) - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - if sprites.hero_give_key(spr.color) then - local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 - map.surf(rooms.surf_items) - map.tile(tx,ty,0) - sprites.remove(spr) - end - end - end - end, - - update_porta = function(spr) - if spr.state == templates.ALIVE then - local x1,y1,w1,h1 = util.aabb(spr) - local x2,y2,w2,h2 = util.aabb(sprites.hero) - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - if sprites.hero.keys[spr.color] then - sprites.hero.keys[spr.color] = nil - sprites.set_animation(spr, "porta_obrint") - spr.state = templates.DYING - end - end - elseif spr.state == templates.DYING then - if spr.current_frame == 15 then - local tx, ty = (spr.pos.x)>>3, (spr.pos.y)>>3 - map.surf(rooms.surf_items) - map.tile(tx,ty,0) - map.surf(rooms.surf_foreground) - map.tile(tx,ty,0) - map.tile(tx,ty+1,0) - sprites.remove(spr) - end - end - end, - - update_brick = function(spr) - if spr.timeout > 0 then - spr.timeout = spr.timeout - 1 - if spr.timeout == 0 then - local tx, ty = spr.pos.x>>3, spr.pos.y>>3 - map.tile(tx,ty,0) - end - else - spr.pos.y = spr.pos.y + 2 - local tx, ty = (spr.pos.x+2)>>3, (spr.pos.y)>>3 - if rooms.is_outside(tx,ty) then sprites.remove(spr) return end - end - end, - - update_sucubo = function(spr) - map.surf(rooms.surf_foreground) - if spr.state == templates.ALIVE then - if sprites.hero.state == templates.ALIVE then - local x1,y1,w1,h1 = util.aabb(spr) -- El meu aabb - local x2,y2,w2,h2 = util.aabb(sprites.hero) -- el aabb del heroi - -- Si toca al heroi... - if util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) then - sprites.hero_hit() - end - end - - elseif spr.state == templates.DYING then - if spr.animation ~= "mummy_dying" then - sprites.set_animation(spr, "mummy_dying") - spr.surf = surf.load("gfx/mummy.gif") - else - if spr.current_frame == 8 then - sprites.set_animation(spr, "mummy_dead") - spr.state = templates.DEAD - end - end - elseif spr.state == templates.DEAD then - if spr.current_wait == 1 then - sprites.set_animation(spr, "mummy_undying") - spr.state = templates.RESURRECTING - end - elseif spr.state == templates.RESURRECTING then - if spr.current_frame == 13 then - sprites.set_animation(spr, "sucubo_stand") - spr.surf = surf.load("gfx/sucubo.gif") - spr.state = templates.ALIVE - end - end - end, - - update_hero = function() - - 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 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>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>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, - - draw = function(ignore_selected) - if app.update ~= editor.update then - surf.target(game.circ_buf) - surf.cls() - surf.target(game.back_buf) - end - - editor.item_hovered = nil - local mx,my = mouse.pos() - if (app.update == editor.update) and (editor.layer~=LAYER_ITEMS) then ignore_selected = true end - for i,v in ipairs(sprites.list) do - if not ignore_selected and app.update == editor.update and mx>=v.pos.x and mx<=v.pos.x+v.size.w and my>=v.pos.y and my<=v.pos.y+v.size.h then - editor.item_hovered = i - if editor.item_dragged == editor.item_hovered then - draw.mode(draw.PATTERN) - draw.pattern(editor.ants) - end - sprites.draw_sprite_selected(v) - draw.mode(draw.NORMAL) - else - if (not ignore_selected) or (not v.no_shadow) or (app.update ~= game.update) then - sprites.draw_sprite(v) - end - end - end - sprites.draw_sprite(sprites.hero) - end, - - draw_sprite = function(sprite) - local cycle = animations[sprite.animation].cycle[sprite.current_frame] - local frame = animations[sprite.animation].frames[cycle] - local ox, oy = 0, 0 - if frame.offset then - if sprite.flipped then - if frame.offset.flipped then ox,oy = frame.offset.flipped.x,frame.offset.flipped.y end - else - if frame.offset.normal then ox,oy = frame.offset.normal.x,frame.offset.normal.y end - end - end - - if not frame then - print(sprite.current_frame) - end - local reversed = frame.reversed or false - if not sprite.invisible then - surf.source(sprite.surf) - draw.surf(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h, sprite.pos.x+ox, sprite.pos.y+oy, frame.frame.w, frame.frame.h, (not reversed) ~= (not sprite.flipped)) - end - if cheats.showaabb then - local x,y,w,h = util.aabb(sprite) - draw.rect(x,y,w,h,8) - end - if (app.update ~= editor.update) and (sprite.light) then - game.draw_light(sprite.pos.x+sprite.light_ox, sprite.pos.y+sprite.light_oy,sprite.light) - end - end, - - draw_sprite_selected = function(sprite) - pal.subpal(0,32,28) - - local cycle = animations[sprite.animation].cycle[sprite.current_frame] - local frame = animations[sprite.animation].frames[cycle] - local reversed = frame.reversed or false - local x, y, w, h, sx, sy, f = sprite.pos.x, sprite.pos.y, frame.frame.w, frame.frame.h, frame.frame.x, frame.frame.y, (not reversed) ~= (not sprite.flipped) - surf.source(sprite.surf) - draw.surf(sx, sy, w, h, x-1, y-1, w, h, f) - draw.surf(sx, sy, w, h, x, y-1, w, h, f) - draw.surf(sx, sy, w, h, x+1, y-1, w, h, f) - draw.surf(sx, sy, w, h, x-1, y, w, h, f) - draw.surf(sx, sy, w, h, x+1, y, w, h, f) - draw.surf(sx, sy, w, h, x-1, y+1, w, h, f) - draw.surf(sx, sy, w, h, x, y, w, h, f) - draw.surf(sx, sy, w, h, x+1, y+1, w, h, f) - pal.subpal() - draw.mode(draw.NORMAL) - draw.surf(sx, sy, w, h, x, y, w, h, f) - end -} \ No newline at end of file diff --git a/data/editor.lua b/data/stages/editor.lua similarity index 99% rename from data/editor.lua rename to data/stages/editor.lua index 05b244c..50e8303 100644 --- a/data/editor.lua +++ b/data/stages/editor.lua @@ -1,6 +1,6 @@ -require "menu" -require "msgbox" -require "items" +require ":modules.menu" +require ":utils.msgbox" +require ":modules.items" editor = { diff --git a/data/game.lua b/data/stages/game.lua similarity index 98% rename from data/game.lua rename to data/stages/game.lua index fc5905d..2037f7a 100644 --- a/data/game.lua +++ b/data/stages/game.lua @@ -1,6 +1,6 @@ -require "palfade" -require "console" -require "tweening" +require ":utils.palfade" +require ":utils.console" +require ":utils.tweening" function test() tweening.add(40, 100, 1, easing.easeOutCubic, function(value, progress, finished) sprites.hero.light = value end) diff --git a/data/app.lua b/data/utils/app.lua similarity index 100% rename from data/app.lua rename to data/utils/app.lua diff --git a/data/console.lua b/data/utils/console.lua similarity index 100% rename from data/console.lua rename to data/utils/console.lua diff --git a/data/msgbox.lua b/data/utils/msgbox.lua similarity index 100% rename from data/msgbox.lua rename to data/utils/msgbox.lua diff --git a/data/palfade.lua b/data/utils/palfade.lua similarity index 89% rename from data/palfade.lua rename to data/utils/palfade.lua index 53eca06..bcf8652 100644 --- a/data/palfade.lua +++ b/data/utils/palfade.lua @@ -1,3 +1,5 @@ +require "util" + palfade = { original = {}, reddish = {}, @@ -9,12 +11,8 @@ function me.init() end end -function luminance(r, g, b) - return (0.2126*r + 0.7152*g + 0.0722*b)/255 -end - function me.reddish_limit(r, g, b) - local t = me.luminance(r, g, b) / 255 + local t = util.luminance(r, g, b) / 255 local R = 255 * t local G = g * (1 - t) @@ -24,7 +22,7 @@ function me.reddish_limit(r, g, b) end function me.fade_reddish_color(r, g, b, f) - local ff = math.min(1, f+me.luminance(r,g,b)) + local ff = math.min(1, f+util.luminance(r,g,b)) local R = math.floor(r*ff) local G = math.floor(g*f) local B = math.floor(b*f) diff --git a/data/tweening.lua b/data/utils/tweening.lua similarity index 100% rename from data/tweening.lua rename to data/utils/tweening.lua diff --git a/data/ui.lua b/data/utils/ui.lua similarity index 100% rename from data/ui.lua rename to data/utils/ui.lua diff --git a/data/util.lua b/data/utils/util.lua similarity index 88% rename from data/util.lua rename to data/utils/util.lua index 527c4fa..7274fc5 100644 --- a/data/util.lua +++ b/data/utils/util.lua @@ -22,3 +22,8 @@ end function util.check_aabb_collision(x1,y1,w1,h1, x2,y2,w2,h2) return ( x1 < x2 + w2 and x1 + w1 > x2 and y1 < y2 + h2 and y1 + h1 > y2 ) end + +function util.luminance(r, g, b) + return (0.2126*r + 0.7152*g + 0.0722*b)/255 +end +