New features and improvements
- Added an integrated file browser (in Options -> System) that allows for importing mod zips on Android and iOS/Web from the file system into S3AIR's app data
- Save data is now stored across multiple files in "storage" inside your save data folder, making it easier to delete or backup individual files if needed
- Added option for a hint on the hidden monitors that you can unveil with the signpost
- Added options for several minor enhancements that have always been part of S3AIR, but could not be turned off before
- A few more skippable cutscenes (end of LBZ 2, start of SSZ, DEZ act transition)
- Performance optimizations for software renderer, specifically for rotated / scaled sprites display
Bug fixes
- More precise ground collision check for spilled rings
- Fix for an issue that could lead to a stuttering frame rate
- Fixed several software renderer bugs
- Fixed a bug that could cause a crash during paused competition mode and in AIZ 2 / MHZ 2 blimp sequences
- Fixes for server communication issues that could randomly break both Ghost Sync and the Update Check
- Fixed that selecting HPZ in Act Select started the Lava Reef 2 boss fight
- Fixed a random emulated soundtrack issue with sped-up music playback
- Fix for emulated S3A versions of mini-boss music and Knuckles theme
- Fixed a bug that could lead to incorrect sprite rendering in mods
- Fixed that pressing Numpad-9 leads to a broken rewind and game freeze if dev mode is disabled
- Using proper animation for Tails carrying Sonic when exhausted underwater
- Corrected render priority for the Egg Mobile after SOZ 2 boss fight
- Fix for first Sonic outro win pose sprite position and rotation
- Fixed that ground did not fade to white after finishing a stage in Blue Sphere game mode
- Fixed a glitch in Act Select when starting a game during a transition of the zone preview slideshow
- Fixed a layering issue inside certain graphics, like Tails' run sprites
- Fix for a glitch when going back to the main menu immediately after entering Data Select (namely while still fading in)
- Fix for a memory leak related to text rendering
- Fixed a crash and errors when a modded font was loaded from a zip file or a path with non-ASCII characters
- Additional checks to prevent the "type is not convertible to string" error when e.g. the active-mods.json is malformed
- A bunch of more fixes for minor glitches and inconsistencies in animations and palettes
Modding features & improvements
- New dev mode menu system (toggle by pressing F1 when dev mode is enabled)
- Dev mode can now be toggled in the options menu's system tab (requiring a manual restart afterwards)
- Both Act Select and the Pause Menu are now implemented in scripts, making them fully moddable
- Lemonscript now supports arrays - for details, see page 11 of the Oxygen Handbook
- Added support for constant arrays of types float and double
- Local variables are now generally preferred over globals with the same name
- Reworked persistent data functions, so you can store data in individual files and optionally in a local folder for your mod
- You can now declare unresolvable mod conflicts with other mods as errors in your mod.json, using "IsConflict" in the "OtherMods" section - see pages 5/6 of the Modding.pdf
- Support for mods to use up to four players (see "UsesFeatures" section in Modding.pdf)
- Removed the hard limit for number of sprites
- Increased the maximum supported number of lines and colors per line in custom palettes from 64 to 256
- "Renderer.enableSecondaryPalette" now supports screen heights over 254
- F10 now also reloads modded audio
- Fixed that "Volume" property in audio_replacements.json was ignored in most cases
- On desktop platforms, config.json will now be preferred over settings.json for all properties that are defined in both
- Script compile error if a constant or global variable default value is too large for the data
- Fixed a script compile crash when using floating point values with bitwise operations
- Fixed a crash when retrying a previously failed mod script compilation
- Added stringformat support for float and double data types (using "%f")
- Added variants of "System.getGlobalVariableValueByName" for float, double, string types
- Revised random number generation and added new script functions "System.randomFloat" and "System.randRange" variants
- Added "makeCallable" function to get a u32 address for script functions to be used in calls
- Added "System.removePersistentData"
- Support for custom palettes in sprite rendering via new SpriteHandle functions "setPalette", "setPrimaryPalette", "setSecondaryPalette"
- Added alternative script function variants of SpriteHandle methods "setRotation", "setScale", "setTintColor", "setAddedColor"
- Added BlendMode constants to cpp_core_functions.lemon
- Added convenience script functions "getScreenCenterX" and "getScreenCenterY"
- "Log" and "LogDec" can now also be used with float, double, and string values
- Added "System.isDevModeActive" script function to check whether dev mode is enabled
- Oxygen Handbook now includes a documentation for how to use automatic font effects like outlines and shadows