VIVIDLOPE

VIVIDLOPE

Not enough ratings
Creation of Custom Levels
By jaklub
This is an introduction to the process of Custom Level creation.
   
Award
Favorite
Favorited
Unfavorite
Introduction
VIVIDLOPE allows you to play two types of Custom Levels, mainly differing in where they're loaded from:
  • Workshop Levels - these are the Levels you have subscribed to in the Steam Workshop.
  • Local Levels - these are the Levels you have installed along with your local save.
Main menu of the game lets you play these Levels through the Custom option. The Custom option will not appear if you have no Custom Levels.

As you make a Custom Level, it will be listed along with your Local Levels first. Uploading it to the Steam Workshop is done at the very end of the process.

As a note, be aware that the Level Editor is an ex-development tool and has very few safety checks - you will be able to create buggy Stages if you're not careful. (Or that might be what you're looking for, if you want to have fun with some janky stuff!)

Some more warnings regarding the editor:
  • Only 16:9 screen ratio is correctly supported.
  • Gamepad controls are not available outside of testing - you will have to use a mouse and a keyboard.
  • Only English language is supported.
Creating a new Level - Local Level management
After entering the Level Editor, you will see a screen that looks like this:



This is the Level selection screen. Here you can create brand new Levels and load the older ones that are in your %Appdata%/Local/VIVIDLOPE/custom directory. Renaming Levels has to be done manually in that directory - Levels consist of multiple files with different extensions, so you'll have to alter them all. The naming pattern is simple - all files belonging to one Level have the same core name along with a different extension or _xx number suffix.

Click anywhere with the right mouse button - you will be prompted to enter a filename for your new Level. Use something consisting of simple alphanumericals and _, like for example "stage_1" or the default the editor will give you. Don't stress too much about what to use - the filename will be overridden when the Level is uploaded to Workshop. Confirm your choice by clicking OK or pressing Enter.

The guide will refer to you chosen filename as {levelname} in later sections, but this will only become relevant in advanced sections.

If you want to go back to main menu, return to this screen and press Esc.
Level properties
After creating a new Level, you'll be taken to the properties screen.



The top part of the menu concerns Level properties that are shared between all the Stages. Everything below the Stage picker and above the assorted screen test buttons concerns the specific selected Stage.

Level properties

Title - This will be used as the title of your Level in the Level lists ingame and in the Workshop.

Author - Author of the Level, used underneath the title of the Level in the list. Will be replaced with your Steam data if you upload the Level to workshop.

Description - Description, used after choosing the Level in the list and in the Workshop. Can be very long - consider preparing it in a notepad app first, then copypasting it into the prompt.

Level Title - The name that will be used in the Level Intro. Click "Test Level Intro/Select" to see how it will look in action.

Congrats - The title that will be used in the Level Clear screen. Click "Test Congrats" to see it in action.

Congrats (S) - Replaces the congrats text if the player got S, S+ or V on all the Stages.

Congrats (V) - Replaces the congrats text if the player got V on all the Stages.

Fortune Cookie - Flavor text to be used in the Level Intro screen.

Music - Music that will be played in the Level, in all the Stages.

Fruit - Bonus Fruit that will be used in the Level, in all the Stages.

Difficulty - Whether or not the player should be allowed to choose the difficulty or it should be locked into either Easy or Hard - in case if you want tight balance in your Level.

Theme Color - The color that will dominate the Level Intro, Stage Select and Level Clear screens. You will be prompted to manually type in the red, green and blue color components in 0-255 range. If you want to pick your color precisely, you can use even MS Paint and get the colors live below.
pppp

Stage Picker

Allows you to add new Stages and move them around with "Move stg. L" and "Move stg. R" buttons next to the "Theme Color" button. You can select and open an existing Stage if you click it. You add new Stages the same way - you click a blank slot.



Stage properties

Codename - Unused anywhere but this screen. You can add a note for yourself if you want.

Select Name - Short name used in the Stage Select screen. Click "Test Level Intro/Select" to see how it will look in action.

Name - The actual name of the Stage. Displayed when the Stage starts.

Subtitle - Will be displayed above the Name. Can be blank.

Pattern - Coloring pattern of the Stage. This decides whether you need to step on tiles once to win, or step on tiles twice, if they revert.

Target % - The % needed to get into the Bonus Phase. If set to 100, there will be no Bonus Phase in this Stage.

