diff --git a/docs/zengin/scripts/extenders/ikarus/functions/objects.md b/docs/zengin/scripts/extenders/ikarus/functions/objects.md
index 708b515e83..d6435f5876 100644
--- a/docs/zengin/scripts/extenders/ikarus/functions/objects.md
+++ b/docs/zengin/scripts/extenders/ikarus/functions/objects.md
@@ -175,7 +175,7 @@ The classes used here all have one thing in common: there is a maximum of one ob
Inserts a Vob with the visual `vis` at the waypoint `wp`. If the visual or waypoint does not exist, this is the behaviour this function undefined.
!!! Note
- The inserted Vob is even an `oCMob`, so it can be given a focus name, for example. But you can treat it like a [`zCVob`](../../../../worlds/Classes/zCVob.md)), if you don't need the additional properties.
+ The inserted Vob is even an `oCMob`, so it can be given a focus name, for example. But you can treat it like a [`zCVob`](../../../../worlds/Classes/zCVob/index.md)), if you don't need the additional properties.
```dae
func int MEM_InsertVob(var string vis, var string wp)
```
@@ -199,7 +199,7 @@ The classes used here all have one thing in common: there is a maximum of one ob
**Parameters**
- `#!dae var int vobPtr`
- Pointer to a [`zCVob`](../../../../worlds/Classes/zCVob.md) object to be deleted
+ Pointer to a [`zCVob`](../../../../worlds/Classes/zCVob/index.md) object to be deleted
### `MEM_RenameVob`
!!! function "`MEM_RenameVob`"
@@ -212,7 +212,7 @@ The classes used here all have one thing in common: there is a maximum of one ob
**Parameters**
- `#!dae var int vobPtr`
- Pointer to a [`zCVob`](../../../../worlds/Classes/zCVob.md) object to be renamed
+ Pointer to a [`zCVob`](../../../../worlds/Classes/zCVob/index.md) object to be renamed
- `#!dae var string newName`
The new Name of the Vob
@@ -227,7 +227,7 @@ The classes used here all have one thing in common: there is a maximum of one ob
**Parameters**
- `#!dae var int vobPtr`
- Pointer to a triggered [`zCVob`](../../../../worlds/Classes/zCVob.md)
+ Pointer to a triggered [`zCVob`](../../../../worlds/Classes/zCVob/index.md)
!!! Danger
If triggering the Vob has immediate effects (even before MEM_TriggerVob is exited), the name of the Vob is corrupted during this time. It is not advisable to rename, trigger again or destroy the object at this moment, the behavior in such cases is untested.
@@ -242,25 +242,25 @@ The classes used here all have one thing in common: there is a maximum of one ob
**Parameters**
- `#!dae var int vobPtr`
- Pointer to an untriggered [`zCVob`](../../../../worlds/Classes/zCVob.md)
+ Pointer to an untriggered [`zCVob`](../../../../worlds/Classes/zCVob/index.md)
!!! Danger
If untriggering the Vob has immediate effects (even before MEM_TriggerVob is exited), the name of the Vob is corrupted during this time. It is not advisable to rename, trigger again or destroy the object at this moment, the behavior in such cases is untested.
### `MEM_SearchVobByName`
!!! function "`MEM_SearchVobByName`"
- Returns the address of a [`zCVob`](../../../../worlds/Classes/zCVob.md) named `str` if such a Vob exists.
+ Returns the address of a [`zCVob`](../../../../worlds/Classes/zCVob/index.md) named `str` if such a Vob exists.
```dae
func int MEM_SearchVobByName(var string str)
```
**Parameters**
- `#!dae var string str`
- Name of searched [`zCVob`](../../../../worlds/Classes/zCVob.md)
+ Name of searched [`zCVob`](../../../../worlds/Classes/zCVob/index.md)
**Return value**
- The function returns a pointer to the [`zCVob`](../../../../worlds/Classes/zCVob.md) if the object with the given name exist. `0` is returned otherwise.
+ The function returns a pointer to the [`zCVob`](../../../../worlds/Classes/zCVob/index.md) if the object with the given name exist. `0` is returned otherwise.
### `MEM_SearchAllVobsByName`
!!! function "`MEM_SearchAllVobsByName`"
@@ -271,7 +271,7 @@ The classes used here all have one thing in common: there is a maximum of one ob
**Parameters**
- `#!dae var string str`
- Name of searched [`zCVob`](../../../../worlds/Classes/zCVob.md)
+ Name of searched [`zCVob`](../../../../worlds/Classes/zCVob/index.md)
**Return value**
diff --git a/docs/zengin/scripts/extenders/zparserextender/classes/helperclasses.md b/docs/zengin/scripts/extenders/zparserextender/classes/helperclasses.md
index 513a39cc47..5dddf01eba 100644
--- a/docs/zengin/scripts/extenders/zparserextender/classes/helperclasses.md
+++ b/docs/zengin/scripts/extenders/zparserextender/classes/helperclasses.md
@@ -58,7 +58,7 @@ func void Vob_SetVobPosition( var C_Vob vob, var C_Position pos ) {};
The following classes define properties of `C_VOB` objects or classes derived from it.
## C_VOB_DATA
-Represents universal [`zCVob`](../../../../worlds/Classes/zCVob.md) class
+Represents universal [`zCVob`](../../../../worlds/Classes/zCVob/index.md) class
```dae
class C_VOB_DATA
{
diff --git a/docs/zengin/worlds/Classes/zCVob.md b/docs/zengin/worlds/Classes/zCVob/index.md
similarity index 53%
rename from docs/zengin/worlds/Classes/zCVob.md
rename to docs/zengin/worlds/Classes/zCVob/index.md
index 632380dd8f..8a374784ec 100644
--- a/docs/zengin/worlds/Classes/zCVob.md
+++ b/docs/zengin/worlds/Classes/zCVob/index.md
@@ -1,135 +1,247 @@
# zCVob
-Represents so-called virtual objects which appear in the game world. `zCVob` is the base class for all virtual objects which include everything from static models like boxes to interactive elements like doors and chests and invisible trigger objects.
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVob`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvob/1-1-0-467)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVob/)
+
+Represents so-called virtual objects which appear in the game world. `zCVob` is the base class for all virtual objects
+which include everything from static models like boxes to interactive elements like doors and chests and invisible
+trigger objects.
## Class members
-Properties of a zCVob class are split into two parts. The **Internals** are hardly ever needed to be edited manually, they are changed by e.g. moving an object in [Spacer](../spacer.md). On the other hand the **Vob** properties can only be changed by the Objects context menu in [Spacer](../spacer.md).
+Properties of a zCVob class are split into two parts. The **Internals** are hardly ever needed to be edited manually,
+they are changed by e.g. moving an object in [Spacer](../../spacer.md). On the other hand the **Vob** properties can
+only be changed by the Objects context menu in [Spacer](../../spacer.md).
-=== "G1"
+=== "Gothic 1"
- zCVob
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
+ {: .sp-class}
- Internals
- {: style="list-style-image: url('/gmc/assets/icons/spacer-folder.png');"}
+ {: .sp-folder}
- [pack](#pack) = 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-int.png');"}
+ {: .sp-int}
- [presetName](#presetname) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [bbox3DWS](#bbox3dws) = 0 0 0 0 0 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-misc.png');"}
+ {: .sp-misc}
- [trafoOSToWSRot](#trafoostowsrot) = 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-misc.png');"}
- - [trafoOSToWSPos](#trafoostowspos) = 0 0 200
- {: style="list-style-image: url('/gmc/assets/icons/spacer-vec.png');"}
+ {: .sp-misc}
+ - [trafoOSToWSPOS](#trafoostowspos) = 0 0 200
+ {: .sp-vec}
- Vob
- {: style="list-style-image: url('/gmc/assets/icons/spacer-folder.png');"}
+ {: .sp-folder}
- [vobName](#vobname) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [visual](#visual) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [showVisual](#showvisual) = TRUE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-bool}
- [visualCamAlign](#visualcamalign) = NONE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-enum.png');"}
- - [CdStatic](#cdstatic) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
- - [CdDyn](#cddyn) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-enum}
+ - [cdStatic](#cdstatic) = FALSE
+ {: .sp-bool}
+ - [cdDyn](#cddyn) = FALSE
+ {: .sp-bool}
- [staticVob](#staticvob) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-bool}
- [dynShadow](#dynshadow) = DS_NONE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-enum.png');"}
- - visual = NULL
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
- - ai = NULL
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
+ {: .sp-enum}
+ - visual = NULL
+ {: .sp-class}
+ - ai = NULL
+ {: .sp-class}
-=== "G2A"
+=== "Gothic 2"
- zCVob
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
+ {: .sp-class}
- Internals
- {: style="list-style-image: url('/gmc/assets/icons/spacer-folder.png');"}
+ {: .sp-folder}
- [pack](#pack) = 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-int.png');"}
+ {: .sp-int}
- [presetName](#presetname) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [bbox3DWS](#bbox3dws) = 0 0 0 0 0 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-misc.png');"}
+ {: .sp-misc}
- [trafoOSToWSRot](#trafoostowsrot) = 0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-misc.png');"}
- - [trafoOSToWSPos](#trafoostowspos) = 0 0 200
- {: style="list-style-image: url('/gmc/assets/icons/spacer-vec.png');"}
+ {: .sp-misc}
+ - [trafoOSToWSPOS](#trafoostowspos) = 0 0 200
+ {: .sp-vec}
- Vob
- {: style="list-style-image: url('/gmc/assets/icons/spacer-folder.png');"}
+ {: .sp-folder}
- [vobName](#vobname) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [visual](#visual) = ""
- {: style="list-style-image: url('/gmc/assets/icons/spacer-string.png');"}
+ {: .sp-string}
- [showVisual](#showvisual) = TRUE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-bool}
- [visualCamAlign](#visualcamalign) = NONE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-enum.png');"}
+ {: .sp-enum}
- [visualAniMode](#visualanimode) = NONE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-enum.png');"}
+ {: .sp-enum}
- [visualAniModeStrength](#visualanimodestrength) = 0.0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-float.png');"}
+ {: .sp-float}
- [vobFarClipZScale](#vobfarclipzscale) = 1.0
- {: style="list-style-image: url('/gmc/assets/icons/spacer-float.png');"}
- - [CdStatic](#cdstatic) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
- - [CdDyn](#cddyn) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-float}
+ - [cdStatic](#cdstatic) = FALSE
+ {: .sp-bool}
+ - [cdDyn](#cddyn) = FALSE
+ {: .sp-bool}
- [staticVob](#staticvob) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
+ {: .sp-bool}
- [dynShadow](#dynshadow) = DS_NONE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-enum.png');"}
+ {: .sp-enum}
- [zbias](#zbias) = 1
- {: style="list-style-image: url('/gmc/assets/icons/spacer-int.png');"}
+ {: .sp-int}
- [isAmbient](#isambient) = FALSE
- {: style="list-style-image: url('/gmc/assets/icons/spacer-bool.png');"}
- - visual = NULL
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
- - ai = NULL
- {: style="list-style-image: url('/gmc/assets/icons/spacer-class.png');"}
+ {: .sp-bool}
+ - visual = NULL
+ {: .sp-class}
+ - ai = NULL
+ {: .sp-class}
+
+
+=== "Gothic 1 (Save)"
+
+ - zCVob
+ {: .sp-class}
+ - Internals
+ {: .sp-folder}
+ - [pack](#pack) = 0
+ {: .sp-int}
+ - [presetName](#presetname) = ""
+ {: .sp-string}
+ - [bbox3DWS](#bbox3dws) = 0 0 0 0 0 0
+ {: .sp-misc}
+ - [trafoOSToWSRot](#trafoostowsrot) = 0
+ {: .sp-misc}
+ - [trafoOSToWSPOS](#trafoostowspos) = 0 0 200
+ {: .sp-vec}
+ - Vob
+ {: .sp-folder}
+ - [vobName](#vobname) = ""
+ {: .sp-string}
+ - [visual](#visual) = ""
+ {: .sp-string}
+ - [showVisual](#showvisual) = TRUE
+ {: .sp-bool}
+ - [visualCamAlign](#visualcamalign) = NONE
+ {: .sp-enum}
+ - [cdStatic](#cdstatic) = FALSE
+ {: .sp-bool}
+ - [cdDyn](#cddyn) = FALSE
+ {: .sp-bool}
+ - [staticVob](#staticvob) = FALSE
+ {: .sp-bool}
+ - [dynShadow](#dynshadow) = DS_NONE
+ {: .sp-enum}
+ - visual = NULL
+ {: .sp-class}
+ - ai = NULL
+ {: .sp-class}
+ - [sleepMode](#sleepmode) = 0
+ {: .sp-int}
+ - [nextOnTimer](#nextontimer) = 0.0
+ {: .sp-float}
+
+=== "Gothic 2 (Save)"
+
+ - zCVob
+ {: .sp-class}
+ - Internals
+ {: .sp-folder}
+ - [pack](#pack) = 0
+ {: .sp-int}
+ - [presetName](#presetname) = ""
+ {: .sp-string}
+ - [bbox3DWS](#bbox3dws) = 0 0 0 0 0 0
+ {: .sp-misc}
+ - [trafoOSToWSRot](#trafoostowsrot) = 0
+ {: .sp-misc}
+ - [trafoOSToWSPOS](#trafoostowspos) = 0 0 200
+ {: .sp-vec}
+ - Vob
+ {: .sp-folder}
+ - [vobName](#vobname) = ""
+ {: .sp-string}
+ - [visual](#visual) = ""
+ {: .sp-string}
+ - [showVisual](#showvisual) = TRUE
+ {: .sp-bool}
+ - [visualCamAlign](#visualcamalign) = NONE
+ {: .sp-enum}
+ - [visualAniMode](#visualanimode) = NONE
+ {: .sp-enum}
+ - [visualAniModeStrength](#visualanimodestrength) = 0.0
+ {: .sp-float}
+ - [vobFarClipZScale](#vobfarclipzscale) = 1.0
+ {: .sp-float}
+ - [cdStatic](#cdstatic) = FALSE
+ {: .sp-bool}
+ - [cdDyn](#cddyn) = FALSE
+ {: .sp-bool}
+ - [staticVob](#staticvob) = FALSE
+ {: .sp-bool}
+ - [dynShadow](#dynshadow) = DS_NONE
+ {: .sp-enum}
+ - [zbias](#zbias) = 1
+ {: .sp-int}
+ - [isAmbient](#isambient) = FALSE
+ {: .sp-bool}
+ - visual = NULL
+ {: .sp-class}
+ - ai = NULL
+ {: .sp-class}
+ - [sleepMode](#sleepmode) = 0
+ {: .sp-int}
+ - [nextOnTimer](#nextontimer) = 0.0
+ {: .sp-float}
## Class member overview
-### pack
+### `pack` {: .sp-int}
Internal property which indicates how the data associated with this virtual object is stored.
-### presetName
+### `presetName` {: .sp-string}
The name of the template that was used to create this virtual object.
-### bbox3DWS
+### `bbox3DWS` {: .sp-misc}
The 3-dimensional bounding box of this virtual object. Defined by two opposite diagonal points (`1x, 1y, 1z`, `2x, 2y, 2z`). This is used in conjunction with [cdStatic](#cdstatic) and [cdDyn](#cddyn) calculate collisions and interactions with other game objects (NPCs, items, etc.).
Interaction processing begins when object volumes intersect. For example, when the player enters the world change trigger area, the engine loads another game level based on the parameters this trigger. All this happens when the main character's BoundingBox intersects with the trigger's BoundingBox.
The BoundingBox can only be changed using the `Edit the Bbox` button in Spacer.
-### trafoOSToWSRot
+### `trafoOSToWSRot` {: .sp-misc}
The rotation of this virtual object in world space, represented by a 3x3 rotation matrix.
-### trafoOSToWSPos
+### `trafoOSToWSPos` {: .sp-vec}
Coordinates of the object in world space relative to the center.
!!! Note
This refers to the center of coordinates of the `.3DS` file of the game world on which the `ZEN` file is built.
-The coordinates are set automatically the first time an instance of the class is inserted into the game world. You can change them either directly by entering numerical values in the corresponding fields of the parameter, by [moving the vob](../spacer.md#viewport-controls) in spacer.
+The coordinates are set automatically the first time an instance of the class is inserted into the game world. You can change them either directly by entering numerical values in the corresponding fields of the parameter, by [moving the vob](../../spacer.md#viewport-controls) in spacer.
-### vobName
+### `vobName` {: .sp-string}
An identifier of a zCVob shown in the editor and sometimes used in scripts. The name can be left blank.
For some object classes, entering a name is required: zCVobSpot, zCVobWaypoint, zCTrigger etc.
!!! Danger
- Setting a name for every static and insignificant object can lead to an error when parsing the game world.
-### visual
+ Setting a name for every static and insignificant object can lead to an error when parsing the game world.
+
+### `visual` {: .sp-string}
The name of the visual component associated with this object, usually a name of a file.
Following formats are supported:
@@ -141,7 +253,7 @@ Following formats are supported:
- `*.MMS` - Animated objects
-### showVisual
+### `showVisual` {: .sp-bool}
Indicates whether this object should display its visual.
**Accepted values:**
@@ -150,7 +262,7 @@ Indicates whether this object should display its visual.
- **FALSE** - Do not display.
-### visualCamAlign
+### `visualCamAlign` {: .sp-enum}
Option to align objects relative to the camera.
**Accepted values:**
@@ -162,7 +274,7 @@ Option to align objects relative to the camera.
!!! Note
This may be used with grass or flowers which only consist of a 2-dimensional sprite to have it always face the camera.
-### visualAniMode
+### `visualAniMode` {: .sp-enum}
Wind simulation option. Used in conjunction with the [visualAniModeStrength](#visualanimodestrength) parameter.
**Accepted values:**
@@ -174,13 +286,13 @@ Wind simulation option. Used in conjunction with the [visualAniModeStrength](#vi
!!! Warning
This option is only available in Gothic II (Spacer2).
-### visualAniModeStrength
+### `visualAniModeStrength` {: .sp-float}
Wind power animation multiplier. Small values such as `0.001` are typically used. Used in conjunction with the [visualAniMode](#visualanimode) parameter.
!!! Warning
This option is only available in Gothic II (Spacer2).
-### vobFarClipZScale
+### `vobFarClipZScale` {: .sp-float}
Sets the loading range of the VOB object. Depends on the VOB drawing distance specified using the `zCZoneVobFarPlane` object.
The range of values is from `0.0` to `2.0`.
@@ -190,7 +302,7 @@ With a value of `0.0`, the object is not visible, but collisions are calculated.
!!! Warning
This option is only available in Gothic II (Spacer2).
-### CdStatic
+### `cdStatic` {: .sp-bool}
Determines if the virtual object will collide with the static objects (world mesh and other VOBs with **cdStatic** on).
**Accepted values:**
@@ -201,7 +313,7 @@ Determines if the virtual object will collide with the static objects (world mes
!!! Tip
A situation often arises when objects “refuse” to move beyond a certain point on the surface. This happens when **cdStatic** is set to **TRUE**, i.e. the object cannot cross the surface another static object. In this case, it is enough to disable the **cdStatic** parameter for the duration of the move, and turn it on again after the move.
-### CdDyn
+### `cdDyn` {: .sp-bool}
Determines if the virtual object will collide with dynamic objects (NPCs, items, etc.). This basically determines if the object has collision during gameplay.
**Accepted values:**
@@ -210,7 +322,7 @@ Determines if the virtual object will collide with dynamic objects (NPCs, items,
- **FALSE** - Don't collide with dynamic objects.
-### staticVob
+### `staticVob` {: .sp-bool}
Determines if the VOB is taken into consideration in static lighting calculations in Indoor spaces. Usually enabled in decorative Vobs, but some of the interactive ones have it disabled.
**Accepted values:**
@@ -221,7 +333,7 @@ Determines if the VOB is taken into consideration in static lighting calculation
!!! Note
The shadow is calculated when compiling light in Low, Middle or High mode.
-### dynShadow
+### `dynShadow` {: .sp-enum}
Indicates whether the object will cast a shadow when affected by dynamic light (e.g. torches).
**Accepted values:**
@@ -229,7 +341,7 @@ Indicates whether the object will cast a shadow when affected by dynamic light (
- **DS_NONE** - No shadow.
- **DS_BLOB** - Casts a circular shadow.
-### zbias
+### `zbias` {: .sp-int}
The depth-bias for this virtual object.
Can be used remove texture flickering if a `.TGA` file is used as rendering.
@@ -237,14 +349,21 @@ Can be used remove texture flickering if a `.TGA` file is used as rendering.
!!! Warning
This option is only available in Gothic II (Spacer2).
-### isAmbient
+### `isAmbient` {: .sp-bool}
Indicates that this virtual object is ambient. It looks like this setting was a system used during development when access to the game's source code was available. Basically, the global variable `zCWorld::s_bAmbientVobsEnabled` could be used to hide or show virtual objects which have the `isAmbient` flag set. In release builds, this variable is always set to true, thus the `isAmbient` flag does not have any perceivable effect on the game. It follows, that this field should be ignored by most implementations.
!!! Warning
This option is only available in Gothic II (Spacer2).
-[^1]:
- Heavily inspired by the zCVob article at [gothic-library](http://www.gothic-library.ru/publ/class_zcvob/1-1-0-467).
-[^2]:
- Corrected with information found in [ZenKit ZenGin Reference](https://zk.gothickit.dev/engine/objects/zCVob/).
+### `sleepMode` {: .sp-int}
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `nextOnTimer` {: .sp-float}
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/index.md b/docs/zengin/worlds/Classes/zCVob/oCVob/index.md
new file mode 100644
index 0000000000..9db4425422
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/index.md
@@ -0,0 +1,45 @@
+# oCVob
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCVob`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: *Unused*
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCVob/)
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - oCVob
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - oCVob
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - oCVob
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - oCVob
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCItem.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCItem.md
new file mode 100644
index 0000000000..2796808c0e
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCItem.md
@@ -0,0 +1,87 @@
+# oCItem
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCItem`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_occstrigger/1-1-0-530)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCItem/)
+
+Represents an item in the game world. Items are special VObjects which are tied to a script instance which defines
+their attributes. They have physics enabled and can be targeted and picked up by the player.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [oCVob](index.md)
+ {: .sp-class}
+ - oCItem
+ {: .sp-class}
+ - [itemInstance](#iteminstance) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [oCVob](index.md)
+ {: .sp-class}
+ - oCItem
+ {: .sp-class}
+ - [itemInstance](#iteminstance) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [oCVob](index.md)
+ {: .sp-class}
+ - oCItem
+ {: .sp-class}
+ - [itemInstance](#iteminstance) = ""
+ {: .sp-string}
+ - [amount](#amount) = 0
+ {: .sp-int}
+ - [flags](#flags) = 0
+ {: .sp-int}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [oCVob](index.md)
+ {: .sp-class}
+ - oCItem
+ {: .sp-class}
+ - [itemInstance](#iteminstance) = ""
+ {: .sp-string}
+ - [amount](#amount) = 0
+ {: .sp-int}
+ - [flags](#flags) = 0
+ {: .sp-int}
+
+## Class member overview
+
+### `itemInstance` {: .sp-string}
+
+The name of the script instance representing the item.
+
+### `amount` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `flags` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/index.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/index.md
new file mode 100644
index 0000000000..3b162eae69
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/index.md
@@ -0,0 +1,213 @@
+# oCMOB
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMOB`
+ **Version Identifiers:**
+ — Gothic I: `47105`
+ — Gothic II: `47105`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/ocmob_class/1-1-0-503)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMOB/)
+
+A VObject which can optionally be moved and/or carried.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [oCVob](../index.md)
+ {: .sp-class}
+ - oCMOB
+ {: .sp-class}
+ - MOB
+ {: .sp-folder}
+ - [focusName](#focusName) = ""
+ {: .sp-string}
+ - [hitpoints](#hitpoints) = 0
+ {: .sp-int}
+ - [damage](#damage) = 0
+ {: .sp-int}
+ - [moveable](#moveable) = FALSE
+ {: .sp-bool}
+ - [takeable](#takeable) = FALSE
+ {: .sp-bool}
+ - [focusOverride](#focusOverride) = FALSE
+ {: .sp-bool}
+ - [soundMaterial](#soundMaterial) = WOOD
+ {: .sp-enum}
+ - [visualDestroyed](#visualDestroyed) = ""
+ {: .sp-string}
+ - [owner](#owner) = ""
+ {: .sp-string}
+ - [ownerGuild](#ownerGuild) = ""
+ {: .sp-string}
+ - [isDestroyed](#isDestroyed) = ""
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [oCVob](../index.md)
+ {: .sp-class}
+ - oCMOB
+ {: .sp-class}
+ - MOB
+ {: .sp-folder}
+ - [focusName](#focusName) = ""
+ {: .sp-string}
+ - [hitpoints](#hitpoints) = 0
+ {: .sp-int}
+ - [damage](#damage) = 0
+ {: .sp-int}
+ - [moveable](#moveable) = FALSE
+ {: .sp-bool}
+ - [takeable](#takeable) = FALSE
+ {: .sp-bool}
+ - [focusOverride](#focusOverride) = FALSE
+ {: .sp-bool}
+ - [soundMaterial](#soundMaterial) = WOOD
+ {: .sp-enum}
+ - [visualDestroyed](#visualDestroyed) = ""
+ {: .sp-string}
+ - [owner](#owner) = ""
+ {: .sp-string}
+ - [ownerGuild](#ownerGuild) = ""
+ {: .sp-string}
+ - [isDestroyed](#isDestroyed) = ""
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [oCVob](../index.md)
+ {: .sp-class}
+ - oCMOB
+ {: .sp-class}
+ - MOB
+ {: .sp-folder}
+ - [focusName](#focusName) = ""
+ {: .sp-string}
+ - [hitpoints](#hitpoints) = 0
+ {: .sp-int}
+ - [damage](#damage) = 0
+ {: .sp-int}
+ - [moveable](#moveable) = FALSE
+ {: .sp-bool}
+ - [takeable](#takeable) = FALSE
+ {: .sp-bool}
+ - [focusOverride](#focusOverride) = FALSE
+ {: .sp-bool}
+ - [soundMaterial](#soundMaterial) = WOOD
+ {: .sp-enum}
+ - [visualDestroyed](#visualDestroyed) = ""
+ {: .sp-string}
+ - [owner](#owner) = ""
+ {: .sp-string}
+ - [ownerGuild](#ownerGuild) = ""
+ {: .sp-string}
+ - [isDestroyed](#isDestroyed) = ""
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [oCVob](../index.md)
+ {: .sp-class}
+ - oCMOB
+ {: .sp-class}
+ - MOB
+ {: .sp-folder}
+ - [focusName](#focusName) = ""
+ {: .sp-string}
+ - [hitpoints](#hitpoints) = 0
+ {: .sp-int}
+ - [damage](#damage) = 0
+ {: .sp-int}
+ - [moveable](#moveable) = FALSE
+ {: .sp-bool}
+ - [takeable](#takeable) = FALSE
+ {: .sp-bool}
+ - [focusOverride](#focusOverride) = FALSE
+ {: .sp-bool}
+ - [soundMaterial](#soundMaterial) = WOOD
+ {: .sp-enum}
+ - [visualDestroyed](#visualDestroyed) = ""
+ {: .sp-string}
+ - [owner](#owner) = ""
+ {: .sp-string}
+ - [ownerGuild](#ownerGuild) = ""
+ {: .sp-string}
+ - [isDestroyed](#isDestroyed) = ""
+ {: .sp-bool}
+
+## Class member overview
+
+### `focusName` {: .sp-string}
+
+The name of the object as seen in-game when focusing it.
+
+### `hitpoints` {: .sp-int}
+
+The number of hitpoints of the object.
+
+### `damage` {: .sp-int}
+
+The damage dealt by the object when being used.
+
+### `moveable` {: .sp-bool}
+
+Whether the object can be moved by the player.
+
+**Accepted values:**
+
+* `TRUE` — The object can be moved
+* `FALSE` — The object can not be moved
+
+### `takeable` {: .sp-bool}
+
+Whether the object can be carried by the player.
+
+**Accepted values:**
+
+* `TRUE` — The object can be carried
+* `FALSE` — The object can not be carried
+
+### `focusOverride` {: .sp-bool}
+
+Unknown.
+
+### `soundMaterial` {: .sp-enum}
+
+The sound to play when the object is hit.
+
+**Accepted values:**
+
+* `WOOD` — Wood.
+* `STONE` — Stone.
+* `METAL` — Metal.
+* `LEATHER` — Leather.
+* `CLAY` — Clay.
+* `GLAS` — Glass.
+
+### `visualDestroyed` {: .sp-string}
+
+The name of the visual to use when the object is destroyed. Behaves like [zCVob.visual](../../index.md#visual).
+
+### `owner` {: .sp-string}
+
+The name of the script instance of the NPC who is the owner of this object.
+
+### `ownerGuild` {: .sp-string}
+
+The name of the guild this object belongs to. This name corresponds to the script constant for
+each guild (i.e. `GIL_BAU`), found in `Constants.d`.
+
+### `isDestroyed` {: .sp-bool}
+
+Unknown.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/index.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/index.md
new file mode 100644
index 0000000000..fc49f50903
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/index.md
@@ -0,0 +1,143 @@
+# oCMobInter
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobInter`
+ **Version Identifiers:**
+ — Gothic I: `35585`
+ — Gothic II: `35585`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_ocmobinter/1-1-0-504)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobInter/)
+
+
+Interactive objects can be interacted with by NPCs and the player. Every time the object is interacted with, an
+`OnTrigger` event is sent to the [`triggerTarget`](#triggertarget) object.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - oCMobInter
+ {: .sp-class}
+ - [stateNum](#statenum) = 0
+ {: .sp-int}
+ - [triggerTarget](#triggertarget) = ""
+ {: .sp-string}
+ - [useWithItem](#usewithitem) = ""
+ {: .sp-string}
+ - [conditionFunc](#conditionfunc) = ""
+ {: .sp-string}
+ - [onStateFunc](#onstatefunc) = ""
+ {: .sp-string}
+ - [rewind](#rewind) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - oCMobInter
+ {: .sp-class}
+ - [stateNum](#statenum) = 0
+ {: .sp-int}
+ - [triggerTarget](#triggertarget) = ""
+ {: .sp-string}
+ - [useWithItem](#usewithitem) = ""
+ {: .sp-string}
+ - [conditionFunc](#conditionfunc) = ""
+ {: .sp-string}
+ - [onStateFunc](#onstatefunc) = ""
+ {: .sp-string}
+ - [rewind](#rewind) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - oCMobInter
+ {: .sp-class}
+ - [stateNum](#statenum) = 0
+ {: .sp-int}
+ - [triggerTarget](#triggertarget) = ""
+ {: .sp-string}
+ - [useWithItem](#usewithitem) = ""
+ {: .sp-string}
+ - [conditionFunc](#conditionfunc) = ""
+ {: .sp-string}
+ - [onStateFunc](#onstatefunc) = ""
+ {: .sp-string}
+ - [rewind](#rewind) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - oCMobInter
+ {: .sp-class}
+ - [stateNum](#statenum) = 0
+ {: .sp-int}
+ - [triggerTarget](#triggertarget) = ""
+ {: .sp-string}
+ - [useWithItem](#usewithitem) = ""
+ {: .sp-string}
+ - [conditionFunc](#conditionfunc) = ""
+ {: .sp-string}
+ - [onStateFunc](#onstatefunc) = ""
+ {: .sp-string}
+ - [rewind](#rewind) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `stateNum` {: .sp-int}
+
+Unknown.
+
+### `triggerTarget` {: .sp-string}
+
+The name of the VObject(s) to send an `OnTrigger` event to when this object is interacted with. Controlled by
+the [`rewind`](#rewind) property.
+
+### `useWithItem` {: .sp-string}
+
+The name of the item which the player or NPC must have in their inventory in order to interact with the object.
+Corresponds to the name of the item instance in the scripts.
+
+### `conditionFunc` {: .sp-string}
+
+The name of a script function which, when called, determines whether the object can be interacted with. The script
+function returns an int which is either `0`, if the object should be disabled and `1` if it should be enabled.
+
+### `onStateFunc` {: .sp-string}
+
+The name of a script function to be called when the object is being used.
+
+### `rewind` {: .sp-bool}
+
+Determines whether an `OnTrigger` event should be sent every time the object is interacted with or only the first time.
+
+**Accepted values:**
+
+* `TRUE` — Send `OnTrigger` events multiple times
+* `FALSE` — Only send the event once
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobBed.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobBed.md
new file mode 100644
index 0000000000..8788dcaf21
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobBed.md
@@ -0,0 +1,80 @@
+# oCMobBed
+
+!!! abstract inline end "Quick Infos"
+ **Type:** Virtual Object
+ **Format Name:** ZenGin Archive
+ **File Extension:** `.ZEN`
+ **Class Name:** `oCMobBed`
+ **Version Identifiers:**
+ — Gothic I: `35585`
+ — Gothic II: `35585`
+ **ZenKit Class:** `VBed`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobBed/)
+
+VObject marking beds for NPCs and the player to sleep on. In the original Gothic I, there is a bug which prevents
+`oCMobBed`s from working correctly, so it is recommended to instead use [`oCMobDoor`](oCMobLockable/oCMobDoor.md) and attach the
+visual of a bed when targeting that platform.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobBed
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobBed
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobBed
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobBed
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobFire.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobFire.md
new file mode 100644
index 0000000000..0bc9f7122e
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobFire.md
@@ -0,0 +1,92 @@
+# oCMobFire
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobFire`
+ **Version Identifiers:**
+ — Gothic I: `18433`
+ — Gothic II: `18433`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/ocmobfire/1-1-0-506)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobFire/)
+
+An object with an integrated fire effect. Only supports rigged models as visuals.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobFire
+ {: .sp-class}
+ - [fireSlot](#fireslot) = ""
+ {: .sp-string}
+ - [fireVobtreeName](#firevobtreename) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobFire
+ {: .sp-class}
+ - [fireSlot](#fireslot) = ""
+ {: .sp-string}
+ - [fireVobtreeName](#firevobtreename) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobFire
+ {: .sp-class}
+ - [fireSlot](#fireslot) = ""
+ {: .sp-string}
+ - [fireVobtreeName](#firevobtreename) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobFire
+ {: .sp-class}
+ - [fireSlot](#fireslot) = ""
+ {: .sp-string}
+ - [fireVobtreeName](#firevobtreename) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `fireSlot` {: .sp-string}
+
+The bone of the rigged model to place the fire effect at.
+
+### `fireVobtreeName` {: .sp-string}
+
+The name of the template file which contains the configuration of the fire effect. For example: `FIRETREE_MEDIUM.ZEN`.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLadder.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLadder.md
new file mode 100644
index 0000000000..c51cae9b30
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLadder.md
@@ -0,0 +1,76 @@
+# oCMobLadder
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobLadder`
+ **Version Identifiers:**
+ — Gothic I: `35585`
+ — Gothic II: `35585`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/ocmobladder/1-1-0-508)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobLadder/)
+
+A VObject representing a ladder. NPCs can interact with ladders by climbing.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobLadder
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobLadder
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobLadder
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobLadder
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/index.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/index.md
new file mode 100644
index 0000000000..e63a4fc8cf
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/index.md
@@ -0,0 +1,127 @@
+# oCMobLockable
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobLockable`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobLockable/)
+
+The base class for many lockable objects like [containers](oCMobContainer.md) and [doors](oCMobDoor.md).
+
+!!! warning
+ This object is an abstract base class and cannot be instantiated by itself.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Lockable
+ {: .sp-folder}
+ - [locked](#locked) = FALSE
+ {: .sp-bool}
+ - [keyInstance](#keyinstance) = ""
+ {: .sp-string}
+ - [pickLockStr](#picklockstr) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Lockable
+ {: .sp-folder}
+ - [locked](#locked) = FALSE
+ {: .sp-bool}
+ - [keyInstance](#keyinstance) = ""
+ {: .sp-string}
+ - [pickLockStr](#picklockstr) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Lockable
+ {: .sp-folder}
+ - [locked](#locked) = FALSE
+ {: .sp-bool}
+ - [keyInstance](#keyinstance) = ""
+ {: .sp-string}
+ - [pickLockStr](#picklockstr) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Lockable
+ {: .sp-folder}
+ - [locked](#locked) = FALSE
+ {: .sp-bool}
+ - [keyInstance](#keyinstance) = ""
+ {: .sp-string}
+ - [pickLockStr](#picklockstr) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `locked` {: .sp-bool}
+
+Determines whether the container is locked.
+
+**Accepted values:**
+
+* `TRUE` — The container is locked
+* `FALSE` — The container is not locked
+
+### `keyInstance` {: .sp-string}
+
+The name of the item script instance which unlocks the container.
+
+!!! tip
+ Only relevant if the container is locked.
+
+### `pickLockStr` {: .sp-string}
+
+The combination which unlocks this container when picking the lock. Each character of the string is either `R` or
+`L` where `R` stands for "Right" and `L` stands for "Left". If empty, the lock can not be picked.
+
Example: `LRRLLRL`.
+
+!!! tip
+ Only relevant if the container is locked.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobContainer.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobContainer.md
new file mode 100644
index 0000000000..b4f846cf5a
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobContainer.md
@@ -0,0 +1,115 @@
+# oCMobContainer
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobContainer`
+ **Version Identifiers:**
+ — Gothic I: `64513`
+ — Gothic II: `64513`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/ocmobcontainer/1-1-0-509)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobContainer/)
+
+An object which contains items.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Container
+ {: .sp-folder}
+ - [contains](#contains) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Container
+ {: .sp-folder}
+ - [contains](#contains) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Container
+ {: .sp-folder}
+ - [contains](#contains) = ""
+ {: .sp-string}
+ - [NumOfEntries](#numofentries) = 0
+ {: .sp-int}
+ - [oCItem](../../../oCItem.md) ... = NULL
+ {: .sp-class}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobContainer
+ {: .sp-class}
+ - Container
+ {: .sp-folder}
+ - [contains](#contains) = ""
+ {: .sp-string}
+ - [NumOfEntries](#numofentries) = 0
+ {: .sp-int}
+ - [oCItem](../../../oCItem.md) ... = NULL
+ {: .sp-class}
+
+## Class member overview
+
+### `contains` {: .sp-string}
+
+The items found inside the container as a comma-separated list. Each element of the list starts with the name of the
+item script instance and is optionally followed by a colon and a number, indicating the number of that item to be
+found inside.
+
Example: `ItMi_Gold:75, ItFo_Fish:2, ItMi_Quartz`.
+
+### `NumOfEntries` {: .sp-int}
+
+The number of items in the container.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobDoor.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobDoor.md
new file mode 100644
index 0000000000..fd74403ed0
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobLockable/oCMobDoor.md
@@ -0,0 +1,82 @@
+# oCMobDoor
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobDoor`
+ **Version Identifiers:**
+ — Gothic I: `64513`
+ — Gothic II: `64513`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/ocmobdoor/1-1-0-510)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobDoor/)
+
+A VObject representing a door. This is also used for NPCs navigating the waynet.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobDoor
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobDoor
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobDoor
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../../index.md)
+ {: .sp-class}
+ - [oCMOB](../../index.md)
+ {: .sp-class}
+ - [oCMobInter](../index.md)
+ {: .sp-class}
+ - [*oCMobLockable*](index.md)
+ {: .sp-class}
+ - oCMobDoor
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobSwitch.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobSwitch.md
new file mode 100644
index 0000000000..267f86d03c
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobSwitch.md
@@ -0,0 +1,74 @@
+# oCMobSwitch
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobSwitch`
+ **Version Identifiers:**
+ — Gothic I: `35585`
+ — Gothic II: `35585`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobSwitch/)
+
+A VObject representing a switch with two states.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobSwitch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobSwitch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobSwitch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobSwitch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobWheel.md b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobWheel.md
new file mode 100644
index 0000000000..0024582a4f
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/oCVob/oCMOB/oCMobInter/oCMobWheel.md
@@ -0,0 +1,74 @@
+# oCMobWheel
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCMobWheel`
+ **Version Identifiers:**
+ — Gothic I: `35585`
+ — Gothic II: `35585`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCMobWheel/)
+
+A wheel with four different states. For example, this is used for the gates of the old camp in Gothic I.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobWheel
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobWheel
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobWheel
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../../index.md)
+ {: .sp-class}
+ - [oCVob](../../index.md)
+ {: .sp-class}
+ - [oCMOB](../index.md)
+ {: .sp-class}
+ - [oCMobInter](index.md)
+ {: .sp-class}
+ - oCMobWheel
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCCSCamera.md b/docs/zengin/worlds/Classes/zCVob/zCCSCamera.md
new file mode 100644
index 0000000000..cd7ea282e9
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCCSCamera.md
@@ -0,0 +1,364 @@
+# zCCSCamera
+
+!!! abstract inline end "Quick Infos"
+ **Type:** Virtual Object
+ **Format Name:** ZenGin Archive
+ **File Extension:** `.ZEN`
+ **Class Name:** `zCCSCamera`
+ **Version Identifiers:**
+ — Gothic I: `30720`
+ — Gothic II: `33793`
+ **ZenKit Class:** `VCutsceneCamera`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zccscamera/1-1-0-494)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCCSCamera/)
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCSCamera
+ {: .sp-class}
+ - [camTrjFOR](#camtrjfor) = WORLD
+ {: .sp-enum}
+ - [targetTrjFOR](#targettrjfor) = WORLD
+ {: .sp-enum}
+ - [loopMode](#loopmode) = NONE
+ {: .sp-enum}
+ - [splLerpMode](#spllerpmode) = PATH
+ {: .sp-enum}
+ - [ignoreFORVobRotCam](#ignoreforvobrotcam) = FALSE
+ {: .sp-bool}
+ - [ignoreFORVobRotTarget](#ignoreforvobrottarget) = FALSE
+ {: .sp-bool}
+ - [adaptToSurroundings](#adapttosurroundings) = FALSE
+ {: .sp-bool}
+ - [easeToFirstKey](#easetofirstkey) = FALSE
+ {: .sp-bool}
+ - [easeFromLastKey](#easefromlastkey) = FALSE
+ {: .sp-bool}
+ - [totalTime](#totaltime) = 10.0
+ {: .sp-float}
+ - [autoCamFocusVobName](#autocamfocusvobname) = ""
+ {: .sp-string}
+ - [autoCamPlayerMovable](#autocamplayermovable) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKey](#autocamuntriggeronlastkey) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKeyDelay](#autocamuntriggeronlastkeydelay) = 0.0
+ {: .sp-float}
+ - [numPos](#numpos) = 0
+ {: .sp-int}
+ - [numTargets](#numtargets) = 0
+ {: .sp-int}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^1] = NULL
+ {: .sp-class}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^2] = NULL
+ {: .sp-class}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCSCamera
+ {: .sp-class}
+ - [camTrjFOR](#camtrjfor) = WORLD
+ {: .sp-enum}
+ - [targetTrjFOR](#targettrjfor) = WORLD
+ {: .sp-enum}
+ - [loopMode](#loopmode) = NONE
+ {: .sp-enum}
+ - [splLerpMode](#spllerpmode) = PATH
+ {: .sp-enum}
+ - [ignoreFORVobRotCam](#ignoreforvobrotcam) = FALSE
+ {: .sp-bool}
+ - [ignoreFORVobRotTarget](#ignoreforvobrottarget) = FALSE
+ {: .sp-bool}
+ - [adaptToSurroundings](#adapttosurroundings) = FALSE
+ {: .sp-bool}
+ - [easeToFirstKey](#easetofirstkey) = FALSE
+ {: .sp-bool}
+ - [easeFromLastKey](#easefromlastkey) = FALSE
+ {: .sp-bool}
+ - [totalTime](#totaltime) = 10.0
+ {: .sp-float}
+ - [autoCamFocusVobName](#autocamfocusvobname) = ""
+ {: .sp-string}
+ - [autoCamPlayerMovable](#autocamplayermovable) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKey](#autocamuntriggeronlastkey) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKeyDelay](#autocamuntriggeronlastkeydelay) = 0.0
+ {: .sp-float}
+ - [numPos](#numpos) = 0
+ {: .sp-int}
+ - [numTargets](#numtargets) = 0
+ {: .sp-int}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^1] = NULL
+ {: .sp-class}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^2] = NULL
+ {: .sp-class}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCSCamera
+ {: .sp-class}
+ - [camTrjFOR](#camtrjfor) = WORLD
+ {: .sp-enum}
+ - [targetTrjFOR](#targettrjfor) = WORLD
+ {: .sp-enum}
+ - [loopMode](#loopmode) = NONE
+ {: .sp-enum}
+ - [splLerpMode](#spllerpmode) = PATH
+ {: .sp-enum}
+ - [ignoreFORVobRotCam](#ignoreforvobrotcam) = FALSE
+ {: .sp-bool}
+ - [ignoreFORVobRotTarget](#ignoreforvobrottarget) = FALSE
+ {: .sp-bool}
+ - [adaptToSurroundings](#adapttosurroundings) = FALSE
+ {: .sp-bool}
+ - [easeToFirstKey](#easetofirstkey) = FALSE
+ {: .sp-bool}
+ - [easeFromLastKey](#easefromlastkey) = FALSE
+ {: .sp-bool}
+ - [totalTime](#totaltime) = 10.0
+ {: .sp-float}
+ - [autoCamFocusVobName](#autocamfocusvobname) = ""
+ {: .sp-string}
+ - [autoCamPlayerMovable](#autocamplayermovable) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKey](#autocamuntriggeronlastkey) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKeyDelay](#autocamuntriggeronlastkeydelay) = 0.0
+ {: .sp-float}
+ - [numPos](#numpos) = 0
+ {: .sp-int}
+ - [numTargets](#numtargets) = 0
+ {: .sp-int}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^1] = NULL
+ {: .sp-class}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^2] = NULL
+ {: .sp-class}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCSCamera
+ {: .sp-class}
+ - [camTrjFOR](#camtrjfor) = WORLD
+ {: .sp-enum}
+ - [targetTrjFOR](#targettrjfor) = WORLD
+ {: .sp-enum}
+ - [loopMode](#loopmode) = NONE
+ {: .sp-enum}
+ - [splLerpMode](#spllerpmode) = PATH
+ {: .sp-enum}
+ - [ignoreFORVobRotCam](#ignoreforvobrotcam) = FALSE
+ {: .sp-bool}
+ - [ignoreFORVobRotTarget](#ignoreforvobrottarget) = FALSE
+ {: .sp-bool}
+ - [adaptToSurroundings](#adapttosurroundings) = FALSE
+ {: .sp-bool}
+ - [easeToFirstKey](#easetofirstkey) = FALSE
+ {: .sp-bool}
+ - [easeFromLastKey](#easefromlastkey) = FALSE
+ {: .sp-bool}
+ - [totalTime](#totaltime) = 10.0
+ {: .sp-float}
+ - [autoCamFocusVobName](#autocamfocusvobname) = ""
+ {: .sp-string}
+ - [autoCamPlayerMovable](#autocamplayermovable) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKey](#autocamuntriggeronlastkey) = TRUE
+ {: .sp-bool}
+ - [autoCamUntriggerOnLastKeyDelay](#autocamuntriggeronlastkeydelay) = 0.0
+ {: .sp-float}
+ - [numPos](#numpos) = 0
+ {: .sp-int}
+ - [numTargets](#numtargets) = 0
+ {: .sp-int}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^1] = NULL
+ {: .sp-class}
+ - [zCCamTrj_KeyFrame](zCCamTrj_KeyFrame.md) ...[^2] = NULL
+ {: .sp-class}
+ - [paused](#paused) = FALSE
+ {: .sp-bool}
+ - [started](#started) = FALSE
+ {: .sp-bool}
+ - [gotoTimeMode](#gototimemode) = FALSE
+ {: .sp-bool}
+ - [csTime](#cstime) = 0.0
+ {: .sp-float}
+
+## Class member overview
+
+### `camTrjFOR` {: .sp-enum}
+
+The coordinate system of the key frames of the camera trajectory.
+
+**Accepted values:**
+
+* `WORLD` — Positions are relative to the global world coordinate system.
+* `OBJECT` — Positions are relative to the position of the camera object in the previous frame. Essentially, when
+ the camera travels along the keyframes each subsequent keyframe's position is relative to the position of the
+ previous keyframe. The position of the first keyframe is relative to the initial position of the camera.
+
+### `targetTrjFOR` {: .sp-enum}
+
+The keyframe coordinate system of the target camera trajectory.
+
+**Accepted values:**
+
+* `WORLD` — Positions are relative to the global world coordinate system.
+* `OBJECT` — Positions are relative to the position of the camera object in the previous frame. Essentially, when
+ the camera travels along the keyframes each subsequent keyframe's position is relative to the position of the
+ previous keyframe. The position of the first keyframe is relative to the initial position of the camera.
+
+### `loopMode` {: .sp-enum}
+
+The repetition mode of the camera animation.
+
+**Accepted values:**
+
+* `NONE` — The camera animation stops after the last frame is reached.
+* `RESTART` — The camera animation starts from the beginning after the last frame is reached. The ModKit states,
+ that this is only useful if the animation is to be interrupted by scripts or triggers.
+* `PINGPONG` — The camera animation re-plays the keyframes in reverse order after reaching the last frame.
+
+### `splLerpMode` {: .sp-enum}
+
+Adjust camera orientation while moving.
+
+**Accepted values:**
+
+* `UNDEF` — Unset.
+* `PATH` — The camera's orientation is specified by the slope of the target path spline.
+* `PATH_IGNOREROLL` — The camera's orientation is similar to `PATH` with the only difference being that the
+ camera's XZ plane is always parallel to the world's XZ plane.
+* `PATH_ROT_SAMPLES` — The camera's orientation is based on the keyframes.
+
+### `ignoreFORVobRotCam` {: .sp-bool}
+
+Determines whether the orientation to reference VOB objects should be taken into account when passing
+through key frames.
+
+**Accepted values:**
+
+* `TRUE` — Orientation to VOB reference objects is ignored. This can be useful if VOB objects appear that are
+ calculated by the rotation animation. After this, the orientation is taken into account only once at the
+ beginning of the movement.
+* `FALSE` — Orientation is not ignored.
+
+### `ignoreFORVobRotTarget` {: .sp-bool}
+
+Determines the need to take into account the orientation of target key frames to reference VOB objects.
+
+**Accepted values:**
+
+* `TRUE` — Orientation to VOB reference objects is ignored. Orientation to VOB reference objects is ignored.
+ May be necessary when rotation of reference VOBs defines animation. After this, the orientation is taken
+ into account only once at the beginning of the movement.
+* `FALSE` — Orientation is not ignored.
+
+### `adaptToSurroundings` {: .sp-bool}
+
+Indicates the need for dynamic adaptation to the environment.
+
+**Accepted values:**
+
+* `TRUE` — Enable adaptation.
+* `FALSE` — Disable adaptation. The camera will not adapt to its environment. Useful in cases where the keyframes
+ in the world have taken an absolute position (i.e. the [camTrjFOR](#camtrjfor) parameter is set to `WORLD`).
+
+### `easeToFirstKey` {: .sp-bool}
+
+Gives a smooth transition of camera position from the first keyframe to the last, if possible.
+
+**Accepted values:**
+
+* `TRUE` — Smooth transition if possible.
+* `FALSE` — No smooth transition.
+
+### `easeFromLastKey` {: .sp-bool}
+
+Gives a smooth transition of camera position from the last keyframe to the first, if possible.
+
+**Accepted values:**
+
+* `TRUE` — Smooth transition if possible.
+* `FALSE` — No smooth transition.
+
+### `totalTime` {: .sp-float}
+
+The duration of the camera animation in seconds.
+
+### `autoCamFocusVobName` {: .sp-string}
+
+The name of the VOB object which the camera will automatically focus.
+
+### `autoCamPlayerMovable` {: .sp-bool}
+
+Indicates whether the player will be able to move when moving the camera animation.
+
+**Accepted values:**
+
+* `TRUE` — The player will be able to move.
+* `FALSE` — The player is motionless.
+
+### `autoCamUntriggerOnLastKey` {: .sp-bool}
+
+Emit an `OnUntrigger` event after reaching the last animation frame.
+
+### `autoCamUntriggerOnLastKeyDelay` {: .sp-float}
+
+Unclear.
+
+### `numPos` {: .sp-int}
+
+The number of position key frames for the camera animation.
+
+!!! warning
+ This property is not available in the Spacer.
+
+### `numTargets` {: .sp-int}
+
+The number of target key frames for the camera animation.
+
+!!! warning
+ This property is not available in the Spacer.
+
+### `paused` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games made using Gothic II.
+
+### `started` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games made using Gothic II.
+
+### `gotoTimeMode` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games made using Gothic II.
+
+### `csTime` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games made using Gothic II.
+
+[^1]: A list of position key frames. The number of items is indicated by the [`numPos`](#numpos) property.
+[^2]: A list of target key frames. The number of items is indicated by the [`numTargets`](#numtargets) property.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCCamTrj_KeyFrame.md b/docs/zengin/worlds/Classes/zCVob/zCCamTrj_KeyFrame.md
new file mode 100644
index 0000000000..10089679d0
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCCamTrj_KeyFrame.md
@@ -0,0 +1,255 @@
+# zCCamTrj_KeyFrame
+
+!!! abstract inline end "Quick Infos"
+ **Type:** Virtual Object
+ **Format Name:** ZenGin Archive
+ **File Extension:** `.ZEN`
+ **Class Name:** `zCCamTrj_KeyFrame`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **ZenKit Class:** `VCameraTrajectoryFrame`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zccamtrj_keyframe/1-1-0-495)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCCamTrj_KeyFrame/)
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCamTrj_KeyFrame
+ {: .sp-class}
+ - [time](#time) = -1.0
+ {: .sp-float}
+ - [angleRollDeg](#anglerolldeg) = 0.0
+ {: .sp-float}
+ - [camFOVScale](#camfovscale) = 0.0
+ {: .sp-float}
+ - [motionType](#motiontype) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeFOV](#motiontypefov) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeRoll](#motiontyperoll) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeTimeScale](#motiontypetimescale) = SMOOTH
+ {: .sp-enum}
+ - Details
+ {: .sp-folder}
+ - [tension](#tension) = 0.0
+ {: .sp-float}
+ - [bias](#bias) = 0.0
+ {: .sp-float}
+ - [continuity](#continuity) = 0.0
+ {: .sp-float}
+ - [timeScale](#timescale) = 1.0
+ {: .sp-float}
+ - [timeIsFixed](#timeisfixed) = FALSE
+ {: .sp-bool}
+ - [originalPose](#originalpose) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ {: .sp-misc}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCamTrj_KeyFrame
+ {: .sp-class}
+ - [time](#time) = -1.0
+ {: .sp-float}
+ - [angleRollDeg](#anglerolldeg) = 0.0
+ {: .sp-float}
+ - [camFOVScale](#camfovscale) = 0.0
+ {: .sp-float}
+ - [motionType](#motiontype) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeFOV](#motiontypefov) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeRoll](#motiontyperoll) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeTimeScale](#motiontypetimescale) = SMOOTH
+ {: .sp-enum}
+ - Details
+ {: .sp-folder}
+ - [tension](#tension) = 0.0
+ {: .sp-float}
+ - [bias](#bias) = 0.0
+ {: .sp-float}
+ - [continuity](#continuity) = 0.0
+ {: .sp-float}
+ - [timeScale](#timescale) = 1.0
+ {: .sp-float}
+ - [timeIsFixed](#timeisfixed) = FALSE
+ {: .sp-bool}
+ - [originalPose](#originalpose) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ {: .sp-misc}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCamTrj_KeyFrame
+ {: .sp-class}
+ - [time](#time) = -1.0
+ {: .sp-float}
+ - [angleRollDeg](#anglerolldeg) = 0.0
+ {: .sp-float}
+ - [camFOVScale](#camfovscale) = 0.0
+ {: .sp-float}
+ - [motionType](#motiontype) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeFOV](#motiontypefov) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeRoll](#motiontyperoll) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeTimeScale](#motiontypetimescale) = SMOOTH
+ {: .sp-enum}
+ - Details
+ {: .sp-folder}
+ - [tension](#tension) = 0.0
+ {: .sp-float}
+ - [bias](#bias) = 0.0
+ {: .sp-float}
+ - [continuity](#continuity) = 0.0
+ {: .sp-float}
+ - [timeScale](#timescale) = 1.0
+ {: .sp-float}
+ - [timeIsFixed](#timeisfixed) = FALSE
+ {: .sp-bool}
+ - [originalPose](#originalpose) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ {: .sp-misc}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCCamTrj_KeyFrame
+ {: .sp-class}
+ - [time](#time) = -1.0
+ {: .sp-float}
+ - [angleRollDeg](#anglerolldeg) = 0.0
+ {: .sp-float}
+ - [camFOVScale](#camfovscale) = 0.0
+ {: .sp-float}
+ - [motionType](#motiontype) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeFOV](#motiontypefov) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeRoll](#motiontyperoll) = SMOOTH
+ {: .sp-enum}
+ - [motionTypeTimeScale](#motiontypetimescale) = SMOOTH
+ {: .sp-enum}
+ - Details
+ {: .sp-folder}
+ - [tension](#tension) = 0.0
+ {: .sp-float}
+ - [bias](#bias) = 0.0
+ {: .sp-float}
+ - [continuity](#continuity) = 0.0
+ {: .sp-float}
+ - [timeScale](#timescale) = 1.0
+ {: .sp-float}
+ - [timeIsFixed](#timeisfixed) = FALSE
+ {: .sp-bool}
+ - [originalPose](#originalpose) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ {: .sp-misc}
+
+## Class member overview
+
+### `time` {: .sp-float}
+
+Unclear.
+
+### `angleRollDeg` {: .sp-float}
+
+The camera rotation angle of the frame along the Z axis.
+
+### `camFOVScale` {: .sp-float}
+
+Focal zoom of the camera's field of view (FOV) of the frame. Use reasonable values to avoid dizzying effects.
+
+### `motionType` {: .sp-enum}
+
+The type of camera movement for the frame.
+
+**Accepted values:**
+
+* `SMOOTH` — The movement method is calculated taking into account nearby frames.
+* `LINEAR` — Constant speed in the current frame.
+* `STEP` - Step by step. Movement is jerky.
+* `SLOW` - The camera movement slows down in the current frame.
+* `FAST` - The camera movement accelerates in the current frame.
+* `CUSTOM` - Not implemented.
+
+### `motionTypeFOV` {: .sp-enum}
+
+The type of focus change for the frame.
+
+**Accepted values:**
+
+* `SMOOTH` — The movement method is calculated taking into account nearby frames.
+* `LINEAR` — Constant speed in the current frame.
+* `STEP` - Step by step. Movement is jerky.
+* `SLOW` - The camera movement slows down in the current frame.
+* `FAST` - The camera movement accelerates in the current frame.
+* `CUSTOM` - Not implemented.
+
+### `motionTypeRoll` {: .sp-enum}
+
+The type of rotation for the frame.
+
+**Accepted values:**
+
+* `SMOOTH` — The movement method is calculated taking into account nearby frames.
+* `LINEAR` — Constant speed in the current frame.
+* `STEP` - Step by step. Movement is jerky.
+* `SLOW` - The camera movement slows down in the current frame.
+* `FAST` - The camera movement accelerates in the current frame.
+* `CUSTOM` - Not implemented.
+
+### `motionTypeTimeScale` {: .sp-enum}
+
+Unclear.
+
+**Accepted values:**
+
+* `SMOOTH` — The movement method is calculated taking into account nearby frames.
+* `LINEAR` — Constant speed in the current frame.
+* `STEP` - Step by step. Movement is jerky.
+* `SLOW` - The camera movement slows down in the current frame.
+* `FAST` - The camera movement accelerates in the current frame.
+* `CUSTOM` - Not implemented.
+
+### `tension` {: .sp-float}
+
+Defines the bend of the camera motion curve at the specified key. Larger values result in a sharper bend.
+
+### `bias` {: .sp-float}
+
+Determines the slope of a line in one direction. The direction of the slope is determined by the sign, and the
+steepness by the value.
+
+### `continuity` {: .sp-float}
+
+Determines the amount of curve discontinuity at this animation key.
+
+### `timeScale` {: .sp-float}
+
+Unknown.
+
+### `timeIsFixed` {: .sp-bool}
+
+An auxiliary flag indicating the time of the key frame, which cannot be changed automatically.
+
+**Accepted values:**
+
+* `TRUE` — The time of this frame is set manually and cannot be changed automatically.
+* `FALSE` — The frame time is calculated from the total specified animation playback time.
+
+### `originalPose` {: .sp-misc}
+
+Unknown.
+
+!!! warning
+ This property is not available in the Spacer.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/index.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/index.md
new file mode 100644
index 0000000000..fbbcc9ec24
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/index.md
@@ -0,0 +1,52 @@
+# zCEffect
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCEffect`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCEffect/)
+
+The base class for many visual and sound effects.
+
+!!! warning
+ This object is an abstract base class and cannot be instantiated by itself.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCEffect
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCEffect
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCEffect
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCEffect
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCEarthquake.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCEarthquake.md
new file mode 100644
index 0000000000..a06eca2970
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCEarthquake.md
@@ -0,0 +1,76 @@
+# zCEarthquake
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCEarthquake`
+ **Version Identifiers:**
+ — Gothic I: *Unused*
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zcearthquake/1-1-0-516)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCEarthquake/)
+
+
+A VObject used to create an earthquake effect when it receives an `OnTrigger` event. An earthquake is represented
+by a shaking camera.
+
+!!! warning
+ This VObject is only available in Gothic II.
+
+## Class members
+
+=== "Gothic 1"
+
+ *Unavailable*
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCEarthquake
+ {: .sp-class}
+ - Earthquake
+ {: .sp-folder}
+ - [radius](#radius) = 200
+ {: .sp-float}
+ - [timeSec](#timeSec) = 5
+ {: .sp-float}
+ - [amplitudeCM](#amplitudeCM) = 0
+ {: .sp-vec}
+
+=== "Gothic 1 (Save)"
+
+ *Unavailable*
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCEarthquake
+ {: .sp-class}
+ - Earthquake
+ {: .sp-folder}
+ - [radius](#radius) = 200
+ {: .sp-float}
+ - [timeSec](#timeSec) = 5
+ {: .sp-float}
+ - [amplitudeCM](#amplitudeCM) = 0
+ {: .sp-vec}
+
+## Class member overview
+
+### `radius` {: .sp-float}
+
+The radius of the earthquake effect
+
+### `timeSec` {: .sp-float}
+
+The duration of the earthquake effect in seconds.
+
+### `amplitudeCM` {: .sp-float}
+
+The amplitude of the earthquake effect.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCPFXControler.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCPFXControler.md
new file mode 100644
index 0000000000..1c9f491dd0
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCPFXControler.md
@@ -0,0 +1,95 @@
+# zCPFXController
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCPFXControler`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zcpfxcontroler/1-1-0-518)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCPFXController/)
+
+A particle system in virtual space. Its effect can be activated and deactivated using the `OnTrigger` and `OnUntrigger`
+events.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCPFXController
+ {: .sp-class}
+ - [pfxName](#pfxname) = ""
+ {: .sp-string}
+ - [killVobWhenDone](#killvobwhendone) = TRUE
+ {: .sp-bool}
+ - [pfxStartOn](#pfxstarton) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCPFXController
+ {: .sp-class}
+ - [pfxName](#pfxname) = ""
+ {: .sp-string}
+ - [killVobWhenDone](#killvobwhendone) = TRUE
+ {: .sp-bool}
+ - [pfxStartOn](#pfxstarton) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCPFXController
+ {: .sp-class}
+ - [pfxName](#pfxname) = ""
+ {: .sp-string}
+ - [killVobWhenDone](#killvobwhendone) = TRUE
+ {: .sp-bool}
+ - [pfxStartOn](#pfxstarton) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCPFXController
+ {: .sp-class}
+ - [pfxName](#pfxname) = ""
+ {: .sp-string}
+ - [killVobWhenDone](#killvobwhendone) = TRUE
+ {: .sp-bool}
+ - [pfxStartOn](#pfxstarton) = TRUE
+ {: .sp-bool}
+
+## Class member overview
+
+### `pfxName` {: .sp-string}
+
+The name of the particle effect. Corresponds to a `.ZEN` file containing the particle system definition.
+
+### `killVobWhenDone` {: .sp-bool}
+
+Disable the particle effect after it runs once.
+
+### `pfxStartOn` {: .sp-bool}
+
+Whether to start the particle effect when the level is loaded.
+
+**Accepted values:**
+
+* `TRUE` — Start the particle effect when loading the world.
+* `FALSE` — Don't start the particle effect automatically.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/index.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/index.md
new file mode 100644
index 0000000000..8fc532c06f
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/index.md
@@ -0,0 +1,250 @@
+# zCTouchDamage
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTouchDamage`
+ **Version Identifiers:**
+ — Gothic I: `36865`
+ — Gothic II: `36865`
+ **Source:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/octouchdamage/1-1-0-522#damage)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTouchDamage/)
+
+A VObject which damages other VObjects colliding with it.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - zCTouchDamage
+ {: .sp-class}
+ - TouchDamage
+ {: .sp-folder}
+ - [damage](#damage) = 0
+ {: .sp-float}
+ - DamageType
+ {: .sp-folder}
+ - [Barrier](#barrier) = TRUE
+ {: .sp-bool}
+ - [Blunt](#blunt) = FALSE
+ {: .sp-bool}
+ - [Edge](#edge) = FALSE
+ {: .sp-bool}
+ - [Fire](#fire) = FALSE
+ {: .sp-bool}
+ - [Fly](#fly) = FALSE
+ {: .sp-bool}
+ - [Magic](#magic) = FALSE
+ {: .sp-bool}
+ - [Point](#point) = FALSE
+ {: .sp-bool}
+ - [Fall](#fall) = FALSE
+ {: .sp-bool}
+ - [damageRepeatDelaySec](#damagerepeatdelaysec) = 0
+ {: .sp-float}
+ - [damageVolDownScale](#damagevoldownscale) = 0
+ {: .sp-float}
+ - [damageCollType](#damagecolltype) = BOX
+ {: .sp-enum}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - zCTouchDamage
+ {: .sp-class}
+ - TouchDamage
+ {: .sp-folder}
+ - [damage](#damage) = 0
+ {: .sp-float}
+ - DamageType
+ {: .sp-folder}
+ - [Barrier](#barrier) = TRUE
+ {: .sp-bool}
+ - [Blunt](#blunt) = FALSE
+ {: .sp-bool}
+ - [Edge](#edge) = FALSE
+ {: .sp-bool}
+ - [Fire](#fire) = FALSE
+ {: .sp-bool}
+ - [Fly](#fly) = FALSE
+ {: .sp-bool}
+ - [Magic](#magic) = FALSE
+ {: .sp-bool}
+ - [Point](#point) = FALSE
+ {: .sp-bool}
+ - [Fall](#fall) = FALSE
+ {: .sp-bool}
+ - [damageRepeatDelaySec](#damagerepeatdelaysec) = 0
+ {: .sp-float}
+ - [damageVolDownScale](#damagevoldownscale) = 0
+ {: .sp-float}
+ - [damageCollType](#damagecolltype) = BOX
+ {: .sp-enum}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - zCTouchDamage
+ {: .sp-class}
+ - TouchDamage
+ {: .sp-folder}
+ - [damage](#damage) = 0
+ {: .sp-float}
+ - DamageType
+ {: .sp-folder}
+ - [Barrier](#barrier) = TRUE
+ {: .sp-bool}
+ - [Blunt](#blunt) = FALSE
+ {: .sp-bool}
+ - [Edge](#edge) = FALSE
+ {: .sp-bool}
+ - [Fire](#fire) = FALSE
+ {: .sp-bool}
+ - [Fly](#fly) = FALSE
+ {: .sp-bool}
+ - [Magic](#magic) = FALSE
+ {: .sp-bool}
+ - [Point](#point) = FALSE
+ {: .sp-bool}
+ - [Fall](#fall) = FALSE
+ {: .sp-bool}
+ - [damageRepeatDelaySec](#damagerepeatdelaysec) = 0
+ {: .sp-float}
+ - [damageVolDownScale](#damagevoldownscale) = 0
+ {: .sp-float}
+ - [damageCollType](#damagecolltype) = BOX
+ {: .sp-enum}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - zCTouchDamage
+ {: .sp-class}
+ - TouchDamage
+ {: .sp-folder}
+ - [damage](#damage) = 0
+ {: .sp-float}
+ - DamageType
+ {: .sp-folder}
+ - [Barrier](#barrier) = TRUE
+ {: .sp-bool}
+ - [Blunt](#blunt) = FALSE
+ {: .sp-bool}
+ - [Edge](#edge) = FALSE
+ {: .sp-bool}
+ - [Fire](#fire) = FALSE
+ {: .sp-bool}
+ - [Fly](#fly) = FALSE
+ {: .sp-bool}
+ - [Magic](#magic) = FALSE
+ {: .sp-bool}
+ - [Point](#point) = FALSE
+ {: .sp-bool}
+ - [Fall](#fall) = FALSE
+ {: .sp-bool}
+ - [damageRepeatDelaySec](#damagerepeatdelaysec) = 0
+ {: .sp-float}
+ - [damageVolDownScale](#damagevoldownscale) = 0
+ {: .sp-float}
+ - [damageCollType](#damagecolltype) = BOX
+ {: .sp-enum}
+
+## Class member overview
+
+### `damage` {: .sp-float}
+
+The amount of damage being dealt.
+
+### `Barrier` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal barrier damage
+* `FALSE` — Do not deal barrier damage
+
+### `Blunt` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal blunt damage (blunt weapons)
+* `FALSE` — Do not deal blunt damage
+
+### `Edge` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal edge damage (sharp weapons)
+* `FALSE` — Do not deal edge damage
+
+### `Fire` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal fire damage
+* `FALSE` — Do not deal fire damage
+
+### `Fly` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal knockout damage
+* `FALSE` — Do not deal knockout damage
+
+### `Magic` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal magic damage
+* `FALSE` — Do not deal magic damage
+
+### `Point` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal point damage (bows and crossbows)
+* `FALSE` — Do not deal point damage
+
+### `Fall` {: .sp-bool}
+
+**Accepted values:**
+
+* `TRUE` — Deal fall damage
+* `FALSE` — Do not deal fall damage
+
+### `damageRepeatDelaySec` {: .sp-float}
+
+The delay between damage ticks when applying continuous damage. If set to `0`, only deals the damage once per
+collision. If set to a value greater than `0`, deals damage every `damageRepeatDelaySec` seconds.
+
+### `damageVolDownScale` {: .sp-float}
+
+A scale value used in conjunction with [`damageCollType`](#damagecolltype). Its function depends on the type of
+collision detection used.
+
+### `damageCollType` {: .sp-enum}
+
+The type of collision detection to use for damage calculations.
+
+**Accepted values:**
+
+* `NONE` — Disable collision detection and thus damage application.
+* `BOX` — Scale the [`bbox3dws`](../../index.md#bbox3dws) of the `zCTouchDamage` object by
+ [`damageVolDownScale`](#damagevoldownscale) and use this new bounding box to calculate
+ collisions with other VObjects
+* `POINT` — Scale the [`bbox3dws`](../../index.md#bbox3dws) of the colliding object by
+ [`damageVolDownScale`](#damagevoldownscale) and only deal damage if it contains the center
+ point of the `zCTouchDamage` object. If the `visual` of the `zCTouchDamage` object is a particle effect,
+ test against every particle instead.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/oCTouchDamage.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/oCTouchDamage.md
new file mode 100644
index 0000000000..1b9f3054ba
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCTouchDamage/oCTouchDamage.md
@@ -0,0 +1,64 @@
+# oCTouchDamage
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCTouchDamage`
+ **Version Identifiers:**
+ — Gothic I: `36865`
+ — Gothic II: `36865`
+ **ZenKit Class:** `VTouchDamage`
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCTouchDamage/)
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - [zCTouchDamage](index.md)
+ {: .sp-class}
+ - oCTouchDamage
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - [zCTouchDamage](index.md)
+ {: .sp-class}
+ - oCTouchDamage
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - [zCTouchDamage](index.md)
+ {: .sp-class}
+ - oCTouchDamage
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCEffect*](../index.md)
+ {: .sp-class}
+ - [zCTouchDamage](index.md)
+ {: .sp-class}
+ - oCTouchDamage
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobAnimate.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobAnimate.md
new file mode 100644
index 0000000000..8dc80fef4d
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobAnimate.md
@@ -0,0 +1,84 @@
+# zCVobAnimate
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobAnimate`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zcvobanimate/1-1-0-523)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobAnimate/)
+
+
+A VObject used to create animated models. The visual of such objects can either be a morph mesh or a model with a
+skeletal animation (i.e. a model script). The animation of these objects can be started and stopped using `OnTrigger`
+and `OnUntrigger` events.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobAnimate
+ {: .sp-class}
+ - [startOn](#starton) = ""
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobAnimate
+ {: .sp-class}
+ - [startOn](#starton) = ""
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobAnimate
+ {: .sp-class}
+ - [startOn](#starton) = ""
+ {: .sp-bool}
+ - [isRunning](#isrunning) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobAnimate
+ {: .sp-class}
+ - [startOn](#starton) = ""
+ {: .sp-bool}
+ - [isRunning](#isrunning) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `startOn` {: .sp-bool}
+
+Whether to start this animation when loading the level.
+
+**Accepted values:**
+
+* `TRUE` — Immediately start the animation when the level is loaded.
+* `FALSE` — Don't automatically start the animation.
+
+### `isRunning` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobLensFlare.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobLensFlare.md
new file mode 100644
index 0000000000..50e81ebe63
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobLensFlare.md
@@ -0,0 +1,65 @@
+# zCVobLensFlare
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobLensFlare`
+ **Version Identifiers:**
+ — Gothic I: `64704`
+ — Gothic II: `193`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvoblensflare/1-1-0-524)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobLensFlare/)
+
+Represents a lens flare effect. Behaves exactly like the base [`zCVob`](../index.md) but has a lens flare effect.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobLensFlare
+ {: .sp-class}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobLensFlare
+ {: .sp-class}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobLensFlare
+ {: .sp-class}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobLensFlare
+ {: .sp-class}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `lensflareFX` {: .sp-string}
+
+The name of the lens flare effect. Must be one of the effects listed in `/_work/data/Presets/Lensflare.zen`.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobScreenFX.md b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobScreenFX.md
new file mode 100644
index 0000000000..e7b5c9855b
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCEffect/zCVobScreenFX.md
@@ -0,0 +1,60 @@
+# zCVobScreenFX
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobScreenFX`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zcvobscreenfx/1-1-0-525)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobScreenFX/)
+
+Screen effect VObjects are used to create special effects. They are used for field-of-view changes, adding black bars
+for a cinematic feel to the game and other post-processing effects.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobScreenFX
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobScreenFX
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobScreenFX
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCEffect*](index.md)
+ {: .sp-class}
+ - zCVobScreenFX
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/index.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/index.md
new file mode 100644
index 0000000000..25443b9c44
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/index.md
@@ -0,0 +1,58 @@
+# zCTriggerBase
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTriggerBase`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTriggerBase/)
+
+The base class for many triggers.
+
+!!! warning
+ This object is an abstract base class and cannot be instantiated by itself.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCTriggerBase
+ {: .sp-class}
+ - [triggerTarget](#triggerTarget) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCTriggerBase
+ {: .sp-class}
+ - [triggerTarget](#triggerTarget) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCTriggerBase
+ {: .sp-class}
+ - [triggerTarget](#triggerTarget) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCTriggerBase
+ {: .sp-class}
+ - [triggerTarget](#triggerTarget) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `triggerTarget` {: .sp-string}
+
+The name of VObject to send `OnTrigger` and `OnUntrigger` events to after processing.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCCodeMaster.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCCodeMaster.md
new file mode 100644
index 0000000000..beae35a364
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCCodeMaster.md
@@ -0,0 +1,178 @@
+# zCCodeMaster
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCCodeMaster`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Source:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/zccodemaster/1-1-0-526)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCCodeMaster/)
+
+`zCCodeMaster` VObjects keep a list of 'slave' VObjects and keep track of events received by them. If the master
+receives an `OnTrigger` event from a slave, it remembers that it did. After it has receives an `OnTrigger` message
+from all slaves, it emits an `OnTrigger` event to the [`triggerTarget`](index.md#triggertarget). Receiving or sending an
+`OnTrigger` event is also referred to as an 'activation' for this purpose.
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCCodeMaster
+ {: .sp-class}
+ - CodeMaster
+ {: .sp-folder}
+ - [orderRelevant](#orderrelevant) = FALSE
+ {: .sp-bool}
+ - OrderRelevant
+ {: .sp-folder}
+ - [firstFalseIsFailure](#firstfalseisfailure) = TRUE
+ {: .sp-bool}
+ - [triggerTargetFailure](#triggertargetfailure) = ""
+ {: .sp-string}
+ - OrderNotRelevant
+ {: .sp-folder}
+ - [untriggerCancels](#untriggercancels) = FALSE
+ {: .sp-bool}
+ - [slaveVobName](#slavevobname) ... = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCCodeMaster
+ {: .sp-class}
+ - CodeMaster
+ {: .sp-folder}
+ - [orderRelevant](#orderrelevant) = FALSE
+ {: .sp-bool}
+ - OrderRelevant
+ {: .sp-folder}
+ - [firstFalseIsFailure](#firstfalseisfailure) = TRUE
+ {: .sp-bool}
+ - [triggerTargetFailure](#triggertargetfailure) = ""
+ {: .sp-string}
+ - OrderNotRelevant
+ {: .sp-folder}
+ - [untriggerCancels](#untriggercancels) = FALSE
+ {: .sp-bool}
+ - [slaveVobName](#slavevobname) ... = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCCodeMaster
+ {: .sp-class}
+ - CodeMaster
+ {: .sp-folder}
+ - [orderRelevant](#orderrelevant) = FALSE
+ {: .sp-bool}
+ - OrderRelevant
+ {: .sp-folder}
+ - [firstFalseIsFailure](#firstfalseisfailure) = TRUE
+ {: .sp-bool}
+ - [triggerTargetFailure](#triggertargetfailure) = ""
+ {: .sp-string}
+ - OrderNotRelevant
+ {: .sp-folder}
+ - [untriggerCancels](#untriggercancels) = FALSE
+ {: .sp-bool}
+ - [slaveVobName](#slavevobname) ... = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCCodeMaster
+ {: .sp-class}
+ - CodeMaster
+ {: .sp-folder}
+ - [orderRelevant](#orderrelevant) = FALSE
+ {: .sp-bool}
+ - OrderRelevant
+ {: .sp-folder}
+ - [firstFalseIsFailure](#firstfalseisfailure) = TRUE
+ {: .sp-bool}
+ - [triggerTargetFailure](#triggertargetfailure) = ""
+ {: .sp-string}
+ - OrderNotRelevant
+ {: .sp-folder}
+ - [untriggerCancels](#untriggercancels) = FALSE
+ {: .sp-bool}
+ - [slaveVobName](#slavevobname) ... = ""
+ {: .sp-string}
+ - [numSlavesTriggered](#numslavestriggered) = 0
+ {: .sp-int}
+ - slaveTriggered ... = NULL
+ {: .sp-class}
+
+## Class member overview
+
+### `orderRelevant` {: .sp-bool}
+
+Controls whether the master should keep track of the order it receives messages from its slaves.
+
+**Accepted values:**
+
+* `TRUE` — Only send an `OnTrigger` event to the [`triggerTarget`](index.md#triggertarget) if the slaves have fired in
+ the exact order they are configured here. Also counts multiple activations.
+* `FALSE` — Send an `OnTrigger` event to the [`triggerTarget`](index.md#triggertarget) after all slaves have fired at least
+ once, regardless of order.
+
+### `firstFalseIsFailure` {: .sp-bool}
+
+Controls when the slave activation sequence is considered to be incorrect. After the sequence is marked as
+incorrect an `OnTrigger` event is sent to [`triggerTargetFailure`](#triggertargetfailure).
+
+**Accepted values:**
+
+* `TRUE` — The sequence is considered to be incorrect as soon as one slave is activated out-of-order.
+* `FALSE` — The sequence is considered to be incorrect only after all slaves have been activated at least once and
+ they were activated out-of-order.
+
+!!! warning
+ Only relevant if [`orderRelevant`](#orderrelevant) is set to `TRUE`.
+
+### `triggerTargetFailure` {: .sp-string}
+
+The name of the VObject to emit an `OnTrigger` event to if the activation sequence fails. This is controlled by
+[`firstFalseIsFailure`](#firstfalseisfailure).
+
+!!! warning
+ Only relevant if [`orderRelevant`](#orderrelevant) is set to `TRUE`.
+
+### `untriggerCancels` {: .sp-bool}
+
+Controls whether slaves can emit `OnUntrigger` events to the master VObject to mark themselves as deactivated.
+
+**Accepted values:**
+
+* `TRUE` — When the master receives an `OnUntrigger` event from the slave, it marks it as not having been activated.
+* `FALSE` — The master ignore `OnUntrigger` events from its slaves.
+
+!!! warning
+ Only relevant if [`orderRelevant`](#orderrelevant) is set to `FALSE`.
+
+### `slaveVobName` {: .sp-string}
+
+The name of a slave VObject.
+
+### `numSlavesTriggered` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMessageFilter.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMessageFilter.md
new file mode 100644
index 0000000000..4b1809a442
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMessageFilter.md
@@ -0,0 +1,97 @@
+# zCMessageFilter
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCMessageFilter`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCMessageFilter/)
+
+Transforms any incoming `OnTrigger` and `OnUntrigger` events before passing them on to the trigger target. All
+`OnTrigger` and `OnUntrigger` messages received by this `zCMessageFilter` VObject are transformed according to
+[`onTrigger`](#ontrigger) and [`onUntrigger`](#onuntrigger) and then passed on to the VObject with the name specified
+in the [`triggerTarget`](index.md#triggertarget).
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMessageFilter
+ {: .sp-class}
+ - [onTrigger](#ontrigger) = MT_TRIGGER
+ {: .sp-enum}
+ - [onUntrigger](#onuntrigger) = MT_UNTRIGGER
+ {: .sp-enum}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMessageFilter
+ {: .sp-class}
+ - [onTrigger](#ontrigger) = MT_TRIGGER
+ {: .sp-enum}
+ - [onUntrigger](#onuntrigger) = MT_UNTRIGGER
+ {: .sp-enum}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMessageFilter
+ {: .sp-class}
+ - [onTrigger](#ontrigger) = MT_TRIGGER
+ {: .sp-enum}
+ - [onUntrigger](#onuntrigger) = MT_UNTRIGGER
+ {: .sp-enum}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMessageFilter
+ {: .sp-class}
+ - [onTrigger](#ontrigger) = MT_TRIGGER
+ {: .sp-enum}
+ - [onUntrigger](#onuntrigger) = MT_UNTRIGGER
+ {: .sp-enum}
+
+## Class member overview
+
+### `onTrigger` {: .sp-enum}
+
+The type of event to emit to the [`triggerTarget`](#triggertarget) if this VObject receives an `OnTrigger` message.
+
+**Accepted values:**
+
+* `MT_NONE` — Don't emit another event.
+* `MT_TRIGGER` — Emit an `OnTrigger` event.
+* `MT_UNTRIGGER` — Emit an `OnUntrigger` event.
+* `MT_ENABLE` — Emit an `Enable` event.
+* `MT_DISABLE` — Emit a `Disable` event.
+* `MT_TOGGLE_ENABLED` — Emit a `ToggleEnabled` event.
+
+### `onUntrigger` {: .sp-enum}
+
+The type of event to emit to the [`triggerTarget`](#triggertarget) if this VObject receives an `OnUntrigger` message.
+
+**Accepted values:**
+
+* `MT_NONE` — Don't emit another event.
+* `MT_TRIGGER` — Emit an `OnTrigger` event.
+* `MT_UNTRIGGER` — Emit an `OnUntrigger` event.
+* `MT_ENABLE` — Emit an `Enable` event.
+* `MT_DISABLE` — Emit a `Disable` event.
+* `MT_TOGGLE_ENABLED` — Emit a `ToggleEnabled` event.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMoverControler.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMoverControler.md
new file mode 100644
index 0000000000..062aaf1f87
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCMoverControler.md
@@ -0,0 +1,93 @@
+# zCMoverControler
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCMoverControler`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcmovercontroler/1-1-0-528)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCMoverController/)
+
+A VObject used to control [`zCMover`](zCTrigger/zCMover.md) objects of type `NSTATE_SINGLE_KEYS` specifically.
+`zCMoverControler` objects react to incoming `OnTrigger` events to send a pre-configured event to the target mover
+object named by the [`triggerTarget`](index.md#triggertarget) propery, controlling its animation. Mover
+controllers can make movers go to a specific keyframe in their animation or just step one keyframe back and forth
+at a time.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMoverControler
+ {: .sp-class}
+ - [moverMessage](#movermessage) = GOTO_KEY_FIXED_DIRECTLY
+ {: .sp-enum}
+ - [gotoFixedKey](#gotofixedkey) = 0
+ {: .sp-int}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMoverControler
+ {: .sp-class}
+ - [moverMessage](#movermessage) = GOTO_KEY_FIXED_DIRECTLY
+ {: .sp-enum}
+ - [gotoFixedKey](#gotofixedkey) = 0
+ {: .sp-int}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMoverControler
+ {: .sp-class}
+ - [moverMessage](#movermessage) = GOTO_KEY_FIXED_DIRECTLY
+ {: .sp-enum}
+ - [gotoFixedKey](#gotofixedkey) = 0
+ {: .sp-int}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCMoverControler
+ {: .sp-class}
+ - [moverMessage](#movermessage) = GOTO_KEY_FIXED_DIRECTLY
+ {: .sp-enum}
+ - [gotoFixedKey](#gotofixedkey) = 0
+ {: .sp-int}
+
+## Class member overview
+
+### `moverMessage` {: .sp-enum}
+
+The type of event to emit to the [`triggerTarget`](index.md#triggertarget) when this controller receives an `OnTrigger` event.
+
+**Accepted values:**
+
+* `GOTO_KEY_FIXED_DIRECTLY` — Make the target mover directly go to the keyframe specified
+ in [`gotoFixedKey`](#gotofixedkey), skipping all intermediate keyframes.
+* `GOTO_KEY_FIXED_ORDER` — Make the target mover go to the keyframe specified in in [`gotoFixedKey`](#gotofixedkey)
+ while still going through all intermediate keyframes.
+* `GOTO_KEY_NEXT` — Make the target mover go to the next keyframe in sequence. Wraps around to the first keyframe.
+* `GOTO_KEY_PREV` — Make the target mover go to the previous keyframe in sequence. Wraps around to the last keyframe.
+
+### `gotoFixedKey` {: .sp-int}
+
+The keyframe of the mover referred to by [`triggerTarget`](index.md#triggertarget) to move to.
+
+!!! warning
+ Only relevant if [`moverMessage`](#movermessage) is `GOTO_KEY_FIXED_DIRECTLY` or `GOTO_KEY_FIXED_ORDER`.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/index.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/index.md
new file mode 100644
index 0000000000..a3333da6f8
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/index.md
@@ -0,0 +1,331 @@
+# zCTrigger
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTrigger`
+ **Version Identifiers:**
+ — Gothic I: `47105`
+ — Gothic II: `47105`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zctrigger/1-1-0-529)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTrigger/)
+
+VObject to process and relay specific filtered events. When a `zCTrigger` receives an `OnTrigger`, `OnDamage`, or
+`OnTouch` event it checks whether the event source (an `oCNpc`, the player or another VObject) should
+be acknowledged (see [`respondToNPC`](#respondtonpc), [`respondToPC`](#respondtopc) and
+[`respondToObject`](#respondToObject) respectively). It then verifies if it should react to the specific event by
+checking the [`reactToOnTrigger`](#reacttoontrigger), [`reactToOnDamage`](#reacttoondamage) and
+[`reactToOnTouch`](#reacttoontouch) properties. If both checks succeed, an `OnTrigger` event is sent to the
+[`triggerTarget`](#triggertarget) and the trigger is considered to be *activated*. `zCTrigger` objects can be enabled
+and disabled by firing `OnEnable`, `OnDisable` and `OnToggleEnabled` events at them.
+
+!!! tip
+ The `respondTo{Object,PC,NPC,VobName}` properties are logically linked by and "or" expression.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - zCTrigger
+ {: .sp-class}
+ - Trigger
+ {: .sp-folder}
+ - ActivationFilter
+ {: .sp-folder}
+ - [reactToOnTrigger](#reacttoontrigger) = TRUE
+ {: .sp-bool}
+ - [reactToOnTouch](#reacttoontouch) = TRUE
+ {: .sp-bool}
+ - [reactToOnDamage](#reacttoondamage) = TRUE
+ {: .sp-bool}
+ - [respondToObject](#respondtoobject) = TRUE
+ {: .sp-bool}
+ - [respondToPC](#respondtopc) = TRUE
+ {: .sp-bool}
+ - [respondToNPC](#respondtonpc) = TRUE
+ {: .sp-bool}
+ - [startEnabled](#startenabled) = TRUE
+ {: .sp-bool}
+ - [respondToVobName](#respondtovobname) = ""
+ {: .sp-string}
+ - [numCanBeActivated](#numcanbeactivated) = -1
+ {: .sp-int}
+ - [retriggerWaitSec](#retriggerwaitsec) = 0
+ {: .sp-float}
+ - [damageThreshold](#damagethreshold) = 0
+ {: .sp-float}
+ - FireBehavior
+ {: .sp-folder}
+ - [fireDelaySec](#firedelaysec) = 0
+ {: .sp-float}
+ - [sendUntrigger](#senduntrigger) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - zCTrigger
+ {: .sp-class}
+ - Trigger
+ {: .sp-folder}
+ - ActivationFilter
+ {: .sp-folder}
+ - [reactToOnTrigger](#reacttoontrigger) = TRUE
+ {: .sp-bool}
+ - [reactToOnTouch](#reacttoontouch) = TRUE
+ {: .sp-bool}
+ - [reactToOnDamage](#reacttoondamage) = TRUE
+ {: .sp-bool}
+ - [respondToObject](#respondtoobject) = TRUE
+ {: .sp-bool}
+ - [respondToPC](#respondtopc) = TRUE
+ {: .sp-bool}
+ - [respondToNPC](#respondtonpc) = TRUE
+ {: .sp-bool}
+ - [startEnabled](#startenabled) = TRUE
+ {: .sp-bool}
+ - [respondToVobName](#respondtovobname) = ""
+ {: .sp-string}
+ - [numCanBeActivated](#numcanbeactivated) = -1
+ {: .sp-int}
+ - [retriggerWaitSec](#retriggerwaitsec) = 0
+ {: .sp-float}
+ - [damageThreshold](#damagethreshold) = 0
+ {: .sp-float}
+ - FireBehavior
+ {: .sp-folder}
+ - [fireDelaySec](#firedelaysec) = 0
+ {: .sp-float}
+ - [sendUntrigger](#senduntrigger) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - zCTrigger
+ {: .sp-class}
+ - Trigger
+ {: .sp-folder}
+ - ActivationFilter
+ {: .sp-folder}
+ - [reactToOnTrigger](#reacttoontrigger) = TRUE
+ {: .sp-bool}
+ - [reactToOnTouch](#reacttoontouch) = TRUE
+ {: .sp-bool}
+ - [reactToOnDamage](#reacttoondamage) = TRUE
+ {: .sp-bool}
+ - [respondToObject](#respondtoobject) = TRUE
+ {: .sp-bool}
+ - [respondToPC](#respondtopc) = TRUE
+ {: .sp-bool}
+ - [respondToNPC](#respondtonpc) = TRUE
+ {: .sp-bool}
+ - [startEnabled](#startenabled) = TRUE
+ {: .sp-bool}
+ - [respondToVobName](#respondtovobname) = ""
+ {: .sp-string}
+ - [numCanBeActivated](#numcanbeactivated) = -1
+ {: .sp-int}
+ - [retriggerWaitSec](#retriggerwaitsec) = 0
+ {: .sp-float}
+ - [damageThreshold](#damagethreshold) = 0
+ {: .sp-float}
+ - FireBehavior
+ {: .sp-folder}
+ - [fireDelaySec](#firedelaysec) = 0
+ {: .sp-float}
+ - [sendUntrigger](#senduntrigger) = TRUE
+ {: .sp-bool}
+ - [nextTimeTriggerable](#nexttimetriggerable) = 0.0
+ {: .sp-float}
+ - [savedOtherVob](#savedothervob) = NULL
+ {: .sp-class}
+ - [countCanBeActivated](#countcanbeactivated)
+ {: .sp-int}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - zCTrigger
+ {: .sp-class}
+ - Trigger
+ {: .sp-folder}
+ - ActivationFilter
+ {: .sp-folder}
+ - [reactToOnTrigger](#reacttoontrigger) = TRUE
+ {: .sp-bool}
+ - [reactToOnTouch](#reacttoontouch) = TRUE
+ {: .sp-bool}
+ - [reactToOnDamage](#reacttoondamage) = TRUE
+ {: .sp-bool}
+ - [respondToObject](#respondtoobject) = TRUE
+ {: .sp-bool}
+ - [respondToPC](#respondtopc) = TRUE
+ {: .sp-bool}
+ - [respondToNPC](#respondtonpc) = TRUE
+ {: .sp-bool}
+ - [startEnabled](#startenabled) = TRUE
+ {: .sp-bool}
+ - [respondToVobName](#respondtovobname) = ""
+ {: .sp-string}
+ - [numCanBeActivated](#numcanbeactivated) = -1
+ {: .sp-int}
+ - [retriggerWaitSec](#retriggerwaitsec) = 0
+ {: .sp-float}
+ - [damageThreshold](#damagethreshold) = 0
+ {: .sp-float}
+ - FireBehavior
+ {: .sp-folder}
+ - [fireDelaySec](#firedelaysec) = 0
+ {: .sp-float}
+ - [sendUntrigger](#senduntrigger) = TRUE
+ {: .sp-bool}
+ - [nextTimeTriggerable](#nexttimetriggerable) = 0.0
+ {: .sp-float}
+ - [savedOtherVob](#savedothervob) = NULL
+ {: .sp-class}
+ - [countCanBeActivated](#countcanbeactivated) = 0
+ {: .sp-int}
+ - [isEnabled](#isenabled) = TRUE
+ {: .sp-bool}
+
+## Class member overview
+
+### `reactToOnTrigger` {: .sp-bool}
+
+Whether this trigger should react to `OnTrigger` events.
+
+**Accepted values:**
+
+* `TRUE` — Do react to `OnTrigger` events by sending an `OnTrigger` message to the [`triggerTarget`](#triggertarget)
+ If [`sendUntrigger`](#senduntrigger) is set to `TRUE`, also sends an `OnUntrigger` event to the [`triggerTarget`](#triggertarget)
+ if the trigger receives an `OnUntrigger` event.
+* `FALSE` — Ignore `OnTrigger` events.
+
+### `reactToOnTouch` {: .sp-bool}
+
+Whether this trigger should react to `OnTouch` events.
+
+**Accepted values:**
+
+* `TRUE` — Do react to `OnTouch` events by sending an `OnTrigger` message to the [`triggerTarget`](#triggertarget)
+ If [`sendUntrigger`](#senduntrigger) is set to `TRUE`, also sends an `OnUntrigger` event to the [`triggerTarget`](#triggertarget)
+ if the trigger receives an `OnUntouch` event.
+* `FALSE` — Ignore `OnTouch` events.
+
+### `reactToOnDamage` {: .sp-bool}
+
+Whether this trigger should react to `OnDamage` events.
+
+**Accepted values:**
+
+* `TRUE` — Do react to `OnDamage` events by sending an `OnTrigger` message to the [`triggerTarget`](#triggertarget)
+* `FALSE` — Ignore `OnDamage` events.
+
+### `respondToObject` {: .sp-bool}
+
+Whether this trigger should process events coming from inanimate objects.
+
+**Accepted values:**
+
+* `TRUE` — Do process events from inanimate objects.
+* `FALSE` — Ignore events from inanimate objects.
+
+### `respondToPC` {: .sp-bool}
+
+Whether this trigger should process events coming from the player.
+
+**Accepted values:**
+
+* `TRUE` — Do process events from the player.
+* `FALSE` — Ignore events from the player.
+
+### `respondToNPC` {: .sp-bool}
+
+Whether this trigger should process events coming from NPCs.
+
+**Accepted values:**
+
+* `TRUE` — Do process events from NPCs.
+* `FALSE` — Ignore events from NPCs.
+
+### `startEnabled` {: .sp-bool}
+
+Determines whether the trigger is initially enabled. Enabled triggers will process incoming events and send
+outgoing events while disabled triggers do not. Triggers can be activated and deactivated at runtime by sending
+them `OnEnable`, `OnDisable` or `OnToggleEnabled` events.
+
+**Accepted values:**
+
+* `TRUE` — Enable the trigger when the world is loaded.
+* `FALSE` — Do not enable the trigger when the world is loaded.
+
+### `respondToVobName` {: .sp-string}
+
+Whether this trigger should process events coming from VObjects with this name. If empty, match no VObject
+name directly.
+
+### `numCanBeActivated` {: .sp-int}
+
+The number of times the trigger will process incoming events. If set to `-1` the trigger will process
+an infinite number of events.
+
+### `retriggerWaitSec` {: .sp-float}
+
+The number of seconds that have to elapse after processing an event before the trigger will process additional events.
+All events received by the trigger during that time are ignored.
+
+### `damageThreshold` {: .sp-float}
+
+The amount of damage which must be dealt for the trigger to react to an `OnDamage` event.
+
+### `fireDelaySec` {: .sp-float}
+
+The number of seconds to wait before emitting the `OnTrigger` event after processing.
+
+### `sendUntrigger` {: .sp-bool}
+
+Whether to send and `OnUntrigger` event to the [`triggerTarget`](#triggertarget) after the trigger receives an
+`OnUntrigger` or `OnUntouch` event. Only fires the `OnUntrigger` event if [`reactToOnTrigger`](#reacttoontrigger)
+and [`reactToOnTouch`](#reacttoontouch) are set to `TRUE` respectively.
+
+### `nextTimeTriggerable` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `savedOtherVob` {: .sp-class}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `countCanBeActivated` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `isEnabled` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games made using Gothic II.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCCSTrigger.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCCSTrigger.md
new file mode 100644
index 0000000000..0a06ad4cee
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCCSTrigger.md
@@ -0,0 +1,69 @@
+# oCCSTrigger
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCCSTrigger`
+ **Version Identifiers:**
+ — Gothic I: `24577`
+ — Gothic II: `24577`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_occstrigger/1-1-0-530)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCCSTrigger/)
+
+A special trigger VObject which can start a cutscene. The [`triggerTarget`](../index.md#triggertarget) must be the
+name of the cutscene (without the extension) to be started. For this to work, the cutscene must already be loaded.
+`OnUntrigger` events are ignored by `oCCSTrigger`s.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCCSTrigger
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCCSTrigger
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCCSTrigger
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCCSTrigger
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerChangeLevel.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerChangeLevel.md
new file mode 100644
index 0000000000..edebe26abc
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerChangeLevel.md
@@ -0,0 +1,85 @@
+# oCTriggerChangeLevel
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCTriggerChangeLevel`
+ **Version Identifiers:**
+ — Gothic I: `24577`
+ — Gothic II: `24577`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCTriggerChangeLevel/)
+
+A special [`zCTrigger`](index.md) which in addition to performing all other trigger actions also causes the engine
+to load another level when activated.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerChangeLevel
+ {: .sp-class}
+ - [levelName](#levelname) = ""
+ {: .sp-string}
+ - [startVobName](#startvobname) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerChangeLevel
+ {: .sp-class}
+ - [levelName](#levelname) = ""
+ {: .sp-string}
+ - [startVobName](#startvobname) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerChangeLevel
+ {: .sp-class}
+ - [levelName](#levelname) = ""
+ {: .sp-string}
+ - [startVobName](#startvobname) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerChangeLevel
+ {: .sp-class}
+ - [levelName](#levelname) = ""
+ {: .sp-string}
+ - [startVobName](#startvobname) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `levelName` {: .sp-string}
+
+The name of the level to load including the file extension.
+
+### `startVobName` {: .sp-string}
+
+The name of the VObject in the new level to place the player at.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerScript.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerScript.md
new file mode 100644
index 0000000000..3d43c97271
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/oCTriggerScript.md
@@ -0,0 +1,73 @@
+# oCTriggerScript
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCTriggerScript`
+ **Version Identifiers:**
+ — Gothic I: `24577`
+ — Gothic II: `24577`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCTriggerScript/)
+
+A special [`zCTrigger`](index.md) which in addition to performing all other trigger actions also calls a script
+function when the trigger is activated. `OnUntrigger` events do not result in the script function being called.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerScript
+ {: .sp-class}
+ - [scriptFunc](#scriptfunc) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerScript
+ {: .sp-class}
+ - [scriptFunc](#scriptfunc) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerScript
+ {: .sp-class}
+ - [scriptFunc](#scriptfunc) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - oCTriggerScript
+ {: .sp-class}
+ - [scriptFunc](#scriptfunc) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `scriptFunc` {: .sp-string}
+
+The name script function to call when the trigger successfully processes a message.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCMover.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCMover.md
new file mode 100644
index 0000000000..a7ff2330af
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCMover.md
@@ -0,0 +1,469 @@
+# zCMover
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCMover`
+ **Version Identifiers:**
+ — Gothic I: `39936`
+ — Gothic II: `39936`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcmover/1-1-0-533)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCMover/)
+
+
+A VObject which can move along a pre-determined path in response to an event. Movers can be controlled through a set of
+keyframes or the animation of their visuals. If the visual has an attached animation to be used as the mover's animation,
+it must have the following animations which are run depending on the mover's state: `S_OPEN`, `S_CLOSED`, `T_CLOSED_2_OPEN`,
+`T_OPEN_2_CLOSED`, `S_LOCKED`, `S_UNLOCKED`, `T_UNLOCKED_TO_LOCKED`, `T_LOCKED_TO_UNLOCKED`.
+
+Each mover is in one of three states, "open", "closed" or "moving". Keyframe `0` (or `S_OPEN` when using the visual's
+animation) corresponds to the "open" state while the last keyframe (or `S_CLOSED`) corresponds to the "closed" state.
+When transitioning between the "open" and "closed" states, the mover is in the "moving" state during which it
+sequentially moves between its keyframes (or runs the `T_CLOSED_2_OPEN` or `T_OPEN_TO_CLOSED` animations). Movers with
+their [`moverBehavior`](#moverbehavior) set to `NSTATE_SINGLE_KEYS` are an exception to this rule: each keyframe can
+individually be addressed as a state.
+
+Movers are specialized triggers. Before beginning their animation, movers first filter the incoming events as per the
+[`zCTrigger`](index.md)'s rules and only start the animation if the event passes through the filters. When the mover reaches
+the "open" state after being activated, it emits an `OnTrigger` event according to the fire behavior set for the
+[`zCTrigger`](index.md). Similarly, when it reaches the "closed" state it emits an `OnUntrigger` event.
+
+Movers can be enabled and disabled using the `OnEnable`, `OnDisable` and `OnToggleDisabled` events.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCMover
+ {: .sp-class}
+ - Mover
+ {: .sp-folder}
+ - [moverBehavior](#moverbehavior) = 2STATE_TOGGLE
+ {: .sp-enum}
+ - [touchBlockerDamage](#touchblockerdamage) = 0.0
+ {: .sp-float}
+ - [stayOpenTimeSec](#stayopentimesec) = 0.0
+ {: .sp-float}
+ - [moverLocked](#moverlocked) = FALSE
+ {: .sp-bool}
+ - [autoLinkEnabled](#autolinkenabled) = FALSE
+ {: .sp-bool}
+ - Keyframe
+ {: .sp-folder}
+ - [numKeyframes](#numkeyframes) = 0
+ {: .sp-int}
+ - [moveSpeed](#movespeed) = 0.0
+ {: .sp-float}
+ - [posLerpType](#poslerptype) = CURVE
+ {: .sp-enum}
+ - [speedType](#speedtype) = CONST
+ {: .sp-enum}
+ - Sound
+ {: .sp-folder}
+ - [sfxOpenStart](#sfxopenstart) = ""
+ {: .sp-string}
+ - [sfxOpenEnd](#sfxopenend) = ""
+ {: .sp-string}
+ - [sfxMoving](#sfxmoving) = ""
+ {: .sp-string}
+ - [sfxCloseStart](#sfxclosestart) = ""
+ {: .sp-string}
+ - [sfxCloseEnd](#sfxcloseend) = ""
+ {: .sp-string}
+ - [sfxLock](#sfxlock) = ""
+ {: .sp-string}
+ - [sfxUnlock](#sfxunlock) = ""
+ {: .sp-string}
+ - [sfxUseLocked](#sfxuselocked) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCMover
+ {: .sp-class}
+ - Mover
+ {: .sp-folder}
+ - [moverBehavior](#moverbehavior) = 2STATE_TOGGLE
+ {: .sp-enum}
+ - [touchBlockerDamage](#touchblockerdamage) = 0.0
+ {: .sp-float}
+ - [stayOpenTimeSec](#stayopentimesec) = 0.0
+ {: .sp-float}
+ - [moverLocked](#moverlocked) = FALSE
+ {: .sp-bool}
+ - [autoLinkEnabled](#autolinkenabled) = FALSE
+ {: .sp-bool}
+ - [autoRotate](#autorotate) = FALSE
+ {: .sp-bool}
+ - Keyframe
+ {: .sp-folder}
+ - [numKeyframes](#numkeyframes) = 0
+ {: .sp-int}
+ - [moveSpeed](#movespeed) = 0.0
+ {: .sp-float}
+ - [posLerpType](#poslerptype) = CURVE
+ {: .sp-enum}
+ - [speedType](#speedtype) = CONST
+ {: .sp-enum}
+ - Sound
+ {: .sp-folder}
+ - [sfxOpenStart](#sfxopenstart) = ""
+ {: .sp-string}
+ - [sfxOpenEnd](#sfxopenend) = ""
+ {: .sp-string}
+ - [sfxMoving](#sfxmoving) = ""
+ {: .sp-string}
+ - [sfxCloseStart](#sfxclosestart) = ""
+ {: .sp-string}
+ - [sfxCloseEnd](#sfxcloseend) = ""
+ {: .sp-string}
+ - [sfxLock](#sfxlock) = ""
+ {: .sp-string}
+ - [sfxUnlock](#sfxunlock) = ""
+ {: .sp-string}
+ - [sfxUseLocked](#sfxuselocked) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCMover
+ {: .sp-class}
+ - Mover
+ {: .sp-folder}
+ - [moverBehavior](#moverbehavior) = 2STATE_TOGGLE
+ {: .sp-enum}
+ - [touchBlockerDamage](#touchblockerdamage) = 0.0
+ {: .sp-float}
+ - [stayOpenTimeSec](#stayopentimesec) = 0.0
+ {: .sp-float}
+ - [moverLocked](#moverlocked) = FALSE
+ {: .sp-bool}
+ - [autoLinkEnabled](#autolinkenabled) = FALSE
+ {: .sp-bool}
+ - Keyframe
+ {: .sp-folder}
+ - [numKeyframes](#numkeyframes) = 0
+ {: .sp-int}
+ - [moveSpeed](#movespeed) = 0.0
+ {: .sp-float}
+ - [posLerpType](#poslerptype) = CURVE
+ {: .sp-enum}
+ - [speedType](#speedtype) = CONST
+ {: .sp-enum}
+ - [actKeyPosDelta](#actkeyposdelta) = 0 0 0
+ {: .sp-vec}
+ - [actKeyframeF](#actkeyframef) = 0.0
+ {: .sp-float}
+ - [actKeyframe](#actkeyframe) = 0
+ {: .sp-int}
+ - [nextKeyframe](#nextkeyframe) = 0
+ {: .sp-int}
+ - [moveSpeedUnit](#movespeedunit) = 0.0
+ {: .sp-float}
+ - [advanceDir](#advancedir) = 0.0
+ {: .sp-float}
+ - [moverState](#moverstate) = ?
+ {: .sp-enum}
+ - [numTriggerEvents](#numtriggerevents) = 0
+ {: .sp-int}
+ - [stayOpenTimeDest](#stayopentimedest) = 0.0
+ {: .sp-float}
+ - Sound
+ {: .sp-folder}
+ - [sfxOpenStart](#sfxopenstart) = ""
+ {: .sp-string}
+ - [sfxOpenEnd](#sfxopenend) = ""
+ {: .sp-string}
+ - [sfxMoving](#sfxmoving) = ""
+ {: .sp-string}
+ - [sfxCloseStart](#sfxclosestart) = ""
+ {: .sp-string}
+ - [sfxCloseEnd](#sfxcloseend) = ""
+ {: .sp-string}
+ - [sfxLock](#sfxlock) = ""
+ {: .sp-string}
+ - [sfxUnlock](#sfxunlock) = ""
+ {: .sp-string}
+ - [sfxUseLocked](#sfxuselocked) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCMover
+ {: .sp-class}
+ - Mover
+ {: .sp-folder}
+ - [moverBehavior](#moverbehavior) = 2STATE_TOGGLE
+ {: .sp-enum}
+ - [touchBlockerDamage](#touchblockerdamage) = 0.0
+ {: .sp-float}
+ - [stayOpenTimeSec](#stayopentimesec) = 0.0
+ {: .sp-float}
+ - [moverLocked](#moverlocked) = FALSE
+ {: .sp-bool}
+ - [autoLinkEnabled](#autolinkenabled) = FALSE
+ {: .sp-bool}
+ - [autoRotate](#autorotate) = FALSE
+ {: .sp-bool}
+ - Keyframe
+ {: .sp-folder}
+ - [numKeyframes](#numkeyframes) = 0
+ {: .sp-int}
+ - [moveSpeed](#movespeed) = 0.0
+ {: .sp-float}
+ - [posLerpType](#poslerptype) = CURVE
+ {: .sp-enum}
+ - [speedType](#speedtype) = CONST
+ {: .sp-enum}
+ - [actKeyPosDelta](#actkeyposdelta) = 0 0 0
+ {: .sp-vec}
+ - [actKeyframeF](#actkeyframef) = 0.0
+ {: .sp-float}
+ - [actKeyframe](#actkeyframe) = 0
+ {: .sp-int}
+ - [nextKeyframe](#nextkeyframe) = 0
+ {: .sp-int}
+ - [moveSpeedUnit](#movespeedunit) = 0.0
+ {: .sp-float}
+ - [advanceDir](#advancedir) = 0.0
+ {: .sp-float}
+ - [moverState](#moverstate) = ?
+ {: .sp-enum}
+ - [numTriggerEvents](#numtriggerevents) = 0
+ {: .sp-int}
+ - [stayOpenTimeDest](#stayopentimedest) = 0.0
+ {: .sp-float}
+ - Sound
+ {: .sp-folder}
+ - [sfxOpenStart](#sfxopenstart) = ""
+ {: .sp-string}
+ - [sfxOpenEnd](#sfxopenend) = ""
+ {: .sp-string}
+ - [sfxMoving](#sfxmoving) = ""
+ {: .sp-string}
+ - [sfxCloseStart](#sfxclosestart) = ""
+ {: .sp-string}
+ - [sfxCloseEnd](#sfxcloseend) = ""
+ {: .sp-string}
+ - [sfxLock](#sfxlock) = ""
+ {: .sp-string}
+ - [sfxUnlock](#sfxunlock) = ""
+ {: .sp-string}
+ - [sfxUseLocked](#sfxuselocked) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `moverBehavior` {: .sp-enum}
+
+Controls how the mover behaves in response to events ("activation").
+
+**Accepted values:**
+
+* `2STATE_TOGGLE` — Receiving either event causes the state of the mover to swap. The direction
+ of the animation is reversed.
+* `2STATE_TRIGGER_CTRL` — An `OnTrigger` causes the mover to transition to the "open" state while an `OnUntrigger`
+ event causes the mover to transition to the "closed" state.
+* `2STATE_OPEN_TIMED` — An `OnTrigger` event causes the mover to transition to the "open" state. It than transitions
+ to the "closed" state after a fixed amount of time specified by [`stayOpenTimeSec`](#stayopentimesec).
+* `NSTATE_LOOP` — The mover opens and closes in a loop indefinitely.
+* `NSTATE_SINGLE_KEYS` — The mover can transition to each keyframe separately. Often used in conjunction
+ with a [`zCMoverControler`](../zCMoverControler.md).
+
+### `touchBlockerDamage` {: .sp-float}
+
+The amount of damage to deal to objects in the way of the mover.
+
+### `stayOpenTimeSec` {: .sp-float}
+
+The number of seconds a mover with the `2STATE_OPEN_TIMED` [behavior](#moverbehavior) stays in the "open"
+state until transitioning to the "closed" state again.
+
+!!! warning
+ Only relevant if [`moverBehavior`](#moverbehavior) is `2STATE_OPEN_TIMED`.
+
+### `moverLocked` {: .sp-bool}
+
+Unclear.
+
+### `autoLinkEnabled` {: .sp-bool}
+
+Determines whether the position of the object triggering the mover should be tied to the mover's position.
+
+**Accepted values:**
+
+* `TRUE` — When the mover transitions, the position of the triggering object follows the position of the mover.
+* `FALSE` — The triggering object's position is uncoupled from the position of the mover.
+
+### `autoRotate` {: .sp-bool}
+
+Whether to automatically rotate the mover along its movement trajectory. For example, this is used for making fish
+always face in the direction they're moving.
+
+**Accepted values:**
+
+* `TRUE` — Automatically face the mover forward along its trajectory.
+* `FALSE` — Never automatically rotate the mover.
+
+!!! warning
+ Only available in Gothic II.
+
+### `numKeyframes` {: .sp-int}
+
+Unclear.
+
+### `moveSpeed` {: .sp-float}
+
+The movement speed for transitioning between keyframes in units per millisecond.
+
+!!! warning
+ Only relevant if manually specified keyframes are used. Ignored when using the visual for the animation.
+
+### `posLerpType` {: .sp-enum}
+
+Defines how the mover should interpolate between the keyframe positions. Only affects the mover's position,
+never its rotation.
+
+**Accepted values:**
+
+* `CURVE` — Smoothly transition between keyframes.
+* `LINEAR` — Linearly transition between keyframes.
+
+!!! warning
+ Only relevant if manually specified keyframes are used. Ignored when using the visual for the animation.
+
+### `speedType` {: .sp-enum}
+
+Controls the acceleration and deceleration behavior of the mover.
+
+**Accepted values:**
+
+* `CONST` — Mover with a constant speed.
+* `SLOW_START_END` — Slowly accelerate at the first keyframe and decelerate at the last keyframe.
+* `SLOW_START` — Slowly accelerate at the first keyframe but don't decelerate at the end.
+* `SLOW_END` — Slowly decelerate at the last keyframe but don't accelerate at the start.
+* `SEG_SLOW_START_END` — Slowly accelerate at the beginning of each keyframe and decelerate at the end of each keyframe.
+* `SEG_SLOW_START` — Slowly accelerate at the beginning of each keyframe but don't decelerate at the end.
+* `SEG_SLOW_END` — Slowly decelerate at the end of each keyframe but don't accelerate at the beginning.
+
+!!! warning
+ Only relevant if manually specified keyframes are used. Ignored when using the visual for the animation.
+
+### `sfxOpenStart` {: .sp-string}
+
+The name of the sound to play at the beginning of the opening sequence.
+
+### `sfxOpenEnd` {: .sp-string}
+
+The name of the sound to play at the end of the opening sequence.
+
+### `sfxMoving` {: .sp-string}
+
+The name of the sound to play in a loop while the mover is transitioning between keyframes.
+
+### `sfxCloseStart` {: .sp-string}
+
+The name of the sound to play at the beginning of the closing sequence.
+
+### `sfxCloseEnd` {: .sp-string}
+
+The name of the sound to play at the end of the closing sequence.
+
+### `sfxLock` {: .sp-string}
+
+The name of the sound to play when locking a mover.
+
+### `sfxUnlock` {: .sp-string}
+
+The name of the sound to play when unlocking a mover.
+
+### `sfxUseLocked` {: .sp-string}
+
+The name of the sound to play when using a locked mover.
+
+### `actKeyPosDelta` {: .sp-vec}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `actKeyframeF` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `actKeyframe` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `nextKeyframe` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `moveSpeedUnit` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `advanceDir` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `moverState` {: .sp-enum}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `numTriggerEvents` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `stayOpenTimeDest` {: .sp-float}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCTriggerList.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCTriggerList.md
new file mode 100644
index 0000000000..7f2c89e3e1
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTrigger/zCTriggerList.md
@@ -0,0 +1,171 @@
+# zCTriggerList
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTriggerList`
+ **Version Identifiers:**
+ — Gothic I: `59776`
+ — Gothic II: `5505`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zctriggerlist/1-1-0-534)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTriggerList/)
+
+A special trigger which emits the `OnTrigger` events emitted by the [`zCTrigger`](index.md) to multiple targets.
+How the events are sent can be configured through [`listProcess`](#listprocess). The
+[`triggerTarget`](../index.md#triggertarget) and [`fireDelaySec`](index.md#firedelaysec) properties of
+[`zCTrigger`](index.md) should be ignored.
+
+`OnUntrigger` events sent to the trigger list are propagated to all targets in the list.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCTriggerList
+ {: .sp-class}
+ - TriggerList
+ {: .sp-folder}
+ - [listProcess](#listprocess) = LP_ALL
+ {: .sp-enum}
+ - [triggerTarget0](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay0](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget1](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay1](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget2](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay2](#firedelay) = 0
+ {: .sp-float}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCTriggerList
+ {: .sp-class}
+ - TriggerList
+ {: .sp-folder}
+ - [listProcess](#listprocess) = LP_ALL
+ {: .sp-enum}
+ - [triggerTarget0](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay0](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget1](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay1](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget2](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay2](#firedelay) = 0
+ {: .sp-float}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCTriggerList
+ {: .sp-class}
+ - TriggerList
+ {: .sp-folder}
+ - [listProcess](#listprocess) = LP_ALL
+ {: .sp-enum}
+ - [triggerTarget0](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay0](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget1](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay1](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget2](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay2](#firedelay) = 0
+ {: .sp-float}
+ - [actTarget](#acttarget) = 0
+ {: .sp-int}
+ - [sendOnTrigger](#sendontrigger) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](../index.md)
+ {: .sp-class}
+ - [zCTrigger](index.md)
+ {: .sp-class}
+ - zCTriggerList
+ {: .sp-class}
+ - TriggerList
+ {: .sp-folder}
+ - [listProcess](#listprocess) = LP_ALL
+ {: .sp-enum}
+ - [triggerTarget0](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay0](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget1](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay1](#firedelay) = 0
+ {: .sp-float}
+ - [triggerTarget2](#triggertarget) = ""
+ {: .sp-string}
+ - [fireDelay2](#firedelay) = 0
+ {: .sp-float}
+ - [actTarget](#acttarget) = 0
+ {: .sp-int}
+ - [sendOnTrigger](#sendontrigger) = TRUE
+ {: .sp-bool}
+
+## Class member overview
+
+### `listProcess` {: .sp-enum}
+
+Controls how events are sent to the targets.
+
+**Accepted values:**
+
+* `LP_ALL` — Every target in the trigger list is sent the `OnTrigger` event sequentially. The [`fireDelay`](#firedelay)
+ of each target is taken into account so that target `n` is fired after `sum(fireDelay0, ..., fireDelayN-1)` seconds.
+* `LP_NEXT_ONE` — The event is sent to the next target in the list.
+* `LP_RAND_ONE` — The event is sent to a random target in the list.
+
+### `triggerTarget` {: .sp-string}
+
+The name of the VObject to send events to. Behaves like [`triggerTarget`](../index.md#triggertarget).
+
+### `fireDelay` {: .sp-float}
+
+The delay after which to fire the event to the target. Behaves like [`fireDelaySec`](index.md#firedelaysec).
+
+### `actTarget` {: .sp-int}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `sendOnTrigger` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerUntouch.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerUntouch.md
new file mode 100644
index 0000000000..2ec4133377
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerUntouch.md
@@ -0,0 +1,59 @@
+# zCTriggerUntouch
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTriggerUntouch`
+ **Version Identifiers:**
+ — Gothic I: `52224`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTriggerUntouch/)
+
+A trigger which fires an `OnTrigger` event to its [`triggerTarget`](index.md#triggertarget) if any `OnUntouch`
+event is emitted from an inanimate object within the object's bounding box.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerUntouch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerUntouch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerUntouch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerUntouch
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerWorldStart.md b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerWorldStart.md
new file mode 100644
index 0000000000..0923e00c7a
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCTriggerBase/zCTriggerWorldStart.md
@@ -0,0 +1,70 @@
+# zCTriggerWorldStart
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCTriggerWorldStart`
+ **Version Identifiers:**
+ — Gothic I: `52224`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCTriggerWorldStart/)
+
+A special trigger which fires an `OnTrigger` event to its [`triggerTarget`](index.md#triggertarget) when the
+world is loaded and started.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerWorldStart
+ {: .sp-class}
+ - [fireOnlyFirstTime](#fireonlyfirsttime) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerWorldStart
+ {: .sp-class}
+ - [fireOnlyFirstTime](#fireonlyfirsttime) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerWorldStart
+ {: .sp-class}
+ - [fireOnlyFirstTime](#fireonlyfirsttime) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - [*zCTriggerBase*](index.md)
+ {: .sp-class}
+ - zCTriggerWorldStart
+ {: .sp-class}
+ - [fireOnlyFirstTime](#fireonlyfirsttime) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `fireOnlyFirstTime` {: .sp-bool}
+
+Determines whether to fire the `OnTrigger` event only the first time the world is loaded.
+
+**Accepted values:**
+
+* `TRUE` — Only fire the event if this is the first time the world is loaded.
+* `FALSE` — Fire the event every time the world is loaded.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCVobLevelCompo.md b/docs/zengin/worlds/Classes/zCVob/zCVobLevelCompo.md
new file mode 100644
index 0000000000..84b609d119
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCVobLevelCompo.md
@@ -0,0 +1,53 @@
+# zCVobLevelCompo
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobLevelCompo`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvoblevelcompo/1-1-0-496)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobLevelCompo/)
+
+
+Used as root objects of game levels. Only used to group together other VObjects. Only one of the `zCVobLevelCompo`
+objects will have a visual which corresponds to the mesh of the world it exists in. Generally, it can be ignored and
+has no relevance to other VObjects in the hierarchy.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLevelCompo
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLevelCompo
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLevelCompo
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLevelCompo
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCVobLight.md b/docs/zengin/worlds/Classes/zCVob/zCVobLight.md
new file mode 100644
index 0000000000..3707b27959
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCVobLight.md
@@ -0,0 +1,321 @@
+# zCVobLight
+
+!!! abstract inline end "Quick Infos"
+ **Type:** Virtual Object
+ **Format Name:** ZenGin Archive
+ **File Extension:** `.ZEN`
+ **Class Name:** `zCVobLight`
+ **Version Identifiers:**
+ — Gothic I: `46080`
+ — Gothic II: `39168`
+ **ZenKit Class:** `VLight`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvoblight/1-1-0-497)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobLight/)
+
+Represents a virtual light source which lights up nearby game objects. Point and spot light sources are supported and
+may be animated with different colors and ranges.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLight
+ {: .sp-class}
+ - VobLight
+ {: .sp-folder}
+ - [lightPresetInUse](#lightpresetinuse) = ""
+ {: .sp-string}
+ - [lightType](#lighttype) = POINT
+ {: .sp-enum}
+ - [range](#range) = 0
+ {: .sp-float}
+ - [color](#color) = 255 255 255 255
+ {: .sp-color}
+ - [spotConeAngle](#spotconeangle) = 0
+ {: .sp-float}
+ - [lightStatic](#lightstatic) = TRUE
+ {: .sp-bool}
+ - [lightQuality](#lightquality) = HIGH
+ {: .sp-enum}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+ - Dynamic Light
+ {: .sp-folder}
+ - [turnedOn](#turnedon) = TRUE
+ {: .sp-bool}
+ - [rangeAniScale](#rangeaniscale) = ""
+ {: .sp-string}
+ - [rangeAniFPS](#rangeanifps) = 0
+ {: .sp-float}
+ - [rangeAniSmooth](#rangeanismooth) = TRUE
+ {: .sp-bool}
+ - [colorAniList](#coloranilist) = ""
+ {: .sp-string}
+ - [colorAniFPS](#coloranifps) = 0
+ {: .sp-float}
+ - [colorAniSmooth](#coloranismooth) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLight
+ {: .sp-class}
+ - VobLight
+ {: .sp-folder}
+ - [lightPresetInUse](#lightpresetinuse) = ""
+ {: .sp-string}
+ - [lightType](#lighttype) = POINT
+ {: .sp-enum}
+ - [range](#range) = 0
+ {: .sp-float}
+ - [color](#color) = 255 255 255 255
+ {: .sp-color}
+ - [spotConeAngle](#spotconeangle) = 0
+ {: .sp-float}
+ - [lightStatic](#lightstatic) = TRUE
+ {: .sp-bool}
+ - [lightQuality](#lightquality) = HIGH
+ {: .sp-enum}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+ - Dynamic Light
+ {: .sp-folder}
+ - [turnedOn](#turnedon) = TRUE
+ {: .sp-bool}
+ - [rangeAniScale](#rangeaniscale) = ""
+ {: .sp-string}
+ - [rangeAniFPS](#rangeanifps) = 0
+ {: .sp-float}
+ - [rangeAniSmooth](#rangeanismooth) = TRUE
+ {: .sp-bool}
+ - [colorAniList](#coloranilist) = ""
+ {: .sp-string}
+ - [colorAniFPS](#coloranifps) = 0
+ {: .sp-float}
+ - [colorAniSmooth](#coloranismooth) = TRUE
+ {: .sp-bool}
+ - [canMove](#canmove) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLight
+ {: .sp-class}
+ - VobLight
+ {: .sp-folder}
+ - [lightPresetInUse](#lightpresetinuse) = ""
+ {: .sp-string}
+ - [lightType](#lighttype) = POINT
+ {: .sp-enum}
+ - [range](#range) = 0
+ {: .sp-float}
+ - [color](#color) = 255 255 255 255
+ {: .sp-color}
+ - [spotConeAngle](#spotconeangle) = 0
+ {: .sp-float}
+ - [lightStatic](#lightstatic) = TRUE
+ {: .sp-bool}
+ - [lightQuality](#lightquality) = HIGH
+ {: .sp-enum}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+ - Dynamic Light
+ {: .sp-folder}
+ - [turnedOn](#turnedon) = TRUE
+ {: .sp-bool}
+ - [rangeAniScale](#rangeaniscale) = ""
+ {: .sp-string}
+ - [rangeAniFPS](#rangeanifps) = 0
+ {: .sp-float}
+ - [rangeAniSmooth](#rangeanismooth) = TRUE
+ {: .sp-bool}
+ - [colorAniList](#coloranilist) = ""
+ {: .sp-string}
+ - [colorAniFPS](#coloranifps) = 0
+ {: .sp-float}
+ - [colorAniSmooth](#coloranismooth) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobLight
+ {: .sp-class}
+ - VobLight
+ {: .sp-folder}
+ - [lightPresetInUse](#lightpresetinuse) = ""
+ {: .sp-string}
+ - [lightType](#lighttype) = POINT
+ {: .sp-enum}
+ - [range](#range) = 0
+ {: .sp-float}
+ - [color](#color) = 255 255 255 255
+ {: .sp-color}
+ - [spotConeAngle](#spotconeangle) = 0
+ {: .sp-float}
+ - [lightStatic](#lightstatic) = TRUE
+ {: .sp-bool}
+ - [lightQuality](#lightquality) = HIGH
+ {: .sp-enum}
+ - [lensflareFX](#lensflarefx) = ""
+ {: .sp-string}
+ - Dynamic Light
+ {: .sp-folder}
+ - [turnedOn](#turnedon) = TRUE
+ {: .sp-bool}
+ - [rangeAniScale](#rangeaniscale) = ""
+ {: .sp-string}
+ - [rangeAniFPS](#rangeanifps) = 0
+ {: .sp-float}
+ - [rangeAniSmooth](#rangeanismooth) = TRUE
+ {: .sp-bool}
+ - [colorAniList](#coloranilist) = ""
+ {: .sp-string}
+ - [colorAniFPS](#coloranifps) = 0
+ {: .sp-float}
+ - [colorAniSmooth](#coloranismooth) = TRUE
+ {: .sp-bool}
+ - [canMove](#canmove) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `lightPresetInUse` {: .sp-string}
+
+The name of the selected light template. Templates can be found in `_work/data/Presets/LightPresets.zen`. This
+property is irrelevant for most use-cases.
+
+
+### `lightType` {: .sp-enum}
+
+The type of the light source.
+
+**Accepted values:**
+
+- `POINT` — A point light source.
+- `SPOT` — A spot light source.
+
+### `range` {: .sp-float}
+
+The range in which this light source illuminates objects.
+
+### `color` {: .sp-color}
+
+The color of this light source in RGBA form.
+
+### `spotConeAngle` {: .sp-float}
+
+The angle of the beam cone for spotlights. Only relevant if [`lightType`](#lighttype) is `SPOT`, ignored otherwise.
+
+### `lightStatic` {: .sp-bool}
+
+Determines whether this is a static light or not. Static lights are baked into the world when its lighting is
+compiled. This makes static lights faster at runtime, but it also means, that they cannot change in any way after
+the world is compiled.
+
+**Accepted values:**
+
+* `TRUE` — This light is a static light.
+* `FALSE` — This light is a dynamic light.
+
+### `lightQuality` {: .sp-enum}
+
+Determines the quality of the light source. What exactly changes with these values is unknown.
+
+**Accepted values:**
+
+* `HIGH` — Highest quality.
+* `MEDIUM` — Medium quality.
+* `LOW_FASTEST` — Low quality (used for almost all lights).
+
+### `lensflareFX` {: .sp-string}
+
+The name of the lensflare effect associated with this light. Empty if there is no associated lensflare effect.
+
+### `turnedOn` {: .sp-bool}
+
+Whether this dynamic light is turned on.
+
+**Accepted values:**
+
+* `TRUE` — The light is turned on.
+* `FALSE` — The light is turned off.
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `rangeAniScale` {: .sp-string}
+
+Frames for the light's range animation. Its value is a space-separated list of floats where each float is one key
+frame of the animation. A value of `1.0` corresponds to the initial [`range`](#range) of the light source, a value
+of `2.0` corresponds to double the initial [`range`](#range) and a value of `0.5` means half the initial
+[`range`](#range). The range animation is further controlled by [`rangeAniFPS`](#rangeanifps) and
+[`rangeAniSmooth`](#rangeanismooth).
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `rangeAniFPS` {: .sp-float}
+
+The speed of the range animation in frames per second. The animation frames are defined in [`rangeAniScale`](#rangeaniscale)
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `rangeAniSmooth` {: .sp-bool}
+
+Whether the range animation should smoothly interpolate between keyframes.
+
+**Accepted values:**
+
+* `TRUE` — Turn on interpolation.
+* `FALSE` — Turn off interpolation.
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `colorAniList` {: .sp-string}
+
+Frames for the light's color animation. Its value is a space-separated list of colors where each element can either
+be an RGB color consisting of three integers enclosed by parentheses or a greyscale color consisting of a single
+integer. For example: `(255 0 0) 100 (255 50 180)` would result in #ff0000
+#646464, #ff32b4. The color animation is
+further controlled by [`colorAniFPS`](#coloranifps) and [`colorAniSmooth`](#coloranismooth).
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `colorAniFPS` {: .sp-float}
+
+The speed of the color animation in frames per second. The animation frames are defined in [`colorAniList`](#coloranilist)
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `colorAniSmooth` {: .sp-bool}
+
+Whether the color animation should smoothly interpolate between keyframes.
+
+**Accepted values:**
+
+* `TRUE` — Turn on interpolation.
+* `FALSE` — Turn off interpolation.
+
+!!! warning
+ This value is only valid for dynamic lights. Check [`lightStatic`](#lightstatic) before use.
+
+### `canMove` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This value is only valid for dynamic lights in **Gothic II**. Check [`lightstatic`](#lightstatic) before use.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCVobSpot.md b/docs/zengin/worlds/Classes/zCVob/zCVobSpot.md
new file mode 100644
index 0000000000..c9732dbdb4
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCVobSpot.md
@@ -0,0 +1,53 @@
+# zCVobSpot
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobSpot`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvobspot/1-1-0-498)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobSpot/)
+
+
+Spot objects are used to mark a position and orientation in virtual space. They are equivalent in function to way net
+free points and can be used in scripts to spawn other objects at their location.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobSpot
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobSpot
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobSpot
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobSpot
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCVobStair.md b/docs/zengin/worlds/Classes/zCVob/zCVobStair.md
new file mode 100644
index 0000000000..9e74dc2073
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCVobStair.md
@@ -0,0 +1,46 @@
+# zCVobStair
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobStair`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: *Unused*
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvobstair/1-1-0-499)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobStair/)
+
+
+Used to mark staircase models in Gothic I only. This type of VObject was taken into account by the NPC pathfinding
+routines to properly ascend and descend staircases.
+
+!!! warning
+ This VObject is only available in Gothic I.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStair
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ *Unavailable.*
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStair
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ *Unavailable.*
diff --git a/docs/zengin/worlds/Classes/zCVob/zCVobStartpoint.md b/docs/zengin/worlds/Classes/zCVob/zCVobStartpoint.md
new file mode 100644
index 0000000000..ce0b1da2ff
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCVobStartpoint.md
@@ -0,0 +1,52 @@
+# zCVobStartpoint
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobStartpoint`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvobstartpoint/1-1-0-500)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobStartpoint/)
+
+Marks the players initial position when loading in the game level. Behaves like [`zCVobSpot`](zCVobSpot.md) but causes
+the game to put the player at its location and in its orientation when the world is loaded.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStartpoint
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStartpoint
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStartpoint
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](index.md)
+ {: .sp-class}
+ - zCVobStartpoint
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/index.md b/docs/zengin/worlds/Classes/zCVob/zCZone/index.md
new file mode 100644
index 0000000000..4a326afa10
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/index.md
@@ -0,0 +1,52 @@
+# zCZone
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCZone`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCZone/)
+
+The base class for effect zones.
+
+!!! warning
+ This object is an abstract base class and cannot be instantiated by itself.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCZone
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCZone
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCZone
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../index.md)
+ {: .sp-class}
+ - zCZone
+ {: .sp-class}
+ - <empty>
+ {: .sp-empty}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/index.md b/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/index.md
new file mode 100644
index 0000000000..7cb69e17fa
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/index.md
@@ -0,0 +1,180 @@
+# oCZoneMusic
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCZoneMusic`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_oczonemusic/1-1-0-700)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCZoneMusic/)
+
+A VObject which defines the music to be played within its bounding box. Music zones may overlap; if they do, their
+[`priority`](#priority) property determines which music zone should be used. The camera object is used to test which
+music zone applies. If no music zone applies the music defined in the optional [`oCZoneMusicDefault`](oCZoneMusicDefault.md)
+is used.
+
+The name of the music theme to be played is defined by the [`vobName`](../../index.md#vobname).
+
+!!! tip
+ If the suffix `_NCI` or `_NCO` is added to the end of the zone name, it snows instead of rains in the zone.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - oCZoneMusic
+ {: .sp-class}
+ - [enabled](#enabled) = TRUE
+ {: .sp-bool}
+ - [priority](#priority) = 0
+ {: .sp-int}
+ - [ellipsoid](#ellipsoid) = FALSE
+ {: .sp-bool}
+ - [reverbLevel](#reverblevel) = 0
+ {: .sp-float}
+ - [volumeLevel](#volumelevel) = 100
+ {: .sp-float}
+ - [loop](#loop) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - oCZoneMusic
+ {: .sp-class}
+ - [enabled](#enabled) = TRUE
+ {: .sp-bool}
+ - [priority](#priority) = 0
+ {: .sp-int}
+ - [ellipsoid](#ellipsoid) = FALSE
+ {: .sp-bool}
+ - [reverbLevel](#reverblevel) = 0
+ {: .sp-float}
+ - [volumeLevel](#volumelevel) = 100
+ {: .sp-float}
+ - [loop](#loop) = TRUE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - oCZoneMusic
+ {: .sp-class}
+ - [enabled](#enabled) = TRUE
+ {: .sp-bool}
+ - [priority](#priority) = 0
+ {: .sp-int}
+ - [ellipsoid](#ellipsoid) = FALSE
+ {: .sp-bool}
+ - [reverbLevel](#reverblevel) = 0
+ {: .sp-float}
+ - [volumeLevel](#volumelevel) = 100
+ {: .sp-float}
+ - [loop](#loop) = TRUE
+ {: .sp-bool}
+ - [local_enabled](#local_enabled) = FALSE
+ {: .sp-bool}
+ - [dayEntranceDone](#dayentrancedone) = FALSE
+ {: .sp-bool}
+ - [nightEntranceDone](#nightentrancedone) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - oCZoneMusic
+ {: .sp-class}
+ - [enabled](#enabled) = TRUE
+ {: .sp-bool}
+ - [priority](#priority) = 0
+ {: .sp-int}
+ - [ellipsoid](#ellipsoid) = FALSE
+ {: .sp-bool}
+ - [reverbLevel](#reverblevel) = 0
+ {: .sp-float}
+ - [volumeLevel](#volumelevel) = 100
+ {: .sp-float}
+ - [loop](#loop) = TRUE
+ {: .sp-bool}
+ - [local_enabled](#local_enabled) = FALSE
+ {: .sp-bool}
+ - [dayEntranceDone](#dayentrancedone) = FALSE
+ {: .sp-bool}
+ - [nightEntranceDone](#nightentrancedone) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `enabled` {: .sp-bool}
+
+Whether the music zone is enabled when loading the level. When disabled, no music will be played in the zone.
+
+**Accepted values:**
+
+* `TRUE` — Enable the music zone when loading the level
+* `FALSE` — The not enable the zone
+
+### `priority` {: .sp-int}
+
+The priority of the music zone if two zones overlap. A higher number means a higher priority. `0` is the lowest
+possible priority.
+
+!!! warning
+ Only relevant if two `zCZoneMusic` zones overlap.
+
+### `ellipsoid` {: .sp-bool}
+
+Determines the shape of the zone.
+
+**Accepted values:**
+
+* `TRUE` — The zone forms an ellipsoid within the bounding box.
+* `FALSE` — The zone exactly mirrors the bounding box.
+
+### `reverbLevel` {: .sp-float}
+
+Unclear.
+
+### `volumeLevel` {: .sp-float}
+
+Unclear.
+
+### `loop` {: .sp-bool}
+
+Unclear.
+
+### `local_enabled` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `dayEntranceDone` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `nightEntranceDone` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/oCZoneMusicDefault.md b/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/oCZoneMusicDefault.md
new file mode 100644
index 0000000000..0039ebfb14
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/oCZoneMusic/oCZoneMusicDefault.md
@@ -0,0 +1,67 @@
+# oCZoneMusicDefault
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `oCZoneMusicDefault`
+ **Version Identifiers:**
+ — Gothic I: `0`
+ — Gothic II: `0`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/oCZoneMusicDefault/)
+
+Determines the default music to be played when the camera is outside any [`oCZoneMusic`](index.md) zones. The
+volume-related options of the zone are ignored. There may only be one `oCZoneMusicDefault` object in a world.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [oCZoneMusic](index.md)
+ {: .sp-class}
+ - oCZoneMusicDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [oCZoneMusic](index.md)
+ {: .sp-class}
+ - oCZoneMusicDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [oCZoneMusic](index.md)
+ {: .sp-class}
+ - oCZoneMusicDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [oCZoneMusic](index.md)
+ {: .sp-class}
+ - oCZoneMusicDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/index.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/index.md
new file mode 100644
index 0000000000..37241122fd
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/index.md
@@ -0,0 +1,251 @@
+# zCVobSound
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobSound`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `12289`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvobsound/1-1-0-701)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobSound/)
+
+Emits a sound defined by a script instance in a given radius. The sound playback can be activated by sending an
+`OnTrigger` event to the VObject and sending an `OnUntrigger` event disables the sound playback.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCVobSound
+ {: .sp-class}
+ - Sound
+ {: .sp-folder}
+ - [sndVolume](#sndvolume) = 100
+ {: .sp-float}
+ - [sndMode](#sndmode) = LOOPING
+ {: .sp-enum}
+ - [sndRandDelay](#sndranddelay) = 5
+ {: .sp-float}
+ - [sndRandDelayVar](#sndranddelayvar) = 2
+ {: .sp-float}
+ - [sndStartOn](#sndstarton) = TRUE
+ {: .sp-bool}
+ - [sndAmbient3D](#sndambient3d) = FALSE
+ {: .sp-bool}
+ - [sndObstruction](#sndobstruction) = FALSE
+ {: .sp-bool}
+ - [sndConeAngle](#sndconeangle) = 0
+ {: .sp-float}
+ - [sndVolType](#sndvoltype) = SPHERE
+ {: .sp-enum}
+ - [sndRadius](#sndradius) = 1200
+ {: .sp-float}
+ - [sndName](#sndname) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCVobSound
+ {: .sp-class}
+ - Sound
+ {: .sp-folder}
+ - [sndVolume](#sndvolume) = 100
+ {: .sp-float}
+ - [sndMode](#sndmode) = LOOPING
+ {: .sp-enum}
+ - [sndRandDelay](#sndranddelay) = 5
+ {: .sp-float}
+ - [sndRandDelayVar](#sndranddelayvar) = 2
+ {: .sp-float}
+ - [sndStartOn](#sndstarton) = TRUE
+ {: .sp-bool}
+ - [sndAmbient3D](#sndambient3d) = FALSE
+ {: .sp-bool}
+ - [sndObstruction](#sndobstruction) = FALSE
+ {: .sp-bool}
+ - [sndConeAngle](#sndconeangle) = 0
+ {: .sp-float}
+ - [sndVolType](#sndvoltype) = SPHERE
+ {: .sp-enum}
+ - [sndRadius](#sndradius) = 1200
+ {: .sp-float}
+ - [sndName](#sndname) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCVobSound
+ {: .sp-class}
+ - Sound
+ {: .sp-folder}
+ - [sndVolume](#sndvolume) = 100
+ {: .sp-float}
+ - [sndMode](#sndmode) = LOOPING
+ {: .sp-enum}
+ - [sndRandDelay](#sndranddelay) = 5
+ {: .sp-float}
+ - [sndRandDelayVar](#sndranddelayvar) = 2
+ {: .sp-float}
+ - [sndStartOn](#sndstarton) = TRUE
+ {: .sp-bool}
+ - [sndAmbient3D](#sndambient3d) = FALSE
+ {: .sp-bool}
+ - [sndObstruction](#sndobstruction) = FALSE
+ {: .sp-bool}
+ - [sndConeAngle](#sndconeangle) = 0
+ {: .sp-float}
+ - [sndVolType](#sndvoltype) = SPHERE
+ {: .sp-enum}
+ - [sndRadius](#sndradius) = 1200
+ {: .sp-float}
+ - [sndName](#sndname) = ""
+ {: .sp-string}
+ - [soundIsRunning](#soundisrunning) = FALSE
+ {: .sp-bool}
+ - [soundAllowedToRun](#soundallowedtorun) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCVobSound
+ {: .sp-class}
+ - Sound
+ {: .sp-folder}
+ - [sndVolume](#sndvolume) = 100
+ {: .sp-float}
+ - [sndMode](#sndmode) = LOOPING
+ {: .sp-enum}
+ - [sndRandDelay](#sndranddelay) = 5
+ {: .sp-float}
+ - [sndRandDelayVar](#sndranddelayvar) = 2
+ {: .sp-float}
+ - [sndStartOn](#sndstarton) = TRUE
+ {: .sp-bool}
+ - [sndAmbient3D](#sndambient3d) = FALSE
+ {: .sp-bool}
+ - [sndObstruction](#sndobstruction) = FALSE
+ {: .sp-bool}
+ - [sndConeAngle](#sndconeangle) = 0
+ {: .sp-float}
+ - [sndVolType](#sndvoltype) = SPHERE
+ {: .sp-enum}
+ - [sndRadius](#sndradius) = 1200
+ {: .sp-float}
+ - [sndName](#sndname) = ""
+ {: .sp-string}
+ - [soundIsRunning](#soundisrunning) = FALSE
+ {: .sp-bool}
+ - [soundAllowedToRun](#soundallowedtorun) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `sndVolume` {: .sp-float}
+
+The volume of the sound effect in percent (0-100).
+
+### `sndMode` {: .sp-enum}
+
+Determines how the sound effect is played.
+
+**Accepted values:**
+
+* `LOOPING` — The sound effect is repeated endlessly
+* `ONCE` — The sound plays once
+* `RANDOM` — The sound effect is repeated endlessly with a random delay between repetitions
+
+### `sndRandDelay` {: .sp-float}
+
+The average delay between repetitions in seconds if [`sndMode`](#sndmode) is `RANDOM`.
+
+!!! warning
+ Only relevant if [`sndMode`](#sndmode) is `RANDOM`.
+
+### `sndRandDelayVar` {: .sp-float}
+
+The maximum deviation of the random delay between repetitions if [`sndMode`](#sndmode) is `RANDOM`. The resulting
+delay will be a value between [`sndRandDelay`](#sndranddelay) ± [`sndRandDelayVar`](#sndranddelayvar).
+
+!!! warning
+ Only relevant if [`sndMode`](#sndmode) is `RANDOM`.
+
+### `sndStartOn` {: .sp-bool}
+
+Whether to start the sound when loading the world.
+
+**Accepted values:**
+
+* `TRUE` — Start the sound when the world is loaded
+* `FALSE` — Only start the sound in response to an `OnTrigger` event
+
+### `sndAmbient3D` {: .sp-bool}
+
+Determines whether the sound is an omnidirectional ambient sound. It will change volume depending on the distance
+to this VObject, but it won't sound as if this VObject is emitting the effect.
+
+**Accepted values:**
+
+* `TRUE` — Emit an ambient sound effect
+* `FALSE` — Emit a directional sound effect
+
+### `sndObstruction` {: .sp-bool}
+
+Whether to dampen the sound when there is no direct path from the VObject to the listener.
+
+**Accepted values:**
+
+* `TRUE` — The sound is dampened by obstructions
+* `FALSE` — The sound is not dampened
+
+### `sndConeAngle` {: .sp-float}
+
+When set to a value other than `0`, determines a cone in front of the VObject in which the sound can be heard.
+To listeners outside of that cone, the sound is not heard. Only values between `0` and `360` are valid.
+
+### `sndVolType` {: .sp-enum}
+
+Determines the type of volume used to check whether the sound can be heard.
+
+**Accepted values:**
+
+* `SV_SPHERE` — The sound the be heard in a sphere around this VObject.
+* `SV_ELLIPSOID` — The sound can be heard within an ellipsoid defined by the VObject's bounding box.
+
+### `sndRadius` {: .sp-float}
+
+The radius in which the sound can be heard.
+
+### `sndName` {: .sp-string}
+
+The name of the script instance describing the sound.
+
+### `soundIsRunning` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
+
+### `soundAllowedToRun` {: .sp-bool}
+
+Unknown.
+
+!!! warning
+ This property is only available in saved games.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/zCVobSoundDaytime.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/zCVobSoundDaytime.md
new file mode 100644
index 0000000000..89de36d45e
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCVobSound/zCVobSoundDaytime.md
@@ -0,0 +1,109 @@
+# zCVobSoundDaytime
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCVobSoundDaytime`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `12289`
+ **Sources:**
+ — [spacerhilfedatei.sph](https://wiki.worldofgothic.de/doku.php?id=spacer:hilfedatei)
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zcvobsounddaytime/1-1-0-702)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCVobSoundDaytime/)
+
+Emits a sound defined by a script instance in a given radius during a given time during the day. Optionally, another
+sound can be defined which is played outside the defined time range (example: birds during the day and crickets at night).
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCVobSound](index.md)
+ {: .sp-class}
+ - zCVobSoundDaytime
+ {: .sp-class}
+ - SoundDaytime
+ {: .sp-folder}
+ - [sndStartTime](#sndstarttime) = 0
+ {: .sp-float}
+ - [sndEndTime](#sndendtime) = 0
+ {: .sp-float}
+ - [sndName2](#sndname2) = ""
+ {: .sp-string}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCVobSound](index.md)
+ {: .sp-class}
+ - zCVobSoundDaytime
+ {: .sp-class}
+ - SoundDaytime
+ {: .sp-folder}
+ - [sndStartTime](#sndstarttime) = 0
+ {: .sp-float}
+ - [sndEndTime](#sndendtime) = 0
+ {: .sp-float}
+ - [sndName2](#sndname2) = ""
+ {: .sp-string}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCVobSound](index.md)
+ {: .sp-class}
+ - zCVobSoundDaytime
+ {: .sp-class}
+ - SoundDaytime
+ {: .sp-folder}
+ - [sndStartTime](#sndstarttime) = 0
+ {: .sp-float}
+ - [sndEndTime](#sndendtime) = 0
+ {: .sp-float}
+ - [sndName2](#sndname2) = ""
+ {: .sp-string}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCVobSound](index.md)
+ {: .sp-class}
+ - zCVobSoundDaytime
+ {: .sp-class}
+ - SoundDaytime
+ {: .sp-folder}
+ - [sndStartTime](#sndstarttime) = 0
+ {: .sp-float}
+ - [sndEndTime](#sndendtime) = 0
+ {: .sp-float}
+ - [sndName2](#sndname2) = ""
+ {: .sp-string}
+
+## Class member overview
+
+### `sndStartTime` {: .sp-float}
+
+The time of day after which the sound can be heard (`13.5` corresponds to `13:30`). Must be less
+than [`sndEndTime`](#sndendtime).
+
+### `sndEndTime` {: .sp-float}
+
+The time of day after which the sound can no longer be heard (`13.5` corresponds to `13:30`). Must be greater than
+[`sndStartTime`](#sndstarttime).
+
+### `sndName2` {: .sp-string}
+
+The name of the script instance describing the sound to play outside the hours defined by
+[`sndStartTime`](#sndstarttime) and [`sndendtime`](#sndendtime). May be empty.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/index.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/index.md
new file mode 100644
index 0000000000..2b95f7d1de
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/index.md
@@ -0,0 +1,77 @@
+# zCZoneVobFarPlane
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCZoneVobFarPlane`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zczonevobfarplane/1-1-0-706)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCZoneVobFarPlane/)
+
+A VObject which defines the loading range of VObjects within its bounding box.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - [vobFarPlaneZ](#vobfarplanez) = 12000.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - [vobFarPlaneZ](#vobfarplanez) = 12000.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - [vobFarPlaneZ](#vobfarplanez) = 12000.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - [vobFarPlaneZ](#vobfarplanez) = 12000.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+
+## Class member overview
+
+### `vobFarPlaneZ` {: .sp-float}
+
+The loading range of VObject within.
+
+
+### `innerRangePerc` {: .sp-float}
+
+Unknown.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/zCZoneVobFarPlaneDefault.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/zCZoneVobFarPlaneDefault.md
new file mode 100644
index 0000000000..4ee6e429d4
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneVobFarPlane/zCZoneVobFarPlaneDefault.md
@@ -0,0 +1,66 @@
+# zCZoneVobFarPlaneDefault
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCZoneVobFarPlaneDefault`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zczonevobfarplanedefault/1-1-0-707)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCZoneVobFarPlaneDefault/)
+
+
+A VObject which defines the default loading range of VObjects in the entire world. There may only be one of these
+objects in each world. Its effect can be overridden using [zCZoneVobFarPlane](index.md) objects.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneVobFarPlane](index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneVobFarPlane](index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneVobFarPlane](index.md)
+ {: .sp-class}
+ - zCZoneVobFarPlane
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/index.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/index.md
new file mode 100644
index 0000000000..d6a7a2d333
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/index.md
@@ -0,0 +1,124 @@
+# zCZoneZFog
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCZoneZFog`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zczonezfog/1-1-0-708)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCZoneZFog/)
+
+A VObject which causes fog to appear within its bounding box.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneZFog
+ {: .sp-class}
+ - ZoneZFog
+ {: .sp-folder}
+ - [fogRangeCenter](#fograngecenter) = 0.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+ - [fogColor](#fogcolor) = 0 0 0
+ {: .sp-color}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneZFog
+ {: .sp-class}
+ - ZoneZFog
+ {: .sp-folder}
+ - [fogRangeCenter](#fograngecenter) = 0.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+ - [fogColor](#fogcolor) = 0 0 0
+ {: .sp-color}
+ - [fadeOutSky](#fadeoutsky) = FALSE
+ {: .sp-bool}
+ - [overrideColor](#overridecolor) = FALSE
+ {: .sp-bool}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneZFog
+ {: .sp-class}
+ - ZoneZFog
+ {: .sp-folder}
+ - [fogRangeCenter](#fograngecenter) = 0.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+ - [fogColor](#fogcolor) = 0 0 0
+ {: .sp-color}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - zCZoneZFog
+ {: .sp-class}
+ - ZoneZFog
+ {: .sp-folder}
+ - [fogRangeCenter](#fograngecenter) = 0.0
+ {: .sp-float}
+ - [innerRangePerc](#innerrangeperc) = 0.0
+ {: .sp-float}
+ - [fogColor](#fogcolor) = 0 0 0
+ {: .sp-color}
+ - [fadeOutSky](#fadeoutsky) = FALSE
+ {: .sp-bool}
+ - [overrideColor](#overridecolor) = FALSE
+ {: .sp-bool}
+
+## Class member overview
+
+### `fogRangeCenter` {: .sp-float}
+
+The maximum distance of visibility if the player is in the center of the fog object.
+
+
+### `innerRangePerc` {: .sp-float}
+
+Unknown.
+
+### `fogColor` {: .sp-color}
+
+The color of the fog.
+
+### `fadeOutSky` {: .sp-bool}
+
+Whether to hide the sky when the player is inside the fog.
+
+**Accepted values:**
+
+* `TRUE` — Do not show the skybox when the player is inside the fog.
+* `FALSE` — Do show the skybox when the player is inside the fog.
+
+!!! warning
+ This property is only available in Gothic II.
+
+### `overrideColor` {: .sp-bool}
+
+Unclear.
+
+!!! warning
+ This property is only available in Gothic II.
diff --git a/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/zCZoneZFogDefault.md b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/zCZoneZFogDefault.md
new file mode 100644
index 0000000000..35fbf912ea
--- /dev/null
+++ b/docs/zengin/worlds/Classes/zCVob/zCZone/zCZoneZFog/zCZoneZFogDefault.md
@@ -0,0 +1,67 @@
+# zCZoneZFogDefault
+
+!!! abstract inline end "Quick Infos"
+ **Class Name:** `zCZoneZFogDefault`
+ **Version Identifiers:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **Sources:**
+ — [gothic-library.ru](http://www.gothic-library.ru/publ/class_zczonezfogdefault/1-1-0-10)
+ — [zk.gothickit.dev](https://zk.gothickit.dev/engine/objects/zCZoneZFogDefault/)
+
+A VObject which defines the default fog for the entire world. There may only be one of these objects in each world.
+Its effect can be overridden using [zCZoneZFog](index.md) objects.
+
+## Class members
+
+=== "Gothic 1"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneZFog](index.md)
+ {: .sp-class}
+ - zCZoneZFogDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneZFog](index.md)
+ {: .sp-class}
+ - zCZoneZFogDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 1 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneZFog](index.md)
+ {: .sp-class}
+ - zCZoneZFogDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
+
+=== "Gothic 2 (Save)"
+
+ - [zCVob](../../index.md)
+ {: .sp-class}
+ - [*zCZone*](../index.md)
+ {: .sp-class}
+ - [zCZoneZFog](index.md)
+ {: .sp-class}
+ - zCZoneZFogDefault
+ {: .sp-class}
+ - <empty>
+ {: .sp-none}
diff --git a/docs/zengin/worlds/spacer.md b/docs/zengin/worlds/spacer.md
index 5287809f08..334e2f55b3 100644
--- a/docs/zengin/worlds/spacer.md
+++ b/docs/zengin/worlds/spacer.md
@@ -103,7 +103,7 @@ This section covers some of the basic things done in the editor.
### Common VOB settings
-VOB settings vary depending on what the VOB type is. They all have common parameters of the base VOB class though. The full description of a zCVob class can be found [here](Classes/zCVob.md).
+VOB settings vary depending on what the VOB type is. They all have common parameters of the base VOB class though. The full description of a zCVob class can be found [here](Classes/zCVob/index.md).
## Issues
diff --git a/overrides/assets/stylesheets/extra.css b/overrides/assets/stylesheets/extra.css
index 01e279718d..b9d96766c9 100644
--- a/overrides/assets/stylesheets/extra.css
+++ b/overrides/assets/stylesheets/extra.css
@@ -391,4 +391,89 @@ div.md-nav__link--index {
font-style: italic;
}
-/* endregion */
\ No newline at end of file
+/* endregion */
+
+/* region spacer type icons */
+
+.sp-folder,
+.sp-class,
+.sp-int,
+.sp-string,
+.sp-misc,
+.sp-bool,
+.sp-enum,
+.sp-vec,
+.sp-float,
+.sp-color,
+.sp-none {
+ font-family: monospace;
+
+ margin: 0 0 0 0.5em;
+ padding: 0 0 0 1.6em;
+
+ background-repeat: no-repeat;
+ background-size: 1.3em 1.3em;
+ image-rendering: pixelated;
+
+ background-position-y: 0.65em;
+}
+
+
+ul .sp-folder,
+ul .sp-class,
+ul .sp-int,
+ul .sp-string,
+ul .sp-misc,
+ul .sp-bool,
+ul .sp-enum,
+ul .sp-vec,
+ul .sp-float,
+ul .sp-color,
+ul .sp-none {
+ list-style-type: none;
+ padding-left: 1.8em !important;
+ background-position-y: 3px !important;
+}
+
+
+.sp-folder {
+ background-image: url("/gmc/assets/icons/spacer-folder.png");
+}
+
+.sp-int {
+ background-image: url("/gmc/assets/icons/spacer-int.png");
+}
+
+.sp-float {
+ background-image: url("/gmc/assets/icons/spacer-float.png");
+}
+
+.sp-string{
+ background-image: url("/gmc/assets/icons/spacer-string.png");
+}
+
+.sp-misc{
+ background-image: url("/gmc/assets/icons/spacer-misc.png");
+}
+
+.sp-vec{
+ background-image: url("/gmc/assets/icons/spacer-vec.png");
+}
+
+.sp-bool{
+ background-image: url("/gmc/assets/icons/spacer-bool.png");
+}
+
+.sp-enum{
+ background-image: url("/gmc/assets/icons/spacer-enum.png");
+}
+
+.sp-class {
+ background-image: url("/gmc/assets/icons/spacer-class.png");
+}
+
+.sp-color {
+ background-image: url("/gmc/assets/icons/spacer-color.png");
+}
+
+/* endregion */