Introduction#

IOLITE aims to make it easy to create fun and responsive voxel games. Let’s start by going over the fundamentals first.

The overall game creation process#

Compared to other game engines or game makers, a single copy of IOLITE does not support working with different projects. Instead, IOLITE aims to be portable and thus directly sources all data from the directories next to the executable. A single copy of IOLITE becomes your game, it’s as simple as that.

Shipping your game#

When working with IOLITE, there is no differentiation between the game and the editor. There is no separate editor application; the editor itself is part of IOLITE’s runtime. A big plus is that you implicitly ship the tools you used to create your game in the first place, allowing your community to utilize the same toolset for modding.

When launching IOLITE for the first time, the editor is automatically activated after the startup. Whether the application should launch into the editor or directly into the game mode (also referred to as the main game state) can be configured. Accordingly, all you have to do when shipping your game is to make the game mode the default, as depicted in the section Working with the app metadata file.

Entity Component System#

The ECS (Entity Component System) is your primary tool for creating games with IOLITE.

Entities are functionless objects that can be decorated with components to assign them one or multiple purposes. For example, an entity with a node component can be positioned in three-dimensional space. Adding a character controller component unlocks the ability to interact with the physics environment, and adding a voxel shape component creates a visual representation for your character.

IOLITE’s ECS comes with a very flexible property system, which allows, on the one hand, storing data with your components, which can then be accessed programmatically, either via the scripting backend or the native API. On the other hand, it allows configuring your components in the editor. The following image shows the property editor for a selected entity in the editor, making it possible to inspect and modify properties of multiple components attached to a single entity:

../_images/property_editor.jpg

The ECS in IOLITE utilizes data-oriented principles and stores all data in SOA layout (Structure of Arrays) while ensuring the data stays as compact as humanly possible in memory. This makes it possible to work with large data sets very efficiently.

Note

If you are aching for a more in-depth explanation of the topic, you can find more information on Wikipedia.

Worlds#

Worlds are your creative containers that store a scene as a hierarchy of nodes. Nodes keep a one-to-many relationship with other nodes, meaning that a single node can have multiple children but only a single parent node. The following screenshot shows the small forest sample world, made up of instantiations of a few different voxel shapes:

../_images/forest_world.jpg

The world inspector on the editor’s left side shows the mentioned node hierarchy.

A world is defined by its name, a single root node, and the hierarchy of nodes attached to it. Worlds can be saved to and loaded from disk, and you can use them to structure your project:

Multiple worlds store the levels for your game, while another single world can house the scripts and logic for your menu screen.

Data sources and the app metadata file#

Every project reads all its data from one or many so-called data sources. Data sources in the development environment are plain directories in the application’s root directory, right next to the executable.

When deploying a build, you can opt in to package the data of each of the data sources to an IPKG (IOLITE Package) file. To create packages, you can use the package generator script, available in our repository; see python_scripts/package_generator.py.

The portable builds of IOLITE are shipped with two data sources. The mandatory base data source is provided as a package, while the default data source is available as directories and files, serving the simple default scene. You can use the directory structure of the default data source as a reference for creating new data sources.

Important

The base data source contains mandatory assets and has to be available. It’s loaded by default, and there is no need to load it manually.

Using data sources for modding#

Data sources provide an incredibly flexible approach to modding applications created with IOLITE.

Let’s say you want to replace a specific voxel asset in a game, like a tree in a different color or a particular script where you’ve added some little tweaks or new features. All you have to do is to create a new data source directory and place the modified assets in the correct path in the directory structure, matching the file path used in the base data source. After that, you must load your data source before loading the data sources containing the original assets, which shadows the assets in the base data source.

The order in which data sources are loaded is defined via the app metadata file, depicted in detail in the following section.

Working with the app metadata file#

The app metadata data file is a JSON file with the following content:

{
    "application_name": "IOLITE",
    "organization_name": "Missing Deadlines",
    "version_string": "0.2.0",

    "data_sources": [
        "default"
    ],

    "initial_world": "default",
    "initial_game_state": "Editing"
}

The app metadata allows you to adjust basic properties like your application’s name and your organization. In addition, it is also in charge of defining the data sources that should be used to source files from. Data sources are loaded in the given order, and data provided by data sources listed first is prioritized.

Here’s an overview of all the different parameters:

application_name (String)

The name of your application.

organization_name (String)

The name of your organization (if any).

version_string (String)

Version string following the Semantic Versioning scheme.

data_sources (Array of strings)

The data sources used for your project. Data sources are loaded in the provided order. The engine starts searching for files in the first data sources and, if the file in question is found, skips searching all the other data sources.

initial_world (String)

The initial world to load after startup.

initial_game_state (String)

The initial game state to activate after startup. It can be either Editing for the editor or Main to start the application in game mode directly.

disable_telemetry (Boolean)

Set this to true to disable the collection of anonymous telemetry data.

These additional settings are available in the PRO version of IOLITE:

show_splash_screen (Boolean, PRO only)

Set to false to disable the splash screen shown during startup.

disable_pro_features (Boolean, PRO only)

Set to false to disable all features of IOLITE PRO.