Fruit 1 % and Fruit 2 % - The % needed for the Bonus Fruit to spawn. 2 needs to be between 1 and Target %.

Background - ID of the background used in this Stage. BG Viewer in the Extras menu of the main game has them.

Enemy speed scalar - alters the speed of enemies. All Blob-derived and Mole-derived enemies will be affected.

Small enemy limit - alters the limit of small enemies. Once hit, small enemies will no longer spawn on portals, however, they will still be able to spawn from Popup tiles. Following enemies are classified as "small":
  • Wobbler
  • Giraffe
  • Seeker
  • Spectre
  • Blob
  • UFO
  • Stinker
  • Gem
  • Stopper
  • Remover
  • Fuse
  • Blib
  • Ace
  • Clover
  • Spark-kun
  • Capsule
  • Crescent
  • Spiral
  • Flub
  • Vlad
  • Star
  • Mole
  • Mole Mage
  • Hypermole
  • Marble

Standard enemy limit - alters the limit of standard enemies. Once hit, standard enemies will no longer spawn on portals, however, they will still be able to spawn from Popup tiles. Following enemies are classified as "standard":
  • Blub
  • Parrot
  • Sun-san
  • Strongman
  • Leaper
  • Slinky
  • Arachnid
  • Snake
  • Draco
  • Gero
  • Nooter
  • Octi

Spawn queue - every Stage has a predetermined order of things that will drop onto the portals This button lets you set up that order. Note that within the editor you'll be limited to 48 entries - if you need more, you'll have to edit the Level file manually.

Specific enemy limits - like the other limits, except applicable to one kind of enemy only. Note that even when a specific limit is set, an enemy is still bound to small/standard limits.

Edit Stage geometry - this button lets you actually edit the Stage layout.

Test Stage (Easy) - lets you play through the Stage on Easy difficulty as Cerise.

Reload Custom Sprites - allows you to reload custom graphics bundled with your Level. This will only become relevant in a much later section.

Test Stage (Hard) - lets you play through the Stage on Hard difficulty as Cerise.

Reset Stage geometry - allows you to completely reset the Stage layout, removing all tiles and entities in it.

Delete Stage - allows you to delete the Stage altogether and remove its entry from Level's list.

Bottom stuff

Test Level Intro/Select - runs the Level Intro into Stage Select sequence.

Test Congrats, Test Congrats (S), Test Congrats (V) - runs the Level Clear sequence with given messages.

Validate & Save - saves the Level after checking for some fatal errors.

Exit - return to the Level list.

Set Workshop Preview - lets you set up the Steam Workshop thumbnail. The thumbnail should be of 4:3 ratio, recommended size 640x480, and should have a width between 256 and 2048.

Upload to Workshop - does the actual uploading to Workshop. If the Level has not been uploaded before, its entry will be created, if it was, it will be updated. Level's Author will be set to your Steam name.
Creating a basic Stage
Click the Edit Stage geometry button. You should see a screen that looks like this:



Most controls from this point are handled using the keyboard. Since there's only one tile, there's not a lot of space to move around on. To add some tiles, use the WASD keys. After that, you can move your cursor around with the arrow keys.

Note: You don't have to tap WASD keys for each tile - you can just press and hold, then move around with arrow keys.

Note 2: Press F1 for quick help.



Made a mistake? No sweat. You can delete tiles adjacent to your cursor with IJKL keys.



An important concept to understand is bending. In the top-left part of the screen, you can see the Target bend value. This decides the angle between the tile the cursor is on and a tile newly created with WASD keys. You can change the Target bend value using digit keys (1-7, 0) - most of them will set it to a preset value (0 degrees, 22.5 degrees, 45 degrees, etc.), while 0 (zero) key will let you enter your own.

Let's start simple. Press the 2 key to set bend to 45 degrees inwards, then go to the edge of the Stage and add some tiles.



As you can see, the new tiles have been created at an angle, pointing down - "inwards", towards the ground. Let's do it again.



Now, press 1 and make some more tiles down there.



We've made a tiny wall shape under our main platform - now it's a very basic looking Stage. Let's move on to the next part - tile types. Press Numpad 7. You should see the screen below.



These are the tile types available to you. Setting special tiles on the Stage is simple - first, you use this menu to select a type, then you paint it under the cursor with Numpad 8 key.
Now, there's only one type that you absolutely have to have on your Stage, and that is the Player Start (or its sibling type Player Start Unm.). The game will place the player character on this tile, then that tile will revert to either a standard tile or unmarkable tile depending on what you've chosen.

