Version 2.3

From Viki
Jump to navigation Jump to search
VVVVVV 2.3 title screen.png
Release date31 August 2021
Latest release2.3.6 (22 December 2021)
Minimum SDL versionSDL 2.0.14
Shipped SDL versionSDL 2.0.16
Preceded by2.2
Succeeded by2.4

Version 2.3 was a major update to VVVVVV, starting development on 10 January 2020, when the game's source code was released on GitHub. It was released on 31 August 2021. Subsequent minor updates were released after that, the final update being 2.3.6 on 22 December 2021.



  • An option to disable pausing when the game loses focus was added.
  • Music now pauses when the game loses focus.
    • An option was added to disable this feature.
  • Glitchrunner mode - a mode that reintroduces glitches used in speedrunning - was added.
  • Input delay was reduced from one frame to zero frames.
    • An option was added to revert this change, in case the player's muscle memory would be broken.
  • Time trial results and Game Complete learned to show the centiseconds of time taken.


A translucent room name background.
  • The game now has an option to render at framerates higher than 30 frames per second.
    • A VSync option was added.
  • An option was added to give all text a black outline. This is off by default.
  • ACTION can now be used to skip the fake loading screen.
  • The fake loading screen can now be disabled.
  • An option to have a translucent room name was added.
  • If a custom level has a custom minimap.png, the image will be used as the map in the level.
  • An in-game timer was added.
    • It is disabled by default.
  • [Press ENTER to return to editor] now fades out after a few seconds.
  • The option to give terminals any sprite was added.
  • Automatic toggling of cursor visibility was added.

Custom Levels

  • The ability to left-click on script boxes to edit its associated script was added.
  • 7x7, 9x9, full-horizontal and full-vertical brush sizes were added.
  • Functionality for loading per-level custom assets from folders was added.
  • Functionality for loading levels from zip files was added.
  • Editor playtesting ghosts were added.
  • The Warp Zone gray tileset was added to the editor.
  • Space Station 1 tilecol -1 was added the editor.
  • The Lab rainbow background was added to the editor (available only if Direct Mode is enabled).
  • The ability to press G to go to a room in the editor was added.
  • One-ways were changed to recolor themselves to fit the current room's colors.
    • If custom graphics are in use, <onewaycol_override>1</onewaycol_override> is needed in the level file to re-enable recoloring.
  • It is now possible to press Shift+F1/F2/F3/W to cycle backwards tilesets, tileset colors, enemy types, and warp dirs (which are F1/F2/F3/W).
  • The option to press F9 in the editor to reload resources was added.
  • A menu option to open the levels folder was added to the levels menu.
    • It is disabled if unavailable (e.g. in Steam Big Picture mode).
    • This was previously added in 2.1, but was removed in 2.2 due to being OS-specific.
  • The ability to select any song was added to the editor.
  • An option to select the previous song was added to the editor music screen.
  • The ability to access settings from the editor was added.
  • An option to delete quicksaves for custom levels was added.
  • An option to delete all custom level save data was added.
  • The ability to use orange and white colors in text() boxes was added.


  • The audiopause() command was added to let player levels control audio pausing when the game loses focus.
    • It can be used by doing either audiopause(on) or audiopause(off).
  • The flipgravity() command was changed to act on the player, and to unflip crewmates.
  • The showtrinkets() command was changed to work in custom levels.
    • It is also automatically saved to quicksaves.


  • Support for symbolic links was added.
  • Support for Unicode text was added, along with adding the UTF8-CPP library.
  • Instead of failing silently (or even crashing the game), several error screens were added. This includes attempting to load a level that doesn't exist, saving a level to a location that cannot be saved to, missing, etc.
  • The Linux and macOS binary names were changed to simply be VVVVVV. Additionally, you no longer need to run the game specifically from the directory containing the directory containing the binary, on Linux and macOS.
  • Several command-line arguments were added.
    • The option to specify the base user directory with the -basedir flag was added.
    • The option to specify the location with the -assets flag was added.
    • The option to directly launch a level with the -playing flag was added. If the filename special/stdin is passed, the game will read the level from standard input.
    • The option to pass in -playassets to select assets to use was added. This would be useful if a level is passed in through standard input, as otherwise the game wouldn't know which assets to load.
    • The flags -playx, -playy, -playrx, and -playry were added to set the player's X, Y, room X, and room Y.
    • The flag -playgc was added to set the player's gravity.
    • The flag -playmusic was added to specify the music which the level should start with.
  • XML forwards compatibility was added.


  • The ability to press N to mute only music (as opposed to all game audio including sound effects) was added.
  • An option was added to separate the bind for opening the map from the bind for interaction.
    • It is off by default.
  • The graphics option to resize the window to the nearest multiple of 320x240 ("resize to nearest") was added.
  • The ability to press ESC to return to the previous menu was added.
  • In-game music and sound volume sliders were added.
  • A .ico icon file was embedded into VVVVVV.exe on Windows.
  • Support for reading an SDL gamecontrollerdb.txt upon startup was added.



  • Pressing R was changed such that it does not kill the player in No Death Mode.
  • Targets (question marks on the minimap) are now guaranteed to be saved to save files when unlocked after completing Space Station 1. Else, a player could unlock them, but not talk to Violet, quit and load the game again, and have their targets be gone.
  • It is now always possible to bring up the pause/map screens and press R during cutscenes, in case the player gets softlocked.
  • Vertically-moving platforms were fixed to give the player two frames of edge-flipping, instead of only one (due to an oversight).
  • Flip tokens and flipgravity(player) were counted towards the total number of player flips.


