116 lines
2.5 KiB
Text
116 lines
2.5 KiB
Text
-- Lesson 16: Branching. The finished script, exactly as the lesson ends.
|
|
-- Run it with: Singe -R -v Singe/menuBackground.mkv 16-branching.singe
|
|
local FPS = 30
|
|
|
|
local scenes = {
|
|
arrive = {
|
|
first = 0,
|
|
last = 119,
|
|
ask = 30,
|
|
prompt = "The dragon lands. Left or Right?",
|
|
left = "sunset",
|
|
right = "pit",
|
|
goesTo = "pit"
|
|
},
|
|
sunset = {
|
|
first = 120,
|
|
last = 259,
|
|
ask = 170,
|
|
prompt = "It breathes fire. Duck Left or run Right?",
|
|
left = "escape",
|
|
right = "pit",
|
|
goesTo = "pit"
|
|
},
|
|
pit = {
|
|
first = 260,
|
|
last = 339,
|
|
death = true,
|
|
goesTo = "arrive"
|
|
},
|
|
escape = {
|
|
first = 340,
|
|
last = 410
|
|
}
|
|
}
|
|
|
|
local answer = nil
|
|
local ending = "You got out alive."
|
|
local lives = 3
|
|
|
|
|
|
local function drawScene(scene, frame, asking)
|
|
overlayClear()
|
|
overlayPrint(2, 2, "Lives: " .. lives)
|
|
if scene.death then
|
|
overlayPrint(2, 4, "That did not go well.")
|
|
elseif asking then
|
|
overlayPrint(2, 4, scene.prompt)
|
|
overlayPrint(2, 6, math.ceil((scene.last - frame) / FPS) .. " seconds left.")
|
|
end
|
|
end
|
|
|
|
|
|
local function waitForGo(text)
|
|
answer = nil
|
|
while answer ~= "go" do
|
|
overlayClear()
|
|
overlayPrint(2, 2, "Lives: " .. lives)
|
|
overlayPrint(2, 4, text)
|
|
singeYield()
|
|
end
|
|
end
|
|
|
|
|
|
local function playScene(name)
|
|
local scene = scenes[name]
|
|
|
|
discSkipToFrame(scene.first)
|
|
while discGetFrame() < scene.last do
|
|
local frame = discGetFrame()
|
|
local asking = scene.ask ~= nil and frame >= scene.ask
|
|
|
|
if not asking then
|
|
answer = nil
|
|
elseif answer == "left" or answer == "right" then
|
|
return scene[answer]
|
|
end
|
|
drawScene(scene, frame, asking)
|
|
singeYield()
|
|
end
|
|
discPause()
|
|
|
|
if scene.death then
|
|
lives = lives - 1
|
|
if lives == 0 then
|
|
ending = "The dragon wins. Game over."
|
|
return nil
|
|
end
|
|
waitForGo("Press the space bar to try again.")
|
|
end
|
|
|
|
return scene.goesTo
|
|
end
|
|
|
|
|
|
function onInputPressed(what)
|
|
if what == SWITCH_LEFT then
|
|
answer = "left"
|
|
elseif what == SWITCH_RIGHT then
|
|
answer = "right"
|
|
elseif what == SWITCH_BUTTON1 then
|
|
answer = "go"
|
|
end
|
|
end
|
|
|
|
|
|
function singeMain()
|
|
local scene = "arrive"
|
|
|
|
while scene ~= nil do
|
|
scene = playScene(scene)
|
|
end
|
|
waitForGo(ending .. " Space to quit.")
|
|
end
|
|
|
|
|
|
dofile("Singe/Framework.singe")
|