Custom level format

From Viki
Jump to navigation Jump to search
Example .vvvvvv file open in a text editor

The custom level format is the format with which VVVVVV stores and interprets user-made levels. The format is XML-based and can be opened in a text editor, such as Notepad, as well as the game's own level editor or Ved. The extension for these files is .vvvvvv.

All relevant data for levels lies within the <Data> tag, itself a child of an otherwise empty <MapData> tag. The <MapData> tag also has a version attribute, which is always set to a value of 2.

Contents of “Data”

Contents of “MetaData”

These tags define metadata which is displayed when selecting a level in the custom levels list, as well as in the “CREW” section of the pause menu (substituting for the normal list of missing crewmates from the main campaign).

Tag(s) Description
<Creator> Intended for displaying the name(s) of the level's creator(s). It is displayed underneath the title, and is prefixed with "by" prior to version 2.4, and with a Viridian head in 2.4 and later.
<Title> Intended for displaying the level's title. It is shown above all other metadata at double font size, as well as in the levels list itself.
Unused. <Created> and <Modifiers> always have a value of 2.
Intended for displaying the level's description; each tag is on its own line. These are displayed under all other metadata.
<website> Intended for displaying the URL of the author(s)' webpage. It is not actually an interactable element in-game, being mere plain text like all other metadata, and can be used to display any information desired. It displays under the creator(s)' name.

Other contents

Tag(s) Description

Define the size of the map in rooms. The default value for both is 5 when creating a new map.

The game limits maps to a maximum size of 20×20; trying to exceed this limit manually with a text editor will cause glitchy behaviour when reading the invalid rooms.

<levmusic> Defines the music track that will play when starting a level for the first time. The tag itself uses internal song IDs, while the level options menu displays the IDs used with the simplified music() command; see List of music tracks for a list of these.

Contains a list of every tile comprising the level, separated by commas. There is no differentiation between rooms in this list; instead, the entire map's tiles are defined left to right, top to bottom.

As opposed to <levelMetaData>, the length of this list depends on the map size; a 1×1 level will have 400 tiles in total, and a 20×20 level will have tiles.


Contains a list of editor entities as <edentity> child tags, with tag attributes defining each one's properties.

  • x and y: The position of the entity, in pixels, relative to the entire map.
  • t: The entity's type.
  • p1 through p4: Numerical properties used in various ways by each entity.
  • p5 and p6: Always set to 320 and 240 respectively.

Contains a list of room attributes as <edLevelClass> child tags. The tag contents store each room's roomname; the tag attributes define everything else. There are always 400 of these tags regardless of the map's size.

  • tileset: The room's tileset; 0 for Space Station, 1 for Outside, 2 for Lab, 3 for Warp Zone, and 4 for Ship. Rooms with a tileset of 0 will use tiles.png, while any other value will use tiles2.png. This value otherwise only affects tile placement in the editor.
  • tilecol: The room colour; each tileset has its own set of colours.
  • platx1, platy1, platx2, platy2: Platform bounds, defined as a rectangle in pixels. While both VVVVVV and Ved lock these values to an 8×8 grid, the game will honour sub-tile values just the same.
  • platv: Platform speed, 4 by default. A value of 0 can be used to have non-moving platforms.
  • enemyx1, enemyy1, enemyx2, enemyy2: Enemy bounds, defined the same as those for platforms.
  • enemytype: The sprite used for enemies placed in the room.
  • directmode: Whether the room uses Direct Mode for tile placement; affects the editor only.
  • warpdir: Room warp direction; 1 for horizontal wrapping, 2 for vertical wrapping, 3 for wrapping in all directions, and any other value (default being 0) for no wrapping.
<script> Contains the level's scripts, as a single string in the tag's contents. Line endings are defined with a pipe character (|); lines that end in a colon (:) are treated as the script ID, ending the previous script if applicable.