Barony
Not enough ratings
Official JSON Modding Guide V3.3.4+
By WALL OF JUSTICE
Guide for the new JSON formatted data files in Barony V3.3.4+. Create monster variants and customize the gameplay experience with easily modifiable text files!
   
Award
Favorite
Favorited
Unfavorite
New Level Generation Modding Tools!
Welcome! This tutorial will cover the new random generation modding tools using JSON-formatted file structures.

Using JSON files for modding enables you to spice up random generation using only text files and seeing the results in-game as soon as you hit 'save' in your text editor. A step-up compared to some of our earlier tooling!

An accompanying Workshop Mod "The Mines" Tweaks has also been created for this guide to experience and learn about our new JSON modding, follow the link to see some advanced samples in action - https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2117902771

For an explanation/help with JSON-formatted file syntax there are many helpful online websites to read up on, as well as tools to test your text is formatted correctly such as https://jsoneditoronline.org/

For now we'll dig straight into Barony modding from here on with the assumption that you get the basic gist of JSON (note it's not hard either!).

===============================================================

New data files in use
Once Barony v3.3.4 is launched for the first time, inside the Steam Directory installation folder you'll see a new "/data/" folder - this is where we will be spending our time in this tutorial.

v3.3.4 supports these new files in the data folder:
  • "/data/monstercurve.json" - informs the game which monsters to spawn on which level set, no need to rely on Barony's pre-set monster generation.
    • For example, inside you can specify a Goatman to spawn in you new tileset, and then that Goatman could have 10 variants to choose from with unique equipment and stat loadouts that you hand-craft.

  • "/data/gameplaymodifiers.json" - informs some general gameplay-specific options, like global XP/gold modifiers, player max speed, XP share range, as well as some miscellaneous map-wide generation options that didn't necessitate a unique .json file yet.
    • Lots of fun to play around with!

  • A folder named " /data/custom-monsters/" for placing custom monster .json files inside.
    • The "/data/monstercurve.json" file will use filenames inside "/data/custom-monsters/" to reference such as "goatman_sword.json", "goatman_magic.json" etc
    • This can fit however many monster variants you wish!

Barony V3.3.4 also ships with console commands to export some blank templates as starting points, as well as some sample JSON files and monsters used in the Workshop mod that you can rename/copy. We'll be making our own from console commands in this tutorial.


Customizing Monster Curves - monstercurve.json Part 1
To start let's look at the file contents inside the pre-made file "data/monstercurve_sample.json". A full file snippet can be found at the bottom of this section.

Copy "monstercurve_sample.json" and rename it to "monstercurve.json" so Barony recognises the game file. Alternatively, you can generate a fresh template using the console command:
  • /jsonexportmonstercurve



