Loading & messages

This commit is contained in:
Simon Cambier 2022-06-02 22:39:23 +02:00
parent cb1c76cd2d
commit c5db9f717f
6 changed files with 145 additions and 89 deletions

View File

@ -13,6 +13,7 @@ poke4(0x5700,unpack(split"0x0000.0000,0x0000.0000,0x0202.0202,0x0000.0200,0x0000
#include coroutines.lua
#include ui.lua
#include states/menu.lua
#include states/loading.lua
#include states/game.lua
#include states/rules.lua

View File

@ -7,14 +7,7 @@ function Board.new()
local margin = 4
local padding = 1
local t = [[
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0
]]
a = {foo = 3}
local tiles = split(t)
return {
reset = function(self)
local reset = function()
local t = [[
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
@ -28,7 +21,12 @@ function Board.new()
0,0,0,0,0,0,0,0,0,0
]]
tiles = split(t)
end,
end
reset()
return {
reset = reset,
get_tile = function(self, idx)
return tiles[idx]

View File

@ -1,33 +1,24 @@
local coroutines={}
local _cocounter = 0
local _cocreate = cocreate
function cocreate(fn)
_cocounter += 1
k = k or _cocounter
coroutines[_cocounter] = _cocreate(fn, k)
return coroutines[_cocounter], _cocounter
-- starts a coroutine and returns its key
function startcoroutine(fn, key)
add(coroutines, fn)
end
function getcoroutine(key)
return coroutines[key]
function stepcoroutine(fn)
coresume(fn)
end
function stepcoroutine(key)
coresume(coroutines[key])
end
function stopcoroutine(key)
coroutines[key] = nil
function stopcoroutine(fn)
del(coroutines, fn)
end
function _coresolve()
for k,co in pairs(coroutines) do
for co in all(coroutines) do
if costatus(co)!='dead' then
coresume(co)
assert(coresume(co))
else
stopcoroutine(k)
stopcoroutine(co)
end
end
end

View File

@ -142,10 +142,11 @@ function _init()
states = {
rules = state_rules(),
menu = state_menu(),
game = state_game()
game = state_game(),
loading = state_loading(),
}
set_state(states.game)
set_state(states.loading)
end

View File

@ -1,61 +1,18 @@
function state_game()
local board = Board.new()
local board
local selected_id = 1
local function drawSelectedTile()
local x, y = board:draw_coords(selected_id)
local w = board:get_tile_width()
fillp()
rect2(x-1, y-1, w+2, w+2, 6)
fillp()
end
local function create_board()
printh("a: " .. time())
repeat
board:reset()
repeat
board:solve_step(true)
yield()
until board:is_complete()
until board:is_valid()
printh("b: " .. time())
-- Remove tiles until randomness is unavoidable
local previous = {board:get_tiles_copy()} -- initial state
local i = 0
while true do
board:set_tiles(previous[#previous])
-- remove a random tile
repeat
i += 1
until i == 100 or board:get_tiles_copy()[i] ~= 0
if i == 100 then
break
end
board:fill(i, 0)
add(previous, board:get_tiles_copy())
-- try to solve the board
local solved = ""
yield()
repeat
solved = board:solve_step()
until board:is_complete() or solved == "invalid"
if solved == "invalid" then
deli(previous)
end
end -- end while
printh("c: " .. time())
board:set_tiles(previous[#previous])
printh(board:tostring())
printh(count(board:get_tiles_copy(), 0).." zeroes")
end
local function _enter()
cocreate(create_board)
local function _enter(_board)
board = _board
end
local function _draw()

108
states/loading.lua Normal file
View File

@ -0,0 +1,108 @@
function state_loading()
local board = Board.new()
local spinner = split"-,\\,|,/"
local loading_messages = {
"lOADING PATHFINDING ALGORITHM",
"rETICULATING SPLINES",
"aLLOCATING MEMORY BANDWIDTH",
"iNITIALIZING HARDWARE",
"sPINNING UP ai AGENT",
"PINGING aZURE AGENT POOL",
"bOOTING VIRTUAL MACHINE",
"cOUNTING PIXELS",
"cOLORING TILES",
"tIP: THIS GAME RUNS BETTER ON iNTERNET eXPLORER 6",
"lOADING A NEW BOARD",
"iF YOU CAN'T SOLVE A BOARD, ASK HELP FROM AN ADULT",
"lOADING RAY-TRACING SETTINGS",
"aDJUSTING DIFFICULTY FOR YOUR PLAY STYLE",
}
local message = ""
local messages_str = ""
local messages_x = 128
local loaded = false
local create_board = cocreate(function()
repeat
board:reset()
repeat
board:solve_step(true)
yield()
until board:is_complete()
until board:is_valid()
printh("b: " .. time())
-- Remove tiles until randomness is unavoidable
local previous = {board:get_tiles_copy()} -- initial state
local i = 0
while true do
board:set_tiles(previous[#previous])
-- remove a random tile
repeat
i += 1
until i == 100 or board:get_tiles_copy()[i] ~= 0
if i == 100 then
break
end
board:fill(i, 0)
add(previous, board:get_tiles_copy())
-- try to solve the board
local solved = ""
yield()
repeat
solved = board:solve_step()
until board:is_complete() or solved == "invalid"
if solved == "invalid" then
deli(previous)
end
end -- end while
printh("c: " .. time())
board:set_tiles(previous[#previous])
printh(board:tostring())
printh(count(board:get_tiles_copy(), 0).." zeroes")
loaded = true
end)
local function _enter()
loaded = false
local copy_messages = copy(loading_messages)
messages_str = ""
messages_x = 128
while #copy_messages > 0 do
local m = rnd(copy_messages)
messages_str ..= m .. " "
del(copy_messages, m)
end
messages_str ..= "[END OF MESSAGES, THANK YOU FOR YOUR PATIENCE]"
custom_font()
startcoroutine(create_board)
end
local function _update()
messages_x -= 2
if loaded then
set_state(states.game, board)
end
end
local function _draw()
cls()
local l = print(message, 0, -100)
print(messages_str, messages_x, 50, 7)
print(spinner[t()\.25%4+1], 120, 120)
end
return {
_enter = _enter,
_update = _update,
_draw = _draw,
}
end