diff --git a/core/dirksimple_libretro.so.zip b/core/dirksimple_libretro.so.zip new file mode 100644 index 0000000..3424541 Binary files /dev/null and b/core/dirksimple_libretro.so.zip differ diff --git a/data/core.json b/data/core.json index dccee69..7c66ea0 100755 --- a/data/core.json +++ b/data/core.json @@ -304,6 +304,27 @@ }, "symbols": 0 }, + "dirksimple": { + "source": "https://github.com/icculus/DirkSimple", + "branch": "5aea3e2", + "directory": "DirkSimple", + "output": "dirksimple_libretro.so", + "make": { + "file": "Makefile", + "args": "", + "target": "", + "skip": "1" + }, + "symbols": 0, + "commands": { + "pre-make": [ + "cmake -B cmake-build && cmake --build cmake-build" + ], + "post-make":[ + "mv cmake-build/dirksimple_libretro.so ." + ] + } + }, "easyrpg": { "source": "https://github.com/EasyRPG/Player", "branch": "df4e1ee", diff --git a/system/extra/DirkSimple/assign/DirkSimple/dirksimple.ini b/system/extra/DirkSimple/assign/DirkSimple/dirksimple.ini new file mode 100644 index 0000000..3718236 --- /dev/null +++ b/system/extra/DirkSimple/assign/DirkSimple/dirksimple.ini @@ -0,0 +1,12 @@ +[freej2me - retroarch] +name=DirkSimple +core=dirksimple_libretro.so + +[launch] +prep= +exec=/opt/muos/script/launch/lr-general.sh +done= + +[friendly] +dirk +dirksimple diff --git a/system/extra/DirkSimple/assign/DirkSimple/global.ini b/system/extra/DirkSimple/assign/DirkSimple/global.ini new file mode 100644 index 0000000..04c89c7 --- /dev/null +++ b/system/extra/DirkSimple/assign/DirkSimple/global.ini @@ -0,0 +1,10 @@ +[global] +name=DirkSimple +default=dirksimple +catalogue=Arcade +lookup=0 + +[friendly] +dirk +dirksimple + diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/cliffglyphs.png b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/cliffglyphs.png new file mode 100644 index 0000000..aa59297 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/cliffglyphs.png differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/game.lua b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/game.lua new file mode 100644 index 0000000..50992eb --- /dev/null +++ b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/game.lua @@ -0,0 +1,3316 @@ +-- DirkSimple; a dirt-simple player for FMV games. +-- +-- Please see the file LICENSE.txt in the source's root directory. +-- +-- This file written by Ryan C. Gordon. +-- + +DirkSimple.gametitle = "Cliff Hanger" + +-- CVARS +local starting_lives = 6 -- number of lives player gets at startup. Six was the maximum that arcade cabinet dip switches allowed. +local infinite_lives = false -- set to true to not lose a life on failure. +local show_lives_and_score = true -- if true, overlay current lives and score at top of laserdisc video during scenes. This is usually enabled in arcade cabinets' dip switches. +local show_hints = true -- if true, overlay hints about the expected move at the bottom of the laserdisc video during scenes. This is often enabled in arcade cabinets' dip switches. +local show_full_hints = false -- if true, instead of "ACTION" or "STICK" it tells you the exact necessary move. The real version doesn't do this! +local show_hanging_scene = false -- They show Cliff getting hanged (get it, CLIFF HANGER?!?) after each failure and it takes forever and it is kinda disturbing. There's a dip switch to disable it. Set it to false to disable it here, too. +local show_should_have_hint = 3 -- show "SHOULD HAVE USED FEET" etc after X failures in a row (zero to disable, 1 shows on every failure). +local allow_buy_in = true -- allow player to continue on game over? +local god_mode = false -- if true, game plays correct moves automatically, so you never fail. + +DirkSimple.cvars = { + { name="starting_lives", desc="Number of lives player starts with", values="6|5|4|3|2|1", setter=function(name, value) starting_lives = DirkSimple.to_int(value) end }, + { name="infinite_lives", desc="Don't lose a life when failing", values="false|true", setter=function(name, value) infinite_lives = DirkSimple.to_bool(value) end }, + { name="show_lives_and_score", desc="Show score and lives remaining at top of screen", values="true|false", setter=function(name, value) show_lives_and_score = DirkSimple.to_bool(value) end }, + { name="show_hints", desc="Show hints at bottom of screen about expected moves", values="true|false", setter=function(name, value) show_hints = DirkSimple.to_bool(value) end }, + { name="show_full_hints", desc="Show exact required moves on the HUD", values="false|true", setter=function(name, value) show_full_hints = DirkSimple.to_bool(value) end }, + { name="show_hanging_scene", desc="Show Cliff being hanged after each failure", values="false|true", setter=function(name, value) show_hanging_scene = DirkSimple.to_bool(value) end }, + { name="show_should_have_hint", desc="Show the correct choice after X failures in a row", values="3|2|always|never", setter=function(name, value) if value == "always" then value = 1 elseif value == "never" then value = 0 else value = DirkSimple.to_int(value) end show_should_have_hint = value end }, + { name="allow_buy_in", desc="Allow player to continue on game over", values="true|false", setter=function(name, value) allow_buy_in = DirkSimple.to_bool(value) end }, + { name="god_mode", desc="Game plays itself perfectly, never failing", values="false|true", setter=function(name, value) god_mode = DirkSimple.to_bool(value) end } +} + +-- SOME INITIAL SETUP STUFF +local scenes = nil -- gets set up later in the file. +local test_scene = nil -- set to index of scene to test. nil otherwise! +local test_sequence_num = nil -- set to index of sequence to test. nil otherwise! +--test_scene = 5 ; test_sequence = 1 + +-- GAME STATE +local scene_manager = {} +local alltime_highscores = nil -- set up later in the file +local today_highscores = nil -- set up later in the file + + +-- FUNCTIONS + +-- Cliff Hanger counts frames at 29.97fps, not 23.976fps like Dragon's Lair. +local function laserdisc_frame_to_ms(frame) + return (frame / 29.97) * 1000.0 +end + +local function seek_laserdisc_to(frame) + -- will suspend ticking until the seek completes and reset sequence tick count + scene_manager.last_seek = laserdisc_frame_to_ms(frame - 6) + scene_manager.unserialize_offset = 0 + DirkSimple.start_clip(scene_manager.last_seek) +end + +local function halt_laserdisc() + -- will suspend ticking until the seek completes and reset sequence tick count + scene_manager.last_seek = -1 + scene_manager.unserialize_offset = 0 + DirkSimple.halt_video() +end + +local function setup_scene_manager() + scene_manager.initialized = true + scene_manager.accepted_input = nil + scene_manager.attract_mode_state = 0 + scene_manager.death_mode_state = 0 + scene_manager.scene_start_state = 0 + scene_manager.scene_start_tick_offset = 0 + scene_manager.game_over_state = 0 + scene_manager.player_initials = { ' ', ' ', ' ' } + scene_manager.player_initials_entered = 0 + scene_manager.player_initials_selected_glyph = 0 + scene_manager.lives_left = starting_lives + scene_manager.current_score = 0 + scene_manager.last_failed_scene = 0 + scene_manager.last_failed_sequence = 0 + scene_manager.failures_in_a_row = 0 + scene_manager.last_seek = 0 + scene_manager.current_scene = nil + scene_manager.current_scene_num = 0 + scene_manager.current_sequence = nil + scene_manager.current_sequence_num = 0 + scene_manager.current_scene_ticks = 0 + scene_manager.laserdisc_frame = 0 + scene_manager.unserialize_offset = 0 +end + +-- Cliff Hanger only draws "characters" to a grid on the screen. It could not +-- draw outside the grid: one character filled a cell, you couldn't draw +-- in the middle to straddle two cells, which means you could not position +-- anything by pixel position if it didn't align to the grid. Think of it +-- as a fancy text terminal. +-- Coordinates and sizes are in character blocks (8x8 pixels). The logical +-- screen here is 40x24 blocks, so we'll scale as appropriate to match the +-- laserdisc video resolution. +local function draw_sprite_chars(name, sx, sy, sw, sh, dx, dy, modr, modg, modb) + -- scale dest coords for the screen resolution. + -- some percentage of the laserdisc video height is letterboxing, don't count that part. + local blockh = (DirkSimple.video_height - (DirkSimple.video_height * 0.216666)) / 24.0 + local blockw = DirkSimple.video_width / 40.0 + dx = DirkSimple.truncate(DirkSimple.truncate(dx) * blockw) + dy = DirkSimple.truncate((DirkSimple.truncate(dy) * blockh) + (DirkSimple.video_height * 0.10)) + local dw = DirkSimple.truncate((sw * blockw) + 0.5) + local dh = DirkSimple.truncate((sh * blockh) + 0.5) + + -- convert from source blocks to pixels + sx = DirkSimple.truncate(sx) * 8 + sy = DirkSimple.truncate(sy) * 8 + sw = DirkSimple.truncate(sw) * 8 + sh = DirkSimple.truncate(sh) * 8 + + --DirkSimple.log("draw_sprite(" .. sx .. ", " .. sy .. ", " .. sw .. ", " .. sh .. ", " .. dx .. ", " .. dy .. ", " .. dw .. ", " .. dh .. ")") + DirkSimple.draw_sprite(name, sx, sy, sw, sh, dx, dy, dw, dh, modr, modg, modb) +end + +local chartable = nil +local function draw_text(str, x, y, modr, modg, modb) + if chartable == nil then + local x = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[~]^~`abcdefghijklmnopqrstuvwxyz{|}" + local bytelist = { x:byte(1, #x) } + chartable = {} + for i,ch in ipairs(bytelist) do + chartable[ch] = i + end + end + + local bytes = { str:byte(1, #str) } + for i,ch in ipairs(bytes) do + local idx = chartable[ch] + if idx == nil then + idx = 1 + end + draw_sprite_chars("cliffglyphs", idx - 1, 0, 1, 1, x, y, modr, modg, modb) + x = x + 1 + end +end + +local function draw_rectangle(x, y, w, h, r, g, b) + draw_sprite_chars("cliffglyphs", 99, 0, 1, 1, x, y, r, g, b) + draw_sprite_chars("cliffglyphs", 98, 0, 1, 1, x+w+1, y, r, g, b) + draw_sprite_chars("cliffglyphs", 101, 0, 1, 1, x, y+h+1, r, g, b) + draw_sprite_chars("cliffglyphs", 100, 0, 1, 1, x+w+1, y+h+1, r, g, b) + for i = 1,w,1 do + draw_sprite_chars("cliffglyphs", 96, 0, 1, 1, x+i, y, r, g, b) + draw_sprite_chars("cliffglyphs", 96, 0, 1, 1, x+i, y+h+1, r, g, b) + end + for i = 1,h,1 do + draw_sprite_chars("cliffglyphs", 97, 0, 1, 1, x, y+i, r, g, b) + draw_sprite_chars("cliffglyphs", 97, 0, 1, 1, x+w+1, y+i, r, g, b) + end +end + +local function draw_standard_rectangle(idx, r, g, b) + draw_rectangle(idx, idx, 38 - (idx * 2), 21 - (idx * 2), r, g, b) +end + +-- these color values come from Daphne's TMS9128NL code. +local colortable = { -- red, blue, green triplets. + black = { 0, 0, 0 }, + medium_green = { 26, 219, 36 }, + light_green = { 109, 255, 109 }, + dark_blue = { 36, 36, 255 }, + light_blue = { 73, 109, 255 }, + dark_red = { 182, 36, 36 }, + purple = { 125, 0, 128 }, -- daphne uses this for Cliff Hanger's move prompts, looks more accurate to the arcade than dark_red. + light_cyan = { 73, 219, 255 }, + medium_red = { 255, 36, 36 }, + light_red = { 255, 109, 109 }, + dark_yellow = { 219, 219, 36 }, + light_yellow = { 219, 219, 146 }, + dark_green = { 36, 146, 36 }, + magenta = { 219, 73, 182 }, + grey = { 182, 182, 182 }, + white = { 255, 255, 255 } +} + +local function mapcolor(name) + if colortable[name] == nil then + name = "black" + end + local triplet = colortable[name] + return triplet[1], triplet[2], triplet[3] +end + + +local start_attract_mode = nil -- predeclare + +local attract_mode_flash_colors = { -- just foreground + "white", "light_yellow", "medium_red", "dark_yellow", "dark_blue", "dark_green", "light_green" +} + +local function start_scene(scenenum, sequencenum) + if test_scene ~= nil then + scenenum = test_scene + sequencenum = test_sequence + if sequencenum == nil then + sequencenum = 0 + end + end + + local start_of_scene = (sequencenum == 0) + if start_of_scene then + sequencenum = 1 + end + + local seqname = nil + if (scenes[scenenum] ~= nil) and (scenes[scenenum].moves ~= nil) and (scenes[scenenum].moves[sequencenum] ~= nil) then + seqname = scenes[scenenum].moves[sequencenum].name + end + if seqname ~= nil then + seqname = " (" .. seqname .. ")" + else + seqname = '' + end + + DirkSimple.log("Starting scene " .. scenenum .. " (" .. scenes[scenenum].scene_name .. "), sequence " .. sequencenum .. seqname) + scene_manager.current_scene_num = scenenum + scene_manager.current_scene = scenes[scenenum] + scene_manager.current_sequence_num = sequencenum + scene_manager.current_sequence = scene_manager.current_scene.moves[sequencenum] + scene_manager.accepted_input = nil + + scene_manager.scene_start_state = 1 + if not start_of_scene then + scene_manager.scene_start_state = 2 + end +end + +local function start_game() + DirkSimple.log("Start game!") + setup_scene_manager() + halt_laserdisc() + start_scene(1, 0) +end + +local function draw_high_scores(ticks) + DirkSimple.clear_screen(mapcolor("magenta")) + + draw_rectangle(0, 0, 19, 22, mapcolor("white")) + draw_rectangle(20, 0, 18, 22, mapcolor("white")) + draw_text("The Highest Scores", 2, 1, mapcolor("white")) + + -- this only shows the default scores for now. We could manage actual scores, though! + for i,v in ipairs(alltime_highscores) do + if ticks >= (i * 100) then + local score = "" .. v[2] + local y = 2 + (i * 2) + draw_text(v[1], 2, y, mapcolor("white")) + draw_text(score, 19 - #score, y, mapcolor("white")) + end + end + + if ticks >= 1100 then + draw_text("High Scores Today", 22, 1, mapcolor("white")) + for i,v in ipairs(today_highscores) do + if ticks >= (1100 + (i * 100)) then + local score = "" .. v[2] + local y = 2 + (i * 2) + draw_text(v[1], 22, y, mapcolor("white")) + draw_text(score, 39 - #score, y, mapcolor("white")) + end + end + end +end + +local function tick_attract_mode(inputs) + -- !!! FIXME: if someone wants to make this frame-perfect, feel free to adjust all the magic tick values in this function. + local ticks = scene_manager.current_scene_ticks + if scene_manager.attract_mode_state == 1 then -- state == 1? Showing initial intro before laserdisc starts playing. + if ticks <= 2000 then -- Sliding in initial logo. + DirkSimple.clear_screen(mapcolor("black")) + draw_sprite_chars("logo", 0, 0, 20, 10, 31 - (31 * (ticks / 2000)), 0, mapcolor("light_blue")) + elseif ticks <= 3000 then -- waiting to flash + DirkSimple.clear_screen(mapcolor("black")) + draw_sprite_chars("logo", 0, 0, 20, 10, 0, 0, mapcolor("light_blue")) + elseif ticks <= 3128 then -- flash + DirkSimple.clear_screen(mapcolor("light_blue")) + draw_sprite_chars("logo", 0, 0, 20, 10, 0, 0, mapcolor("dark_red")) + elseif ticks <= 3256 then -- flash2 + DirkSimple.clear_screen(mapcolor("light_blue")) + draw_sprite_chars("logo", 0, 0, 20, 10, 0, 0, mapcolor("white")) + else -- into the main graphics screen, before laserdisc kicks in. + local flashticks = ticks - 8384 + local fg = "black" + local bg = "light_blue" + + if flashticks > 0 then + local flashidx = DirkSimple.truncate(flashticks / 128.0) + if flashidx > #attract_mode_flash_colors then + flashidx = #attract_mode_flash_colors -- moving on to next mode, but do this one more time for this last frame. + scene_manager.attract_mode_state = scene_manager.attract_mode_state + 1 + seek_laserdisc_to(6) -- start the laserdisc attract mode video playing. + end + + fg = attract_mode_flash_colors[flashidx] + if flashidx == #attract_mode_flash_colors then -- last one chooses a black background. + bg = "black" + end + end + + DirkSimple.clear_screen(mapcolor(bg)) + draw_sprite_chars("logo", 0, 0, 20, 10, 0, 0, mapcolor(fg)) + if ticks > 4256 then + draw_text("A Laser Disc Video Game", 8, 16, mapcolor(fg)) + end + if ticks > 5256 then -- show byline + draw_text("BY STERN ELECTRONICS, INC.", 7, 18, mapcolor(fg)) + end + if ticks > 6256 then -- show number of credits + draw_text("FREE PLAY", 15, 23, mapcolor(fg)) + end + end + elseif scene_manager.attract_mode_state == 2 then -- state == 2? Started actual laserdisc attract mode video playing. + if scene_manager.laserdisc_frame >= 1546 then + DirkSimple.clear_screen(mapcolor("dark_blue")) + halt_laserdisc() + scene_manager.attract_mode_state = scene_manager.attract_mode_state + 1 -- move on to original game's credits page. + return + end + elseif scene_manager.attract_mode_state == 3 then -- state == 3? Show developer credits. + -- ticks were reset by the halt_laserdisc call that ended state 2. + DirkSimple.clear_screen(mapcolor("dark_blue")) + draw_text("Designed & Programmed By", 8, 7, mapcolor("white")) + if ticks >= 1000 then + draw_text("PAUL M. RUBENSTEIN", 11, 10, mapcolor("white")) + end + if ticks >= 1100 then + draw_text("BOB KOWALSKI", 13, 12, mapcolor("white")) + end + if ticks >= 1200 then + draw_text("JON MICHAEL HOGAN", 11, 14, mapcolor("white")) + end + if ticks >= 1300 then + draw_text("EDWARD J. MARCH JR.", 10, 16, mapcolor("white")) + end + if ticks >= 1400 then + local total = DirkSimple.truncate((ticks - 1400) / 128) + if total > 5 then + total = 5 + end + for i = 1,total,1 do + draw_standard_rectangle(i-1, mapcolor("white")) + end + end + + if ticks >= 6300 then -- move on to next state. + halt_laserdisc() -- just reset ticks for next state + scene_manager.attract_mode_state = scene_manager.attract_mode_state + 1 -- move on to DirkSimple credits page. + end + elseif scene_manager.attract_mode_state == 4 then -- state == 4? Added a DirkSimple credits page. + DirkSimple.clear_screen(mapcolor("medium_red")) + draw_text("Rebuilt for DirkSimple By", 7, 7, mapcolor("white")) + if ticks >= 1000 then + draw_text("RYAN C. GORDON", 13, 12, mapcolor("white")) + end + if ticks >= 1500 then + draw_text("https://icculus.org/dirksimple", 5, 17, mapcolor("light_yellow")) + end + if ticks >= 1600 then + local total = DirkSimple.truncate((ticks - 1600) / 128) + if total > 3 then + total = 3 + end + for i = 1,total,1 do + draw_standard_rectangle(i-1, mapcolor("white")) + end + end + if ticks >= 4000 then -- move on to next state. + halt_laserdisc() -- just reset ticks for next state + scene_manager.attract_mode_state = scene_manager.attract_mode_state + 1 -- move on to high scores. + end + elseif scene_manager.attract_mode_state == 5 then -- state == 5? High scores list. + draw_high_scores(ticks) + if ticks >= 5000 then -- move on to next state. + halt_laserdisc() -- just reset ticks for next state + scene_manager.attract_mode_state = scene_manager.attract_mode_state + 1 -- move on to instructions + end + elseif scene_manager.attract_mode_state == 6 then -- state == 6? Instructions. + DirkSimple.clear_screen(mapcolor("dark_blue")) + if ticks >= 128 then + draw_text("Move the joystick in the", 8, 3, mapcolor("white")) + end + if ticks >= 256 then + draw_text("direction Cliff or his car", 7, 4, mapcolor("white")) + end + if ticks >= 386 then + draw_text("moves on the screen", 10, 5, mapcolor("white")) + end + if ticks >= 770 then + draw_text("Stick right if object moves", 6, 9, mapcolor("white")) + end + if ticks >= 898 then + draw_text("toward right edge of screen", 6, 10, mapcolor("white")) + end + if ticks >= 1226 then + draw_text("Stick left if object moves", 7, 12, mapcolor("white")) + end + if ticks >= 1354 then + draw_text("toward left edge of screen", 7, 13, mapcolor("white")) + end + if ticks >= 1682 then + draw_text("Stick up if object moves", 8, 15, mapcolor("white")) + end + if ticks >= 1810 then + draw_text("toward upper edge of screen", 6, 16, mapcolor("white")) + end + if ticks >= 2138 then + draw_text("Stick down if object moves", 7, 18, mapcolor("white")) + end + if ticks >= 2266 then + draw_text("toward bottom edge of screen", 6, 19, mapcolor("white")) + end + if ticks >= 2366 then + draw_standard_rectangle(0, mapcolor("white")) + end + if ticks >= 2466 then + draw_standard_rectangle(1, mapcolor("white")) + end + if ticks >= 12522 then + scene_manager.attract_mode_state = 1 -- restart attract mode. + halt_laserdisc() -- just reset ticks for next state + end + end + + if inputs ~= nil and inputs.pressed["start"] then + start_game() + end +end + +start_attract_mode = function() + DirkSimple.log("Starting attract mode") + setup_scene_manager() + scene_manager.attract_mode_state = 1 + halt_laserdisc() + tick_attract_mode(nil) -- start right now. +end + +local function game_over(won) + DirkSimple.log("Game over!") + scene_manager.accepted_input = nil + halt_laserdisc() -- blank laserdisc frame, reset ticks. + if won then + scene_manager.game_over_state = 1 + elseif allow_buy_in then + scene_manager.game_over_state = 2 + else + scene_manager.game_over_state = 3 + end +end + +local failure_flash_colors = { -- { foreground, background } + { "white", "dark_blue" }, + { "white", "dark_red" }, + { "dark_blue", "white" }, + { "dark_red", "white" }, + { "white", "dark_blue" }, + { "white", "dark_red" }, + { "white", "dark_blue" }, + { "white", "dark_red" } +} + +local function draw_failure_screen(ticks) + local actions = scene_manager.current_sequence.correct_moves + local msg = "Y O U ' V E B L O W N I T !" + if (#actions > 0) and (show_should_have_hint > 0) and (scene_manager.failures_in_a_row >= show_should_have_hint) then + local input = actions[1] + if input == "up" then + msg = " SHOULD HAVE GONE UP !" + elseif input == "down" then + msg = " SHOULD HAVE GONE DOWN !" + elseif input == "left" then + msg = " SHOULD HAVE GONE LEFT !" + elseif input == "right" then + msg = " SHOULD HAVE GONE RIGHT !" + elseif input == "hands" then + msg = " SHOULD HAVE USED YOUR HAND !" + elseif input == "feet" then + msg = " SHOULD HAVE USED YOUR FEET !" + end + end + + local flashidx = DirkSimple.truncate(ticks / 96) + 1 + if flashidx > #failure_flash_colors then + flashidx = #failure_flash_colors + end + local flashcolor = failure_flash_colors[flashidx] + local fg = flashcolor[1] + local bg = flashcolor[2] + + DirkSimple.clear_screen(mapcolor(bg)) + for i = 1,40,1 do + draw_sprite_chars("cliffglyphs", 96, 0, 1, 1, i-1, 6, mapcolor(fg)) + draw_sprite_chars("cliffglyphs", 96, 0, 1, 1, i-1, 16, mapcolor(fg)) + end + draw_text("PLAYER # 1", 15, 9, mapcolor(fg)) + draw_text(msg, 4, 13, mapcolor(fg)) +end + +local function tick_death_scene() + local ticks = scene_manager.current_scene_ticks + + if scene_manager.death_mode_state == 0 then -- not showing a death sequence. + return + elseif scene_manager.death_mode_state == 1 then -- the "YOU'VE BLOWN IT" screen + draw_failure_screen(ticks) + if ticks >= 2000 then + scene_manager.death_mode_state = scene_manager.death_mode_state + 1 -- show laserdisc death video + seek_laserdisc_to(scene_manager.current_sequence.death_start_frame) + end + elseif scene_manager.death_mode_state == 2 then -- showing the laserdisc death video clip. + local end_frame = scene_manager.current_sequence.death_end_frame + if not show_hanging_scene then + end_frame = end_frame - 260 + end + if scene_manager.laserdisc_frame >= end_frame then + scene_manager.death_mode_state = 0 -- done. + if scene_manager.lives_left == 0 then + game_over(false) + else + -- In Cliff Hanger, you have to complete each scene in order, before you can do a different one. + -- don't halt the laserdisc here, the audio from the death scene plays over the start screen. + start_scene(scene_manager.current_scene_num, scene_manager.current_sequence.restart_move) -- move back to where the sequence prescribes. + scene_manager.scene_start_tick_offset = ticks + end + end + end +end + +local function kill_player() + if (not infinite_lives) and (test_scene == nil) then + scene_manager.lives_left = scene_manager.lives_left - 1 + end + + DirkSimple.log("Killing player (lives now left=" .. scene_manager.lives_left .. ")") + + if (scene_manager.last_failed_scene == scene_manager.current_scene_num) and (scene_manager.last_failed_sequence == scene_manager.current_sequence_num) then + scene_manager.failures_in_a_row = scene_manager.failures_in_a_row + 1 + else + scene_manager.failures_in_a_row = 1 + scene_manager.last_failed_scene = scene_manager.current_scene_num + scene_manager.last_failed_sequence = scene_manager.current_sequence_num + end + + scene_manager.death_mode_state = 1 + halt_laserdisc() -- set the scene tick count back to zero; ticking the death scene will start the disc once the initial message is done. + draw_failure_screen(0) +end + +local function move_was_made(inputs, actions) + if actions ~= nil then + for i,v in ipairs(actions) do + local input = v + if input == "hands" then + input = "action" + elseif input == "feet" then + input = "action2" + end + + if inputs.pressed[input] then -- we got one! + DirkSimple.log("accepted action '" .. v .. "' at " .. tostring(scene_manager.current_scene_ticks / 1000.0)) + return v + end + end + end + return nil +end + +local function draw_hud_lives_left() + local lives = scene_manager.lives_left + if lives > 6 then + lives = 6 + end + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, 21, 0, mapcolor("black")) + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, 20, 0, mapcolor("black")) + draw_sprite_chars("cliffglyphs", 94, 0, 1, 1, 20, 0, mapcolor("purple")) + for i = 1,lives,1 do + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, 20-i, 0, mapcolor("black")) + draw_sprite_chars("cliffglyphs", 112, 0, 1, 1, 20-i, 0, mapcolor("purple")) + end + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, 20-(lives+1), 0, mapcolor("black")) + draw_sprite_chars("cliffglyphs", 60, 0, 1, 1, 20-(lives+1), 0, mapcolor("purple")) +end + +local function draw_hud_current_score() + local score = "" .. scene_manager.current_score + local scorex = 10 - #score + for i = 1,#score+3,1 do -- draw black background for text + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, (scorex-2) + i, 0, mapcolor("black")) + end + draw_text(score, scorex, y, mapcolor("purple")) + draw_sprite_chars("cliffglyphs", 60, 0, 1, 1, scorex - 1, 0, mapcolor("purple")) + draw_sprite_chars("cliffglyphs", 94, 0, 1, 1, scorex + #score, 0, mapcolor("purple")) +end + +local function draw_hud_action_hint(actions) + if (actions == nil) or (#actions == 0) then + return + end + + local hint = nil + local hintx = nil + if show_full_hints then + hint = "" + local comma = "" + for i,v in ipairs(actions) do + hint = hint .. comma .. v + comma = ", " + end + hintx = (40 - (#hint + 5)) / 2 + else + for i,v in ipairs(actions) do + local input = v + if input == "up" or input == "down" or input == "left" or input == "right" then + hint = "STICK" + hintx = 15 + break + elseif input == "hands" or input == "feet" then + hint = "ACTION" + hintx = 14 + break + end + end + end + + if hint ~= nil then + for i = 1,(#hint+5),1 do -- draw black background for text + draw_sprite_chars("cliffglyphs", 95, 0, 1, 1, (hintx - 1) + i, 23, mapcolor("black")) + end + draw_sprite_chars("cliffglyphs", 60, 0, 1, 1, hintx, 23, mapcolor("purple")) + draw_text(hint, hintx + 2, 23, mapcolor("purple")) + draw_sprite_chars("cliffglyphs", 94, 0, 1, 1, hintx + #hint + 4, 23, mapcolor("purple")) + end +end + +local function tick_game(inputs) + -- if sequence is nil, we've run through all the moves for the scene and are just waiting on the scene to finish playing. + local sequence = scene_manager.current_sequence + local laserdisc_frame = scene_manager.laserdisc_frame + local ticks = scene_manager.current_scene_ticks + + --DirkSimple.log("TICK GAME: ticks=" .. ticks .. ", laserdisc_frame=" .. laserdisc_frame) + + if show_lives_and_score then + draw_hud_lives_left() + draw_hud_current_score() + end + + -- see if it's time to shift to the next sequence. + if (sequence ~= nil) and (laserdisc_frame >= sequence.end_frame) then + if (scene_manager.accepted_input == nil) and (sequence.correct_moves ~= nil) and (#sequence.correct_moves ~= 0) and (not god_mode) then + -- uhoh, player did nothing, they blew it. + kill_player() + return + end + + -- ok, you survived this sequence, moving on to the next! + scene_manager.accepted_input = nil + scene_manager.current_sequence_num = scene_manager.current_sequence_num + 1 + scene_manager.current_sequence = scene_manager.current_scene.moves[scene_manager.current_sequence_num] + sequence = scene_manager.current_sequence + + if sequence == nil then -- did we run out of sequences? + DirkSimple.log("Finished all sequences in this scene!") + else + local seqname = sequence.name + if seqname ~= nil then + seqname = " (" .. seqname .. ")" + else + seqname = '' + end + DirkSimple.log("Moving on to sequence " .. scene_manager.current_sequence_num .. seqname) + end + end + + -- are we in the window for moves in this sequence? + if (sequence ~= nil) and (scene_manager.accepted_input == nil) and (laserdisc_frame >= sequence.start_frame) then + if move_was_made(inputs, sequence.incorrect_moves) and (not god_mode) then + kill_player() + return + else + if show_hints then + draw_hud_action_hint(sequence.correct_moves) + end + if #sequence.correct_moves > 0 then + if god_mode then + scene_manager.accepted_input = sequence.correct_moves[1] + else + scene_manager.accepted_input = move_was_made(inputs, sequence.correct_moves) + end + if scene_manager.accepted_input ~= nil then -- correct move was just made! + scene_manager.current_score = scene_manager.current_score + 5000 + end + end + end + end + + -- see if the entire scene has ended. + if laserdisc_frame >= scene_manager.current_scene.end_frame then + scene_manager.current_score = scene_manager.current_score + 10000 + if scene_manager.current_scene_num >= #scenes then -- out of scenes? You won the game! + game_over(true) + else + halt_laserdisc() + start_scene(scene_manager.current_scene_num + 1, 0) + end + end +end + +local function draw_start_play_screen(ticks) + DirkSimple.clear_screen(mapcolor("dark_blue")) + draw_text("PLAYER # 1", 15, 9, mapcolor("white")) + local lives_left = scene_manager.lives_left + if lives_left == starting_lives then + draw_text("G O O D L U C K ! ! !", 8, 13, mapcolor("white")) + else + local scorestr = "" .. scene_manager.current_score + draw_text("YOUR SCORE IS", 7, 12, mapcolor("white")) + draw_text(scorestr, 21 + (8 - #scorestr), 12, mapcolor("white")) + local lives_left_msg = "You have 1 life left." + if lives_left > 1 then + lives_left_msg = "You have " .. lives_left .. " lives left." + end + draw_text(lives_left_msg, 7, 14, mapcolor("white")) + end + + local total = DirkSimple.truncate(ticks / 64) + 1 + if total > 5 then + total = 5 + end + for i = 1,total,1 do + draw_standard_rectangle(i-1, mapcolor("white")) + end +end + +local function tick_scene_start() + if scene_manager.scene_start_state > 0 then + local ticks = scene_manager.current_scene_ticks - scene_manager.scene_start_tick_offset + draw_start_play_screen(ticks) + if ticks > 2000 then + halt_laserdisc() -- this just makes the engine replace the current frame of video with black + if scene_manager.scene_start_state == 1 then + seek_laserdisc_to(scene_manager.current_scene.start_frame) + else + seek_laserdisc_to(scene_manager.current_sequence.start_frame) + end + scene_manager.scene_start_state = 0 + scene_manager.scene_start_tick_offset = 0 + end + end +end + +local function draw_buy_in_screen(ticks, timeleft) + DirkSimple.clear_screen(mapcolor("magenta")) + + local total = DirkSimple.truncate(ticks / 64) + 1 + if total > 5 then + total = 5 + end + for i = 1,total,1 do + draw_standard_rectangle(i-1, mapcolor("white")) + end + + if ticks > 320 then + draw_text("PLAYER # 1", 15, 7, mapcolor("white")) + draw_text("If you wish to continue", 8, 9, mapcolor("white")) + draw_text("playing this level", 11, 10, mapcolor("white")) + draw_text("Press Player 1 button", 9, 14, mapcolor("white")) + draw_text("Time left to buy-in : " .. timeleft, 8, 17, mapcolor("white")) + end +end + +local function draw_congrats_screen(ticks) + if ticks < (96 * 64) then + local fg = "light_blue" + local bg = "light_red" + DirkSimple.clear_screen(mapcolor(bg)) + local segment = DirkSimple.truncate(ticks / 96) % 3 + if segment == 0 then + draw_text("* * * * * * * * *", 7, 9, mapcolor(fg)) + draw_text(" ", 7, 10, mapcolor(fg)) + draw_text("* CONGRATULATIONS ", 7, 11, mapcolor(fg)) + draw_text(" *", 7, 12, mapcolor(fg)) + draw_text(" YOU HAVE COMPLETED ", 7, 13, mapcolor(fg)) + draw_text("* THIS CHALLENGE ", 7, 14, mapcolor(fg)) + draw_text(" *", 7, 15, mapcolor(fg)) + draw_text(" * * * * * * * ", 7, 16, mapcolor(fg)) + elseif segment == 1 then + draw_text(" * * * * * * * * ", 7, 9, mapcolor(fg)) + draw_text("* *", 7, 10, mapcolor(fg)) + draw_text(" CONGRATULATIONS ", 7, 11, mapcolor(fg)) + draw_text(" ", 7, 12, mapcolor(fg)) + draw_text("* YOU HAVE COMPLETED *", 7, 13, mapcolor(fg)) + draw_text(" THIS CHALLENGE ", 7, 14, mapcolor(fg)) + draw_text(" ", 7, 15, mapcolor(fg)) + draw_text("* * * * * * * * *", 7, 16, mapcolor(fg)) + elseif segment == 2 then + draw_text(" * * * * * * * * ", 7, 9, mapcolor(fg)) + draw_text(" ", 7, 10, mapcolor(fg)) + draw_text(" CONGRATULATIONS *", 7, 11, mapcolor(fg)) + draw_text("* ", 7, 12, mapcolor(fg)) + draw_text(" YOU HAVE COMPLETED ", 7, 13, mapcolor(fg)) + draw_text(" THIS CHALLENGE *", 7, 14, mapcolor(fg)) + draw_text("* ", 7, 15, mapcolor(fg)) + draw_text("* * * * * * * * ", 7, 16, mapcolor(fg)) + end + else + local fg = "white" + local bg = "dark_blue" + if ticks < ((96 * 64) + (32 * 30)) then + if (DirkSimple.truncate(ticks / 32) % 2) == 1 then + bg = "dark_red" + end + end + draw_text("*************************", 7, 9, mapcolor(fg)) + draw_text("* *", 7, 10, mapcolor(fg)) + draw_text("* CONGRATULATIONS *", 7, 11, mapcolor(fg)) + draw_text("* *", 7, 12, mapcolor(fg)) + draw_text("* YOU HAVE COMPLETED *", 7, 13, mapcolor(fg)) + draw_text("* THIS CHALLENGE *", 7, 14, mapcolor(fg)) + draw_text("* *", 7, 15, mapcolor(fg)) + draw_text("*************************", 7, 16, mapcolor(fg)) + end +end + +local game_over_flash_colors = { -- { foreground, background } + { "black", "black" }, + { "medium_green", "black" }, + { "light_green", "black" }, + { "dark_blue", "black" }, + { "light_blue", "black" }, + { "dark_red", "black" }, + { "light_cyan", "black" }, + { "medium_red", "black" }, + { "light_red", "black" }, + { "dark_yellow", "black" }, + { "light_yellow", "black" }, + { "dark_green", "black" }, + { "magenta", "black" }, + { "grey", "dark_blue" }, + { "white", "dark_red" }, + { "white", "dark_blue" }, + { "white", "black" }, + { "white", "black" }, +} + +local function draw_game_over_screen(ticks) + local flashidx = DirkSimple.truncate(ticks / 160) + 1 + if flashidx > #game_over_flash_colors then + flashidx = #game_over_flash_colors + end + local flashcolor = game_over_flash_colors[flashidx] + local fg = flashcolor[1] + local bg = flashcolor[2] + + DirkSimple.clear_screen(mapcolor(bg)) + draw_text("******************", 12, 9, mapcolor(fg)) + draw_text("* *", 12, 10, mapcolor(fg)) + draw_text("* YOUR GAME *", 12, 11, mapcolor(fg)) + draw_text("* *", 12, 12, mapcolor(fg)) + draw_text("* IS NOW OVER *", 12, 13, mapcolor(fg)) + draw_text("* *", 12, 14, mapcolor(fg)) + draw_text("******************", 12, 15, mapcolor(fg)) +end + +local initial_entry_string = "abcdefghijklmnopqrstuvwxyz *?"; -- everything but the backspace at the end +local function draw_highscore_entry_screen() + local scorestr = "" .. scene_manager.current_score + local fg = "dark_red" + local selected = scene_manager.player_initials_selected_glyph + local backspace = 63 -- glyph index + local caret = 62 -- glyph index + + DirkSimple.clear_screen(mapcolor("black")) + draw_text("CONGRATULATIONS PLAYER 1", 8, 1, mapcolor(fg)) + draw_text("YOUR SCORE", 9, 3, mapcolor(fg)) + draw_text(scorestr, 20 + (8 - #scorestr), 3, mapcolor(fg)) + draw_text("IS IN THE TOP TEN SCORES", 8, 5, mapcolor(fg)) + draw_text("PLEASE ENTER YOUR INITIALS", 7, 8, mapcolor(fg)) + draw_text(initial_entry_string, 5, 11, mapcolor(fg)) + draw_sprite_chars("cliffglyphs", backspace, 0, 1, 1, 34, 11, mapcolor(fg)) + draw_sprite_chars("cliffglyphs", caret, 0, 1, 1, 5 + selected, 12, mapcolor(fg)) + draw_rectangle(18, 13, 3, 1, mapcolor(fg)) + + for i = 1,scene_manager.player_initials_entered,1 do + draw_text(scene_manager.player_initials[i], 18+i, 14, mapcolor(fg)) + end + + if scene_manager.player_initials_entered < 3 then + local x = 18+scene_manager.player_initials_entered+1 + if selected == 29 then -- backspace? + draw_sprite_chars("cliffglyphs", backspace, 0, 1, 1, x, 14, mapcolor(fg)) + else + draw_text(initial_entry_string:sub(selected + 1, selected + 1), x, 14, mapcolor(fg)) + end + end + + draw_text("YOU CAN USE", 14, 17, mapcolor(fg)) + draw_text("THE JOYSTICK TO SELECT LETTERS", 5, 19, mapcolor(fg)) + draw_text("BUT YOU MUST USE", 12, 21, mapcolor(fg)) + draw_text("YOUR HANDS TO ENTER THEM.", 7, 23, mapcolor(fg)) +end + +local function insert_highscore(list, name, score) + for i,v in ipairs(list) do + if score > v[2] then + table.insert(list, i, { name, score }) + table.remove(list) + break + end + end +end + +local function tick_game_over(inputs) + local ticks = scene_manager.current_scene_ticks + if scene_manager.game_over_state == 1 then -- game_over_state == 1? You won! + draw_congrats_screen(ticks) + if ticks >= (((96 * 64) + (32 * 30)) + 2000) then + halt_laserdisc() -- this just makes the tick count go back to zero. + scene_manager.game_over_state = scene_manager.game_over_state + 2 -- skip over buy-in, there's no game left to continue. + end + elseif scene_manager.game_over_state == 2 then -- game_over_state == 2? "Buy in" mode, where they let you continue (for more money in the arcade, of course). + local timeleft = 9 - DirkSimple.truncate((ticks - 320) / 1000) + + local showtimeleft = timeleft + if showtimeleft <= 0 then + showtimeleft = 1 -- bump so the last frame doesn't render to zero. + end + draw_buy_in_screen(ticks, showtimeleft) + + if inputs ~= nil and inputs.pressed["start"] then -- user decided to continue current game + scene_manager.lives_left = starting_lives + scene_manager.game_over_state = 0 + start_scene(scene_manager.current_scene_num, scene_manager.current_sequence.restart_move) -- move back to where the sequence prescribes. + scene_manager.scene_start_tick_offset = 0 + elseif timeleft == 0 then + halt_laserdisc() -- this just makes the tick count go back to zero. + scene_manager.game_over_state = scene_manager.game_over_state + 1 -- move on to actual game over screen. + end + elseif scene_manager.game_over_state == 3 then -- game_over_state == 3? Decide if this was a high score. + scene_manager.game_over_state = scene_manager.game_over_state + 1 -- Maybe move on to entering player initials. + if scene_manager.current_score < today_highscores[#today_highscores][2] then -- today's lowest highscore must be lower than any alltime high score, so we don't check that. + scene_manager.game_over_state = scene_manager.game_over_state + 1 -- skip initial entry, go right to game over. + end + return tick_game_over(inputs) -- do it right now. + elseif scene_manager.game_over_state == 4 then -- game_over_state == 4? User is entering initials. + if inputs.pressed["left"] then + if scene_manager.player_initials_selected_glyph == 0 then + scene_manager.player_initials_selected_glyph = 29 + else + scene_manager.player_initials_selected_glyph = scene_manager.player_initials_selected_glyph - 1 + end + end + if inputs.pressed["right"] then + scene_manager.player_initials_selected_glyph = (scene_manager.player_initials_selected_glyph + 1) % 30 + end + if inputs.pressed["action"] then + local selected = scene_manager.player_initials_selected_glyph + if selected == 29 then -- backspace? + if scene_manager.player_initials_entered > 0 then + scene_manager.player_initials[scene_manager.player_initials_entered] = ' ' + scene_manager.player_initials_entered = scene_manager.player_initials_entered - 1 + end + else + scene_manager.player_initials_entered = scene_manager.player_initials_entered + 1 + scene_manager.player_initials[scene_manager.player_initials_entered] = initial_entry_string:sub(selected + 1, selected + 1); + if scene_manager.player_initials_entered == 3 then + local finalstr = scene_manager.player_initials[1] .. scene_manager.player_initials[2] .. scene_manager.player_initials[3] + finalstr = finalstr:upper() + DirkSimple.log("Player entered high score initials '" .. finalstr .. "' for a score of " .. scene_manager.current_score) + insert_highscore(alltime_highscores, finalstr, scene_manager.current_score) + insert_highscore(today_highscores, finalstr, scene_manager.current_score) + halt_laserdisc() -- this just makes the tick count go back to zero. + scene_manager.game_over_state = scene_manager.game_over_state + 1 -- move on to actual Game Over. + end + end + end + draw_highscore_entry_screen() + elseif scene_manager.game_over_state == 5 then -- game_over_state == 5? Actual game over screen. + draw_game_over_screen(ticks) + if ticks >= ((160 * #game_over_flash_colors) + 2000) then + halt_laserdisc() -- this just makes the tick count go back to zero. + scene_manager.game_over_state = scene_manager.game_over_state + 1 -- move on to high score list + end + elseif scene_manager.game_over_state == 6 then -- game_over_state == 6? Show high scores. + draw_high_scores(ticks) + if ticks >= 5000 then -- we're done, go back to attract mode. + start_attract_mode() + end + end +end + +DirkSimple.tick = function(ticks, sequenceticks, inputs) + scene_manager.current_scene_ticks = sequenceticks + scene_manager.unserialize_offset + if scene_manager.last_seek == -1 then + scene_manager.laserdisc_frame = -1 + else + scene_manager.laserdisc_frame = ((scene_manager.last_seek + scene_manager.current_scene_ticks) / (1000.0 / 29.97)) + 6 + end + + if scene_manager.attract_mode_state ~= 0 then + tick_attract_mode(inputs) + elseif scene_manager.death_mode_state ~= 0 then + tick_death_scene() + elseif scene_manager.scene_start_state ~= 0 then + tick_scene_start() + elseif scene_manager.game_over_state ~= 0 then + tick_game_over(inputs) + elseif scene_manager.current_scene == nil then + start_attract_mode() + else + tick_game(inputs) + end +end + +DirkSimple.serialize = function() + if not scene_manager.initialized then + setup_scene_manager() -- just so we can serialize a default state. + end + + local state = {} + state[#state + 1] = 2 -- current serialization version + state[#state + 1] = scene_manager.lives_left + state[#state + 1] = scene_manager.current_score + state[#state + 1] = scene_manager.last_failed_scene + state[#state + 1] = scene_manager.last_failed_sequence + state[#state + 1] = scene_manager.failures_in_a_row + state[#state + 1] = scene_manager.attract_mode_state + state[#state + 1] = scene_manager.death_mode_state + state[#state + 1] = scene_manager.game_over_state + state[#state + 1] = scene_manager.player_initials[1]:byte() + state[#state + 1] = scene_manager.player_initials[2]:byte() + state[#state + 1] = scene_manager.player_initials[3]:byte() + state[#state + 1] = scene_manager.player_initials_entered + state[#state + 1] = scene_manager.player_initials_selected_glyph + state[#state + 1] = scene_manager.scene_start_state + state[#state + 1] = scene_manager.scene_start_tick_offset + state[#state + 1] = scene_manager.last_seek + state[#state + 1] = scene_manager.current_scene_num + state[#state + 1] = scene_manager.current_sequence_num + state[#state + 1] = scene_manager.current_scene_ticks + state[#state + 1] = scene_manager.accepted_input + + return state +end + + +DirkSimple.unserialize = function(state) + -- !!! FIXME: this function assumes that `state` is completely valid. It doesn't check array length or data types. + setup_scene_manager() + + local idx = 1 + local version = state[idx] ; idx = idx + 1 + if version == 1 then idx = idx + 1 end -- this was scene_manager.infinite_lives, but that's a cvar now. + scene_manager.lives_left = state[idx] ; idx = idx + 1 + scene_manager.current_score = state[idx] ; idx = idx + 1 + scene_manager.last_failed_scene = state[idx] ; idx = idx + 1 + scene_manager.last_failed_sequence = state[idx] ; idx = idx + 1 + scene_manager.failures_in_a_row = state[idx] ; idx = idx + 1 + scene_manager.attract_mode_state = state[idx] ; idx = idx + 1 + scene_manager.death_mode_state = state[idx] ; idx = idx + 1 + scene_manager.game_over_state = state[idx] ; idx = idx + 1 + scene_manager.player_initials[1] = string.char(state[idx]) ; idx = idx + 1 + scene_manager.player_initials[2] = string.char(state[idx]) ; idx = idx + 1 + scene_manager.player_initials[3] = string.char(state[idx]) ; idx = idx + 1 + scene_manager.player_initials_entered = state[idx] ; idx = idx + 1 + scene_manager.player_initials_selected_glyph = state[idx] ; idx = idx + 1 + scene_manager.scene_start_state = state[idx] ; idx = idx + 1 + scene_manager.scene_start_tick_offset = state[idx] ; idx = idx + 1 + scene_manager.last_seek = state[idx] ; idx = idx + 1 + scene_manager.current_scene_num = state[idx] ; idx = idx + 1 + scene_manager.current_sequence_num = state[idx] ; idx = idx + 1 + scene_manager.current_scene_ticks = state[idx] ; idx = idx + 1 + scene_manager.accepted_input = state[idx] ; idx = idx + 1 + + scene_manager.unserialize_offset = scene_manager.current_scene_ticks + + if scene_manager.current_scene_num ~= 0 then + scene_manager.current_scene = scenes[scene_manager.current_scene_num] + if scene_manager.current_sequence_num ~= 0 then + scene_manager.current_sequence = scene_manager.current_scene[scene_manager.current_sequence_num] + end + end + + if last_seek == -1 then + scene_manager.laserdisc_frame = -1 + halt_laserdisc() + else + scene_manager.laserdisc_frame = ((scene_manager.last_seek + scene_manager.current_scene_ticks) / (1000.0 / 29.97)) + 6 + DirkSimple.start_clip(scene_manager.last_seek + scene_manager.unserialize_offset) + end + + return true +end + + +setup_scene_manager() -- Call this during initial load to make sure the table is ready to go. + +local default_highscores = { + { "JMH", 1000000 }, + { "PMR", 90000 }, + { "EMJ", 80000 }, + { "APH", 70000 }, + { "VAV", 60000 }, + { "MAS", 50000 }, + { "JON", 40000 }, + { "WHO", 30000 }, + { "HP?", 20000 }, + { "JIM", 10000 } +} + +local function initialize_highscore() + local retval = {} + for i,v in ipairs(default_highscores) do + retval[i] = {} + retval[i][1] = default_highscores[i][1] + retval[i][2] = default_highscores[i][2] + end + return retval +end + +alltime_highscores = initialize_highscore() +today_highscores = initialize_highscore() + + + +-- The scene table! +-- https://www.jeffsromhack.com/code/cliffhanger.htm +scenes = { + + -- scene 1 + { + scene_name = "Casino Heist", + start_frame = 1547, + end_frame = 3160, + dunno1_frame = 0, + dunno2_frame = 0, + moves = { + { + name = "Running from the casino", + correct_moves = {}, + incorrect_moves = {}, + start_frame = 1800, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + name = "Jump first hurdle", + correct_moves = { "feet" }, + incorrect_moves = { "hands" }, + start_frame = 1928, + end_frame = 1987, + death_start_frame = 3930, + death_end_frame = 4234, + restart_move = 1 + }, + { + name = "Jump second hurdle", + correct_moves = { "feet" }, + incorrect_moves = { "hands" }, + start_frame = 1990, + end_frame = 2040, + death_start_frame = 3930, + death_end_frame = 4234, + restart_move = 2 + }, + { + name = "Get in the car, loser.", + correct_moves = { "hands" }, + incorrect_moves = { "feet" }, + start_frame = 2120, + end_frame = 2160, + death_start_frame = 3930, + death_end_frame = 4234, + restart_move = 2 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "down" }, + start_frame = 2186, + end_frame = 2226, + death_start_frame = 3930, + death_end_frame = 4234, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 2276, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 7 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 2419, + end_frame = 2459, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 2447, + end_frame = 2487, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "hands", "feet", "up" }, + start_frame = 2464, + end_frame = 2504, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "up", "down", "right" }, + start_frame = 2513, + end_frame = 2553, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 2549, + end_frame = 2589, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "feet", "left", "right" }, + start_frame = 2640, + end_frame = 2680, + death_start_frame = 3214, + death_end_frame = 3500, + restart_move = 7 + }, + } + }, + + -- scene 2 + { + scene_name = "The Getaway", + start_frame = 4776, + end_frame = 8074, + dunno1_frame = 4592, + dunno2_frame = 0, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 5186, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5388, + end_frame = 5428, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "right", "down", "up" }, + start_frame = 5418, + end_frame = 5458, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 5484, + end_frame = 5524, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 2 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5516, + end_frame = 5556, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 5560, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5600, + end_frame = 5640, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 7 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5680, + end_frame = 5720, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 7 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5710, + end_frame = 5750, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 7 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5752, + end_frame = 5792, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 7 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "feet", "hands", "left", "up", "down" }, + start_frame = 5802, + end_frame = 5842, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 7 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "feet", "hands" }, + start_frame = 5874, + end_frame = 5914, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 7 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 5920, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right", "up", "down" }, + start_frame = 6000, + end_frame = 6040, + death_start_frame = 9794, + death_end_frame = 10081, + restart_move = 14 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 6108, + end_frame = 6148, + death_start_frame = 9794, + death_end_frame = 10081, + restart_move = 14 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right", "up", "down" }, + start_frame = 6278, + end_frame = 6318, + death_start_frame = 9794, + death_end_frame = 10081, + restart_move = 14 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 6342, + end_frame = 6382, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 14 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet", "left", "down" }, + start_frame = 6496, + end_frame = 6536, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 14 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 6694, + end_frame = 6734, + death_start_frame = 10105, + death_end_frame = 10427, + restart_move = 14 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right", "up", "down" }, + start_frame = 6904, + end_frame = 6944, + death_start_frame = 10105, + death_end_frame = 10427, + restart_move = 14 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 6974, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "hands", "feet", "left", "right", "up" }, + start_frame = 7015, + end_frame = 7055, + death_start_frame = 10105, + death_end_frame = 10427, + restart_move = 22 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right", "up", "down" }, + start_frame = 7114, + end_frame = 7154, + death_start_frame = 10105, + death_end_frame = 10427, + restart_move = 22 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 7202, + end_frame = 7242, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 22 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 7239, + end_frame = 7279, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 22 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 7284, + end_frame = 7324, + death_start_frame = 8120, + death_end_frame = 8409, + restart_move = 22 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "hands", "left", "right", "up", "down" }, + start_frame = 7403, + end_frame = 7443, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 22 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 7470, + end_frame = 7510, + death_start_frame = 8439, + death_end_frame = 8732, + restart_move = 22 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 7958, + end_frame = 7998, + death_start_frame = 11753, + death_end_frame = 12215, + restart_move = 22 + }, + } + }, + + -- scene 3 + { + scene_name = "Rooftops", + start_frame = 12397, + end_frame = 17248, + dunno1_frame = 12247, + dunno2_frame = 0, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 12460, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 12702, + end_frame = 12742, + death_start_frame = 17251, + death_end_frame = 17820, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 12725, + end_frame = 12765, + death_start_frame = 17251, + death_end_frame = 17820, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 13601, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 13866, + end_frame = 13906, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 13888, + end_frame = 13918, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 13898, + end_frame = 13928, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 13944, + end_frame = 13984, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14044, + end_frame = 14084, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14256, + end_frame = 14296, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14343, + end_frame = 14383, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 5 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 14569, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 14668, + end_frame = 14708, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 13 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14694, + end_frame = 14734, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 13 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14788, + end_frame = 14818, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 13 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 14818, + end_frame = 14858, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 13 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 15014, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 15143, + end_frame = 15183, + death_start_frame = 18596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "up" }, + start_frame = 15221, + end_frame = 15261, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 15232, + end_frame = 15272, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 15253, + end_frame = 15293, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 15270, + end_frame = 15310, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet", "down" }, + start_frame = 15296, + end_frame = 15336, + death_start_frame = 19596, + death_end_frame = 19889, + restart_move = 18 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 15750, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet", "down" }, + start_frame = 15884, + end_frame = 15914, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 16054, + end_frame = 16094, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 16094, + end_frame = 16134, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 16137, + end_frame = 16177, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 16170, + end_frame = 16210, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 16222, + end_frame = 16262, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 16254, + end_frame = 16294, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet", "right" }, + start_frame = 16307, + end_frame = 16347, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet", "left" }, + start_frame = 16339, + end_frame = 16379, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 16392, + end_frame = 16432, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 16424, + end_frame = 16464, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 16998, + end_frame = 17038, + death_start_frame = 18235, + death_end_frame = 18577, + restart_move = 25 + }, + } + }, + + -- scene 4 + { + scene_name = "Highway", + start_frame = 20891, + end_frame = 23321, + dunno1_frame = 20741, + dunno2_frame = 0, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 21240, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 21553, + end_frame = 21583, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 21570, + end_frame = 21600, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 21594, + end_frame = 21614, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 21640, + end_frame = 21670, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 21669, + end_frame = 21699, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 21698, + end_frame = 21728, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 21727, + end_frame = 21757, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 21826, + end_frame = 21856, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 21897, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22004, + end_frame = 22034, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22050, + end_frame = 22080, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22065, + end_frame = 22095, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22097, + end_frame = 22117, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22102, + end_frame = 22132, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22146, + end_frame = 22176, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22160, + end_frame = 22190, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 11 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22224, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22237, + end_frame = 22267, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22250, + end_frame = 22280, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22264, + end_frame = 22294, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22326, + end_frame = 22356, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22345, + end_frame = 22375, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22384, + end_frame = 22404, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22403, + end_frame = 22433, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22424, + end_frame = 22454, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 19 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22492, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet", "left", "right", "down" }, + start_frame = 22494, + end_frame = 22524, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22500, + end_frame = 22530, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22538, + end_frame = 22568, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22556, + end_frame = 22586, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22580, + end_frame = 22610, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22592, + end_frame = 22622, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22610, + end_frame = 22640, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 28 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22683, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22689, + end_frame = 22719, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22702, + end_frame = 22732, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22730, + end_frame = 22760, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22750, + end_frame = 22780, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22784, + end_frame = 22814, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22794, + end_frame = 22824, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22845, + end_frame = 22875, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 36 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 22925, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet", "left", "right", "down" }, + start_frame = 22941, + end_frame = 22971, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 22955, + end_frame = 22985, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 22995, + end_frame = 23025, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 23010, + end_frame = 23040, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 23035, + end_frame = 23065, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 23046, + end_frame = 23076, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 23058, + end_frame = 23088, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 23148, + end_frame = 23178, + death_start_frame = 23358, + death_end_frame = 23640, + restart_move = 44 + }, + } + }, + + -- scene 5 + { + scene_name = "The Castle Battle", + start_frame = 25728, + end_frame = 26387, + dunno1_frame = 25579, + dunno2_frame = 25727, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 25729, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25715, + end_frame = 25745, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25765, + end_frame = 25795, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25795, + end_frame = 25825, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25800, + end_frame = 25830, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25808, + end_frame = 25838, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 25824, + end_frame = 25854, + death_start_frame = 26423, + death_end_frame = 26705, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 25931, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 25944, + end_frame = 25974, + death_start_frame = 27725, + death_end_frame = 28014, + restart_move = 9 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 25996, + end_frame = 26026, + death_start_frame = 27725, + death_end_frame = 28014, + restart_move = 9 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 26146, + end_frame = 26176, + death_start_frame = 27725, + death_end_frame = 28014, + restart_move = 9 + }, + } + }, + + -- scene 6 + { + scene_name = "Finale", + start_frame = 28514, + end_frame = 31212, + dunno1_frame = 28363, + dunno2_frame = 28510, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 28836, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 28900, + end_frame = 28930, + death_start_frame = 31275, + death_end_frame = 31619, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 29422, + end_frame = 29452, + death_start_frame = 31275, + death_end_frame = 31619, + restart_move = 2 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 29622, + end_frame = 29652, + death_start_frame = 31275, + death_end_frame = 31619, + restart_move = 2 + }, + { + correct_moves = { "hands", "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 30098, + end_frame = 30128, + death_start_frame = 31999, + death_end_frame = 32379, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 30460, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 30794, + end_frame = 30814, + death_start_frame = 31999, + death_end_frame = 32379, + restart_move = 7 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 30804, + end_frame = 30834, + death_start_frame = 31999, + death_end_frame = 32379, + restart_move = 7 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 30834, + end_frame = 30864, + death_start_frame = 31999, + death_end_frame = 32379, + restart_move = 7 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 30890, + end_frame = 30920, + death_start_frame = 32399, + death_end_frame = 32692, + restart_move = 7 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 30954, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 31063, + end_frame = 31093, + death_start_frame = 32797, + death_end_frame = 33102, + restart_move = 12 + }, + } + }, + + -- scene 7 + { + scene_name = "Finale II", + start_frame = 33255, + end_frame = 37138, + dunno1_frame = 33105, + dunno2_frame = 33252, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 31063, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33668, + end_frame = 33698, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33704, + end_frame = 33734, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 33710, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33720, + end_frame = 33750, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33733, + end_frame = 33763, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 33760, + end_frame = 33790, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33824, + end_frame = 33854, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33830, + end_frame = 33860, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 33840, + end_frame = 33870, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 33922, + end_frame = 33952, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 33938, + end_frame = 33968, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 33990, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 34030, + end_frame = 34060, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 14 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 34100, + end_frame = 34130, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 14 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 34130, + end_frame = 34160, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 14 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 34286, + end_frame = 34316, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 14 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 34402, + end_frame = 34432, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 14 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 34620, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35012, + end_frame = 35042, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "down" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 35170, + end_frame = 35200, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35374, + end_frame = 35404, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35785, + end_frame = 35815, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35873, + end_frame = 35903, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35889, + end_frame = 35919, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 20 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 35955, + end_frame = 35985, + death_start_frame = 39727, + death_end_frame = 40184, + restart_move = 20 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 36020, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 36164, + end_frame = 36194, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 28 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 36327, + end_frame = 36357, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 28 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 36477, + end_frame = 36507, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 28 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 36593, + end_frame = 36623, + death_start_frame = 37192, + death_end_frame = 37511, + restart_move = 28 + }, + } + }, + + -- scene 8 + { + scene_name = "Ending", + start_frame = 41587, + end_frame = 46880, + dunno1_frame = 41436, + dunno2_frame = 41584, + moves = { + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 41587, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 41574, + end_frame = 41604, + death_start_frame = 46960, + death_end_frame = 47256, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 41662, + end_frame = 41692, + death_start_frame = 46960, + death_end_frame = 47256, + restart_move = 2 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 41713, + end_frame = 41743, + death_start_frame = 46960, + death_end_frame = 47256, + restart_move = 2 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 42550, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 42676, + end_frame = 42706, + death_start_frame = 47289, + death_end_frame = 47578, + restart_move = 6 + }, + { + correct_moves = { "up" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 42827, + end_frame = 42857, + death_start_frame = 47289, + death_end_frame = 47578, + restart_move = 6 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 42860, + end_frame = 42890, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 6 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 42902, + end_frame = 42932, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 6 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43068, + end_frame = 43098, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 6 + }, + { + correct_moves = { "right" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 43092, + end_frame = 43102, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 6 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 43163, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43261, + end_frame = 43291, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43286, + end_frame = 43306, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43295, + end_frame = 43325, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43307, + end_frame = 43337, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43320, + end_frame = 43350, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43345, + end_frame = 43375, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43367, + end_frame = 43397, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43434, + end_frame = 43464, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43449, + end_frame = 43479, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43476, + end_frame = 43506, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43515, + end_frame = 43545, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43531, + end_frame = 43561, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43541, + end_frame = 43571, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43556, + end_frame = 43586, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43580, + end_frame = 43610, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43603, + end_frame = 43633, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43670, + end_frame = 43700, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43685, + end_frame = 43715, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43712, + end_frame = 43742, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43756, + end_frame = 43786, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43771, + end_frame = 43801, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43789, + end_frame = 43819, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43816, + end_frame = 43846, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43863, + end_frame = 43893, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43888, + end_frame = 43908, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43899, + end_frame = 43929, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 43926, + end_frame = 43956, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 44151, + end_frame = 44181, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 44304, + end_frame = 44334, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 44437, + end_frame = 44467, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 44530, + end_frame = 44560, + death_start_frame = 47607, + death_end_frame = 47969, + restart_move = 13 + }, + { + correct_moves = {}, + incorrect_moves = {}, + start_frame = 45030, + end_frame = 0, + death_start_frame = 0, + death_end_frame = 0, + restart_move = 1 + }, + { + correct_moves = { "left" }, + incorrect_moves = { "hands", "feet" }, + start_frame = 45298, + end_frame = 45328, + death_start_frame = 48768, + death_end_frame = 49050, + restart_move = 45 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 45394, + end_frame = 45414, + death_start_frame = 46960, + death_end_frame = 47256, + restart_move = 45 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 45525, + end_frame = 45555, + death_start_frame = 46960, + death_end_frame = 47256, + restart_move = 45 + }, + { + correct_moves = { "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 45591, + end_frame = 45621, + death_start_frame = 49225, + death_end_frame = 49634, + restart_move = 45 + }, + { + correct_moves = { "hands", "feet" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 45618, + end_frame = 45648, + death_start_frame = 49225, + death_end_frame = 49634, + restart_move = 45 + }, + { + correct_moves = { "hands" }, + incorrect_moves = { "left", "right", "up", "down" }, + start_frame = 45685, + end_frame = 45715, + death_start_frame = 49225, + death_end_frame = 49634, + restart_move = 45 + }, + } + } +} + +-- end of cliff.lua ... + diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/icon.png b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/icon.png new file mode 100644 index 0000000..14f4b21 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/icon.png differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/logo.png b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/logo.png new file mode 100644 index 0000000..46639e7 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/cliff/logo.png differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/accept.wav b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/accept.wav new file mode 100644 index 0000000..b65b0f6 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/accept.wav differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/coinslot.wav b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/coinslot.wav new file mode 100644 index 0000000..1aa3083 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/coinslot.wav differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/game.lua b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/game.lua new file mode 100644 index 0000000..c1b9419 --- /dev/null +++ b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/game.lua @@ -0,0 +1,4763 @@ +-- DirkSimple; a dirt-simple player for FMV games. +-- +-- Please see the file LICENSE.txt in the source's root directory. +-- +-- This file written by Ryan C. Gordon. +-- + +DirkSimple.gametitle = "Dragon's Lair" + +-- CVARS +local starting_lives = 5 +local infinite_lives = false -- set to true to not lose a life on failure. +local god_mode = false -- if true, game plays correct moves automatically, so you never fail. +local play_sounds = true -- if true, beeps and buzzes play when appropriate, otherwise, skipped. +local draw_hints = false -- if true, draws hint on what button to press. + +DirkSimple.cvars = { + { name="starting_lives", desc="Number of lives player starts with", values="5|4|3|2|1", setter=function(name, value) starting_lives = DirkSimple.to_int(value) end }, + { name="infinite_lives", desc="Don't lose a life when failing", values="false|true", setter=function(name, value) infinite_lives = DirkSimple.to_bool(value) end }, + { name="god_mode", desc="Game plays itself perfectly, never failing", values="false|true", setter=function(name, value) god_mode = DirkSimple.to_bool(value) end }, + { name="play_sounds", desc="Play input sounds", values="true|false", setter=function(name, value) play_sounds = DirkSimple.to_bool(value) end }, + { name="draw_hints", desc="Show hints", values="true|false", setter=function(name, value) draw_hints = DirkSimple.to_bool(value) end }, +} + + +-- SOME INITIAL SETUP STUFF +local scenes = nil -- gets set up later in the file. +local test_scene_name = nil -- set to name of scene to test. nil otherwise! +--test_scene_name = "the_dragons_lair" + +-- GAME STATE +local current_ticks = 0 +local current_inputs = nil +local accepted_input = nil +local play_sound_cooldown = 0 +local scene_manager = nil + + +-- FUNCTIONS + +local function play_sound(name) + if not play_sounds then + return -- beeps and buzzes disabled. + end + + -- Don't let a sound play more than once every 200ms. I don't know if + -- this is what Dragon's Lair actually does, but this prevents it from + -- getting totally annoying. + if play_sound_cooldown < current_ticks then -- eligible to play again? + play_sound_cooldown = current_ticks + 200 + DirkSimple.play_sound(name) + end +end + +local function laserdisc_frame_to_ms(frame) + return ((frame / 23.976) * 1000.0) +end + +local function time_laserdisc_frame(frame) + -- 6297 is the magic millsecond offset between the ROM test screens and the actual game content, I think, + -- When the ROM would ask for a frame, we have to adjust by this number. + -- Since we're filling in the timings from the original ROM's data table, + -- we make this adjustment ourselves. + return laserdisc_frame_to_ms(frame) - 6297.0 +end + +local function time_laserdisc_noseek() + return -1 +end + +local function time_to_ms(seconds, ms) + return (seconds * 1000) + ms +end + +local function start_sequence(sequencename) + DirkSimple.log("Starting sequence '" .. sequencename .. "'") + scene_manager.current_sequence_name = sequencename + scene_manager.current_sequence = scene_manager.current_scene[sequencename] + accepted_input = nil + + local start_time = scene_manager.current_sequence.start_time + if start_time < 0 then -- if negative, no seek desired (just keep playing from current location) + scene_manager.current_sequence_tick_offset = scene_manager.current_sequence_tick_offset + scene_manager.current_sequence_ticks + else + -- will suspend ticking until the seek completes and reset sequence tick count + if scene_manager.current_sequence.is_single_frame then + DirkSimple.show_single_frame(start_time) + else + DirkSimple.start_clip(start_time) + end + scene_manager.last_seek = start_time + scene_manager.current_sequence_tick_offset = 0 + scene_manager.unserialize_offset = 0 + end +end + +local function start_scene(scenename, is_resurrection) + DirkSimple.log("Starting scene '" .. scenename .. "'") + + local sequencename + if is_resurrection then + sequencename = "start_dead" + else + sequencename = "start_alive" + end + + scene_manager.current_scene_name = scenename + scene_manager.current_scene = scenes[scenename] + start_sequence(sequencename) +end + +local function start_attract_mode(after_losing_game_over) + start_scene('attract_mode', after_losing_game_over) +end + +local function game_over(won) + DirkSimple.log("Game over! won=" .. tostring(won)) + + if (won) then + -- The arcade version, at least as far as I can see on DAPHNE runs on YouTube, + -- puts up a frame of Dirk+Daphne in a heart, a few frames from the end + -- of the video, for about 10 seconds. Then it drops directly into attract mode. + -- I've added this single frame of animation to the scene data (where + -- maybe it was already in the original ROM?), so all we need to do here + -- is kick out to attract mode and call it a day. + start_attract_mode(false) + else + if (scene_manager.current_scene ~= nil) and (scene_manager.current_scene.game_over ~= nil) then + start_sequence("game_over") + else + start_attract_mode(true) + end + end +end + +local function choose_next_scene(is_resurrection) + if test_scene_name ~= nil then + start_scene(test_scene_name, is_resurrection) + return + end + + -- Mark current scene as a success or failure. + if scene_manager.current_scene ~= nil then + if scene_manager.current_scene_name == "the_dragons_lair" then + + -- Intro just needs to be marked as done. + elseif scene_manager.current_scene_name == "introduction" then + scene_manager.completed_introduction = true + + -- have we been through all the scenes except the_dragons_lair? You have to go back and survive the ones you previously failed. + elseif scene_manager.rerunning_failures then + -- beat the scene? Take it out of the failed list. + if not is_resurrection then + for i = 1, scene_manager.total_failed-1, 1 do + scene_manager.failed[i] = scene_manager.failed[i + 1] + end + scene_manager.failed[scene_manager.total_failed] = nil + scene_manager.total_failed = scene_manager.total_failed - 1 + end + + if scene_manager.total_failed == 0 then + scene_manager.rerunning_failures = false + end + + elseif scene_manager.current_scene_name ~= "the_dragons_lair" then -- normal scene selection logic only applies until you reach the lair. + if is_resurrection then + if scene_manager.total_failed < 8 then -- the arcade version only queues up to 8 failed levels, which is only a limit if you have it set to infinite lives. + scene_manager.total_failed = scene_manager.total_failed + 1 + scene_manager.failed[scene_manager.total_failed] = scene_manager.current_scene_name + end + end + + -- bump to the next row (or, if at the end of the rows, bump to the next cycle). + scene_manager.current_row = scene_manager.current_row + 1 + if scene_manager.current_row > #scene_manager.rows then + scene_manager.current_row = 1 + if scene_manager.current_cycle < #scene_manager.rows[1] then + scene_manager.current_cycle = scene_manager.current_cycle + 1 + end + end + end + end + + -- intro must be played first. + -- (!!! FIXME: if we add back in the drawbridge, do we want this to require it be _completed_ first? + if not scene_manager.completed_introduction then + start_scene("introduction", is_resurrection) + + -- If rerunning failures, always pick the start of the list to play next. + -- This means that if you fail during the rerunning phase, you _must_ retry that room immediately. + elseif (scene_manager.rerunning_failures) and (scene_manager.total_failed > 0) then + start_scene(scene_manager.failed[1], is_resurrection) + + -- did we beat the game? + elseif scene_manager.current_scene_name == "the_dragons_lair" then + if is_resurrection then + start_scene("the_dragons_lair", true) -- once you get there, you have to replay the dragon's lair until you beat it. + else + game_over(true) -- Didn't die in the lair? You beat the game! + end + + -- The normal scene choosing logic for everything else. + else + -- if we're at the last row of the cycle, there are special rules: you _must_ play + -- falling_platform_long in the first cycle, falling_platform_long_reverse in the + -- second, and the_dragons_lair third (and that, only once all other levels are survived). + if scene_manager.current_row == #scene_manager.rows then + -- are we at the final level? Make sure everything else was beaten before we let the player in. + if (scene_manager.current_cycle == #scene_manager.rows[scene_manager.current_row]) and (scene_manager.total_failed > 0) then + scene_manager.rerunning_failures = true + start_scene(scene_manager.failed[1], is_resurrection) + else + start_scene(scene_manager.rows[scene_manager.current_row][scene_manager.current_cycle], is_resurrection) + end + else + -- choose from scenes in the current row that have not been run before. + local eligible = {} + local eligible_columns = {} + for i,name in ipairs(scene_manager.rows[scene_manager.current_row]) do + if not scene_manager.chosen[scene_manager.current_row][i] then + eligible[#eligible+1] = name + eligible_columns[#eligible_columns+1] = i; + end + end + + local choice = (current_ticks % #eligible) + 1 + scene_manager.chosen[scene_manager.current_row][eligible_columns[choice]] = true + start_scene(eligible[choice], is_resurrection) + end + end +end + +local function game_over_complete() + start_attract_mode(true) +end + +local function setup_scene_manager() + scene_manager.initialized = true + scene_manager.infinite_lives = false + scene_manager.lives_left = starting_lives + scene_manager.current_score = 0 + scene_manager.last_seek = 0 + scene_manager.completed_introduction = false + scene_manager.current_scene = nil + scene_manager.current_scene_name = nil + scene_manager.current_sequence = nil + scene_manager.current_sequence_name = nil + scene_manager.current_sequence_ticks = 0 + scene_manager.current_sequence_tick_offset = 0 + scene_manager.unserialize_offset = 0 + scene_manager.current_row = 1 + scene_manager.current_cycle = 1 + scene_manager.chosen = {} + scene_manager.total_failed = 0 + scene_manager.failed = {} + + for i,v in ipairs(scene_manager.rows) do + scene_manager.chosen[i] = {} + for j,v2 in ipairs(v) do + scene_manager.chosen[i][j] = false + end + end +end + +local function start_game() + DirkSimple.log("Start game!") + setup_scene_manager() + + -- Did you know this gives you infinite lives on any Dragon's Lair arcade + -- cabinet, regardless of dip switch settings? Would have been nice to + -- know when this cost a dollar per run! + scene_manager.infinite_lives = (current_inputs.held["up"] and current_inputs.held["left"]) + + choose_next_scene(false) +end + +local function kill_player() + if (not infinite_lives) and (not scene_manager.infinite_lives) and (test_scene == nil) then + scene_manager.lives_left = scene_manager.lives_left - 1 + end + + DirkSimple.log("Killing player (lives now left=" .. scene_manager.lives_left .. ")") + + if scene_manager.lives_left == 0 then + game_over(false) + else + choose_next_scene(true) + end +end + +local hint_sprite_data = { + up = { sprite = "hints", index = 0, x = .45, y = .0, w = .1, h = .1 }, + upright = { sprite = "hints", index = 1, x = .9, y = .0, w = .1, h = .1 }, + right = { sprite = "hints", index = 2, x = .9, y = .45, w = .1, h = .1 }, + downright = { sprite = "hints", index = 3, x = .9, y = .9, w = .1, h = .1 }, + down = { sprite = "hints", index = 4, x = .45, y = .9, w = .1, h = .1 }, + downleft = { sprite = "hints", index = 5, x = .0, y = .9, w = .1, h = .1 }, + left = { sprite = "hints", index = 6, x = .0, y = .45, w = .1, h = .1 }, + upleft = { sprite = "hints", index = 7, x = .0, y = .0, w = .1, h = .1 }, + action = { sprite = "hints", index = 8, x = .45, y = .45, w = .1, h = .1 }, +} + +-- This function assumes the actions are grouped by input, and sorted by time +local function draw_hint_sprites(actions) + local last_action_drawn = nil + + for i=1,#actions do + local action = actions[i] + if scene_manager.current_sequence_ticks <= action.to and (not last_action_drawn or last_action_drawn.input ~= action.input) then + local hl = hint_sprite_data[action.input] + if hl then + r = 0 + g = 0 + if scene_manager.current_scene[action.nextsequence].kills_player then + r = 255 + else + g = 255 + end + DirkSimple.draw_sprite(hl.sprite, 32 * hl.index, 0, 32, 32, DirkSimple.video_width * hl.x, DirkSimple.video_height * hl.y, DirkSimple.video_width * hl.w, DirkSimple.video_height * hl.h, r, g, 0) + end + last_action_drawn = action + end + end +end + +local function check_actions(inputs) + -- we don't care about inserting coins, but we'll play the sound if you + -- hit the coinslot button. + if inputs.pressed["coinslot"] then + play_sound("coinslot") + end + + if accepted_input ~= nil then + return true -- ignore all input until end of sequence. + end + + local actions = scene_manager.current_sequence.actions + if actions ~= nil then + if draw_hints then + draw_hint_sprites(actions) + end + for i,v in ipairs(actions) do + -- ignore if not in the time window for this input. + if (scene_manager.current_sequence_ticks >= v.from) and (scene_manager.current_sequence_ticks <= v.to) then + local input = v.input + if god_mode and (v.nextsequence ~= nil) and (scene_manager.current_scene ~= nil) and (not scene_manager.current_scene[v.nextsequence].kills_player) then + DirkSimple.log("(god mode) accepted action '" .. input .. "' at " .. tostring(scene_manager.current_sequence_ticks / 1000.0)) + accepted_input = v + return true + elseif inputs.pressed[input] then -- we got one! + DirkSimple.log("accepted action '" .. input .. "' at " .. tostring(scene_manager.current_sequence_ticks / 1000.0)) + accepted_input = v + if input ~= "start" then + play_sound("accept") + end + return true + end + end + end + end + + -- if we don't have an accepted input but something was pressed, + -- play the rejection buzz sound. Wrong inputs that lead to death + -- still play the accepted sound, even though the input results in + -- a failure state. + if accepted_input == nil then + if inputs.pressed["up"] or inputs.pressed["down"] or inputs.pressed["left"] or inputs.pressed["right"] or inputs.pressed["action"] then + if scene_manager.current_scene_name ~= "attract_mode" then -- don't buzz in attract mode. + play_sound("reject") + end + end + end + + return false +end + +local function check_timeout() + local done_with_sequence = false + if scene_manager.current_sequence_ticks >= scene_manager.current_sequence.timeout.when then -- whole sequence has run to completion. + done_with_sequence = true + elseif (accepted_input ~= nil) and accepted_input.interrupt ~= nil then -- If interrupting, forego the timeout. + done_with_sequence = true + elseif (accepted_input ~= nil) and (accepted_input.nextsequence ~= nil) and (scene_manager.current_scene[accepted_input.nextsequence].start_time ~= time_laserdisc_noseek()) then -- If action leads to a laserdisc seek, forego the timeout. + done_with_sequence = true + end + + if not done_with_sequence then + return -- sequence is not complete yet. + end + + DirkSimple.log("Done with current sequence") + + local outcome + if accepted_input ~= nil then + outcome = accepted_input + else + outcome = scene_manager.current_sequence.timeout + end + + if outcome.points ~= nil then + scene_manager.current_score = scene_manager.current_score + outcome.points + end + + if outcome.interrupt ~= nil then + outcome.interrupt() + elseif outcome.nextsequence ~= nil then -- end of scene? + start_sequence(outcome.nextsequence) + else + if scene_manager.current_sequence.kills_player then + kill_player() -- will update state, start new scene. + else + choose_next_scene(false) + end + end + + -- as a special hack, if the new sequence has a timeout of 0, we process it immediately without + -- waiting for the next tick, since it's just trying to set up some state before an actual + -- sequence and we don't want the video to move ahead in a completed sequence or progress + -- before the actual sequence is ticking. + if scene_manager.current_sequence.timeout.when == 0 then + check_timeout() + end +end + +DirkSimple.serialize = function() + if not scene_manager.initialized then + setup_scene_manager() -- just so we can serialize a default state. + end + + local state = {} + state[#state + 1] = 1 -- current serialization version + state[#state + 1] = scene_manager.infinite_lives + state[#state + 1] = scene_manager.lives_left + state[#state + 1] = scene_manager.current_score + state[#state + 1] = scene_manager.last_seek + state[#state + 1] = scene_manager.completed_introduction + state[#state + 1] = scene_manager.current_scene_name + state[#state + 1] = scene_manager.current_sequence_name + state[#state + 1] = scene_manager.current_sequence_ticks + state[#state + 1] = scene_manager.current_sequence_tick_offset + state[#state + 1] = scene_manager.current_row + state[#state + 1] = scene_manager.current_cycle + state[#state + 1] = scene_manager.total_failed + + for i,v in ipairs(scene_manager.failed) do + state[#state + 1] = v + end + + for i,v in ipairs(scene_manager.rows) do + for j,v2 in ipairs(v) do + state[#state + 1] = scene_manager.chosen[i][j] + end + end + + return state +end + + +DirkSimple.unserialize = function(state) + -- !!! FIXME: this function assumes that `state` is completely valid. It doesn't check array length or data types. + setup_scene_manager() + + local idx = 1 + local version = state[idx] ; idx = idx + 1 + scene_manager.infinite_lives = state[idx] ; idx = idx + 1 + scene_manager.lives_left = state[idx] ; idx = idx + 1 + scene_manager.current_score = state[idx] ; idx = idx + 1 + scene_manager.last_seek = state[idx] ; idx = idx + 1 + scene_manager.completed_introduction = state[idx] ; idx = idx + 1 + scene_manager.current_scene_name = state[idx] ; idx = idx + 1 + scene_manager.current_sequence_name = state[idx] ; idx = idx + 1 + scene_manager.current_sequence_ticks = state[idx] ; idx = idx + 1 + scene_manager.current_sequence_tick_offset = state[idx] ; idx = idx + 1 + scene_manager.current_row = state[idx] ; idx = idx + 1 + scene_manager.current_cycle = state[idx] ; idx = idx + 1 + scene_manager.total_failed = state[idx] ; idx = idx + 1 + scene_manager.unserialize_offset = scene_manager.current_sequence_ticks + scene_manager.current_sequence_tick_offset + scene_manager.current_sequence_tick_offset = 0 -- unserialize_offset will handle everything up until now, until the next sequence starts. + + for i = 1, scene_manager.total_failed, 1 do + scene_manager.failed[#scene_manager.failed + 1] = state[idx] ; idx = idx + 1 + end + + for i,v in ipairs(scene_manager.rows) do + for j,v2 in ipairs(v) do + scene_manager.chosen[i][j] = state[idx] ; idx = idx + 1 + end + end + + if scene_manager.current_scene_name ~= nil then + scene_manager.current_scene = scenes[scene_manager.current_scene_name] + if scene_manager.current_sequence_name ~= nil then + scene_manager.current_sequence = scene_manager.current_scene[scene_manager.current_sequence_name] + local start_time = scene_manager.last_seek + if scene_manager.current_sequence.is_single_frame then + DirkSimple.show_single_frame(start_time) + else + DirkSimple.start_clip(start_time + scene_manager.unserialize_offset) + end + end + end + + -- We don't (currently) serialize wave playback state (but we could, + -- if DirkSimple.play_sound took a starting offset). So just reset the + -- cooldown clock to allow a new buzz to play right away, for now. + play_sound_cooldown = 0 + + return true +end + +DirkSimple.tick = function(ticks, sequenceticks, inputs) + current_ticks = ticks + current_inputs = inputs + + if not scene_manager.initialized then + setup_scene_manager() + end + + scene_manager.current_sequence_ticks = (sequenceticks + scene_manager.unserialize_offset) - scene_manager.current_sequence_tick_offset + --DirkSimple.log("LUA TICK(ticks=" .. tostring(current_ticks) .. ", sequenceticks=" .. tostring(scene_manager.current_sequence_ticks) .. ", tick_offset=" .. tostring(scene_manager.current_sequence_tick_offset) .. ", unserialize_offset=" .. tostring(scene_manager.unserialize_offset) .. ")") + + if scene_manager.current_sequence == nil then + start_attract_mode(false) + end + + check_actions(inputs) -- check inputs before timeout, in case an input came through at the last possible moment, even if we're over time. + check_timeout() +end + + +-- The scene table! +-- http://www.dragons-lair-project.com/games/related/walkthru/lair/easy.asp +scenes = { + attract_mode = { + start_alive = { + timeout = { when=0, nextsequence="attract_movie" }, + start_time = time_laserdisc_noseek(), + }, + start_dead = { + start_time = time_to_ms(5, 830), + is_single_frame = true, + timeout = { when=time_to_ms(3, 0), nextsequence="attract_movie" }, + }, + attract_movie = { + start_time = time_to_ms(7, 0), + timeout = { when=time_to_ms(43, 0), nextsequence="insert_coins" }, + actions = { + -- Player hit start to start the game + { input="start", from=time_to_ms(0, 0), to=time_to_ms(60, 0, 0), interrupt=start_game, nextsequence=nil }, + } + }, + insert_coins = { + start_time = time_to_ms(6, 200), + is_single_frame = true, + timeout = { when=time_to_ms(5, 0), nextsequence="attract_movie" }, + actions = { + -- Player hit start to start the game + { input="start", from=time_to_ms(0, 0), to=time_to_ms(60, 0, 0), interrupt=start_game, nextsequence=nil }, + } + }, + }, + + -- Intro level, no gameplay in the arcade version. + introduction = { + start_dead = { + start_time = time_laserdisc_frame(1367), + timeout = { when=time_to_ms(2, 32), nextsequence="castle_exterior" } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="castle_exterior" } + }, + + castle_exterior = { -- exterior shot of the castle + start_time = time_laserdisc_frame(1424), + timeout = { when=time_to_ms(5, 767), nextsequence="exit_room" }, + }, + + -- this skips the drawbridge itself, like the arcade does. + exit_room = { -- player runs through the gates. + start_time = time_laserdisc_frame(1823) - laserdisc_frame_to_ms(2), + timeout = { when=time_to_ms(2, 359) + laserdisc_frame_to_ms(10), nextsequence=nil }, + }, + }, + + -- Swinging ropes, burning over a fiery pit. + flaming_ropes = { + game_over = { + start_time = time_laserdisc_frame(3999), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(3505), + timeout = { when=time_to_ms(2, 167), nextsequence="enter_room" } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(3561), + timeout = { when=time_to_ms(2, 228), nextsequence="platform_sliding" }, + actions = { + -- Player grabs rope too soon + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 245), nextsequence="fall_to_death" }, + -- Player grabs rope correctly + { input="right", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="rope1", points=251 }, + -- Player grabs rope too late + { input="right", from=time_to_ms(2, 130), to=time_to_ms(4, 260), nextsequence="fall_to_death" }, + -- Player tries to fly + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="fall_to_death" }, + -- Player tries to dive + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="fall_to_death" }, + } + }, + + platform_sliding = { -- Player hesitated, platform starts pulling back + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 621), nextsequence="fall_to_death" }, -- player hesitated, platform is gone, player falls + actions = { + -- Player grabs rope too soon + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + -- Player grabs rope correctly + { input="right", from=time_to_ms(1, 835), to=time_to_ms(2, 884), nextsequence="rope1", points=251 }, + -- Player tries to flee + { input="left", from=time_to_ms(1, 835), to=time_to_ms(2, 884), nextsequence="fall_to_death" }, + -- Player tries to fly + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 884), nextsequence="fall_to_death" }, + -- Player tries to dive + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 884), nextsequence="fall_to_death" }, + } + }, + + rope1 = { -- player grabbed first rope + start_time = time_laserdisc_frame(3693), + timeout = { when=time_to_ms(2, 228), nextsequence="burns_hands" }, + actions = { + -- Player grabs rope too soon + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 81), nextsequence="fall_to_death" }, + -- Player grabs rope correctly + { input="right", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="rope2", points=379 }, + -- Player tries to fly + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + -- Player tries to dive + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + -- Player tries to flee + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + } + }, + + rope2 = { -- player grabbed second rope + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="burns_hands" }, + actions = { + -- Player grabs rope too soon + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 81), nextsequence="fall_to_death" }, + -- Player grabs rope correctly + { input="right", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="rope3", points=495 }, + -- Player tries to fly + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + -- Player tries to dive + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + -- Player tries to flee + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="fall_to_death" }, + } + }, + + rope3 = { -- player grabbed third rope + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 507), nextsequence="misses_landing" }, + actions = { + -- Player grabs rope too soon + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 852), nextsequence="fall_to_death" }, + -- Player grabs rope correctly + { input="right", from=time_to_ms(0, 852), to=time_to_ms(1, 704), nextsequence="exit_room", points=915 }, + -- Player tries to fly + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="fall_to_death" }, + -- Player tries to dive + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="fall_to_death" }, + -- Player tries to flee + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="fall_to_death" }, + } + }, + + exit_room = { -- player reaches exit platform + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 792), nextsequence=nil }, + }, + + misses_landing = { -- player landed on exit platform, but fell backwards + start_time = time_laserdisc_frame(3879), + kills_player = true, + timeout = { when=time_to_ms(1, 917), nextsequence=nil }, + }, + + burns_hands = { -- rope burns up to hands, making player fall + start_time = time_laserdisc_frame(3925), + timeout = { when=time_to_ms(1, 583), nextsequence="fall_to_death" } + }, + + fall_to_death = { -- player falls into the flames + start_time = time_laserdisc_frame(3963), + kills_player = true, + timeout = { when=time_to_ms(1, 417), nextsequence=nil } + } + }, + + -- Bedroom where brick wall appears in front of you to be jumped through. + bower = { + game_over = { + start_time = time_laserdisc_frame(9387), + timeout = { when=time_to_ms(3, 650), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(9093), + timeout = { when=time_to_ms(2, 366), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(9181) - laserdisc_frame_to_ms(15), + timeout = { when=time_to_ms(1, 147) + laserdisc_frame_to_ms(15), nextsequence="trapped_in_wall" }, + actions = { + -- Player jumps through the hole in the wall + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 409) + laserdisc_frame_to_ms(15), nextsequence="exit_room", points=379 }, + } + }, + + trapped_in_wall = { -- player fails to climb through. + start_time = time_laserdisc_frame(9301) - laserdisc_frame_to_ms(15), + kills_player = true, + timeout = { when=time_to_ms(1, 792), nextsequence=nil } + }, + + exit_room = { -- player reaches the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 425) + laserdisc_frame_to_ms(15), nextsequence=nil }, + }, + }, + + -- Room with the "DRINK ME" sign. + alice_room = { + game_over = { + start_time = time_laserdisc_frame(18522), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(18226), + timeout = { when=time_to_ms(2, 334), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(18282) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(2, 64) - laserdisc_frame_to_ms(1), nextsequence="burned_to_death" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 64), nextsequence="exit_room", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 64), nextsequence="drinks_potion" }, + { input="down", from=time_to_ms(1, 131), to=time_to_ms(2, 32), nextsequence="burned_to_death" }, + { input="left", from=time_to_ms(1, 131), to=time_to_ms(2, 32), nextsequence="burned_to_death" }, + } + }, + + drinks_potion = { -- player drinks potion, dies + start_time = time_laserdisc_frame(18378), + kills_player = true, + timeout = { when=time_to_ms(4, 86), nextsequence=nil } + }, + + burned_to_death = { -- player dies in a fire + start_time = time_laserdisc_frame(18486), + kills_player = true, + timeout = { when=time_to_ms(1, 375), nextsequence=nil } + }, + + exit_room = { -- player reaches the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 442) + laserdisc_frame_to_ms(12), nextsequence=nil }, + }, + }, + + -- Room with the wind blowing you and a diamond you shouldn't reach for. + wind_room = { + game_over = { + start_time = time_laserdisc_frame(9010), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(8653), + timeout = { when=time_to_ms(2, 376), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(8709), + timeout = { when=time_to_ms(8, 159), nextsequence="sucked_in" }, + actions = { + { input="right", from=time_to_ms(7, 406), to=time_to_ms(8, 126), nextsequence="exit_room", points=379 }, + { input="up", from=time_to_ms(5, 964), to=time_to_ms(8, 126), nextsequence="sucked_in" }, + } + }, + + sucked_in = { -- player sucked into hole, falls to death + start_time = time_laserdisc_frame(8938), + kills_player = true, + timeout = { when=time_to_ms(3, 2), nextsequence=nil } + }, + + exit_room = { -- player reaches the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 557), nextsequence=nil }, + }, + }, + + -- Room that crumbles on three sides and then the ceiling caves in + vestibule = { + game_over = { + start_time = time_laserdisc_frame(2214), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(4083), + timeout = { when=time_to_ms(2, 84), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(1887), + timeout = { when=time_to_ms(3, 998), nextsequence="fell_to_death" }, + actions = { + { input="right", from=time_to_ms(1, 966), to=time_to_ms(3, 998), nextsequence="stagger", points=251 }, + { input="down", from=time_to_ms(1, 966), to=time_to_ms(3, 998), nextsequence="stagger", points=251 }, + { input="up", from=time_to_ms(1, 966), to=time_to_ms(3, 998), nextsequence="fell_to_death" }, + { input="left", from=time_to_ms(2, 490), to=time_to_ms(3, 965), nextsequence="fell_to_death" }, + } + }, + + stagger = { -- player staggers in the rumble, room is about to collapse + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 668), nextsequence="fell_to_death" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 950), nextsequence="exit_room", points=251 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 950), nextsequence="fell_to_death" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 950), nextsequence="fell_to_death" }, + } + }, + + fell_to_death = { -- player fell through floor. + start_time = time_laserdisc_frame(2085), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + exit_room = { -- player reaches the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 922), nextsequence=nil }, + } + }, + + -- the one with three chances to jump. + falling_platform_short = { + game_over = { + start_time = time_laserdisc_frame(15487), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(14791), + timeout = { when=time_to_ms(2, 376), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(14847) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(6, 881), nextsequence="crash_landing" }, + actions = { + { input="left", from=time_to_ms(2, 818), to=time_to_ms(5, 14), nextsequence="fell_to_death" }, + { input="left", from=time_to_ms(5, 14), to=time_to_ms(5, 341), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(5, 341), to=time_to_ms(5, 669), nextsequence="missed_jump" }, + { input="left", from=time_to_ms(5, 702), to=time_to_ms(6, 29), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(6, 29), to=time_to_ms(6, 357), nextsequence="fell_to_death" }, + { input="left", from=time_to_ms(6, 357), to=time_to_ms(6, 685), nextsequence="exit_room", points=3255 }, + { input="right", from=time_to_ms(2, 818), to=time_to_ms(7, 209), nextsequence="fell_to_death" }, + { input="up", from=time_to_ms(2, 818), to=time_to_ms(7, 209), nextsequence="fell_to_death" }, + { input="down", from=time_to_ms(2, 818), to=time_to_ms(7, 209), nextsequence="fell_to_death" }, + } + }, + + crash_landing = { -- platform crashes into the floor at the bottom of the pit. + start_time = time_laserdisc_frame(15226), + kills_player = true, + timeout = { when=time_to_ms(3, 335), nextsequence=nil } + }, + + missed_jump = { -- player tried the jump but missed + start_time = time_laserdisc_frame(15306), + kills_player = true, + timeout = { when=time_to_ms(2, 501), nextsequence=nil } + }, + + fell_to_death = { -- player fell off the platform without jumping + start_time = time_laserdisc_frame(15338), + kills_player = true, + timeout = { when=time_to_ms(1, 166), nextsequence=nil } + }, + + exit_room = { -- player successfully makes the jump + start_time = time_laserdisc_frame(15366), + timeout = { when=time_to_ms(4, 586) + laserdisc_frame_to_ms(10), nextsequence=nil }, + } + }, + + -- the one with nine chances to jump. + falling_platform_long = { + game_over = { + start_time = time_laserdisc_frame(15487), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(14791), + timeout = { when=time_to_ms(2, 376), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(14847) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(6, 816), nextsequence="second_jump_set", points = 49 }, + actions = { + { input="left", from=time_to_ms(2, 818), to=time_to_ms(5, 14), nextsequence="fell_to_death" }, + { input="left", from=time_to_ms(5, 14), to=time_to_ms(5, 341), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(5, 341), to=time_to_ms(5, 669), nextsequence="fell_to_death" }, + { input="left", from=time_to_ms(5, 702), to=time_to_ms(6, 29), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(6, 29), to=time_to_ms(6, 357), nextsequence="missed_jump" }, + { input="left", from=time_to_ms(6, 357), to=time_to_ms(6, 685), nextsequence="exit_room", points=3255 }, + { input="right", from=time_to_ms(2, 818), to=time_to_ms(6, 750), nextsequence="fell_to_death" }, + { input="up", from=time_to_ms(2, 818), to=time_to_ms(6, 750), nextsequence="fell_to_death" }, + { input="down", from=time_to_ms(2, 818), to=time_to_ms(6, 750), nextsequence="fell_to_death" }, + } + }, + + second_jump_set = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 293), nextsequence="third_jump_set", points = 1939 }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 458), nextsequence="fell_to_death" }, + { input="right", from=time_to_ms(2, 458), to=time_to_ms(2, 785), nextsequence="exit_room", points=3255 }, + { input="right", from=time_to_ms(2, 785), to=time_to_ms(3, 113), nextsequence="missed_jump" }, + { input="right", from=time_to_ms(3, 146), to=time_to_ms(3, 473), nextsequence="exit_room", points=3255 }, + { input="right", from=time_to_ms(3, 473), to=time_to_ms(3, 801), nextsequence="missed_jump" }, + { input="right", from=time_to_ms(3, 801), to=time_to_ms(4, 129), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(4, 293), nextsequence="fell_to_death" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(4, 293), nextsequence="fell_to_death" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(4, 293), nextsequence="fell_to_death" }, + } + }, + + third_jump_set = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 293), nextsequence="crash_landing" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 458), nextsequence="missed_jump" }, + { input="left", from=time_to_ms(2, 458), to=time_to_ms(2, 785), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(2, 785), to=time_to_ms(3, 113), nextsequence="missed_jump" }, + { input="left", from=time_to_ms(3, 146), to=time_to_ms(3, 473), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(3, 473), to=time_to_ms(3, 801), nextsequence="missed_jump" }, + { input="left", from=time_to_ms(3, 801), to=time_to_ms(4, 129), nextsequence="exit_room", points=3255 }, + { input="left", from=time_to_ms(4, 162), to=time_to_ms(5, 571), nextsequence="fell_to_death" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(5, 571), nextsequence="fell_to_death" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(5, 571), nextsequence="fell_to_death" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(5, 571), nextsequence="fell_to_death" }, + } + }, + + crash_landing = { -- platform crashes into the floor at the bottom of the pit. + start_time = time_laserdisc_noseek(), + kills_player = true, + timeout = { when=time_to_ms(2, 32), nextsequence=nil } + }, + + missed_jump = { -- player tried the jump but missed + start_time = time_laserdisc_frame(15306), + kills_player = true, + timeout = { when=time_to_ms(2, 501), nextsequence=nil } + }, + + fell_to_death = { -- player fell off the platform without jumping + start_time = time_laserdisc_frame(15338), + kills_player = true, + timeout = { when=time_to_ms(1, 166), nextsequence=nil } + }, + + exit_room = { -- player successfully makes the jump + start_time = time_laserdisc_frame(15366), + timeout = { when=time_to_ms(4, 653) + laserdisc_frame_to_ms(10), nextsequence=nil }, + } + }, + + -- The tomb with the skulls, slime, skeletal hands, and ghouls + crypt_creeps = { + game_over = { + start_time = time_laserdisc_frame(12039), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(11433), + timeout = { when=time_to_ms(2, 334), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- skulls roll in + start_time = time_laserdisc_frame(11489), + timeout = { when=time_to_ms(3, 244), nextsequence="eaten_by_skulls" }, + actions = { + { input="up", from=time_to_ms(2, 228), to=time_to_ms(3, 244), nextsequence="jumped_skulls", points=495 }, + { input="action", from=time_to_ms(2, 228), to=time_to_ms(3, 178), nextsequence="overpowered_by_skulls" }, + { input="down", from=time_to_ms(2, 228), to=time_to_ms(3, 178), nextsequence="eaten_by_skulls" }, + { input="right", from=time_to_ms(2, 228), to=time_to_ms(3, 178), nextsequence="eaten_by_skulls" }, + { input="left", from=time_to_ms(2, 228), to=time_to_ms(3, 178), nextsequence="eaten_by_skulls" }, + } + }, + + jumped_skulls = { -- player jumped down the hall when skulls rolled in, first hand attacks + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 311), nextsequence="crushed_by_hand" }, + actions = { + { input="action", from=time_to_ms(0, 688), to=time_to_ms(1, 278), nextsequence="attacked_first_hand", points=915 }, + { input="up", from=time_to_ms(0, 918), to=time_to_ms(1, 278), nextsequence="crushed_by_hand" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="eaten_by_skulls" }, + { input="left", from=time_to_ms(0, 668), to=time_to_ms(1, 278), nextsequence="crushed_by_hand" }, + } + }, + + attacked_first_hand = { -- player drew sword and attacked the first skeletal hand, slime rolls in + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 195), nextsequence="eaten_by_slime" }, + actions = { + { input="up", from=time_to_ms(1, 49), to=time_to_ms(2, 195), nextsequence="jumped_slime", points=495 }, + { input="down", from=time_to_ms(1, 49), to=time_to_ms(2, 163), nextsequence="eaten_by_skulls" }, + { input="right", from=time_to_ms(1, 49), to=time_to_ms(2, 163), nextsequence="eaten_by_slime" }, + { input="left", from=time_to_ms(1, 49), to=time_to_ms(2, 163), nextsequence="eaten_by_slime" }, + } + }, + + jumped_slime = { -- player jumped down the hall when black slime rolled in, second hand attacks + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 212), nextsequence="crushed_by_hand" }, + actions = { + { input="action", from=time_to_ms(0, 590), to=time_to_ms(1, 180), nextsequence="attacked_second_hand", points=915 }, + { input="up", from=time_to_ms(0, 590), to=time_to_ms(1, 147), nextsequence="crushed_by_hand" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 212), nextsequence="eaten_by_slime" }, + { input="right", from=time_to_ms(0, 590), to=time_to_ms(1, 147), nextsequence="crushed_by_hand" }, + } + }, + + attacked_second_hand = { -- player drew sword and attacked the second skeletal hand, more slime rolls in + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="eaten_by_slime" }, + actions = { + { input="left", from=time_to_ms(0, 426), to=time_to_ms(1, 835), nextsequence="enter_crypt", points=495 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="eaten_by_slime" }, + { input="right", from=time_to_ms(0, 360), to=time_to_ms(1, 835), nextsequence="eaten_by_slime" }, + } + }, + + enter_crypt = { -- player fled hallway, entered actual crypt + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="captured_by_ghouls" }, + actions = { + { input="action", from=time_to_ms(0, 688), to=time_to_ms(1, 835), nextsequence="exit_room", points=495 }, + { input="up", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="captured_by_ghouls" }, + { input="down", from=time_to_ms(0, 688), to=time_to_ms(1, 835), nextsequence="captured_by_ghouls" }, + { input="right", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="captured_by_ghouls" }, + { input="left", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="captured_by_ghouls" }, + } + }, + + exit_room = { -- player kills ghouls, heads through the exit + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 257), nextsequence=nil }, + }, + + overpowered_by_skulls = { -- skulls got the player while drawing sword + start_time = time_laserdisc_frame(11881), + kills_player = true, + timeout = { when=time_to_ms(1, 83) + laserdisc_frame_to_ms(10), nextsequence=nil } + }, + + eaten_by_skulls = { -- skulls got the player + start_time = time_laserdisc_frame(11904), + kills_player = true, + timeout = { when=time_to_ms(0, 124) + laserdisc_frame_to_ms(10), nextsequence=nil } + }, + + crushed_by_hand = { -- giant skeletal hand got the player + start_time = time_laserdisc_frame(11917), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + + eaten_by_slime = { -- black slime got the player + start_time = time_laserdisc_frame(11940), + kills_player = true, + timeout = { when=time_to_ms(1, 375), nextsequence=nil } + }, + + captured_by_ghouls = { -- ghouls got the player + start_time = time_laserdisc_frame(11983), + kills_player = true, + timeout = { when=time_to_ms(2, 292), nextsequence=nil } + } + }, + + -- The flying horse machine that rides you past fires and other obstacles + flying_horse = { + game_over = { + start_time = time_laserdisc_frame(10600), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(9965), + timeout = { when=time_to_ms(2, 84), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- Player mounts the horse, starts the wild ride, dodge first fire + start_time = time_laserdisc_frame(10021) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(4, 522), nextsequence="hit_pillar" }, + actions = { + -- The ROM checks for UpRight here, but also an identical entry for Right which comes to the same result. + { input="right", from=time_to_ms(3, 801), to=time_to_ms(4, 522), nextsequence="second_fire", points=495 }, + { input="up", from=time_to_ms(3, 801), to=time_to_ms(4, 522), nextsequence="hit_pillar" }, + { input="left", from=time_to_ms(3, 801), to=time_to_ms(4, 522), nextsequence="burned_to_death" }, + } + }, + + second_fire = { -- dodge second fire + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 376), nextsequence="hit_pillar" }, + actions = { + { input="left", from=time_to_ms(0, 721), to=time_to_ms(1, 343), nextsequence="third_fire", points=495 }, + { input="up", from=time_to_ms(0, 721), to=time_to_ms(1, 343), nextsequence="hit_pillar" }, + { input="right", from=time_to_ms(0, 721), to=time_to_ms(1, 343), nextsequence="burned_to_death" }, + } + }, + + third_fire = { -- dodge third fire + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="hit_pillar" }, + actions = { + { input="right", from=time_to_ms(1, 212), to=time_to_ms(1, 835), nextsequence="fourth_fire", points=495 }, + { input="up", from=time_to_ms(0, 852), to=time_to_ms(1, 802), nextsequence="hit_pillar" }, + { input="left", from=time_to_ms(1, 212), to=time_to_ms(1, 835), nextsequence="burned_to_death" }, + } + }, + + fourth_fire = { -- dodge fourth fire + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="hit_pillar" }, + actions = { + { input="left", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="brick_wall", points=495 }, + { input="up", from=time_to_ms(1, 49), to=time_to_ms(1, 966), nextsequence="hit_pillar" }, + { input="right", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="burned_to_death" }, + } + }, + + brick_wall = { -- dodge a brick wall + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 868), nextsequence="hit_brick_wall" }, + actions = { + { input="left", from=time_to_ms(1, 311), to=time_to_ms(1, 868), nextsequence="fifth_fire", points=1326 }, + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 835), nextsequence="hit_brick_wall" }, + { input="right", from=time_to_ms(0, 950), to=time_to_ms(1, 835), nextsequence="hit_brick_wall" }, + } + }, + + fifth_fire = { -- dodge fifth fire + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 409), nextsequence="hit_pillar" }, + actions = { + { input="left", from=time_to_ms(0, 721), to=time_to_ms(1, 376), nextsequence="exit_room", points=495 }, + { input="up", from=time_to_ms(0, 393), to=time_to_ms(1, 409), nextsequence="hit_pillar" }, + { input="right", from=time_to_ms(0, 721), to=time_to_ms(1, 376), nextsequence="burned_to_death" }, + } + }, + + exit_room = { -- player crash lands safely, exits room. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 41), nextsequence=nil }, + }, + + burned_to_death = { -- player ran into the wall of flames + start_time = time_laserdisc_frame(10565), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + + hit_pillar = { -- player ran into the pillar + start_time = time_laserdisc_frame(10453), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + hit_brick_wall = { -- player ran into the brick wall + start_time = time_laserdisc_frame(10501), + kills_player = true, + timeout = { when=time_to_ms(2, 292), nextsequence=nil } + } + }, + + -- The giddy goons! + giddy_goons = { + game_over = { + start_time = time_laserdisc_frame(6198), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(5627), + timeout = { when=time_to_ms(2, 84), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- Player runs into the goons!! + start_time = time_laserdisc_frame(5683), + timeout = { when=time_to_ms(3, 146), nextsequence="knife_in_back" }, + actions = { + { input="action", from=time_to_ms(2, 392), to=time_to_ms(3, 113), nextsequence="kills_first_goon", points=379 }, + { input="up", from=time_to_ms(1, 507), to=time_to_ms(2, 392), nextsequence="fall_to_death" }, + { input="right", from=time_to_ms(2, 392), to=time_to_ms(3, 113), nextsequence="knife_in_back" }, + { input="left", from=time_to_ms(2, 392), to=time_to_ms(3, 113), nextsequence="swarm_of_goons" }, + } + }, + + kills_first_goon = { -- player kills first goon, moves towards stairs. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="knife_in_back" }, + actions = { + -- the ROM has an "UpRight" action that matches the successful "Right" (but "Up" by itself is a fail), so we just check "Right" first so the player will pass if they're hitting both. + { input="right", from=time_to_ms(1, 114), to=time_to_ms(1, 835), nextsequence="climbs_stairs", points=1326 }, + { input="up", from=time_to_ms(0, 885), to=time_to_ms(1, 802), nextsequence="fall_to_death" }, + { input="left", from=time_to_ms(1, 114), to=time_to_ms(1, 835), nextsequence="shoves_off_edge" }, + { input="action", from=time_to_ms(1, 114), to=time_to_ms(1, 835), nextsequence="shoves_off_edge" }, + } + }, + + climbs_stairs = { -- Player climbs the stairs, meets more resistance + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="swarm_of_goons" }, + actions = { + { input="action", from=time_to_ms(1, 475), to=time_to_ms(2, 130), nextsequence="kill_upper_goons", points=3255 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 130), nextsequence="kill_upper_goons", points=3255 }, + { input="up", from=time_to_ms(1, 475), to=time_to_ms(2, 130), nextsequence="fight_off_one_before_swarm" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 163), nextsequence="fight_off_one_before_swarm" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 163), nextsequence="fall_to_death" }, + } + }, + + -- the original ROM gives no points for passing this sequence, probably because you can do nothing and win on autopilot. + -- Interestingly, Digital Leisure's current version on Steam doesn't have goons to kill at the top of the stairs, either. Not sure what happened there. + kill_upper_goons = { -- Player kills the goons at the top of the stairs. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 606), nextsequence="exit_room", points=0 }, + actions = { + -- The ROM has an "UpLeft" action here, but it matches its separate "Up" and "Left" entries. + { input="up", from=time_to_ms(0, 852), to=time_to_ms(1, 540), nextsequence="exit_room", points=0 }, + { input="left", from=time_to_ms(0, 852), to=time_to_ms(1, 540), nextsequence="exit_room", points=0 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 606), nextsequence="fight_off_one_before_swarm" }, + { input="action", from=time_to_ms(0, 786), to=time_to_ms(1, 573), nextsequence="fight_off_one_before_swarm" }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 842), nextsequence=nil }, + }, + + knife_in_back = { -- player gets a knife in the back + start_time = time_laserdisc_frame(6039), + kills_player = true, + timeout = { when=time_to_ms(2, 84), nextsequence=nil } + }, + + shoves_off_edge = { -- goons push player off edge + start_time = time_laserdisc_frame(6091), + kills_player = true, + timeout = { when=time_to_ms(2, 720), nextsequence=nil } + }, + + fall_to_death = { -- player falls down into pit + start_time = time_laserdisc_frame(6163), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence=nil } + }, + + fight_off_one_before_swarm = { -- Player kills one, then swarm takes him down. + start_time = time_laserdisc_frame(5947), + kills_player = true, + timeout = { when=time_to_ms(3, 544), nextsequence=nil } + }, + + swarm_of_goons = { -- giddy goons swarm dirk. + start_time = time_laserdisc_frame(6015), + kills_player = true, + timeout = { when=time_to_ms(0, 708), nextsequence=nil } + } + }, + + -- Green tentacles flood in to the room. + tentacle_room = { + game_over = { + start_time = time_laserdisc_frame(2954), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(2297), + timeout = { when=time_to_ms(2, 84), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(2353), + timeout = { when=time_to_ms(3, 965), nextsequence="left_tentacle_grabs" }, + actions = { + { input="action", from=time_to_ms(2, 687), to=time_to_ms(3, 965), nextsequence="kills_first_tentacle", points=49 } + } + }, + + kills_first_tentacle = { -- player slashes first tentacle + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 359), nextsequence="squeeze_to_death" }, + actions = { + { input="up", from=time_to_ms(1, 409), to=time_to_ms(2, 327), nextsequence="jump_to_weapon_rack", points=379 } + } + }, + + jump_to_weapon_rack = { -- player jumps to weapon rack on far wall + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 901), nextsequence="squeeze_to_death" }, + actions = { + { input="right", from=time_to_ms(1, 180), to=time_to_ms(1, 933), nextsequence="jump_to_door", points=495 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 901), nextsequence="squeeze_to_death" }, + { input="action", from=time_to_ms(0, 0), to=time_to_ms(1, 901), nextsequence="squeeze_to_death" }, + { input="left", from=time_to_ms(1, 180), to=time_to_ms(1, 933), nextsequence="squeeze_to_death" }, + } + }, + + jump_to_door = { -- player jumps to door far wall + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 442), nextsequence="squeeze_to_death_by_door" }, + actions = { + -- ROM has "DownRight" with identical "Down" and "Right" entries, so this is fine. + { input="down", from=time_to_ms(0, 492), to=time_to_ms(1, 409), nextsequence="jump_to_stairs", points=915 }, + { input="right", from=time_to_ms(0, 492), to=time_to_ms(1, 409), nextsequence="jump_to_stairs", points=915 }, + { input="up", from=time_to_ms(0, 492), to=time_to_ms(1, 409), nextsequence="squeeze_to_death_by_door" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 442), nextsequence="squeeze_to_death" }, + { input="action", from=time_to_ms(0, 0), to=time_to_ms(1, 475), nextsequence="squeeze_to_death" }, + } + }, + + jump_to_stairs = { -- player jumps to base of staircase, starts to climb + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="two_front_war" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 966), nextsequence="squeeze_to_death" }, + { input="left", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="jump_to_table", points=1326 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="two_front_war" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="squeeze_to_death" }, + { input="action", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="two_front_war" }, + } + }, + + jump_to_table = { -- player jumps back down the stairs to the table + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="squeeze_to_death" }, + actions = { + -- ROM has "UpRight" with identical "Up" and "Right" entries, so this is fine. + { input="up", from=time_to_ms(0, 360), to=time_to_ms(2, 195), nextsequence="exit_room", points=1939 }, + { input="right", from=time_to_ms(0, 360), to=time_to_ms(2, 195), nextsequence="exit_room", points=1939 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 228), nextsequence="squeeze_to_death" }, + { input="action", from=time_to_ms(0, 0), to=time_to_ms(2, 228), nextsequence="squeeze_to_death" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 228), nextsequence="squeeze_to_death" }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 66), nextsequence=nil }, + }, + + left_tentacle_grabs = { -- player gets grabbed by first tentacle in the room. + start_time = time_laserdisc_frame(2729), + kills_player = true, + timeout = { when=time_to_ms(2, 918), nextsequence=nil } + }, + + squeeze_to_death = { -- tentacles wrap around player in close-up and squeeze him to death + start_time = time_laserdisc_frame(2801), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + two_front_war = { -- player slashes tentacle on the right, but left tentacle sneaks up on him + start_time = time_laserdisc_frame(2849), + kills_player = true, + timeout = { when=time_to_ms(3, 2), nextsequence=nil } + }, + + squeeze_to_death_by_door = { -- tentacles wrap around player in close-up and squeeze him to death, door in background. + start_time = time_laserdisc_frame(2933), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + }, + + tilting_room = { + game_over = { + start_time = time_laserdisc_frame(20535), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(20130), + timeout = { when=time_to_ms(2, 251), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(20187), + timeout = { when=time_to_ms(4, 456), nextsequence="catches_fire" }, + actions = { + { input="down", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="jumps_back", points=1939 }, + { input="left", from=time_to_ms(2, 785), to=time_to_ms(4, 489), nextsequence="catches_fire" }, + { input="right", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="falls_to_death" } + } + }, + + jumps_back = { -- player jumps back towards the camera + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 573), nextsequence="falls_to_death" }, + actions = { + { input="up", from=time_to_ms(0, 328), to=time_to_ms(0, 885), nextsequence="catches_fire" }, + { input="up", from=time_to_ms(0, 885), to=time_to_ms(1, 540), nextsequence="jumps_forward", points=2675 }, + { input="left", from=time_to_ms(0, 328), to=time_to_ms(1, 573), nextsequence="catches_fire" }, + { input="down", from=time_to_ms(0, 328), to=time_to_ms(1, 573), nextsequence="falls_to_death" }, + } + }, + + jumps_forward = { -- player jumps forward again towards the far wall. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 786), nextsequence="falls_to_death" }, + actions = { + { input="left", from=time_to_ms(0, 492), to=time_to_ms(1, 49), nextsequence="exit_room", points=1939 }, + { input="up", from=time_to_ms(0, 492), to=time_to_ms(1, 49), nextsequence="wrong_door" }, + { input="down", from=time_to_ms(0, 328), to=time_to_ms(1, 49), nextsequence="falls_to_death" }, + { input="right", from=time_to_ms(0, 328), to=time_to_ms(1, 49), nextsequence="falls_to_death" }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 400), nextsequence=nil }, + }, + + catches_fire = { -- player catches fire + start_time = time_laserdisc_frame(20450), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + + falls_to_death = { -- player falls in pit + start_time = time_laserdisc_frame(20486), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + wrong_door = { -- player jumps for the wrong door, hits gate + start_time = time_laserdisc_frame(20384), + kills_player = true, + timeout = { when=time_to_ms(2, 710), nextsequence=nil } + }, + }, + + throne_room = { + game_over = { + start_time = time_laserdisc_frame(21073), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(20618), + timeout = { when=time_to_ms(2, 334), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- player's sword and helmut are pulled to magnet in middle of room, floor starts to electrify. + start_time = time_laserdisc_frame(20674) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(2, 753), nextsequence="electrified_floor" }, + actions = { + { input="right", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="first_jump", points=1326 }, + { input="up", from=time_to_ms(1, 606), to=time_to_ms(3, 834), nextsequence="electrified_floor" }, + { input="down", from=time_to_ms(1, 606), to=time_to_ms(3, 834), nextsequence="electrified_floor" }, + { input="left", from=time_to_ms(1, 606), to=time_to_ms(3, 834), nextsequence="electrified_floor" }, + } + }, + + first_jump = { -- player jumps away from electrified floor + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 688), nextsequence="electrified_floor" }, + actions = { + -- The ROM has "UpRight" here that matches "Up" and "Right", so we're good to go here. + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 688), nextsequence="second_jump", points=3255 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 688), nextsequence="second_jump", points=3255 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 688), nextsequence="electrified_floor" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(0, 688), nextsequence="electrified_floor" }, + } + }, + + second_jump = { -- player jumps away from still-moving electrified floor, again. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 885), nextsequence="electrified_floor" }, + actions = { + { input="right", from=time_to_ms(0, 131), to=time_to_ms(0, 885), nextsequence="on_throne", points=2675 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 885), nextsequence="electrified_sword" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 885), nextsequence="electrified_floor" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(0, 885), nextsequence="electrified_floor" }, + } + }, + + on_throne = { -- player jumps on throne, throne rotates around to secret room + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 293), nextsequence="electrified_throne" }, + actions = { + { input="right", from=time_to_ms(3, 408), to=time_to_ms(4, 358), nextsequence="exit_room", points=1939 }, + { input="left", from=time_to_ms(3, 408), to=time_to_ms(4, 358), nextsequence="electrified_floor" }, + { input="left", from=time_to_ms(3, 408), to=time_to_ms(4, 96), nextsequence="electrified_floor" }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 932), nextsequence=nil }, + }, + + electrified_sword = { -- player grabs sword, gets zapped + start_time = time_laserdisc_frame(20928), + kills_player = true, + timeout = { when=time_to_ms(2, 835), nextsequence=nil } + }, + + electrified_floor = { -- player touched wrong part of floor, gets zapped + start_time = time_laserdisc_frame(21000), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence=nil } + }, + + electrified_throne = { -- player doesn't leave throne, gets zapped. + start_time = time_laserdisc_frame(21030), + kills_player = true, + timeout = { when=time_to_ms(1, 750), nextsequence=nil } + }, + }, + + underground_river = { + game_over = { + start_time = time_laserdisc_frame(24239), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(22682), + timeout = { when=time_to_ms(2, 334), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- player is walking along, falls through floor into barrel + start_time = time_laserdisc_frame(22738), + timeout = { when=time_to_ms(2, 654), nextsequence="first_boulders" } + }, + + -- the arcade skips the "YE BOULDERS" intro footage here--hence the laserdisc seek--presumably to shorten this pretty-long scene. + first_boulders = { -- the first part of YE BOULDERS sequence + start_time = time_laserdisc_frame(22936), + timeout = { when=time_to_ms(1, 16), nextsequence="boulders_crash" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="second_boulders", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="boulders_crash" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="boulders_crash" }, + } + }, + + second_boulders = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 933), nextsequence="boulders_crash2" }, + actions = { + { input="right", from=time_to_ms(0, 950), to=time_to_ms(1, 901), nextsequence="third_boulders", points=379 }, + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 901), nextsequence="boulders_crash2" }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(1, 901), nextsequence="boulders_crash2" }, + } + }, + + third_boulders = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 32), nextsequence="boulders_crash3" }, + actions = { + { input="left", from=time_to_ms(1, 49), to=time_to_ms(1, 999), nextsequence="fourth_boulders", points=379 }, + { input="up", from=time_to_ms(1, 49), to=time_to_ms(1, 999), nextsequence="boulders_crash3" }, + { input="right", from=time_to_ms(1, 49), to=time_to_ms(1, 999), nextsequence="boulders_crash3" }, + } + }, + + fourth_boulders = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="boulders_crash4" }, + actions = { + { input="right", from=time_to_ms(0, 950), to=time_to_ms(1, 966), nextsequence="first_rapids", points=379 }, + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 966), nextsequence="boulders_crash4" }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(1, 966), nextsequence="boulders_crash4" }, + } + }, + + first_rapids = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 210), nextsequence="rapids_crash" }, + actions = { + { input="up", from=time_to_ms(3, 932), to=time_to_ms(4, 522), nextsequence="rapids_crash" }, + { input="up", from=time_to_ms(4, 522), to=time_to_ms(5, 145), nextsequence="second_rapids", points=495 }, + { input="right", from=time_to_ms(3, 736), to=time_to_ms(4, 555), nextsequence="second_rapids", points=495 }, + { input="right", from=time_to_ms(4, 555), to=time_to_ms(5, 145), nextsequence="rapids_crash" }, + { input="left", from=time_to_ms(4, 391), to=time_to_ms(5, 177), nextsequence="rapids_crash" }, + } + }, + + second_rapids = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 523), nextsequence="rapids_crash" }, + actions = { + { input="up", from=time_to_ms(1, 212), to=time_to_ms(1, 835), nextsequence="rapids_crash" }, + { input="up", from=time_to_ms(1, 835), to=time_to_ms(2, 490), nextsequence="third_rapids", points=495 }, + { input="right", from=time_to_ms(1, 212), to=time_to_ms(2, 613), nextsequence="rapids_crash" }, + { input="left", from=time_to_ms(1, 81), to=time_to_ms(1, 901), nextsequence="third_rapids", points=495 }, + { input="left", from=time_to_ms(1, 901), to=time_to_ms(2, 490), nextsequence="rapids_crash" }, + } + }, + + third_rapids = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 490), nextsequence="rapids_crash" }, + actions = { + { input="up", from=time_to_ms(1, 311), to=time_to_ms(1, 802), nextsequence="rapids_crash" }, + { input="up", from=time_to_ms(1, 802), to=time_to_ms(2, 458), nextsequence="fourth_rapids", points=495 }, + { input="right", from=time_to_ms(1, 16), to=time_to_ms(1, 868), nextsequence="fourth_rapids", points=495 }, + { input="right", from=time_to_ms(1, 868), to=time_to_ms(2, 458), nextsequence="rapids_crash" }, + { input="left", from=time_to_ms(1, 147), to=time_to_ms(2, 490), nextsequence="rapids_crash" }, + } + }, + + fourth_rapids = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 818), nextsequence="rapids_crash" }, + actions = { + { input="up", from=time_to_ms(1, 343), to=time_to_ms(2, 163), nextsequence="rapids_crash" }, + { input="up", from=time_to_ms(2, 163), to=time_to_ms(2, 785), nextsequence="first_whirlpools", points=495 }, + { input="right", from=time_to_ms(1, 606), to=time_to_ms(2, 818), nextsequence="rapids_crash" }, + { input="left", from=time_to_ms(1, 343), to=time_to_ms(2, 163), nextsequence="first_whirlpools", points=495 }, + { input="left", from=time_to_ms(2, 163), to=time_to_ms(2, 785), nextsequence="rapids_crash" }, + } + }, + + first_whirlpools = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 505), nextsequence="whirlpools_crash" }, + actions = { + -- !!! FIXME: The ROM has an "UpRight" entry that matches "Right" for success, but "Up" has the same timing and is a fail! + { input="right", from=time_to_ms(3, 834), to=time_to_ms(5, 472), nextsequence="second_whirlpools", points=251 }, + { input="up", from=time_to_ms(3, 834), to=time_to_ms(5, 472), nextsequence="whirlpools_crash" }, + { input="left", from=time_to_ms(3, 834), to=time_to_ms(5, 472), nextsequence="whirlpools_crash" }, + } + }, + + second_whirlpools = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + actions = { + -- !!! FIXME: The ROM has an "UpLeft" entry that matches "Left" for success, but "Up" has the same timing and is a fail! + { input="left", from=time_to_ms(1, 409), to=time_to_ms(2, 720), nextsequence="third_whirlpools", points=251 }, + { input="up", from=time_to_ms(1, 409), to=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + { input="right", from=time_to_ms(1, 409), to=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + } + }, + + third_whirlpools = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 490), nextsequence="whirlpools_crash" }, + actions = { + -- !!! FIXME: The ROM has an "UpRight" entry that matches "Right" for success, but "Up" has the same timing and is a fail! + { input="right", from=time_to_ms(1, 343), to=time_to_ms(2, 490), nextsequence="fourth_whirlpools", points=251 }, + { input="up", from=time_to_ms(1, 343), to=time_to_ms(2, 490), nextsequence="whirlpools_crash" }, + { input="left", from=time_to_ms(1, 343), to=time_to_ms(2, 490), nextsequence="whirlpools_crash" }, + } + }, + + fourth_whirlpools = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + actions = { + -- !!! FIXME: The ROM has an "UpLeft" entry that matches "Left" for success, but "Up" has the same timing and is a fail! + { input="left", from=time_to_ms(1, 442), to=time_to_ms(2, 720), nextsequence="bounce_to_chain", points=251 }, + { input="up", from=time_to_ms(1, 442), to=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + { input="right", from=time_to_ms(1, 442), to=time_to_ms(2, 720), nextsequence="whirlpools_crash" }, + } + }, + + bounce_to_chain = { -- player bounces out of boat, to a chain he must grab + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 177), nextsequence="miss_chain" }, + actions = { + -- The ROM has an "UpRight" entry that matches "Right" and "Up", so we're okay here + { input="up", from=time_to_ms(3, 867), to=time_to_ms(5, 145), nextsequence="exit_room", points=495 }, + { input="down", from=time_to_ms(3, 867), to=time_to_ms(5, 145), nextsequence="miss_chain" }, + { input="right", from=time_to_ms(3, 867), to=time_to_ms(5, 145), nextsequence="exit_room", points=495 }, + { input="left", from=time_to_ms(3, 867), to=time_to_ms(5, 145), nextsequence="miss_chain" }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 65), nextsequence=nil }, + }, + + boulders_crash = { + start_time = time_laserdisc_frame(23938), + kills_player = true, + timeout = { when=time_to_ms(1, 0), nextsequence=nil } + }, + + boulders_crash2 = { + start_time = time_laserdisc_frame(23962), + kills_player = true, + timeout = { when=time_to_ms(0, 541), nextsequence=nil } + }, + + boulders_crash3 = { + start_time = time_laserdisc_frame(23986), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + + boulders_crash4 = { + start_time = time_laserdisc_frame(24010), + kills_player = true, + timeout = { when=time_to_ms(0, 541), nextsequence=nil } + }, + + rapids_crash = { + start_time = time_laserdisc_frame(24034), + kills_player = true, + timeout = { when=time_to_ms(2, 376), nextsequence=nil } + }, + + whirlpools_crash = { + start_time = time_laserdisc_frame(24094), + kills_player = true, + timeout = { when=time_to_ms(2, 668), nextsequence=nil } + }, + + miss_chain = { + start_time = time_laserdisc_frame(24187), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + }, + + rolling_balls = { + game_over = { + start_time = time_laserdisc_frame(26638), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(26042), + timeout = { when=time_to_ms(2, 334), nextsequence="enter_room", points = 49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { -- Player has reached the yellow segment of the tunnel, big black balls starts chasing + start_time = time_laserdisc_frame(26098) + laserdisc_frame_to_ms(1), + timeout = { when=time_to_ms(5, 964), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(4, 882), to=time_to_ms(5, 145), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(5, 145), to=time_to_ms(5, 931), nextsequence="red_ball", points=251 }, + { input="up", from=time_to_ms(5, 177), to=time_to_ms(5, 964), nextsequence="big_ball_crushes" }, + } + }, + + red_ball = { -- Player has reached the red segment of the tunnel + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 868), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(0, 852), to=time_to_ms(1, 81), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="blue_ball", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 868), nextsequence="big_ball_crushes" }, + } + }, + + blue_ball = { -- Player has reached the blue segment of the tunnel + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(0, 885), to=time_to_ms(1, 212), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(1, 212), to=time_to_ms(1, 933), nextsequence="green_ball", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + } + }, + + green_ball = { -- Player has reached the green segment of the tunnel + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(0, 885), to=time_to_ms(1, 147), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(1, 147), to=time_to_ms(1, 933), nextsequence="orange_ball", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + } + }, + + orange_ball = { -- Player has reached the orange segment of the tunnel + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(0, 885), to=time_to_ms(1, 147), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(1, 147), to=time_to_ms(1, 933), nextsequence="purple_ball", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 966), nextsequence="big_ball_crushes" }, + } + }, + + purple_ball = { -- Player has reached the purple segment of the tunnel + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 901), nextsequence="big_ball_crushes" }, + actions = { + { input="down", from=time_to_ms(0, 885), to=time_to_ms(1, 114), nextsequence="small_ball_crushes" }, + { input="down", from=time_to_ms(1, 114), to=time_to_ms(1, 868), nextsequence="pit_in_ground", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 901), nextsequence="big_ball_crushes" }, + } + }, + + pit_in_ground = { -- There's a hole in the ground at the end of the tunnel! Jump it! + -- !!! FIXME: RomSpinner reported bogus data for this, so check these timings. + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 901), nextsequence="big_ball_crushes" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 414), nextsequence="exit_room", points=379 }, + } + }, + + exit_room = { -- player heads for the door + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 320), nextsequence=nil }, + }, + + small_ball_crushes = { -- player gets sideswiped by a smaller, colorful ball + start_time = time_laserdisc_frame(26613), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence=nil } + }, + + big_ball_crushes = { -- player gets bowled over by the big black ball + start_time = time_laserdisc_frame(26596), + kills_player = true, + timeout = { when=time_to_ms(0, 749), nextsequence=nil } + }, + }, + + black_knight = { + game_over = { + start_time = time_laserdisc_frame(25956), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(25480), + timeout = { when=time_to_ms(2, 42), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(25536), + timeout = { when=time_to_ms(3, 539), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(2, 687), to=time_to_ms(3, 506), nextsequence="seq3", points=1939 }, + { input="right", from=time_to_ms(3, 146), to=time_to_ms(3, 539), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 687), to=time_to_ms(3, 572), nextsequence="seq7" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(25536), + timeout = { when=time_to_ms(3, 539), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(2, 687), to=time_to_ms(3, 506), nextsequence="seq3", points=1939 }, + { input="right", from=time_to_ms(3, 146), to=time_to_ms(3, 539), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 687), to=time_to_ms(3, 572), nextsequence="seq7" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 867), nextsequence="seq9" }, + actions = { + { input="left", from=time_to_ms(3, 113), to=time_to_ms(3, 867), nextsequence="seq4", points=1939 }, + { input="up", from=time_to_ms(3, 113), to=time_to_ms(3, 801), nextsequence="seq9" }, + { input="right", from=time_to_ms(3, 473), to=time_to_ms(6, 849), nextsequence="seq6" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 244), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(2, 458), to=time_to_ms(3, 211), nextsequence="seq5", points=2675 }, + { input="left", from=time_to_ms(2, 458), to=time_to_ms(3, 178), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 458), to=time_to_ms(3, 178), nextsequence="seq9" }, + { input="down", from=time_to_ms(1, 966), to=time_to_ms(2, 687), nextsequence="seq6" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 445), nextsequence=nil } + }, + + seq6 = { + start_time = time_laserdisc_frame(25850), + kills_player = true, + timeout = { when=time_to_ms(1, 417), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(25898), + kills_player = true, + timeout = { when=time_to_ms(2, 376), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(25918), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + }, + + bubbling_cauldron = { + game_over = { + start_time = time_laserdisc_frame(5541), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(5067), + timeout = { when=time_to_ms(2, 84), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(5123), + timeout = { when=time_to_ms(2, 753), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq3", points=2191 }, + { input="down", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(5123), + timeout = { when=time_to_ms(2, 753), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq3", points=2191 }, + { input="down", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 966), to=time_to_ms(2, 720), nextsequence="seq9" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 523), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(1, 638), to=time_to_ms(2, 490), nextsequence="seq4", points=3255 }, + { input="up", from=time_to_ms(1, 638), to=time_to_ms(2, 490), nextsequence="seq8" }, + { input="down", from=time_to_ms(1, 638), to=time_to_ms(2, 490), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 835), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 638), to=time_to_ms(2, 490), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 409), nextsequence="seq9" }, + actions = { + { input="down", from=time_to_ms(0, 557), to=time_to_ms(1, 376), nextsequence="seq5", points=3255 }, + { input="downright", from=time_to_ms(0, 557), to=time_to_ms(1, 376), nextsequence="seq5", points=3255 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 409), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 409), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 409), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 737), nextsequence="seq10" }, + actions = { + { input="action", from=time_to_ms(0, 655), to=time_to_ms(1, 737), nextsequence="seq6", points=2191 }, + { input="up", from=time_to_ms(0, 655), to=time_to_ms(1, 737), nextsequence="seq10" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 262), nextsequence="seq10" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 949), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(1, 802), to=time_to_ms(2, 916), nextsequence="seq7", points=1326 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 949), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 949), nextsequence="seq9" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 140), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(5423), + kills_player = true, + timeout = { when=time_to_ms(1, 417), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(5459), + kills_player = true, + timeout = { when=time_to_ms(1, 417), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_frame(5513), + kills_player = true, + timeout = { when=time_to_ms(1, 125), nextsequence=nil } + }, + + }, + + catwalk_bats = { + game_over = { + start_time = time_laserdisc_frame(12586), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(12133), + timeout = { when=time_to_ms(2, 42), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(12190), + timeout = { when=time_to_ms(2, 687), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 687), nextsequence="seq3", points=915 }, + { input="down", from=time_to_ms(2, 64), to=time_to_ms(2, 687), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 687), nextsequence="seq9" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(12190), + timeout = { when=time_to_ms(2, 687), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 687), nextsequence="seq3", points=915 }, + { input="down", from=time_to_ms(2, 64), to=time_to_ms(2, 687), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 687), nextsequence="seq9" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 147), nextsequence="seq9" }, + actions = { + { input="upleft", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq4", points=915 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq4", points=915 }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(2, 97), nextsequence="seq4", points=915 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq9" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 490), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(1, 737), to=time_to_ms(2, 458), nextsequence="seq5", points=2675 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq9" }, + { input="up", from=time_to_ms(1, 737), to=time_to_ms(2, 458), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(0, 360), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 328), to=time_to_ms(2, 785), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 475), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(0, 360), to=time_to_ms(1, 442), nextsequence="seq6", points=915 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 49), nextsequence="seq9" }, + { input="upright", from=time_to_ms(0, 360), to=time_to_ms(1, 409), nextsequence="seq6", points=915 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 442), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 212), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(0, 885), to=time_to_ms(1, 442), nextsequence="seq7", points=3551 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 475), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 475), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 475), nextsequence="seq9" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 958), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(12537), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(12477), + kills_player = true, + timeout = { when=time_to_ms(2, 501), nextsequence=nil } + }, + }, + + crypt_creeps_reversed = { + game_over = { + start_time = time_laserdisc_frame(19223), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(18606), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(18662), + timeout = { when=time_to_ms(3, 473), nextsequence="seq10" }, + actions = { + { input="up", from=time_to_ms(2, 458), to=time_to_ms(3, 473), nextsequence="seq3", points=495 }, + { input="action", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq9" }, + { input="down", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + { input="right", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + { input="left", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(18662), + timeout = { when=time_to_ms(3, 473), nextsequence="seq10" }, + actions = { + { input="up", from=time_to_ms(2, 458), to=time_to_ms(3, 473), nextsequence="seq3", points=495 }, + { input="action", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq9" }, + { input="down", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + { input="right", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + { input="left", from=time_to_ms(2, 458), to=time_to_ms(3, 408), nextsequence="seq10" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 918), nextsequence="seq11" }, + actions = { + { input="action", from=time_to_ms(0, 492), to=time_to_ms(0, 918), nextsequence="seq4", points=2191 }, + { input="up", from=time_to_ms(0, 557), to=time_to_ms(0, 918), nextsequence="seq11" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 278), nextsequence="seq10" }, + { input="right", from=time_to_ms(0, 492), to=time_to_ms(0, 918), nextsequence="seq11" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="seq12" }, + actions = { + { input="up", from=time_to_ms(1, 147), to=time_to_ms(2, 228), nextsequence="seq5", points=495 }, + { input="down", from=time_to_ms(1, 147), to=time_to_ms(2, 261), nextsequence="seq10" }, + { input="right", from=time_to_ms(1, 147), to=time_to_ms(2, 228), nextsequence="seq12" }, + { input="left", from=time_to_ms(1, 147), to=time_to_ms(2, 228), nextsequence="seq12" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 147), nextsequence="seq11" }, + actions = { + { input="action", from=time_to_ms(0, 688), to=time_to_ms(1, 114), nextsequence="seq6", points=2191 }, + { input="up", from=time_to_ms(0, 688), to=time_to_ms(1, 114), nextsequence="seq11" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 180), nextsequence="seq12" }, + { input="left", from=time_to_ms(0, 688), to=time_to_ms(1, 114), nextsequence="seq11" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="seq12" }, + actions = { + { input="right", from=time_to_ms(0, 492), to=time_to_ms(1, 835), nextsequence="seq7", points=495 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq12" }, + { input="left", from=time_to_ms(0, 492), to=time_to_ms(2, 327), nextsequence="seq12" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="seq13" }, + actions = { + { input="action", from=time_to_ms(0, 754), to=time_to_ms(1, 835), nextsequence="seq8", points=495 }, + { input="right", from=time_to_ms(0, 754), to=time_to_ms(1, 835), nextsequence="seq13" }, + { input="left", from=time_to_ms(0, 754), to=time_to_ms(1, 835), nextsequence="seq13" }, + { input="down", from=time_to_ms(0, 754), to=time_to_ms(1, 835), nextsequence="seq13" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 453), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(19054), + kills_player = true, + timeout = { when=time_to_ms(1, 83) + laserdisc_frame_to_ms(10), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_frame(19077), + kills_player = true, + timeout = { when=time_to_ms(0, 124) + laserdisc_frame_to_ms(10), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(19090), + kills_player = true, + timeout = { when=time_to_ms(0, 582), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(19114), + kills_player = true, + timeout = { when=time_to_ms(1, 333), nextsequence=nil } + }, + + seq13 = { + start_time = time_laserdisc_frame(19150), + kills_player = true, + timeout = { when=time_to_ms(2, 543), nextsequence=nil } + }, + }, + + electric_cage_and_geyser = { + game_over = { + start_time = time_laserdisc_frame(27158), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(26723), + timeout = { when=time_to_ms(2, 292), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(26778), + timeout = { when=time_to_ms(2, 916), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 557), to=time_to_ms(2, 916), nextsequence="seq3", points=915 }, + { input="down", from=time_to_ms(2, 490), to=time_to_ms(2, 916), nextsequence="seq7" }, + { input="right", from=time_to_ms(2, 327), to=time_to_ms(2, 916), nextsequence="seq7" }, + { input="left", from=time_to_ms(2, 327), to=time_to_ms(2, 916), nextsequence="seq7" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(26778), + timeout = { when=time_to_ms(2, 916), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 557), to=time_to_ms(2, 916), nextsequence="seq3", points=915 }, + { input="down", from=time_to_ms(2, 490), to=time_to_ms(2, 916), nextsequence="seq7" }, + { input="right", from=time_to_ms(2, 327), to=time_to_ms(2, 916), nextsequence="seq7" }, + { input="left", from=time_to_ms(2, 327), to=time_to_ms(2, 916), nextsequence="seq7" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 507), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 393), nextsequence="seq4", points=1326 }, + { input="up", from=time_to_ms(0, 393), to=time_to_ms(0, 623), nextsequence="seq6" }, + { input="up", from=time_to_ms(0, 623), to=time_to_ms(1, 49), nextsequence="seq4", points=1326 }, + { input="up", from=time_to_ms(1, 81), to=time_to_ms(1, 311), nextsequence="seq6" }, + { input="up", from=time_to_ms(1, 311), to=time_to_ms(1, 769), nextsequence="seq4", points=1326 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="seq7" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="seq7" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 769), nextsequence="seq7" }, + } + }, + + seq4 = { + start_time = time_laserdisc_frame(26893), + timeout = { when=time_to_ms(5, 374), nextsequence="seq8" }, + actions = { + { input="left", from=time_to_ms(3, 113), to=time_to_ms(3, 506), nextsequence="seq5", points=2191 }, + { input="left", from=time_to_ms(3, 506), to=time_to_ms(3, 998), nextsequence="seq8" }, + { input="left", from=time_to_ms(3, 998), to=time_to_ms(4, 391), nextsequence="seq5", points=2191 }, + { input="left", from=time_to_ms(4, 424), to=time_to_ms(4, 915), nextsequence="seq8" }, + { input="left", from=time_to_ms(4, 915), to=time_to_ms(5, 341), nextsequence="seq5", points=2191 }, + { input="right", from=time_to_ms(1, 933), to=time_to_ms(5, 341), nextsequence="seq7" }, + } + }, + + seq5 = { + start_time = time_laserdisc_frame(27025), + timeout = { when=time_to_ms(0, 714), nextsequence=nil } + }, + + seq6 = { + start_time = time_laserdisc_frame(27050), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(27085), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(27122), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + }, + + falling_platform_long_reversed = { + game_over = { + start_time = time_laserdisc_frame(22588), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(21904), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(21959), + timeout = { when=time_to_ms(9, 241), nextsequence="seq3", points=124 }, + actions = { + { input="right", from=time_to_ms(2, 785), to=time_to_ms(5, 14), nextsequence="seq6" }, + { input="right", from=time_to_ms(5, 14), to=time_to_ms(5, 341), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(5, 374), to=time_to_ms(5, 702), nextsequence="seq8" }, + { input="right", from=time_to_ms(5, 702), to=time_to_ms(6, 29), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(6, 29), to=time_to_ms(6, 357), nextsequence="seq8" }, + { input="right", from=time_to_ms(6, 390), to=time_to_ms(6, 717), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(6, 717), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="left", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="left", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="left", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="up", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="up", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="down", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="down", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="down", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(21959), + timeout = { when=time_to_ms(9, 241), nextsequence="seq3", points=124 }, + actions = { + { input="right", from=time_to_ms(2, 785), to=time_to_ms(5, 14), nextsequence="seq6" }, + { input="right", from=time_to_ms(5, 14), to=time_to_ms(5, 341), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(5, 374), to=time_to_ms(5, 702), nextsequence="seq8" }, + { input="right", from=time_to_ms(5, 702), to=time_to_ms(6, 29), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(6, 29), to=time_to_ms(6, 357), nextsequence="seq8" }, + { input="right", from=time_to_ms(6, 390), to=time_to_ms(6, 717), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(6, 717), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="left", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="left", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="left", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="up", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="up", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + { input="down", from=time_to_ms(2, 785), to=time_to_ms(4, 915), nextsequence="seq6" }, + { input="down", from=time_to_ms(4, 915), to=time_to_ms(6, 750), nextsequence="seq8" }, + { input="down", from=time_to_ms(6, 783), to=time_to_ms(9, 208), nextsequence="seq6" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 802), nextsequence="seq4", points=2191 }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 360), nextsequence="seq7", points=3255 }, + { input="left", from=time_to_ms(0, 360), to=time_to_ms(0, 688), nextsequence="seq8" }, + { input="left", from=time_to_ms(0, 688), to=time_to_ms(1, 16), nextsequence="seq7", points=3255 }, + { input="left", from=time_to_ms(1, 49), to=time_to_ms(1, 376), nextsequence="seq8" }, + { input="left", from=time_to_ms(1, 376), to=time_to_ms(1, 704), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 802), nextsequence="seq8" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 802), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 802), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 702), nextsequence="seq5" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 523), nextsequence="seq6" }, + { input="right", from=time_to_ms(2, 523), to=time_to_ms(2, 851), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(2, 851), to=time_to_ms(3, 178), nextsequence="seq8" }, + { input="right", from=time_to_ms(3, 211), to=time_to_ms(3, 539), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(3, 539), to=time_to_ms(3, 867), nextsequence="seq8" }, + { input="right", from=time_to_ms(3, 867), to=time_to_ms(4, 194), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(4, 227), to=time_to_ms(4, 719), nextsequence="seq8" }, + { input="right", from=time_to_ms(4, 719), to=time_to_ms(5, 669), nextsequence="seq6" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 949), nextsequence="seq6" }, + { input="left", from=time_to_ms(2, 949), to=time_to_ms(4, 719), nextsequence="seq8" }, + { input="left", from=time_to_ms(4, 719), to=time_to_ms(5, 636), nextsequence="seq6" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 949), nextsequence="seq6" }, + { input="up", from=time_to_ms(2, 949), to=time_to_ms(4, 719), nextsequence="seq8" }, + { input="up", from=time_to_ms(4, 719), to=time_to_ms(5, 636), nextsequence="seq6" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 949), nextsequence="seq6" }, + { input="down", from=time_to_ms(2, 949), to=time_to_ms(4, 719), nextsequence="seq8" }, + { input="down", from=time_to_ms(4, 719), to=time_to_ms(5, 636), nextsequence="seq6" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + kills_player = true, + timeout = { when=time_to_ms(1, 671), nextsequence=nil } + }, + + seq6 = { + start_time = time_laserdisc_frame(22450), + kills_player = true, + timeout = { when=time_to_ms(0, 819), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(22478), + timeout = { when=time_to_ms(4, 653) + laserdisc_frame_to_ms(10), nextsequence=nil }, + }, + + seq8 = { + start_time = time_laserdisc_frame(22418), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence="seq6" } + }, + + }, + + flaming_ropes_reversed = { + game_over = { + start_time = time_laserdisc_frame(13164), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(12669), + timeout = { when=time_to_ms(2, 84), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(12725), + timeout = { when=time_to_ms(2, 523), nextsequence="seq10" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 245), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq3", points=379 }, + { input="left", from=time_to_ms(2, 130), to=time_to_ms(4, 260), nextsequence="seq9" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq9" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(12725), + timeout = { when=time_to_ms(2, 523), nextsequence="seq10" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 245), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq3", points=379 }, + { input="left", from=time_to_ms(2, 130), to=time_to_ms(4, 260), nextsequence="seq9" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq9" }, + } + }, + + seq3 = { + start_time = time_laserdisc_frame(12857), + timeout = { when=time_to_ms(1, 583), nextsequence="seq8" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 114), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 114), to=time_to_ms(1, 835), nextsequence="seq4", points=495 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 573), nextsequence="seq8" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 81), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 81), to=time_to_ms(1, 835), nextsequence="seq5", points=0 }, -- I assume this is a bug in the original ROM, but this correct move gets you no points! + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 501), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 852), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 852), to=time_to_ms(1, 704), nextsequence="seq6", points=0 }, -- I assume this is a bug in the original ROM, but this correct move gets you no points! + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 57), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(13041), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(13089), + kills_player = true, + timeout = { when=time_to_ms(3, 85), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(13127), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 621), nextsequence="seq9" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 835), to=time_to_ms(2, 884), nextsequence="seq3", points=379 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 884), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 884), nextsequence="seq9" }, + } + }, + + }, + + flattening_staircase = { + game_over = { + start_time = time_laserdisc_frame(6825), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(6283), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(6375), + timeout = { when=time_to_ms(2, 425), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(2, 32), to=time_to_ms(2, 753), nextsequence="seq3", points=495 }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(6375), + timeout = { when=time_to_ms(2, 425), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(2, 32), to=time_to_ms(2, 753), nextsequence="seq3", points=495 }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(1, 475), to=time_to_ms(2, 195), nextsequence="seq4", points=1939 }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 507), nextsequence="seq5", points=915 }, + actions = { + { input="left", from=time_to_ms(0, 754), to=time_to_ms(1, 475), nextsequence="seq5", points=915 }, + { input="upleft", from=time_to_ms(0, 754), to=time_to_ms(1, 475), nextsequence="seq5", points=915 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 507), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 507), nextsequence="seq8" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 211), nextsequence="seq7" }, + actions = { + { input="left", from=time_to_ms(1, 966), to=time_to_ms(3, 178), nextsequence="seq6", points=1326 }, + { input="right", from=time_to_ms(1, 966), to=time_to_ms(3, 178), nextsequence="seq9" }, + { input="up", from=time_to_ms(1, 966), to=time_to_ms(3, 178), nextsequence="seq9" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 278), nextsequence="seq11" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 14), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(6647), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(6695), + kills_player = true, + timeout = { when=time_to_ms(1, 166), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(6731), + kills_player = true, + timeout = { when=time_to_ms(4, 44), nextsequence=nil } + }, + + -- !!! FIXME: this was corrupt data in RomSpinner, go figure this one out. + seq11 = { + start_time = time_laserdisc_frame(6731), + kills_player = true, + timeout = { when=time_to_ms(4, 44), nextsequence=nil } + }, + + }, + + flying_horse_reversed = { + game_over = { + start_time = time_laserdisc_frame(17124), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(16488), + timeout = { when=time_to_ms(2, 209), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(16544), + timeout = { when=time_to_ms(4, 522), nextsequence="seq9" }, + actions = { + { input="upleft", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="upleft", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="left", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="seq3", points=915 }, + { input="up", from=time_to_ms(3, 801), to=time_to_ms(4, 489), nextsequence="seq9" }, + { input="right", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="right", from=time_to_ms(3, 768), to=time_to_ms(4, 456), nextsequence="seq11" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(16544), + timeout = { when=time_to_ms(4, 522), nextsequence="seq9" }, + actions = { + { input="upleft", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="upleft", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="left", from=time_to_ms(3, 768), to=time_to_ms(4, 489), nextsequence="seq3", points=915 }, + { input="up", from=time_to_ms(3, 801), to=time_to_ms(4, 489), nextsequence="seq9" }, + { input="right", from=time_to_ms(3, 441), to=time_to_ms(3, 768), nextsequence="seq9" }, + { input="right", from=time_to_ms(3, 768), to=time_to_ms(4, 456), nextsequence="seq11" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 278), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 721), to=time_to_ms(1, 245), nextsequence="seq4", points=915 }, + { input="up", from=time_to_ms(0, 721), to=time_to_ms(1, 278), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 721), to=time_to_ms(1, 278), nextsequence="seq11" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="seq9" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="seq5", points=495 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="seq11" }, + { input="up", from=time_to_ms(0, 852), to=time_to_ms(1, 966), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="seq6", points=495 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 311), to=time_to_ms(1, 966), nextsequence="seq11" }, + { input="up", from=time_to_ms(1, 49), to=time_to_ms(1, 966), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 802), nextsequence="seq10" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 245), nextsequence="seq9" }, + { input="right", from=time_to_ms(1, 245), to=time_to_ms(1, 802), nextsequence="seq7", points=1939 }, + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 769), nextsequence="seq10" }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(1, 769), nextsequence="seq10" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 475), nextsequence="seq9" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 786), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 786), to=time_to_ms(1, 442), nextsequence="seq8", points=495 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 786), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 786), to=time_to_ms(1, 442), nextsequence="seq11" }, + { input="up", from=time_to_ms(0, 393), to=time_to_ms(1, 475), nextsequence="seq9" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 8), nextsequence=nil }, + }, + + seq9 = { + start_time = time_laserdisc_frame(16976), + kills_player = true, + timeout = { when=time_to_ms(1, 834), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_frame(17024), + kills_player = true, + timeout = { when=time_to_ms(2, 692), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(17088), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + }, + + giant_bat = { + game_over = { + start_time = time_laserdisc_frame(14708), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(14231), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(14327), + timeout = { when=time_to_ms(1, 16), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="seq3", points=1326 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="seq10" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(14327), + timeout = { when=time_to_ms(1, 16), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="seq3", points=1326 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 16), nextsequence="seq10" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 409), nextsequence="seq10" }, + actions = { + { input="left", from=time_to_ms(0, 819), to=time_to_ms(1, 376), nextsequence="seq4", points=2191 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 409), nextsequence="seq10" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 359), nextsequence="seq9" }, + actions = { + { input="upleft", from=time_to_ms(1, 704), to=time_to_ms(2, 327), nextsequence="seq5", points=1326 }, + { input="up", from=time_to_ms(1, 704), to=time_to_ms(2, 327), nextsequence="seq5", points=1326 }, + { input="left", from=time_to_ms(1, 704), to=time_to_ms(2, 327), nextsequence="seq5", points=1326 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 359), nextsequence="seq10" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 359), nextsequence="seq8" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 359), nextsequence="seq11" }, + actions = { + { input="action", from=time_to_ms(1, 737), to=time_to_ms(2, 327), nextsequence="seq6", points=3551 }, + { input="down", from=time_to_ms(0, 590), to=time_to_ms(1, 147), nextsequence="seq10" }, + { input="left", from=time_to_ms(1, 737), to=time_to_ms(2, 327), nextsequence="seq11" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 442), nextsequence="seq7", points=49 } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 757), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(14611), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(14659), + timeout = { when=time_to_ms(0, 754), nextsequence="seq10" } + }, + + seq10 = { + start_time = time_laserdisc_frame(14679), + kills_player = true, + timeout = { when=time_to_ms(1, 208), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(14575), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + }, + + grim_reaper = { + game_over = { + start_time = time_laserdisc_frame(8569), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(7829), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(8004), + timeout = { when=time_to_ms(5, 800), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 573), nextsequence="seq7" }, + { input="up", from=time_to_ms(1, 573), to=time_to_ms(1, 933), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(1, 933), to=time_to_ms(3, 47), nextsequence="seq7" }, + { input="up", from=time_to_ms(3, 47), to=time_to_ms(3, 408), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(3, 408), to=time_to_ms(4, 522), nextsequence="seq7" }, + { input="up", from=time_to_ms(4, 555), to=time_to_ms(4, 915), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(4, 915), to=time_to_ms(6, 29), nextsequence="seq7" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(6, 95), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(6, 95), nextsequence="seq9" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(8004), + timeout = { when=time_to_ms(5, 800), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 573), nextsequence="seq7" }, + { input="up", from=time_to_ms(1, 573), to=time_to_ms(1, 933), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(1, 933), to=time_to_ms(3, 47), nextsequence="seq7" }, + { input="up", from=time_to_ms(3, 47), to=time_to_ms(3, 408), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(3, 408), to=time_to_ms(4, 522), nextsequence="seq7" }, + { input="up", from=time_to_ms(4, 555), to=time_to_ms(4, 915), nextsequence="seq3", points=4026 }, + { input="up", from=time_to_ms(4, 915), to=time_to_ms(6, 29), nextsequence="seq7" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(6, 95), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(6, 95), nextsequence="seq9" }, + } + }, + + seq3 = { + start_time = time_laserdisc_frame(8151), + timeout = { when=time_to_ms(3, 604), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(2, 982), to=time_to_ms(3, 572), nextsequence="seq4", points=2191 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 572), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 473), nextsequence="seq9" }, + { input="down", from=time_to_ms(3, 244), to=time_to_ms(3, 604), nextsequence="seq9" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 916), nextsequence="seq9" }, + actions = { + { input="down", from=time_to_ms(1, 573), to=time_to_ms(2, 916), nextsequence="seq5", points=1326 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 916), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 916), nextsequence="seq9" }, + { input="left", from=time_to_ms(2, 261), to=time_to_ms(2, 916), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 982), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(1, 475), to=time_to_ms(2, 982), nextsequence="seq6", points=915 }, + { input="down", from=time_to_ms(1, 671), to=time_to_ms(2, 982), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 982), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 982), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 673), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(8395), + kills_player = true, + timeout = { when=time_to_ms(2, 292), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(8475), + kills_player = true, + timeout = { when=time_to_ms(2, 418), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(8533), + kills_player = true, + timeout = { when=time_to_ms(1, 458), nextsequence=nil } + }, + }, + + grim_reaper_reversed = { + game_over = { + start_time = time_laserdisc_frame(20046), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(19306), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(19520), + timeout = { when=time_to_ms(4, 227), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq7" }, + { input="up", from=time_to_ms(0, 721), to=time_to_ms(1, 16), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(1, 16), to=time_to_ms(2, 195), nextsequence="seq7" }, + { input="up", from=time_to_ms(2, 228), to=time_to_ms(2, 523), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(2, 523), to=time_to_ms(3, 703), nextsequence="seq7" }, + { input="up", from=time_to_ms(3, 703), to=time_to_ms(3, 998), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(3, 998), to=time_to_ms(4, 391), nextsequence="seq7" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(4, 489), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(4, 489), nextsequence="seq9" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(19520), + timeout = { when=time_to_ms(4, 227), nextsequence="seq7" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq7" }, + { input="up", from=time_to_ms(0, 721), to=time_to_ms(1, 16), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(1, 16), to=time_to_ms(2, 195), nextsequence="seq7" }, + { input="up", from=time_to_ms(2, 228), to=time_to_ms(2, 523), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(2, 523), to=time_to_ms(3, 703), nextsequence="seq7" }, + { input="up", from=time_to_ms(3, 703), to=time_to_ms(3, 998), nextsequence="seq3", points=4750 }, + { input="up", from=time_to_ms(3, 998), to=time_to_ms(4, 391), nextsequence="seq7" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(4, 489), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(4, 489), nextsequence="seq9" }, + } + }, + + seq3 = { + start_time = time_laserdisc_frame(19628), + timeout = { when=time_to_ms(3, 604), nextsequence="seq8" }, + actions = { + { input="action", from=time_to_ms(3, 47), to=time_to_ms(3, 604), nextsequence="seq4", points=2191 }, + { input="down", from=time_to_ms(3, 47), to=time_to_ms(3, 637), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="seq9" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(3, 604), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 982), nextsequence="seq9" }, + actions = { + { input="down", from=time_to_ms(2, 163), to=time_to_ms(2, 982), nextsequence="seq5", points=1326 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 982), nextsequence="seq9" }, + { input="right", from=time_to_ms(2, 163), to=time_to_ms(2, 982), nextsequence="seq9" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 982), nextsequence="seq9" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 589), nextsequence="seq9" }, + actions = { + { input="up", from=time_to_ms(1, 606), to=time_to_ms(2, 556), nextsequence="seq6", points=915 }, + { input="down", from=time_to_ms(1, 606), to=time_to_ms(3, 15), nextsequence="seq9" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 47), nextsequence="seq9" }, + { input="left", from=time_to_ms(1, 606), to=time_to_ms(3, 15), nextsequence="seq9" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 875), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(19872), + kills_player = true, + timeout = { when=time_to_ms(2, 292), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(19950), + kills_player = true, + timeout = { when=time_to_ms(2, 459), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(20010), + kills_player = true, + timeout = { when=time_to_ms(1, 458), nextsequence=nil } + }, + }, + + lizard_king = { + game_over = { + start_time = time_laserdisc_frame(18142), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(17208), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(17264), + timeout = { when=time_to_ms(2, 163), nextsequence="seq15" }, + actions = { + { input="left", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="up", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="upleft", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="down", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq17" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 163), nextsequence="seq16" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(17264), + timeout = { when=time_to_ms(2, 163), nextsequence="seq15" }, + actions = { + { input="left", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="up", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="upleft", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq3", points=1939 }, + { input="down", from=time_to_ms(0, 459), to=time_to_ms(2, 130), nextsequence="seq17" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 163), nextsequence="seq16" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 456), nextsequence="seq17" }, + actions = { + { input="right", from=time_to_ms(3, 572), to=time_to_ms(4, 424), nextsequence="seq4", points=1326 }, + { input="left", from=time_to_ms(3, 572), to=time_to_ms(4, 424), nextsequence="seq16" }, + { input="down", from=time_to_ms(3, 572), to=time_to_ms(4, 424), nextsequence="seq15" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 506), nextsequence="seq17" }, + actions = { + { input="right", from=time_to_ms(2, 654), to=time_to_ms(3, 473), nextsequence="seq5", points=1326 }, + { input="left", from=time_to_ms(2, 654), to=time_to_ms(3, 473), nextsequence="seq16" }, + { input="down", from=time_to_ms(2, 654), to=time_to_ms(3, 473), nextsequence="seq15" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 97), nextsequence="seq17" }, + actions = { + { input="right", from=time_to_ms(1, 212), to=time_to_ms(2, 64), nextsequence="seq6", points=1326 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq16" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq15" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 817), nextsequence="seq17" }, + actions = { + { input="right", from=time_to_ms(3, 834), to=time_to_ms(4, 784), nextsequence="seq7", points=1326 }, + { input="left", from=time_to_ms(3, 834), to=time_to_ms(4, 784), nextsequence="seq16" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(4, 817), nextsequence="seq15" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="seq17" }, + actions = { + { input="right", from=time_to_ms(1, 409), to=time_to_ms(2, 130), nextsequence="seq8", points=2191 }, + { input="left", from=time_to_ms(1, 409), to=time_to_ms(2, 130), nextsequence="seq16" }, + { input="down", from=time_to_ms(1, 409), to=time_to_ms(2, 130), nextsequence="seq15" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="seq17" }, + actions = { + { input="up", from=time_to_ms(0, 459), to=time_to_ms(2, 195), nextsequence="seq9", points=3255 }, + { input="action", from=time_to_ms(0, 459), to=time_to_ms(2, 195), nextsequence="seq9", points=3255 }, + } + }, + + -- once you recover your sword and attack, no more points are awarded in this level in the original ROM, + -- probably because after this sequence there are still right and wrong moves, but just not touching + -- anything will let you survive the level on autopilot. + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 573), nextsequence="seq15" }, + actions = { + { input="action", from=time_to_ms(0, 819), to=time_to_ms(1, 540), nextsequence="seq10", points=0 }, + { input="down", from=time_to_ms(0, 819), to=time_to_ms(1, 540), nextsequence="seq15" }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 950), nextsequence="seq11", points=0 }, + actions = { + { input="action", from=time_to_ms(0, 328), to=time_to_ms(0, 950), nextsequence="seq11", points=0 }, + { input="down", from=time_to_ms(0, 328), to=time_to_ms(0, 950), nextsequence="seq11", points=0 }, + } + }, + + seq11 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 16), nextsequence="seq12", points=0 }, + actions = { + { input="action", from=time_to_ms(0, 164), to=time_to_ms(0, 983), nextsequence="seq12", points=0 }, + } + }, + + seq12 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 918), nextsequence="seq13", points=0 }, + actions = { + { input="action", from=time_to_ms(0, 492), to=time_to_ms(0, 918), nextsequence="seq13", points=0 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 918), nextsequence="seq17" }, + { input="down", from=time_to_ms(0, 492), to=time_to_ms(0, 918), nextsequence="seq13", points=0 }, + { input="left", from=time_to_ms(0, 492), to=time_to_ms(0, 918), nextsequence="seq15" }, + } + }, + + seq13 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 114), nextsequence="seq14", points=0 }, + actions = { + { input="action", from=time_to_ms(0, 557), to=time_to_ms(1, 81), nextsequence="seq14", points=0 }, + } + }, + + seq14 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 238) - laserdisc_frame_to_ms(3), nextsequence=nil } + }, + + seq15 = { + start_time = time_laserdisc_frame(18036), + kills_player = true, + timeout = { when=time_to_ms(1, 0), nextsequence=nil } + }, + + seq16 = { + start_time = time_laserdisc_frame(18060), + kills_player = true, + timeout = { when=time_to_ms(3, 419), nextsequence=nil } + }, + + seq17 = { + start_time = time_laserdisc_frame(18082), + kills_player = true, + timeout = { when=time_to_ms(2, 501), nextsequence=nil } + }, + }, + + mudmen = { + game_over = { + start_time = time_laserdisc_frame(25396), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(24322), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(24378), + timeout = { when=time_to_ms(5, 964), nextsequence="seq15" }, + actions = { + { input="action", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq3", points=1326 }, + { input="up", from=time_to_ms(4, 260), to=time_to_ms(5, 931), nextsequence="seq13" }, + { input="down", from=time_to_ms(3, 539), to=time_to_ms(5, 833), nextsequence="seq14" }, + { input="down", from=time_to_ms(5, 833), to=time_to_ms(5, 931), nextsequence="seq15" }, + { input="right", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq15" }, + { input="left", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq15" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(24378), + timeout = { when=time_to_ms(5, 964), nextsequence="seq15" }, + actions = { + { input="action", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq3", points=1326 }, + { input="up", from=time_to_ms(4, 260), to=time_to_ms(5, 931), nextsequence="seq13" }, + { input="down", from=time_to_ms(3, 539), to=time_to_ms(5, 833), nextsequence="seq14" }, + { input="down", from=time_to_ms(5, 833), to=time_to_ms(5, 931), nextsequence="seq15" }, + { input="right", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq15" }, + { input="left", from=time_to_ms(3, 965), to=time_to_ms(5, 931), nextsequence="seq15" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 703), nextsequence="seq4", points=1326 }, + actions = { + { input="right", from=time_to_ms(2, 720), to=time_to_ms(3, 670), nextsequence="seq15" }, + { input="down", from=time_to_ms(2, 720), to=time_to_ms(3, 670), nextsequence="seq15" }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="seq15" }, + { input="up", from=time_to_ms(2, 720), to=time_to_ms(3, 670), nextsequence="seq4", points=1326 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 703), nextsequence="seq15" }, + { input="action", from=time_to_ms(0, 0), to=time_to_ms(3, 703), nextsequence="seq15" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 606), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(0, 295), to=time_to_ms(1, 606), nextsequence="seq5", points=2191 }, + { input="upleft", from=time_to_ms(0, 295), to=time_to_ms(1, 606), nextsequence="seq5", points=2191 }, + { input="action", from=time_to_ms(0, 295), to=time_to_ms(1, 573), nextsequence="seq15" }, + { input="left", from=time_to_ms(0, 295), to=time_to_ms(1, 573), nextsequence="seq12" }, + { input="right", from=time_to_ms(0, 295), to=time_to_ms(1, 573), nextsequence="seq14" }, + { input="down", from=time_to_ms(0, 295), to=time_to_ms(1, 573), nextsequence="seq15" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 540), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq6", points=2675 }, + { input="right", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq6", points=2675 }, + { input="upright", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq6", points=2675 }, + { input="down", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq15" }, + { input="left", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq14" }, + { input="action", from=time_to_ms(1, 16), to=time_to_ms(1, 540), nextsequence="seq15" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 933), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(0, 852), to=time_to_ms(1, 933), nextsequence="seq7", points=1326 }, + { input="left", from=time_to_ms(0, 852), to=time_to_ms(1, 933), nextsequence="seq12" }, + { input="down", from=time_to_ms(0, 852), to=time_to_ms(1, 933), nextsequence="seq13" }, + { input="right", from=time_to_ms(1, 278), to=time_to_ms(1, 933), nextsequence="seq15" }, + { input="action", from=time_to_ms(1, 278), to=time_to_ms(1, 933), nextsequence="seq15" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 638), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(0, 655), to=time_to_ms(1, 606), nextsequence="seq8", points=1326 }, + { input="left", from=time_to_ms(0, 655), to=time_to_ms(1, 573), nextsequence="seq12" }, + { input="right", from=time_to_ms(0, 655), to=time_to_ms(1, 573), nextsequence="seq14" }, + { input="down", from=time_to_ms(0, 655), to=time_to_ms(1, 573), nextsequence="seq15" }, + { input="action", from=time_to_ms(0, 655), to=time_to_ms(1, 573), nextsequence="seq15" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 654), nextsequence="seq16" }, + actions = { + { input="upleft", from=time_to_ms(1, 475), to=time_to_ms(1, 933), nextsequence="seq16" }, + { input="upleft", from=time_to_ms(1, 933), to=time_to_ms(2, 621), nextsequence="seq9", points=1326 }, + { input="up", from=time_to_ms(1, 475), to=time_to_ms(1, 933), nextsequence="seq16" }, + { input="up", from=time_to_ms(1, 933), to=time_to_ms(2, 621), nextsequence="seq9", points=1326 }, + { input="left", from=time_to_ms(1, 475), to=time_to_ms(2, 621), nextsequence="seq16" }, + { input="right", from=time_to_ms(1, 475), to=time_to_ms(2, 621), nextsequence="seq16" }, + { input="down", from=time_to_ms(1, 475), to=time_to_ms(2, 621), nextsequence="seq15" }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(1, 114), to=time_to_ms(2, 720), nextsequence="seq10", points=1326 }, + { input="right", from=time_to_ms(1, 114), to=time_to_ms(2, 753), nextsequence="seq16" }, + { input="left", from=time_to_ms(1, 114), to=time_to_ms(2, 753), nextsequence="seq16" }, + { input="down", from=time_to_ms(1, 114), to=time_to_ms(2, 753), nextsequence="seq15" }, + { input="action", from=time_to_ms(1, 114), to=time_to_ms(2, 753), nextsequence="seq15" }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 391), nextsequence="seq15" }, + actions = { + { input="up", from=time_to_ms(2, 818), to=time_to_ms(4, 686), nextsequence="seq11", points=1326 }, + { input="right", from=time_to_ms(2, 818), to=time_to_ms(4, 686), nextsequence="seq11", points=1326 }, + { input="down", from=time_to_ms(2, 818), to=time_to_ms(3, 998), nextsequence="seq15" }, + { input="down", from=time_to_ms(3, 998), to=time_to_ms(7, 897), nextsequence="seq14" }, + { input="left", from=time_to_ms(3, 998), to=time_to_ms(7, 897), nextsequence="seq15" }, + { input="action", from=time_to_ms(3, 310), to=time_to_ms(7, 209), nextsequence="seq15" }, + } + }, + + seq11 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 421), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(25194), + kills_player = true, + timeout = { when=time_to_ms(4, 420), nextsequence=nil } + }, + + seq13 = { + start_time = time_laserdisc_frame(25098), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + + seq14 = { + start_time = time_laserdisc_frame(25360), + kills_player = true, + timeout = { when=time_to_ms(1, 500), nextsequence=nil } + }, + + seq15 = { + start_time = time_laserdisc_frame(25300), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq16 = { + start_time = time_laserdisc_frame(25146), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + }, + + yellow_brick_road = { + game_over = { + start_time = time_laserdisc_frame(4981), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(4083), + timeout = { when=time_to_ms(2, 84), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(4139), + timeout = { when=time_to_ms(1, 868), nextsequence="seq14" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq3", points=1326 }, + { input="up", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="down", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="right", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(4139), + timeout = { when=time_to_ms(1, 868), nextsequence="seq14" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq3", points=1326 }, + { input="up", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="down", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="right", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 64), nextsequence="seq12" }, + actions = { + { input="up", from=time_to_ms(0, 885), to=time_to_ms(2, 32), nextsequence="seq4", points=1939 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 64), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 885), to=time_to_ms(2, 32), nextsequence="seq12" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 458), nextsequence="seq14" }, + actions = { + { input="right", from=time_to_ms(1, 81), to=time_to_ms(2, 458), nextsequence="seq5", points=2191 }, + { input="left", from=time_to_ms(1, 507), to=time_to_ms(2, 425), nextsequence="seq14" }, + { input="up", from=time_to_ms(1, 81), to=time_to_ms(2, 458), nextsequence="seq14" }, + { input="down", from=time_to_ms(1, 343), to=time_to_ms(2, 458), nextsequence="seq14" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="seq14" }, + actions = { + { input="up", from=time_to_ms(0, 492), to=time_to_ms(1, 769), nextsequence="seq6", points=2675 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq14" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 835), nextsequence="seq14" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 130), nextsequence="seq15" }, + actions = { + { input="left", from=time_to_ms(0, 655), to=time_to_ms(2, 97), nextsequence="seq7", points=3255 }, + { input="right", from=time_to_ms(1, 114), to=time_to_ms(2, 130), nextsequence="seq15" }, + { input="action", from=time_to_ms(1, 114), to=time_to_ms(2, 130), nextsequence="seq15" }, + { input="up", from=time_to_ms(1, 114), to=time_to_ms(2, 130), nextsequence="seq15" }, + { input="down", from=time_to_ms(1, 114), to=time_to_ms(2, 130), nextsequence="seq15" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 933), nextsequence="seq16" }, + actions = { + { input="up", from=time_to_ms(1, 245), to=time_to_ms(1, 933), nextsequence="seq8", points=3551 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 933), nextsequence="seq15" }, + { input="left", from=time_to_ms(1, 245), to=time_to_ms(1, 933), nextsequence="seq16" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 933), nextsequence="seq14" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 244), nextsequence="seq17" }, + actions = { + { input="action", from=time_to_ms(2, 490), to=time_to_ms(3, 211), nextsequence="seq9", points=4026 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(3, 244), nextsequence="seq14" }, + { input="left", from=time_to_ms(2, 490), to=time_to_ms(3, 211), nextsequence="seq17" }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 540), nextsequence="seq14" }, + actions = { + { input="right", from=time_to_ms(0, 721), to=time_to_ms(1, 475), nextsequence="seq10", points=5000 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 540), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 885), to=time_to_ms(1, 507), nextsequence="seq14" }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 97), nextsequence="seq18" }, + actions = { + { input="up", from=time_to_ms(0, 754), to=time_to_ms(2, 64), nextsequence="seq11", points=4750 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq14" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq15" }, + } + }, + + seq11 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 225), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(4639), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence=nil } + }, + + seq14 = { + start_time = time_laserdisc_frame(4711), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq15 = { + start_time = time_laserdisc_frame(4759), + kills_player = true, + timeout = { when=time_to_ms(3, 335), nextsequence=nil } + }, + + seq16 = { + start_time = time_laserdisc_frame(4839), + kills_player = true, + timeout = { when=time_to_ms(1, 83), nextsequence=nil } + }, + + seq17 = { + start_time = time_laserdisc_frame(4875), + kills_player = true, + timeout = { when=time_to_ms(1, 834), nextsequence=nil } + }, + + seq18 = { + start_time = time_laserdisc_frame(4923), + kills_player = true, + timeout = { when=time_to_ms(2, 543), nextsequence=nil } + }, + }, + + yellow_brick_road_reversed = { + game_over = { + start_time = time_laserdisc_frame(14148), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(13247), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(13303), + timeout = { when=time_to_ms(1, 868), nextsequence="seq14" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 868), nextsequence="seq3", points=1939 }, + { input="up", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="left", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(13303), + timeout = { when=time_to_ms(1, 868), nextsequence="seq14" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 868), nextsequence="seq3", points=1939 }, + { input="up", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + { input="left", from=time_to_ms(1, 606), to=time_to_ms(1, 999), nextsequence="seq14" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 64), nextsequence="seq12" }, + actions = { + { input="up", from=time_to_ms(0, 885), to=time_to_ms(2, 32), nextsequence="seq4", points=2191 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 64), nextsequence="seq14" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="seq14" }, + actions = { + { input="left", from=time_to_ms(1, 81), to=time_to_ms(2, 425), nextsequence="seq5", points=2675 }, + { input="right", from=time_to_ms(1, 507), to=time_to_ms(2, 392), nextsequence="seq14" }, + { input="up", from=time_to_ms(1, 81), to=time_to_ms(2, 425), nextsequence="seq14" }, + { input="down", from=time_to_ms(1, 81), to=time_to_ms(2, 425), nextsequence="seq14" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 737), nextsequence="seq14" }, + actions = { + { input="up", from=time_to_ms(0, 492), to=time_to_ms(1, 737), nextsequence="seq6", points=3255 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq14" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 737), nextsequence="seq14" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 97), nextsequence="seq15" }, + actions = { + { input="right", from=time_to_ms(0, 655), to=time_to_ms(2, 64), nextsequence="seq7", points=3551 }, + { input="left", from=time_to_ms(1, 114), to=time_to_ms(2, 130), nextsequence="seq15" }, + { input="up", from=time_to_ms(1, 81), to=time_to_ms(2, 97), nextsequence="seq15" }, + { input="down", from=time_to_ms(1, 81), to=time_to_ms(2, 97), nextsequence="seq15" }, + { input="action", from=time_to_ms(1, 81), to=time_to_ms(2, 97), nextsequence="seq15" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 933), nextsequence="seq16" }, + actions = { + { input="up", from=time_to_ms(1, 212), to=time_to_ms(1, 933), nextsequence="seq8", points=4026 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(1, 933), nextsequence="seq15" }, + { input="right", from=time_to_ms(1, 212), to=time_to_ms(1, 901), nextsequence="seq16" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 933), nextsequence="seq14" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 244), nextsequence="seq17" }, + actions = { + { input="action", from=time_to_ms(2, 490), to=time_to_ms(3, 211), nextsequence="seq9", points=4026 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(3, 342), nextsequence="seq14" }, + { input="right", from=time_to_ms(2, 490), to=time_to_ms(3, 310), nextsequence="seq17" }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 540), nextsequence="seq14" }, + actions = { + { input="left", from=time_to_ms(0, 721), to=time_to_ms(1, 507), nextsequence="seq10", points=5000 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 311), nextsequence="seq14" }, + { input="right", from=time_to_ms(0, 885), to=time_to_ms(1, 507), nextsequence="seq14" }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 97), nextsequence="seq18" }, + actions = { + { input="up", from=time_to_ms(0, 754), to=time_to_ms(2, 64), nextsequence="seq11", points=4750 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq14" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq14" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 97), nextsequence="seq15" }, + } + }, + + seq11 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 693), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(13803), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + + seq14 = { + start_time = time_laserdisc_frame(13875), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + seq15 = { + start_time = time_laserdisc_frame(13923), + kills_player = true, + timeout = { when=time_to_ms(3, 293), nextsequence=nil } + }, + + seq16 = { + start_time = time_laserdisc_frame(14003), + kills_player = true, + timeout = { when=time_to_ms(1, 83), nextsequence=nil } + }, + + seq17 = { + start_time = time_laserdisc_frame(14039), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + seq18 = { + start_time = time_laserdisc_frame(14087), + kills_player = true, + timeout = { when=time_to_ms(2, 376), nextsequence=nil } + }, + }, + + robot_knight = { + game_over = { + start_time = time_laserdisc_frame(11340), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(10685), + timeout = { when=time_to_ms(2, 167), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(10741), + timeout = { when=time_to_ms(4, 293), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(2, 884), to=time_to_ms(4, 260), nextsequence="seq3", points=1939 }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(10741), + timeout = { when=time_to_ms(4, 293), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(2, 884), to=time_to_ms(4, 260), nextsequence="seq3", points=1939 }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 311), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(0, 426), to=time_to_ms(1, 278), nextsequence="seq4", points=1939 }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 540), nextsequence="seq11" }, + actions = { + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 507), nextsequence="seq5", points=2191 }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(1, 147), to=time_to_ms(2, 163), nextsequence="seq6", points=1939 }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 130), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(1, 212), to=time_to_ms(2, 97), nextsequence="seq7", points=1939 }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 49), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(0, 393), to=time_to_ms(1, 16), nextsequence="seq8", points=1939 }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 754), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(0, 197), to=time_to_ms(0, 754), nextsequence="seq9", points=4026 }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 687), nextsequence="seq12" }, + actions = { + { input="up", from=time_to_ms(1, 606), to=time_to_ms(2, 687), nextsequence="seq12" }, + { input="action", from=time_to_ms(1, 606), to=time_to_ms(2, 687), nextsequence="seq10", points=2191 }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 441), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(11269), + kills_player = true, + timeout = { when=time_to_ms(1, 875), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(11317), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + }, + + robot_knight_reversed = { + game_over = { + start_time = time_laserdisc_frame(21820), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(21156), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(21212), + timeout = { when=time_to_ms(4, 391), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq3", points=2191 }, + { input="up", from=time_to_ms(3, 473), to=time_to_ms(7, 766), nextsequence="seq11" }, + { input="down", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq11" }, + { input="right", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq11" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(21212), + timeout = { when=time_to_ms(4, 391), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq3", points=2191 }, + { input="up", from=time_to_ms(3, 473), to=time_to_ms(7, 766), nextsequence="seq11" }, + { input="down", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq11" }, + { input="right", from=time_to_ms(3, 473), to=time_to_ms(4, 358), nextsequence="seq11" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 311), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(0, 557), to=time_to_ms(1, 278), nextsequence="seq4", points=2191 }, + { input="up", from=time_to_ms(0, 557), to=time_to_ms(1, 278), nextsequence="seq11" }, + { input="down", from=time_to_ms(0, 557), to=time_to_ms(1, 278), nextsequence="seq11" }, + { input="left", from=time_to_ms(0, 557), to=time_to_ms(1, 278), nextsequence="seq11" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 606), nextsequence="seq11" }, + actions = { + { input="up", from=time_to_ms(0, 950), to=time_to_ms(1, 573), nextsequence="seq5", points=2675 }, + { input="down", from=time_to_ms(0, 950), to=time_to_ms(1, 573), nextsequence="seq11" }, + { input="right", from=time_to_ms(0, 950), to=time_to_ms(1, 573), nextsequence="seq11" }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(1, 573), nextsequence="seq11" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq6", points=2191 }, + { input="up", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq11" }, + { input="down", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq11" }, + { input="left", from=time_to_ms(1, 245), to=time_to_ms(2, 130), nextsequence="seq11" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 130), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(1, 212), to=time_to_ms(2, 97), nextsequence="seq7", points=2191 }, + { input="up", from=time_to_ms(1, 212), to=time_to_ms(2, 97), nextsequence="seq11" }, + { input="down", from=time_to_ms(1, 212), to=time_to_ms(2, 97), nextsequence="seq11" }, + { input="right", from=time_to_ms(1, 212), to=time_to_ms(2, 97), nextsequence="seq11" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 49), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(0, 393), to=time_to_ms(1, 16), nextsequence="seq8", points=2191 }, + { input="up", from=time_to_ms(0, 393), to=time_to_ms(1, 16), nextsequence="seq11" }, + { input="down", from=time_to_ms(0, 393), to=time_to_ms(1, 16), nextsequence="seq11" }, + { input="left", from=time_to_ms(0, 393), to=time_to_ms(1, 16), nextsequence="seq11" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 754), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(0, 197), to=time_to_ms(0, 754), nextsequence="seq9", points=4750 }, + { input="up", from=time_to_ms(0, 197), to=time_to_ms(0, 754), nextsequence="seq11" }, + { input="right", from=time_to_ms(0, 197), to=time_to_ms(0, 754), nextsequence="seq11" }, + { input="down", from=time_to_ms(0, 197), to=time_to_ms(0, 754), nextsequence="seq11" }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="seq12" }, + actions = { + { input="up", from=time_to_ms(1, 835), to=time_to_ms(2, 687), nextsequence="seq12" }, + { input="action", from=time_to_ms(1, 835), to=time_to_ms(2, 687), nextsequence="seq10", points=2675 }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 203), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(21740), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(21788), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + }, + + fire_room = { + game_over = { + start_time = time_laserdisc_frame(9880), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(9473), + timeout = { when=time_to_ms(2, 167), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(9529), + timeout = { when=time_to_ms(3, 539), nextsequence="seq8" }, + actions = { + { input="right", from=time_to_ms(2, 884), to=time_to_ms(3, 506), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(2, 884), to=time_to_ms(3, 473), nextsequence="seq8" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(9529), + timeout = { when=time_to_ms(3, 539), nextsequence="seq8" }, + actions = { + { input="right", from=time_to_ms(2, 884), to=time_to_ms(3, 506), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(2, 884), to=time_to_ms(3, 473), nextsequence="seq8" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 163), nextsequence="seq8" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 328), nextsequence="seq7" }, + { input="up", from=time_to_ms(1, 147), to=time_to_ms(2, 97), nextsequence="seq4", points=1326 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 328), nextsequence="seq7" }, + { input="left", from=time_to_ms(1, 147), to=time_to_ms(2, 97), nextsequence="seq4", points=1326 }, + { input="down", from=time_to_ms(1, 147), to=time_to_ms(2, 195), nextsequence="seq8" }, + { input="right", from=time_to_ms(1, 147), to=time_to_ms(2, 195), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 966), nextsequence="seq8" }, + actions = { + { input="left", from=time_to_ms(0, 655), to=time_to_ms(1, 966), nextsequence="seq5", points=915 }, + { input="up", from=time_to_ms(0, 655), to=time_to_ms(1, 966), nextsequence="seq7" }, + { input="down", from=time_to_ms(0, 655), to=time_to_ms(1, 966), nextsequence="seq5", points=915 }, + { input="downleft", from=time_to_ms(0, 655), to=time_to_ms(1, 966), nextsequence="seq5", points=915 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 966), nextsequence="seq7" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 638), nextsequence="seq8" }, + actions = { + { input="left", from=time_to_ms(0, 197), to=time_to_ms(1, 638), nextsequence="seq6", points=1326 }, + { input="up", from=time_to_ms(0, 0), to=time_to_ms(1, 638), nextsequence="seq7" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 638), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(1, 638), nextsequence="seq8" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 913), nextsequence=nil } + }, + + seq7 = { + start_time = time_laserdisc_frame(9821), + kills_player = true, + timeout = { when=time_to_ms(1, 180), nextsequence="seq8" } + }, + + seq8 = { + start_time = time_laserdisc_frame(9857), + kills_player = true, + timeout = { when=time_to_ms(1, 0), nextsequence=nil } + }, + }, + + smithee = { + game_over = { + start_time = time_laserdisc_frame(7745), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(6911), + timeout = { when=time_to_ms(2, 376), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(6994), + timeout = { when=time_to_ms(3, 113), nextsequence="seq9" }, + actions = { + { input="action", from=time_to_ms(2, 228), to=time_to_ms(3, 80), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="up", from=time_to_ms(1, 507), to=time_to_ms(3, 178), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 654), nextsequence="seq8" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(6994), + timeout = { when=time_to_ms(3, 113), nextsequence="seq9" }, + actions = { + { input="action", from=time_to_ms(2, 228), to=time_to_ms(3, 80), nextsequence="seq3", points=915 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="up", from=time_to_ms(1, 507), to=time_to_ms(3, 178), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 654), nextsequence="seq8" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 490), nextsequence="seq10" }, + actions = { + { input="action", from=time_to_ms(1, 933), to=time_to_ms(2, 458), nextsequence="seq4", points=1939 }, + { input="up", from=time_to_ms(1, 147), to=time_to_ms(2, 425), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq8" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 720), nextsequence="seq11" }, + actions = { + { input="left", from=time_to_ms(0, 0), to=time_to_ms(0, 950), nextsequence="seq8" }, + { input="left", from=time_to_ms(0, 950), to=time_to_ms(2, 687), nextsequence="seq5", points=1326 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 720), nextsequence="seq8" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="seq12" }, + actions = { + { input="action", from=time_to_ms(1, 49), to=time_to_ms(1, 835), nextsequence="seq6", points=1326 }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(6, 259), nextsequence="seq13" }, + actions = { + { input="action", from=time_to_ms(5, 210), to=time_to_ms(6, 259), nextsequence="seq7", points=915 }, + { input="right", from=time_to_ms(5, 210), to=time_to_ms(6, 259), nextsequence="seq13" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(4, 269), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(7489), + kills_player = true, + timeout = { when=time_to_ms(1, 458), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(7525), + kills_player = true, + timeout = { when=time_to_ms(0, 833), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_frame(7549), + kills_player = true, + timeout = { when=time_to_ms(1, 875), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(7623), + kills_player = true, + timeout = { when=time_to_ms(1, 83), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(7649), + kills_player = true, + timeout = { when=time_to_ms(0, 958), nextsequence=nil } + }, + + seq13 = { + start_time = time_laserdisc_frame(7681), + kills_player = true, + timeout = { when=time_to_ms(2, 626), nextsequence=nil } + }, + }, + + smithee_reversed = { + game_over = { + start_time = time_laserdisc_frame(16405), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(15570), + timeout = { when=time_to_ms(2, 84), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(15653), + timeout = { when=time_to_ms(3, 178), nextsequence="seq9" }, + actions = { + { input="action", from=time_to_ms(1, 475), to=time_to_ms(2, 195), nextsequence="seq9" }, + { input="action", from=time_to_ms(2, 195), to=time_to_ms(3, 113), nextsequence="seq3", points=1326 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="up", from=time_to_ms(1, 507), to=time_to_ms(3, 178), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 654), nextsequence="seq8" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(15653), + timeout = { when=time_to_ms(3, 178), nextsequence="seq9" }, + actions = { + { input="action", from=time_to_ms(1, 475), to=time_to_ms(2, 195), nextsequence="seq9" }, + { input="action", from=time_to_ms(2, 195), to=time_to_ms(3, 113), nextsequence="seq3", points=1326 }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(3, 113), nextsequence="seq8" }, + { input="up", from=time_to_ms(1, 507), to=time_to_ms(3, 178), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 654), nextsequence="seq8" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 490), nextsequence="seq10" }, + actions = { + { input="action", from=time_to_ms(0, 852), to=time_to_ms(1, 933), nextsequence="seq10" }, + { input="action", from=time_to_ms(1, 933), to=time_to_ms(2, 458), nextsequence="seq4", points=2191 }, + { input="up", from=time_to_ms(1, 147), to=time_to_ms(2, 425), nextsequence="seq8" }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(1, 147), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq8" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 490), nextsequence="seq8" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 753), nextsequence="seq11" }, + actions = { + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 950), nextsequence="seq8" }, + { input="right", from=time_to_ms(0, 950), to=time_to_ms(2, 720), nextsequence="seq5", points=1326 }, + { input="down", from=time_to_ms(0, 0), to=time_to_ms(2, 753), nextsequence="seq8" }, + { input="left", from=time_to_ms(0, 0), to=time_to_ms(2, 753), nextsequence="seq8" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 802), nextsequence="seq12" }, + actions = { + { input="action", from=time_to_ms(0, 229), to=time_to_ms(0, 983), nextsequence="seq12" }, + { input="action", from=time_to_ms(0, 983), to=time_to_ms(1, 802), nextsequence="seq6", points=1326 }, + { input="up", from=time_to_ms(1, 49), to=time_to_ms(1, 868), nextsequence="seq12" }, + { input="down", from=time_to_ms(1, 49), to=time_to_ms(1, 868), nextsequence="seq12" }, + { input="left", from=time_to_ms(1, 49), to=time_to_ms(1, 868), nextsequence="seq12" }, + { input="right", from=time_to_ms(1, 49), to=time_to_ms(1, 868), nextsequence="seq12" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(6, 226), nextsequence="seq13" }, + actions = { + { input="action", from=time_to_ms(5, 177), to=time_to_ms(6, 226), nextsequence="seq7", points=915 }, + { input="right", from=time_to_ms(5, 210), to=time_to_ms(6, 259), nextsequence="seq13" }, + { input="left", from=time_to_ms(5, 210), to=time_to_ms(6, 259), nextsequence="seq13" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 987), nextsequence=nil } + }, + + seq8 = { + start_time = time_laserdisc_frame(16148), + kills_player = true, + timeout = { when=time_to_ms(1, 417), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_frame(16184), + kills_player = true, + timeout = { when=time_to_ms(0, 791), nextsequence=nil } + }, + + seq10 = { + start_time = time_laserdisc_frame(16208), + kills_player = true, + timeout = { when=time_to_ms(1, 542), nextsequence=nil } + }, + + seq11 = { + start_time = time_laserdisc_frame(16282), + kills_player = true, + timeout = { when=time_to_ms(1, 125), nextsequence=nil } + }, + + seq12 = { + start_time = time_laserdisc_frame(16308), + kills_player = true, + timeout = { when=time_to_ms(1, 41), nextsequence=nil } + }, + + seq13 = { + start_time = time_laserdisc_frame(16341), + kills_player = true, + timeout = { when=time_to_ms(2, 668), nextsequence=nil } + }, + }, + + snake_room = { + game_over = { + start_time = time_laserdisc_frame(3411), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(3041), + timeout = { when=time_to_ms(2, 376), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(3097), + timeout = { when=time_to_ms(2, 720), nextsequence="seq7" }, + actions = { + { input="action", from=time_to_ms(1, 966), to=time_to_ms(2, 687), nextsequence="seq3", points=495 }, + { input="left", from=time_to_ms(1, 966), to=time_to_ms(2, 687), nextsequence="seq7" }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(3097), + timeout = { when=time_to_ms(2, 720), nextsequence="seq7" }, + actions = { + { input="action", from=time_to_ms(1, 966), to=time_to_ms(2, 687), nextsequence="seq3", points=495 }, + { input="left", from=time_to_ms(1, 966), to=time_to_ms(2, 687), nextsequence="seq7" }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 671), nextsequence="seq7" }, + actions = { + { input="action", from=time_to_ms(0, 918), to=time_to_ms(1, 638), nextsequence="seq4", points=2675 }, + { input="right", from=time_to_ms(0, 918), to=time_to_ms(1, 638), nextsequence="seq7" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 835), nextsequence="seq9", points=49 }, + actions = { + { input="action", from=time_to_ms(1, 49), to=time_to_ms(1, 868), nextsequence="seq9", points=49 }, + { input="left", from=time_to_ms(1, 16), to=time_to_ms(1, 835), nextsequence="seq7" }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 145), nextsequence=nil } + }, + + seq6 = { + start_time = time_laserdisc_frame(3349), + timeout = { when=time_to_ms(1, 671), nextsequence="seq7" } + }, + + seq7 = { + start_time = time_laserdisc_frame(3397), + kills_player = true, + timeout = { when=time_to_ms(0, 874), nextsequence=nil } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(0, 721), nextsequence="seq6" }, + actions = { + { input="up", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq5", points=1939 }, + { input="upright", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq5", points=1939 }, + { input="right", from=time_to_ms(0, 0), to=time_to_ms(0, 721), nextsequence="seq5", points=1939 }, + } + }, + }, + + the_dragons_lair = { + game_over = { + start_time = time_laserdisc_frame(31503), + timeout = { when=time_to_ms(3, 503), interrupt=game_over_complete } + }, + + start_dead = { + start_time = time_laserdisc_frame(28882), + timeout = { when=time_to_ms(2, 334), nextsequence="seq2", points=49 } + }, + + start_alive = { + start_time = time_laserdisc_noseek(), + timeout = { when=0, nextsequence="enter_room", points = 49 } + }, + + enter_room = { + start_time = time_laserdisc_frame(28938), + timeout = { when=time_to_ms(4, 882), nextsequence="seq19" }, + actions = { + { input="left", from=time_to_ms(3, 932), to=time_to_ms(4, 850), nextsequence="seq3", points=1326 }, + } + }, + + seq2 = { + start_time = time_laserdisc_frame(28938), + timeout = { when=time_to_ms(4, 882), nextsequence="seq19" }, + actions = { + { input="left", from=time_to_ms(3, 932), to=time_to_ms(4, 850), nextsequence="seq3", points=1326 }, + } + }, + + seq3 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(11, 207), nextsequence="seq19" }, + actions = { + { input="left", from=time_to_ms(10, 584), to=time_to_ms(11, 141), nextsequence="seq4", points=1939 }, + { input="up", from=time_to_ms(10, 584), to=time_to_ms(11, 141), nextsequence="seq19" }, + { input="right", from=time_to_ms(10, 584), to=time_to_ms(11, 141), nextsequence="seq19" }, + { input="action", from=time_to_ms(10, 584), to=time_to_ms(11, 141), nextsequence="seq19" }, + } + }, + + seq4 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(8, 618), nextsequence="seq19" }, + actions = { + { input="left", from=time_to_ms(6, 980), to=time_to_ms(8, 585), nextsequence="seq5", points=1326 }, + } + }, + + seq5 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(22, 872), nextsequence="seq14" }, + actions = { + { input="downleft", from=time_to_ms(22, 20), to=time_to_ms(22, 807), nextsequence="seq6", points=2191 }, + { input="left", from=time_to_ms(22, 20), to=time_to_ms(22, 807), nextsequence="seq6", points=2191 }, + { input="down", from=time_to_ms(22, 20), to=time_to_ms(22, 807), nextsequence="seq6", points=2191 }, + { input="action", from=time_to_ms(22, 20), to=time_to_ms(22, 807), nextsequence="seq14" }, + } + }, + + seq6 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(7, 406), nextsequence="seq17" }, + actions = { + { input="up", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq16" }, + { input="down", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq7", points=2191 }, + { input="right", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq17" }, + { input="left", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq7", points=2191 }, + { input="downleft", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq7", points=2191 }, + { input="action", from=time_to_ms(6, 554), to=time_to_ms(7, 373), nextsequence="seq17" }, + } + }, + + seq7 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(5, 341), nextsequence="seq19" }, + actions = { + { input="down", from=time_to_ms(4, 653), to=time_to_ms(5, 308), nextsequence="seq19" }, + { input="right", from=time_to_ms(4, 653), to=time_to_ms(5, 308), nextsequence="seq8", points=3255 }, + { input="left", from=time_to_ms(4, 653), to=time_to_ms(5, 308), nextsequence="seq19" }, + } + }, + + seq8 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 670), nextsequence="seq19" }, + actions = { + { input="right", from=time_to_ms(2, 654), to=time_to_ms(3, 670), nextsequence="seq9", points=2191 }, + { input="up", from=time_to_ms(2, 654), to=time_to_ms(3, 670), nextsequence="seq9", points=2191 }, + { input="upright", from=time_to_ms(2, 654), to=time_to_ms(3, 670), nextsequence="seq9", points=2191 }, + } + }, + + seq9 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(1, 475), nextsequence="seq15" }, + actions = { + { input="action", from=time_to_ms(0, 393), to=time_to_ms(1, 475), nextsequence="seq10", points=3551 }, + { input="right", from=time_to_ms(0, 393), to=time_to_ms(1, 475), nextsequence="seq10", points=3551 }, + } + }, + + seq10 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 768), nextsequence="seq16" }, + actions = { + { input="action", from=time_to_ms(2, 687), to=time_to_ms(3, 768), nextsequence="seq11", points=4026 }, + { input="up", from=time_to_ms(2, 687), to=time_to_ms(3, 768), nextsequence="seq16" }, + { input="down", from=time_to_ms(2, 687), to=time_to_ms(3, 768), nextsequence="seq16" }, + { input="right", from=time_to_ms(2, 687), to=time_to_ms(3, 768), nextsequence="seq16" }, + { input="left", from=time_to_ms(2, 687), to=time_to_ms(3, 768), nextsequence="seq16" }, + } + }, + + seq11 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(3, 899), nextsequence="seq18" }, + actions = { + { input="left", from=time_to_ms(2, 425), to=time_to_ms(3, 899), nextsequence="seq12", points=4750 }, + { input="up", from=time_to_ms(2, 425), to=time_to_ms(3, 899), nextsequence="seq12", points=4750 }, + { input="upleft", from=time_to_ms(2, 425), to=time_to_ms(3, 899), nextsequence="seq12", points=4750 }, + { input="right", from=time_to_ms(2, 425), to=time_to_ms(3, 899), nextsequence="seq18" }, + } + }, + + seq12 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(2, 228), nextsequence="seq16" }, + actions = { + { input="action", from=time_to_ms(1, 114), to=time_to_ms(2, 228), nextsequence="seq13", points=5000 }, + } + }, + + seq13 = { + start_time = time_laserdisc_noseek(), + timeout = { when=time_to_ms(18, 501), nextsequence="endgame" } + }, + + endgame = { -- show dirk and daphne in a heart for ten seconds before ending the game. + start_time = time_laserdisc_frame(31178), + is_single_frame = true, + timeout = { when=time_to_ms(10, 0), nextsequence=nil }, + }, + + seq14 = { + start_time = time_laserdisc_frame(31238), + kills_player = true, + timeout = { when=time_to_ms(2, 501), nextsequence=nil } + }, + + seq15 = { + start_time = time_laserdisc_frame(31298), + kills_player = true, + timeout = { when=time_to_ms(2, 1), nextsequence=nil } + }, + + seq16 = { + start_time = time_laserdisc_frame(31354), + kills_player = true, + timeout = { when=time_to_ms(1, 583), nextsequence=nil } + }, + + seq17 = { + start_time = time_laserdisc_frame(31394), + kills_player = true, + timeout = { when=time_to_ms(2, 543), nextsequence=nil } + }, + + seq18 = { + start_time = time_laserdisc_frame(31454), + kills_player = true, + timeout = { when=time_to_ms(2, 42), nextsequence=nil } + }, + + seq19 = { + start_time = time_laserdisc_noseek(), + kills_player = true, + timeout = { when=time_to_ms(1, 638), nextsequence=nil } + }, + } +} + + +-- http://www.dragons-lair-project.com/games/related/sequence.asp +scene_manager = { + -- there are thirteen rows of three scenes each. + rows = { + { 'flaming_ropes', 'flaming_ropes_reversed', 'bower' }, + { 'flying_horse', 'flying_horse_reversed', 'alice_room' }, + { 'crypt_creeps', 'crypt_creeps_reversed', 'underground_river' }, + { 'falling_platform_short', 'falling_platform_short', 'vestibule' }, + { 'rolling_balls', 'electric_cage_and_geyser', 'black_knight' }, + { 'grim_reaper', 'grim_reaper_reversed', 'lizard_king' }, + { 'smithee', 'smithee_reversed', 'wind_room' }, + { 'tentacle_room', 'snake_room', 'bubbling_cauldron' }, + { 'flattening_staircase', 'giddy_goons', 'fire_room' }, + { 'yellow_brick_road', 'yellow_brick_road_reversed', 'catwalk_bats' }, + { 'robot_knight', 'robot_knight_reversed', 'giant_bat' }, + { 'throne_room', 'tilting_room', 'mudmen' }, + { 'falling_platform_long', 'falling_platform_long_reversed', 'the_dragons_lair' } + } +} + +-- end of lair.lua ... + diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/hints.png b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/hints.png new file mode 100644 index 0000000..bacf879 Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/hints.png differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/reject.wav b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/reject.wav new file mode 100644 index 0000000..234623c Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/games/lair/reject.wav differ diff --git a/system/extra/DirkSimple/bios/DirkSimple/data/icon.png b/system/extra/DirkSimple/bios/DirkSimple/data/icon.png new file mode 100644 index 0000000..ff453ee Binary files /dev/null and b/system/extra/DirkSimple/bios/DirkSimple/data/icon.png differ diff --git a/system/extra/DirkSimple/emulator/retroarch/info/dirksimple_libretro.info b/system/extra/DirkSimple/emulator/retroarch/info/dirksimple_libretro.info new file mode 100644 index 0000000..58b0158 --- /dev/null +++ b/system/extra/DirkSimple/emulator/retroarch/info/dirksimple_libretro.info @@ -0,0 +1,26 @@ +# Software Information +display_name = "Laserdisc arcade game (DirkSimple)" +authors = "Ryan C. Gordon" +supported_extensions = "ogv|dirksimple" +corename = "DirkSimple" +categories = "Emulator" +license = "zlib" +permissions = "" +display_version = "0.3" + +# Hardware Information +# even within Dragon's Lair 1, the European version had a different publisher with a totally different cabinet and laserdisc player. +manufacturer = "various" +systemname = "Laserdisc arcade game" +systemid = "laserdisc" + +# Libretro Features +supports_no_game = "false" +savestate = "true" +savestate_features = "serialized" +cheats = "false" +hw_render = "false" +notes = "DirkSimple plays laserdisc arcade games, like Dragon's Lair. The games are not emulated ROMs, but reimplemented in Lua, and using an Ogg Theora video of the laserdisc's contents." + +description = "A player of laserdisc arcade games." +