Important note: While it's not relevant right now, you should know that you don't have to tap the Numpad 8 key for each tile you want to change the type of - you can just press and hold that key, then move the cursor around with arrow keys, spreading round the tile type you want.

Add exactly one Player Start tile to your Stage. If you make too many, you will get errors when playing or testing the Stage - in case of a mistake, select the Standard tile type and remove the excess Player Start tiles.



Now, while technically you'll be able to test and play the Stage without any portals, a Stage will be incomplete without them. Move the cursor to another spot, press Numpad 7 again to bring the tile type menu, select Enemy Spawn 1 and place it with Numpad 8 key.



Good news - you've just made a Stage. If you press F6, then click Test stage (Easy) or Test stage (Hard), you'll be playing it in seconds!

Tile shape alterations
Most of the time you'll be working with basic square tiles. However, adding something more twisted to your Stage is a great way to shake things up.

Brushes



Brushes are tiles of predefined specific shape. Press E to bring up the brush selection menu. Just click one of the brushes - if it has any parameters, you'll be prompted - and you'll be able to place it around with WASD keys. When you're done, you can either go back to the Basic brush through the same menu or set the Target bend value with one of the digit keys, which also reverts the brush.



Important note! There are no safety checks around your placement of tiles - you will not be prevented from placing overlapping and glitchy looking tiles.

Important note! 2 It is highly recommended to use brushes only when cursor is on top of a basic square tile. If you're not careful with placing tiles while on top of brush-created tiles, you might get some wacky stuff.

Shortened tiles

This is a much less fancy looking tool, but one that you'll perhaps be using even more often than brushes. If you hold Q while pressing WASD, you'll create a slightly shorter tile. Unlike brushes, this also works with different target bend values.

You might be wondering what is that for - look at the picture below.



This can add a lot of versatility to your Stage design. To make something like that, you'd first make a shortened tile with 45 degrees target bend, then two shortened tiles with 0 degrees target bend.

OBJ import

A tool for the ambitious. It will override your entire existing Stage geometry. If you press F10, you'll be able to import quads from an .obj file, allowing you to shape the Stage in any way you like.

Your model should consist of quads only, with 2x2 (default size) being an equivalent of a default-sized tile ingame.

To export to .obj in Blender, use these settings:



And that's that - the cursor will be automatically placed on one of the tiles and, in case if the Stage isn't contiguous, you'll be able to access all of the tiles through the Free mode (more on that in a later section).
Setting up the camera
These ways of manipulating the camera will prove useful as you create more complex tile arrangements.

Camera vector

Every tile has an invisible camera vector assigned to it. You can manipulate it with TFGH keys - you'll slightly angle it in a direction, changing the way camera moves on that tile and around it. Press R to reset the vector for the current tile.



Note that if you create a new tile while cursor is on top of a tile with changed camera vector, that vector will be copied over.

GCamera Type

This is a global alteration of camera's behavior. If you press Numpad 1 and click Yes, you'll be prompted to choose one of the following types:
  • Adaptable - this is the default type. Should work fine for most cases.
  • Regular - a more streamlined type that relies on relations between the tiles less, the position of the current tile and its angle have a stronger impact on the camera.
  • Adaptable (slow clock spin) - identical to Adaptable, but with slower adaption to the curved tile arrangements. You'll likely prefer this type if your Stage has a lot of smooth twists and turns, left and right rather than inwards or outwards.
  • Adaptable (no tilt at edges) - similar to Adaptable, but treats edge tiles differently - instead of trying to tilt the camera to show a better overview of the other side of the Stage, it stays straight-angled. You'll likely prefer this type if your Stage has a lot of gaps without tiles and tight passages.

Window setting

Usually, when tiles get in the way between the player character and the camera, there's a magnifying glass sort of thing that still lets you see some of the surroundings of your character. If you find that jarring or unnecessary on the given Stage, you can toggle that behavior by pressing Numpad 1 and clicking No.

Camera center type anchors

More on that in a later section.
Adding props and ledges
Adding ledges

Adding ledges that you can jump off from is pretty simple - just press and hold the Y key and press one of the TFGH keys. If you do it again, you'll remove the ledge in the given direction.

Adding props

