SINGE 2.20 ========== Unreleased API Changes ----------- - The sprite handle is now the FIRST argument of spriteDraw(), spriteLoop(), spriteQuality(), spriteRotate(), spriteRotateAndScale(), spriteScale(), and spriteSetFrame(), matching the video*() functions. Move the last argument of each call to the front. Games that cannot be edited can set SINGE_LEGACY_SPRITE_ARGS = true before loading the framework, or add LEGACY_SPRITE_ARGS = true to their games.dat entry. See "Migrating from Singe 2.10" in the manual. - Singe is no longer laserdisc only. A game declares a disc with DISC = true in games.dat (or --disc / --framefile on the command line); otherwise it runs without one, on a canvas sized by CANVAS_X/CANVAS_Y or --canvas=WxH (default 720x480), the disc functions become harmless, and discGetState() returns the new DISC_EJECTED. Every existing games.dat entry needs DISC = true added; the menu skips an entry with VIDEO but no DISC = true and says why, and the engine refuses one if launched directly. Scripts can test SINGE_DISC. - mouseSetEnabled(bool) and singeSetPauseKeyEnabled(bool) added. The old mouseEnable/mouseDisable and singeEnablePauseKey/singeDisablePauseKey are now aliases defined in Framework.singe. - Handles, counts, and frame numbers are returned as Lua integers. videoIsPlaying() returns a boolean. mouseSetMode() returns nothing. - onControllerMoved() receives the controller index (0 to 3), not SDL's instance ID. onMouseMoved() in MANY_MOUSE mode receives real relative motion in its third and fourth arguments. - Runtime errors inside callbacks now end the game with a traceback, the way argument errors always have. - Held keys no longer auto-repeat in MODE_NORMAL. - The engine parks the disc on frame 1 before the script runs; the framework no longer seeks when it is loaded, so threaded games keep their own startup positioning. - The pause key now pauses the whole game. The engine freezes the script (no callbacks, no singeMain), holds sound completions, releases and later re-presses held inputs, and draws a PAUSED indicator. It acts on the key press, and SWITCH_PAUSE reaches the script only when the key is disabled with singeSetPauseKeyEnabled(false). singeSetPauseFlag() still pauses media without freezing the script. Gamepad and mouse buttons mapped to pause, quit, screenshot, or grab now work in MODE_FULL too; keyboard mappings stay raw there. - Video decoding runs on its own thread per video, so a discSearch() far from a keyframe no longer stalls the game loop; the previous frame stays on screen until the new one is ready. The laserdisc and framefile videos are handed to the GPU as YUV and converted there instead of on the CPU, and each video reports its keyframe spacing when loaded, with a warning when seeks may be slow. - Constants that used to be duplicated in Framework.singe (SWITCH_*, FONT_QUALITY_*, MODE_*, MOUSE_*, OVERLAY_*, RENDER_*, SOUND_ERROR_*) are now defined by the engine. New: DISC_STOPPED/DISC_PLAYING/DISC_PAUSED for discGetState(), SINGE_VERSION_MAJOR/MINOR/STRING, and the SINGE_* input code layout that Framework.singe builds GAMEPAD_N and MOUSE_N from. Fixes ----- - controllerGetButton() never worked; it rejected every framework button code. - The five argument form of spriteDraw() always failed. - spriteSetFrame() on a still image crashed. - Unloading the selected font left later fontPrint() calls using freed memory. - overlayCircle() drew around the origin instead of the requested center. - overlaySetResolution() broke mouse coordinates and vldpGetPixel() because the overlay scale was computed with integer division. - mouseGetPosition() always returned 0,0 and controllerGetAxis() read the wrong controller because the axis cache was indexed two different ways. - Analog stick release events fired with a stale input code. Controllers that were unplugged and replugged shifted their codes. - The -o/--audio option was lost when the configuration was copied. - --option=value forms of numeric options, and options after the script name, were not accepted. - Running "singe game.singe" from the game's own directory wrote its data to the filesystem root. - Framefile playback never advanced past the first segment, and switching segments dropped the selected audio track. - Video timing accumulated main loop latency, drifting behind the audio. Audio is now the master clock: the picture follows the samples the sound device has actually consumed, so the two cannot drift apart and the mixer's buffering latency is accounted for. Silent videos follow the wall clock. The first frame after a seek was shown one update late. - Video without an audio track crashed on the first update. - The video audio stream was shared with the mixer thread without a lock. - onSoundCompleted was called from the audio thread. It is now delivered from the game loop. - Screenshots read the frame buffer through the window surface, which SDL forbids alongside a renderer, and could corrupt memory on shutdown. - .patch archives crashed the installer. Archives without an explicit top level directory entry were rejected. Extraction now refuses paths that escape the installation directory. - The Sinden gun arguments could overflow the configuration structure. - Windows builds now carry the icon and version resource, with the version number encoded correctly. - The build no longer depends on lyx, upx, or xxd; embedded resources, the version header, and the manual are generated by CMake. The manual is embedded again and extracted as Singe/Manual.pdf. SINGE 2.10 ========== Released March 26th, 2024 New Features ------------ - spriteDraw() now has two more forms. In addition to being able to draw regular sprites and stretched sprites it can now draw both using the sprite's center as the anchor instead of the upper left. This is highly useful when dealing with rotated sprites. - Animated sprites! Both animated GIF and WEBP images are supported. - Sprite anti-aliasing, scaling and rotation! Optional separate X & Y scaling. - Video anti-aliasing, scaling and rotation! Optional separate X & Y scaling. - Multiple audio track support for videos. New command line options to select which default audio track you want (-o or --audio). For games with multiple languages, you can specify AUDIO_TRACK in the games.dat as well. - New keyboard methods to make handling input easier, especially multiple keypresses for diagonal movement. - controllerGetButton() added. - SINGE_DEAD_ZONE global variable now available based on the DEAD_ZONE controller configuration option. - SINGE_FRAMEWORK_VERSION variable added. - DIR variable added providing directory to the running script. - All new Lua library handling. Previously Singe "injected" libraries directly into the script context. Now there is a proper Lua module search handler. Scripts can properly require() modules from the following: - Lua Standard Library - Lua Auxiliary Library - LuaFileSystem - LuaSocket - LuaSec - LuaRS232 - timerwheel - binaryheap - Copas - json - New command line option: -p (or --program). This is similar to the existing -t (or --trace) option. Where "trace" displays and logs script execution, "program" displays and logs Singe internals. This should make troubleshooting difficult setups and odd script crashes easier. - Auto-installer for the new GAME, TOOL, and PATCH archive formats to make managing games easier. - ZeroBrane Studio (https://studio.zerobrane.com) integration for live debugging of running Singe scripts! A full IDE for developing games! Fixes ----- - USB controllers now work in games launched from the included menu. - Default controller DEAD_ZONE increased. - Framework.singe was missing keyboard mode constants. MODE_NORMAL and MODE_FULL are now included. - SINGE 2.00 added two new input events but never had them in the framework. SWITCH_BUTTON4 and SWITCH_TILT are now available. - Taking screenshots could sometimes crash Singe. - PNG files no longer generate warnings on the console. - Non-VLDP videos now honor command line volume settings. - Menu system now performs "natural sorting" of game titles instead of brain dead "computer sorting". It should make a lot more sense paging through games now. - Building Singe depended on a lot of undocumented software cobbled together from other projects. This has been vastly improved and should be usable by actual humans now. Humans running Linux anyway. ------------------------------------------------------------------------------ SINGE 2.00 ========== Released October 25th, 2020 New Features ------------ - Complete rewrite! No more dependency on Daphne. - Support for almost every (non-patent encumbered) video and audio format that can be played by FFMPEG. - High definition video. - 32 bit color. - Additional videos can be played on top the laserdisc video. - Scaled sprites. - Graphics overlay resolution no longer dependent on video resolution. - Analog controllers. - LuaSocket and LuaFileSystem added to runtime. - Ability to chain scripts together for menus or launchers. - Specify if you want gun games to display on-screen crosshairs or not. - Menu for launching games included. - Many updates to Framework.singe to support the new APIs. - New APIs: - controllerGetAxis - discGetHeight - discGetWidth - fontUnload - mouseGetPosition - mouseSetCaptured - overlayBox - overlayCircle - overlayEllipse - overlayLine - overlayPlot - overlaySetResolution - scriptExecute - scriptPush - singeWantsCrosshairs - soundUnload - spriteGetHeight - spriteGetWidth - spriteUnload - videoDraw - videoGetFrame - videoGetFrameCount - videoGetHeight - videoGetVolume - videoGetWidth - videoIsPlaying - videoLoad - videoPause - videoPlay - videoSeek - videoSetVolume - videoUnload ------------------------------------------------------------------------------ SINGE 1.14 - 1.19 ================= Released ? Notes ----- - Unofficial fan builds. - Stand-alone releases. New Features ------------ - New API functions: - discPauseAtFrame - mouseEnable - mouseDisable - mouseHowMany - mouseSetMode - singeDisablePauseKey - singeEnablePauseKey - singeGetScriptPath - singeSetGameName - soundFullStop - soundGetVolume - soundIsPlaying - soundPause - soundResume ------------------------------------------------------------------------------ SINGE 1.10 - 1.14 ================= Released ? Notes ----- - Unofficial fan builds. - DLL releases for Daphne. New Features ------------ - New API functions: - discGetState - keyboardGetMode - keyboardSetMode - singeGetPauseFlag - singeSetPauseFlag - singeQuit - singeVersion - soundStop ------------------------------------------------------------------------------ SINGE 1.00 ========== Released 2006 Notes ----- - Original add-on for Daphne. - Shipped with the ActionMax "emulator" and games.