The Backworlds executable – at least the development version – contains most of the functionality we need to change the design in-place, and this has been how most of the day-to-day development has been done. While the level editor is layered on top of the game and more reminiscent of a cheat mode than an actual editor sometimes, we do have some additional modes for editing things that are not typically present in a single level of the game. The first of these was the world editor.
Way back when we were working on the Backworld prototype, the game took an early 90s platformer approach to progression – you would move an avatar around on set paths on a world map and enter individual levels with puzzles from this mode. We did allow for linking levels together but you had to manually set up how the levels connected and what the relative offset from the floor was – in both directions.
left_level="tutorial0" left_offset="-360" right_level="tutorial2" right_offset="200" up_level="tutorialsecret" up_offset="250"
When we pivoted to a more metroidvania-style connected world, it was immediately obvious that this workflow was not going to cut it so we quickly put together the world editor. This started out as a very simple grid where you could drag rectangles around – since we already had methods for rendering debug graphics to a texture we just used those textures from the beginning.
The world editor contained data about the layout of levels – at first we only used this in the editor itself and had it generate the connections and offsets in the actual level files, but we soon changed the game to poll the layout directly when moving between levels instead of requiring individual levels to have that information.
While the world editor has been around for many years now, it has not seen a lot of development – it does its job well with only moving rectangles around and its area of responsibility is well-defined. Some of the changes we have added over the years, however –
Blank levels was a fairly early addition. While it is nice to have an overview of the world and be able to reason about how levels connect to each other, it does mean that you can no longer cheat with distances and the map must physically make sense. We ended up needing to put in placeholder levels to bridge distances between puzzles or reserve space we needed for levels that had yet to be implemented, these placeholders could also be converted to actual new levels easily.
Changing real level sizes, another issue with levels being forced to adhere to real space was that they had to connect perfectly to each other. This meant having to go into individual levels and do small adjustments to size, or sticking to simple chains where levels did not loop back on themselves – to get around this, we allowed the world editor to change the level sizes directly. This does go into the level file itself, changes the dimensions and saves the file which pushes the boundaries of what the world editor is supposed to handle, but the benefits outweighed the maintenance overhead for the additional coupling in this case.
Cached maps – we quickly realized that using the world editor was a much more convenient way of opening levels than remembering what the filename was as you had a visual representation of what it looked like, so for the most part we were not opening the world editor to change anything but only to jump between different levels. This was convenient, but every time the editor loaded it had to spend time opening all the levels and rebuilding the level texture representation – to get around this we cache the maps now so it only builds all of the textures the first time you open the editor and after that only when a level is updated. As the textures are 1:1 for level pixel sizes this takes up a lot of memory and we later added an option of reducing the size of them when needed.
Rulers were added both to judge distances when building the individual levels and to make sure collision syncs up between neighboring levels. The rulers persist between the level and world editor so you can make reasoned decisions about details of several levels without having them all open in memory. The alternative would be to allow for manipulation of individual physics primitives in the world editor, but that would have been a lot more work and outside of the scope of what the world editor was intended to do.
This was a relatively light update – our world editor has always been a pretty simple system – but rest assured it is because we are working on the game itself. This weekend I have been shoring up controller support and implementing all of our achievements, this in preparation for some heavy testing passes coming up.
A few days late, but happy labor day!