Skip to main content

The Format

note

This page isn't finished yet and will be improved in the future.

At it's core, qARK is a list of values being assigned to a path.

example.0.name = Example
example.0.description = Description of the example
example.1.name = Other example
example.1.description = Lorem ipsum dolor sit amet

This exaxmple could be used to describe the contents of this in C#.

var example = new List<ExampleItem>()
{
new ExampleItem()
{
name = "Example",
description = "Description of the example"
},
new ExampleItem()
{
name = "Other example",
description = "Lorem ipsum dolor sit amet"
}
};

public struct ExampleItem
{
public string name;
public string description;
}

Of course, serialization like this by itself is quite annoying, which is where the other types of elements come in.

Comments​

As many markup languages, qARK supports comments, which are defined by preceding a line with #.

# I am a comment
warning

Comments must be defined in a separate line.

# This is a comment
example = hello # This is not a comment

The value of example is hello # This is not a comment.

Group element​

A group gives a prefix for all entry paths below it. For example:

config.version = 3.0

--- config.user ---
name = Harold
startMinimized = True

...would be the same as...

config.version = 3.0

config.user.name = Harold
config.user.startMinimized = True

A group can be closed by writing ---

--- settings ---
# Full path: settings.resolutionX
resolutionX = 1920
# Full path: settings.resolutionY
resolutionY = 1080
---

# Full path: currentLevel
currentLevel = level3

Array entries​

Entries can be defined by assigning multiple values to the same path.

colors = red
colors = green
colors = blue

In C#, this would look like this.

var colors = new string[]
{
"red",
"green",
"blue"
}

To avoid having to retype the same path over and over, we can use an array item entry instead.

colors = red
* green
* blue

Values prefixed with a * will create new entries that copy the previous entry's path.

But this can still be better. It's possible to create entries that contain no value, by writing out a path and ending it with a |.

# This entry has no value
colors|

By itself, this is useless, but combined with the array item entry, we can do this:

colors|
* red
* green
* blue
Good practices
  1. When creating an array, define the path as a array head entry and it's values as array item entries.
# Correct
array|
* item 1
* item 2
* item 3

# Will work, but makes editing more difficult
array = item 1
* item 2
* item 3

# Will work, but degrades readibility
array = item 1
array = item 2
array = item 3
  1. Don't scatter array items over the document.
array|
* item 1

...

# Makes it more difficult to see the values of "array" at a glance.
array|
* item 2
* item 2

Object arrays​

Array entries are great for arrays of single values. However, what if we want to serialize something like this:

var items = new List<Item>();

public struct Item
{
public string name;
public float value;
}

This is where we use object arrays. In short: put a number in the path to identify items.

items.0.name = "Item 1"
items.0.value = 1
items.1.name = "Item 2"
items.1.value = 7

In C#, the above could represent a structure like this:

var items = new List<Item>()
{
new Item()
{
name = "Item 1".
value = 1f
},
new Item()
{
name = "Item 2",
value = 7f
}
};
warning

The actual numbers aren't important. When deserializing, new items will be created when their path for the item will be different.

# This will create new items "Item 1" and "Item 2"
# It's possible to use other values than just numbers, but it's not recommended
items.asd.name = Item 1
items.asd.value = 1
items.692.name = Item 2
items.692.value = 7

To further improve on the experience, you can use @ and _ instead of the numbers.

CharacterBehaviour
@Get's replaced by an incremented number.
_Get's replaced by the previous number.
items.@.name = Item 1
items._.value = 1
items.@.name = Item 2
items._.value = 7

...is the same as...

items.0.name = Item 1
items.0.value = 1
items.1.name = Item 2
items.1.value = 7
note

These numbers are path-specific. When used on a path with a different beginning, the number will start over from 0.

# Full path: items.0.name
items.@.name = Item 1
# Full path: otherItems.0.name
otherItems.@.name = Item 2
# Full path: otherItems.1.name
otherItems.@.name = Item 3

# Full path: items.1.name
items.@.name = Item 4
Good practives
  1. Place array objects inside groups and use @ and _ for sub arrays.
--- items.@ ---
name = Item 1
children.@.name = Child 1
children._.age = 1
children.@.name = Child 2
children._.age = 2
---

--- items.@ ---
name = Item 2
children.@.name = Child 1
children._.age = 1
---