Boundworlds: A user-created patchwork universe

Boundworlds: A user-created patchwork universe

IndigoFenix's picture

This is an HTML5 reboot of a Flash project I was making a couple of years back.  I call it the Patchwork Universe Project, or Boundworlds.

It is a "massively single-player" world-building game that focuses heavily on user-generated content.  You play as a nameless wanderer who travels through the Void, passing from world to world.  Each player can create new worlds using uploaded graphics or sound, and create "Gates" that allow passage from one world to another.

There is an elaborate scripting system that enables world builders to edit almost any variable, bascially allowing worlds to function as self-enclosed games.  The default physics use an action-adventure system inspired by Zelda.  It is also possible to make 2-d platforming sections (though the default character is not much of a jumper).

While the game is still in a state I would call "playable alpha", it is currently possible to create and save worlds with features like tilemaps that include blocks, pits, ladders, and sidescrolling sections, sprites with basic enemy behavior, dialogue trees, and custom scripted behaviors, change the player into a custom object, and of course, make gates leading to other rooms in your world or other players' worlds.

Things that still need to be completed before I consider the game to be in beta proper are a custom attack creator, a more solid control scheme (keyboard limitations make targeting, moving, and attacking at the same time a bit tricky), semi-random tag-based gate locating, NPC pathfinding behavior, background layers, and a persistant item system which will be used to save data across multiple sessions.  Also some more elaborate systems like a quest generator that links appropriate worlds together, allowing, say, one player to design an overworld that has a dungeon entrance in it, and a script that tells the game to place a random but appropriately-themed dungeon created by another player there.

The player character may need a new sprite as well; the current one was from the old game which didn't include sidescrolling sections.  A shorter, more square hitbox may be easier to platform with.  Graphics for 8-directional movement (which also didn't exist in the original) would also be a nice touch, though artwork for that is harder to find.

I'm expecting that a lot of players will want to use open art sites like these to add content, so I've got to work out exactly what the licensing should be; I might just make the whole thing open-source.  I'm also hoping it will be an opportunity for game artists that don't have the time or patience to create a whole game to show off their work by creating small "mini-worlds" that utilize their graphics.

So anyway, tell me what you think, give suggestions, and enjoy!


In-game controls (subject to change)

Shift: Target enemies (automatically attack targeted enemies on contact)
Z: Dash (automatically jump over 1-tile pits)
C: Jump (or fly if you turn into a flying creature)
Space: Check/Talk/Interact
Escape: Pause
Q: Status Menu (currently just lets you go back to the main menu) 


World Building Tutorial

Worlds are made up of rooms, rooms are made up of layers, and layers are made up of tilesets, sprites, and gates.  (Since you can't add backgrounds or move between layers yet, there's no real point to adding more than one layer).

Gates are entrances to rooms; you place one by clicking in the game window.  You can use them to test out your world while in the world builder.  They have numerous properties, most of which are placeholders, but if a Gate has "exit" checked, you can use it to link to another Gate, in your world or another player's.  You can designate multi-tile Gates by holding the shift key.  Designating a Gate as "public" will allow other players to reach it through the main menu or make links to it.  To make a gate that leads off of an edge (i.e., is not simply a tile you appear on), give it the type "walk" and also give it a direction, which determines where it will place the player when they enter the room.

After creating a room, click and drag to move the window around
You can't upload images yet, but you can link to them by typing the URL under the image editor
The little blank tile under the a tileset image lets you select a "blank" tile (i.e. delete).  Technically a blank tile is also a tile, so it can be given properties.  You can make all blank tiles pits for instance.
You can place multiple tiles at once by holding shift.
If you use multiple tilesets in one layer, all of their properties are added up.  Keep this in mind if you designate blank tiles as pits; this will cause any tiles that are blank in any tilesets to be considered pits in all tilesets.  Since this is a common issue, the "floor" property cancels out any pits that are on the same tile.  Personally I advise making an invisible tileset to handle collisions for all but the simplest maps.

Sprites have a lot of properties.  Since physics are still being ironed out I won't get into the details of their idiosyncracies, but in general if a value is -1 it means "infinite" when applicable.  (Example: -1 friction means "stop immediately", -1 home range means the sprite is free to roam all over the room, etc.)

Spritesheets can use Charas or RPG Maker conventions for easy 4-way walk animations, or you can customize their animation yourself.

Basic sprite behaviors (like random walking, running into enemies, or saying a single line of dialogue) operate without getting into functions, but you will need to use functions for more complex behaviors like dialogue trees or behavior changes.  Function variables often allow you to define them as expressions by clicking the {} button.  Pre-defined variables begin with an underscore; you can define as many variables as you want for any given object.  While testing your world you can click on a sprite to view its current variables; this is very useful if you want to know what you can work with.  You can also insert expressions into "display" boxes by surrounding them in curly braces.  @ is a special variable that always points to the player sprite.

For example, a Display event with text "Hello, {_game._username}!" will greet the player.  You can figure this out because by clicking on the sprite in game, it will display "_game" as a variable which points to the game.  You can then click on that variable to display the game's accessible variables, one of which is "_username", which returns the user's name if they are logged in.