Modding Tutorial

`This guide is currently under construction`

# Introduction

This guide is intended to serve as an ancillary document to get beginners familiar with creating mods for the game *Odd Realm*. If you are looking for instructions on how to install mods see this guide HERE.

**This is a fan made guide not officially published, partnered, or endorsed by Unknown Origin Games Incorporated.**

# Community

*Odd Realm* has a community modding channel on the Official *Odd Realm* Discord where community members can ask questions and get the latest information regarding modding the game.

Currently there is no known repository, hosting site, or community hub for community mod creations other than the discord ‘oddrealm-modding’ channel threads, though **[Developer Sleipnir]** has mentioned that implementation of the Steam Workshop is planned.

# What Can I Mod?

The following table outlines a couple examples of what sort of mods one could create using the current tools available.

**ART**

 Adding a new type of grass tile into the game

**CODE**

 Adding a new block into the game

As of **Version 0.10.0.17** it has been confirmed by **[Developer Sleipnir]** in a discord thread that new character sprites/animations, item icons & UI, and custom coded gameplay mechanics are not available to be modded yet, but that it is in the pipeline for future releases.

# Suggested Tools

   Setting up your creation environment is important. The following is a list of tools it is suggested to have to be able to successfully mod *Odd Realm*.

1. **CODE:** A simple source code text editor like VScode or a code editor of your preference.
	1. You’ll need a code editor to be able to view and edit the games files.

1. **ART:** A pixel art editing application like Aseprite.
	1. If you plan on adding any new art assets to the game you’ll want a way to edit existing sprites or create new ones. Details about the art style and size are provided in a later section of this guide.

# Setup

   This section covers the basics needed to set up the required game version and files to begin modding the game.

## **Converting To The Beta Build**

To get started on modding you’ll need to be running the beta version of the game if you are not already. A step by step process of converting to the beta version is outlined below. If you are already running the beta version of the game you can skip this section.

*Steam Version:*

Step 1 (Optional): *Backup Game Files*

If you do not wish to lose your save data from the standard version of

the game perform the following steps to back up these files in a

separate location.

1. Locate your game save data which is stored in:
	1. C:\Users\yourusername\AppData\LocalLow\Unknown Origin Games
		1. *The AppData folder is hidden by default, ensure you have “show hidden items” checked on in your “view settings”*
2. Copy the entire ‘OddRealm’ folder and paste it in another location of your choosing

Step 2: *Changing Versions*

1. In Steam navigate to the *Odd Realm* game page.

1. Click on the Cog icon on the left hand side

1. Navigate to the “Betas” tab on the sidebar and select “beta - Public test branch” from the drop down.

## **Location and File Setup**

**Location:**

The location of the mod files can be found in the following directory:

###### *Steam*

`C:\Program Files (x86)\Steam\steamapps\common\Odd Realm`

If your steam games are not installed in the C: drive you can also find the game files location by clicking on the Cog icon in the steam game window for Odd Realm’s game page and then selecting ‘Manage > Browse local files’ to be taken to the game file directory.

**Basic File Setup:**

To mod the game you will need to create two files:

**gde\_data\_mod.txt**

**tx\_terrain\_atlas\_mod.png**

These files can be found in:

`…\Odd Realm\OddRealm_Data\StreamingAssets`

To create these files duplicate the existing original **gde\_data.txt** and **tx\_terrain\_atlas.png** files in the same folder and rename them as shown above respectively.

The game will automatically check for these mod file names and will use those files instead of the originals.

You can theoretically simply edit the original files (gde\_data.txt and tx\_terrain\_atlas.png) to create mods, but this will destroy the game's original data. To roll back any changes you will need to reinstall the game.

You can theoretically edit these two files in real time while the application is running, though it is not guaranteed that you will see your changes take effect. Currently it is recommended that after you’ve changed these files, it’s best to restart the game (if running) to see the changes you’ve made take effect.

If the game successfully registers the mod files you should get a pop-up on launch when the game loads as shown below.

For some mods to work a new save game or new entities are required for the changes to take effect.

## Reading The Game Data File

The editable **gde\_data\_mod.txt** is written in JSON, and it is minified by default. Our first step to be able to have a legible code file to edit is to *un*-minify it. This can be accomplished by pasting the code into the unminify web tool. Simply open the **gde\_data\_mod.txt** and paste the plain text into the tool and hit “Unminify”

Once the tool runs download the resulting file and name it:

**gde\_data\_mod\_unminy.txt**

Move the new **gde\_data\_mod\_unminy.txt** file back into our StreamingAssets folder.

Now our next step is particular to Visual Studio Code but will likely apply to any editor you decide to use. We need to change the file tag extension of **gde\_data\_mod\_unminy.txt** from **.txt** to **.json**. This can be done by simply renaming the file, though if you aren’t able to see **.txt** check your view options as you’ll need the “file name extensions” option checked as it is turned off by default.

This should now result in the file:

**gde\_data\_mod\_unminy.json**

Which our code editor should now read and lint nicely for us.

The **gde\_data\_mod\_unminy.json** will be the file we’ll be editing in the existing code examples below. For information about how to repackage the file for the game to read, see the **Repackaging** section of this guide.

# Game Data Code: Overview

To begin editing the games code you’ll need a source code editor application. I recommend VScode as it has JSON plugins that can be very useful to reading the game data file. This guide will assume you are completely unfamiliar with coding or the JSON language.

## Understanding The Game Data File

When you open your freshly made **gde\_data\_mod\_unminy.json** file in your code editor you should be greeted with a roughly 298350 line long code structure that serves as *Odd Realm’s* instruction set for how *most* in-game elements are defined and interpreted by the game engine.

This file is somewhat ordered alphabetically and can be broken down into the following sections:

*(This has been left in an unfinished state as the current mod development is likely to change as mentioned by* [Developer Sleipnir] *in a discord thread)*

**Version 0.10.0.17**

**/insert table here**

These sections can be edited or new items can be added to create a myriad of new in game features.

# Editing Existing Code

To change an existing value of a game element, start by tracking down the variable that controls what it is you are trying to change.

For example, let's say we wanted to increase the movement speed of the human race entities when a new one is spawned. To do that we need to find the variable that controls their movement and update the value that defines their speed.

The variable we’re looking for is the `"entity_tuning_human"` which looks like this:

