
The basic configuration for the game is stored at
`$(XDG_CONFIG_HOME)/voxelgarden.cfg` and by default looks like this:

<details>
<summary>Click to expand</summary>

```ini
[window]
width = -1
height = -1
fullscreen = false
vsync = 1
ui_scale = 3

[audio]
frequency = 44100
format = 32784
channels = 2
chunksize = 1024
music_volume = 128
sfx_volume = 128

[input]
left = scancode 4
right = scancode 7
front = scancode 26
back = scancode 22
run = scancode 225
crouch = scancode 224
jump = scancode 44
interact = scancode 8
inventory = scancode 43
erase = mbutton 0 1
paint = mbutton 0 3
pick = mbutton 0 2

[server]
chunk_op_time = 15
view_distance = 48 4 48
quality_drop = 128
high_def_radius = 8
planet_radius = 200000
multithreading = false

[language]
language = en_us
```
</details>

This is a detailed explanation of each field:

## Window

| key       | type      | default   | explanation                           |
|-----------|-----------|-----------|---------------------------------------|
| width     | int       | -1        | width of the game window; -1 takes the full screen |
| height    | int       | -1        | height of the game window; -1 takes the full screen |
| fullscreen| bool      | false     | if true, fullscreen |
| vsync     | int       | 1         | 0: no, 1: yes, -1: adaptive |
| ui_scale  | int       | 3         | scale of the GUI |

## Audio

| key       | type      | default   | explanation                           |
|-----------|-----------|-----------|---------------------------------------|
| frequency | int       | 44100     | the frequency to playback audio at (in Hz)|
| format    | int       | 32768     | see SDL audio format identifiers |
| channels  | int       | 2         | number of audio channels (1: mono, 2: stereo, ...)|
| chunksize | int       | 1024      | audio buffer size in sample FRAMES (total samples divided by channel count)|
| music_volume | int    | 128       | volume of the music in a 0-128 scale|
| sfx_volume | int      | 128       | volume of the sounds in a 0-128 scale|

## Input

| key       | type      | default       | explanation                           |
|-----------|-----------|---------------|---------------------------------------|
| left      | Input     | scancode 4    | strafe left|
| right     | Input     | scancode 7    | strafe right|
| front     | Input     | scancode 26   | move forward|
| back      | Input     | scancode 22   | move backward|
| run       | Input     | scancode 225  | toggle running|
| crouch    | Input     | scancode 224  | toggle crouching|
| interact  | Input     | scancode 8    | interact with cell/mob|
| inventory | Input     | scancode 43   | toggle inventory|
| erase     | Input     | mbutton 0 1   | remove cell/mob|
| paint     | Input     | mbutton 0 3   | place cell/mob|
| pick      | Input     | mbutton 0 2   | yoink cell/mob|

The input format supports the following options:

| format                | description   |
|-----------------------|---------------|
| keycode CODE          | keyboard key with keycode 'CODE' |
| scancode CODE         | keyboard key with scancode 'CODE' |
| mbutton WHICH BUTTON  | button 'BUTTON' of mouse 'WHICH' |
| cbutton WHICH BUTTON  | button 'BUTTON' of controller 'WHICH' |
| caxis WHICH AXIS POSITIVE  | axis 'AXIS' of controller 'WHICH' [1] |
| jbutton WHICH BUTTON  | button 'BUTTON' of joystick 'WHICH' |
| jaxis WHICH AXIS POSITIVE  | axis 'AXIS' of joystick 'WHICH' [1] |
| jhat WHICH HAT VALUE  | hat 'HAT' of joystick 'WHICH' |

1. axis inputs have a 'POSITIVE' field that determines if the input is enabled
   when the axis has a positive value or disabled otherwise; or enabled when
   the axis has a negative value or disabled otherwise. A value of 0 always
   means disabled.

## Server

| key       | type      | default   | explanation                           |
|-----------|-----------|-----------|---------------------------------------|
| chunk_op_time| int    | 15        | milliseconds per frame dedicated to chunk operations |
| view_distance | int int int | 48 4 48 | radius of the loaded world around the player, in chunks |
| quality_drop | int | 128 | chevysheb distance until cells start being merged, in chunks |
| high_def_radius | int | 8 | radius around the player where chunk rendering is not optimized for distance, in chunks |
| planet_radius | int | 200000 | radius of the planet in cells; determines horizon curve |
| multithreading | bool | false | enables multithreading for chunk and mob operations; at this point, it might cause random crashes |

## Language

| key       | type      | default   | explanation                           |
|-----------|-----------|-----------|---------------------------------------|
| language  | string    | en_us     | prefix used when loading string files |
