Version 2.4

Version 2.4 is a major update to VVVVVV, starting development on August 31st, 2021. It is currently in development and is scheduled to have localization.

Visual

 * A "- Press (MAP BUTTON) to skip -" prompt was added to the credits and ending picture if the player beat the game previously (it was always already possible to always skip the credits and ending picture no matter what).
 * Button glyphs were added, and all on-screen prompts relating to controls learned to automatically switch out which button glyph to show based on the active device.
 * The time trial selection screen was redesigned and learned to display centiseconds if available.

Custom Levels
 The ability to use  colors was added to  . A feature was added to support custom text box colors in the  command (and the new   command). Text box colors are stored in the  XML tag in the level file, and each entry looks like the following:  A feature was added to support changing and glitchy room names, like in The Final Level from the main game. Special room names are stored in the  XML tag in the level file, which looks like the following:  This shows if flag 2 is on!  On the Waterfront On the Vaterfront  Television Newsveel Television Newsvel TelevisvonvNewsvel TvlvvvsvonvNevsvel vvvvvvsvovvNe svel vhv vvv'vvovv vevl vhv V v'Cvovv vewv vhe 9 v'Cvovv vewv vhe 9 v'Cvovv Newv The 9 O'Cvovk Newv The 9 O'Clock News   Terminal editor entities gained the ability to not light up on touch if their  is 1 or greater. Terminal editor entities gained the feature to not spawn an activity zone if the script they point to doesn't exist. </ul>

Editor

 * Tile drawing was made interpolated, so any tiles that might have been missed due to the cursor moving too quickly are no longer missed.
 * Sideline hints were added to show spikes and horizontal gravity lines in adjacent rooms.
 * A fill bucket modifier was added, accessible by holding down F.
 * The ability to change the platform speed of a room (without needing external tools) was added, by using CTRL+ and CTRL+.

Scripting

 * and  were added.
 * destroys moving platforms (instead of being bugged and only stopping them and making them invisible, like ).
 * specifically destroys disappearing platforms.
 * ,, and   were added, allowing users to change the color and text of the next activity zone which appears.
 * The text which  uses is the text on the next line.
 * was added.
 * This command changes the color the player respawns with upon death.
 * A feature was added where text boxes can now contain up to 26 lines (from the previous limit of 11) if the line amount is suffixed with, e.g..
 * was added, allowing users to set the room name of a room from scripting.
 * was added, to mark that a text box has button codes inside it that need to be parsed.
 * was added, to make a text box fade out automatically after a certain time without needing a delay in the script itself.

Technical

 * WebAssembly is now a supported build target.
 * is used to detect Unix-like platforms, meaning many platforms don't need any changes to VVVVVV to work.
 * The following debug statements were added:
 * Values of the xoshiro RNG generator.
 * Achievements being unlocked (even if not already unlocked).
 * The CMake config option  was added to remove potentially-sensitive absolute paths from the compiled binary, if supported by the compiler. It was enabled by default.
 * The C-Hashmap library was added.
 * The game learned to print all failing binary blob checks to console.

General

 * The  command-line argument was added to print the memory addresses of all global classes, for help with getting autosplitters to work.
 * The  command-line argument was added to print the version number (e.g. "v2.4") and build type (e.g. "[M&P]") of the executable, as well as the hash, date, and branch of the commit it was built from if the executable has that information.
 * The window title will display the branch name the game was built from in brackets, and the branch name will also be displayed on the title screen, if the executable has that information.
 * The game learned to remember the index of the monitor the game window is on, and to open it on that monitor the next time the game was opened.
 * The "credits" button on the main menu was re-added in M&P builds.

Visual

 * Misa Kai's name was moved from the "super" GitHub contributors list to the C++ developers list.
 * All time strings were made more uniform. Centiseconds are now always separated by a period, and the first unit of the timestamp always no longer has a leading zero.
 * Launching the game in Big Picture or on the Steam Deck will now force the game to fullscreen, with windowing options removed from the graphics menu.
 * The game was made to default to integer scaling mode when launched for the first time.
 * The following effects were tempered when screen effects are off:
 * Any color relying on randomness (the random value used will always be the same)
 * Teleporter animations
 * Map cursor flashing
 * Player flashing when dying or respawning
 * The color of gravity lines
 * The slight zoom in the linear filter graphics mode was removed.