```
"entity\_tuning\_human": {

        "\_gdeType\_SightRange": "Int",

        "SightRange": 128,

        "\_gdeType\_MinRandomSkill": "Int",

        "MinRandomSkill": 5,

        "\_gdeType\_MaxRandomSkill": "Int",

        "MaxRandomSkill": 15,

        "\_gdeType\_Health": "String",

        "Health": "1d6+300",

        "\_gdeType\_HealthChange": "Int",

        "HealthChange": 0,

        "\_gdeType\_Toughness": "String",

        "Toughness": "1d3",

        "\_gdeType\_Evasion": "String",

        "Evasion": "2d6",

        "\_gdeType\_MoveSpeed": "Int",

        "MoveSpeed": 24,

        "\_gdeType\_ClimbSpeed": "Int",

        "ClimbSpeed": 8,

        "\_gdeType\_Happiness": "Int",

        "Happiness": 10000,

        "\_gdeType\_HappinessChange": "Int",

        "HappinessChange": 5,

        "\_gdeType\_Hunger": "Int",

        "Hunger": 10000,

        "\_gdeType\_HungerChange": "Int",

        "HungerChange": -10,

        "\_gdeType\_Thirst": "Int",

        "Thirst": 10000,

        "\_gdeType\_ThirstChange": "Int",

        "ThirstChange": -10,

        "\_gdeType\_Energy": "Int",

        "Energy": 10000,

        "\_gdeType\_EnergyChange": "Int",

        "EnergyChange": -20,

        "\_gdeType\_BlockCurrentTemperature": "Int",

        "BlockCurrentTemperature": 50,

        "\_gdeType\_Temperature": "Int",

        "Temperature": 50,

        "\_gdeType\_ColdTolerance": "Int",

        "ColdTolerance": 20,

        "\_gdeType\_CritRate": "Int",

        "CritRate": 2,

        "\_gdeType\_DamageIgnoreRate": "Int",

        "DamageIgnoreRate": 0,

        "\_gdeType\_Age": "Int",

        "Age": 0,

        "\_gdeType\_XP": "Int",

        "XP": 0,

        "\_gdeType\_Level": "Int",

        "Level": 0,

        "\_gdeType\_AttackSpeedMod": "Int",

        "AttackSpeedMod": 10000,

        "\_gdeType\_OutputQualityMax": "Int",

        "OutputQualityMax": 3,

        "\_gdeType\_FishLure": "Int",

        "FishLure": 0,

        "\_gdeType\_FishScare": "Int",

        "FishScare": 50,

        "\_gdeType\_ProjectileMultRate": "Int",

        "ProjectileMultRate": 0,

        "\_gdeType\_ProjectileMultMod": "Int",

        "ProjectileMultMod": 0,

        "\_gdeType\_UsageDecreaseRate": "Int",

        "UsageDecreaseRate": 0,

        "\_gdeType\_UsageDecreaseMod": "Int",

        "UsageDecreaseMod": 0,

        "\_gdeType\_ResourceFindRate": "Int",

        "ResourceFindRate": 0,

        "\_gdeType\_ResourceFindMod": "Int",

        "ResourceFindMod": 0,

        "\_gdeType\_BurnRate": "Int",

        "BurnRate": 0,

        "\_gdeType\_BurnMod": "Int",

        "BurnMod": 0,

        "\_gdeType\_Oxygen": "Int",

        "Oxygen": 10000,

        "\_gdeType\_OxygenChange": "Int",

        "OxygenChange": 2500,

        "\_gdeType\_Skills": "String",

        "Skills": "",

        "\_gdeIsList\_StartingStatuses": 1,

        "\_gdeType\_StartingStatuses": "String",

        "StartingStatuses": [],

        "\_gdeIsList\_RandomStartingStatuses": 1,

        "\_gdeType\_RandomStartingStatuses": "String",

        "RandomStartingStatuses": [

            "entity\_status\_trait\_big\_boned",

            "entity\_status\_trait\_lazy",

            "entity\_status\_trait\_dull",

            "entity\_status\_trait\_impaired\_leg",

            "entity\_status\_trait\_impaired\_arm",

            "entity\_status\_trait\_impaired\_eye",

            "entity\_status\_trait\_impaired\_foot",

            "entity\_status\_trait\_short\_legs",

            "entity\_status\_trait\_jack\_of\_all\_trades",

            "entity\_status\_trait\_sickly",

            "entity\_status\_trait\_strong",

            "entity\_status\_trait\_weak",

            "entity\_status\_trait\_fast",

            "entity\_status\_trait\_slow",

            "entity\_status\_trait\_freakishly\_big\_hands",

            "entity\_status\_trait\_hold\_breath\_longer"

        ],

        "\_gdeType\_History": "String",

        "History": "",

        "\_gdeType\_Appearance": "String",

        "Appearance": "",

        "\_gdeType\_Inventory": "String",

        "Inventory": "",

        "\_gdeType\_Equipment": "String",

        "Equipment": "{\"item\_group\_ids\":[\"isg\_human\_settlers\_default\_loadout\"]}",

        "\_gdeSchema": "EntityTuning"

    },

```

As you can see `"entity_tuning_human"` has a myriad of values associated with it. However the one we’re looking for is `"MoveSpeed"`. It’s current value is set to the integer or int of 24.

If we set this value to, let's say 1000, we should expect to see our little humans run around the map at a breakneck pace.

Try changing the value to 1000 so that the line reads:`"MoveSpeed": 1000,` and then repackage the file; following the steps in the **Repackaging** section below. Now run your game to see your handiwork in action!

# Creating Your Own Code

If you want to add your own items, blocks, etc. into the game you’ll need to add the relevant references into the appropriate sections and add our own art.

For example, let's say we wanted to add our own custom piece of furniture or Prop as the game calls them.

Firstly, we’ll need to come up with a name for our new Prop. Let's call it “Darkwood Table” which we will base off of the games original “Wood Table”.

## Interpreting The Game Data File

The sections of the game data file that govern how the game creates and handles Props like “wood\_table” are:

* Blocks
	+ "block\_prop\_wood\_table"
* Block Models
	+ "model\_block\_prop\_wood\_table"
* Visuals
	+ "visuals\_block\_prop\_wood\_table"
* Blueprints
	+ "blueprint\_prop\_wood\_table"
* Blueprint Requirements
	+ "requirement\_blueprint\_prop\_wood\_table"
* Interface Info
	+ "Interface\_info\_wood\_table"
* Item Spawn Groups (ISG)
	+ "isg\_prop\_wood\_table"
* Tooltips
	+ "tooltip\_block\_prop\_wood\_table"

In the sub bullet points for each section we can see examples of where the game defines its own “wood\_table” which we’ll look to emulate.

## **Game Data Editing Methods**

As of now there are currently two primary methods for adding mods to the game. The manual method, which involves manually pasting your code into the game in the appropriate sections, and the automatic method, which utilizes a patcher to combine mod files with the base game data.

## **Manual Game Data Editing Method**

The following sections utilize this method to get you familiar with the manual process of adding mods. All entries are manually added into their respective sections of the **gde\_data\_mod\_unminy.json** file as explained below.

### **Blocks**

Blocks are the core game elements in *Odd Realm*. Elements that can be physically placed in the game world or that appear physically in a fixed location in the game world are blocks

The block naming conventions follow this format:

**block\_type\_name**

The code for the “block\_prop\_wood\_table” which controls the “wood table” Prop is shown below:

