349 lines
7.4 KiB
Lua

-- input value constants
MOUSE_CLICK = 0
MOUSE_MOTION = 1
SDLK_BACKSPACE = 8
SDLK_RETURN = 13
SDLK_ESCAPE = 27
SDLK_SPACE = 32
SDLK_a = 97
SDLK_b = 98
SDLK_c = 99
SDLK_g = 103
SDLK_i = 105
SDLK_j = 106
SDLK_q = 113
SDLK_r = 114
SDLK_s = 115
SDLK_t = 116
SDLK_KP2 = 258
SDLK_KP4 = 260
SDLK_KP6 = 262
SDLK_KP8 = 264
SDLK_KP_ENTER = 271
SDLK_UP = 82 + 1073741824
SDLK_DOWN = 81 + 1073741824
SDLK_RIGHT = 79 + 1073741824
SDLK_LEFT = 80 + 1073741824
function trim_string(s)
return s:match'^%s*(.*%S)' or ''
end
function wait_for_input()
local input = nil
while input == nil do
canvas_update()
input = input_poll()
if input ~= nil then
break
end
end
return input
end
local g_should_exit = false
function clear_should_exit_flag()
g_should_exit = false
end
function should_exit()
return g_should_exit
end
function poll_for_input()
input = input_poll()
if input ~= nil then
if input == SDLK_ESCAPE then
g_should_exit = true
end
end
if engine_should_quit() == 1 then
g_should_exit = true
end
return input
end
function poll_for_key_or_button(cycles)
local input
if engine_should_quit() == 1 then
g_should_exit = true
return true
end
if cycles == nil then
input = input_poll()
if input ~= nil then
if input == SDLK_ESCAPE then
g_should_exit = true
end
return true
end
else
local i
for i=0,cycles,1 do
local input = input_poll()
if input ~= nil then
if input == SDLK_ESCAPE then
g_should_exit = true
end
return true
end
if engine_should_quit() == 1 then
g_should_exit = true
return true
end
canvas_update()
end
end
return false
end
function poll_for_esc(cycles)
local input
if cycles == nil then
input = input_poll()
if input ~= nil and input == SDLK_ESCAPE then
return true
end
if engine_should_quit() == 1 then
return true
end
else
local i
for i=0,cycles,1 do
local input = input_poll()
if input ~= nil and input == SDLK_ESCAPE then
return true
end
if engine_should_quit() == 1 then
return true
end
canvas_update()
end
end
return false
end
function fade_in(speed)
if speed == nil then
speed = 3
end
local i
for i=0x0,0xff,speed do
canvas_set_opacity(i)
canvas_update()
if engine_should_quit() == 1 then
return false
end
end
return false
end
function fade_out(speed)
if speed == nil then
speed = 3
end
local i
for i=0xff,0,-speed do
canvas_set_opacity(i)
canvas_update()
if engine_should_quit() == 1 then
return false
end
end
return false
end
function update_players(players, img_tbl)
local rand = math.random
players[1].image = img_tbl[1][rand(0,12)]
players[2].image = img_tbl[2][rand(0,8)]
players[3].image = img_tbl[3][rand(0,2)]
players[4].image = img_tbl[4][rand(0,6)]
players[5].image = img_tbl[5][rand(0,4)]
players[6].image = img_tbl[6][rand(0,2)]
players[7].image = img_tbl[7][rand(0,4)]
players[8].image = img_tbl[8][rand(0,4)]
players[9].image = img_tbl[9][rand(0,3)]
end
function create_player_sprite(image, x, y)
local sprite = sprite_new(image, x, y, true)
sprite.clip_x = 0
sprite.clip_y = 0
sprite.clip_w = 320
sprite.clip_h = 152
return sprite
end
function create_sprite(image, x, y)
local sprite = sprite_new(image, x, y, true)
sprite.clip_x = 0
sprite.clip_y = 24
sprite.clip_w = 320
sprite.clip_h = 128
return sprite
end
function create_firework(img_tbl)
local rand = math.random
local colour = rand(0,2)
local exp = {create_sprite(img_tbl[11][8*colour], rand(0,319), rand(0,127)), colour, 0}
return exp
end
function fireworks_update(exp_tbl, img_tbl)
local exp_finished = 0
local k,v
for k,v in pairs(exp_tbl) do
if v[3] == 7 then
v[1].visible = false
table.remove(exp_tbl, k)
exp_finished = exp_finished + 1
else
v[3] = v[3] + 1
v[1].image = img_tbl[11][8*v[2]+v[3]]
end
end
return exp_finished
end
function fireworks(img_tbl, logo)
local rand = math.random
local exp_tbl = {}
local exp_count = 0
local i
for i=0,125 do
if exp_count < 5 then
if rand(0,5) == 0 then
local exp = create_firework(img_tbl)
table.insert(exp_tbl, exp)
exp_count = exp_count + 1
sprite_move_to_front(logo)
play_sfx(12, false)
end
end
local num_finished = fireworks_update(exp_tbl, img_tbl)
exp_count = exp_count - num_finished
poll_for_esc(1)
end
--wait for remaining explosions to finish
while exp_count > 0 do
local num_finished = fireworks_update(exp_tbl, img_tbl)
exp_count = exp_count - num_finished
poll_for_esc(1)
end
poll_for_esc(10)
-- create final 30 explosions.
for i=1,30 do
local exp = create_firework(img_tbl)
table.insert(exp_tbl, exp)
exp_count = exp_count + 1
end
while exp_count > 0 do
local num_finished = fireworks_update(exp_tbl, img_tbl)
exp_count = exp_count - num_finished
poll_for_esc(1)
end
end
function display_image_table(img_tbl, x, y)
if x == nil then
x = 160
end
if y == nil then
y = 100
end
local sprite = sprite_new(nil, x, y, true)
local text_sprite = sprite_new(nil, 100, 180, true)
local i = 0
for k,v in pairs(img_tbl) do
if type(v) == "table" then
local j = 0
for l,m in pairs(v) do
local img = image_new(50,20)
text_sprite.image = img
image_print(img, "("..k..","..l..")", 0, 50, 0, 8, 0x6)
sprite.image = m
wait_for_input()
j = j + 1
end
else
local img = image_new(50,20)
text_sprite.image = img
image_print(img, "("..k..",x)", 0, 50, 0, 8, 0x6)
sprite.image = v
wait_for_input()
end
i = i + 1
end
end
function about_martian_dreams()
canvas_hide_all_sprites()
local bg = sprite_new(image_load("mars.lzc", 0), 0, 24, true)
local text_tbl = text_load("scenetxt.lzc", 4)
music_play("mdd_mus.lzc", 8)
local sprites = {}
local i
for i=0,81 do
local s = sprite_new(nil, 11, 153 + i * 14, true)
s.text_color = 6
s.text = text_tbl[i]
table.insert(sprites, s)
s = sprite_new(nil, 12, 152 + i * 14, true)
s.text_color = 14
s.text = text_tbl[i]
table.insert(sprites, s)
end
--black bars for the top and bottom of the screen.
--These hide the text as it is scrolling in and out.
sprite_new(image_new(220, 24, 0), 0, 0, true)
sprite_new(image_new(220, 48, 0), 0, 152, true)
--scroll the text up the screen
for i=0,90*14 do
local j
for j=1,82*2 do
sprites[j].y = sprites[j].y - 1
end
poll_for_key_or_button(2)
if should_exit() then
fade_out()
return
end
end
music_stop()
fade_out()
end