Custom Levels

 * Custom level zips were made more forgiving. They no longer require level names to be the same name as the zip, and can have multiple level files in one zip sharing assets.
 * To avoid complicated localization issues, the "by" text denoting the author/creator of a custom level was replaced with a language-neutral Viridian face.

Editor

 * The characters used to indicate the binds for scrolling through tools were changed from  and   to   and   to reflect the fact that those are the actual binds.
 * The selector characters around the names of scripts in the script editor were made to be the same as the selector characters on the title screen.
 * The hotkeys of the editor tools were outlined so they stand out more.
 * Script box and entity bounds placement learned to accept the placement of any corner in any order, no longer being strictly limited to placing the top-left corner followed by the bottom-right corner.
 * Entities were no longer prevented from being placed inside walls.
 * The framerate of the editor was made to be the same as the rest of the game.
 * The scrolling speed of the script list was made faster.
 * It was made no longer possible to remove tiles while holding a non-tile tool.
 * Some tools were renamed to be clearer or to be consistent with other tool names:
 * Checkpoint → Checkpoints
 * Disappear → Disappearing Platforms
 * Moving → Moving Platforms
 * Grav Line → Gravity Lines
 * Terminal → Terminals
 * Script Box → Script Boxes
 * Warp Token → Warp Tokens
 * Crewmate → Crewmates
 * The editor learned to display a note when the level was completed during in-editor playtesting, to make things clear when they otherwise weren't.
 * Single tile autotiling was added.
 * Backing in Warp Zone tileset was added and places down the alternate solid tile.
 * The game learned to disable the editor if the device does not have a keyboard.

Scripting

 * When the game is attempting to convert a string to a color (ex. ), it now attempts to treat it like a numerical color ID if the string cannot be converted.
 * The 50-line limit on the amount of lines /  can take in was removed.

Technical

 * Loading music tracks from separate audio files was added. If neither  nor   exist, the game will load music from the   folder.
 * Logging was completely overhauled.
 * Output was made prefixed with,  ,  , or  , including bold and colors (if available).
 * All  and   logs were made to properly go to STDERR, instead of STDOUT.
 * logs were disabled by default.
 * Command-line options were added to customize logging output:
 * disables output entirely.
 * or  forces colors to be on.
 * or  forces colors to be off.
 * enables debug logs.
 * disables info logs.
 * disables warning logs.
 * disables error logs.
 * Logging and error handling was added for error conditions that previously silently failed, such as being unable to draw to the screen.
 * The command-line option  was added, for Windows systems only, to spawn a console window that will capture all console output of the game.
 * Output of loading/saving XML files was streamlined and was made to print TinyXML-2's error output in case of an error.
 * The minimum SDL version was upgraded to 2.24.0.
 * The game's audio system was migrated from SDL_mixer to FAudio.
 * This minimizes the number of libraries ("DLLs" on Windows) needed to run the game (in officially shipped builds).
 * Users have reported that the audio quality is no longer crushed when played through certain speakers.
 * Loop point support in music has been extended, mirroring the same changes that were made to SDL_mixer before the game was migrated to FAudio:
 * Tags can now start with  or   instead of   (e.g.   instead of just  )
 * Start and end times can now be in the format, instead of just sample counts
 * Upon startup, the game will only create the window after all assets have been successfully loaded (and if using command-line playtesting, after STDIN has been closed). In case of an error (like an invalid playtesting level name provided), then the window won't be created at all.
 * This has enabled Ved, starting from 1.10.0, to "pre-load" the game in the background during the screen to choose the playtesting starting point.
 * The game's rendering was shifted over from being mostly CPU-based to being mostly GPU-based (via SDL's 'render' subsystem), providing a performance boost.

General

 * The level folder path in the levels menu was made to be hidden behind a "show level folder path" menu option. The option warns the user they may leak sensitive information if they are streaming.
 * On Windows, the game no longer needs users to install Visual C++ redistributables in order to run it.
 * The default window size if no settings file is present is now 640 by 480 instead of 320 by 240.
 * The minimum size of the window was restricted to 320 by 240.
 * The game learned to not modify the resolution of windowed mode if it was in fullscreen mode.

