diff --git a/.gitignore b/.gitignore index f29f27489..89316aba9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ cmake-build-debug/ *.log *.user temp/ +*# diff --git a/assets/Manual.lyx b/assets/Manual.lyx new file mode 100644 index 000000000..7c2800f4a --- /dev/null +++ b/assets/Manual.lyx @@ -0,0 +1,2227 @@ +#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 +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.x 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 Standard +Don't touch the Singe/ folder! +\end_layout + +\begin_layout Part +Usage +\end_layout + +\begin_layout Section +Installing Games +\end_layout + +\begin_layout Section +Customizing the Controls +\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 +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 +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