singe/src/singe.h
2026-09-12 01:22:02 -05:00

168 lines
7.3 KiB
C

/*
*
* Singe 3
* Copyright (C) 2006-2026 Scott Duensing <scott@kangaroopunch.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
*/
#ifndef SINGE_H
#define SINGE_H
#include <SDL3/SDL.h>
#include "common.h"
#include "generated/version.h"
#include "videoPlayer.h"
#define SINDEN_ARG_MAX 8
typedef enum ToolModeE {
TOOL_NONE = 0,
TOOL_PACK,
TOOL_PATCH,
TOOL_UNPACK
} ToolModeE;
// Where the Sinden light gun border sits. Auto puts it at the window's edge when a bezel is
// loaded (the gun's camera sees the whole screen) and around the picture when none is.
typedef enum SindenEdgeE {
SINDEN_EDGE_AUTO = 0,
SINDEN_EDGE_VIDEO,
SINDEN_EDGE_WINDOW
} SindenEdgeE;
// Number of --sindengun arguments selects the border style.
typedef enum SindenModeE {
SINDEN_WHITE = 1,
SINDEN_WHITE_BLACK = 2,
SINDEN_CUSTOM_WHITE = 4,
SINDEN_CUSTOM_WHITE_BLACK = 5,
SINDEN_CUSTOM_WHITE_CUSTOM_BLACK = 8
} SindenModeE;
// Options typed on the command line: a games.dat entry found beside a loose script leaves these alone.
typedef enum GivenE {
GIVEN_VIDEO = 1 << 0, // -v or -D
GIVEN_STRETCH = 1 << 1,
GIVEN_NO_MOUSE = 1 << 2,
GIVEN_RESOLUTION = 1 << 3, // -x or -y
GIVEN_SINDEN = 1 << 4,
GIVEN_AUDIO_TRACK = 1 << 5,
GIVEN_AUDIO_DELAY = 1 << 6,
GIVEN_CANVAS = 1 << 7,
GIVEN_AUDIO_SUFFIX = 1 << 8,
GIVEN_SCALE = 1 << 9,
GIVEN_SHIFT = 1 << 10, // -X or -Y
GIVEN_ROTATE = 1 << 11
} GivenE;
typedef struct ConfigS {
char *videoFile;
char *scriptFile;
char *container; // Game database holding the script, NULL for a loose game
int32_t entry; // Which games.dat entry a database launch runs, from 1
char *toolSource; // Argument of --pack, --unpack, or --patch
ToolModeE toolMode;
uint32_t given; // GivenE bits
char *gameDir; // -G: where the games and the Singe folder live; becomes the working directory
char *bezelFile; // --bezel: the artwork image inside the bezels folder
char *bezelDir; // --bezeldir: the folder holding it, in place of "bezels"
char *dataDir;
char *dataDirBase;
char *keymapFile; // --keymapfile: the controls.cfg to read in place of the four place search
char *audioSuffix; // --altaudio: the disc audio suffix discAudioSuffix takes, applied at startup
char *soundfont; // --soundfont: the .sf2 MIDI files are synthesised with, in place of the search
DeinterlaceE deinterlace; // --deinterlace: what an interlaced picture gets, automatic by default
char *gamepadOrder; // --gamepad_reorder: enumeration positions, one per gamepad slot, as Hypseus writes them
bool resolutionWasCalculated;
bool isFrameFile;
bool stretchVideo;
bool noMouse;
bool noCrosshair;
bool noSound;
bool fullScreen;
bool fullScreenWindow;
bool showCalculated;
bool noConsole;
bool noLogos;
bool programTracing;
bool reload; // --reload: watch the loose script files and rerun the game when one changes; F5 too
bool scriptTracing;
bool legacySpriteArgs;
bool bezelFlip; // --bezelflip: the artwork draws in front of the picture instead of behind it
bool disc; // Play a laserdisc video; otherwise the canvas is the world
bool softwareVideo; // Skip the platform's hardware decoder
bool noGamepad; // --nogamepad: ignore every gamepad, as --nomouse ignores the mice
bool mapJoysticks; // --mapjoysticks: write a gamepad mapping for a device SDL does not recognise
bool joyMouse; // --joymouse: the first gamepad's left stick drives the mouse cursor
bool manyMouse; // --manymouse: the user asks for one mouse device per player, whatever the game asks for
bool absolutesOnly; // --absolutes_only: keep only the mice that report absolute positions, which is what light guns do
bool startSilent; // --startsilent: muted until the first input of any kind
bool monochrome; // --monochrome: the disc picture starts in greyscale
bool linearScale; // --linearscale: the overlay starts filtered linearly, which is the default
bool deterministic; // --deterministic: run on a virtual clock stepped once a frame, so a test repeats
int32_t bestRatioIndex;
int32_t volumeVldp;
int32_t volumeNonVldp;
int32_t scaleFactor; // --scalefactor: overscan compensation, per cent of the logical rectangle
int32_t shiftX; // --shiftx: per cent of half the logical width the picture moves right
int32_t shiftY; // --shifty: per cent of half the logical height the picture moves down
int32_t rotate; // --rotate: clockwise presentation rotation, 0, 90, 180 or 270 degrees
char *gameId; // GAME_ID from games.dat: the master service's stable id for this game
int32_t xResolution;
int32_t yResolution;
int32_t canvasWidth; // World size when there is no disc
int32_t canvasHeight;
int32_t sindenEdge; // --sindenedge: SindenEdgeE, where the border rings are drawn
int32_t sindenArgc;
int32_t sindenArgv[SINDEN_ARG_MAX];
int32_t audioOutputTrack;
int32_t audioDelayMs; // Positive when the audio device is heard later than it reports
int32_t screen; // --screen: which display the window opens on, from 1; 0 is the primary
int32_t idleExitSeconds; // --idleexit: quit after this long with no input; 0 never quits
int32_t haptic; // --haptic: the strongest rumble step a script may ask for; 0 is no rumble
int32_t joyMouseRange; // --js_range: video pixels a frame the cursor moves at full stick deflection
int32_t deterministicStep; // --deterministic=MS: simulated milliseconds a frame, and the seed the generators start from
double triggerThreshold; // --trigger_threshold: per cent of full travel a trigger counts as pressed at; 0 uses the dead zone
double ratioX; // --xratio: the gun coordinate scale a script reads with ratioGetX
double ratioY; // --yratio: the same for ratioGetY
double fValue; // --fvalue: the launcher's one number, read with getFValue
} ConfigT;
// One key of the settings file, and the file that set it, so an error can name both.
typedef struct SettingS {
char *key;
char *value;
char *source;
} SettingT;
ConfigT *confFromDatabase(const ConfigT *conf);
ConfigT *confFromGamesDat(const ConfigT *conf);
void settingsFree(SettingT *settings, int32_t count);
SettingT *settingsLoad(const ConfigT *conf, int32_t *count);
void singe(SDL_Window *window, SDL_Renderer *renderer, SDL_GPUDevice *device, ConfigT *conf);
#endif // SINGE_H