246 lines
5.8 KiB
Text
246 lines
5.8 KiB
Text
-- Lesson 30: In A Cabinet. The finished script, exactly as the lesson ends.
|
|
|
|
dofile("Singe/Framework.singe")
|
|
|
|
local ROUND_MS = 15000
|
|
local MENU = { "Coins per credit", "Difficulty", "Free play", "Clear high score", "Exit service" }
|
|
local HARDNESS = { "Easy", "Normal", "Hard" }
|
|
|
|
local coinsPerCredit = saveGet("coinsPerCredit", 1)
|
|
local difficulty = saveGet("difficulty", 2)
|
|
local freePlay = saveGet("freePlay", false)
|
|
local best = saveGet("best", 0)
|
|
|
|
local state = "attract"
|
|
local goBackTo = "attract"
|
|
local coins = 0
|
|
local credits = 0
|
|
local score = 0
|
|
local endsAt = 0
|
|
local item = 1
|
|
local saying = ""
|
|
local hasBezel = false
|
|
|
|
|
|
local function wrap(value, low, high)
|
|
if value < low then
|
|
return high
|
|
end
|
|
if value > high then
|
|
return low
|
|
end
|
|
return value
|
|
end
|
|
|
|
|
|
local function canStart()
|
|
return freePlay or credits > 0
|
|
end
|
|
|
|
|
|
local function insertCoin()
|
|
coins = coins + 1
|
|
while coins >= coinsPerCredit do
|
|
coins = coins - coinsPerCredit
|
|
credits = credits + 1
|
|
end
|
|
end
|
|
|
|
|
|
local function startGame()
|
|
if not freePlay then
|
|
credits = credits - 1
|
|
end
|
|
score = 0
|
|
endsAt = singeGetTicks() + ROUND_MS
|
|
state = "play"
|
|
end
|
|
|
|
|
|
local function endGame()
|
|
if score > best then
|
|
best = score
|
|
saveSet("best", best)
|
|
end
|
|
saveFlush()
|
|
endsAt = singeGetTicks() + 5000
|
|
state = "over"
|
|
end
|
|
|
|
|
|
local function settingOf(which)
|
|
if which == 1 then
|
|
return tostring(coinsPerCredit)
|
|
elseif which == 2 then
|
|
return HARDNESS[difficulty]
|
|
elseif which == 3 then
|
|
if freePlay then
|
|
return "on"
|
|
end
|
|
return "off"
|
|
elseif which == 4 then
|
|
return tostring(best)
|
|
end
|
|
return ""
|
|
end
|
|
|
|
|
|
local function adjust(step)
|
|
if item == 1 then
|
|
coinsPerCredit = wrap(coinsPerCredit + step, 1, 4)
|
|
saveSet("coinsPerCredit", coinsPerCredit)
|
|
elseif item == 2 then
|
|
difficulty = wrap(difficulty + step, 1, #HARDNESS)
|
|
saveSet("difficulty", difficulty)
|
|
elseif item == 3 then
|
|
freePlay = not freePlay
|
|
saveSet("freePlay", freePlay)
|
|
end
|
|
saveFlush()
|
|
end
|
|
|
|
|
|
local function serviceInput(what)
|
|
if what == SWITCH_UP then
|
|
item = wrap(item - 1, 1, #MENU)
|
|
elseif what == SWITCH_DOWN then
|
|
item = wrap(item + 1, 1, #MENU)
|
|
elseif what == SWITCH_LEFT then
|
|
adjust(-1)
|
|
elseif what == SWITCH_RIGHT then
|
|
adjust(1)
|
|
elseif what == SWITCH_BUTTON1 then
|
|
if item == 4 then
|
|
best = 0
|
|
saveSet("best", 0)
|
|
saveFlush()
|
|
saying = "High score cleared."
|
|
elseif item == 5 then
|
|
state = goBackTo
|
|
end
|
|
elseif what == SWITCH_BUTTON2 or what == SWITCH_SERVICE then
|
|
state = goBackTo
|
|
end
|
|
end
|
|
|
|
|
|
function onInputPressed(what)
|
|
if what == SWITCH_QUIT then
|
|
if state == "confirm" then
|
|
singeQuit()
|
|
else
|
|
goBackTo = state
|
|
state = "confirm"
|
|
end
|
|
return
|
|
end
|
|
|
|
if state == "confirm" then
|
|
if what == SWITCH_BUTTON2 then
|
|
state = goBackTo
|
|
end
|
|
return
|
|
end
|
|
|
|
if state == "service" then
|
|
serviceInput(what)
|
|
return
|
|
end
|
|
|
|
if what == SWITCH_SERVICE then
|
|
goBackTo = state
|
|
saying = ""
|
|
state = "service"
|
|
return
|
|
end
|
|
|
|
if what == SWITCH_COIN1 then
|
|
insertCoin()
|
|
return
|
|
end
|
|
|
|
if state == "play" then
|
|
if what == SWITCH_BUTTON1 then
|
|
score = score + 10 * difficulty
|
|
end
|
|
return
|
|
end
|
|
|
|
if what == SWITCH_START1 and canStart() then
|
|
startGame()
|
|
end
|
|
end
|
|
|
|
|
|
local function drawAttract()
|
|
overlayPrint(2, 2, "ROCK DODGER")
|
|
if canStart() then
|
|
overlayPrint(2, 4, "PRESS START")
|
|
elseif (singeGetTicks() // 400) % 2 == 0 then
|
|
overlayPrint(2, 4, "INSERT COIN")
|
|
end
|
|
overlayPrint(2, 6, "High score " .. best)
|
|
end
|
|
|
|
|
|
local function drawService()
|
|
overlayPrint(2, 0, "SERVICE MENU")
|
|
for row, name in ipairs(MENU) do
|
|
if row == item then
|
|
overlayPrint(1, row + 1, ">")
|
|
end
|
|
overlayPrint(3, row + 1, name)
|
|
overlayPrint(24, row + 1, settingOf(row))
|
|
end
|
|
overlayPrint(2, 8, saying)
|
|
overlayPrint(2, 10, "Singe " .. SINGE_VERSION_STRING .. " rotation " .. vldpGetRotate())
|
|
if hasBezel then
|
|
overlayPrint(2, 11, "Bezel artwork loaded.")
|
|
else
|
|
overlayPrint(2, 11, "No bezel artwork.")
|
|
end
|
|
overlayPrint(2, 12, singeGetDataPath())
|
|
overlayPrint(2, 16, "Up/Down choose. Left/Right change. Button 1 does it.")
|
|
overlayPrint(2, 17, "Button 2 or the service switch leaves.")
|
|
end
|
|
|
|
|
|
function onOverlayUpdate()
|
|
overlayClear()
|
|
|
|
if state == "play" and singeGetTicks() >= endsAt then
|
|
endGame()
|
|
elseif state == "over" and singeGetTicks() >= endsAt then
|
|
state = "attract"
|
|
end
|
|
|
|
if state == "service" then
|
|
drawService()
|
|
elseif state == "confirm" then
|
|
overlayPrint(2, 2, "QUIT THIS GAME?")
|
|
overlayPrint(2, 4, "Quit again to quit. Button 2 stays.")
|
|
elseif state == "play" then
|
|
overlayPrint(2, 2, "SCORE " .. score)
|
|
overlayPrint(2, 3, "TIME " .. ((endsAt - singeGetTicks()) // 1000))
|
|
overlayPrint(2, 5, "Button 1 scores. " .. HARDNESS[difficulty] .. ".")
|
|
elseif state == "over" then
|
|
overlayPrint(2, 2, "GAME OVER")
|
|
overlayPrint(2, 4, "You scored " .. score .. ".")
|
|
overlayPrint(2, 6, "High score " .. best)
|
|
else
|
|
drawAttract()
|
|
end
|
|
|
|
if state ~= "service" then
|
|
overlayPrint(2, 17, "CREDITS " .. credits .. " COINS " .. coins .. "/" .. coinsPerCredit)
|
|
end
|
|
|
|
return OVERLAY_UPDATED
|
|
end
|
|
|
|
|
|
singeSetQuitKeyEnabled(false)
|
|
hasBezel = mainBezelLoaded()
|
|
if hasBezel then
|
|
setOverlayOnTop(true)
|
|
end
|