To select a prop, press Numpad 2. After you made your selection, press and hold Numpad 3, then press one of the TFGH keys to place a prop angled in the given direction.

Note that if you have a Blank prop selected, you only need to hold Numpad 3 to erase the props under the cursor.
Creating moving platforms
This is possibly the most complex concept in the process of Stage creation.

First, let's talk about zones. Every tile has a zone assigned to it - by default it is zone 0, which is always static. A Stage must have at least one zone 0 tile.

However, you can assign other zones to tiles as well, ranging from 1 to 11 - in total, you have 12 zones in your disposal, 11 of which aren't static.

Zones are painted like tile types - press Numpad 4 to select a zone, then hold Numpad 5 to paint it around.



Note: Most of the time, if you have tiles of two different zones adjacent to each other, you'll want to place ledges between them to prevent janky teleporting behavior - like in the picture above. There's an exception to that rule when you have a swinging rotated part, similar to Story mode's 3-11.

Cursor modes

This has not been relevant up until this point, but the cursor has two different modes.
  • Maze - this is the one you have been in all the time so far. In this mode, the cursor jumps around from tile to tile, and you can make alterations to tiles, place props, etc.
  • Free - this mode lets you fly around without connection to any of the tiles freely.

The key bindings differ between the modes. Press F1 in the editor to know the details - for now, what you need to know is that Numpad 0 lets you switch between the modes.

Use the arrow keys to position your cursor on the edge between the tiles of different zones. You can hold down Enter and press the arrows to move the cursor at half the tile unit.



Anchors

Anchors are points in 3D space. You can place your anchors anywhere you want while in free mode. They come in two flavors:
  • Standard - a standard anchor that is supposed to serve as a reference point for moving platforms.
  • Camera center - decides where the camera center point is, slightly altering the camera behavior. Useful on big Stages when you have more than one Camera center anchor - only the closest one to the player will be active.

Press Numpad 7 to select the anchor slot, then Numpad 8 to place it where your cursor is.



Zone movement

Now that some of the tiles have zone 1 set up and there is an anchor, we can set up the movement of zone 1. While in Free mode, press Numpad 6.



Let's change the type of the zone 1 first. If you click the - in the right row, you'll be prompted for two values:
1. Decide if the zone's behavior is supposed to be altered by a switch. We have no zone switch on the stage, so leave that as 0.
2. Decide the movement pattern.

You can choose from one of the movement patterns:
  • Rotate U/R/O - rotate the zone's tiles around one of the selected anchor's axes. Requires 1 anchor and set up Angle Speed.
  • Translate Linear - move the zone's tiles around without changing their rotation. Requires 2 anchors and set up Time Period. Tiles will be moved relatively from anchor 1 to anchor 2.
  • Translate Sine - like above, but using a smoother movement mechanism. Requires 2 anchors and set up Time Period.
  • Swing Rotate U/R/O - rotate the zone's tiles in a swinging motion instead of completely around the axis - kind of like a fan. Requires 1 anchor and set up Time Period.
  • Swing Translate - a special type for moving tiles around from one point to the other, but only for zone switches. Requires 2 anchors.



In our example case, assuming the slot 0 was picked for the anchor, this is the desired configuration. First anchor staying as -1 is not a mistake.

If you switch back to Maze mode with Numpad 0, then press F6 and test again, you'll see the zone 1 tiles tilt slightly over time.

Advanced customization
It is possible to customize your Levels with brand new music and visuals. This section will go in depth on how to do it.

Basics

A bulk of advanced customization is done outside of the editor. Recall from the earlier sections the path to the Local Level files:
%Appdata%/Local/VIVIDLOPE/custom
along with the filename you have chosen for your Level, which will be noted as {filename}.

Observe that your Level consists of two files: {filename}.vle and {filename}.vlp.

Music

Custom music can be included with the Level, overriding the track chosen in properties. The track will be looped start to finish.

The process is simple. Just convert your music file to .ogg format, rename it to {filename}.ogg and paste it alongside your other Level files. Your custom directory should look similar to this:



You should now be able to hear your track when playing or testing the Level.

Custom graphics

Custom Bonus Fruit, tiles and backgrounds all use graphics from a shared pool. You can bundle .png and .jpg files along with your Level - you can include up to 100 files, named {filename}_{x}.png or {filename}_{x}.jpg, where {x} is a number ranging from 0 to 99. The graphics will be identified by the {x} number. Take a look at the example below:



