Loading & messages
This commit is contained in:
		
							parent
							
								
									cb1c76cd2d
								
							
						
					
					
						commit
						c5db9f717f
					
				
							
								
								
									
										1
									
								
								0hh1.p8
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								0hh1.p8
									
									
									
									
									
								
							| 
						 | 
					@ -13,6 +13,7 @@ poke4(0x5700,unpack(split"0x0000.0000,0x0000.0000,0x0202.0202,0x0000.0200,0x0000
 | 
				
			||||||
#include coroutines.lua
 | 
					#include coroutines.lua
 | 
				
			||||||
#include ui.lua
 | 
					#include ui.lua
 | 
				
			||||||
#include states/menu.lua
 | 
					#include states/menu.lua
 | 
				
			||||||
 | 
					#include states/loading.lua
 | 
				
			||||||
#include states/game.lua
 | 
					#include states/game.lua
 | 
				
			||||||
#include states/rules.lua
 | 
					#include states/rules.lua
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								board.lua
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								board.lua
									
									
									
									
									
								
							| 
						 | 
					@ -7,28 +7,26 @@ function Board.new()
 | 
				
			||||||
	local margin = 4
 | 
						local margin = 4
 | 
				
			||||||
	local padding = 1
 | 
						local padding = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local t = [[
 | 
						local reset = function()
 | 
				
			||||||
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
 | 
							local t = [[
 | 
				
			||||||
	]]
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
	a = {foo = 3}
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
	local tiles = split(t)
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
								0,0,0,0,0,0,0,0,0,0
 | 
				
			||||||
 | 
							]]
 | 
				
			||||||
 | 
							tiles = split(t)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return {
 | 
						return {
 | 
				
			||||||
		reset = function(self)
 | 
							reset = reset,
 | 
				
			||||||
			local t = [[
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0,
 | 
					 | 
				
			||||||
				0,0,0,0,0,0,0,0,0,0
 | 
					 | 
				
			||||||
			]]
 | 
					 | 
				
			||||||
			tiles = split(t)
 | 
					 | 
				
			||||||
		end,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		get_tile = function(self, idx)
 | 
							get_tile = function(self, idx)
 | 
				
			||||||
			return tiles[idx]
 | 
								return tiles[idx]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,33 +1,24 @@
 | 
				
			||||||
local coroutines={}
 | 
					local coroutines={}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local _cocounter = 0
 | 
					-- starts a coroutine and returns its key
 | 
				
			||||||
local _cocreate = cocreate
 | 
					function startcoroutine(fn, key)
 | 
				
			||||||
 | 
						add(coroutines, fn)
 | 
				
			||||||
function cocreate(fn)
 | 
					 | 
				
			||||||
	_cocounter += 1
 | 
					 | 
				
			||||||
	k = k or _cocounter
 | 
					 | 
				
			||||||
  coroutines[_cocounter] = _cocreate(fn, k)
 | 
					 | 
				
			||||||
	return coroutines[_cocounter], _cocounter
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getcoroutine(key)
 | 
					function stepcoroutine(fn)
 | 
				
			||||||
  return coroutines[key]
 | 
					  coresume(fn)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function stepcoroutine(key)
 | 
					function stopcoroutine(fn)
 | 
				
			||||||
  coresume(coroutines[key])
 | 
						del(coroutines, fn)
 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function stopcoroutine(key)
 | 
					 | 
				
			||||||
  coroutines[key] = nil
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function _coresolve()
 | 
					function _coresolve()
 | 
				
			||||||
  for k,co in pairs(coroutines) do
 | 
					  for co in all(coroutines) do
 | 
				
			||||||
    if costatus(co)!='dead' then
 | 
					    if costatus(co)!='dead' then
 | 
				
			||||||
      coresume(co)
 | 
					      assert(coresume(co))
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      stopcoroutine(k)
 | 
					      stopcoroutine(co)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5
									
								
								main.lua
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.lua
									
									
									
									
									
								
							| 
						 | 
					@ -142,10 +142,11 @@ function _init()
 | 
				
			||||||
	states = {
 | 
						states = {
 | 
				
			||||||
		rules = state_rules(),
 | 
							rules = state_rules(),
 | 
				
			||||||
		menu = state_menu(),
 | 
							menu = state_menu(),
 | 
				
			||||||
		game = state_game()
 | 
							game = state_game(),
 | 
				
			||||||
 | 
							loading = state_loading(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	set_state(states.game)
 | 
						set_state(states.loading)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,61 +1,18 @@
 | 
				
			||||||
function state_game()
 | 
					function state_game()
 | 
				
			||||||
	local board = Board.new()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local board
 | 
				
			||||||
	local selected_id = 1
 | 
						local selected_id = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local function drawSelectedTile()
 | 
						local function drawSelectedTile()
 | 
				
			||||||
		local x, y = board:draw_coords(selected_id)
 | 
							local x, y = board:draw_coords(selected_id)
 | 
				
			||||||
		local w = board:get_tile_width()
 | 
							local w = board:get_tile_width()
 | 
				
			||||||
 | 
							fillp(▒)
 | 
				
			||||||
		rect2(x-1, y-1, w+2, w+2, 6)
 | 
							rect2(x-1, y-1, w+2, w+2, 6)
 | 
				
			||||||
 | 
						 	fillp(█)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local function create_board()
 | 
						local function _enter(_board)
 | 
				
			||||||
		printh("a: " .. time())
 | 
							board = _board
 | 
				
			||||||
 | 
					 | 
				
			||||||
		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)
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local function _draw()
 | 
						local function _draw()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										108
									
								
								states/loading.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								states/loading.lua
									
									
									
									
									
										Normal 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
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user