#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass scrartcl \use_default_options true \begin_modules theorems-ams eqs-within-sections figs-within-sections \end_modules \maintain_unincluded_children false \language english \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style english \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Title Singe \end_layout \begin_layout Subtitle the Somewhat Interactive Nostalgic Game Engine \end_layout \begin_layout Author Kangaroo Punch Studios \end_layout \begin_layout Publishers https://SingeEngine.com \end_layout \begin_layout Date Copyright 2006-2024 © Scott Duensing \end_layout \begin_layout Standard \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \end_layout \begin_layout Part About Singe \end_layout \begin_layout Standard Singe, the Somewhat Interactive Nostalgic Game Engine, (named after the dragon in Dragon's Lair) is a Lua-based scripting system that allows for rapid prototyping of new laserdisc games, or the creation of entirely new games! The language is easy to learn, very powerful, and fast. All the features needed to develop your own game are made available through a simple application programming interface (API). \end_layout \begin_layout Standard SINGE provides numerous features to the game developer. Some of the more interesting ones are: \end_layout \begin_layout Itemize Object-Oriented Programming Language \end_layout \begin_layout Itemize Animated Sprites \end_layout \begin_layout Itemize TrueType Font Support \end_layout \begin_layout Itemize 32-bit Color Space with Transparency \end_layout \begin_layout Itemize Multi-Channel, Overlapping, Stereo Sound \end_layout \begin_layout Itemize Analog and Digital Input Device Support \end_layout \begin_layout Itemize Wide Support for Video and Audio Formats \end_layout \begin_layout Standard For players, Singe allows many unemulated and new games to be enjoyed using any desired front end or via the included menu system. \end_layout \begin_layout Standard Since the original release of Singe back in 2006, several revisions have been released, both officially and unofficially. In 2020, Singe 2.00 was released. This was a total rewrite from the ground up adding numerous features while staying compatible with existing 1.xx games. As of the writing of this manual, the latest release is 2.10. \end_layout \begin_layout Part Installation and Upgrading \end_layout \begin_layout Section Installing Singe \end_layout \begin_layout Standard To install Singe, simply download the appropriate binary for your system. Place it in a new folder by itself and run it. On the first run, Singe will create all the necessary directories and support files needed. You’re now ready to install some games! \end_layout \begin_layout Section Upgrading Singe \end_layout \begin_layout Standard To upgrade Singe to a newer version, place the new binary in the installation folder and rename (or delete) the existing /Singe folder. As with the initial installation, run the new binary with no command line arguments to generate the new support files. DO NOT run a new Singe binary with an out-of-date set of support files! \end_layout \begin_layout Section Things to Know \end_layout \begin_layout Standard Don't touch the Singe/ folder! \end_layout \begin_layout Part Usage \end_layout \begin_layout Section Installing Games \end_layout \begin_layout Standard Games designed for Singe 2.x and later simply need to be unpacked and copied into the same folder where you placed the Singe binary. The included menu system will automatically detect them and add them to the menu. \end_layout \begin_layout Section Customizing the Controls \end_layout \begin_layout Standard By default, Singe maps controllers as if they were Xbox 360 gamepads. If your controller is not recognized or you wish to change the default mappings as they appear to Singe, you can use the free SDL2 Gamepad Tool from http://generalarcade.com/gamepadtool/. \end_layout \begin_layout Standard In addition to configuring your controller, you can remap all the input options for Singe as a whole or for any individual game by using controls.cfg files. When determining how inputs are mapped, Singe begins with the default settings and then applies changes specified in controls.cfg files in the following order: \end_layout \begin_layout Enumerate 1. The main data directory \end_layout \begin_layout Enumerate 2. The per-game data directory \end_layout \begin_layout Enumerate 3. The game script directory \end_layout \begin_layout Standard After installing Singe, you can find a sample input configuration file at /Singe/controls.cfg.example. To see the available configuration options available to be used in this file, read through /Singe/Framework.singe. \end_layout \begin_layout Part Frequently Asked Questions \end_layout \begin_layout Itemize Why is it named Singe? \end_layout \begin_layout Quotation Singe is the name of the dragon in Dragon's Lair. As Singe (the program) began as an add-on to Daphne (the princess in Dragon's Lair) I kept with the Dragon's Lair theme. \end_layout \begin_layout Itemize What is the difference between Daphne, Singe, Hypseus, and Singe 2.x? \end_layout \begin_layout Quotation Daphne is an actual laserdisc game emulator that can run a handful of classic laser games. Daphne/Singe or Singe 1.x is the original version of Singe that was an add-on for the Daphne emulator. Originally it was shipped as a game DLL for Daphne and then later combined into a single binary with the Daphne emulation features removed. Hypseus-Singe is an enhanced fork of Daphne with Singe 1.x and some Singe 2.x support. Finally, Singe 2.x is an all-new, built-from-scratch, upgrade of the original Singe. In short, if you want accuracy, use Daphne or Hypseus if they support emulating the desired game. If it's a Singe game, use Singe 2.x or you can try Hypseus. Obviously we'd like you to use Singe 2.x. :-) \end_layout \begin_layout Itemize Why should we not call it an "emulator"? \end_layout \begin_layout Quotation Emulators use the real software or ROMs from the original game and pretend to be the machine they were originally intended to run on. From the game's perspective, it's business as usual. Singe, on the other hand, requires that every game be re-implemented (aka "ported") to run on Singe. While the end result may be very similar, how it works is entirely different. \end_layout \begin_layout Itemize Can I run Singe 1.x games on Singe 2.x? \end_layout \begin_layout Quotation Yes! Probably. But you likely won't want to. Almost everything (that I know of) from Singe 1.x has been converted and enhanced for Singe 2.x. \end_layout \begin_layout Itemize Why does the game I just installed not show in the menu? \end_layout \begin_layout Quotation Whoever packaged the game failed to include a proper games.dat file. Yell at them! \end_layout \begin_layout Itemize Why is HD video slow? \end_layout \begin_layout Quotation Due to the way Singe accesses video files to provide frame seeking, it is unable to offload video decoding to the video card. High definition video requires a lot of CPU! \end_layout \begin_layout Itemize Why does my audio stutter? \end_layout \begin_layout Quotation Users have discovered that most Singe audio and stuttering problems are related to their installed audio driver - especially Realtek based devices. Try updating your sound drivers or switching to the generic Windows HD Audio driver. Disable surround sound - use stereo, not 5.1 or 7.1. If your drivers do not allow you to use stereo, you can use Virtual Audio Cable to fix this. \end_layout \begin_layout Enumerate Install VB-CABLE. https://vb-audio.com/Cable/ \end_layout \begin_layout Enumerate Go to Windows sound settings (right-click sound on the taskbar then Sounds and then Playback). \end_layout \begin_layout Enumerate Right-click the Cable Input device and choose "Set as default device". (You will lose your current sound output. Don't panic.) \end_layout \begin_layout Enumerate Go to the Recording tab. \end_layout \begin_layout Enumerate Right-click Cable Output, then Properties, then Listen, and finally Enable Listen to This Device and in the drop-down list choose your actual listening device. \end_layout \begin_layout Enumerate You should have sound again. Load up Singe, and your audio will be working and lag free! \end_layout \begin_layout Part History \end_layout \begin_layout Part Game Development \end_layout \begin_layout Section Lua \end_layout \begin_layout Standard Singe uses the Lua programming language (http://www.lua.org) for scripting game logic. Lua is fast, lightweight, object-oriented, easy to use, and actually used in the games industry. A tutorial in Lua is beyond the scope of this document. You can find video tutorials for Lua on our YouTube channel and additional documentation by searching the web. \end_layout \begin_layout Section Basic Rules \end_layout \begin_layout Itemize Singe is cross-platform, therefore, things you don't normally need to worry about on Windows are important. Filenames are case sensitive. "MyScript.singe" and "myscript.singe" are not the same thing! Also, you should use UNIX path separators - that is "/" instead of " \backslash ". Not only will this make your code look better (since you don't have to duplicate the forward slash to escape it) but it works everywhere Singe is supported. \end_layout \begin_layout Itemize Pick a distinctive name for your game folder. Do not use spaces. \end_layout \begin_layout Itemize Use the included Singe Framework. Do not make a copy of this framework in your game scripts! By including the provided framework you help with future compatibility as Singe is updated. Begin (or end) your game script with: \end_layout \begin_layout LyX-Code dofile("Singe/Framework.singe") \end_layout \begin_layout Itemize Stay out of the "Singe" folder. This is managed by Singe and anything added or changed here is subject to future deletion. \end_layout \begin_layout Itemize Include a games.dat! This is extremely important for new users! While other front ends and Singe-based menu systems exist, it's vital that you include data for the built-in menu system. Almost all support issues are due to this one simple little file! \end_layout \begin_layout Itemize Do not distribute non-essential files. Never ship Singe binaries or Singe provided scripts with your game! Do not ship index files generated from the videos. \end_layout \begin_layout Section Event Driven... Or Not? \end_layout \begin_layout Standard Traditionally, Singe used an event-driven programming model. That is, Singe handles everything and only calls your code when it needs to tell you something or update the screen. This is very efficient and is how most Lua-based game engines handle things. However, it can be very verbose. As of Singe 2.10 there is a new \begin_inset Quotes eld \end_inset threaded \begin_inset Quotes erd \end_inset model that allows you to write procedural code. \end_layout \begin_layout Subsection Event Driven \end_layout \begin_layout Standard With the event-driven programming model, Singe controls the main "program loop" and is in charge of the order of program execution. Singe automatically handles all the details of decoding and presenting video and audio. It manages controllers, mice, and keyboard input. When Singe needs something game-specific, it calls part of your script. The most basic Singe script that demonstrates all the existing "callbacks" used by Singe looks like this: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\scriptsize},tabsize=4" inline false status open \begin_layout Plain Layout -- Singe Game Skeleton. \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout -- Load the Singe Framework. \end_layout \begin_layout Plain Layout dofile("Singe/Framework.singe") \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout -- Declare any global variables you need here. \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onControllerMoved(axis, value, which) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout Reports which controller axis was moved as well as it's current value. \end_layout \begin_layout Plain Layout (Range: -32768 to 32767) This is used for analog devices. Digial input \end_layout \begin_layout Plain Layout is handled by onInput and onKey. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onInputPressed(what) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout When in keyboard MODE_NORMAL, input events are reported here when the \end_layout \begin_layout Plain Layout key or button is first depressed. For a full list of keys/buttons/controllers, \end_layout \begin_layout Plain Layout see Singe/Framework.singe. \end_layout \begin_layout Plain Layout For MODE_FULL, this event will be called with the keysym of the key pressed. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onInputReleased(what) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout When in keyboard MODE_NORMAL, input events are reported here when the \end_layout \begin_layout Plain Layout key or button is released. For a full list of keys/buttons/controllers, \end_layout \begin_layout Plain Layout see Singe/Framework.singe. \end_layout \begin_layout Plain Layout For MODE_FULL, this event will be called with the keysym of the key released. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onKeyPressed(key, scancode) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout When in keyboard MODE_FULL, input events are reported here when the key is \end_layout \begin_layout Plain Layout pressed. Both the keysym and scancode are returned. For a list of available \end_layout \begin_layout Plain Layout scancodes, see Singe/Framework.singe. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onKeyReleased(key, scancode) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout When in keyboard MODE_FULL, input events are reported here when the key is \end_layout \begin_layout Plain Layout released. Both the keysym and scancode are returned. For a list of available \end_layout \begin_layout Plain Layout scancodes, see Singe/Framework.singe. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onMouseMoved(x, y, xr, yr, which) \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout Called when the mouse is moved. \end_layout \begin_layout Plain Layout When in SINGLE_MOUSE mode, absolute X & Y values as well as the \end_layout \begin_layout Plain Layout relative change in position is returned. For MANY_MOUSE mode, only \end_layout \begin_layout Plain Layout the relative change is available as well as which mouse was moved. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onOverlayUpdate() \end_layout \begin_layout Plain Layout --[[ \end_layout \begin_layout Plain Layout This is the only place you can safely perform drawing operations! \end_layout \begin_layout Plain Layout If you wish to display a targeting cursor, you will need to save the \end_layout \begin_layout Plain Layout mouse position from onMouseMoved in global variables and then use those \end_layout \begin_layout Plain Layout here to render the cursor. \end_layout \begin_layout Plain Layout --]] \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout -- Tell Singe if we changed the display or not. \end_layout \begin_layout Plain Layout return(OVERLAY_UPDATED) -- Or OVERLAY_NOT_UPDATED if no drawing was done. \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onShutdown() \end_layout \begin_layout Plain Layout -- Called when the user exits your game. Free loaded resources here. \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout function onSoundCompleted(id) \end_layout \begin_layout Plain Layout -- The sound "id" just finished playing. \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout -- Note: There is no "onStartup" event. \end_layout \begin_layout Plain Layout -- Any startup code you need can be placed here. \end_layout \begin_layout Plain Layout \end_layout \end_inset \end_layout \begin_layout Subsection Threaded \end_layout \begin_layout Standard As of Singe 2.10, you can now use the classic procedural programming model. In order for this to work, you declare a \begin_inset Quotes eld \end_inset singeMain() \begin_inset Quotes erd \end_inset function and include the Singe framework at the end of your program rather than at the beginning. Lua is not truly multithreaded so this model relies on the game developer - you - to cooperatively multitask by calling \begin_inset Quotes eld \end_inset singeYield() \begin_inset Quotes erd \end_inset anywhere your code consumes any substantial amount of time. As with the event-driven model, Singe still manages all input, video decoding, etc. A sample threaded program looks like this: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\scriptsize},tabsize=4" inline false status open \begin_layout Plain Layout function singeMain() \end_layout \begin_layout Plain Layout x = 10 \end_layout \begin_layout Plain Layout y = 10 \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout while(true) do \end_layout \begin_layout Plain Layout colorBackground(0, 0, 0, 255) \end_layout \begin_layout Plain Layout overlayClear() \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout colorForeground(255, 255, 255, 255) \end_layout \begin_layout Plain Layout overlayPrint(x, y, "+") \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout if keyboardGetLastUp() == SCANCODE.LEFT.value then x = x - 1 end \end_layout \begin_layout Plain Layout if keyboardGetLastUp() == SCANCODE.RIGHT.value then x = x + 1 end \end_layout \begin_layout Plain Layout if keyboardGetLastUp() == SCANCODE.UP.value then y = y - 1 end \end_layout \begin_layout Plain Layout if keyboardGetLastUp() == SCANCODE.DOWN.value then y = y + 1 end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout singeYield() \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout end \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout dofile("Singe/Framework.singe") \end_layout \end_inset \end_layout \begin_layout Section games.dat \end_layout \begin_layout Standard The games.dat file allows Singe to automatically locate new games when they are installed by the end user. This file is extremely important and must be included with every Singe game! Place games.dat in the top-most directory of your game. An example (containing multiple games) is below: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\scriptsize},tabsize=4" inline false status open \begin_layout Plain Layout GAMES = { \end_layout \begin_layout Plain Layout { \end_layout \begin_layout Plain Layout TITLE = ".38 Ambush Alley", \end_layout \begin_layout Plain Layout SCRIPT = "ActionMax/38AmbushAlley.singe", \end_layout \begin_layout Plain Layout VIDEO = "ActionMax/frame_38AmbushAlley.txt", \end_layout \begin_layout Plain Layout DATA = "ActionMax", \end_layout \begin_layout Plain Layout STRETCH = false, \end_layout \begin_layout Plain Layout NO_MOUSE = false, \end_layout \begin_layout Plain Layout RESOLUTION_X = 720, \end_layout \begin_layout Plain Layout RESOLUTION_Y = 480, \end_layout \begin_layout Plain Layout SINDEN_GUN = "", \end_layout \begin_layout Plain Layout CABINET = "ActionMax/cabinet_38AmbushAlley.png", \end_layout \begin_layout Plain Layout MARQUEE = "ActionMax/marquee_ActionMax.png", \end_layout \begin_layout Plain Layout ATTRACT = "ActionMax/video_38AmbushAlley.mkv", \end_layout \begin_layout Plain Layout ATTRACT_START = 3000, \end_layout \begin_layout Plain Layout ATTRACT_END = 3500, \end_layout \begin_layout Plain Layout YEAR = 1987, \end_layout \begin_layout Plain Layout PLATFORM = "ActionMax", \end_layout \begin_layout Plain Layout DEVELOPER = "Sourcing International, Ltd.", \end_layout \begin_layout Plain Layout PUBLISHER = "Worlds of Wonder, Inc.", \end_layout \begin_layout Plain Layout GENRE = "Shooter", \end_layout \begin_layout Plain Layout DESCRIPTION = "Get your target practice in with real police officers then hit the streets.", \end_layout \begin_layout Plain Layout CREATOR = "Scott Duensing", \end_layout \begin_layout Plain Layout SOURCE = "http://kangaroopunch.com" \end_layout \begin_layout Plain Layout }, \end_layout \begin_layout Plain Layout { \end_layout \begin_layout Plain Layout TITLE = "Blue Thunder", \end_layout \begin_layout Plain Layout SCRIPT = "ActionMax/BlueThunder.singe", \end_layout \begin_layout Plain Layout VIDEO = "ActionMax/frame_BlueThunder.txt", \end_layout \begin_layout Plain Layout DATA = "ActionMax", \end_layout \begin_layout Plain Layout STRETCH = false, \end_layout \begin_layout Plain Layout NO_MOUSE = false, \end_layout \begin_layout Plain Layout RESOLUTION_X = 720, \end_layout \begin_layout Plain Layout RESOLUTION_Y = 480, \end_layout \begin_layout Plain Layout SINDEN_GUN = "", \end_layout \begin_layout Plain Layout CABINET = "ActionMax/cabinet_BlueThunder.png", \end_layout \begin_layout Plain Layout MARQUEE = "ActionMax/marquee_ActionMax.png", \end_layout \begin_layout Plain Layout ATTRACT = "ActionMax/video_BlueThunder.mkv", \end_layout \begin_layout Plain Layout ATTRACT_START = 3000, \end_layout \begin_layout Plain Layout ATTRACT_END = 3500, \end_layout \begin_layout Plain Layout YEAR = 1987, \end_layout \begin_layout Plain Layout PLATFORM = "ActionMax", \end_layout \begin_layout Plain Layout DEVELOPER = "Sourcing International, Ltd.", \end_layout \begin_layout Plain Layout PUBLISHER = "Worlds of Wonder, Inc.", \end_layout \begin_layout Plain Layout GENRE = "Shooter", \end_layout \begin_layout Plain Layout DESCRIPTION = "Get in your chopper and take out the bad guys in this action-packed game.", \end_layout \begin_layout Plain Layout CREATOR = "Scott Duensing", \end_layout \begin_layout Plain Layout SOURCE = "http://kangaroopunch.com" \end_layout \begin_layout Plain Layout }, \end_layout \begin_layout Plain Layout { \end_layout \begin_layout Plain Layout TITLE = "Hydrosub: 2021", \end_layout \begin_layout Plain Layout SCRIPT = "ActionMax/Hydrosub2021.singe", \end_layout \begin_layout Plain Layout VIDEO = "ActionMax/frame_Hydrosub2021.txt", \end_layout \begin_layout Plain Layout DATA = "ActionMax", \end_layout \begin_layout Plain Layout STRETCH = false, \end_layout \begin_layout Plain Layout NO_MOUSE = false, \end_layout \begin_layout Plain Layout RESOLUTION_X = 720, \end_layout \begin_layout Plain Layout RESOLUTION_Y = 480, \end_layout \begin_layout Plain Layout SINDEN_GUN = "", \end_layout \begin_layout Plain Layout CABINET = "ActionMax/cabinet_Hydrosub2021.png", \end_layout \begin_layout Plain Layout MARQUEE = "ActionMax/marquee_ActionMax.png", \end_layout \begin_layout Plain Layout ATTRACT = "ActionMax/video_Hydrosub2021.mkv", \end_layout \begin_layout Plain Layout ATTRACT_START = 3000, \end_layout \begin_layout Plain Layout ATTRACT_END = 3500, \end_layout \begin_layout Plain Layout YEAR = 1987, \end_layout \begin_layout Plain Layout PLATFORM = "ActionMax", \end_layout \begin_layout Plain Layout DEVELOPER = "Sourcing International, Ltd.", \end_layout \begin_layout Plain Layout PUBLISHER = "Worlds of Wonder, Inc.", \end_layout \begin_layout Plain Layout GENRE = "Shooter", \end_layout \begin_layout Plain Layout DESCRIPTION = "Shootout beneath the ocean!", \end_layout \begin_layout Plain Layout CREATOR = "Scott Duensing", \end_layout \begin_layout Plain Layout SOURCE = "http://kangaroopunch.com" \end_layout \begin_layout Plain Layout }, \end_layout \begin_layout Plain Layout { \end_layout \begin_layout Plain Layout TITLE = "Rescue of Pops Ghostly, The", \end_layout \begin_layout Plain Layout SCRIPT = "ActionMax/PopsGhostly.singe", \end_layout \begin_layout Plain Layout VIDEO = "ActionMax/frame_PopsGhostly.txt", \end_layout \begin_layout Plain Layout DATA = "ActionMax", \end_layout \begin_layout Plain Layout STRETCH = false, \end_layout \begin_layout Plain Layout NO_MOUSE = false, \end_layout \begin_layout Plain Layout RESOLUTION_X = 720, \end_layout \begin_layout Plain Layout RESOLUTION_Y = 480, \end_layout \begin_layout Plain Layout SINDEN_GUN = "", \end_layout \begin_layout Plain Layout CABINET = "ActionMax/cabinet_PopsGhostly.png", \end_layout \begin_layout Plain Layout MARQUEE = "ActionMax/marquee_ActionMax.png", \end_layout \begin_layout Plain Layout ATTRACT = "ActionMax/video_PopsGhostly.mkv", \end_layout \begin_layout Plain Layout ATTRACT_START = 3000, \end_layout \begin_layout Plain Layout ATTRACT_END = 3500, \end_layout \begin_layout Plain Layout YEAR = 1987, \end_layout \begin_layout Plain Layout PLATFORM = "ActionMax", \end_layout \begin_layout Plain Layout DEVELOPER = "Sourcing International, Ltd.", \end_layout \begin_layout Plain Layout PUBLISHER = "Worlds of Wonder, Inc.", \end_layout \begin_layout Plain Layout GENRE = "Shooter", \end_layout \begin_layout Plain Layout DESCRIPTION = "Help Pops Ghostly and his family get rid of the bad spirits who have taken over the house.", \end_layout \begin_layout Plain Layout CREATOR = "Scott Duensing", \end_layout \begin_layout Plain Layout SOURCE = "http://kangaroopunch.com" \end_layout \begin_layout Plain Layout }, \end_layout \begin_layout Plain Layout { \end_layout \begin_layout Plain Layout TITLE = "Sonic Fury", \end_layout \begin_layout Plain Layout SCRIPT = "ActionMax/SonicFury.singe", \end_layout \begin_layout Plain Layout VIDEO = "ActionMax/frame_SonicFury.txt", \end_layout \begin_layout Plain Layout DATA = "ActionMax", \end_layout \begin_layout Plain Layout STRETCH = false, \end_layout \begin_layout Plain Layout NO_MOUSE = false, \end_layout \begin_layout Plain Layout RESOLUTION_X = 720, \end_layout \begin_layout Plain Layout RESOLUTION_Y = 480, \end_layout \begin_layout Plain Layout SINDEN_GUN = "", \end_layout \begin_layout Plain Layout CABINET = "ActionMax/cabinet_SonicFury.png", \end_layout \begin_layout Plain Layout MARQUEE = "ActionMax/marquee_ActionMax.png", \end_layout \begin_layout Plain Layout ATTRACT = "ActionMax/video_SonicFury.mkv", \end_layout \begin_layout Plain Layout ATTRACT_START = 3000, \end_layout \begin_layout Plain Layout ATTRACT_END = 3500, \end_layout \begin_layout Plain Layout YEAR = 1987, \end_layout \begin_layout Plain Layout PLATFORM = "ActionMax", \end_layout \begin_layout Plain Layout DEVELOPER = "Sourcing International, Ltd.", \end_layout \begin_layout Plain Layout PUBLISHER = "Worlds of Wonder, Inc.", \end_layout \begin_layout Plain Layout GENRE = "Shooter", \end_layout \begin_layout Plain Layout DESCRIPTION = "Shoot it out with the bad guys in your fighter jet!", \end_layout \begin_layout Plain Layout CREATOR = "Scott Duensing", \end_layout \begin_layout Plain Layout SOURCE = "http://kangaroopunch.com" \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \end_inset \end_layout \begin_layout Section Included Libraries \end_layout \begin_layout Section API \end_layout \begin_layout Subsection Color \end_layout \begin_layout Subsubsection colorBackground \end_layout \begin_layout LyX-Code colorBackground(r, g, b) \end_layout \begin_layout LyX-Code colorBackground(r, g, b, o) \end_layout \begin_layout Standard Specifies the background color to use for following drawing operations. Red, green, blue, and opacity values are from 0 to 255. If you omit the opacity value, it will default to 0 (transparent). The three-argument version of this function is to provide compatibility with earlier Singe releases. \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 Example: \end_layout \begin_layout LyX-Code colorBackground(255, 0, 0, 255) – Solid Red \end_layout \begin_layout Subsubsection colorForeground \end_layout \begin_layout LyX-Code colorForeground(r, g, b) \end_layout \begin_layout LyX-Code colorForeground(r, g, b, o) \end_layout \begin_layout Standard Specifies the foreground color to use for following drawing operations. Red, green, blue, and opacity values are from 0 to 255. If you omit the opacity value, it will default to 255 (opaque). The three-argument version of this function is to provide compatibility with earlier Singe releases. \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 Example: \end_layout \begin_layout LyX-Code colorForeground(255, 255, 255, 255) – Solid White \end_layout \begin_layout Subsection Controller \end_layout \begin_layout Subsubsection controllerGetAxis \end_layout \begin_layout Subsection Debug \end_layout \begin_layout Subsubsection debugPrint \end_layout \begin_layout Subsection Disc \end_layout \begin_layout Subsubsection discAudio \end_layout \begin_layout Subsubsection discChangeSpeed \end_layout \begin_layout Subsubsection discGetAudioTrack \end_layout \begin_layout Subsubsection discGetAudioTracks \end_layout \begin_layout Subsubsection discGetFrame \end_layout \begin_layout Subsubsection discGetHeight \end_layout \begin_layout Subsubsection discGetLanguage \end_layout \begin_layout Subsubsection discGetState \end_layout \begin_layout Subsubsection discGetWidth \end_layout \begin_layout Subsubsection discPause \end_layout \begin_layout Subsubsection discPauseAtFrame \end_layout \begin_layout Subsubsection discPlay \end_layout \begin_layout Subsubsection discSearch \end_layout \begin_layout Subsubsection discSearchBlanking \end_layout \begin_layout Subsubsection discSetAudioTrack \end_layout \begin_layout Subsubsection discSetFPS \end_layout \begin_layout Subsubsection discSkipBackward \end_layout \begin_layout Subsubsection discSkipBlanking \end_layout \begin_layout Subsubsection discSkipForward \end_layout \begin_layout Subsubsection discSkipToFrame \end_layout \begin_layout Subsubsection discStepBackward \end_layout \begin_layout Subsubsection discStepForward \end_layout \begin_layout Subsubsection discStop \end_layout \begin_layout Subsection Font \end_layout \begin_layout Subsubsection fontLoad \end_layout \begin_layout Subsubsection fontPrint \end_layout \begin_layout Subsubsection fontQuality \end_layout \begin_layout Subsubsection fontSelect \end_layout \begin_layout Subsubsection fontToSprite \end_layout \begin_layout Subsubsection fontUnload \end_layout \begin_layout Subsection Keyboard \end_layout \begin_layout Subsubsection keyboardGetLastDown \end_layout \begin_layout Subsubsection keyboardGetLastUp \end_layout \begin_layout Subsubsection keyboardGetMode \end_layout \begin_layout Subsubsection keyboardGetModifiers \end_layout \begin_layout Subsubsection keyboardSetMode \end_layout \begin_layout Subsubsection keyboardIsDown \end_layout \begin_layout Subsection Mouse \end_layout \begin_layout Subsubsection mouseEnable \end_layout \begin_layout Subsubsection mouseDisable \end_layout \begin_layout Subsubsection mouseGetPosition \end_layout \begin_layout Subsubsection mouseHowMany \end_layout \begin_layout Subsubsection mouseSetCaptured \end_layout \begin_layout Subsubsection mouseSetMode \end_layout \begin_layout Subsection Overlay \end_layout \begin_layout Subsubsection overlayBox \end_layout \begin_layout Subsubsection overlayCircle \end_layout \begin_layout Subsubsection overlayClear \end_layout \begin_layout Subsubsection overlayEllipse \end_layout \begin_layout Subsubsection overlayGetHeight \end_layout \begin_layout Subsubsection overlayGetWidth \end_layout \begin_layout Subsubsection overlayLine \end_layout \begin_layout Subsubsection overlayPlot \end_layout \begin_layout Subsubsection overlayPrint \end_layout \begin_layout Subsubsection overlaySetResolution \end_layout \begin_layout Subsection Script \end_layout \begin_layout Subsubsection scriptExecute \end_layout \begin_layout Subsubsection scriptPush \end_layout \begin_layout Subsection Singe \end_layout \begin_layout Subsubsection singeDisablePauseKey \end_layout \begin_layout Subsubsection singeEnablePauseKey \end_layout \begin_layout Subsubsection singeGetDataPath \end_layout \begin_layout Subsubsection singeGetHeight \end_layout \begin_layout Subsubsection singeGetPauseFlag \end_layout \begin_layout Subsubsection singeGetScriptPath \end_layout \begin_layout Subsubsection singeGetWidth \end_layout \begin_layout Subsubsection singeScreenshot \end_layout \begin_layout Subsubsection singeSetGameName \end_layout \begin_layout Subsubsection singeSetPauseFlag \end_layout \begin_layout Subsubsection singeQuit \end_layout \begin_layout Subsubsection singeVersion \end_layout \begin_layout Subsubsection singeWantsCrosshairs \end_layout \begin_layout Subsection Sound \end_layout \begin_layout Subsubsection soundFullStop \end_layout \begin_layout Subsubsection soundGetVolume \end_layout \begin_layout Subsubsection soundIsPlaying \end_layout \begin_layout Subsubsection soundLoad \end_layout \begin_layout Subsubsection soundPause \end_layout \begin_layout Subsubsection soundPlay \end_layout \begin_layout Subsubsection soundResume \end_layout \begin_layout Subsubsection soundSetVolume \end_layout \begin_layout Subsubsection soundStop \end_layout \begin_layout Subsubsection soundUnload \end_layout \begin_layout Subsection Sprite \end_layout \begin_layout Subsubsection spriteDraw \end_layout \begin_layout Subsubsection spriteGetFrame \end_layout \begin_layout Subsubsection spriteGetHeight \end_layout \begin_layout Subsubsection spriteGetWidth \end_layout \begin_layout Subsubsection spriteIsPlaying \end_layout \begin_layout Subsubsection spriteLoad \end_layout \begin_layout Subsubsection spriteLoop \end_layout \begin_layout Subsubsection spritePause \end_layout \begin_layout Subsubsection spritePlay \end_layout \begin_layout Subsubsection spriteQuality \end_layout \begin_layout Subsubsection spriteRotate \end_layout \begin_layout Subsubsection spriteRotateAndScale \end_layout \begin_layout Subsubsection spriteScale \end_layout \begin_layout Subsubsection spriteSetFrame \end_layout \begin_layout Subsubsection spriteUnload \end_layout \begin_layout Subsection Video \end_layout \begin_layout Subsubsection videoDraw \end_layout \begin_layout Subsubsection videoGetAudioTrack \end_layout \begin_layout Subsubsection videoGetAudioTracks \end_layout \begin_layout Subsubsection videoGetFrame \end_layout \begin_layout Subsubsection videoGetFrameCount \end_layout \begin_layout Subsubsection videoGetHeight \end_layout \begin_layout Subsubsection videoGetLanguage \end_layout \begin_layout Subsubsection videoGetLanguageDescription \end_layout \begin_layout Subsubsection videoGetVolume \end_layout \begin_layout Subsubsection videoGetWidth \end_layout \begin_layout Subsubsection videoIsPlaying \end_layout \begin_layout Subsubsection videoLoad \end_layout \begin_layout Subsubsection videoPause \end_layout \begin_layout Subsubsection videoPlay \end_layout \begin_layout Subsubsection videoQuality \end_layout \begin_layout Subsubsection videoRotate \end_layout \begin_layout Subsubsection videoRotateAndScale \end_layout \begin_layout Subsubsection videoScale \end_layout \begin_layout Subsubsection videoSeek \end_layout \begin_layout Subsubsection videoSetAudioTrack \end_layout \begin_layout Subsubsection videoSetVolume \end_layout \begin_layout Subsubsection videoUnload \end_layout \begin_layout Subsection VLDP \end_layout \begin_layout Subsubsection vldpGetHeight \end_layout \begin_layout Subsubsection vldpGetPixel \end_layout \begin_layout Subsubsection vldpGetWidth \end_layout \begin_layout Subsubsection vldpSetVerbose \end_layout \end_body \end_document