The elephant with screen effects disabled.
  • The elephant was changed such that it will not flash if screen effects are disabled.
  • Tile animations in The Final Level were changed such that they will be disabled if screen effects are disabled.
    • While the texture is static, the colors will still change.
  • The hardest room displayed in the ending sequence was changed to use the room's hidden name if it's blank.
    • As an example, if the hardest room is in the Overworld, the text will read Dimension VVVVVV instead of being blank.
  • All rooms are automatically marked as explored when the Secret Lab is entered through the epilogue cutscene.
    • Previously they would only be explored if the Secret Lab was entered through the main menu.
  • All rooms in the Secret Lab (including the Super Gravitron) were given hidden names (names that show up on the map screen).
  • The game learned to always draw crewmates and players on top of other entities no matter what. Thus, crewmates now appear in front of checkpoints in Intermission 1 instead of behind them.
  • Activity zone prompts were made to not be drawn during cutscenes, as the player wouldn't be able to activate them.

Custom Levels

  • The trinket and custom level crewmate limits were raised to 100.
    • Word forms of numbers (used in the trinket and custom level crewmate collection dialogues) from Fifty One to One Hundred were added.
    • Additionally, trinket and custom level crewmate collect statuses above ID 19 were changed to now be reset properly when exiting to the menu.
  • The max width and height was removed from all tilesheets (tiles.png, tiles2.png, tiles3.png, entcolours.png, sprites.png, flipsprites.png, teleporter.png).
    • Because of this, tilesheet sizes are no longer assumed in the Direct Mode tile tray.
  • The ability to roll credits while in the editor was removed.
  • Trinkets and crewmates in custom levels were changed such that they will only be counted if they are in-bounds.
  • Loading of the level list was optimized.
  • Enemies, platforms and conveyors in Warp Zone gray tileset were changed to appear gray.
  • Locked gravity/warp lines are no longer reverted when the room is loaded in the editor.
  • Parsing of all 128 music file headers was added (for both vvvvvvmusic.vvv and mmmmmm.vvv).
  • The (buggy) check which prevented having both warp lines and a warping background in a room in the editor was removed.
  • Duplicate player entities were fixed to be destroyed when returning to the menu.
  • Custom level stats were no longer limited to 199 level stats at a time.
  • Supercrewmates now collide with more entities.
  • Pressing ESC in an editor sub-menu (e.g. the scripts list) no longer immediately closes the menu screen, and will just return to the previous menu instead.


  • resumemusic() and musicfadein() were fixed.
  • createentity() was changed to expose its last four arguments for scripting.
    • They default to 0, 0, 320 and 240.


  • The minimum SDL version required for compiling was upgraded to SDL 2.0.14, while the official releases shipped with SDL 2.0.16.
  • All settings were moved to settings.vvv.
    • For backwards compatibility with previous versions, settings are still duplicated in unlock.vvv in case the player were to change some settings in 2.3 and then go back to playing 2.2.
  • The TinyXML-1 dependency was upgraded to TinyXML-2.
  • Gravitron RNG was changed to be deterministic regardless of screen effects.
  • Official binaries for 32-bit Linux and macOS were abandoned. Users will need to compile from source if they want such binaries.
  • This is technically not a change with VVVVVV per se, but due to an upgraded SDL_mixer version, loop points were made to now work in music (via LOOPSTART and LOOPEND/LOOPLENGTH metadata tags).
  • Apple doesn't like icons anymore, so the game no longer loads a window icon on macOS.
  • The LodePNG version was updated to 20200306.


  • The next/previous page options in the level list were changed such that they do not appear if there is only one page.
  • The menu layout was completely changed.
  • The ability to press F11 to toggle fullscreen was added.
  • On macOS, the ability to use RCommand+Enter/F (alongside the existing Command+Enter/F keybind) to toggle fullscreen was added.
  • The ability to press ESC to go to the quit menu from the teleporter menu or Super Gravitron quit menu was added.
  • The Super Gravitron quit menu was fixed to be able to be brought up immediately upon entering the Super Gravitron, without having to wait for [Press ENTER to stop] to show up.
  • The ability to access the options from the escape menu was added.
  • Flip Mode was made always accessible in Make & Play.
  • Flip Mode was made accessible in the in-game options menu if available.
  • Focus fullscreen toggling was restricted to only happen on the X11 windowing system.


