singe/assets/Manual.lyx
2024-03-18 20:40:43 -05:00

2467 lines
42 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 scrbook
\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.
Youre 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 <InstallDir>/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! Files in this folder belong to Singe and
may be updated or deleted at any time.
\end_layout
\begin_layout Part
Usage
\end_layout
\begin_layout Section
Installing Games
\end_layout
\begin_layout Standard
Games designed for Singe 2.xx 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 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 reads configuration settings
in the following order:
\end_layout
\begin_layout Enumerate
The defaults from inside Singe.
\end_layout
\begin_layout Enumerate
controls.cfg from the Singe directory.
\end_layout
\begin_layout Enumerate
controls.cfg from the root of the data directory.
\end_layout
\begin_layout Enumerate
controls.cfg from the game's data directory.
\end_layout
\begin_layout Enumerate
controls.cfg from the game's main script directory.
\end_layout
\begin_layout Standard
You do not have to specify every option in a custom controls.cfg file.
Feel free to just provide the entries you want changed.
\end_layout
\begin_layout Standard
After installing Singe, you can find a sample input configuration file at
<InstallDir> /Singe/controls.cfg.example.
To see the available configuration options available to be used in this
file, read through <InstallDir> /Singe/Framework.singe.
\end_layout
\begin_layout Section
Command Line Options
\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.xx?
\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.xx 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.xx and some Singe
2.xx support.
Finally, Singe 2.xx 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.xx or you can try Hypseus.
Obviously we'd like you to use Singe 2.xx.
:-)
\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.xx games on Singe 2.xx?
\end_layout
\begin_layout Quotation
Yes! Probably.
But you likely won't want to.
Almost everything (that I know of) from Singe 1.xx has been converted and
enhanced for Singe 2.xx.
\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 on Windows?
\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 Itemize
Why does my audio stutter on the Raspberry Pi?
\end_layout
\begin_layout Quotation
The Raspberry Pi OS now uses Pipewire as the default audio backend.
Switching to PulseAudio seems to fix the issue.
\end_layout
\begin_layout Enumerate
Run
\begin_inset Quotes eld
\end_inset
sudo raspi-config
\begin_inset Quotes erd
\end_inset
from a terminal window.
\end_layout
\begin_layout Enumerate
Select
\begin_inset Quotes eld
\end_inset
Advanced Options
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Enumerate
Select
\begin_inset Quotes eld
\end_inset
Audio Config
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Enumerate
Select
\begin_inset Quotes eld
\end_inset
PulseAudio
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Enumerate
Press TAB, select
\begin_inset Quotes eld
\end_inset
Ok
\begin_inset Quotes erd
\end_inset
, and let it reboot.
\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
Game Directory Layout
\end_layout
\begin_layout Section
Packaging Your Game
\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={\tiny},tabsize=2"
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={\tiny},tabsize=2"
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
if SINGE_OK_TO_DRAW then
\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
\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 Subsection
Hybrid
\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={\tiny},tabsize=2"
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 Standard
In addition to the standard Lua libraries and the Singe API, the following
libraries are also available for use in Singe programs without the need
to install any additional software:
\end_layout
\begin_layout Description
Copas - Asynchronous networking
\end_layout
\begin_layout Description
LuaFileSystem - Expanded filesystem support
\end_layout
\begin_layout Description
LuaJSON - JavaScript Object Notation encoding and decoding
\end_layout
\begin_layout Description
LuaSec - TLS/SSL communication
\end_layout
\begin_layout Description
LuaSocket - TCP and UDP
\end_layout
\begin_layout Description
LuaRS232 - RS232 serial port access
\end_layout
\begin_layout Standard
Their usage is beyond the scope of this document.
\end_layout
\begin_layout Section
Video, Audio, and Container Formats
\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 LyX-Code
v = controllerGetAxis(c, a)
\end_layout
\begin_layout Standard
Returns the value of the specified axis (a) on controller (c).
Returned values are from -32768 to 32767.
\end_layout
\begin_layout Subsubsection
controllerGetButton
\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