mirror of
https://github.com/libretro/lutro-platformer.git
synced 2024-11-23 08:09:51 +00:00
204 lines
5.8 KiB
Lua
204 lines
5.8 KiB
Lua
require "global"
|
|
require "tiled"
|
|
require "anim"
|
|
require "ninja"
|
|
require "obake"
|
|
require "coin"
|
|
require "bigcoin"
|
|
require "porc"
|
|
require "demon"
|
|
require "elevator"
|
|
require "shuriken"
|
|
require "fireball"
|
|
require "sword"
|
|
|
|
function lutro.conf(t)
|
|
t.width = SCREEN_WIDTH
|
|
t.height = SCREEN_HEIGHT
|
|
end
|
|
|
|
local add_entity_from_map = function(object)
|
|
if object.type == "ground" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "slopeleft" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "sloperight" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "bridge" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "stopper" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "elevator" then
|
|
table.insert(entities, newElevator(object))
|
|
elseif object.type == "spikes" then
|
|
table.insert(entities, object)
|
|
elseif object.type == "coin" then
|
|
table.insert(entities, newCoin(object))
|
|
elseif object.type == "bigcoin" then
|
|
table.insert(entities, newBigcoin(object))
|
|
elseif object.type == "porc" then
|
|
table.insert(entities, newPorc(object))
|
|
elseif object.type == "demon" then
|
|
table.insert(entities, newDemon(object))
|
|
elseif object.type == "obake" then
|
|
table.insert(entities, newObake(object))
|
|
elseif object.type == "ninja" then
|
|
ninja = newNinja(object)
|
|
table.insert(entities, ninja)
|
|
end
|
|
end
|
|
|
|
function entities_remove(entity)
|
|
for i=1, #entities do
|
|
if entities[i] == entity then
|
|
table.remove(entities, i)
|
|
end
|
|
end
|
|
end
|
|
|
|
function lutro.load()
|
|
camera_x = 0
|
|
camera_y = 0
|
|
camera_x_offset = 0
|
|
camera_y_offset = 0
|
|
gold = 0
|
|
hp = 3
|
|
screen_shake = 0
|
|
|
|
lutro.graphics.setBackgroundColor(0, 0, 0)
|
|
|
|
bg0 = lutro.graphics.newImage("assets/forestbackground0.png")
|
|
bg1 = lutro.graphics.newImage("assets/forestbackground1.png")
|
|
bg2 = lutro.graphics.newImage("assets/forestbackground2.png")
|
|
|
|
barfont = lutro.graphics.newImageFont("assets/barfont.png", "0123456789 xGHh")
|
|
lutro.graphics.setFont(barfont)
|
|
|
|
map = tiled_load("assets/slopes.json")
|
|
tiled_load_objects(map, add_entity_from_map)
|
|
|
|
sfx_coin = lutro.audio.newSource("assets/coin.wav", "static")
|
|
sfx_jump = lutro.audio.newSource("assets/jump.wav", "static")
|
|
sfx_step = lutro.audio.newSource("assets/step.wav", "static")
|
|
sfx_hit = lutro.audio.newSource("assets/hit.wav", "static")
|
|
sfx_porc = lutro.audio.newSource("assets/porc.wav", "static")
|
|
sfx_dead = lutro.audio.newSource("assets/dead.wav", "static")
|
|
sfx_throw = lutro.audio.newSource("assets/throw.wav", "static")
|
|
sfx_gameover = lutro.audio.newSource("assets/gameover.wav", "static")
|
|
sfx_enemyhit = lutro.audio.newSource("assets/enemyhit.wav", "static")
|
|
sfx_enemydie = lutro.audio.newSource("assets/enemydie.wav", "static")
|
|
sfx_porchit = lutro.audio.newSource("assets/porchit.wav", "static")
|
|
sfx_porcdie = lutro.audio.newSource("assets/porcdie.wav", "static")
|
|
sfx_shurikencollide = lutro.audio.newSource("assets/shurikencollide.wav", "static")
|
|
sfx_fireballspit = lutro.audio.newSource("assets/fireballspit.wav", "static")
|
|
sfx_fireballcollide = lutro.audio.newSource("assets/fireballcollide.wav", "static")
|
|
sfx_airgather = lutro.audio.newSource("assets/airgather.wav", "static")
|
|
end
|
|
|
|
RETRO_DEVICE_ID_JOYPAD_B = 1
|
|
RETRO_DEVICE_ID_JOYPAD_Y = 2
|
|
RETRO_DEVICE_ID_JOYPAD_SELECT = 3
|
|
RETRO_DEVICE_ID_JOYPAD_START = 4
|
|
RETRO_DEVICE_ID_JOYPAD_UP = 5
|
|
RETRO_DEVICE_ID_JOYPAD_DOWN = 6
|
|
RETRO_DEVICE_ID_JOYPAD_LEFT = 7
|
|
RETRO_DEVICE_ID_JOYPAD_RIGHT = 8
|
|
RETRO_DEVICE_ID_JOYPAD_A = 9
|
|
RETRO_DEVICE_ID_JOYPAD_X = 10
|
|
RETRO_DEVICE_ID_JOYPAD_L = 11
|
|
RETRO_DEVICE_ID_JOYPAD_R = 12
|
|
RETRO_DEVICE_ID_JOYPAD_L2 = 13
|
|
RETRO_DEVICE_ID_JOYPAD_R2 = 14
|
|
RETRO_DEVICE_ID_JOYPAD_L3 = 15
|
|
RETRO_DEVICE_ID_JOYPAD_R3 = 16
|
|
|
|
function lutro.update(dt)
|
|
JOY_LEFT = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_LEFT)
|
|
JOY_RIGHT = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_RIGHT)
|
|
JOY_DOWN = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_DOWN)
|
|
JOY_A = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_A)
|
|
JOY_B = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_B)
|
|
JOY_X = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_X)
|
|
JOY_Y = lutro.joystick.isDown(1, RETRO_DEVICE_ID_JOYPAD_Y)
|
|
|
|
if screen_shake > 0 then
|
|
screen_shake = screen_shake - 1
|
|
end
|
|
|
|
if hp > 0 then
|
|
--if screen_shake == 0 then
|
|
for i=1, #entities do
|
|
if entities[i] and entities[i].update then
|
|
entities[i]:update(dt)
|
|
end
|
|
end
|
|
--end
|
|
else
|
|
ninja:update(dt)
|
|
end
|
|
|
|
detect_collisions()
|
|
|
|
-- camera
|
|
camera_x = - ninja.x + SCREEN_WIDTH/2 - ninja.width/2;
|
|
if ninja.direction == "right" then
|
|
if JOY_RIGHT and camera_x_offset > -48 then
|
|
camera_x_offset = camera_x_offset - 1
|
|
end
|
|
else
|
|
if JOY_LEFT and camera_x_offset < 48 then
|
|
camera_x_offset = camera_x_offset + 1
|
|
end
|
|
end
|
|
camera_x = camera_x + camera_x_offset
|
|
if camera_x > 0 then
|
|
camera_x = 0
|
|
end
|
|
if camera_x < -(map.width * map.tilewidth) + SCREEN_WIDTH then
|
|
camera_x = -(map.width * map.tilewidth) + SCREEN_WIDTH
|
|
end
|
|
end
|
|
|
|
function lutro.draw()
|
|
-- Shake camera if hit
|
|
local shake_x = 0
|
|
local shake_y = 0
|
|
if screen_shake > 0 then
|
|
shake_x = 5*(math.random()-0.5)
|
|
shake_y = 5*(math.random()-0.5)
|
|
end
|
|
|
|
lutro.graphics.clear()
|
|
|
|
for i=0, 4 do
|
|
lutro.graphics.draw(bg2, i*bg2:getWidth() + camera_x / 8, 0)
|
|
lutro.graphics.draw(bg1, i*bg1:getWidth() + camera_x / 4, 0)
|
|
lutro.graphics.draw(bg0, i*bg0:getWidth() + camera_x / 2, 0)
|
|
end
|
|
|
|
lutro.graphics.push()
|
|
|
|
lutro.graphics.translate(camera_x + shake_x, camera_y + shake_y)
|
|
|
|
tiled_draw_layer(map.layers[1])
|
|
tiled_draw_layer(map.layers[2])
|
|
for i=1, #entities do
|
|
if entities[i].draw then
|
|
entities[i]:draw(dt)
|
|
end
|
|
end
|
|
|
|
lutro.graphics.pop()
|
|
|
|
local bar = ""
|
|
for i=1, 3 do
|
|
if i <= hp then
|
|
bar = bar .. "H"
|
|
else
|
|
bar = bar .. "h"
|
|
end
|
|
end
|
|
lutro.graphics.print(bar, 3, 2)
|
|
lutro.graphics.printf(gold .. "xG", -1, 2, SCREEN_WIDTH, "right")
|
|
end
|