Due to 2.3 having so many changes, there are quite a lot of fixes that are not mentioned here. If you see one missing, please contribute.


  • The teleporter prompt no longer disappears when dying.
  • The Prize for the Reckless quicksand fix kludge now only happens in the correct room, and not in Boldly To Go, or custom levels.
  • Tower respawning is now less buggy.
  • The player spawning in is no longer offset by two pixels.
  • Starting from a checkpoint in the editor now spawns Viridian in the correct location.
  • Platforms, conveyors, and teleporters will no longer be rendered weird if they go above or to the left of the screen.
  • Gravitron squares were made to still move offscreen on death even after the Gravitron ended. Otherwise, the player could keep continuously dying in a Gravitron square after the Gravitron finishes (archive).
  • Quitting to the menu was fixed to no longer be interruptible, unless glitchrunner mode is re-enabled.
  • Quitting to the menu was fixed to be faster (regardless of glitchrunner mode).
  • The clock no longer ticks up when the game is in an unfocus pause (it would tick up, but about 3 times slower, when paused).
  • The clock no longer ticks up while a time trial countdown happens, which made it possible to play the cry sound effect every frame if the time ticked up past the par during the countdown (via pausing the game).
  • Clipping inside a wall inside towers (which is possible without hacks or invincibility) no longer kills the player (previously, it killed the player even if they were invincible!).
  • Tower spikes are now solid in invincibility mode, consistent with all other spikes being solid.
  • The tower camera in invincibility was made more smooth when pushed around, and can now be moved downwards in ascending towers. Here is a demonstration video (archive).
  • In the main game, music per area was made more solid (via an area map) and it is no longer possible to mismatch music with the area.
  • Rescuing Violet was fixed to not reset crewmate progress (which would lead to an unwinnable save).
  • Rescuing Violet last was fixed to lead to the Final Level, instead of canceling the sequence (which would lead to an unwinnable save).
  • It is no longer possible to softlock from touching trinkets or crewmates on the same frame as a script box with a text box in it.
  • It is no longer possible to softlock by using a teleporter and teleporting to another teleporter, while inside the teleporter hitbox, after returning from rescuing a crewmate or an intermission.
  • It is no longer possible to softlock by being stuck on a text box waiting for an ACTION press without having a - Press ACTION to advance text - prompt.
  • General anti-softlock measures were added. The game is guaranteed to return player control if there is no script or gamestate running.
  • It is no longer possible to go into an infinite loop (which would require force-killing the game) by opening a teleporter with only one teleporter unlocked and then pressing left or right.
  • An oversight where the player could enter the Super Gravitron with invincibility enabled via entering the Secret Lab through the epilogue cutscene was fixed.
  • An oversight where the player could straight-up enter the Super Gravitron with slowdown enabled was fixed.
  • Slowdown was made to only apply in-game, instead of also being applied in menus.
  • The game no longer freezes if a music track is played while an existing track is already fading out.
    • This freeze was also the cause of the bug where music would play during menu-gameplay transitions even if the game was muted, so that bug was also fixed when this bug was fixed.
  • VVVVVV-Man was fixed to be able to warp.


