-
Notifications
You must be signed in to change notification settings - Fork 10
Map format (.json)
V3 Fio Map files are stored in .json format containing two main sections:
{
"brushes": [],
"things": []
}Each brush is a rectangular solid used to build level geometry.
| Field | Type | Description |
|---|---|---|
pos |
array | Centre position [x, y, z]
|
size |
array | Dimensions [width, height, depth]
|
operation |
string | Boolean operation. Currently always "add"
|
textures |
object | Texture assignments for all six faces |
lock |
boolean | Editor lock flag |
id |
string/int | Unique brush identifier |
The textures object contains one texture path per face:
"textures": { "north": "default.png", "south": "default.png", "east": "default.png", "west": "default.png", "top": "default.png", "down": "default.png" }
Textures are resolved relative to the project texture directory.
Common texture conventions:
| Texture | Purpose |
|---|---|
default.png |
Standard visible surface |
nodraw.jpg |
Invisible/non-rendered surface |
Depending on editor operations and gameplay systems, brushes may also contain:
| Field | Description |
|---|---|
name |
Named brush for I/O targeting |
hidden |
Runtime/editor visibility toggle |
tint |
RGB tint override [r, g, b]
|
is_trigger |
Marks brush as a trigger volume |
is_door |
Marks brush as a door |
is_mover |
Marks brush as a moving platform |
properties |
Type-specific runtime data |
_io_connections |
Internal I/O connection data |
{
"id": 12,
"pos": [0, 64, 0],
"size": [256, 128, 256],
"operation": "add",
"lock": true,
"textures": {
"north": "brick.png",
"south": "brick.png",
"east": "brick.png",
"west": "brick.png",
"top": "ceiling.png",
"down": "floor.png"
}
}Entities represent gameplay objects, logic systems, lights, monsters, pickups, and level scripting objects.
| Field | Type | Description |
|---|---|---|
type |
string | Entity class/type |
pos |
array | World position [x, y, z]
|
properties |
object | Type-specific entity data |
io_connections |
array | Logic outputs and links |
| Type | Purpose |
|---|---|
playerstart |
Player spawn location |
pickup |
Item or weapon pickup |
light |
Dynamic or static light source |
monster |
AI enemy |
levelchanger |
Loads another map |
portal |
Linked teleport/portal system |
The properties object is fully dynamic and depends on the entity type.
Example:
{
"type": "light",
"pos": [128, 96, 0],
"properties": {
"name": "hall_light",
"color": [255, 200, 180],
"intensity": 2.0,
"radius": 512
},
"io_connections": []
}Entities can communicate using Source-style input/output logic.
Connections are stored in io_connections.
{
"output": "OnTrigger",
"target": "main_door",
"input": "Open",
"delay": 0.0,
"parameter": ""
}| Field | Description |
|---|---|
output |
Output event emitted by source entity |
target |
Name of target entity |
input |
Input function called on target |
delay |
Delay before firing |
parameter |
Optional string parameter |
The engine uses Cartesian 3D coordinates:
X = horizontal
Y = vertical
Z = depth
Positions are stored in world units as floating point values.
| Value | Meaning |
|---|---|
1 |
One engine unit |
64 |
Typical wall thickness |
128 |
Player/Human enemy height |
256+ |
Large structures |
- Maps are saved as plain UTF-8 JSON files
- Unknown fields are generally preserved
- Missing optional fields are generated automatically by the editor
- Runtime/editor-only fields may be added temporarily during editing
{
"brushes": [
{
"id": 1,
"pos": [0, 0, 0],
"size": [512, 32, 512],
"operation": "add",
"lock": true,
"textures": {
"north": "floor.png",
"south": "floor.png",
"east": "floor.png",
"west": "floor.png",
"top": "floor.png",
"down": "nodraw.jpg"
}
}
],
"things": [
{
"type": "playerstart",
"pos": [0, 64, 0],
"properties": {
"name": "spawn_1"
},
"io_connections": []
}
]
}v1 – original format, no I/O connections, legacy target property.
v2 – introduced io_connections and per‐entity id.
v3 – added logic_graph, lightmap_scene_hash, terrain and portal properties, shader brush fields.