monstercurve.json File Contents
{ "version": 1, "levels": { "The Mines": { "fixed_monsters": [ { "name": "rat", "variants": { "default": 1 } }, ... ... "random_generation_monsters": [ { "name": "rat", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, ...

At the top of each .json file is a "version" key, for now this will always be 1 but any future updates may require a new version number.

Inside the "levels" object is where each of the monster generation "curves" live. You can pick and choose which levels to edit - only the map names specified in the "levels" object are modded, so the Labyrinth, Ruins etc tilesets are not modified with this file.

Within "The Mines" are 2 monster generation parts, "fixed_monsters":[] and "random_generation_monsters":[]

"fixed_monsters":[]
  • Fixed monsters are specific editor monster spawns within the dungeons pre-made rooms. Think of the Spider cage within the mines tileset or the Goblin-infested shop within the Swamp. The snippet above modifies what properties a Rat can spawn with.

  • The "variants": {} property determines what stats/inventory loadouts to use. To add Rat variants, create monster .json files within the data/custom-monsters folder and add them to the "variants" property.
    • The number next to each variant entry represents the weighted chance to replace each Rat on the map.
    • Adding all the weighted chances together gives the total number of possible selections.
    • The weighted chance is how relatively often each entry will be chosen. If the numbers are all the same, each entry has the same % chance to be picked.

For example, if we change the variants to the below snippet:
"variants": { "default": 10, "rat_custom_strong": 10, "rat_custom_fast": 5 }
  • The "default" variant has a 10 out of 25 (40%) chance to be picked, "rat_custom_strong" has a 10 out of 25 (40%) chance to be picked, and "rat_custom_fast" has a 5 out of 25 (20%) chance to be picked.
  • Using "default" as the variant name will use the default in-game Rat loadout.
We now need to create custom Rat loadouts for the files "data/custom-monsters/rat_custom_strong.json" and "data/custom-monsters/rat_custom_fast.json"

===============================================================

Next Section - "random_generation_monsters"

We're out of text space for this section, so let's move on to the next section to cover the random generation properties!

===============================================================

Full monstercurve_sample.json file snippet

{ "version": 1, "levels": { "The Mines": { "fixed_monsters": [ { "name": "rat", "variants": { "default": 1 } }, { "name": "skeleton", "variants": { "default": 1 } }, { "name": "spider", "variants": { "default": 1 } }, { "name": "troll", "variants": { "default": 1 } } ], "random_generation_monsters": [ { "name": "rat", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "spider", "weighted_chance": 1, "dungeon_depth_minimum": 2, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "troll", "weighted_chance": 1, "dungeon_depth_minimum": 2, "dungeon_depth_maximum": 99, "variants": { "default": 1 } } ] }, "The Swamp": { "random_generation_monsters": [ { "name": "spider", "weighted_chance": 2, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "goblin", "weighted_chance": 3, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "slime", "weighted_chance": 3, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "ghoul", "weighted_chance": 2, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } } ] }, "My level": { "random_generation_monsters": [ { "name": "demon", "weighted_chance": 1, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } } ] } } }
Customizing Monster Curves - monstercurve.json Part 2
"random_generation_monsters":[]
Random generation monsters are randomly spread out in the world whenever maps like the Mines are generated.

The Mines are typically home to Rats, Skeletons, Spiders and Trolls - using this property allows us to add or remove monsters types spawning in the world as we wish!

If you created a new tileset you would add "random_generation_monsters" properties to pick the monsters you wanted to see in the world. Previously you had to pick a pre-existing set of monsters.

Let's take a look at the below snippet, the properties are similar to "fixed_monsters"

"random_generation_monsters": [ { "name": "rat", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, ...

  • On map generation, a random monster is selected from the "random_generation_monsters" property.

  • We specify the "name" of the monster and it's "weighted_chance". In this snippet the Rat and Skeleton both have a weighted chance of 4 - so if we only had these 2 monsters each one would be picked 50% of the time, 4 chances out of a total of 8.

  • "dungeon_depth_minimum" and "dungeon_depth_maximum" can be used to block monsters spawning if the dungeon floor is outside the range.
    • Maybe you don't want to see Rats past level 1 of The Mines, set the "dungeon_depth_maximum" to 1 to make sure floors 2,3,4 have no randomly generated rats.

  • "variants" can also be set the same as the "fixed_monsters" in the previous section.

Before moving on, lets add the following variant details for Skeleton and Rats and hit save on our monstercurve.json
"random_generation_monsters": [ { "name": "rat", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 10, "rat_custom_strong": 10, "rat_custom_fast": 5 } }, { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 5, "super_strong_skeleton": 5 } }, ...

===============================================================

Advanced Notes

A monster can appear more than once in this "random_generation_monsters" list!

An interesting use for variants and dungeon depth properties:
"random_generation_monsters": [ { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 2, "variants": { "default": 1 } }, { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 3, "dungeon_depth_maximum": 4, "variants": { "super_strong_skeleton": 1 } }, ...

At dungeon level 1 or 2 only default skeletons appear - whereas levels 3 and 4 will spawn your custom super strong skeleton!

How Weighted Chance changes if monsters do not fit into the dungeon depth properties

In the below snippet, Spiders and Trolls do not spawn on level 1. Their "weighted_chance" is ignored for the total calculation, so the resulting probability becomes:
  • The Mines dungeon level 1:
    • Rat 4 out of 8 (50%)
    • Skeleton 4 out of 8 (50%)
  • The Mines dungeon level 2,3,4:
    • Rat 4 out of 10 (40%)
    • Skeleton 4 out of 10 (40%)
    • Spider 1 out of 10 (10%)
    • Troll 1 out of 10 (10%)

"random_generation_monsters": [ { "name": "rat", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "skeleton", "weighted_chance": 4, "dungeon_depth_minimum": 0, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "spider", "weighted_chance": 1, "dungeon_depth_minimum": 2, "dungeon_depth_maximum": 99, "variants": { "default": 1 } }, { "name": "troll", "weighted_chance": 1, "dungeon_depth_minimum": 2, "dungeon_depth_maximum": 99, "variants": { "default": 1 } } ]
Monster Loadouts - Basics
In this section we'll cover creating monster .json files to refer to in your custom Monster Curve.

In the previous sections we talked about adding "rat_custom_strong.json", "rat_custom_fast.json" and "super_strong_skeleton.json" - so let's make those here!

===============================================================

Generating Default Monster JSON files
You'll want to start with a basic monster template for our Rat and Skeleton - we can get Barony to generate the layouts for these files for us.

Launch Barony and run the console commands once loaded into the start map:
  • /jsonexportmonster rat
  • /jsonexportmonster rat
  • /jsonexportmonster skeleton



This generates the following files inside your Barony/data/custom-monsters/ folder:
  • monster_rat_export0.json
  • monster_rat_export1.json
  • monster_skeleton_export0.json



Rename these files to "rat_custom_strong.json", "rat_custom_fast.json" and "super_strong_skeleton.json". The console command gives you the default stats, proficiencies and some default parameters. The number at the end of the filename is automatically changed to not overwrite any existing files.



Note that exporting a monster in this way does not provide any equipment or inventory items!

===============================================================

Alternative Generation for Monster JSON files
We can also use the following console command while looking directly at a monster in the world:
  • /jsonexportfromcursor



This will generate JSON file displaying everything the monster is wearing and it's inventory items.

===============================================================

Monster JSON file structure

Once exported, most monster properties do not need to be removed. The only areas where you need to add data is "equipped_items", "inventory_items" and "followers".

Now if we open "rat_custom_strong.json" we should see the below snippet (some parts omitted):
{ "version": 1, "stats": { "name": "", "type": "rat", "sex": 0, "appearance": 32164, "HP": 30, "MAXHP": 30, "MP": 10, "MAXMP": 10, "STR": 0, "DEX": 2, "CON": 1, "INT": -2, "PER": 0, "CHR": -1, "EXP": 0, "LVL": 1, "GOLD": 0 }, "misc_stats": { "RANDOM_STR": 0, "RANDOM_DEX": 0, ... "RANDOM_LVL": 0, "RANDOM_GOLD": 0 }, "proficiencies": { "Tinkering": 0, "Stealth": 0, "Trading": 0, "Appraise": 0, "Swimming": 0, "Leader": 0, ... }, "equipped_items": {}, "inventory_items": [], "properties": { ... }, "followers": { "num_followers": 0, "follower_variants": {} }

===============================================================

Editing Basic Monster Stats

Let's make our "rat_custom_strong" stronger than a normal Rat! We can modify any of the stats however we like, some basic examples:
  • To increase ATK damage by +5, set "STR" to 5
  • To increase the level (and XP awarded on kill) modify "LVL" to 7
  • To give the STR stat a random added range, edit the "RANDOM_STR" to 3. This will give the Rat STR randomly from 5 to 8.
  • To give the Rat a custom name, change the "name" value from "" to "strong rat"
  • To give the Rat more HP, modify "HP" and "MAXHP" to 50.
  • To drop 10-50 gold on kill, set "GOLD" to 10 and "RANDOM_GOLD" to 40.
Our changes will look like:
{ "version": 1, "stats": { "name": "strong rat", "type": "rat", "sex": 0, "appearance": 32164, "HP": 50, "MAXHP": 50, "MP": 10, "MAXMP": 10, "STR": 5, "DEX": 2, "CON": 1, "INT": -2, "PER": 0, "CHR": -1, "EXP": 0, "LVL": 7, "GOLD": 10 }, "misc_stats": { "RANDOM_STR": 3, "RANDOM_DEX": 0, "RANDOM_CON": 0, "RANDOM_INT": 0, "RANDOM_PER": 0, "RANDOM_CHR": 0, "RANDOM_MAXHP": 0, "RANDOM_HP": 0, "RANDOM_MAXMP": 0, "RANDOM_MP": 0, "RANDOM_LVL": 0, "RANDOM_GOLD": 40 },

For the other "rat_custom_fast.json" file, we can increase the "DEX" by 10 to increase the movement speed of the monster, and change the "name" to "fast rat":
{ "version": 1, "stats": { "name": "fast rat", "type": "rat", "sex": 0, "appearance": 28277, "HP": 30, "MAXHP": 30, "MP": 10, "MAXMP": 10, "STR": 0, "DEX": 12, "CON": 1, "INT": -2, "PER": 0, "CHR": -1, "EXP": 0, "LVL": 1, "GOLD": 0 }, ...

Make sure to save both Rat JSON files before moving on.

Next we will cover monster items for the Skeleton!
Monster Loadouts - Equipment Items
As the rat is a simple monster without equipment, we only needed to modify it's base stats in the basics section.

In this section, we'll cover modifying our super_strong_skeleton.json with equipment and inventory items!

To start, open our super_strong_skeleton.json file and set the monster's "name" to "super strong skeleton" and give it 10 STR:
{ "version": 1, "stats": { "name": "super strong skeleton", "type": "skeleton", "sex": 1, "appearance": 8658, "HP": 40, "MAXHP": 40, "MP": 30, "MAXMP": 30, "STR": 10, "DEX": -1, "CON": 1, "INT": -1, "PER": 2, "CHR": -3, "EXP": 0, "LVL": 2, "GOLD": 0 }, ... }

Small note - the "appearance" tag is used only for human monster skin color, it does not matter for other creatures and will be a random number. If your appearance is different - that's OK.

===============================================================

Generating Item Objects

To start, we're going to be adding in item JSON objects inside the "equipped_items":{} and "inventory_items":[].

An example item JSON object looks like:
{ "type": "steel_sword", "status": "excellent", "beatitude": 1, "count": 1, "appearance": 22338, "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }

You can copy this as a sample, or use the console command /jsonexportfromcursor from earlier sections to export a monster in the world with it's worn equipment.

  • "type": which item to use. The exact item name is the same as displayed in the editor, or can be found from the itemNameStrings variable in our code repository https://github.com/TurningWheel/Barony/blob/master/src/entity_shared.cpp

  • "status": set to "broken", "decrepit", "worn", "serviceable" or "excellent"

  • "beatitude": the items "blessing". Set to 0 for +0 item, otherwise positive and negative numbers work

  • "count": how many of the item. Usually set to 1 except for stacks of potions or throwing items.

  • "appearance": a random number that defines what some items look like such as spellbook color. A number from 0 to 10 is usually all the variants. Set to "random" if you are unsure or if an item does not have variation in appearance.

  • "identified": set to true or false, most monster items in the game are unidentified.

  • "spawn_percent_chance": value from 0 to 100, the percent chance that this item should spawn on the monster.

  • "drop_percent_chance": value from 0 to 100, the percent chance that this item drops on the ground once the monster is killed. Normally all monsters always drop their items.

  • "slot_weighted_chance": Weighted chance if multiple items share the same slot. Advanced - will be covered in a later section.

===============================================================

Adding Equipment

Inside our super_strong_skeleton.json file, we're going to add a Steel Sword into the Weapon slot. We change the generated JSON from
"equipped_items": {},
to
"equipped_items": { "weapon": { "type": "steel_sword", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 } },

Here we've specified the "weapon" equipment slot to contain an "Excellent +2 Steel Sword" with 100% chance.

Let's add an Steel Shield as well, inside "equipped_items" add a comma after the weapon with a "Worn -1 Steel Shield" object with a 50% drop rate:
"equipped_items": { "weapon": { "type": "steel_sword", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, "shield": { "type": "steel_shield", "status": "worn", "beatitude": -1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 50, "slot_weighted_chance": 1 } },

The available equipment slot names to use are below. You do not need to add entries for every slot, in this case we only use the weapon and shield slots.
"weapon": {}, "shield": {}, "helmet": {}, "breastplate": {}, "gloves": {}, "shoes": {}, "cloak": {}, "ring": {}, "amulet": {}, "mask": {}

Next let's load our changes in-game!
Testing Our Changes In-Game
Let's take a break and see our changes so far in-game.

"monstercurve.json" is automatically reloaded every level and will also reload any monster files.

Make sure your custom-monsters directory has our 3 monster files:



Now start the game, enable cheats and give ourselves some levels and equipment with the console command /maxout2 to make sure we dont die!



Now navigating around the Mines at dungeon floor 1 will randomly spawn our custom creatures!



===============================================================

Spawning monsters with Console Commands from JSON
  • Using the normal /summon command, use the JSON file name instead of the monster name - example /summon super_strong_skeleton



===============================================================

What's next?

Now that we've implemented some basic monster curves - let's cover inventory items, followers, and some other properties for the skeleton.

You might also notice the custom skeleton is still spawning helmets - this is normal as we only specified a "weapon" and "shield" equipment slot. This will be covered in the "Advanced Properties" section.
Monster Loadouts - Inventory Items and Weighted Chances
For this section, re-open "super_strong_skeleton.json" and jump to the "inventory_items":[] property.

Adding Inventory Items

The default inventory items is an empty JSON "array", denoted by square brackets:
"inventory_items": [],

We don't have slot names like equipped items, so we add item objects to the JSON array separated by commas:

"inventory_items": [ { "type": "gem_luck", "status": "excellent", "beatitude": 0, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, { "type": "hat_fez", "status": "serviceable", "beatitude": 1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, { "type": "spellbook_lightning", "status": "decrepit", "beatitude": 2, "count": 1, "appearance": 1, "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 } ],

These 3 random items (Fez, Luckstone, Lightning Spellbook) will all drop every time one of our custom skeleton is killed (as well as it's Steel Sword, and 50% Steel Shield). Hit save then resummon a skeleton with /summon super_strong_skeleton and see the 3 items drop on death:



Advanced Inventory Item Placement

We were able to add 3 items to the Skeleton's inventory, but what if we wanted the game to choose a Fez Hat OR Luckstone Gem?

We can do this by placing JSON arrays within arrays - Add another set of [] brackets within "inventory_items": []. The changes look like:

"inventory_items": [ [ { "type": "gem_luck", "status": "excellent", "beatitude": 0, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, { "type": "hat_fez", "status": "serviceable", "beatitude": 1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 } ], { "type": "spellbook_lightning", "status": "decrepit", "beatitude": 2, "count": 1, "appearance": 1, "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 } ],

Now only 2 inventory items will drop, Fez and Spellbook OR Luckstone and Spellbook, 50% chance for either outcome.



Weighted Inventory Item Placement

When you use JSON arrays for item slots, the "slot_weighted_chance" variable can be used to change the odds which item will be picked. If we change the Luckstone to have a weighted chance of 10, with the Fez at 5, the code looks like:

"inventory_items": [ [ { "type": "gem_luck", "status": "excellent", "beatitude": 0, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 10 }, { "type": "hat_fez", "status": "serviceable", "beatitude": 1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 5 } ], { "type": "spellbook_lightning", "status": "decrepit", "beatitude": 2, "count": 1, "appearance": 1, "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 } ],

So now the Fez will spawn 5/15 of the time (33%) and the Luckstone will spawn 10/15 of the time (66%).
Monster Loadouts - Equipment Items With Arrays
As we saw in the previous section, multiple items can share inventory slots.

Weighted Equipment Item Placement

We can also use JSON arrays for equipment to give the super_strong_skeleton.json Skeleton a variety of weapons using a single JSON file.

For example, let's say we want our skeleton to wield a Steel Sword with 60% chance, and a Crystal Mace with 40% chance:

"equipped_items": { "weapon": [ { "type": "steel_sword", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 6 }, { "type": "crystal_mace", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 4 } ], "shield": { "type": "steel_shield", "status": "worn", "beatitude": -1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 50, "slot_weighted_chance": 1 } },

Now resummoning our skeletons produces our 2 different types as expected:



Using Arrays In Item Properties

Another way to easily add randomness to items is to use JSON arrays for the item properties themselves.

The following item properties can be arrays:
  • type
  • status
  • beatitude
  • count
  • appearance

===============================================================

For reference, Barony has weighted chances for item types, but the blessing/status of the items are randomised are non-weighted - each option has an equal possibility of happening.

An example is Skeleton Helmet generation:
  • 50% no helmet
  • 10% Leather Helmet, -1 or +0 blessing, Decrepit
  • 40% Iron Helmet, -1 or +0 blessing, Decrepit

To present this in JSON (You can set "type" to "empty" for no item):
"equipped_items": { "helmet": [ { "type": "empty", "spawn_percent_chance": 100, "slot_weighted_chance": 5 }, { "type": "leather_helm", "status": "decrepit", "beatitude": [-1, 0], "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, { "type": "iron_helm", "status": "decrepit", "beatitude": [-1, 0], "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 6 } ], ...

The loot we get by adding this property shows that the blessing does change randomly from -1 to 0.



===============================================================

Another syntax example if you wanted everything to be evenly random while using only 1 slot (some worn equipment like helmets only drop 1 quantity):
"helmet": { "type": ["empty", "iron_helm", "leather_helm"], "status": ["decrepit", "serviceable", "excellent"], "beatitude": [-1, 0, 1, 2], "count": [1, 2, 3, 4], "appearance": [0, 1, 2], "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, ...
Monster Loadouts - Advanced Properties
"properties": {}

One of the sections within a monster JSON file is the "properties" - here we can set some unique options for our monsters to spice them up. A lot of these are simple true/false flags.

The default monster properties are generated as follows:
"properties": { "monster_name_always_display_as_generic_species": false, "populate_empty_equipped_items_with_default": true, "populate_default_inventory": true, "disable_miniboss_chance": false, "force_player_recruitable": false, "force_player_friendly": false, "force_player_enemy": false, "disable_item_drops": false, "xp_award_percent": 100, "enable_casting_inventory_spellbooks": false, "spellbook_cast_cooldown": 250 },

Properties Reference

  • "monster_name_always_display_as_generic_species":
    • Default false. If a monster is named, the game messages player with the grammar "You hit Funny Bones".
    • If your monster name is a description like "super strong skeleton", setting this to true will use the grammar "You hit the super strong skeleton"

  • "populate_empty_equipped_items_with_default":
    • Default true. If true - not specifying items to go into an equipment slot such as "weapon" or "shield" in the monster JSON will cause Barony to attempt to generate normal items for the monster's equipment slot.
    • E.g A bare-handed skeleton will get an Iron Sword or Iron Spear
    • Set this to false to only use the JSON defined items, and leave empty slots as-is.

  • "populate_default_inventory":
    • Default true. If true, Barony generates normal monster inventory items, such as cheese/meat for Rats, fish for Gnomes etc.
    • Set to false to not generate any default inventory items. Some monsters that use special spells such as Insectoids + Acid Spray spell may still obtain their spell regardless of this setting.

  • "disable_miniboss_chance":
    • Default false. If false, the monster defined in JSON can spawn as a miniboss monster with altered equipment and stats such as Funny Bones.
    • Set to true to disable miniboss chances for this monster spawn.

  • "force_player_recruitable":
    • Default false. If set to true, a player can recruit this monster regardless of race.

  • "force_player_friendly":
    • Default false. If set to true, this monster is friendly but not necessarily recruitable to players regardless of race.

  • "force_player_enemy":
    • Default false. If set to true, this monster is always an enemy to players regardless of race, and will attack on sight.

  • "disable_item_drops":
    • Default false. Set to true to prevent all of the monsters items dropping on death.

  • "xp_award_percent":
    • Default 100. The percentage of normal XP to award when killing this monster. Can be from 0 percent to a really high number.
    • Default XP is around 10-20 XP if player is the same level as the monster.
    • E.g Setting to 10 percent will award 1-2 XP

  • "enable_casting_inventory_spellbooks":
    • Default false. If enabled, a spellbook in the monster's inventory can be used to occasionally cast from instead of attacking with weapons (like the Insectoid's Spray Acid or Incubus Steal Weapon spells).
    • Note this is a rough generic AI behavior that is not guaranteed to be polished for all monsters - animations for non-humanoids may be non-existent.

  • "spellbook_cast_cooldown":
    • Default 250. Only used with "enable_casting_inventory_spellbooks".
    • This value is how many ticks (50 ticks per second) the monster waits before casting from a spellbook instead of normal attacks.
    • Value should not be lower than 50 to 100 otherwise timing can be inconsistent for casting. Can also be as high as desired.

Fixes/Changes For Our Generated Monsters
  • As mentioned earlier - we saw our "super_strong_skeleton.json" spawned in with a Helmet in the beginning of the tutorial despite us not setting anything for that slot. We can force the Skeleton to not spawn normal Helmets with "populate_empty_equipped_items_with_default" set to false.
  • Our "rat_custom_fast.json" and "rat_custom_strong.json" will still drop meat/cheese, setting "populate_default_inventory" to false disables that if desired.
  • Battle messages using our monster's names e.g "You hit super strong skeleton" is incorrect grammar.
    • Set "monster_name_always_display_as_generic_species" to true so the battle messages display ""You hit the super strong skeleton"
  • Algernon or Funny Bones may spawn instead of our monsters at the default 2% chance, set "disable_miniboss_chance" to true to solve this

So for all of our monsters, we can touch up the properties to:
"properties": { "monster_name_always_display_as_generic_species": true, "populate_empty_equipped_items_with_default": false, "populate_default_inventory": false, "disable_miniboss_chance": true, "force_player_recruitable": false, "force_player_friendly": false, "force_player_enemy": false, "disable_item_drops": false, "xp_award_percent": 100, "enable_casting_inventory_spellbooks": false, "spellbook_cast_cooldown": 250 },
Monster Loadouts - Adding Followers
Using the "followers":{} Monster Property

Inside all generated monster JSON, there is the blank follower property:
"followers": { "num_followers": 0, "follower_variants": {} }

  • "num_followers": The quantity of followers to generate (e.g value of 2 will always spawn 2)
  • "follower_variants": {} Uses the same weighted chance variant structure as "monstercurve.json"

    For our super_strong_skeleton.json Skeleton, we can give it some followers with the following:
    "followers": { "num_followers": 2, "follower_variants": { "default": 1, "rat_custom_fast": 2, "rat_custom_strong": 2 } }

    This will generate 2 followers, with the chances:
    • 20% "default" which is the default monster generation of the leader - so a regular Skeleton
    • 40% using our "rat_custom_fast.json" file
    • 40% using our "rat_custom_strong.json" file

    Resummoning your skeleton using the /summon super_strong_skeleton command will result in some random follower configurations!

Monster Loadouts - Shopkeepers
Shopkeepers have 1 additional JSON field that lets us control what types of Shopkeepers to generate. Everything else is the same as other monsters otherwise.

When you export a shopkeeper using the console command /jsonexportmonster shopkeeper you will see the below snippet:
"shopkeeper_properties": { "store_type_chances": { "equipment": 1, "hats": 1, "jewelry": 1, "books": 1, "apothecary": 1, "staffs": 1, "food": 1, "hardware": 1, "hunting": 1, "general": 1 }, "generate_default_shop_items": true, "num_generated_items_min": 10, "num_generated_items_max": 15, "generated_item_blessing_max": 0 }, ...

  • "store_type_chances": The weighted chance for each Shopkeeper store "type". This affects what groups of items you are permitted to sell back to a Shopkeeper. By default all chances are 1, so even chance. You may set these to 0 to eliminate certain shops from the possibilities.

  • "generate_default_shop_items": Default true. If set to false, this Shopkeeper will not auto generate items from a list and only offer items manually placed inside "inventory_items".

  • "num_generated_items_min/max": The minimum/maximum number of items to generate. The default Barony Shopkeepers generate between 10 and 15 items. Does nothing if "generate_default_shop_items" is false.

  • "generated_item_blessing_max": Default 0. Barony adds increasing random blessings to pieces of useful equipment at dungeon levels 18+ and 25+ with a value of 2 and 3 respectively. For non-equipment like food or tools, the status of the item is increased instead if this is > 0. You can set this yourself to a number such as 2 to randomly get +0/+1/+2 items in random generation. Does nothing if "generate_default_shop_items" is false.


Summary:
  • Placing inventory items inside the Shopkeeper JSON will offer those items to sell
  • You can filter out shop types you don't want to see, or set 1 store type as 100%.
  • If you wanted 100% custom shops, create as many JSON files as your want for each store type so you can control what players can sell - or make them all general stores!
  • Inside "monstercurve.json", set your Shopkeeper JSON files in the "fixed_monsters" variants. Example if you wanted 80% default Shopkeepers, 20% for one of 2 special shopkeepers:
"levels": { "The Mines": { "fixed_monsters": [ { "name": "shopkeeper", "variants": { "default": 8, "shopkeeper_with_blessed_stuff": 1, "shopkeeper_with_cursed_stuff": 1 } }, ...
Monster Loadouts - Our Final JSON Results
Just for reference, here is the final result of all the changes covered in the monster section:

rat_custom_strong.json
{ "version": 1, "stats": { "name": "strong rat", "type": "rat", "sex": 0, "appearance": 32164, "HP": 50, "MAXHP": 50, "MP": 10, "MAXMP": 10, "STR": 5, "DEX": 2, "CON": 1, "INT": -2, "PER": 0, "CHR": -1, "EXP": 0, "LVL": 7, "GOLD": 10 }, "misc_stats": { "RANDOM_STR": 3, "RANDOM_DEX": 0, "RANDOM_CON": 0, "RANDOM_INT": 0, "RANDOM_PER": 0, "RANDOM_CHR": 0, "RANDOM_MAXHP": 0, "RANDOM_HP": 0, "RANDOM_MAXMP": 0, "RANDOM_MP": 0, "RANDOM_LVL": 0, "RANDOM_GOLD": 40 }, "proficiencies": { "Tinkering": 0, "Stealth": 0, "Trading": 0, "Appraise": 0, "Swimming": 0, "Leader": 0, "Casting": 0, "Magic": 0, "Ranged": 0, "Sword": 0, "Mace": 0, "Axe": 0, "Polearm": 0, "Shield": 0, "Unarmed": 0, "Alchemy": 0 }, "equipped_items": {}, "inventory_items": [], "properties": { "monster_name_always_display_as_generic_species": true, "populate_empty_equipped_items_with_default": false, "populate_default_inventory": false, "disable_miniboss_chance": true, "force_player_recruitable": false, "force_player_friendly": false, "force_player_enemy": false, "disable_item_drops": false, "xp_award_percent": 100, "enable_casting_inventory_spellbooks": false, "spellbook_cast_cooldown": 250 }, "followers": { "num_followers": 0, "follower_variants": {} } }

rat_custom_fast.json
{ "version": 1, "stats": { "name": "fast rat", "type": "rat", "sex": 0, "appearance": 28277, "HP": 30, "MAXHP": 30, "MP": 10, "MAXMP": 10, "STR": 0, "DEX": 12, "CON": 1, "INT": -2, "PER": 0, "CHR": -1, "EXP": 0, "LVL": 1, "GOLD": 0 }, "misc_stats": { "RANDOM_STR": 0, "RANDOM_DEX": 0, "RANDOM_CON": 0, "RANDOM_INT": 0, "RANDOM_PER": 0, "RANDOM_CHR": 0, "RANDOM_MAXHP": 0, "RANDOM_HP": 0, "RANDOM_MAXMP": 0, "RANDOM_MP": 0, "RANDOM_LVL": 0, "RANDOM_GOLD": 0 }, "proficiencies": { "Tinkering": 0, "Stealth": 0, "Trading": 0, "Appraise": 0, "Swimming": 0, "Leader": 0, "Casting": 0, "Magic": 0, "Ranged": 0, "Sword": 0, "Mace": 0, "Axe": 0, "Polearm": 0, "Shield": 0, "Unarmed": 0, "Alchemy": 0 }, "equipped_items": {}, "inventory_items": [], "properties": { "monster_name_always_display_as_generic_species": true, "populate_empty_equipped_items_with_default": false, "populate_default_inventory": false, "disable_miniboss_chance": true, "force_player_recruitable": false, "force_player_friendly": false, "force_player_enemy": false, "disable_item_drops": false, "xp_award_percent": 100, "enable_casting_inventory_spellbooks": false, "spellbook_cast_cooldown": 250 }, "followers": { "num_followers": 0, "follower_variants": {} } }

super_strong_skeleton.json
{ "version": 1, "stats": { "name": "super strong skeleton", "type": "skeleton", "sex": 1, "appearance": 8658, "HP": 40, "MAXHP": 40, "MP": 30, "MAXMP": 30, "STR": 10, "DEX": -1, "CON": 1, "INT": -1, "PER": 2, "CHR": -3, "EXP": 0, "LVL": 2, "GOLD": 0 }, "misc_stats": { "RANDOM_STR": 0, "RANDOM_DEX": 0, "RANDOM_CON": 0, "RANDOM_INT": 0, "RANDOM_PER": 0, "RANDOM_CHR": 0, "RANDOM_MAXHP": 0, "RANDOM_HP": 0, "RANDOM_MAXMP": 0, "RANDOM_MP": 0, "RANDOM_LVL": 0, "RANDOM_GOLD": 0 }, "proficiencies": { "Tinkering": 0, "Stealth": 0, "Trading": 0, "Appraise": 0, "Swimming": 0, "Leader": 0, "Casting": 0, "Magic": 0, "Ranged": 35, "Sword": 35, "Mace": 50, "Axe": 45, "Polearm": 25, "Shield": 35, "Unarmed": 0, "Alchemy": 0 }, "equipped_items": { "helmet": { "type": ["empty", "iron_helm", "leather_helm"], "status": ["decrepit", "serviceable", "excellent"], "beatitude": [-1, 0, 1, 2], "count": [1, 2, 3, 4], "appearance": [0, 1, 2], "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 1 }, "weapon": [ { "type": "steel_sword", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 6 }, { "type": "crystal_mace", "status": "excellent", "beatitude": 2, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 4 } ], "shield": { "type": "steel_shield", "status": "worn", "beatitude": -1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 50 } }, "inventory_items": [ [ { "type": "gem_luck", "status": "excellent", "beatitude": 0, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 5 }, { "type": "hat_fez", "status": "serviceable", "beatitude": 1, "count": 1, "appearance": "random", "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 100, "slot_weighted_chance": 5 } ], { "type": "spellbook_lightning", "status": "decrepit", "beatitude": 2, "count": 1, "appearance": 1, "identified": false, "spawn_percent_chance": 100, "drop_percent_chance": 0 } ], "properties": { "monster_name_always_display_as_generic_species": true, "populate_empty_equipped_items_with_default": false, "populate_default_inventory": false, "disable_miniboss_chance": true, "force_player_recruitable": false, "force_player_friendly": false, "force_player_enemy": false, "disable_item_drops": false, "xp_award_percent": 100, "enable_casting_inventory_spellbooks": false, "spellbook_cast_cooldown": 250 }, "followers": { "num_followers": 2, "follower_variants": { "default": 1, "rat_custom_fast": 2, "rat_custom_strong": 2 } } }
Gameplay Modifiers Overview - gameplaymodifiers.json
The final new JSON file format we'll cover in this guide is "gameplaymodifiers.json". A bit of a mixed bag, there's some gameplay and leftover map generation that needed a JSON home.

To export a fresh copy from within Barony, run the console command: /jsonexportgameplaymodifiers to get a "gameplaymodifiers_export0.json" inside your Barony/data/ folder. Open it up and let's go over the properties.



Player-based changes:

At the top you'll see:
{ "version": 1, "xp_share_range": 256, "global_xp_award_percent": 100, "global_gold_drop_scale_percent": 100, "player_share_minimap_progress": false, "player_speed_weight_impact_percent": 100, "player_speed_max": 18.0, ...

  • "xp_share_range": Default 256 (16 tiles at 16 units per tile.). The radius that other players and allies share XP from killing monsters. You can modify this to some large number like 10000 to always share XP, or set it to 0 to disable sharing.

  • "global_xp_award_percent":. Default 100%. Monsters can have their own XP awards individually set, or you can use this to modify every XP award on kill with 1 setting. You can set this smaller to reduce player over-levelling in your maps. Warning - applies to monsters as well, so setting this to something like 10000% can yield... interesting results.

  • "global_gold_drop_scale_percent":. Default 100%. Like the above setting, but for gold drops on death. Set to 0 to remove all gold dropping on death.

  • "player_share_minimap_progress": Default false. Enable to share minimap progress with your friends in the dungeon. Players must carry a light source or be in lit areas for other players to fill in the map at your location (Technical limitation - remote map raytracing requires light to process how far into the fog is visible and where walls are. Each local client emits their own light source that other players cannot see.)

  • "player_speed_weight_impact_percent": Default 100%. How much carry weight affects player speed - a value of 0% will always move at max speed for the player's DEX stat. A value of 200% will act as if you're carrying twice as much, and require 2x the STR stat to maintain max speed.

  • "player_speed_max": Default 18.0 units. Ensure this is set to a decimal number. The max speed units a player can travel, given the player's current DEX, weight and STR. Lowering this reduces player maximum speed, but your speed "curve" remains the same. For reference, early level speeds are around 1-5 units, level 10-20 stats is around 5-15 units, and end-game slowly reaching up to 18.0.

Map Based Changes:

At the top are some JSON arrays for dungeon floor numbers and some various settings:

{ ... "minotaur_force_disable_on_floors": { "normal_floors": [], "secret_floors": [] }, "minotaur_force_enable_on_floors": { "normal_floors": [], "secret_floors": [] }, "disable_herx_messages_on_floors": { "normal_floors": [], "secret_floors": [] }, "disable_minimap_on_floors": { "normal_floors": [], "secret_floors": [] }, ...

  • "minotaur_force_disable_on_floors": Disables minotaur spawns on generated floors.
  • "minotaur_force_enable_on_floors": Forces minotaur spawns on generated floors.
  • "disable_herx_messages_on_floors": Disables Herx's pre-level babbling on fixed or generated floors.
  • "disable_minimap_on_floors": Disables the HUD minimap on fixed or generated floors. Navigate with your senses!

To add data into any of these, enter the range of dungeon floors you wish the property to be applied to. Example to disable the minimap on all Mines floors, as well as the Gnomish mines on secret floor 3:
"disable_minimap_on_floors": { "normal_floors": [1,2,3,4], "secret_floors": [3] },

More Map Generation:

Here you can change some random-generation properties for tilesets, such as what traps can spawn and which floors the minotaur/darkness/shopkeepers/npcs spawn on. Add your own tileset names to this list to apply generation rules for them.

In the generated example below, "The Mines" and "The Swamp" reflect how Barony handles these areas in terms of percentages. Similar to above, enter the floor numbers in the JSON array [1,2,3,4]

... "map_generation": { "The Mines": { "trap_generation_types": [ "boulders" ], "minotaur_floors": [ 2, 3 ], "minotaur_floor_percent": 50, "dark_floors": [ 1, 2, 3, 4 ], "dark_floor_percent": 25, "shop_floors": [ 2, 3, 4 ], "shop_floor_percent": 50, "npc_floors": [ 2, 3, 4 ], "npc_spawn_chance": 10 }, "The Swamp": { "trap_generation_types": [ "boulders", "arrows" ], "minotaur_floors": [ 7, 8 ], "minotaur_floor_percent": 50, "dark_floors": [ 6, 7, 8, 9 ], "dark_floor_percent": 25, "shop_floors": [ 6, 7, 8, 9 ], "shop_floor_percent": 50, "npc_floors": [ 6, 7, 8, 9 ], "npc_spawn_chance": 10 } } }

Using each one of these properties override default Barony behaviours. For example, if "trap_generation_types" is left empty, no trap types will spawn.

  • trap_generation_types: What trap types to randomly generate (does not remove traps from pre-built rooms). Available trap strings: "boulders", "arrows", "spikes", "spelltrap_vertical". Make sure to include the quotation marks and commas between entries.

  • "npc_floors": which floors Humans/Automations spawn on. Note these NPC spawns replace a potential hostile monster.

  • "npc_spawn_chance": Default 10%, setting this to 0% eliminates NPCs, 100% will only randomly spawn NPCs (but pre-built rooms with monsters still have monsters inside them).

  • "minotaur_floors": which floor the minotaur can potentially spawn on.

  • "minotaur_floor_percent": the percentage 0-100% the minotaur tries to spawn each level.

  • The Shop/dark floors follow the minotaur property explanation.

Also worth noting - any of the properties in "gameplaymodifiers.json" can be removed to leave it up to the default Barony game to decide.

So if all you want to edit is the Shopkeeper and NPC chances in The Swamp, feel free to delete the other properties, i.e:

{ "version": 1, "map_generation": { "The Swamp": { "shop_floors": [ 6, 7, 8, 9 ], "shop_floor_percent": 50, "npc_floors": [ 6, 7, 8, 9 ], "npc_spawn_chance": 10 } } }
Uploading to the Workshop
Standard practice for uploading to the workshop - create a new folder to upload in your Barony steam install "mods" folder (my folder name is "myjsonmod").

Create the directory "data" and place your preview image next to it:



Inside /data/, place your custom monstercurve.json and gameplaymodifiers.json that you want to upload. You don't need both, you can upload only gameplaymodifiers for game setting tweaks, or only monstercurve if you modified the monster spawns.



Then, if you have any custom monsters to ship, create a custom-monsters folder and add your cool monsters!



Open up Barony -> Workshop -> Upload Workshop Content -> Navigate to /mods/ -> Click on your folder name -> Select Folder To Upload

Wrapping Up / Troubleshooting
That's it for this guide, I hope it's been helpful! If there are any requests/clarifications needed - feel free to reach out to us here or on Discord for real-time help.

If you are having trouble getting things working, some steps to try:
  • Make sure the JSON is formatted correctly in an online-tool such as https://jsoneditoronline.org/
  • For monster JSON, verify you can summon the monster using the JSON filename /summon skeleton_custom for a file named skeleton_custom.json.
  • If the files otherwise aren't behaving how you expected, upload them to Discord and we can help.

15 Comments
AAkAKkakskasKAKK@@!!!!! 6 Jul @ 9:30pm 
Yeah that worked, thanks.
WALL OF JUSTICE  [author] 6 Jul @ 8:57pm 
Been a while but I believe if you name the monster the same as the json file it will inherit the properties, e.g my_shopkeeper.json
AAkAKkakskasKAKK@@!!!!! 6 Jul @ 8:51pm 
Hey, can you tell me if it's possible to force one of these created monsters to spawn in a custom level, instead of using random generation?
I created a custom shopkeeper and want to place him in my level, not have him randomly spawn. Thanks in advance.
WALL OF JUSTICE  [author] 4 Mar, 2024 @ 4:36am 
Hi, the guide mentions the code names for the trap types near the end under trap_generation_types.

You could safely exclude all of them from all the level set names, off the top of my head boulders are always, arrows in swamp/labyrinth/underworld, spikes in ruins/labyrinth, spelltraps in caves and citadel

The map names are derived from the filenames in the maps directory, so mines/swamp/labyrinth/ruins/hell/caves/citadel/underworld
Those are the only generated biomes that generate traps randomly.

Let me know if you need anything else!
czubai 4 Mar, 2024 @ 4:24am 
Hi WOJ, thanks for making this! I know this pretty old, but I'm hoping you can help me with my problem:

How would I go about doing something like removing random boulder traps from all levels?

What I'm missing to do that:
1. Correct names for ALL official levels. The sample only has the first two (mines and swamp).
2. Correct names for ALL traps. Same as above.
Points 1-2 I was able to find in the source code, not 100% certain about them though, would rather have a guarantee.
3. Default traps that are enabled for ALL levels. Just so I know which ones to add besides 'boulders'. A bit trickier to learn from source code.
4. Do I need to include secret levels too? Or are they covered in the base level (tileset?).

It'd be perfect if the sample simply generated the entire thing with all the default settings. Is that attainable somehow? Thanks!
DEATHMARK 28 Sep, 2021 @ 10:37pm 
Can hou make weapon creating guide pls?
Azure Fang 10 Dec, 2020 @ 1:32pm 
Does Barony's implementation of JSON support .patch files rather than wholesale replacing of files?
WALL OF JUSTICE  [author] 15 Jun, 2020 @ 6:17pm 
But - if you are still having trouble, send me the files on discord to look at.
WALL OF JUSTICE  [author] 15 Jun, 2020 @ 6:14pm 
After 36 you need to specify the random generation monsters to make sure more than skeletons show up. It has nothing to do with the dungeon floor, just the map name.
"My Custom Gen Map": {
"random_generation_monsters": [
{
"name": "spider",
"weighted_chance": 2,
"dungeon_depth_minimum": 0,
"dungeon_depth_maximum": 99,
"variants": {
"default": 1
}
},
{
"name": "goblin",
"weighted_chance": 3,
"dungeon_depth_minimum": 0,
"dungeon_depth_maximum": 99,
"variants": {
"default": 1
}
}
]
}
WALL OF JUSTICE  [author] 15 Jun, 2020 @ 6:13pm 
Yes it does, make sure in CTRL+M properties you have the correct map name

E.g to turn humans into whatever:
[code]"Start Map": {
"fixed_monsters": [
{
"name": "human",
"variants": {
"some_monster": 1
}
}
]
}[/code]