The pause menu displayed upside-down in Flip Mode.
  • Translucent pixels of tiles drawn outside towers were fixed to be drawn correctly.
  • A wrong tile in the top-left of Do Try To Keep Up was fixed.
  • Entities are now drawn in the same order as the rest of the game in towers and in the editor (backwards according to entity index).
  • Entities warping in Flip Mode are no longer discolored.
  • Crewmate-found text boxes no longer overlap each other in Flip Mode.
  • The menu in Flip Mode was changed to display upside-down.
  • If the player finishes a time trial in 1 minute, it is now displayed as 01:00 instead of 00:60.
  • There's no longer a seam when entering a new room with a horizontal or vertical warp background.
  • The screen now renders screen effects in towers.
  • The map now renders screen effects (shaking, flashing etc.).
  • Bringing the menu up in towers no longer brings it up against the wrong background.
  • The capitalization of all songs were made consistent.
    • "Passion for exploring" or "Passion For Exploring" -> "Passion for Exploring"
    • "Pushing onwards" -> "Pushing Onwards"
    • "Positive force" -> "Positive Force"
    • "Potential for anything" or "Potential For Anything" -> "Potential for Anything"
    • "Predestined fate" -> "Predestined Fate"
    • "ecrof evitisoP" -> "ecroF evitisoP"
    • "Piercing The Sky" -> "Piercing the Sky"
  • "Warpzone" was corrected to "Warp Zone".
  • "Exausted?" was corrected to "Exhausted?".
  • "You can unlock each time trial seperately" was corrected to "You can unlock each time trial separately". ("seperately" was misspelled.)
  • "seperate" at the end of the epilogue cutscene was corrected to "separate".
  • "Rebind your controllers buttons and sensitivity" was missing an apostrophe, and was corrected to "Rebind your controller's buttons and sensitivity".
  • The Viridian squeaks played when pressing ACTION in menus were made consistent across all menus.
  • The final stretch color cycling no longer gets faster after you enter a tower.
  • Disappearing platform animations during final stretch are no longer glitchy if they disappear while the room color changes.
  • Pushing the tower camera with invincibility mode no longer smears the background.
  • Quitting to the menu at the right time in a tower no longer mismatches the title screen text and background colors.
  • Entities creating during a complete stop will no longer have their sprite offset set to 0 (making all sprites look like the player and all platforms be invisible).
  • Translucent pixels in the font were fixed to not keep being drawn on top of themselves on the map screen.
  • The right-side corners of the menu bar on the map screen were fixed to not be visible if the corners had custom textures.
  • Fade-in durations after collecting a trinket or custom crewmate were fixed to actually be 3 seconds long instead of 4.352 seconds long (due to an oversight).
  • An oversight was fixed where it was possible to have music playing during a trinket or custom crewmate collection dialogue by simply pressing M to mute and unmute the game.
  • Conveyors and moving platforms in Outside Dimension VVVVVV in a custom level were made to be drawn properly.
  • A bug was fixed where having backgrounds disabled and bringing up the editor settings screen would result in the screen being drawn against the level as a background instead of no background.
  • Warping entities' rendering were fixed, so they wouldn't have offsets that didn't look right. This was most noticeable with vertically warping entities in a room with no room name.
  • A bug was fixed where Vitellary only looked leftwards for one frame when he attempted to look at the checkpoint during the cutscene in "Now Stay Close To Me...".
  • The game learned to no longer draw the "Game paused" unfocus screen during a blackout, so the freeze-frame effect will not be ruined if the player unfocuses the game.