```
"block\_prop\_wood\_table": {
 "\_gdeType\_Index": "Int",
 "Index": 390,
 "\_gdeIsList\_Tags": 1,
 "\_gdeType\_Tags": "String",
 "Tags": ["table"],
 "\_gdeType\_PhysicsHeatSource": "Int",
 "PhysicsHeatSource": 0,
 "\_gdeType\_PhysicsHeatPass": "Float",
 "PhysicsHeatPass": 0.95,
 "\_gdeType\_TooltipID": "String",
 "TooltipID": "tooltip\_block\_prop\_wood\_table",
 "\_gdeIsList\_Visuals": 1,
 "\_gdeType\_Visuals": "String",
 "Visuals": ["visuals\_block\_prop\_wood\_table"],
 "\_gdeType\_TriggerFaction": "Int",
 "TriggerFaction": 0,
 "\_gdeType\_Triggers": "Int",
 "Triggers": 0,
 "\_gdeType\_TriggerActions": "Int",
 "TriggerActions": 0,
 "\_gdeIsList\_TriggerStatuses": 1,
 "\_gdeType\_TriggerStatuses": "String",
 "TriggerStatuses": [],
 "\_gdeIsList\_TriggerAttacks": 1,
 "\_gdeType\_TriggerAttacks": "String",
 "TriggerAttacks": [],
 "\_gdeType\_TriggerSFX": "String",
 "TriggerSFX": "",
 "\_gdeType\_CanSupportWeight": "Bool",
 "CanSupportWeight": false,
 "\_gdeType\_CanHavePlants": "Bool",
 "CanHavePlants": true,
 "\_gdeType\_IsFertile": "Bool",
 "IsFertile": false,
 "\_gdeType\_CanHaveFish": "Bool",
 "CanHaveFish": false,
 "\_gdeType\_SoilQuality": "Int",
 "SoilQuality": 0,
 "\_gdeType\_PhysicsTypes": "Int",
 "PhysicsTypes": 1026,
 "\_gdeType\_PhysicHeatSinkTemp": "Int",
 "PhysicHeatSinkTemp": 0,
 "\_gdeType\_FXPhysicsTypes": "Int",
 "FXPhysicsTypes": 0,
 "\_gdeIsList\_PhysicsUnstableFX": 1,
 "\_gdeType\_PhysicsUnstableFX": "String",
 "PhysicsUnstableFX": [],
 "\_gdeIsList\_PhysicsFillFX": 1,
 "\_gdeType\_PhysicsFillFX": "String",
 "PhysicsFillFX": [],
 "\_gdeType\_PhysicsClearBlock": "Int",
 "PhysicsClearBlock": 0,
 "\_gdeType\_PhysicsSolidBlock": "Int",
 "PhysicsSolidBlock": -1,
 "\_gdeType\_PhysicsLiquidBlock": "Int",
 "PhysicsLiquidBlock": -1,
 "\_gdeType\_PhysicsGasBlock": "Int",
 "PhysicsGasBlock": -1,
 "\_gdeType\_MinTemperature": "Int",
 "MinTemperature": -100,
 "\_gdeType\_MaxTemperature": "Int",
 "MaxTemperature": 100,
 "\_gdeType\_Toughness": "Int",
 "Toughness": 0,
 "\_gdeType\_MaxItemCount": "Int",
 "MaxItemCount": 0,
 "\_gdeType\_CanShowItems": "Bool",
 "CanShowItems": false,
 "\_gdeType\_RestrictItemsToSameKey": "Bool",
 "RestrictItemsToSameKey": false,
 "\_gdeType\_Permissions": "Int",
 "Permissions": 2112,
 "\_gdeType\_AddSFX": "String",
 "AddSFX": "",
 "\_gdeType\_RemoveSFX": "String",
 "RemoveSFX": "",
 "\_gdeType\_InteractSFX": "String",
 "InteractSFX": "sfx\_hammer\_wood",
 "\_gdeType\_FlammableChance": "Int",
 "FlammableChance": 500,
 "\_gdeType\_DecayBuff": "Int",
 "DecayBuff": 0,
 "\_gdeType\_Level": "Int",
 "Level": 1,
 "\_gdeType\_RemoveItemDrops": "String",
 "RemoveItemDrops": "isg\_prop\_wood\_table",
 "\_gdeType\_VerticalMovementMod": "Float",
 "VerticalMovementMod": 0.25,
 "\_gdeType\_HorizontalMovementMod": "Float",
 "HorizontalMovementMod": 1,
 "\_gdeType\_CanBeLocked": "Bool",
 "CanBeLocked": false,
 "\_gdeType\_LockedMovementFlags": "Int",
 "LockedMovementFlags": 0,
 "\_gdeType\_RestrictedMovementFlags": "Int",
 "RestrictedMovementFlags": 0,
 "\_gdeType\_MovementCost": "Float",
 "MovementCost": 2,
 "\_gdeType\_VerticalMoveRequiresClimb": "Bool",
 "VerticalMoveRequiresClimb": true,
 "\_gdeType\_ForceFocusDirection": "Bool",
 "ForceFocusDirection": false,
 "\_gdeType\_IsObstruction": "Bool",
 "IsObstruction": false,
 "\_gdeType\_IsVerticalAccess": "Bool",
 "IsVerticalAccess": false,
 "\_gdeSchema": "Blocks"
 },

```

Since our “darkwood table” is essentially going to be a reskinned wood table we can leave most of this data alone. The main values of the “block\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “block\_prop\_wood\_table”
	+ This is the variable name which defines the block object
* “Index”
	+ Gives the block a unique ID that the game can reference.
* “TooltipID”
	+ Tells the block which tooltip to reference
* “Visuals”
	+ Tells the block which visuals section to reference
* “RemoveItemDrops”
	+ Tells the block which drop table to reference when this item is destroyed/removed

Now that we know what values we need to edit to make this “wood table” into our very own “darkwood table” we’ll copy the existing “wood table” code and, for convenience's sake, paste it on a new line just below the “wood table” code and start editing it’s values. If you intend to utilize the manual method when you make your own mods, it is advised to place your mod items at the end of their respective sections for readability.

We want to change the above values to the following:

* “block\_prop\_darkwood\_table”: {
* “Index”: 133700031,
* “TooltipID”: “tooltip\_block\_prop\_darkwood\_table”,
* "Visuals": ["visuals\_block\_prop\_darkwood\_table"],
* "RemoveItemDrops": "isg\_prop\_darkwood\_table",

Above you can see we rename the variable name and point each of these references to a new “darkwood table” reference using the existing naming conventions.

We also set the Index to 133700031 as this Index value is not used as of **V0.10.0.17** and conforms to the rangeId format. More on rangeId’s can be found in the Best Practices Section.

The final product should look like this with the lines to change highlighted below:

```
"block\_prop\_darkwood\_table": {
 "\_gdeType\_Index": "Int",
 "Index": 133700031,
 "\_gdeIsList\_Tags": 1,
 "\_gdeType\_Tags": "String",
 "Tags": ["table"],
 "\_gdeType\_PhysicsHeatSource": "Int",
 "PhysicsHeatSource": 0,
 "\_gdeType\_PhysicsHeatPass": "Float",
 "PhysicsHeatPass": 0.95,
 "\_gdeType\_TooltipID": "String",
 "TooltipID": "tooltip\_block\_prop\_darkwood\_table",
 "\_gdeIsList\_Visuals": 1,
 "\_gdeType\_Visuals": "String",
 "Visuals": ["visuals\_block\_prop\_darkwood\_table"],
 "\_gdeType\_TriggerFaction": "Int",
 "TriggerFaction": 0,
 "\_gdeType\_Triggers": "Int",
 "Triggers": 0,
 "\_gdeType\_TriggerActions": "Int",
 "TriggerActions": 0,
 "\_gdeIsList\_TriggerStatuses": 1,
 "\_gdeType\_TriggerStatuses": "String",
 "TriggerStatuses": [],
 "\_gdeIsList\_TriggerAttacks": 1,
 "\_gdeType\_TriggerAttacks": "String",
 "TriggerAttacks": [],
 "\_gdeType\_TriggerSFX": "String",
 "TriggerSFX": "",
 "\_gdeType\_CanSupportWeight": "Bool",
 "CanSupportWeight": false,
 "\_gdeType\_CanHavePlants": "Bool",
 "CanHavePlants": true,
 "\_gdeType\_IsFertile": "Bool",
 "IsFertile": false,
 "\_gdeType\_CanHaveFish": "Bool",
 "CanHaveFish": false,
 "\_gdeType\_SoilQuality": "Int",
 "SoilQuality": 0,
 "\_gdeType\_PhysicsTypes": "Int",
 "PhysicsTypes": 1026,
 "\_gdeType\_PhysicHeatSinkTemp": "Int",
 "PhysicHeatSinkTemp": 0,
 "\_gdeType\_FXPhysicsTypes": "Int",
 "FXPhysicsTypes": 0,
 "\_gdeIsList\_PhysicsUnstableFX": 1,
 "\_gdeType\_PhysicsUnstableFX": "String",
 "PhysicsUnstableFX": [],
 "\_gdeIsList\_PhysicsFillFX": 1,
 "\_gdeType\_PhysicsFillFX": "String",
 "PhysicsFillFX": [],
 "\_gdeType\_PhysicsClearBlock": "Int",
 "PhysicsClearBlock": 0,
 "\_gdeType\_PhysicsSolidBlock": "Int",
 "PhysicsSolidBlock": -1,
 "\_gdeType\_PhysicsLiquidBlock": "Int",
 "PhysicsLiquidBlock": -1,
 "\_gdeType\_PhysicsGasBlock": "Int",
 "PhysicsGasBlock": -1,
 "\_gdeType\_MinTemperature": "Int",
 "MinTemperature": -100,
 "\_gdeType\_MaxTemperature": "Int",
 "MaxTemperature": 100,
 "\_gdeType\_Toughness": "Int",
 "Toughness": 0,
 "\_gdeType\_MaxItemCount": "Int",
 "MaxItemCount": 0,
 "\_gdeType\_CanShowItems": "Bool",
 "CanShowItems": false,
 "\_gdeType\_RestrictItemsToSameKey": "Bool",
 "RestrictItemsToSameKey": false,
 "\_gdeType\_Permissions": "Int",
 "Permissions": 2112,
 "\_gdeType\_AddSFX": "String",
 "AddSFX": "",
 "\_gdeType\_RemoveSFX": "String",
 "RemoveSFX": "",
 "\_gdeType\_InteractSFX": "String",
 "InteractSFX": "sfx\_hammer\_wood",
 "\_gdeType\_FlammableChance": "Int",
 "FlammableChance": 500,
 "\_gdeType\_DecayBuff": "Int",
 "DecayBuff": 0,
 "\_gdeType\_Level": "Int",
 "Level": 1,
 "\_gdeType\_RemoveItemDrops": "String",
 "RemoveItemDrops": "isg\_prop\_darkwood\_table",
 "\_gdeType\_VerticalMovementMod": "Float",
 "VerticalMovementMod": 0.25,
 "\_gdeType\_HorizontalMovementMod": "Float",
 "HorizontalMovementMod": 1,
 "\_gdeType\_CanBeLocked": "Bool",
 "CanBeLocked": false,
 "\_gdeType\_LockedMovementFlags": "Int",
 "LockedMovementFlags": 0,
 "\_gdeType\_RestrictedMovementFlags": "Int",
 "RestrictedMovementFlags": 0,
 "\_gdeType\_MovementCost": "Float",
 "MovementCost": 2,
 "\_gdeType\_VerticalMoveRequiresClimb": "Bool",
 "VerticalMoveRequiresClimb": true,
 "\_gdeType\_ForceFocusDirection": "Bool",
 "ForceFocusDirection": false,
 "\_gdeType\_IsObstruction": "Bool",
 "IsObstruction": false,
 "\_gdeType\_IsVerticalAccess": "Bool",
 "IsVerticalAccess": false,
 "\_gdeSchema": "Blocks"
 },

```

### **Blocks Models**

The block model naming conventions follow this format:

**model\_block\_type\_name**

The values of the “model\_block\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “model\_block\_prop\_wood\_table”
* “ModelIndex”
* “BlockIndex”

Copy the “model\_block\_prop\_wood\_table” section and paste it again on a new line below and edit the above values so that the section looks like this:

```
"model\_block\_prop\_darkwood\_table": {
 "\_gdeType\_ModelIndex": "Int",
 "ModelIndex": 133700031,
 "\_gdeType\_BlockIndex": "Int",
 "BlockIndex": 133700031,
 "\_gdeIsList\_Plants": 1,
 "\_gdeType\_Plants": "String",
 "Plants": [],
 "\_gdeType\_ItemSpawnGroup": "String",
 "ItemSpawnGroup": "",
 "\_gdeIsList\_Items": 1,
 "\_gdeType\_Items": "String",
 "Items": [],
 "\_gdeType\_Platform": "String",
 "Platform": "",
 "\_gdeType\_ContainedEntitySpawnGroup": "String",
 "ContainedEntitySpawnGroup": "",
 "\_gdeType\_FishSpawnGroup": "String",
 "FishSpawnGroup": "",
 "\_gdeSchema": "BlockModel"
 },

```

### **Visuals**

This variable references the **tx\_terrain\_atlas\_mod.png** to draw your creations in the game! For more information on how this works check out the Art Section below.

For this example we’ve placed a new texture in the **tx\_terrain\_atlas\_mod.png** with the x/y coordinates of:

X = 112

Y = 78

The Visuals naming conventions follow this format:

**visuals\_type\_type\_name**

The values of the “model\_block\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “visuals\_block\_prop\_wood\_table”
* “TextureX”
* “TextureY”

Copy the “visuals\_block\_prop\_wood\_table” section and paste it again on a new line below and edit the above values so that the section looks like this:

```
"visuals\_block\_prop\_darkwood\_table": {
 "\_gdeType\_OnlyRenderIfVisible": "Bool",
 "OnlyRenderIfVisible": true,
 "\_gdeType\_RotationType": "Int",
 "RotationType": 0,
 "\_gdeType\_VisibilityFlag": "Int",
 "VisibilityFlag": 1,
 "\_gdeType\_ShowPermissionColor": "Bool",
 "ShowPermissionColor": true,
 "\_gdeType\_ColorAddType": "Int",
 "ColorAddType": 1,
 "\_gdeType\_HasTriggerOffset": "Int",
 "HasTriggerOffset": 0,
 "\_gdeType\_DepthOffset": "Float",
 "DepthOffset": 0.04,
 "\_gdeType\_HideSurfaceWhenObscuredAbove": "Bool",
 "HideSurfaceWhenObscuredAbove": false,
 "\_gdeType\_HideSurfaceWhenSameTypeAbove": "Bool",
 "HideSurfaceWhenSameTypeAbove": false,
 "\_gdeType\_CanTransitionIfObscuredAbove": "Bool",
 "CanTransitionIfObscuredAbove": true,
 "\_gdeType\_ObscureDirectSurfaceBelow": "Bool",
 "ObscureDirectSurfaceBelow": false,
 "\_gdeType\_HasSurface": "Bool",
 "HasSurface": false,
 "\_gdeType\_HasSeasonOffset": "Bool",
 "HasSeasonOffset": false,
 "\_gdeType\_MinimapColor": "String",
 "MinimapColor": "fce5cd",
 "\_gdeType\_TextureX": "Int",
 "TextureX": 112,
 "\_gdeType\_TextureY": "Int",
 "TextureY": 78,
 "\_gdeType\_WeatherY": "Int",
 "WeatherY": 1,
 "\_gdeType\_TransitionType": "Int",
 "TransitionType": 2,
 "\_gdeType\_TransitionKey": "Int",
 "TransitionKey": 801,
 "\_gdeType\_IsRotationFixture": "Bool",
 "IsRotationFixture": false,
 "\_gdeType\_BlockAmbientLight": "Bool",
 "BlockAmbientLight": false,
 "\_gdeType\_ShowAmbientLight": "Bool",
 "ShowAmbientLight": true,
 "\_gdeType\_TailVariants": "Int",
 "TailVariants": 0,
 "\_gdeType\_ShowTailVariant": "Bool",
 "ShowTailVariant": false,
 "\_gdeType\_ShowAnims": "Bool",
 "ShowAnims": false,
 "\_gdeType\_TemperatureStrength": "Int",
 "TemperatureStrength": 0,
 "\_gdeType\_TemperatureHorizontalPass": "Int",
 "TemperatureHorizontalPass": 1,
 "\_gdeType\_TemperatureDownPass": "Int",
 "TemperatureDownPass": 1,
 "\_gdeType\_TemperatureUpPass": "Int",
 "TemperatureUpPass": 1,
 "\_gdeType\_ShowLighting": "Bool",
 "ShowLighting": true,
 "\_gdeType\_SpotlightStrength": "Int",
 "SpotlightStrength": 0,
 "\_gdeType\_SpotlightHorizontalPass": "Int",
 "SpotlightHorizontalPass": 1,
 "\_gdeType\_SpotlightDownPass": "Int",
 "SpotlightDownPass": 1,
 "\_gdeType\_SpotlightUpPass": "Int",
 "SpotlightUpPass": 1,
 "\_gdeType\_AddVFX": "String",
 "AddVFX": "",
 "\_gdeType\_RemoveVFX": "String",
 "RemoveVFX": "",
 "\_gdeType\_InteractVFX": "String",
 "InteractVFX": "",
 "\_gdeType\_IdleVFX": "String",
 "IdleVFX": "",
 "\_gdeType\_SkylightPass": "Int",
 "SkylightPass": 0,
 "\_gdeType\_SkylightMin": "Int",
 "SkylightMin": 11,
 "\_gdeType\_SkylightMax": "Int",
 "SkylightMax": 15,
 "\_gdeSchema": "BlockVisuals"
 },

```

### **Blueprints**

The Blueprint naming conventions follow this format:

**blueprint\_type\_name**

The values of the “blueprint\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “blueprint\_prop\_wood\_table”
* “Requirements”
* “Visuals”
* “TooltipID”
* “InterfaceInfo”
* “ModelIndex”

Copy the “blueprint\_prop\_wood\_table” section and paste it again on a new line below and edit the above values so that the section looks like this:

```
"blueprint\_prop\_darkwood\_table": {
 "\_gdeType\_Requirements": "String",
 "Requirements": "requirement\_blueprint\_prop\_darkwood\_table",
 "\_gdeType\_ModelMultipler": "Int",
 "ModelMultipler": 1,
 "\_gdeType\_WorkFX": "String",
 "WorkFX": "fx\_work\_add",
 "\_gdeType\_ProgressDisplayType": "Int",
 "ProgressDisplayType": 3,
 "\_gdeType\_InvertProgressDisplay": "Bool",
 "InvertProgressDisplay": true,
 "\_gdeType\_ActionTextType": "Int",
 "ActionTextType": 1,
 "\_gdeType\_ProgressMax": "Int",
 "ProgressMax": 100,
 "\_gdeType\_Toughness": "Int",
 "Toughness": 0,
 "\_gdeType\_XPMod": "Float",
 "XPMod": 1,
 "\_gdeType\_UseBlockForToughness": "Bool",
 "UseBlockForToughness": false,
 "\_gdeType\_StatusDisplayType": "Int",
 "StatusDisplayType": 2,
 "\_gdeIsList\_Visuals": 1,
 "\_gdeType\_Visuals": "String",
 "Visuals": ["visuals\_block\_prop\_darkwood\_table"],
 "\_gdeType\_Priority": "Int",
 "Priority": 0,
 "\_gdeType\_ToolbarMenu": "String",
 "ToolbarMenu": "toolbar\_menu\_build",
 "\_gdeType\_ResearchKey": "String",
 "ResearchKey": "wood0",
 "\_gdeType\_TooltipID": "String",
 "TooltipID": "tooltip\_block\_prop\_darkwood\_table",
 "\_gdeType\_InterfaceInfo": "String",
 "InterfaceInfo": "interface\_info\_darkwood\_table",
 "\_gdeType\_Permission": "Int",
 "Permission": 2048,
 "\_gdeType\_AutoPlacementClearPermission": "Int",
 "AutoPlacementClearPermission": 0,
 "\_gdeType\_PlacementType": "Int",
 "PlacementType": 2,
 "\_gdeType\_PlacementClearMask": "Int",
 "PlacementClearMask": 3,
 "\_gdeType\_ConstructionCategory": "Int",
 "ConstructionCategory": 2,
 "\_gdeType\_InteractSFX": "String",
 "InteractSFX": "sfx\_hammer\_wood",
 "\_gdeType\_CompleteSFX": "String",
 "CompleteSFX": "",
 "\_gdeType\_ModelIndex": "Int",
 "ModelIndex": 133700031,
 "\_gdeType\_EntitiesToCreate": "String",
 "EntitiesToCreate": "",
 "\_gdeType\_PickUpItemAction": "Int",
 "PickUpItemAction": 0,
 "\_gdeSchema": "Blueprints"
 },

```

### **Blueprint Requirements**

The Blueprint Requirements naming conventions follow this format:

**requirement\_blueprint\_type\_name**

The values of the “requirement\_blueprint\_prop\_wood\_table” we’ll need to change in this example are as follows:

```
"requirement\_blueprint\_prop\_darkwood\_table": {
 "\_gdeType\_BlockTagConditionType": "Int",
 "BlockTagConditionType": 1,
 "\_gdeIsList\_BlockTags": 1,
 "\_gdeType\_BlockTags": "String",
 "BlockTags": [],
 "\_gdeIsList\_WorkstationTags": 1,
 "\_gdeType\_WorkstationTags": "String",
 "WorkstationTags": [],
 "\_gdeIsList\_Functions": 1,
 "\_gdeType\_Functions": "String",
 "Functions": [],
 "\_gdeType\_Skill": "String",
 "Skill": "skill\_craft\_wood",
 "\_gdeType\_ItemRequirementType": "Int",
 "ItemRequirementType": 1,
 "\_gdeIsList\_ItemIDs": 1,
 "\_gdeType\_ItemIDs": "String",
 "ItemIDs": ["item\_wood\_log"],
 "\_gdeIsList\_ItemCounts": 1,
 "\_gdeType\_ItemCounts": "Int",
 "ItemCounts": [5],
 "\_gdeSchema": "BlueprintRequirements"
 },

```

### **Interface Info**

The Interface Info naming conventions follow this format:

**interface\_info\_name**

The values of the “interface\_info\_wood\_table” we’ll need to change in this example are as follows:

* “interface\_info\_wood\_table”
* "\_gdeType\_OrderKey":"String","OrderKey":"E\_props\_wood\_table",
* “\_gdeType\_OrderIndex”: “Int”, “OrderIndex”: 390,

Copy the “interface\_info\_wood\_table” section and paste it again on a new line below and edit the above value so that the section looks like this:

```
 "interface\_info\_darkwood\_table":{
 "\_gdeType\_OrderKey":"String","OrderKey":"E\_props\_darkwood\_table",
 "\_gdeType\_OrderIndex":"Int","OrderIndex":133700031,
 "\_gdeSchema":"InterfaceInfo"
 },

```

### **Item Spawn Group (ISG)**

The Item Spawn Groups naming conventions follow this format:

**isg\_type\_name**

The values of the “isg\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “isg\_prop\_wood\_table”

Copy the “isg\_prop\_wood\_table” section and paste it again on a new line below and edit the above value so that the section looks like this:

```
 "isg\_prop\_darkwood\_table": {
 "\_gdeType\_FriendlyName": "String",
 "FriendlyName": "Deconstruction yield:",
 "\_gdeType\_Data": "String",
 "Data": "{\"items\":[{\"item\_id\":\"item\_wood\_log\",\"count\":1,\"spawn\_rate\":1000}]}",
 "\_gdeSchema": "ItemSpawnGroups"
 },

```

### **Tooltips**

The Tooltips naming conventions follow this format:

**tooltip\_type\_type\_name**

The values of the “tooltip\_block\_prop\_wood\_table” we’ll need to change in this example are as follows:

* “Tooltip\_block\_prop\_wood\_table”
* “Name”
* “Icon”

```
"tooltip\_block\_prop\_darkwood\_table": {
 "\_gdeType\_Name": "String",
 "Name": "Darkwood Table",
 "\_gdeType\_InlineIcon": "String",
 "InlineIcon": "<sprite=440>",
 "\_gdeType\_Description": "String",
 "Description": "",
 "\_gdeType\_Action": "String",
 "Action": "",
 "\_gdeType\_Icon": "String",
 "Icon": "sp\_darkwood\_table\_icon",
 "\_gdeType\_Formatting": "String",
 "Formatting": "",
 "\_gdeSchema": "Tooltips"
 },

```

## Automatic Game Data Patching Method

The automatic game data patching method called the **Odd Realm Mod Patcher** or **ORMP** for short utilizes a Node JS script developed by discord user **[kd8lvt]** which can be downloaded HERE.

Instructions on how to use the tool are located both on github and the readme file inside the tool.

This method allows mod makers and installers alike to patch one or more mods directly into a **gde\_data\_mod.txt** file.

Examples of how to format your mods are provided in the installation package but if we wanted to have the patch add our darkwood table mod automatically for us, all we would need to do is create a new **.json** file in our code editor of choice and format the previously shown sections like the example below.

```
{

 "tooltip\_block\_prop\_darkwood\_table": {
 "\_gdeType\_Name": "String",
 "Name": "Darkwood Table",
 "\_gdeType\_InlineIcon": "String",
 "InlineIcon": "<sprite=440>",
 "\_gdeType\_Description": "String",
 "Description": "",
 "\_gdeType\_Action": "String",
 "Action": "",
 "\_gdeType\_Icon": "String",
 "Icon": "sp\_darkwood\_table\_icon",
 "\_gdeType\_Formatting": "String",
 "Formatting": "",
 "\_gdeSchema": "Tooltips"
 },

 "isg\_prop\_darkwood\_table": {
 "\_gdeType\_FriendlyName": "String",
 "FriendlyName": "Deconstruction yield:",
 "\_gdeType\_Data": "String",
 "Data": "{\"items\":[{\"item\_id\":\"item\_wood\_log\",\"count\":1,\"spawn\_rate\":1000}]}",
 "\_gdeSchema": "ItemSpawnGroups"
 },
 "model\_block\_prop\_darkwood\_table": {
 "\_gdeType\_ModelIndex": "Int",
 "ModelIndex": 133700031,
 "\_gdeType\_BlockIndex": "Int",
 "BlockIndex": 133700031,
 "\_gdeIsList\_Plants": 1,
 "\_gdeType\_Plants": "String",
 "Plants": [],
 "\_gdeType\_ItemSpawnGroup": "String",
 "ItemSpawnGroup": "",
 "\_gdeIsList\_Items": 1,
 "\_gdeType\_Items": "String",
 "Items": [],
 "\_gdeType\_Platform": "String",
 "Platform": "",
 "\_gdeType\_ContainedEntitySpawnGroup": "String",
 "ContainedEntitySpawnGroup": "",
 "\_gdeType\_FishSpawnGroup": "String",
 "FishSpawnGroup": "",
 "\_gdeSchema": "BlockModel"
 },
 "requirement\_blueprint\_prop\_darkwood\_table": {
 "\_gdeType\_BlockTagConditionType": "Int",
 "BlockTagConditionType": 1,
 "\_gdeIsList\_BlockTags": 1,
 "\_gdeType\_BlockTags": "String",
 "BlockTags": [],
 "\_gdeIsList\_WorkstationTags": 1,
 "\_gdeType\_WorkstationTags": "String",
 "WorkstationTags": [],
 "\_gdeIsList\_Functions": 1,
 "\_gdeType\_Functions": "String",
 "Functions": [],
 "\_gdeType\_Skill": "String",
 "Skill": "skill\_craft\_wood",
 "\_gdeType\_ItemRequirementType": "Int",
 "ItemRequirementType": 1,
 "\_gdeIsList\_ItemIDs": 1,
 "\_gdeType\_ItemIDs": "String",
 "ItemIDs": ["item\_wood\_log"],
 "\_gdeIsList\_ItemCounts": 1,
 "\_gdeType\_ItemCounts": "Int",
 "ItemCounts": [5],
 "\_gdeSchema": "BlueprintRequirements"
 },

 "interface\_info\_darkwood\_table":{
 "\_gdeType\_OrderKey":"String","OrderKey":"E\_props\_darkwood\_table",
 "\_gdeType\_OrderIndex":"Int","OrderIndex":133700031,
 "\_gdeSchema":"InterfaceInfo"
 },
 "blueprint\_prop\_darkwood\_table": {
 "\_gdeType\_Requirements": "String",
 "Requirements": "requirement\_blueprint\_prop\_darkwood\_table",
 "\_gdeType\_ModelMultipler": "Int",
 "ModelMultipler": 1,
 "\_gdeType\_WorkFX": "String",
 "WorkFX": "fx\_work\_add",
 "\_gdeType\_ProgressDisplayType": "Int",
 "ProgressDisplayType": 3,
 "\_gdeType\_InvertProgressDisplay": "Bool",
 "InvertProgressDisplay": true,
 "\_gdeType\_ActionTextType": "Int",
 "ActionTextType": 1,
 "\_gdeType\_ProgressMax": "Int",
 "ProgressMax": 100,
 "\_gdeType\_Toughness": "Int",
 "Toughness": 0,
 "\_gdeType\_XPMod": "Float",
 "XPMod": 1,
 "\_gdeType\_UseBlockForToughness": "Bool",
 "UseBlockForToughness": false,
 "\_gdeType\_StatusDisplayType": "Int",
 "StatusDisplayType": 2,
 "\_gdeIsList\_Visuals": 1,
 "\_gdeType\_Visuals": "String",
 "Visuals": ["visuals\_block\_prop\_darkwood\_table"],
 "\_gdeType\_Priority": "Int",
 "Priority": 0,
 "\_gdeType\_ToolbarMenu": "String",
 "ToolbarMenu": "toolbar\_menu\_build",
 "\_gdeType\_ResearchKey": "String",
 "ResearchKey": "wood0",
 "\_gdeType\_TooltipID": "String",
 "TooltipID": "tooltip\_block\_prop\_darkwood\_table",
 "\_gdeType\_InterfaceInfo": "String",
 "InterfaceInfo": "interface\_info\_darkwood\_table",
 "\_gdeType\_Permission": "Int",
 "Permission": 2048,
 "\_gdeType\_AutoPlacementClearPermission": "Int",
 "AutoPlacementClearPermission": 0,
 "\_gdeType\_PlacementType": "Int",
 "PlacementType": 2,
 "\_gdeType\_PlacementClearMask": "Int",
 "PlacementClearMask": 3,
 "\_gdeType\_ConstructionCategory": "Int",
 "ConstructionCategory": 2,
 "\_gdeType\_InteractSFX": "String",
 "InteractSFX": "sfx\_hammer\_wood",
 "\_gdeType\_CompleteSFX": "String",
 "CompleteSFX": "",
 "\_gdeType\_ModelIndex": "Int",
 "ModelIndex": 133700031,
 "\_gdeType\_EntitiesToCreate": "String",
 "EntitiesToCreate": "",
 "\_gdeType\_PickUpItemAction": "Int",
 "PickUpItemAction": 0,
 "\_gdeSchema": "Blueprints"
 },
 "visuals\_block\_prop\_darkwood\_table": {
 "\_gdeType\_OnlyRenderIfVisible": "Bool",
 "OnlyRenderIfVisible": true,
 "\_gdeType\_RotationType": "Int",
 "RotationType": 0,
 "\_gdeType\_VisibilityFlag": "Int",
 "VisibilityFlag": 1,
 "\_gdeType\_ShowPermissionColor": "Bool",
 "ShowPermissionColor": true,
 "\_gdeType\_ColorAddType": "Int",
 "ColorAddType": 1,
 "\_gdeType\_HasTriggerOffset": "Int",
 "HasTriggerOffset": 0,
 "\_gdeType\_DepthOffset": "Float",
 "DepthOffset": 0.04,
 "\_gdeType\_HideSurfaceWhenObscuredAbove": "Bool",
 "HideSurfaceWhenObscuredAbove": false,
 "\_gdeType\_HideSurfaceWhenSameTypeAbove": "Bool",
 "HideSurfaceWhenSameTypeAbove": false,
 "\_gdeType\_CanTransitionIfObscuredAbove": "Bool",
 "CanTransitionIfObscuredAbove": true,
 "\_gdeType\_ObscureDirectSurfaceBelow": "Bool",
 "ObscureDirectSurfaceBelow": false,
 "\_gdeType\_HasSurface": "Bool",
 "HasSurface": false,
 "\_gdeType\_HasSeasonOffset": "Bool",
 "HasSeasonOffset": false,
 "\_gdeType\_MinimapColor": "String",
 "MinimapColor": "fce5cd",
 "\_gdeType\_TextureX": "Int",
 "TextureX": 112,
 "\_gdeType\_TextureY": "Int",
 "TextureY": 78,
 "\_gdeType\_WeatherY": "Int",
 "WeatherY": 1,
 "\_gdeType\_TransitionType": "Int",
 "TransitionType": 2,
 "\_gdeType\_TransitionKey": "Int",
 "TransitionKey": 801,
 "\_gdeType\_IsRotationFixture": "Bool",
 "IsRotationFixture": false,
 "\_gdeType\_BlockAmbientLight": "Bool",
 "BlockAmbientLight": false,
 "\_gdeType\_ShowAmbientLight": "Bool",
 "ShowAmbientLight": true,
 "\_gdeType\_TailVariants": "Int",
 "TailVariants": 0,
 "\_gdeType\_ShowTailVariant": "Bool",
 "ShowTailVariant": false,
 "\_gdeType\_ShowAnims": "Bool",
 "ShowAnims": false,
 "\_gdeType\_TemperatureStrength": "Int",
 "TemperatureStrength": 0,
 "\_gdeType\_TemperatureHorizontalPass": "Int",
 "TemperatureHorizontalPass": 1,
 "\_gdeType\_TemperatureDownPass": "Int",
 "TemperatureDownPass": 1,
 "\_gdeType\_TemperatureUpPass": "Int",
 "TemperatureUpPass": 1,
 "\_gdeType\_ShowLighting": "Bool",
 "ShowLighting": true,
 "\_gdeType\_SpotlightStrength": "Int",
 "SpotlightStrength": 0,
 "\_gdeType\_SpotlightHorizontalPass": "Int",
 "SpotlightHorizontalPass": 1,
 "\_gdeType\_SpotlightDownPass": "Int",
 "SpotlightDownPass": 1,
 "\_gdeType\_SpotlightUpPass": "Int",
 "SpotlightUpPass": 1,
 "\_gdeType\_AddVFX": "String",
 "AddVFX": "",
 "\_gdeType\_RemoveVFX": "String",
 "RemoveVFX": "",
 "\_gdeType\_InteractVFX": "String",
 "InteractVFX": "",
 "\_gdeType\_IdleVFX": "String",
 "IdleVFX": "",
 "\_gdeType\_SkylightPass": "Int",
 "SkylightPass": 0,
 "\_gdeType\_SkylightMin": "Int",
 "SkylightMin": 11,
 "\_gdeType\_SkylightMax": "Int",
 "SkylightMax": 15,
 "\_gdeSchema": "BlockVisuals"
 },
 "block\_prop\_darkwood\_table": {
 "\_gdeType\_Index": "Int",
 "Index": 133700031,
 "\_gdeIsList\_Tags": 1,
 "\_gdeType\_Tags": "String",
 "Tags": ["table"],
 "\_gdeType\_PhysicsHeatSource": "Int",
 "PhysicsHeatSource": 0,
 "\_gdeType\_PhysicsHeatPass": "Float",
 "PhysicsHeatPass": 0.95,
 "\_gdeType\_TooltipID": "String",
 "TooltipID": "tooltip\_block\_prop\_darkwood\_table",
 "\_gdeIsList\_Visuals": 1,
 "\_gdeType\_Visuals": "String",
 "Visuals": ["visuals\_block\_prop\_darkwood\_table"],
 "\_gdeType\_TriggerFaction": "Int",
 "TriggerFaction": 0,
 "\_gdeType\_Triggers": "Int",
 "Triggers": 0,
 "\_gdeType\_TriggerActions": "Int",
 "TriggerActions": 0,
 "\_gdeIsList\_TriggerStatuses": 1,
 "\_gdeType\_TriggerStatuses": "String",
 "TriggerStatuses": [],
 "\_gdeIsList\_TriggerAttacks": 1,
 "\_gdeType\_TriggerAttacks": "String",
 "TriggerAttacks": [],
 "\_gdeType\_TriggerSFX": "String",
 "TriggerSFX": "",
 "\_gdeType\_CanSupportWeight": "Bool",
 "CanSupportWeight": false,
 "\_gdeType\_CanHavePlants": "Bool",
 "CanHavePlants": true,
 "\_gdeType\_IsFertile": "Bool",
 "IsFertile": false,
 "\_gdeType\_CanHaveFish": "Bool",
 "CanHaveFish": false,
 "\_gdeType\_SoilQuality": "Int",
 "SoilQuality": 0,
 "\_gdeType\_PhysicsTypes": "Int",
 "PhysicsTypes": 1026,
 "\_gdeType\_PhysicHeatSinkTemp": "Int",
 "PhysicHeatSinkTemp": 0,
 "\_gdeType\_FXPhysicsTypes": "Int",
 "FXPhysicsTypes": 0,
 "\_gdeIsList\_PhysicsUnstableFX": 1,
 "\_gdeType\_PhysicsUnstableFX": "String",
 "PhysicsUnstableFX": [],
 "\_gdeIsList\_PhysicsFillFX": 1,
 "\_gdeType\_PhysicsFillFX": "String",
 "PhysicsFillFX": [],
 "\_gdeType\_PhysicsClearBlock": "Int",
 "PhysicsClearBlock": 0,
 "\_gdeType\_PhysicsSolidBlock": "Int",
 "PhysicsSolidBlock": -1,
 "\_gdeType\_PhysicsLiquidBlock": "Int",
 "PhysicsLiquidBlock": -1,
 "\_gdeType\_PhysicsGasBlock": "Int",
 "PhysicsGasBlock": -1,
 "\_gdeType\_MinTemperature": "Int",
 "MinTemperature": -100,
 "\_gdeType\_MaxTemperature": "Int",
 "MaxTemperature": 100,
 "\_gdeType\_Toughness": "Int",
 "Toughness": 0,
 "\_gdeType\_MaxItemCount": "Int",
 "MaxItemCount": 0,
 "\_gdeType\_CanShowItems": "Bool",
 "CanShowItems": false,
 "\_gdeType\_RestrictItemsToSameKey": "Bool",
 "RestrictItemsToSameKey": false,
 "\_gdeType\_Permissions": "Int",
 "Permissions": 2112,
 "\_gdeType\_AddSFX": "String",
 "AddSFX": "",
 "\_gdeType\_RemoveSFX": "String",
 "RemoveSFX": "",
 "\_gdeType\_InteractSFX": "String",
 "InteractSFX": "sfx\_hammer\_wood",
 "\_gdeType\_FlammableChance": "Int",
 "FlammableChance": 500,
 "\_gdeType\_DecayBuff": "Int",
 "DecayBuff": 0,
 "\_gdeType\_Level": "Int",
 "Level": 1,
 "\_gdeType\_RemoveItemDrops": "String",
 "RemoveItemDrops": "isg\_prop\_darkwood\_table",
 "\_gdeType\_VerticalMovementMod": "Float",
 "VerticalMovementMod": 0.25,
 "\_gdeType\_HorizontalMovementMod": "Float",
 "HorizontalMovementMod": 1,
 "\_gdeType\_CanBeLocked": "Bool",
 "CanBeLocked": false,
 "\_gdeType\_LockedMovementFlags": "Int",
 "LockedMovementFlags": 0,
 "\_gdeType\_RestrictedMovementFlags": "Int",
 "RestrictedMovementFlags": 0,
 "\_gdeType\_MovementCost": "Float",
 "MovementCost": 2,
 "\_gdeType\_VerticalMoveRequiresClimb": "Bool",
 "VerticalMoveRequiresClimb": true,
 "\_gdeType\_ForceFocusDirection": "Bool",
 "ForceFocusDirection": false,
 "\_gdeType\_IsObstruction": "Bool",
 "IsObstruction": false,
 "\_gdeType\_IsVerticalAccess": "Bool",
 "IsVerticalAccess": false,
 "\_gdeSchema": "Blocks"
 }
}

```

**ORMP** also utilizes a **mod.ormpmeta** file which allows mod developers to provide handy information for those wishing to install or work with their mods. We’ll go into more detail on this file in the **Best Practices** section.

# Repackaging

To properly repackage your **gde\_data\_mod\_unminy.json** for the game to read we’ll need to reverse the steps we took during the setup.

1. First you should still have a **gde\_data\_mod.txt** in addition to your **gde\_data\_mod\_unminy.json** file. Rename **gde\_data\_mod.txt** to **gde\_data\_mod\_V0.txt**. This V0 file will serve as our backup that we can restore back to the base unedited game files if something goes wrong.
2. Next upload **gde\_data\_mod\_unminy.json** or your JSON mod file to this online Minifier tool.
3. Run the tool and download the resulting file.
4. Rename the downloaded file, changing its name and file extension to **gde\_data\_mod.txt**.
5. Drag this file into the StreamingAssets folder.

After completing these steps your game is ready to run! Play the game as you normally would and you should be able to see your changes take effect.

# Terrain Atlas Art: Overview

To get started with art in *Odd Realm* you’ll want to have a pixel art editor handy that you can open the **tx\_terrain\_atlas\_mod.png** file in. This is important as it will allow you to properly view, edit, and add art to the sprite sheet. Without a pixel art editor the file will lack the fidelity needed to make proper edits.

## What is a Tileset?

A tileset is a grid of pixel art assets that games reference for use in their graphical presentation of game elements. For *Odd Realm* the **tx\_terrain\_atlas\_mod.png** is a sprite sheet file that contains the editable tileset that organizes many of the in-game art assets. The game reads this file to generate the on screen graphics.

## Understanding the Terrain Atlas Tilesheet

The **tx\_terrain\_atlas\_mod.png** sprite sheet can be intimidating at first glance. The following sections should help you to break it down and understand each portion of the sheet and how it relates to the game.

### General Size

All art in the sprite sheet is organized on an 8 x 8 pixel grid. No texture one the **tx\_terrain\_atlas\_mod.png** will be larger than 8 x 8 pixel, though some may be smaller (still fitting within.

### Tiling

“Tiling” is a term for game objects that “tile” or interlock with one another. From grass and stone blocks to objects like tables, there are a variety of elements in the game, and many pixel based games for that matter, that tile.

Below we can see an example of how the sprite sheet (**tx\_terrain\_atlas\_mod.png**) stores the “wood\_table” prop (increased here by 4x for visibility).

Now this long chocolate bar is clearly not one single table, but then what is it? Well in the game, the table object is able to connect to other adjacent tables to make larger *connected* tables.

We can break this into 8 x 8 pixel squares to see each individual texture the game uses to make these connected tables like so:

Table “1” is our individual table:

A 1 x 2 table uses textures in this pattern:

*In these images we can see the table appears to be a different color. This is because they are screenshots from in-game rather than from the sheet like the previous images. This is likely due to how the shader draws the art and is affected by environmental factors.*

# Testing

Testing your mods is obviously a very important step for any modder to ensure fidelity and functionality of their mods. The two main tools for testing created mods are console commands and the player.log file.

A list of all the available commands can be found HERE and HERE.

## Player.log

The player.log file is an error log file generated by the game at runtime that can help modders figure out why the game isn’t loading or otherwise running their mod as expected. The file can be found in:

Location on Windows: C:\users\you\appdata\locallow\Unknown Origin Games\OddRealm

Location on Mac: ~/Library/Application Support/Unknown Origin Games/OddRealm

Location on Linux: ~/.config/unity3d/Unknown Origin Games/OddRealm