Note that only one graphic file should belong to one number within one Level. For example, mylevel_0.png and mylevel_0.jpg will cause one of the graphics to go unused.

Custom Bonus Fruit

You can assign one of the graphics slots to be the Bonus Fruit in your Level. To do this, make sure the Level is not opened in the editor first (so that the file won't get overwritten), then open {filename}.wle and search for custom_fruit entry. Edit that from -1.0 to your slot's number (e.g. 2.0 if you chose slot 2).


Note: If you assign a graphic to the Bonus Fruit, you should not use it elsewhere - the game will process it after loading to be used as the Bonus Fruit and it might not work correctly in other contexts.

Custom Stage theme

You can override the BG settings of your Stage with your own customized background. To do this, create a {filename}_{x}.vlb file in the custom directory and open it in the text editor of your choice. {x} is the number of Stage this file should belong to within the order, so it should be in 0-19 range.

As to what the file needs to contain, refer to the snippet below. Comments are marked with //, also note that most of these fields can be skipped and default values will be used.
{ "version":"1", // Version number. Always leave it as "1". // Assorted tile properties are stored inside. "tiles":{ // Reference to the custom graphic containing the color palette of this stage. // Defaults to the palette of the background set in the editor if not assigned. "palette_sprite":1.0, // Which line contains the palette. Lets you keep more palettes in one graphic. "palette_row":0.0, // Which custom graphic contains the standard tile texture. // The graphic file has to have 64 pixels height and a multiple of 128 pixels width. "texture":2.0, // Animation speed of the tile if there's more than one frame. "texture_animspeed":0.5, // Base color of the shadows (on advanced shadow setting). // As you can see here, colors are tables of 3 reals. [255.0,255.0,255.0] is perfect white. "shadow_color":[32.0, 32.0, 64.0], // How much of shadow_color is mixed with tile top color for the actual shadow color. "shadow_color_factor":0.8, // Underside colors work a lot like shadow colors, but in 2 steps. "underside_color0":[0.0, 0.0, 255.0], "underside_factor0":0.3, "underside_color1":[96.0, 48.0, 96.0], "underside_factor1":0.3, }, // Lighting parameters. "light":{ "base_0": 0.3, "base_1": 0.6, "range_0": 1.7, "range_1": 0.8, "rim_strength": 0.6 }, // Screen-position based gradient color multipliers. "gradient":{ // Scalar for tile color's red component used at the very top of the screen. "top_r_multiplier": 1.1, // Scalar for tile color's green component used at the very top of the screen. "top_g_multiplier": 1.4, // Scalar for tile color's blue component used at the very top of the screen. "top_b_multiplier": 1.7, // Scalar for tile color's red component used at the very bottom of the screen. "bottom_r_multiplier": 0.8, // You should be able to figure these out now. "bottom_g_multiplier": 0.7, "bottom_b_multiplier": 0.6, }, // Reflection properties. Defaults to no reflection if this is absent. "reflection":{ // Type of the reflection. Allowed literals: add, multiply, simple, none "type":"add", // Mirroring parameters of the background. Should be either -1.0 or 1.0. "scalar_x":-1.0, "scalar_y":1.0, // Base color component values from which the reflection is calculated. // Unlike specific color entries, this ranges from 0.0 to 1.0. "hook_r":0.8, "hook_g":0.8, "hook_b":0.8, // Scalars used to determine the strength of the reflection. // Generally, the higher this is, the stronger it gets. "scale_r":0.2, "scale_g":0.2, "scale_b":0.2, // How much the source background should be grayscaled before it's turned into reflection. "grayscale_mix":0.5 }, // Stage glow properties. "glow":{ // Color of the glow. "color":[255.0,0.0,255.0], // Blending mode of the glow. // Use normal or add literals, everything else will likely be glitchy. "blend":"add", // Alpha multiplier - mainly for normal blending, so the glow is more visible. "alpha_multiplier":1.0, }, // Background layers! // More on the types in the dedicated section. "layers":[ { "type":"fisheye", "scroll_x":-0.0001, "pull":1.5, }, { "type":"overlay", "sprite":0.0, "color":[128.0, 128.0, 255.0], "alpha":1.0, }, { "type":"fisheye", "scroll_x":0.0001, "pull":0.2, }, { "type":"overlay", "sprite":0.0, "color":[192.0, 192.0, 255.0], "alpha":1.0, "blend":"add", }, { "type":"fisheye", "scroll_x":0.00012, "scroll_y":0.00012, "pull":-1.2, }, { "type":"glitter", "color":[255.0, 255.0, 255.0], "alpha":1.0, "sprite":"love", }, ], }
Custom background layer types
  • "overlay" - the basic type. Just displays an image on the whole screen. Parameters:
    "sprite": either a real value referring to your custom graphic of choice or a string referring to an existing graphic in the game "color": tint of the image, use white for no color alteration "alpha": alpha of the image, range from 0.0 to 1.0, defaults to 1.0 if not specified "blend": blending mode of the image, most often used values are literals "normal", "add" and "max", defaults to "normal" if not specified

  • "fisheye" - enables a fisheye effect for the layers that follow it. This is your main movement tool. Parameters:
    "res_w": base resolution width, you won't need to touch this unless you're going for a specific effect, defaults to 1280.0 if not specified "res_h": base resolution height, you won't need to touch this unless you're going for a specific effect, defaults to 720.0 if not specified "scroll_x": horizontal scrolling speed. use a very small (e.g. 0.0001) real value for a simple linear scroll or a 3 real entry array [distance, angle_offset, angle_multiplier] for a sine swinging motion "scroll_y": same as above, but vertical "pull": strength of fisheye effect, real value with default 0.1 if not specified. can be positive, can be negative, but usually you'd stick to values from 0.0 to 0.5 range "pull_normalize_x": how much the fisheye effect should be reduced on a horizontal axis. defaults to 0.0 if not specified "pull_normalize_y": same as above, but vertical "camera_affect_x": how much should the layer tilt horizontally depending on the camera movement. defaults to 1.0 if not specified "camera_affect_y": same as above, but vertical "zoom": how much should the texture be zoomed in or out - the larger value it is, the smaller your texture will be. defaults to 1.0 if not specified "uv_multiplier_x": pretty much like zoom, but only horizontally, can be negative, defaults to 1.0 if not specified "uv_multiplier_y": same as above, but vertical

  • "wavy" - this is the same as fisheye, but with more parameters for possible wavy effects. Parameters:
    All fisheye parameters apply. "x_amplitude": the amplitude of the wave, you'll want a small value like 0.01, defaults to 0.0 if not set for disabled motion on this axis "x_time_multiplier": the speed of the wave, same as above - you'll want a small value. the larger it is, the faster it goes. defaults to 1.0 if not set "x_length": the length of the wave, again - small values, though a bit bigger maybe - you'll see it when you play around. the larger it is, the less waves you'll be making. defaults to 1.0 if not set "y_amplitude": same as "x_amplitude", but vertically "y_time_multiplier": same as "x_time_multiplier", but vertically "y_length": same as "x_length", but vertically

  • "margin" - similar to "overlay", but designed for lighting effects you'll use with blending modes - it's slightly zoomed in. Parameters same as "overlay".

  • "glitter" - creates a flurry of spinning stars, you'll know which ones.
    Parameters:
    "blend": blending mode of the stars, most often used values are literals "normal" and "add", defaults to "normal" if not specified "alpha": alpha of the stars, defaults to 1.0 if not specified "number": number of the stars, should be between 1.0 and 128.0, defaults to 32.0 if not specified "scale_min": minimum size scalar of the stars, defaults to 0.08 if not specified "scale_max": maximum size scalar of the stars, defaults to 0.4 if not specified "sprite": sprite used by the stars. defaults to "normal" if not specified, accepts literals: normal, love, circle, shine "x_transform": how x value is mapped onto x,y coords on the screen, must be an array of 2 reals if specified, defaults to [1.0, 0.0] if not specified "y_transform": same as above but for y, defaults to [0.0, 1.0] if not specified

  • "reset" - disables the effects of "fisheye" and "wavy" layers. No parameters.

Popup ID reference
For parametrizing Popup tiles.
0 - dud;
9 - powerup_extra_life;
10 - powerup_bomb;
11 - powerup_impact;
12 - powerup_paint_burst;
13 - powerup_dash;
14 - powerup_stamphammer;
15 - powerup_breadcrumb;
16 - powerup_dodge;
17 - powerup_paint_balloon;
18 - powerup_wrap_paper;
19 - powerup_superjump;
20 - powerup_instant_bomb;
21 - powerup_hotstep;
22 - powerup_shield;
40 - enemy_blob;
41 - enemy_blib;
42 - enemy_blub;
43 - enemy_gem;
44 - enemy_star;
45 - enemy_wobbler;
46 - enemy_giraffe;
47 - enemy_flub;
48 - enemy_stopper;
49 - enemy_slinky;
50 - enemy_leaper;
51 - enemy_strongman;
52 - enemy_ace;
53 - enemy_fuse;
54 - enemy_prodigy;
55 - enemy_octi;
56 - enemy_spectre;
57 - enemy_sunsan;
58 - enemy_mole;
59 - enemy_molemage;
60 - enemy_hypermole;
61 - enemy_spiral;
62 - enemy_clover;
63 - enemy_kuso;
64 - enemy_remover;
65 - enemy_marble;
66 - enemy_crescent;
67 - enemy_arachnid;
Uploading to Workshop
When you're done with your beautiful Level, you can share it with the world through Steam Workshop. First, load the thumbnail, then click the upload button. Just make sure you test it thoroughly before you do that!

NOTE: As of 1.4.1, the game will crash after uploading due to technical issues. Don't fret, this is expected and harmless aside from being an annoyance - check Steam to see and manage your newly uploaded level.

Please reach out if you have any questions, preferably via e-mail (jaklub@gmail.com) or Steam community - I'll do my best to answer.

Have fun!
16 Comments
Doper 11 Aug, 2023 @ 8:19pm 
Oh I get it now! Thanks for the help!
jaklub  [author] 11 Aug, 2023 @ 5:17pm 
@Doper The background image is decided by the "sprite" parameter of the "overlay" typed layers. This needs to be a number - e.g. if you have a file "customlevel_3.png", you'll use "sprite":0.0, while if you want to use, say, "customlevel_3.png", you'll use "sprite":3.0 value instead.
Doper 9 Aug, 2023 @ 7:26pm 
I'm pretty confused on what indicates which image will be used for the background of a stage. I went through the guide quite a few times, but still don't really get it. In my case, the game just uses the background image I numbered as "_0", and no other image after that. Even after making a second vlb with everything correct. It probably is something obvious, but I have no coding knowledge. So any help would be appreciated.

Thanks in advance.
jaklub  [author] 24 Jul, 2023 @ 2:56am 
@WalterWhite You might have more than 1 player start tile on the stage, which is not allowed.
WaterWhite 23 Jul, 2023 @ 4:28pm 
i keep getting "A stage with no singular player start tile cannot be saved. Cannot save the level." even tho i have a player spawn tile
jaklub  [author] 22 Jul, 2023 @ 2:33pm 
@Apeirobyte
1. Nope.
2. There's a thread on a memory leak, might be a similar issue, but also might be separate, since the game survived hundred strong reload stress tests with normal stages. Will take a look.
3. It could be interesting, but probably won't happen too soon.
Apeirobyte 22 Jul, 2023 @ 12:34am 
1. Is there any way for custom music to have an intro that gets skipped when the song loops?
2. Are you aware of what I suspect to be a memory leak that happens when editing a large stage after playtesting it?
3. Are there any plans to add more tiles, props, and enemies?
jaklub  [author] 18 Jul, 2023 @ 4:23pm 
@Egyptian Bagel Something's not right with the background file. It needs to be the json file and the one shown in this guide won't work as is (the format doesn't actually support comments - they're here for preview purposes). Here's an example file you could use as a starter - keep in mind you'll need to make sure your custom sprites match or edit relevant sections.
https://hastebin.com/share/onayoyuhec.ruby
Big Sloppie 16 Jul, 2023 @ 9:39pm 
What causes this?

---------------------------
An error has occurred while parsing the background file:
{ longMessage : "ERROR in
action number 1
of Other Event: User Defined 15
for object obj_control:


JSON parse error
at gml_Script_bg_custom_try_load
", script : "gml_Script_bg_custom_try_load", stacktrace : [ "gml_Script_bg_custom_try_load (line -1)","gml_Script_custom_stage_try_apply_custom_background","gml_Object_obj_control_Other_25","gml_Object_obj_control_Alarm_7 (line -1)" ], line : 0, message : "JSON parse error" }
---------------------------

This is for the levelname_0.vlb file. It does this even if there's nothing in the file or using the template provided.
jaklub  [author] 16 Jul, 2023 @ 3:02pm 
@blox9000 Noted, thanks.