Custom Levels

  • Custom levels can no longer modify or overwrite main game telesaves, quicksaves, or highest scores, or unlock any game modes or achievements.
  • It is no longer possible to lower a two-star custom level score by replaying it but beating it without full trinket completion.
  • The hardcoded all-sides warp in (19,8) no longer happens.
  • The Prize for the Reckless moving platform kludge no longer happens in custom levels.
  • Enemy type room properties in the editor are now reset when creating a new level.
  • The Make & Play edition no longer contained room data for the Final Level, Lab, Overworld, or Tower in its binary.
  • Enemy movement types 10 and 12 no longer cause memory leaks when spawned as either a custom enemy (createentity() entry 56), or spawned outside of the rooms they spawn in in the main game.
  • The hardcoded no-follow rule of scripting crewmates in (10,5) was removed in custom levels.
  • You can no longer make zero lines in the script editor.
  • Activating and loading scripts no longer causes undefined behavior.
  • Moving platforms warping no longer causes a memory leak.
  • The game no longer attempts to spawn main game crewmates/activity zones (which would happen if you used rescued()) in custom levels.
  • You can no longer destroy the main player entity. Duplicate player entities can be destroyed by using flipgravity() on them, and entering a different room (or reloading the current one).
  • Direct Mode is now reset correctly when making a new level.
  • The two-frame-delay when entering a room with an "init" script was fixed.
  • The possibility for crewmates to be cyan when initially placed was re-added. (It previously was not possible due to an oversight.)
  • The bug where enemy and platform bounds wouldn't be drawn in the editor if any one of their bounds touched a screen edge was fixed.
  • A bug where mouse coordinates wouldn't be scaled properly in stretch mode was fixed.
  • Custom crewmates were fixed to be able to warp.
  • Pressing ENTER on a teleporter during playtesting was fixed to no longer exit playtesting.
  • An oversight with activity zones was fixed where it was possible to activate them during death during playtesting, but not when playing the level for real.
  • An oversight was fixed where it was possible to accidentally lose changes made to the level in the editor by activating the rollcredits() command during in-editor playtesting.
  • Script boxes past the 37th script box in a room were made to function properly.
  • A bug was fixed where the player's gravity control would be invalid if playtesting was started from a checkpoint with a non-standard sprite (neither the unflipped or flipped checkpoint sprites).


  • The script editor no longer lets you type on a non-existent last line.
  • Pressing M to mute no longer happens in the script editor.
  • The process of removing lines in the script editor was changed to be non-instanteous.
    • Prior to this change, pressing backspace to remove a line would have no cooldown, possibly leading to a line being removed every frame.
  • Typing pipes (line separator character) was disabled in the script editor.
  • Closing a script with any lines ending in a colon (thus inadvertently creating a new script) was fixed by putting a space after each offending colon when closing said script.
  • warpdir() now sets the right background regardless of which tileset is in use.
  • createentity() warp lines now work even without a placed warp line already present.
  • gotoroom()ing to the same room no longer restarts the horizontal/vertical warp background animation.
  • Centering text with x=-1 was fixed. Prior to this, it would center the textbox based on the first line alone.
  • Warp directions set with warpdir() are now reset when exiting playtesting.
  • vvvvvvman() size is now reset properly upon death and exiting to menu, unless glitchrunner mode is enabled.
  • flipme() no longer ignores the height of the textbox.
  • It is no longer possible to get in an infinite loop in the scripting system (which would require force-killing the game).


  • roomdeaths and roomdeathsfinal are now reset properly.
  • Superfluous whitespace in entity XML data in level files was removed.
  • The game no longer attempts to position cyan text boxes above horizontal warp lines.
  • A bug with Windows usernames containing Unicode was fixed.


  • The Alt+Enter Glitch is fixed, but can be re-enabled with glitchrunner mode.
  • Pressing ESC now works better in roomtext/script text input.
  • In the main game, songs 0 and 7 no longer loop and fade if you're using PPPPPP while mmmmmm.vvv is present.
  • Holding X or Z while spikes are selected no longer increases the size of the eraser when using the spike tool.
  • Stats are now saved immediately when a new Super Gravitron record is set, or a new highest main game trinket count is set.
    • Additionally, the game was changed to always save your stats and settings upon closing the game (e.g. pressing Alt+F4), even if not closed by using the "quit game" option on the title screen.
  • Ethan Lee (the developer who worked on 2.2 and wasn't credited) was added to credits.
  • Various typos, memory leaks and less-important bugs have been fixed.

Undefined Behavior Fixes

All undefined behaviors have been fixed. This is a list of undefined behaviors in previous versions that no longer exist in 2.3.

Uninitialized memory

The game was originally ported from the original ActionScript in the Flash 1.x versions. Ported, not rewritten. Thus previous versions shared many (poor) ActionScript coding standards. One of these was putting all global variables into classes that were passed around between every function. In the C++ port, these classes were allocated on the stack instead of static storage, so they never got the benefit of static storage being automatically initialized, which resulted in many uninitialized variables and many reads from uninitialized memory.

  • Playing music for the first time (i.e. pressing ACTION on title screen) reads from uninitialized memory.
    • Basically... you weren't able to even launch the game without causing undefined behavior!
  • Processing music reads from uninitialized memory until a 'nice fade' is queued.
  • Checking for collision for the first time reads from uninitialized memory (twice).
  • Drawing entities for the first time reads from uninitialized memory.
  • Saving the game reads from uninitialized memory until a 'nice fade' is queued.
  • Loading a quicksave inside a tower without ever having respawned in a tower before in the game process reads a variable from uninitialized memory.
    • This variable controls how long the game will wait before moving the camera, and if it's an absurdly high value, this results in the tower quicksave (semi-) softlock bug.
  • An internal function named ss_toi() would return uninitialized memory if given an empty string, and it is used for parsing numerical script arguments; thus using a script command that has an argument that expects numbers and either leaving it out and having a blank previous argument or explicitly setting it blank (by adding argument separators) will result in reading from uninitialized memory.
    • An example is level makers using gotoposition() with only 2 arguments instead of 3, which caused undefined behavior if you were unlucky (depending on which scripts the player executed) and was just unpredictable in general.
  • Calling resumemusic() always reads from uninitialized memory.

Out-of-bounds indexing

As explained previously, the game was originally ported from ActionScript. Another poor ActionScript coding standard was that indexing outside an array's bounds in ActionScript grows it, which is not how it works with std::vector<> in C++. Thus, all these arbitrary limits came about, and going past them would result in undefined behavior (out-of-bounds indexing).

  • Creating a text box with more than 10 lines (this despite the simplified say()/reply() taking in a maximum of 50 lines, and that text boxes clear their contents once they reach 12 lines).
  • Separate from the above, calling the text() command with more than 40 lines of input.
  • Having more than 30 consecutive or concurrent text boxes.
  • Having a script line (simplified or internal) with more than 40 parameters (the command counts as one parameter).
  • Entering a room in a custom level with more than 50 script boxes.
  • Entering a room in a custom level with more than 100 room text.
  • Having more than 200 entities existing at once.
  • Having more than 500 blocks existing at once.
  • Running a custom script through the simplified-to-internal parser that outputs more than 500 internal lines.
  • Opening a custom script with more than 500 lines in the script editor.
  • Loading a custom level with more than 500 scripts.
  • Even loading a custom level with exactly 500 scripts.
  • Loading a custom level with more than 3000 placed entities.
  • Calling ifwarp(), warpdir(), showcoordinates(), hidecoordinates(), or ifexplored() with an X or Y which, after both are combined to a room index, is less than 0 or greater than 399.
  • Calling foundtrinket() with a trinket index less than 0 or greater than 99.
  • Creating a trinket, coin, or crewmate with an ID less than 0 or greater than 99.
    • And collecting a trinket, coin, or crewmate with an ID less than 0 or greater than 99.
  • Calling ifflag() or customifflag() with a flag number less than 0 or greater than 99.
    • Surprisingly enough, flag() actually did have a bounds check, and could never commit undefined behavior.
  • Calling play() with a number less than 0, if you don't have an mmmmmm.vvv, or if you do have an mmmmmm.vvv but have your soundtrack switched to MMMMMM.
  • Calling playef() with a number less than 0 or greater than 27.
  • Drawing a tiles.png or tiles2.png tile number less than 0 or greater than 1199 (can be done in custom levels by entering a room containing such a tile number).
  • Drawing a tiles3.png tile number less than 0 or greater than 899.
  • Drawing an entcolours.png tile less than 0 or greater than 719.
    • This can be done by placing a checkpoint on a disappearing platform right above some spikes, then spawning on the checkpoint and keeping dying on the spikes, and letting the tile in the platform increment until the game crashes, which can take several minutes or half a minute depending on which tileset and tilecol your room is.
    • It can also be done by going to any room that has conveyors in Outside Dimension VVVVVV in a custom level.
  • Drawing a sprite with a sprite number less than 0 or greater than 191.
  • Loading any custom level file (because the XML buffer is not null-terminated).
    • Because of this, even merely loading the levels list results in out-of-bounds indexing.
  • On top of that, starting a custom level from the beginning also commits out-of-bounds indexing when finding the start point.
    • The start point is still unnecessarily searched for when loading a quicksave, so loading a quicksave still commits out-of-bounds indexing...
    • Only starting a level from the editor doesn't do this.
  • Left-clicking in the editor at all.
  • Pressing backspace with no custom scripts in the script list.
  • Having any blank lines in any script in a loaded custom level will cause out-of-bounds indexing, in one case after unloading said level (by loading any level), and in another after loading a script with such a blank line.
  • Dying in Outside Dimension VVVVVV in a room that's outside the array that keeps track of your room deaths in Outside Dimension VVVVVV.
  • Having no player entity existing (can be done by doing the Gravitron fling glitch).
  • Having no teleporter existing when the game expects it to.
  • Having no companion existing when the game expects it to.
  • Loading a level with a map size less than 1x1 or greater than 20x20. The undefined behaviors here would happen basically everywhere.
  • Starting or continuing a custom level that has no start point.

Version 2.3.1

This was a bug fix update released on 1 September 2021 fixing some issues found after 2.3's launch.

  • VSync was made enabled by default when starting 2.3 for the first time.
  • A bug was fixed where returning from the options menu would always invalidate a Flip Mode run even when in Flip Mode.
  • Minor fixes were done for the official build systems.

Version 2.3.2

This was a bug fix update released on 3 September 2021 fixing more issues found after 2.3's launch.

  • A message was added for when the player was kicked out of the Super Gravitron due to having invincibility or slowdown enabled.
  • User-initiated map menu changes during the menu bringing-up/down animation were prevented, preventing a possible softlock.
  • The cutscene bars timer was made to always tick during teleporter mode, fixing a regression.
  • The gamemode(teleporter) animation was made to always start from nothing, even if already in teleporter mode.

Version 2.3.3

This was a bug fix update released on 4 September 2021 fixing even more issues found after 2.3's launch.

  • A bug was fixed where musicfadeout()+play() would immediately start playing the next track instead of waiting for the music to fade out.
  • A regression from 2.3.2 was fixed where the map menu would be permanently blocked after closing it, depending on the player entering a room with a room name.
  • The embedded .ico file in VVVVVV.exe was updated so that it is no longer possible for it to display the Adobe Flash player icon.

Version 2.3.4

This was a bug fix update released on 10 September 2021 fixing issues found after 2.3's launch.

  • A bug was fixed where the player could stick the teleporter menu in a cutscene by pressing enter on the very first frame it would take to go down.
  • Cutscene bars, silenced music, and the advance text prompt were made to go away if the player pressed R to interrupt a trinket collection prompt cutscene by respawning in a different room and not having entered Comms Relay.
  • A regression was fixed where muting the game audio fully via pressing M would not result in the music coming back after a trinket or custom crewmate collection prompt cutscene ended.
  • A regression was fixed in custom levels where platv values outside the map size in levels smaller than 20x20 would be written as 67372036.
  • A bug was fixed where music would not be silenced during a trinket or custom crewmate collection prompt if the music was fading in during that time.
  • The player's Super Gravitron record and rank and best game deaths were fixed to now be properly reset when clearing all game data.
  • A bug was fixed where exiting the level editor music change menu by pressing escape would not fade out the music.
  • A regression was fixed where entering playtesting while a track was fading out (by exiting out of playtesting with a track playing and then immediately entering back in with the level's start music set) would result in no music.

Version 2.3.5

This was the second-to-last bug fix update released on 21 December 2021 fixing issues found after 2.3's launch.

  • A bug was fixed where Pauli Kohberger's name in the end game scrolling credits (under Beta Testing) would stop being drawn too early.
  • A bug was fixed where winning in No Death Mode with one trinket collected would say "One trinkets" instead of "One trinket".
  • A regression was fixed where - Press <button> to Teleport - had an extra space at the end.
  • A bug was fixed where the elephant rooms stitched together would not properly stitch together the elephant. [Images: before, after]
  • A regression from 2.3 was fixed where moving platforms (that are actually moving) turned invisible by destroy(platforms) would only stop when hitting a wall instead of stopping immediately.
  • A bug was fixed where you could play the game in a reset glitchy state by deleting main game save data while in in-game options, because it sent you back to the main menu.
  • A regression was fixed from 2.3 where deleting main game save data set your best game deaths to 0, so it gave you all the achievements.
  • Centiseconds were added to the time trial timer and in-game timer.
  • Text outline was added to trophy text and "NO SIGNAL".
  • A bug was fixed where the in-game timer went away after playing the Super Gravitron.

Version 2.3.6

This was the last bug fix update released on 22 December 2021 fixing issues found after 2.3's launch.

  • A bug was fixed where deleting save data while in-game took you to an empty main menu, softlocking you. Deleting save data in general no longer takes you back to the main menu.
  • Errors from LodePNG are now checked, meaning that weirdly-formatted graphics files can no longer crash the game.


  • On 30 March 2021, a beta based on intermediate commits of 2.3 was released on Steam, and was updated periodically as 2.3 development continued.[1]
  • Version 2.3 is the first major version to be released in 7 years, where 2.2 was released on 11 June 2014.
  • Version 2.3 is the first version to have its source public, with most changes being made by contributors on GitHub.
  • Info Teddy has contributed the most to Version 2.3, at a total commit count of 1,472 commits on 31 August 2021.[2]
    • Due to doing most of the work, she was compensated by Terry.