Gameplay

 * Spikes are no longer considered to be solid by moving platforms and entities if invincibility mode is enabled.
 * A bug was fixed where the post-game teleport animation back to the ship from the map menu could be interrupted in various different ways.
 * A bug was fixed where the player was able to flip in mid-air when loading in to a level if they exited to the menu while standing on a surface (along with other state that persisted).
 * A regression from 2.3 was fixed where beating No Death Mode (and never going to the options menu) would also give you the Flip Mode trophy.
 * A bug was fixed where trophies were saved before unlocking the Master of the Universe trophy, thus potentially not saving the Master of the Universe trophy properly.
 * A bug was fixed where it was possible to play music during No Death Mode's Game Over screen by dying when the music was fading out from one area's music to the next.

Visual



 * While nearly unnoticeable to the naked eye, the colors used by the Time Trial trophies in the Secret Lab were mistakenly using BGR format instead of RGB, which was fixed.
 * A rare chance where a glitchy tileset would be drawn during finalstretch was fixed.
 * The name of the author of Vertex Vortex was updated.
 * A bug was fixed where Vitellary would look left for only one frame multiple times during the cutscene in "Do as I Say...".
 * A bug was fixed where the trinket collection text boxes would stay up if the player warped to the ship while they were up.
 * A bug was fixed where in transparent text boxes the outlines of previous lines could overlap the text on their next lines.
 * A bug was fixed where platforms and enemies could be colored gray in the main game if the player had loaded a custom level with gray rooms.
 * A regression from 2.3 was fixed where silencing music wouldn't stop a queued track, so the very beginning of A New Dimension wasn't silent when it should have been.
 * A bug was fixed where the player would "zip" when transforming into and out of VVVVVV-Man (visible during the Secret Lab cutscene with screen effects off).
 * A regression from 2.3 was fixed where if a room transition was triggered right as the game exited to menu, the music played wouldn't be Presenting VVVVVV.
 * A bug was fixed where the clock sprite (and technically the trinket sprite) on the Game Saved quicksave screen were upside-down in Flip Mode.
 * A bug was fixed where a track that was resumed would not be resumed if unfocusing the window and refocusing it (and audio unfocus pause was enabled).

Custom Levels

 * A regression from 2.3 was fixed where  could copy-paste all its entries over and over if you selected the "play a level" option multiple times and then went and completed a level.
 * A bug was fixed where using STDIN playtesting (e.g. playtesting a level within Ved) and then completing it would write a  entry to the   file.
 * A bug was fixed where the map screen could be brought up during in-editor playtesting if the player pressed ENTER on a terminal while dying and had the interact key set to ENTER.
 * The minimap displayed on the  screen was changed to use the custom level minimap if applicable.
 * Trinkets that exist out of bounds were made to no longer be drawn on the minimap.
 * A regression from 2.3 was fixed where music tracks in custom music files whose headers had sizes going past the end of the file were not being played. One such track was in Summer Spooktacular.
 * An oversight was fixed where rolling credits in a custom level would delete the main game quicksave file.
 * A bug was fixed where the game would play music at the start of command-line playtesting in certain cases when unwanted, including when the user specified.

Editor

 * A bug was fixed with the way the script list scrolled when the selection moved past the bottom of the screen.
 * A bug was fixed with gravity lines whose lengths were not divisible by 8 pixels were being improperly rendered.
 * All oversights were fixed where it was possible to lose unsaved level changes in the editor by triggering certain gamestates (e.g. gamestate 82, completing a time trial, and gamestate 1015, that just forcefully quits to the menu).

Scripting

 * Script names containing spaces or capitals were made possible to be jumped to via  or similar. To prevent disruption to existing levels, the implementation attempts to load the processed name first (with spaces removed and capitals lowercased) before attempting to load the literal name.

Technical

 * Duplicate player entities were made to have the same momentum as the true player entity.
 * The workaround used to make the VSync toggle work was fixed, making it more reliable on some systems that might have had problems with it previously.
 * The game now checks that  is loaded and decoded properly before dereferencing, fixing a potential source of crashes.
 * A bug was fixed where a bogus "level not found" warning was printed to console when loading command-line playtesting if the level in question was in a zip file.

General

 * The game learned to not explicitly write /  if it hadn't attempted to load them yet, preventing overwriting perfectly good save data. Previously, this was handled implicitly and was still theoretically possible in a number of cases involving the game aborting upon startup.
 * A bug was fixed where on Wayland, if the game launched in fullscreen mode and stretch mode, the screen wouldn't be properly stretched.
 * A regression from 2.3 was fixed where the controller button bound to menu/back couldn't be rebound to any other action from in-game.
 * A bug was fixed where the player would be unable to skip credits and the ending picture if they didn't release the map button before they played.

Custom Levels

 * assets were removed due to disuse.

Editor

 * Right-click emulation (via pressing Ctrl+Left Click), which never worked properly, was removed.

Technical

 * Save file migration from 2.0 data to 2.2 data was removed.
 * The UTF8-CPP library was removed. The game learned to handle Unicode support on its own.

Localization
This version received a localization overhaul, adding support for the following languages:


 * Catalan by Eduard Ereza Martínez
 * Chinese (Simplified) by 谜之声
 * Chinese (Traditional) by 谜之声 and craft
 * Dutch by Dav999
 * Esperanto by Reese Rivers
 * French by Words of Magic
 * German by Thomas Faust
 * Irish by Úna-Minh Kavanagh, Seaghán Ó Modhráin, and Davis Sandefur
 * Italian by A. Dellepiane, M. Scarabelli, L. Bertolucci, and F. Bortolotti
 * Japanese by Nicalis translators and KabanFriends
 * Korean by Bada Im and Hyungseok Cho
 * Polish by Kuba Kallus
 * Portuguese (Brazilian) by Lucas Araujo and Thiago Araujo
 * Portuguese (European) by Locsmiths
 * Russian by TheMysticSword
 * Silesian by Kuba Kallus
 * Spanish by Felipe Mercader and Sara Marín
 * Turkish by Engin İlkiz
 * Ukrainian by Olya Sushytska
 * Welsh by Morgan Roberts

A language menu select appears on first launch if you've never selected a language before. This menu is also accessible from the options menu.

Each language is stored in a folder named after its two-letter code (e.g.  for English) in a new   folder. Each folder contains the following:


 * : Contains information about the translation.
 * : Contains general strings for the interface and some parts of the game.
 * : Contains strings with plural forms.
 * : Contains all numbers from 0 to 100 written out in word form.
 * : Contains nearly all cutscenes that appear in the main game.
 * : Contains nearly all room names that appear in the main game.
 * : Contains special names, such as area names and glitch names.

Support has also been added for different fonts, such as CJK fonts (Chinese/Japanese/Korean) in the  directory. Custom level creators can set the font for their level in level options.

The following command-line arguments were added relating to localization:


 * sets the language directory to the given directory.
 * sets the fonts directory to the given directory.
 * enables the translator menu if not already enabled (see below).

The following gamestates were added, all used in the translator 'explore game' mode:


 * 3090: Returns to the main menu.
 * 3091: Waits 60 frames before proceeding to the next state.
 * 3092: Returns to the main menu.

The following script commands (both internal and simplified) were added:


 * : Jump to script if the current game language is a certain language.
 * : In custom levels, load the given language.
 * : In custom levels, set the font to the given font.
 * : Set the text case for the following text box.

Translator menu
A menu for translator authors and translation maintenance was added. The translator menu only appears on the main menu and is accessible if any of the following are true:


 * The  command-line argument is used.
 * The  folder is not next to , the game is running somewhere inside a folder named  , and a   folder is found inside  . This usually corresponds with running the game from a source code environment (e.g. doing development work).
 * is defined during compilation.

The menu also contains the following options:


 * A menu to sync language files with any new added English strings.
 * Room name translator mode (see below).
 * Previews of every text box in every cutscene, as well as every menu.
 * Check (roughly) if any string overflows a limit.
 * Open the language folder.
 * Statistics counting any untranslated strings.

Room name translator mode
Room name translator mode is accessible from the translator menu. It enables viewing and editing room names and room name explanations while in-game.


 * Pressing  toggles invincibility. If enabled during a time trial, the time trial is sabotaged by adding an hour to the time and adding 100 deaths.
 * Pressing Tab switches between playing and editing.
 * In editing mode, pressing /Enter edits the room name or explanation.
 * Ctrl+ switches to explanation mode.
 * F1 shows the help.

There is also a separate 'explore game' menu that lets the user quickly travel to any of the following areas:


 * Space Station 1
 * Laboratory
 * The Tower
 * Space Station 2
 * The Warp Zone
 * Intermission 1
 * Intermission 2
 * The Final Level

Beating the area returns the player to the menu.

Trivia

 * Misa Kai streamed her review of the localization pull requests on Twitch.
 * First localization pull request (YouTube VOD playlist)