aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <you@example.com>2021-04-20 12:40:37 -0400
committerYour Name <you@example.com>2021-04-20 12:40:37 -0400
commitcd57ad6e208728bafcbc8c7d7b85d88603706978 (patch)
tree7cb0fc9511a0e8124e497d53edbe38d646dd8299
parent2cae1aa33f80ce0844fb54a84ce103146a7fe7ad (diff)
downloaddmtool-cd57ad6e208728bafcbc8c7d7b85d88603706978.tar.gz
dmtool-cd57ad6e208728bafcbc8c7d7b85d88603706978.tar.bz2
dmtool-cd57ad6e208728bafcbc8c7d7b85d88603706978.zip
Updated natural armor and skills
-rw-r--r--Makefile10
-rw-r--r--parser/monsters/aboleth.json10
-rw-r--r--parser/monsters/acolyte.json5
-rw-r--r--parser/monsters/adult_black_dragon.json10
-rw-r--r--parser/monsters/adult_blue_dragon.json10
-rw-r--r--parser/monsters/adult_brass_dragon.json10
-rw-r--r--parser/monsters/adult_bronze_dragon.json10
-rw-r--r--parser/monsters/adult_copper_dragon.json10
-rw-r--r--parser/monsters/adult_gold_dragon.json10
-rw-r--r--parser/monsters/adult_green_dragon.json10
-rw-r--r--parser/monsters/adult_red_dragon.json10
-rw-r--r--parser/monsters/adult_silver_dragon.json10
-rw-r--r--parser/monsters/adult_white_dragon.json10
-rw-r--r--parser/monsters/air_elemental.json5
-rw-r--r--parser/monsters/ancient_black_dragon.json10
-rw-r--r--parser/monsters/ancient_blue_dragon.json10
-rw-r--r--parser/monsters/ancient_brass_dragon.json10
-rw-r--r--parser/monsters/ancient_bronze_dragon.json10
-rw-r--r--parser/monsters/ancient_copper_dragon.json10
-rw-r--r--parser/monsters/ancient_gold_dragon.json10
-rw-r--r--parser/monsters/ancient_green_dragon.json10
-rw-r--r--parser/monsters/ancient_red_dragon.json10
-rw-r--r--parser/monsters/ancient_silver_dragon.json10
-rw-r--r--parser/monsters/ancient_white_dragon.json10
-rw-r--r--parser/monsters/androsphinx.json10
-rw-r--r--parser/monsters/animated_armor.json10
-rw-r--r--parser/monsters/ankheg.json10
-rw-r--r--parser/monsters/ape.json5
-rw-r--r--parser/monsters/archmage.json5
-rw-r--r--parser/monsters/assassin.json5
-rw-r--r--parser/monsters/awakened_shrub.json5
-rw-r--r--parser/monsters/awakened_tree.json10
-rw-r--r--parser/monsters/axe_beak.json5
-rw-r--r--parser/monsters/azer.json10
-rw-r--r--parser/monsters/baboon.json5
-rw-r--r--parser/monsters/badger.json5
-rw-r--r--parser/monsters/balor.json10
-rw-r--r--parser/monsters/bandit.json5
-rw-r--r--parser/monsters/bandit_captain.json5
-rw-r--r--parser/monsters/barbed_devil.json10
-rw-r--r--parser/monsters/basilisk.json10
-rw-r--r--parser/monsters/bat.json5
-rw-r--r--parser/monsters/bearded_devil.json10
-rw-r--r--parser/monsters/behir.json10
-rw-r--r--parser/monsters/berserker.json5
-rw-r--r--parser/monsters/black_bear.json10
-rw-r--r--parser/monsters/black_dragon_wyrmling.json10
-rw-r--r--parser/monsters/black_pudding.json5
-rw-r--r--parser/monsters/blink_dog.json5
-rw-r--r--parser/monsters/blood_hawk.json5
-rw-r--r--parser/monsters/blue_dragon_wyrmling.json10
-rw-r--r--parser/monsters/boar.json10
-rw-r--r--parser/monsters/bone_devil.json10
-rw-r--r--parser/monsters/brass_dragon_wyrmling.json10
-rw-r--r--parser/monsters/bronze_dragon_wyrmling.json10
-rw-r--r--parser/monsters/brown_bear.json10
-rw-r--r--parser/monsters/bugbear.json5
-rw-r--r--parser/monsters/bulette.json10
-rw-r--r--parser/monsters/camel.json5
-rw-r--r--parser/monsters/cat.json5
-rw-r--r--parser/monsters/centaur.json5
-rw-r--r--parser/monsters/chain_devil.json10
-rw-r--r--parser/monsters/chimera.json10
-rw-r--r--parser/monsters/chuul.json10
-rw-r--r--parser/monsters/clay_golem.json10
-rw-r--r--parser/monsters/cloaker.json10
-rw-r--r--parser/monsters/cloud_giant.json10
-rw-r--r--parser/monsters/cockatrice.json5
-rw-r--r--parser/monsters/commoner.json5
-rw-r--r--parser/monsters/constrictor_snake.json5
-rw-r--r--parser/monsters/copper_dragon_wyrmling.json10
-rw-r--r--parser/monsters/couatl.json10
-rw-r--r--parser/monsters/crab.json10
-rw-r--r--parser/monsters/crocodile.json10
-rw-r--r--parser/monsters/cult_fanatic.json5
-rw-r--r--parser/monsters/cultist.json5
-rw-r--r--parser/monsters/darkmantle.json5
-rw-r--r--parser/monsters/death_dog.json5
-rw-r--r--parser/monsters/deer.json5
-rw-r--r--parser/monsters/deva.json10
-rw-r--r--parser/monsters/dire_wolf.json10
-rw-r--r--parser/monsters/djinni.json10
-rw-r--r--parser/monsters/doppelganger.json5
-rw-r--r--parser/monsters/draft_horse.json5
-rw-r--r--parser/monsters/dragon_turtle.json10
-rw-r--r--parser/monsters/dretch.json10
-rw-r--r--parser/monsters/drider.json10
-rw-r--r--parser/monsters/druid.json5
-rw-r--r--parser/monsters/dryad.json5
-rw-r--r--parser/monsters/duergar.json5
-rw-r--r--parser/monsters/dust_mephit.json5
-rw-r--r--parser/monsters/eagle.json5
-rw-r--r--parser/monsters/earth_elemental.json10
-rw-r--r--parser/monsters/efreeti.json10
-rw-r--r--parser/monsters/elephant.json10
-rw-r--r--parser/monsters/elf_drow.json5
-rw-r--r--parser/monsters/elk.json5
-rw-r--r--parser/monsters/erinyes.json5
-rw-r--r--parser/monsters/ettercap.json10
-rw-r--r--parser/monsters/ettin.json10
-rw-r--r--parser/monsters/fire_elemental.json5
-rw-r--r--parser/monsters/fire_giant.json5
-rw-r--r--parser/monsters/flesh_golem.json5
-rw-r--r--parser/monsters/flying_snake.json5
-rw-r--r--parser/monsters/flying_sword.json10
-rw-r--r--parser/monsters/frog.json5
-rw-r--r--parser/monsters/frost_giant.json10
-rw-r--r--parser/monsters/gargoyle.json10
-rw-r--r--parser/monsters/gelatinous_cube.json5
-rw-r--r--parser/monsters/ghast.json5
-rw-r--r--parser/monsters/ghost.json5
-rw-r--r--parser/monsters/ghoul.json5
-rw-r--r--parser/monsters/giant_ape.json5
-rw-r--r--parser/monsters/giant_badger.json5
-rw-r--r--parser/monsters/giant_bat.json5
-rw-r--r--parser/monsters/giant_boar.json10
-rw-r--r--parser/monsters/giant_centipede.json10
-rw-r--r--parser/monsters/giant_constrictor_snake.json5
-rw-r--r--parser/monsters/giant_crab.json10
-rw-r--r--parser/monsters/giant_crocodile.json10
-rw-r--r--parser/monsters/giant_eagle.json5
-rw-r--r--parser/monsters/giant_elk.json10
-rw-r--r--parser/monsters/giant_fire_beetle.json10
-rw-r--r--parser/monsters/giant_frog.json5
-rw-r--r--parser/monsters/giant_goat.json10
-rw-r--r--parser/monsters/giant_hyena.json5
-rw-r--r--parser/monsters/giant_lizard.json10
-rw-r--r--parser/monsters/giant_octopus.json5
-rw-r--r--parser/monsters/giant_owl.json5
-rw-r--r--parser/monsters/giant_poisonous_snake.json5
-rw-r--r--parser/monsters/giant_rat.json5
-rw-r--r--parser/monsters/giant_scorpion.json10
-rw-r--r--parser/monsters/giant_sea_horse.json10
-rw-r--r--parser/monsters/giant_shark.json10
-rw-r--r--parser/monsters/giant_spider.json10
-rw-r--r--parser/monsters/giant_toad.json5
-rw-r--r--parser/monsters/giant_vulture.json5
-rw-r--r--parser/monsters/giant_wasp.json5
-rw-r--r--parser/monsters/giant_weasel.json5
-rw-r--r--parser/monsters/giant_wolf_spider.json5
-rw-r--r--parser/monsters/gibbering_mouther.json5
-rw-r--r--parser/monsters/glabrezu.json10
-rw-r--r--parser/monsters/gladiator.json5
-rw-r--r--parser/monsters/gnoll.json5
-rw-r--r--parser/monsters/gnome_deep_svirfneblin.json5
-rw-r--r--parser/monsters/goat.json5
-rw-r--r--parser/monsters/goblin.json5
-rw-r--r--parser/monsters/gold_dragon_wyrmling.json10
-rw-r--r--parser/monsters/gorgon.json10
-rw-r--r--parser/monsters/gray_ooze.json5
-rw-r--r--parser/monsters/green_dragon_wyrmling.json10
-rw-r--r--parser/monsters/green_hag.json10
-rw-r--r--parser/monsters/grick.json10
-rw-r--r--parser/monsters/griffon.json5
-rw-r--r--parser/monsters/grimlock.json5
-rw-r--r--parser/monsters/guard.json5
-rw-r--r--parser/monsters/guardian_naga.json10
-rw-r--r--parser/monsters/gynosphinx.json10
-rw-r--r--parser/monsters/half_red_dragon_veteran.json5
-rw-r--r--parser/monsters/harpy.json5
-rw-r--r--parser/monsters/hawk.json5
-rw-r--r--parser/monsters/hell_hound.json10
-rw-r--r--parser/monsters/hezrou.json10
-rw-r--r--parser/monsters/hill_giant.json10
-rw-r--r--parser/monsters/hippogriff.json5
-rw-r--r--parser/monsters/hobgoblin.json5
-rw-r--r--parser/monsters/homunculus.json10
-rw-r--r--parser/monsters/horned_devil.json10
-rw-r--r--parser/monsters/hunter_shark.json10
-rw-r--r--parser/monsters/hydra.json10
-rw-r--r--parser/monsters/hyena.json5
-rw-r--r--parser/monsters/ice_devil.json10
-rw-r--r--parser/monsters/ice_mephit.json5
-rw-r--r--parser/monsters/imp.json5
-rw-r--r--parser/monsters/invisible_stalker.json5
-rw-r--r--parser/monsters/iron_golem.json10
-rw-r--r--parser/monsters/jackal.json5
-rw-r--r--parser/monsters/killer_whale.json10
-rw-r--r--parser/monsters/knight.json5
-rw-r--r--parser/monsters/kobold.json5
-rw-r--r--parser/monsters/kraken.json10
-rw-r--r--parser/monsters/lamia.json10
-rw-r--r--parser/monsters/lemure.json5
-rw-r--r--parser/monsters/lich.json10
-rw-r--r--parser/monsters/lion.json5
-rw-r--r--parser/monsters/lizard.json5
-rw-r--r--parser/monsters/lizardfolk.json10
-rw-r--r--parser/monsters/mage.json5
-rw-r--r--parser/monsters/magma_mephit.json5
-rw-r--r--parser/monsters/magmin.json10
-rw-r--r--parser/monsters/mammoth.json10
-rw-r--r--parser/monsters/manticore.json10
-rw-r--r--parser/monsters/marilith.json10
-rw-r--r--parser/monsters/mastiff.json5
-rw-r--r--parser/monsters/medusa.json10
-rw-r--r--parser/monsters/merfolk.json5
-rw-r--r--parser/monsters/merrow.json10
-rw-r--r--parser/monsters/mimic.json10
-rw-r--r--parser/monsters/minotaur.json10
-rw-r--r--parser/monsters/minotaur_skeleton.json10
-rw-r--r--parser/monsters/mule.json5
-rw-r--r--parser/monsters/mummy.json10
-rw-r--r--parser/monsters/mummy_lord.json10
-rw-r--r--parser/monsters/nalfeshnee.json10
-rw-r--r--parser/monsters/night_hag.json10
-rw-r--r--parser/monsters/nightmare.json10
-rw-r--r--parser/monsters/noble.json5
-rw-r--r--parser/monsters/ochre_jelly.json5
-rw-r--r--parser/monsters/octopus.json5
-rw-r--r--parser/monsters/ogre.json5
-rw-r--r--parser/monsters/ogre_zombie.json5
-rw-r--r--parser/monsters/oni.json5
-rw-r--r--parser/monsters/orc.json5
-rw-r--r--parser/monsters/otyugh.json10
-rw-r--r--parser/monsters/owl.json5
-rw-r--r--parser/monsters/owlbear.json10
-rw-r--r--parser/monsters/panther.json5
-rw-r--r--parser/monsters/pegasus.json5
-rw-r--r--parser/monsters/phase_spider.json10
-rw-r--r--parser/monsters/pit_fiend.json10
-rw-r--r--parser/monsters/planetar.json10
-rw-r--r--parser/monsters/plesiosaurus.json10
-rw-r--r--parser/monsters/poisonous_snake.json5
-rw-r--r--parser/monsters/polar_bear.json10
-rw-r--r--parser/monsters/pony.json5
-rw-r--r--parser/monsters/priest.json5
-rw-r--r--parser/monsters/pseudodragon.json10
-rw-r--r--parser/monsters/purple_worm.json10
-rw-r--r--parser/monsters/quasit.json5
-rw-r--r--parser/monsters/quipper.json5
-rw-r--r--parser/monsters/rakshasa.json10
-rw-r--r--parser/monsters/rat.json5
-rw-r--r--parser/monsters/raven.json5
-rw-r--r--parser/monsters/red_dragon_wyrmling.json10
-rw-r--r--parser/monsters/reef_shark.json10
-rw-r--r--parser/monsters/remorhaz.json10
-rw-r--r--parser/monsters/rhinoceros.json10
-rw-r--r--parser/monsters/riding_horse.json5
-rw-r--r--parser/monsters/roc.json10
-rw-r--r--parser/monsters/roper.json10
-rw-r--r--parser/monsters/rug_of_smothering.json5
-rw-r--r--parser/monsters/rust_monster.json10
-rw-r--r--parser/monsters/saber_toothed_tiger.json5
-rw-r--r--parser/monsters/sahuagin.json10
-rw-r--r--parser/monsters/salamander.json10
-rw-r--r--parser/monsters/satyr.json5
-rw-r--r--parser/monsters/scorpion.json10
-rw-r--r--parser/monsters/scout.json5
-rw-r--r--parser/monsters/sea_hag.json10
-rw-r--r--parser/monsters/sea_horse.json5
-rw-r--r--parser/monsters/shadow.json5
-rw-r--r--parser/monsters/shambling_mound.json10
-rw-r--r--parser/monsters/shield_guardian.json10
-rw-r--r--parser/monsters/shrieker.json5
-rw-r--r--parser/monsters/silver_dragon_wyrmling.json10
-rw-r--r--parser/monsters/skeleton.json10
-rw-r--r--parser/monsters/solar.json10
-rw-r--r--parser/monsters/specter.json5
-rw-r--r--parser/monsters/spider.json5
-rw-r--r--parser/monsters/spirit_naga.json10
-rw-r--r--parser/monsters/sprite.json5
-rw-r--r--parser/monsters/spy.json5
-rw-r--r--parser/monsters/steam_mephit.json5
-rw-r--r--parser/monsters/stirge.json10
-rw-r--r--parser/monsters/stone_giant.json10
-rw-r--r--parser/monsters/stone_golem.json10
-rw-r--r--parser/monsters/storm_giant.json5
-rw-r--r--parser/monsters/succubusincubus.json10
-rw-r--r--parser/monsters/swarm_of_bats.json5
-rw-r--r--parser/monsters/swarm_of_insects.json10
-rw-r--r--parser/monsters/swarm_of_poisonous_snakes.json5
-rw-r--r--parser/monsters/swarm_of_quippers.json5
-rw-r--r--parser/monsters/swarm_of_rats.json5
-rw-r--r--parser/monsters/swarm_of_ravens.json5
-rw-r--r--parser/monsters/tarrasque.json10
-rw-r--r--parser/monsters/thug.json5
-rw-r--r--parser/monsters/tiger.json5
-rw-r--r--parser/monsters/treant.json10
-rw-r--r--parser/monsters/tribal_warrior.json5
-rw-r--r--parser/monsters/triceratops.json10
-rw-r--r--parser/monsters/troll.json10
-rw-r--r--parser/monsters/tyrannosaurus_rex.json10
-rw-r--r--parser/monsters/unicorn.json5
-rw-r--r--parser/monsters/vampire.json10
-rw-r--r--parser/monsters/vampire_spawn.json10
-rw-r--r--parser/monsters/veteran.json5
-rw-r--r--parser/monsters/violet_fungus.json5
-rw-r--r--parser/monsters/vrock.json10
-rw-r--r--parser/monsters/vulture.json5
-rw-r--r--parser/monsters/warhorse.json5
-rw-r--r--parser/monsters/warhorse_skeleton.json10
-rw-r--r--parser/monsters/water_elemental.json10
-rw-r--r--parser/monsters/weasel.json5
-rw-r--r--parser/monsters/werebear.json10
-rw-r--r--parser/monsters/wereboar.json10
-rw-r--r--parser/monsters/wererat.json5
-rw-r--r--parser/monsters/weretiger.json5
-rw-r--r--parser/monsters/werewolf.json10
-rw-r--r--parser/monsters/white_dragon_wyrmling.json10
-rw-r--r--parser/monsters/wight.json5
-rw-r--r--parser/monsters/will_o_wisp.json5
-rw-r--r--parser/monsters/winter_wolf.json10
-rw-r--r--parser/monsters/wolf.json10
-rw-r--r--parser/monsters/worg.json10
-rw-r--r--parser/monsters/wraith.json5
-rw-r--r--parser/monsters/wyvern.json10
-rw-r--r--parser/monsters/xorn.json10
-rw-r--r--parser/monsters/young_black_dragon.json10
-rw-r--r--parser/monsters/young_blue_dragon.json10
-rw-r--r--parser/monsters/young_brass_dragon.json10
-rw-r--r--parser/monsters/young_bronze_dragon.json10
-rw-r--r--parser/monsters/young_copper_dragon.json10
-rw-r--r--parser/monsters/young_gold_dragon.json10
-rw-r--r--parser/monsters/young_green_dragon.json10
-rw-r--r--parser/monsters/young_red_dragon.json10
-rw-r--r--parser/monsters/young_silver_dragon.json10
-rw-r--r--parser/monsters/young_white_dragon.json10
-rw-r--r--parser/monsters/zombie.json5
-rwxr-xr-xparser/scrapeToJson.py4
-rw-r--r--src/armor.cc6
-rw-r--r--src/creature.cc108
-rw-r--r--src/creature.h26
-rw-r--r--src/dmtool.cc27
-rw-r--r--src/feature.h5
-rw-r--r--src/item.h4
-rw-r--r--src/jsonable.h1
-rw-r--r--src/rules.h137
-rw-r--r--src/spellcasting.cc2
-rw-r--r--src/spellcasting.h7
-rw-r--r--src/weapon.cc5
330 files changed, 1489 insertions, 1303 deletions
diff --git a/Makefile b/Makefile
index ed0e212..8ac1c8c 100644
--- a/Makefile
+++ b/Makefile
@@ -17,16 +17,16 @@ $(EXECUTABLE): $(OBJECTS)
src/armor.o: src/armor.cc src/armor.h src/item.h src/json.hpp src/entry.h \
- src/jsonable.h src/utils.h src/creature.h
+ src/jsonable.h src/utils.h src/creature.h src/rules.h
$(CC) $(CFLAGS) $< -o $@
src/creature.o: src/creature.cc src/creature.h src/json.hpp \
- src/jsonable.h src/utils.h src/dice.h src/rules.h src/feature.h \
+ src/jsonable.h src/utils.h src/rules.h src/dice.h src/feature.h \
src/entry.h src/weapon.h src/item.h src/armor.h
$(CC) $(CFLAGS) $< -o $@
src/dmtool.o: src/dmtool.cc src/creature.h src/json.hpp src/jsonable.h \
- src/utils.h src/settings.h
+ src/utils.h src/rules.h src/settings.h
$(CC) $(CFLAGS) $< -o $@
src/entry.o: src/entry.cc src/entry.h src/json.hpp src/jsonable.h \
@@ -46,14 +46,14 @@ src/settings.o: src/settings.cc src/settings.h
src/spellcasting.o: src/spellcasting.cc src/spellcasting.h src/feature.h \
src/json.hpp src/entry.h src/jsonable.h src/utils.h src/spell.h \
- src/creature.h
+ src/creature.h src/rules.h
$(CC) $(CFLAGS) $< -o $@
src/utils.o: src/utils.cc src/utils.h src/json.hpp src/settings.h
$(CC) $(CFLAGS) $< -o $@
src/weapon.o: src/weapon.cc src/weapon.h src/item.h src/json.hpp \
- src/entry.h src/jsonable.h src/utils.h src/creature.h
+ src/entry.h src/jsonable.h src/utils.h src/creature.h src/rules.h
$(CC) $(CFLAGS) $< -o $@
clean:
diff --git a/parser/monsters/aboleth.json b/parser/monsters/aboleth.json
index 6bf47f7..c040ab8 100644
--- a/parser/monsters/aboleth.json
+++ b/parser/monsters/aboleth.json
@@ -33,12 +33,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/acolyte.json b/parser/monsters/acolyte.json
index 5a6dd56..11a59f6 100644
--- a/parser/monsters/acolyte.json
+++ b/parser/monsters/acolyte.json
@@ -33,7 +33,10 @@
"text": "_Melee Weapon Attack:_ +2 to hit, reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Acolytes are junior members of a clergy, usually answerable to a priest. They perform a variety of functions in a temple and are granted minor spellcasting power by their deities.",
"features": [
{
diff --git a/parser/monsters/adult_black_dragon.json b/parser/monsters/adult_black_dragon.json
index 1d71097..06f1ffc 100644
--- a/parser/monsters/adult_black_dragon.json
+++ b/parser/monsters/adult_black_dragon.json
@@ -40,12 +40,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_blue_dragon.json b/parser/monsters/adult_blue_dragon.json
index 74cd81a..bb83902 100644
--- a/parser/monsters/adult_blue_dragon.json
+++ b/parser/monsters/adult_blue_dragon.json
@@ -40,12 +40,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_brass_dragon.json b/parser/monsters/adult_brass_dragon.json
index 1368bb3..884f18c 100644
--- a/parser/monsters/adult_brass_dragon.json
+++ b/parser/monsters/adult_brass_dragon.json
@@ -42,12 +42,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_bronze_dragon.json b/parser/monsters/adult_bronze_dragon.json
index 12fdbeb..6ec6bc9 100644
--- a/parser/monsters/adult_bronze_dragon.json
+++ b/parser/monsters/adult_bronze_dragon.json
@@ -41,12 +41,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_copper_dragon.json b/parser/monsters/adult_copper_dragon.json
index 6213695..2a41e0f 100644
--- a/parser/monsters/adult_copper_dragon.json
+++ b/parser/monsters/adult_copper_dragon.json
@@ -41,12 +41,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_gold_dragon.json b/parser/monsters/adult_gold_dragon.json
index e6080df..539b1b3 100644
--- a/parser/monsters/adult_gold_dragon.json
+++ b/parser/monsters/adult_gold_dragon.json
@@ -42,12 +42,10 @@
"cha": 24
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_green_dragon.json b/parser/monsters/adult_green_dragon.json
index 58f0355..ef4ab84 100644
--- a/parser/monsters/adult_green_dragon.json
+++ b/parser/monsters/adult_green_dragon.json
@@ -48,12 +48,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_red_dragon.json b/parser/monsters/adult_red_dragon.json
index 27274e5..1fb8887 100644
--- a/parser/monsters/adult_red_dragon.json
+++ b/parser/monsters/adult_red_dragon.json
@@ -40,12 +40,10 @@
"cha": 21
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_silver_dragon.json b/parser/monsters/adult_silver_dragon.json
index a012f36..28ad56d 100644
--- a/parser/monsters/adult_silver_dragon.json
+++ b/parser/monsters/adult_silver_dragon.json
@@ -42,12 +42,10 @@
"cha": 21
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/adult_white_dragon.json b/parser/monsters/adult_white_dragon.json
index b4a506a..1ab2922 100644
--- a/parser/monsters/adult_white_dragon.json
+++ b/parser/monsters/adult_white_dragon.json
@@ -40,12 +40,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/air_elemental.json b/parser/monsters/air_elemental.json
index 0943fff..d9d81c4 100644
--- a/parser/monsters/air_elemental.json
+++ b/parser/monsters/air_elemental.json
@@ -91,7 +91,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_black_dragon.json b/parser/monsters/ancient_black_dragon.json
index 143b699..529af87 100644
--- a/parser/monsters/ancient_black_dragon.json
+++ b/parser/monsters/ancient_black_dragon.json
@@ -40,12 +40,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_blue_dragon.json b/parser/monsters/ancient_blue_dragon.json
index f3d5c17..3d3adb3 100644
--- a/parser/monsters/ancient_blue_dragon.json
+++ b/parser/monsters/ancient_blue_dragon.json
@@ -40,12 +40,10 @@
"cha": 21
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_brass_dragon.json b/parser/monsters/ancient_brass_dragon.json
index b4ce750..724a4eb 100644
--- a/parser/monsters/ancient_brass_dragon.json
+++ b/parser/monsters/ancient_brass_dragon.json
@@ -42,12 +42,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 20
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 20
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_bronze_dragon.json b/parser/monsters/ancient_bronze_dragon.json
index 45a9209..1b3521b 100644
--- a/parser/monsters/ancient_bronze_dragon.json
+++ b/parser/monsters/ancient_bronze_dragon.json
@@ -41,12 +41,10 @@
"cha": 21
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_copper_dragon.json b/parser/monsters/ancient_copper_dragon.json
index 617e07c..5551c53 100644
--- a/parser/monsters/ancient_copper_dragon.json
+++ b/parser/monsters/ancient_copper_dragon.json
@@ -41,12 +41,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 21
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 21
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_gold_dragon.json b/parser/monsters/ancient_gold_dragon.json
index 739f2aa..a997b65 100644
--- a/parser/monsters/ancient_gold_dragon.json
+++ b/parser/monsters/ancient_gold_dragon.json
@@ -42,12 +42,10 @@
"cha": 28
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_green_dragon.json b/parser/monsters/ancient_green_dragon.json
index 1f45c7a..a56a701 100644
--- a/parser/monsters/ancient_green_dragon.json
+++ b/parser/monsters/ancient_green_dragon.json
@@ -48,12 +48,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 21
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 21
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_red_dragon.json b/parser/monsters/ancient_red_dragon.json
index 1b07d9e..8b4bedd 100644
--- a/parser/monsters/ancient_red_dragon.json
+++ b/parser/monsters/ancient_red_dragon.json
@@ -40,12 +40,10 @@
"cha": 23
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_silver_dragon.json b/parser/monsters/ancient_silver_dragon.json
index edc74ba..86da3a5 100644
--- a/parser/monsters/ancient_silver_dragon.json
+++ b/parser/monsters/ancient_silver_dragon.json
@@ -42,12 +42,10 @@
"cha": 23
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 22
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 22
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ancient_white_dragon.json b/parser/monsters/ancient_white_dragon.json
index c5e2671..7773fd9 100644
--- a/parser/monsters/ancient_white_dragon.json
+++ b/parser/monsters/ancient_white_dragon.json
@@ -40,12 +40,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 20
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 20
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/androsphinx.json b/parser/monsters/androsphinx.json
index bf438d9..517ebfb 100644
--- a/parser/monsters/androsphinx.json
+++ b/parser/monsters/androsphinx.json
@@ -67,12 +67,10 @@
"cha": 23
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/animated_armor.json b/parser/monsters/animated_armor.json
index d70001c..189ec3c 100644
--- a/parser/monsters/animated_armor.json
+++ b/parser/monsters/animated_armor.json
@@ -68,12 +68,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ankheg.json b/parser/monsters/ankheg.json
index a6cbfd4..4b48a00 100644
--- a/parser/monsters/ankheg.json
+++ b/parser/monsters/ankheg.json
@@ -27,12 +27,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ape.json b/parser/monsters/ape.json
index 10e37ce..39ded4d 100644
--- a/parser/monsters/ape.json
+++ b/parser/monsters/ape.json
@@ -27,7 +27,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/archmage.json b/parser/monsters/archmage.json
index 3870e88..98c983c 100644
--- a/parser/monsters/archmage.json
+++ b/parser/monsters/archmage.json
@@ -49,7 +49,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +6 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 4 (1d4 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Archmages are powerful (and usually quite old) spellcasters dedicated to the study of the arcane arts. Benevolent ones counsel kings and queens, while evil ones rule as tyrants and pursue lichdom. Those who are neither good nor evil sequester themselves in remote towers to practice their magic without interruption. An archmage typically has one or more apprentice mages, and an archmage's abode has numerous magical wards and guardians to discourage interlopers.",
"features": [
{
diff --git a/parser/monsters/assassin.json b/parser/monsters/assassin.json
index 98bc9b4..7a4115a 100644
--- a/parser/monsters/assassin.json
+++ b/parser/monsters/assassin.json
@@ -53,7 +53,10 @@
"text": "_Ranged Weapon Attack:_ +6 to hit, range 80/320 ft., one target. _Hit:_ 7 (1d8 + 3) piercing damage, and the target must make a DC 15 Constitution saving throw, taking 24 (7d6) poison damage on a failed save, or half as much damage on a successful one."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Trained in the use of poison, assassins are remorseless killers who work for nobles, guildmasters, sovereigns, and anyone else who can afford them.",
"features": [
{
diff --git a/parser/monsters/awakened_shrub.json b/parser/monsters/awakened_shrub.json
index edbc7a7..9849bf8 100644
--- a/parser/monsters/awakened_shrub.json
+++ b/parser/monsters/awakened_shrub.json
@@ -34,7 +34,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/awakened_tree.json b/parser/monsters/awakened_tree.json
index a7f44cb..6f4da28 100644
--- a/parser/monsters/awakened_tree.json
+++ b/parser/monsters/awakened_tree.json
@@ -38,12 +38,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/axe_beak.json b/parser/monsters/axe_beak.json
index 876196b..047f86a 100644
--- a/parser/monsters/axe_beak.json
+++ b/parser/monsters/axe_beak.json
@@ -24,7 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/azer.json b/parser/monsters/azer.json
index 7a34b77..b0d34c6 100644
--- a/parser/monsters/azer.json
+++ b/parser/monsters/azer.json
@@ -51,12 +51,10 @@
"text": "_Melee Weapon Attack:_ +5 to hit, reach 5 ft., one target. _Hit:_ 7 (1d8 + 3) bludgeoning damage, or 8 (1d10 + 3) bludgeoning damage if used with two hands to make a melee attack, plus 3 (1d6) fire damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/baboon.json b/parser/monsters/baboon.json
index 31604ad..ee3fb99 100644
--- a/parser/monsters/baboon.json
+++ b/parser/monsters/baboon.json
@@ -24,7 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/badger.json b/parser/monsters/badger.json
index 197ec17..f0526db 100644
--- a/parser/monsters/badger.json
+++ b/parser/monsters/badger.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/balor.json b/parser/monsters/balor.json
index 5c5bf1d..b5d4dfc 100644
--- a/parser/monsters/balor.json
+++ b/parser/monsters/balor.json
@@ -83,12 +83,10 @@
"text": "_Melee Weapon Attack:_ +14 to hit, reach 30 ft., one target. _Hit:_ 15 (2d6 + 8) slashing damage plus 10 (3d6) fire damage, and the target must succeed on a DC 20 Strength saving throw or be pulled up to 25 feet toward the balor."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bandit.json b/parser/monsters/bandit.json
index 09522a8..2e902d2 100644
--- a/parser/monsters/bandit.json
+++ b/parser/monsters/bandit.json
@@ -40,7 +40,10 @@
"text": "_Ranged Weapon Attack:_ +3 to hit, range 80 ft./320 ft., one target. _Hit:_ 5 (1d8 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Bandits rove in gangs and are sometimes led by thugs, veterans, or spellcasters. Not all bandits are evil. Oppression, drought, disease, or famine can often drive otherwise honest folk to a life of banditry. Pirates are bandits of the high seas. They might be freebooters interested only in treasure and murder, or they might be privateers sanctioned by the crown to attack and plunder an enemy nation's vessels.",
"features": [],
"prof": 2
diff --git a/parser/monsters/bandit_captain.json b/parser/monsters/bandit_captain.json
index 9517970..a0c33f6 100644
--- a/parser/monsters/bandit_captain.json
+++ b/parser/monsters/bandit_captain.json
@@ -47,7 +47,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +5 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 5 (1d4 + 3) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "It takes a strong personality, ruthless cunning, and a silver tongue to keep a gang of bandits in line. The bandit captain has these qualities in spades. In addition to managing a crew of selfish malcontents, the pirate captain is a variation of the bandit captain, with a ship to protect and command. To keep the crew in line, the captain must mete out rewards and punishment on a regular basis. More than treasure, a bandit captain or pirate captain craves infamy. A prisoner who appeals to the captain's vanity or ego is more likely to be treated fairly than a prisoner who does not or claims not to know anything of the captain's colorful reputation.",
"features": [
{
diff --git a/parser/monsters/barbed_devil.json b/parser/monsters/barbed_devil.json
index 047f559..ad30a14 100644
--- a/parser/monsters/barbed_devil.json
+++ b/parser/monsters/barbed_devil.json
@@ -75,12 +75,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/basilisk.json b/parser/monsters/basilisk.json
index 1bda882..90052bd 100644
--- a/parser/monsters/basilisk.json
+++ b/parser/monsters/basilisk.json
@@ -26,12 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bat.json b/parser/monsters/bat.json
index 28b40a3..1eec09b 100644
--- a/parser/monsters/bat.json
+++ b/parser/monsters/bat.json
@@ -26,7 +26,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bearded_devil.json b/parser/monsters/bearded_devil.json
index b3727b6..93eb03c 100644
--- a/parser/monsters/bearded_devil.json
+++ b/parser/monsters/bearded_devil.json
@@ -76,12 +76,10 @@
"text": "_Melee Weapon Attack:_ +5 to hit, reach 10 ft., one target. _Hit:_ 8 (1d10 + 3) slashing damage. If the target is a creature other than an undead or a construct, it must succeed on a DC 12 Constitution saving throw or lose 5 (1d10) hit points at the start of each of its turns due to an infernal wound. Each time the devil hits the wounded target with this attack, the damage dealt by the wound increases by 5 (1d10). Any creature can take an action to stanch the wound with a successful DC 12 Wisdom (Medicine) check. The wound also closes if the target receives magical healing."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/behir.json b/parser/monsters/behir.json
index 44d0ceb..4813f9e 100644
--- a/parser/monsters/behir.json
+++ b/parser/monsters/behir.json
@@ -34,12 +34,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/berserker.json b/parser/monsters/berserker.json
index b53db87..6ce9659 100644
--- a/parser/monsters/berserker.json
+++ b/parser/monsters/berserker.json
@@ -35,7 +35,10 @@
"text": "_Melee Weapon Attack:_ +5 to hit, reach 5 ft., one target. _Hit:_ 9 (1d12 + 3) slashing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Hailing from uncivilized lands, unpredictable berserkers come together in war parties and seek conflict wherever they can find it.",
"features": [
{
diff --git a/parser/monsters/black_bear.json b/parser/monsters/black_bear.json
index 06ba7ab..27aab34 100644
--- a/parser/monsters/black_bear.json
+++ b/parser/monsters/black_bear.json
@@ -26,12 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/black_dragon_wyrmling.json b/parser/monsters/black_dragon_wyrmling.json
index 2476ba4..a47525c 100644
--- a/parser/monsters/black_dragon_wyrmling.json
+++ b/parser/monsters/black_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/black_pudding.json b/parser/monsters/black_pudding.json
index 44e1019..79e297b 100644
--- a/parser/monsters/black_pudding.json
+++ b/parser/monsters/black_pudding.json
@@ -68,7 +68,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/blink_dog.json b/parser/monsters/blink_dog.json
index 1e4ad73..8706f92 100644
--- a/parser/monsters/blink_dog.json
+++ b/parser/monsters/blink_dog.json
@@ -27,7 +27,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A blink dog takes its name from its ability to blink in and out of existence, a talent it uses to aid its attacks and to avoid harm.",
"features": [
{
diff --git a/parser/monsters/blood_hawk.json b/parser/monsters/blood_hawk.json
index be32fe0..4e06d6a 100644
--- a/parser/monsters/blood_hawk.json
+++ b/parser/monsters/blood_hawk.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Taking its name from its crimson feathers and aggressive nature, the blood hawk fearlessly attacks almost any animal, stabbing it with its daggerlike beak. Blood hawks flock together in large numbers, attacking as a pack to take down prey.",
"features": [
{
diff --git a/parser/monsters/blue_dragon_wyrmling.json b/parser/monsters/blue_dragon_wyrmling.json
index cad2dad..3208441 100644
--- a/parser/monsters/blue_dragon_wyrmling.json
+++ b/parser/monsters/blue_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/boar.json b/parser/monsters/boar.json
index 641f4d4..3930328 100644
--- a/parser/monsters/boar.json
+++ b/parser/monsters/boar.json
@@ -24,12 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bone_devil.json b/parser/monsters/bone_devil.json
index a679b65..e4d388b 100644
--- a/parser/monsters/bone_devil.json
+++ b/parser/monsters/bone_devil.json
@@ -73,12 +73,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/brass_dragon_wyrmling.json b/parser/monsters/brass_dragon_wyrmling.json
index fc855a0..79eff13 100644
--- a/parser/monsters/brass_dragon_wyrmling.json
+++ b/parser/monsters/brass_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bronze_dragon_wyrmling.json b/parser/monsters/bronze_dragon_wyrmling.json
index cfad83c..eff6ab6 100644
--- a/parser/monsters/bronze_dragon_wyrmling.json
+++ b/parser/monsters/bronze_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/brown_bear.json b/parser/monsters/brown_bear.json
index 789fe02..75fbaf4 100644
--- a/parser/monsters/brown_bear.json
+++ b/parser/monsters/brown_bear.json
@@ -26,12 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bugbear.json b/parser/monsters/bugbear.json
index a1287f9..4945bdd 100644
--- a/parser/monsters/bugbear.json
+++ b/parser/monsters/bugbear.json
@@ -50,7 +50,10 @@
"text": "_Melee or Ranged Weapon Attack:_ +4 to hit, reach 5 ft. or range 30/120 ft., one target. _Hit:_ 9 (2d6 + 2) piercing damage in melee or 5 (1d6 + 2) piercing damage at range."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/bulette.json b/parser/monsters/bulette.json
index 22ea625..c7509a0 100644
--- a/parser/monsters/bulette.json
+++ b/parser/monsters/bulette.json
@@ -29,12 +29,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/camel.json b/parser/monsters/camel.json
index b79fd05..1af3a54 100644
--- a/parser/monsters/camel.json
+++ b/parser/monsters/camel.json
@@ -24,7 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/cat.json b/parser/monsters/cat.json
index 9e8b480..a2641f8 100644
--- a/parser/monsters/cat.json
+++ b/parser/monsters/cat.json
@@ -27,7 +27,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/centaur.json b/parser/monsters/centaur.json
index 0d4492d..204e54f 100644
--- a/parser/monsters/centaur.json
+++ b/parser/monsters/centaur.json
@@ -39,7 +39,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 150/600 ft., one target. _Hit:_ 6 (1d8 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/chain_devil.json b/parser/monsters/chain_devil.json
index 7785200..e05361d 100644
--- a/parser/monsters/chain_devil.json
+++ b/parser/monsters/chain_devil.json
@@ -70,12 +70,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/chimera.json b/parser/monsters/chimera.json
index 95da74c..3dcbb48 100644
--- a/parser/monsters/chimera.json
+++ b/parser/monsters/chimera.json
@@ -28,12 +28,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/chuul.json b/parser/monsters/chuul.json
index 10a87c8..d63a4a6 100644
--- a/parser/monsters/chuul.json
+++ b/parser/monsters/chuul.json
@@ -38,12 +38,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/clay_golem.json b/parser/monsters/clay_golem.json
index 357c2b2..5bf27ea 100644
--- a/parser/monsters/clay_golem.json
+++ b/parser/monsters/clay_golem.json
@@ -85,12 +85,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/cloaker.json b/parser/monsters/cloaker.json
index fd729ef..a86bdd0 100644
--- a/parser/monsters/cloaker.json
+++ b/parser/monsters/cloaker.json
@@ -28,12 +28,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/cloud_giant.json b/parser/monsters/cloud_giant.json
index c850ed1..5dcabf2 100644
--- a/parser/monsters/cloud_giant.json
+++ b/parser/monsters/cloud_giant.json
@@ -37,12 +37,10 @@
"text": "_Melee Weapon Attack:_ +12 to hit, reach 10 ft., one target. _Hit:_ 21 (3d8 + 8) piercing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/cockatrice.json b/parser/monsters/cockatrice.json
index e31b5e2..5d5fa70 100644
--- a/parser/monsters/cockatrice.json
+++ b/parser/monsters/cockatrice.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/commoner.json b/parser/monsters/commoner.json
index fb1153e..fcdf668 100644
--- a/parser/monsters/commoner.json
+++ b/parser/monsters/commoner.json
@@ -30,7 +30,10 @@
"text": "_Melee Weapon Attack:_ +2 to hit, reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Commoners include peasants, serfs, slaves, servants, pilgrims, merchants, artisans, and hermits.",
"features": [],
"prof": 2
diff --git a/parser/monsters/constrictor_snake.json b/parser/monsters/constrictor_snake.json
index f0c7cb6..ecec3cb 100644
--- a/parser/monsters/constrictor_snake.json
+++ b/parser/monsters/constrictor_snake.json
@@ -26,7 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/copper_dragon_wyrmling.json b/parser/monsters/copper_dragon_wyrmling.json
index 327df9b..1ecf4b7 100644
--- a/parser/monsters/copper_dragon_wyrmling.json
+++ b/parser/monsters/copper_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/couatl.json b/parser/monsters/couatl.json
index 341b5d9..7f641b3 100644
--- a/parser/monsters/couatl.json
+++ b/parser/monsters/couatl.json
@@ -58,12 +58,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/crab.json b/parser/monsters/crab.json
index bf768af..6c5431f 100644
--- a/parser/monsters/crab.json
+++ b/parser/monsters/crab.json
@@ -28,12 +28,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/crocodile.json b/parser/monsters/crocodile.json
index 18fb52d..791bd76 100644
--- a/parser/monsters/crocodile.json
+++ b/parser/monsters/crocodile.json
@@ -26,12 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/cult_fanatic.json b/parser/monsters/cult_fanatic.json
index 427bd03..ed2c117 100644
--- a/parser/monsters/cult_fanatic.json
+++ b/parser/monsters/cult_fanatic.json
@@ -39,7 +39,10 @@
"text": "_Melee or Ranged Weapon Attack:_ +4 to hit, reach 5 ft. or range 20/60 ft., one creature. _Hit:_ 4 (1d4 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Fanatics are often part of a cult's leadership, using their charisma and dogma to influence and prey on those of weak will. Most are interested in personal power above all else.",
"features": [
{
diff --git a/parser/monsters/cultist.json b/parser/monsters/cultist.json
index 51c2aa6..74b2907 100644
--- a/parser/monsters/cultist.json
+++ b/parser/monsters/cultist.json
@@ -38,7 +38,10 @@
"text": "_Melee Weapon Attack:_ +3 to hit, reach 5 ft., one creature. _Hit:_ 4 (1d6 + 1) slashing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Cultists swear allegiance to dark powers such as elemental princes, demon lords, or archdevils. Most conceal their loyalties to avoid being ostracized, imprisoned, or executed for their beliefs. Unlike evil acolytes, cultists often show signs of insanity in their beliefs and practices.",
"features": [
{
diff --git a/parser/monsters/darkmantle.json b/parser/monsters/darkmantle.json
index 0104537..a305a28 100644
--- a/parser/monsters/darkmantle.json
+++ b/parser/monsters/darkmantle.json
@@ -28,7 +28,10 @@
"cha": 0
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/death_dog.json b/parser/monsters/death_dog.json
index ecf8c28..6b62349 100644
--- a/parser/monsters/death_dog.json
+++ b/parser/monsters/death_dog.json
@@ -29,7 +29,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A death dog is an ugly two-headed hound that roams plains, and deserts. Hate burns in a death dog's heart, and a taste for humanoid flesh drives it to attack travelers and explorers. Death dog saliva carries a foul disease that causes a victim's flesh to slowly rot off the bone.",
"features": [
{
diff --git a/parser/monsters/deer.json b/parser/monsters/deer.json
index 7b28446..e02aade 100644
--- a/parser/monsters/deer.json
+++ b/parser/monsters/deer.json
@@ -24,7 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/deva.json b/parser/monsters/deva.json
index d63deed..8da069f 100644
--- a/parser/monsters/deva.json
+++ b/parser/monsters/deva.json
@@ -74,12 +74,10 @@
"text": "_Melee Weapon Attack:_ +8 to hit, reach 5 ft., one target. _Hit:_ 7 (1d6 + 4) bludgeoning damage plus 18 (4d8) radiant damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/dire_wolf.json b/parser/monsters/dire_wolf.json
index 0e6e27d..4360d22 100644
--- a/parser/monsters/dire_wolf.json
+++ b/parser/monsters/dire_wolf.json
@@ -27,12 +27,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/djinni.json b/parser/monsters/djinni.json
index d4abb34..4547771 100644
--- a/parser/monsters/djinni.json
+++ b/parser/monsters/djinni.json
@@ -45,12 +45,10 @@
"text": "_Melee Weapon Attack:_ +9 to hit, reach 5 ft., one target. _Hit:_ 12 (2d6 + 5) slashing damage plus 3 (1d6) lightning or thunder damage (djinni's choice)."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/doppelganger.json b/parser/monsters/doppelganger.json
index 3afeb88..0d8f3aa 100644
--- a/parser/monsters/doppelganger.json
+++ b/parser/monsters/doppelganger.json
@@ -34,7 +34,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/draft_horse.json b/parser/monsters/draft_horse.json
index 5715060..d177e1d 100644
--- a/parser/monsters/draft_horse.json
+++ b/parser/monsters/draft_horse.json
@@ -24,7 +24,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/dragon_turtle.json b/parser/monsters/dragon_turtle.json
index f3bd995..4e52479 100644
--- a/parser/monsters/dragon_turtle.json
+++ b/parser/monsters/dragon_turtle.json
@@ -35,12 +35,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 20
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 20
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/dretch.json b/parser/monsters/dretch.json
index 37a4d41..8670fd6 100644
--- a/parser/monsters/dretch.json
+++ b/parser/monsters/dretch.json
@@ -49,12 +49,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/drider.json b/parser/monsters/drider.json
index 0300cc9..a075db6 100644
--- a/parser/monsters/drider.json
+++ b/parser/monsters/drider.json
@@ -40,12 +40,10 @@
"text": "_Ranged Weapon Attack:_ +6 to hit, range 150/600 ft., one target. _Hit:_ 7 (1d8 + 3) piercing damage plus 4 (1d8) poison damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/druid.json b/parser/monsters/druid.json
index 30ed85a..431177b 100644
--- a/parser/monsters/druid.json
+++ b/parser/monsters/druid.json
@@ -34,7 +34,10 @@
"text": "_Melee Weapon Attack:_ +2 to hit (+4 to hit with shillelagh), reach 5 ft., one target. _Hit:_ 3 (1d6) bludgeoning damage, 4 (1d8) bludgeoning damage if wielded with two hands, or 6 (1d8 + 2) bludgeoning damage with shillelagh."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Druids dwell in forests and other secluded wilderness locations, where they protect the natural world from monsters and the encroachment of civilization. Some are tribal shamans who heal the sick, pray to animal spirits, and provide spiritual guidance.",
"features": [
{
diff --git a/parser/monsters/dryad.json b/parser/monsters/dryad.json
index c2b85b8..c0f718d 100644
--- a/parser/monsters/dryad.json
+++ b/parser/monsters/dryad.json
@@ -35,7 +35,10 @@
"text": "_Melee Weapon Attack:_ +2 to hit (+6 to hit with shillelagh), reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage, or 8 (1d8 + 4) bludgeoning damage with shillelagh."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/duergar.json b/parser/monsters/duergar.json
index 5642d4e..d7f795e 100644
--- a/parser/monsters/duergar.json
+++ b/parser/monsters/duergar.json
@@ -52,7 +52,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +4 to hit, reach 5 ft. or range 30/120 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage, or 9 (2d6 + 2) piercing damage while enlarged."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/dust_mephit.json b/parser/monsters/dust_mephit.json
index 5dc6356..f7762fc 100644
--- a/parser/monsters/dust_mephit.json
+++ b/parser/monsters/dust_mephit.json
@@ -44,7 +44,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/eagle.json b/parser/monsters/eagle.json
index 88e776b..4f44b8e 100644
--- a/parser/monsters/eagle.json
+++ b/parser/monsters/eagle.json
@@ -26,7 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/earth_elemental.json b/parser/monsters/earth_elemental.json
index e2b45ae..4caaabb 100644
--- a/parser/monsters/earth_elemental.json
+++ b/parser/monsters/earth_elemental.json
@@ -77,12 +77,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/efreeti.json b/parser/monsters/efreeti.json
index 93546d5..f003315 100644
--- a/parser/monsters/efreeti.json
+++ b/parser/monsters/efreeti.json
@@ -41,12 +41,10 @@
"text": "_Melee Weapon Attack:_ +10 to hit, reach 5 ft., one target. _Hit:_ 13 (2d6 + 6) slashing damage plus 7 (2d6) fire damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/elephant.json b/parser/monsters/elephant.json
index 7b5f220..8c0da3f 100644
--- a/parser/monsters/elephant.json
+++ b/parser/monsters/elephant.json
@@ -24,12 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/elf_drow.json b/parser/monsters/elf_drow.json
index 7d5061c..30e6f23 100644
--- a/parser/monsters/elf_drow.json
+++ b/parser/monsters/elf_drow.json
@@ -45,7 +45,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 30/120 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage, and the target must succeed on a DC 13 Constitution saving throw or be poisoned for 1 hour. If the saving throw fails by 5 or more, the target is also unconscious while poisoned in this way. The target wakes up if it takes damage or if another creature takes an action to shake it awake."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/elk.json b/parser/monsters/elk.json
index d3a8f86..f8f3b53 100644
--- a/parser/monsters/elk.json
+++ b/parser/monsters/elk.json
@@ -24,7 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/erinyes.json b/parser/monsters/erinyes.json
index cbeb5f6..04c6c6b 100644
--- a/parser/monsters/erinyes.json
+++ b/parser/monsters/erinyes.json
@@ -87,7 +87,10 @@
"text": "_Ranged Weapon Attack:_ +7 to hit, range 150/600 ft., one target. _Hit:_ 7 (1d8 + 3) piercing damage plus 13 (3d8) poison damage, and the target must succeed on a DC 14 Constitution saving throw or be poisoned. The poison lasts until it is removed by the lesser restoration spell or similar magic."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ettercap.json b/parser/monsters/ettercap.json
index 4cc337a..0c208a5 100644
--- a/parser/monsters/ettercap.json
+++ b/parser/monsters/ettercap.json
@@ -30,12 +30,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ettin.json b/parser/monsters/ettin.json
index 8c37497..5c3dbf3 100644
--- a/parser/monsters/ettin.json
+++ b/parser/monsters/ettin.json
@@ -39,12 +39,10 @@
"text": "_Melee Weapon Attack:_ +7 to hit, reach 5 ft., one target. _Hit:_ 14 (2d8 + 5) piercing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/fire_elemental.json b/parser/monsters/fire_elemental.json
index 8feb335..eb64157 100644
--- a/parser/monsters/fire_elemental.json
+++ b/parser/monsters/fire_elemental.json
@@ -87,7 +87,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/fire_giant.json b/parser/monsters/fire_giant.json
index 33983ab..e48b12f 100644
--- a/parser/monsters/fire_giant.json
+++ b/parser/monsters/fire_giant.json
@@ -47,7 +47,10 @@
"text": "_Melee Weapon Attack:_ +11 to hit, reach 10 ft., one target. _Hit:_ 28 (6d6 + 7) slashing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/flesh_golem.json b/parser/monsters/flesh_golem.json
index f56debd..04629c3 100644
--- a/parser/monsters/flesh_golem.json
+++ b/parser/monsters/flesh_golem.json
@@ -81,7 +81,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/flying_snake.json b/parser/monsters/flying_snake.json
index 4e1a618..0b85b5d 100644
--- a/parser/monsters/flying_snake.json
+++ b/parser/monsters/flying_snake.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A flying snake is a brightly colored, winged serpent found in remote jungles. Tribespeople and cultists sometimes domesticate flying snakes to serve as messengers that deliver scrolls wrapped in their coils.",
"features": [
{
diff --git a/parser/monsters/flying_sword.json b/parser/monsters/flying_sword.json
index 96a77a3..621464a 100644
--- a/parser/monsters/flying_sword.json
+++ b/parser/monsters/flying_sword.json
@@ -72,12 +72,10 @@
"text": "_Melee Weapon Attack:_ +3 to hit, reach 5 ft., one target. _Hit:_ 5 (1d8 + 1) slashing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/frog.json b/parser/monsters/frog.json
index 6bcfa6c..ed7edc9 100644
--- a/parser/monsters/frog.json
+++ b/parser/monsters/frog.json
@@ -29,7 +29,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/frost_giant.json b/parser/monsters/frost_giant.json
index cb14525..a15aa6e 100644
--- a/parser/monsters/frost_giant.json
+++ b/parser/monsters/frost_giant.json
@@ -42,12 +42,10 @@
"text": "_Melee Weapon Attack:_ +9 to hit, reach 10 ft., one target. _Hit:_ 25 (3d12 + 6) slashing damage."
}
],
- "natural_armor": [
- {
- "name": "patchwork",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "patchwork",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gargoyle.json b/parser/monsters/gargoyle.json
index fc39f4b..6f27700 100644
--- a/parser/monsters/gargoyle.json
+++ b/parser/monsters/gargoyle.json
@@ -66,12 +66,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gelatinous_cube.json b/parser/monsters/gelatinous_cube.json
index e46d602..0038ce6 100644
--- a/parser/monsters/gelatinous_cube.json
+++ b/parser/monsters/gelatinous_cube.json
@@ -51,7 +51,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ghast.json b/parser/monsters/ghast.json
index cbdeba8..66b730a 100644
--- a/parser/monsters/ghast.json
+++ b/parser/monsters/ghast.json
@@ -49,7 +49,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ghost.json b/parser/monsters/ghost.json
index e711bf6..3818f51 100644
--- a/parser/monsters/ghost.json
+++ b/parser/monsters/ghost.json
@@ -111,7 +111,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ghoul.json b/parser/monsters/ghoul.json
index 8a0898f..1cc4659 100644
--- a/parser/monsters/ghoul.json
+++ b/parser/monsters/ghoul.json
@@ -44,7 +44,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_ape.json b/parser/monsters/giant_ape.json
index 0d3d27f..e90f839 100644
--- a/parser/monsters/giant_ape.json
+++ b/parser/monsters/giant_ape.json
@@ -27,7 +27,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_badger.json b/parser/monsters/giant_badger.json
index 5925865..c5807d7 100644
--- a/parser/monsters/giant_badger.json
+++ b/parser/monsters/giant_badger.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_bat.json b/parser/monsters/giant_bat.json
index 858c9c5..3b6471d 100644
--- a/parser/monsters/giant_bat.json
+++ b/parser/monsters/giant_bat.json
@@ -26,7 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_boar.json b/parser/monsters/giant_boar.json
index 444c0ca..562b956 100644
--- a/parser/monsters/giant_boar.json
+++ b/parser/monsters/giant_boar.json
@@ -24,12 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_centipede.json b/parser/monsters/giant_centipede.json
index ef462ca..ec91644 100644
--- a/parser/monsters/giant_centipede.json
+++ b/parser/monsters/giant_centipede.json
@@ -26,12 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_constrictor_snake.json b/parser/monsters/giant_constrictor_snake.json
index 05ef8ba..79aeb0a 100644
--- a/parser/monsters/giant_constrictor_snake.json
+++ b/parser/monsters/giant_constrictor_snake.json
@@ -28,7 +28,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_crab.json b/parser/monsters/giant_crab.json
index a4d29df..7445b49 100644
--- a/parser/monsters/giant_crab.json
+++ b/parser/monsters/giant_crab.json
@@ -28,12 +28,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_crocodile.json b/parser/monsters/giant_crocodile.json
index cf7673e..3932180 100644
--- a/parser/monsters/giant_crocodile.json
+++ b/parser/monsters/giant_crocodile.json
@@ -26,12 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_eagle.json b/parser/monsters/giant_eagle.json
index 2e238f8..479a6c6 100644
--- a/parser/monsters/giant_eagle.json
+++ b/parser/monsters/giant_eagle.json
@@ -26,7 +26,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A giant eagle is a noble creature that speaks its own language and understands speech in the Common tongue. A mated pair of giant eagles typically has up to four eggs or young in their nest (treat the young as normal eagles).",
"features": [
{
diff --git a/parser/monsters/giant_elk.json b/parser/monsters/giant_elk.json
index 1f98bd9..efb72f4 100644
--- a/parser/monsters/giant_elk.json
+++ b/parser/monsters/giant_elk.json
@@ -26,12 +26,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "The majestic giant elk is rare to the point that its appearance is often taken as a foreshadowing of an important event, such as the birth of a king. Legends tell of gods that take the form of giant elk when visiting the Material Plane. Many cultures therefore believe that to hunt these creatures is to invite divine wrath.",
"features": [
{
diff --git a/parser/monsters/giant_fire_beetle.json b/parser/monsters/giant_fire_beetle.json
index ed2e23b..d081ff2 100644
--- a/parser/monsters/giant_fire_beetle.json
+++ b/parser/monsters/giant_fire_beetle.json
@@ -26,12 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "A giant fire beetle is a nocturnal creature that takes its name from a pair of glowing glands that give off light. Miners and adventurers prize these creatures, for a giant fire beetle's glands continue to shed light for 1d6 days after the beetle dies. Giant fire beetles are most commonly found underground and in dark forests.",
"features": [
{
diff --git a/parser/monsters/giant_frog.json b/parser/monsters/giant_frog.json
index 2e88152..7fe053c 100644
--- a/parser/monsters/giant_frog.json
+++ b/parser/monsters/giant_frog.json
@@ -29,7 +29,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_goat.json b/parser/monsters/giant_goat.json
index e907a77..c134de2 100644
--- a/parser/monsters/giant_goat.json
+++ b/parser/monsters/giant_goat.json
@@ -24,12 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_hyena.json b/parser/monsters/giant_hyena.json
index c2082b1..4ba530f 100644
--- a/parser/monsters/giant_hyena.json
+++ b/parser/monsters/giant_hyena.json
@@ -26,7 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_lizard.json b/parser/monsters/giant_lizard.json
index 6983cb8..18d4cac 100644
--- a/parser/monsters/giant_lizard.json
+++ b/parser/monsters/giant_lizard.json
@@ -26,12 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "A giant lizard can be ridden or used as a draft animal. Lizardfolk also keep them as pets, and subterranean giant lizards are used as mounts and pack animals by drow, duergar, and others.",
"features": [
{
diff --git a/parser/monsters/giant_octopus.json b/parser/monsters/giant_octopus.json
index 9f655b2..deac092 100644
--- a/parser/monsters/giant_octopus.json
+++ b/parser/monsters/giant_octopus.json
@@ -29,7 +29,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_owl.json b/parser/monsters/giant_owl.json
index fc69932..d8328ad 100644
--- a/parser/monsters/giant_owl.json
+++ b/parser/monsters/giant_owl.json
@@ -29,7 +29,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Giant owls often befriend fey and other sylvan creatures and are guardians of their woodland realms.",
"features": [
{
diff --git a/parser/monsters/giant_poisonous_snake.json b/parser/monsters/giant_poisonous_snake.json
index f5c7df6..fad0848 100644
--- a/parser/monsters/giant_poisonous_snake.json
+++ b/parser/monsters/giant_poisonous_snake.json
@@ -28,7 +28,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_rat.json b/parser/monsters/giant_rat.json
index 649dc8a..b3c84cf 100644
--- a/parser/monsters/giant_rat.json
+++ b/parser/monsters/giant_rat.json
@@ -26,7 +26,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_scorpion.json b/parser/monsters/giant_scorpion.json
index 4da2585..95e8f85 100644
--- a/parser/monsters/giant_scorpion.json
+++ b/parser/monsters/giant_scorpion.json
@@ -26,12 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_sea_horse.json b/parser/monsters/giant_sea_horse.json
index cc942aa..6e0860e 100644
--- a/parser/monsters/giant_sea_horse.json
+++ b/parser/monsters/giant_sea_horse.json
@@ -24,12 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "Like their smaller kin, giant sea horses are shy, colorful fish with elongated bodies and curled tails. Aquatic elves train them as mounts.",
"features": [
{
diff --git a/parser/monsters/giant_shark.json b/parser/monsters/giant_shark.json
index d2147f9..3b85368 100644
--- a/parser/monsters/giant_shark.json
+++ b/parser/monsters/giant_shark.json
@@ -28,12 +28,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "A giant shark is 30 feet long and normally found in deep oceans. Utterly fearless, it preys on anything that crosses its path, including whales and ships.",
"features": [
{
diff --git a/parser/monsters/giant_spider.json b/parser/monsters/giant_spider.json
index fbcdd6e..8f65e4b 100644
--- a/parser/monsters/giant_spider.json
+++ b/parser/monsters/giant_spider.json
@@ -29,12 +29,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "To snare its prey, a giant spider spins elaborate webs or shoots sticky strands of webbing from its abdomen. Giant spiders are most commonly found underground, making their lairs on ceilings or in dark, web-filled crevices. Such lairs are often festooned with web cocoons holding past victims.",
"features": [
{
diff --git a/parser/monsters/giant_toad.json b/parser/monsters/giant_toad.json
index 04f1158..d947d38 100644
--- a/parser/monsters/giant_toad.json
+++ b/parser/monsters/giant_toad.json
@@ -26,7 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_vulture.json b/parser/monsters/giant_vulture.json
index 1ad76e7..8f1b853 100644
--- a/parser/monsters/giant_vulture.json
+++ b/parser/monsters/giant_vulture.json
@@ -26,7 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A giant vulture has advanced intelligence and a malevolent bent. Unlike its smaller kin, it will attack a wounded creature to hasten its end. Giant vultures have been known to haunt a thirsty, starving creature for days to enjoy its suffering.",
"features": [
{
diff --git a/parser/monsters/giant_wasp.json b/parser/monsters/giant_wasp.json
index 71083c5..1a93157 100644
--- a/parser/monsters/giant_wasp.json
+++ b/parser/monsters/giant_wasp.json
@@ -24,7 +24,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_weasel.json b/parser/monsters/giant_weasel.json
index ee5acdd..73004a8 100644
--- a/parser/monsters/giant_weasel.json
+++ b/parser/monsters/giant_weasel.json
@@ -29,7 +29,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/giant_wolf_spider.json b/parser/monsters/giant_wolf_spider.json
index 31014ca..66d1d65 100644
--- a/parser/monsters/giant_wolf_spider.json
+++ b/parser/monsters/giant_wolf_spider.json
@@ -30,7 +30,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Smaller than a giant spider, a giant wolf spider hunts prey across open ground or hides in a burrow or crevice, or in a hidden cavity beneath debris.",
"features": [
{
diff --git a/parser/monsters/gibbering_mouther.json b/parser/monsters/gibbering_mouther.json
index 543a72a..199568a 100644
--- a/parser/monsters/gibbering_mouther.json
+++ b/parser/monsters/gibbering_mouther.json
@@ -31,7 +31,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/glabrezu.json b/parser/monsters/glabrezu.json
index 03b0719..f58ece0 100644
--- a/parser/monsters/glabrezu.json
+++ b/parser/monsters/glabrezu.json
@@ -72,12 +72,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gladiator.json b/parser/monsters/gladiator.json
index bff8bd1..e140b28 100644
--- a/parser/monsters/gladiator.json
+++ b/parser/monsters/gladiator.json
@@ -47,7 +47,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +7 to hit, reach 5 ft. and range 20/60 ft., one target. _Hit:_ 11 (2d6 + 4) piercing damage, or 13 (2d8 + 4) piercing damage if used with two hands to make a melee attack."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Gladiators battle for the entertainment of raucous crowds. Some gladiators are brutal pit fighters who treat each match as a life-or-death struggle, while others are professional duelists who command huge fees but rarely fight to the death.",
"features": [
{
diff --git a/parser/monsters/gnoll.json b/parser/monsters/gnoll.json
index af7a559..7341755 100644
--- a/parser/monsters/gnoll.json
+++ b/parser/monsters/gnoll.json
@@ -47,7 +47,10 @@
"text": "_Ranged Weapon Attack:_ +3 to hit, range 150/600 ft., one target. _Hit:_ 5 (1d8 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gnome_deep_svirfneblin.json b/parser/monsters/gnome_deep_svirfneblin.json
index 62d1682..dc3ca93 100644
--- a/parser/monsters/gnome_deep_svirfneblin.json
+++ b/parser/monsters/gnome_deep_svirfneblin.json
@@ -41,7 +41,10 @@
"text": "_Melee Weapon Attack:_ +4 to hit, reach 5 ft., one target. _Hit:_ 6 (1d8 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/goat.json b/parser/monsters/goat.json
index 1543802..570bfae 100644
--- a/parser/monsters/goat.json
+++ b/parser/monsters/goat.json
@@ -24,7 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/goblin.json b/parser/monsters/goblin.json
index bafc92d..7f29ee7 100644
--- a/parser/monsters/goblin.json
+++ b/parser/monsters/goblin.json
@@ -49,7 +49,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 80/320 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gold_dragon_wyrmling.json b/parser/monsters/gold_dragon_wyrmling.json
index 5935c4a..c35ea37 100644
--- a/parser/monsters/gold_dragon_wyrmling.json
+++ b/parser/monsters/gold_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gorgon.json b/parser/monsters/gorgon.json
index 3788926..10ad6df 100644
--- a/parser/monsters/gorgon.json
+++ b/parser/monsters/gorgon.json
@@ -33,12 +33,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gray_ooze.json b/parser/monsters/gray_ooze.json
index d6b1e0b..874f3cd 100644
--- a/parser/monsters/gray_ooze.json
+++ b/parser/monsters/gray_ooze.json
@@ -66,7 +66,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/green_dragon_wyrmling.json b/parser/monsters/green_dragon_wyrmling.json
index 941355b..45e5ee5 100644
--- a/parser/monsters/green_dragon_wyrmling.json
+++ b/parser/monsters/green_dragon_wyrmling.json
@@ -45,12 +45,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/green_hag.json b/parser/monsters/green_hag.json
index 21073b9..4c08fde 100644
--- a/parser/monsters/green_hag.json
+++ b/parser/monsters/green_hag.json
@@ -31,12 +31,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/grick.json b/parser/monsters/grick.json
index cdf2b19..95bf46c 100644
--- a/parser/monsters/grick.json
+++ b/parser/monsters/grick.json
@@ -45,12 +45,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/griffon.json b/parser/monsters/griffon.json
index 90e839d..ab4324e 100644
--- a/parser/monsters/griffon.json
+++ b/parser/monsters/griffon.json
@@ -28,7 +28,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/grimlock.json b/parser/monsters/grimlock.json
index 89073fe..55bfa09 100644
--- a/parser/monsters/grimlock.json
+++ b/parser/monsters/grimlock.json
@@ -35,7 +35,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/guard.json b/parser/monsters/guard.json
index bcfbbc5..c3592a6 100644
--- a/parser/monsters/guard.json
+++ b/parser/monsters/guard.json
@@ -42,7 +42,10 @@
"text": "_Melee_ or _Ranged Weapon Attack:_ +3 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 4 (1d6 + 1) piercing damage, or 5 (1d8 + 1) piercing damage if used with two hands to make a melee attack."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Guards include members of a city watch, sentries in a citadel or fortified town, and the bodyguards of merchants and nobles.",
"features": [],
"prof": 2
diff --git a/parser/monsters/guardian_naga.json b/parser/monsters/guardian_naga.json
index cf8ef15..24624c6 100644
--- a/parser/monsters/guardian_naga.json
+++ b/parser/monsters/guardian_naga.json
@@ -46,12 +46,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/gynosphinx.json b/parser/monsters/gynosphinx.json
index 169bec7..06a6362 100644
--- a/parser/monsters/gynosphinx.json
+++ b/parser/monsters/gynosphinx.json
@@ -64,12 +64,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/half_red_dragon_veteran.json b/parser/monsters/half_red_dragon_veteran.json
index b4c1138..7331b85 100644
--- a/parser/monsters/half_red_dragon_veteran.json
+++ b/parser/monsters/half_red_dragon_veteran.json
@@ -56,7 +56,10 @@
"text": "_Ranged Weapon Attack:_ +3 to hit, range 100/400 ft., one target. _Hit:_ 6 (1d10 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/harpy.json b/parser/monsters/harpy.json
index 974be2b..d115e49 100644
--- a/parser/monsters/harpy.json
+++ b/parser/monsters/harpy.json
@@ -30,7 +30,10 @@
"text": "_Melee Weapon Attack:_ +3 to hit, reach 5 ft., one target. _Hit:_ 3 (1d4 + 1) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hawk.json b/parser/monsters/hawk.json
index 4342a54..272707f 100644
--- a/parser/monsters/hawk.json
+++ b/parser/monsters/hawk.json
@@ -26,7 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hell_hound.json b/parser/monsters/hell_hound.json
index 6ef70aa..383291a 100644
--- a/parser/monsters/hell_hound.json
+++ b/parser/monsters/hell_hound.json
@@ -33,12 +33,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hezrou.json b/parser/monsters/hezrou.json
index 1a6fda9..5f1b736 100644
--- a/parser/monsters/hezrou.json
+++ b/parser/monsters/hezrou.json
@@ -71,12 +71,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hill_giant.json b/parser/monsters/hill_giant.json
index 3f8d453..07bbb52 100644
--- a/parser/monsters/hill_giant.json
+++ b/parser/monsters/hill_giant.json
@@ -32,12 +32,10 @@
"text": "_Melee Weapon Attack:_ +8 to hit, reach 10 ft., one target. _Hit:_ 18 (3d8 + 5) bludgeoning damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hippogriff.json b/parser/monsters/hippogriff.json
index 887795a..0860401 100644
--- a/parser/monsters/hippogriff.json
+++ b/parser/monsters/hippogriff.json
@@ -26,7 +26,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hobgoblin.json b/parser/monsters/hobgoblin.json
index c8f6903..7891bc5 100644
--- a/parser/monsters/hobgoblin.json
+++ b/parser/monsters/hobgoblin.json
@@ -47,7 +47,10 @@
"text": "_Ranged Weapon Attack:_ +3 to hit, range 150/600 ft., one target. _Hit:_ 5 (1d8 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/homunculus.json b/parser/monsters/homunculus.json
index f4ff9cb..07d1632 100644
--- a/parser/monsters/homunculus.json
+++ b/parser/monsters/homunculus.json
@@ -40,12 +40,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/horned_devil.json b/parser/monsters/horned_devil.json
index 0992954..82f3452 100644
--- a/parser/monsters/horned_devil.json
+++ b/parser/monsters/horned_devil.json
@@ -68,12 +68,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hunter_shark.json b/parser/monsters/hunter_shark.json
index 19acea7..a90cc90 100644
--- a/parser/monsters/hunter_shark.json
+++ b/parser/monsters/hunter_shark.json
@@ -28,12 +28,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "Smaller than a giant shark but larger and fiercer than a reef shark, a hunter shark haunts deep waters. It usually hunts alone, but multiple hunter sharks might feed in the same area. A fully grown hunter shark is 15 to 20 feet long.",
"features": [
{
diff --git a/parser/monsters/hydra.json b/parser/monsters/hydra.json
index fcec542..260cd30 100644
--- a/parser/monsters/hydra.json
+++ b/parser/monsters/hydra.json
@@ -28,12 +28,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/hyena.json b/parser/monsters/hyena.json
index f9691d6..05810bf 100644
--- a/parser/monsters/hyena.json
+++ b/parser/monsters/hyena.json
@@ -26,7 +26,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ice_devil.json b/parser/monsters/ice_devil.json
index 92acc28..979b1f4 100644
--- a/parser/monsters/ice_devil.json
+++ b/parser/monsters/ice_devil.json
@@ -72,12 +72,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ice_mephit.json b/parser/monsters/ice_mephit.json
index 64dbff3..98e6248 100644
--- a/parser/monsters/ice_mephit.json
+++ b/parser/monsters/ice_mephit.json
@@ -52,7 +52,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/imp.json b/parser/monsters/imp.json
index 753ada4..4e63a09 100644
--- a/parser/monsters/imp.json
+++ b/parser/monsters/imp.json
@@ -71,7 +71,10 @@
"cha": 14
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/invisible_stalker.json b/parser/monsters/invisible_stalker.json
index f0b648d..c8cb83b 100644
--- a/parser/monsters/invisible_stalker.json
+++ b/parser/monsters/invisible_stalker.json
@@ -86,7 +86,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/iron_golem.json b/parser/monsters/iron_golem.json
index 8357329..7d27220 100644
--- a/parser/monsters/iron_golem.json
+++ b/parser/monsters/iron_golem.json
@@ -85,12 +85,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 20
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 20
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/jackal.json b/parser/monsters/jackal.json
index 85f1045..a6089bc 100644
--- a/parser/monsters/jackal.json
+++ b/parser/monsters/jackal.json
@@ -26,7 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/killer_whale.json b/parser/monsters/killer_whale.json
index 3c2bed2..6646f2b 100644
--- a/parser/monsters/killer_whale.json
+++ b/parser/monsters/killer_whale.json
@@ -28,12 +28,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/knight.json b/parser/monsters/knight.json
index bc34c1a..25d20ab 100644
--- a/parser/monsters/knight.json
+++ b/parser/monsters/knight.json
@@ -43,7 +43,10 @@
"text": "_Ranged Weapon Attack:_ +2 to hit, range 100/400 ft., one target. _Hit:_ 5 (1d10) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Knights are warriors who pledge service to rulers, religious orders, and noble causes. A knight's alignment determines the extent to which a pledge is honored. Whether undertaking a quest or patrolling a realm, a knight often travels with an entourage that includes squires and hirelings who are commoners.",
"features": [
{
diff --git a/parser/monsters/kobold.json b/parser/monsters/kobold.json
index 7fc300e..4213742 100644
--- a/parser/monsters/kobold.json
+++ b/parser/monsters/kobold.json
@@ -37,7 +37,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 30/120 ft., one target. _Hit:_ 4 (1d4 + 2) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/kraken.json b/parser/monsters/kraken.json
index 14f17c2..d97e0b9 100644
--- a/parser/monsters/kraken.json
+++ b/parser/monsters/kraken.json
@@ -64,12 +64,10 @@
"cha": 20
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lamia.json b/parser/monsters/lamia.json
index f881e3f..fbdf8e7 100644
--- a/parser/monsters/lamia.json
+++ b/parser/monsters/lamia.json
@@ -36,12 +36,10 @@
"text": "_Melee Weapon Attack:_ +5 to hit, reach 5 ft., one target. _Hit:_ 5 (1d4 + 3) piercing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lemure.json b/parser/monsters/lemure.json
index cb83f43..237283b 100644
--- a/parser/monsters/lemure.json
+++ b/parser/monsters/lemure.json
@@ -53,7 +53,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lich.json b/parser/monsters/lich.json
index f7c3bca..eff0f5e 100644
--- a/parser/monsters/lich.json
+++ b/parser/monsters/lich.json
@@ -92,12 +92,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lion.json b/parser/monsters/lion.json
index dea0a1b..1c6141f 100644
--- a/parser/monsters/lion.json
+++ b/parser/monsters/lion.json
@@ -27,7 +27,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lizard.json b/parser/monsters/lizard.json
index 1a6efc5..24f4f23 100644
--- a/parser/monsters/lizard.json
+++ b/parser/monsters/lizard.json
@@ -26,7 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/lizardfolk.json b/parser/monsters/lizardfolk.json
index a8272b6..d294d9f 100644
--- a/parser/monsters/lizardfolk.json
+++ b/parser/monsters/lizardfolk.json
@@ -39,12 +39,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +4 to hit, reach 5 ft. or range 30/120 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mage.json b/parser/monsters/mage.json
index 70430cd..6013131 100644
--- a/parser/monsters/mage.json
+++ b/parser/monsters/mage.json
@@ -36,7 +36,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +5 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 4 (1d4 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Mages spend their lives in the study and practice of magic. Good-aligned mages offer counsel to nobles and others in power, while evil mages dwell in isolated sites to perform unspeakable experiments without interference.",
"features": [
{
diff --git a/parser/monsters/magma_mephit.json b/parser/monsters/magma_mephit.json
index 3398b5d..6d50a19 100644
--- a/parser/monsters/magma_mephit.json
+++ b/parser/monsters/magma_mephit.json
@@ -47,7 +47,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/magmin.json b/parser/monsters/magmin.json
index ea19b42..922058a 100644
--- a/parser/monsters/magmin.json
+++ b/parser/monsters/magmin.json
@@ -50,12 +50,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mammoth.json b/parser/monsters/mammoth.json
index d2003e4..5e1cac9 100644
--- a/parser/monsters/mammoth.json
+++ b/parser/monsters/mammoth.json
@@ -24,12 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "A mammoth is an elephantine creature with thick fur and long tusks. Stockier and fiercer than normal elephants, mammoths inhabit a wide range of climes, from subarctic to subtropical.",
"features": [
{
diff --git a/parser/monsters/manticore.json b/parser/monsters/manticore.json
index 34c9764..dae9a6e 100644
--- a/parser/monsters/manticore.json
+++ b/parser/monsters/manticore.json
@@ -26,12 +26,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/marilith.json b/parser/monsters/marilith.json
index 041c07c..0b1ffa4 100644
--- a/parser/monsters/marilith.json
+++ b/parser/monsters/marilith.json
@@ -78,12 +78,10 @@
"text": "_Melee Weapon Attack:_ +9 to hit, reach 5 ft., one target. _Hit:_ 13 (2d8 + 4) slashing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mastiff.json b/parser/monsters/mastiff.json
index 5468f23..9f20167 100644
--- a/parser/monsters/mastiff.json
+++ b/parser/monsters/mastiff.json
@@ -26,7 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Mastiffs are impressive hounds prized by humanoids for their loyalty and keen senses. Mastiffs can be trained as guard dogs, hunting dogs, and war dogs. Halflings and other Small humanoids ride them as mounts.",
"features": [
{
diff --git a/parser/monsters/medusa.json b/parser/monsters/medusa.json
index 46c966c..9f069d5 100644
--- a/parser/monsters/medusa.json
+++ b/parser/monsters/medusa.json
@@ -42,12 +42,10 @@
"text": "_Ranged Weapon Attack:_ +5 to hit, range 150/600 ft., one target. _Hit:_ 6 (1d8 + 2) piercing damage plus 7 (2d6) poison damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/merfolk.json b/parser/monsters/merfolk.json
index 0c2b294..300ecf5 100644
--- a/parser/monsters/merfolk.json
+++ b/parser/monsters/merfolk.json
@@ -32,7 +32,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +2 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 3 (1d6) piercing damage, or 4 (1d8) piercing damage if used with two hands to make a melee attack."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/merrow.json b/parser/monsters/merrow.json
index 4ab7d78..b3fac32 100644
--- a/parser/monsters/merrow.json
+++ b/parser/monsters/merrow.json
@@ -26,12 +26,10 @@
"cha": 9
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mimic.json b/parser/monsters/mimic.json
index d345303..187e128 100644
--- a/parser/monsters/mimic.json
+++ b/parser/monsters/mimic.json
@@ -38,12 +38,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/minotaur.json b/parser/monsters/minotaur.json
index e5407a3..f00536a 100644
--- a/parser/monsters/minotaur.json
+++ b/parser/monsters/minotaur.json
@@ -34,12 +34,10 @@
"text": "_Melee Weapon Attack:_ +6 to hit, reach 5 ft., one target. _Hit:_ 17 (2d12 + 4) slashing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/minotaur_skeleton.json b/parser/monsters/minotaur_skeleton.json
index 9ffacc9..466d8df 100644
--- a/parser/monsters/minotaur_skeleton.json
+++ b/parser/monsters/minotaur_skeleton.json
@@ -51,12 +51,10 @@
"text": "_Melee Weapon Attack:_ +6 to hit, reach 5 ft., one target. _Hit:_ 17 (2d12 + 4) slashing damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mule.json b/parser/monsters/mule.json
index a149894..85f2649 100644
--- a/parser/monsters/mule.json
+++ b/parser/monsters/mule.json
@@ -24,7 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mummy.json b/parser/monsters/mummy.json
index eb5c7a6..2d1a85a 100644
--- a/parser/monsters/mummy.json
+++ b/parser/monsters/mummy.json
@@ -82,12 +82,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/mummy_lord.json b/parser/monsters/mummy_lord.json
index c1f0373..680e989 100644
--- a/parser/monsters/mummy_lord.json
+++ b/parser/monsters/mummy_lord.json
@@ -87,12 +87,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/nalfeshnee.json b/parser/monsters/nalfeshnee.json
index 5b977c3..0ea4daa 100644
--- a/parser/monsters/nalfeshnee.json
+++ b/parser/monsters/nalfeshnee.json
@@ -72,12 +72,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/night_hag.json b/parser/monsters/night_hag.json
index ddb371d..a12a1bf 100644
--- a/parser/monsters/night_hag.json
+++ b/parser/monsters/night_hag.json
@@ -63,12 +63,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/nightmare.json b/parser/monsters/nightmare.json
index 0a971d2..995e85e 100644
--- a/parser/monsters/nightmare.json
+++ b/parser/monsters/nightmare.json
@@ -29,12 +29,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/noble.json b/parser/monsters/noble.json
index 4c6494e..1fe8f16 100644
--- a/parser/monsters/noble.json
+++ b/parser/monsters/noble.json
@@ -39,7 +39,10 @@
"text": "_Melee Weapon Attack:_ +3 to hit, reach 5 ft., one target. _Hit:_ 5 (1d8 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Nobles wield great authority and influence as members of the upper class, possessing wealth and connections that can make them as powerful as monarchs and generals. A noble often travels in the company of guards, as well as servants who are commoners. The noble's statistics can also be used to represent courtiers who aren't of noble birth.",
"features": [
{
diff --git a/parser/monsters/ochre_jelly.json b/parser/monsters/ochre_jelly.json
index bb60d4b..fe67380 100644
--- a/parser/monsters/ochre_jelly.json
+++ b/parser/monsters/ochre_jelly.json
@@ -65,7 +65,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/octopus.json b/parser/monsters/octopus.json
index 6b7b44a..8c7df7d 100644
--- a/parser/monsters/octopus.json
+++ b/parser/monsters/octopus.json
@@ -29,7 +29,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/ogre.json b/parser/monsters/ogre.json
index 11b98de..cb9765c 100644
--- a/parser/monsters/ogre.json
+++ b/parser/monsters/ogre.json
@@ -42,7 +42,10 @@
"text": "_Melee or Ranged Weapon Attack:_ +6 to hit, reach 5 ft. or range 30/120 ft., one target. _Hit:_ 11 (2d6 + 4) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [],
"prof": 2
diff --git a/parser/monsters/ogre_zombie.json b/parser/monsters/ogre_zombie.json
index dfafaaa..1eea697 100644
--- a/parser/monsters/ogre_zombie.json
+++ b/parser/monsters/ogre_zombie.json
@@ -44,7 +44,10 @@
"text": "_Melee Weapon Attack:_ +6 to hit, reach 5 ft., one target. _Hit:_ 13 (2d8 + 4) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/oni.json b/parser/monsters/oni.json
index 5f770a1..a44b2eb 100644
--- a/parser/monsters/oni.json
+++ b/parser/monsters/oni.json
@@ -46,7 +46,10 @@
"text": "_Melee Weapon Attack:_ +7 to hit, reach 10 ft., one target. _Hit:_ 15 (2d10 + 4) slashing damage, or 9 (1d10 + 4) slashing damage in Small or Medium form."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/orc.json b/parser/monsters/orc.json
index 22bc68c..0d239a3 100644
--- a/parser/monsters/orc.json
+++ b/parser/monsters/orc.json
@@ -44,7 +44,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +5 to hit, reach 5 ft. or range 30/120 ft., one target. _Hit:_ 6 (1d6 + 3) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/otyugh.json b/parser/monsters/otyugh.json
index ba71dc6..a1451ed 100644
--- a/parser/monsters/otyugh.json
+++ b/parser/monsters/otyugh.json
@@ -28,12 +28,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/owl.json b/parser/monsters/owl.json
index ac2ee2a..54a8d77 100644
--- a/parser/monsters/owl.json
+++ b/parser/monsters/owl.json
@@ -29,7 +29,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/owlbear.json b/parser/monsters/owlbear.json
index 1d13126..719fa0b 100644
--- a/parser/monsters/owlbear.json
+++ b/parser/monsters/owlbear.json
@@ -28,12 +28,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/panther.json b/parser/monsters/panther.json
index c772c9e..71bb0ad 100644
--- a/parser/monsters/panther.json
+++ b/parser/monsters/panther.json
@@ -27,7 +27,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/pegasus.json b/parser/monsters/pegasus.json
index 321d2cd..1f0825e 100644
--- a/parser/monsters/pegasus.json
+++ b/parser/monsters/pegasus.json
@@ -30,7 +30,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/phase_spider.json b/parser/monsters/phase_spider.json
index 2b7ecc3..58fa28d 100644
--- a/parser/monsters/phase_spider.json
+++ b/parser/monsters/phase_spider.json
@@ -28,12 +28,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "A phase spider possesses the magical ability to phase in and out of the Ethereal Plane. It seems to appear out of nowhere and quickly vanishes after attacking. Its movement on the Ethereal Plane before coming back to the Material Plane makes it seem like it can teleport.",
"features": [
{
diff --git a/parser/monsters/pit_fiend.json b/parser/monsters/pit_fiend.json
index 430125c..d7ff1cc 100644
--- a/parser/monsters/pit_fiend.json
+++ b/parser/monsters/pit_fiend.json
@@ -76,12 +76,10 @@
"text": "_Melee Weapon Attack:_ +14 to hit, reach 10 ft., one target. _Hit:_ 15 (2d6 + 8) bludgeoning damage plus 21 (6d6) fire damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/planetar.json b/parser/monsters/planetar.json
index 5eac3f8..d1026a2 100644
--- a/parser/monsters/planetar.json
+++ b/parser/monsters/planetar.json
@@ -74,12 +74,10 @@
"text": "_Melee Weapon Attack:_ +12 to hit, reach 5 ft., one target. _Hit:_ 21 (4d6 + 7) slashing damage plus 22 (5d8) radiant damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/plesiosaurus.json b/parser/monsters/plesiosaurus.json
index cd38324..f8d84fe 100644
--- a/parser/monsters/plesiosaurus.json
+++ b/parser/monsters/plesiosaurus.json
@@ -27,12 +27,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/poisonous_snake.json b/parser/monsters/poisonous_snake.json
index a723f2f..d1ab198 100644
--- a/parser/monsters/poisonous_snake.json
+++ b/parser/monsters/poisonous_snake.json
@@ -26,7 +26,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/polar_bear.json b/parser/monsters/polar_bear.json
index ef54c14..7d56d84 100644
--- a/parser/monsters/polar_bear.json
+++ b/parser/monsters/polar_bear.json
@@ -26,12 +26,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/pony.json b/parser/monsters/pony.json
index 7020f10..081801d 100644
--- a/parser/monsters/pony.json
+++ b/parser/monsters/pony.json
@@ -24,7 +24,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/priest.json b/parser/monsters/priest.json
index af7f946..c0adc08 100644
--- a/parser/monsters/priest.json
+++ b/parser/monsters/priest.json
@@ -39,7 +39,10 @@
"text": "_Melee Weapon Attack:_ +2 to hit, reach 5 ft., one target. _Hit:_ 3 (1d6) bludgeoning damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Priests bring the teachings of their gods to the common folk. They are the spiritual leaders of temples and shrines and often hold positions of influence in their communities. Evil priests might work openly under a tyrant, or they might be the leaders of religious sects hidden in the shadows of good society, overseeing depraved rites. A priest typically has one or more acolytes to help with religious ceremonies and other sacred duties.",
"features": [
{
diff --git a/parser/monsters/pseudodragon.json b/parser/monsters/pseudodragon.json
index 53fae42..ffe85dc 100644
--- a/parser/monsters/pseudodragon.json
+++ b/parser/monsters/pseudodragon.json
@@ -30,12 +30,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/purple_worm.json b/parser/monsters/purple_worm.json
index c0ac23e..98a42af 100644
--- a/parser/monsters/purple_worm.json
+++ b/parser/monsters/purple_worm.json
@@ -30,12 +30,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/quasit.json b/parser/monsters/quasit.json
index b326b88..de83961 100644
--- a/parser/monsters/quasit.json
+++ b/parser/monsters/quasit.json
@@ -69,7 +69,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/quipper.json b/parser/monsters/quipper.json
index a8f616d..9c560ba 100644
--- a/parser/monsters/quipper.json
+++ b/parser/monsters/quipper.json
@@ -26,7 +26,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "A quipper is a carnivorous fish with sharp teeth. Quippers can adapt to any aquatic environment, including cold subterranean lakes. They frequently gather in swarms; the statistics for a swarm of quippers appear later in this appendix.",
"features": [
{
diff --git a/parser/monsters/rakshasa.json b/parser/monsters/rakshasa.json
index 83927ac..9c64045 100644
--- a/parser/monsters/rakshasa.json
+++ b/parser/monsters/rakshasa.json
@@ -48,12 +48,10 @@
"cha": 20
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/rat.json b/parser/monsters/rat.json
index 37be997..a4a9702 100644
--- a/parser/monsters/rat.json
+++ b/parser/monsters/rat.json
@@ -26,7 +26,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/raven.json b/parser/monsters/raven.json
index 5e0c760..c2210b6 100644
--- a/parser/monsters/raven.json
+++ b/parser/monsters/raven.json
@@ -26,7 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/red_dragon_wyrmling.json b/parser/monsters/red_dragon_wyrmling.json
index 0334539..ad39659 100644
--- a/parser/monsters/red_dragon_wyrmling.json
+++ b/parser/monsters/red_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/reef_shark.json b/parser/monsters/reef_shark.json
index e8e3ba4..70cd395 100644
--- a/parser/monsters/reef_shark.json
+++ b/parser/monsters/reef_shark.json
@@ -28,12 +28,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "Smaller than giant sharks and hunter sharks, reef sharks inhabit shallow waters and coral reefs, gathering in small packs to hunt. A full-grown specimen measures 6 to 10 feet long.",
"features": [
{
diff --git a/parser/monsters/remorhaz.json b/parser/monsters/remorhaz.json
index fdec7a0..ef92cee 100644
--- a/parser/monsters/remorhaz.json
+++ b/parser/monsters/remorhaz.json
@@ -36,12 +36,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/rhinoceros.json b/parser/monsters/rhinoceros.json
index af72d23..804c24a 100644
--- a/parser/monsters/rhinoceros.json
+++ b/parser/monsters/rhinoceros.json
@@ -24,12 +24,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/riding_horse.json b/parser/monsters/riding_horse.json
index ade0c94..f4f9e4c 100644
--- a/parser/monsters/riding_horse.json
+++ b/parser/monsters/riding_horse.json
@@ -24,7 +24,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/roc.json b/parser/monsters/roc.json
index 340fdaa..a6fcf58 100644
--- a/parser/monsters/roc.json
+++ b/parser/monsters/roc.json
@@ -31,12 +31,10 @@
"cha": 9
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/roper.json b/parser/monsters/roper.json
index d7fd364..a1bd4e3 100644
--- a/parser/monsters/roper.json
+++ b/parser/monsters/roper.json
@@ -29,12 +29,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 20
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 20
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/rug_of_smothering.json b/parser/monsters/rug_of_smothering.json
index 01bd760..8619e9f 100644
--- a/parser/monsters/rug_of_smothering.json
+++ b/parser/monsters/rug_of_smothering.json
@@ -64,7 +64,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/rust_monster.json b/parser/monsters/rust_monster.json
index bc98a65..bb31022 100644
--- a/parser/monsters/rust_monster.json
+++ b/parser/monsters/rust_monster.json
@@ -26,12 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/saber_toothed_tiger.json b/parser/monsters/saber_toothed_tiger.json
index 21b0599..9bf9152 100644
--- a/parser/monsters/saber_toothed_tiger.json
+++ b/parser/monsters/saber_toothed_tiger.json
@@ -27,7 +27,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/sahuagin.json b/parser/monsters/sahuagin.json
index d06cb0e..10b2dad 100644
--- a/parser/monsters/sahuagin.json
+++ b/parser/monsters/sahuagin.json
@@ -34,12 +34,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +3 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 4 (1d6 + 1) piercing damage, or 5 (1d8 + 1) piercing damage if used with two hands to make a melee attack."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/salamander.json b/parser/monsters/salamander.json
index 347bd8e..2ba7cad 100644
--- a/parser/monsters/salamander.json
+++ b/parser/monsters/salamander.json
@@ -61,12 +61,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +7 to hit, reach 5 ft. or range 20 ft./60 ft., one target. _Hit:_ 11 (2d6 + 4) piercing damage, or 13 (2d8 + 4) piercing damage if used with two hands to make a melee attack, plus 3 (1d6) fire damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/satyr.json b/parser/monsters/satyr.json
index 3721336..12237de 100644
--- a/parser/monsters/satyr.json
+++ b/parser/monsters/satyr.json
@@ -44,7 +44,10 @@
"text": "_Ranged Weapon Attack:_ +5 to hit, range 80/320 ft., one target. _Hit:_ 6 (1d6 + 3) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/scorpion.json b/parser/monsters/scorpion.json
index 9d0debb..f1bf903 100644
--- a/parser/monsters/scorpion.json
+++ b/parser/monsters/scorpion.json
@@ -26,12 +26,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/scout.json b/parser/monsters/scout.json
index d59773b..7d35b09 100644
--- a/parser/monsters/scout.json
+++ b/parser/monsters/scout.json
@@ -45,7 +45,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, ranged 150/600 ft., one target. _Hit:_ 6 (1d8 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Scouts are skilled hunters and trackers who offer their services for a fee. Most hunt wild game, but a few work as bounty hunters, serve as guides, or provide military reconnaissance.",
"features": [
{
diff --git a/parser/monsters/sea_hag.json b/parser/monsters/sea_hag.json
index 0851d13..442ae7d 100644
--- a/parser/monsters/sea_hag.json
+++ b/parser/monsters/sea_hag.json
@@ -26,12 +26,10 @@
"cha": 13
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/sea_horse.json b/parser/monsters/sea_horse.json
index e2f357e..65d3cd8 100644
--- a/parser/monsters/sea_horse.json
+++ b/parser/monsters/sea_horse.json
@@ -24,7 +24,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/shadow.json b/parser/monsters/shadow.json
index 944d2a2..05f3b2a 100644
--- a/parser/monsters/shadow.json
+++ b/parser/monsters/shadow.json
@@ -114,7 +114,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/shambling_mound.json b/parser/monsters/shambling_mound.json
index 84d9aee..b04a64c 100644
--- a/parser/monsters/shambling_mound.json
+++ b/parser/monsters/shambling_mound.json
@@ -55,12 +55,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/shield_guardian.json b/parser/monsters/shield_guardian.json
index b116917..fde97bb 100644
--- a/parser/monsters/shield_guardian.json
+++ b/parser/monsters/shield_guardian.json
@@ -53,12 +53,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/shrieker.json b/parser/monsters/shrieker.json
index d9be6c2..9a231a8 100644
--- a/parser/monsters/shrieker.json
+++ b/parser/monsters/shrieker.json
@@ -39,7 +39,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/silver_dragon_wyrmling.json b/parser/monsters/silver_dragon_wyrmling.json
index 075dae7..697b300 100644
--- a/parser/monsters/silver_dragon_wyrmling.json
+++ b/parser/monsters/silver_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/skeleton.json b/parser/monsters/skeleton.json
index e377fea..b7edfc7 100644
--- a/parser/monsters/skeleton.json
+++ b/parser/monsters/skeleton.json
@@ -56,12 +56,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 80/320 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage."
}
],
- "natural_armor": [
- {
- "name": "armor scraps",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "armor scraps",
+ "bonus": 13
+ },
"description": "",
"features": [],
"prof": 2
diff --git a/parser/monsters/solar.json b/parser/monsters/solar.json
index 16ca1b2..0aad1d2 100644
--- a/parser/monsters/solar.json
+++ b/parser/monsters/solar.json
@@ -87,12 +87,10 @@
"text": "_Melee Weapon Attack:_ +15 to hit, reach 5 ft., one target. _Hit:_ 22 (4d6 + 8) slashing damage plus 27 (6d8) radiant damage."
}
],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 21
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 21
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/specter.json b/parser/monsters/specter.json
index 9610dbd..39932d2 100644
--- a/parser/monsters/specter.json
+++ b/parser/monsters/specter.json
@@ -111,7 +111,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/spider.json b/parser/monsters/spider.json
index 064bf10..8f988a1 100644
--- a/parser/monsters/spider.json
+++ b/parser/monsters/spider.json
@@ -28,7 +28,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/spirit_naga.json b/parser/monsters/spirit_naga.json
index d7ba61d..21aa169 100644
--- a/parser/monsters/spirit_naga.json
+++ b/parser/monsters/spirit_naga.json
@@ -45,12 +45,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/sprite.json b/parser/monsters/sprite.json
index 42c85ff..b9ccc05 100644
--- a/parser/monsters/sprite.json
+++ b/parser/monsters/sprite.json
@@ -43,7 +43,10 @@
"text": "_Ranged Weapon Attack:_ +6 to hit, range 40/160 ft., one target. _Hit:_ 1 piercing damage, and the target must succeed on a DC 10 Constitution saving throw or become poisoned for 1 minute. If its saving throw result is 5 or lower, the poisoned target falls unconscious for the same duration, or until it takes damage or another creature takes an action to shake it awake."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/spy.json b/parser/monsters/spy.json
index ec5d4a6..919e433 100644
--- a/parser/monsters/spy.json
+++ b/parser/monsters/spy.json
@@ -43,7 +43,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 30/120 ft., one target. _Hit:_ 5 (1d6 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Rulers, nobles, merchants, guildmasters, and other wealthy individuals use spies to gain the upper hand in a world of cutthroat politics. A spy is trained to secretly gather information. Loyal spies would rather die than divulge information that could compromise them or their employers.",
"features": [
{
diff --git a/parser/monsters/steam_mephit.json b/parser/monsters/steam_mephit.json
index f8c7d39..b1e9d14 100644
--- a/parser/monsters/steam_mephit.json
+++ b/parser/monsters/steam_mephit.json
@@ -40,7 +40,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/stirge.json b/parser/monsters/stirge.json
index db07ac0..8cf459f 100644
--- a/parser/monsters/stirge.json
+++ b/parser/monsters/stirge.json
@@ -26,12 +26,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/stone_giant.json b/parser/monsters/stone_giant.json
index d398582..1e81edc 100644
--- a/parser/monsters/stone_giant.json
+++ b/parser/monsters/stone_giant.json
@@ -33,12 +33,10 @@
"cha": 9
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/stone_golem.json b/parser/monsters/stone_golem.json
index b466828..18eadbd 100644
--- a/parser/monsters/stone_golem.json
+++ b/parser/monsters/stone_golem.json
@@ -81,12 +81,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/storm_giant.json b/parser/monsters/storm_giant.json
index bc4fc80..55f1f7f 100644
--- a/parser/monsters/storm_giant.json
+++ b/parser/monsters/storm_giant.json
@@ -59,7 +59,10 @@
"text": "_Melee Weapon Attack:_ +14 to hit, reach 10 ft., one target. _Hit:_ 30 (6d6 + 9) slashing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/succubusincubus.json b/parser/monsters/succubusincubus.json
index 3f968e5..43f24c1 100644
--- a/parser/monsters/succubusincubus.json
+++ b/parser/monsters/succubusincubus.json
@@ -67,12 +67,10 @@
"cha": 20
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_bats.json b/parser/monsters/swarm_of_bats.json
index 2ea70ec..321e5a4 100644
--- a/parser/monsters/swarm_of_bats.json
+++ b/parser/monsters/swarm_of_bats.json
@@ -72,7 +72,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_insects.json b/parser/monsters/swarm_of_insects.json
index 67d278b..02b33db 100644
--- a/parser/monsters/swarm_of_insects.json
+++ b/parser/monsters/swarm_of_insects.json
@@ -72,12 +72,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 12
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 12
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_poisonous_snakes.json b/parser/monsters/swarm_of_poisonous_snakes.json
index 8f40405..d7fcc16 100644
--- a/parser/monsters/swarm_of_poisonous_snakes.json
+++ b/parser/monsters/swarm_of_poisonous_snakes.json
@@ -72,7 +72,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_quippers.json b/parser/monsters/swarm_of_quippers.json
index 54210c5..64b3900 100644
--- a/parser/monsters/swarm_of_quippers.json
+++ b/parser/monsters/swarm_of_quippers.json
@@ -72,7 +72,10 @@
"cha": 2
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_rats.json b/parser/monsters/swarm_of_rats.json
index 30c2dc3..098ab5a 100644
--- a/parser/monsters/swarm_of_rats.json
+++ b/parser/monsters/swarm_of_rats.json
@@ -72,7 +72,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/swarm_of_ravens.json b/parser/monsters/swarm_of_ravens.json
index c30d410..e9ed8b8 100644
--- a/parser/monsters/swarm_of_ravens.json
+++ b/parser/monsters/swarm_of_ravens.json
@@ -72,7 +72,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/tarrasque.json b/parser/monsters/tarrasque.json
index 9652fa4..2c14187 100644
--- a/parser/monsters/tarrasque.json
+++ b/parser/monsters/tarrasque.json
@@ -74,12 +74,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 25
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 25
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/thug.json b/parser/monsters/thug.json
index 02eac96..d331d35 100644
--- a/parser/monsters/thug.json
+++ b/parser/monsters/thug.json
@@ -42,7 +42,10 @@
"text": "_Ranged Weapon Attack:_ +2 to hit, range 100/400 ft., one target. _Hit:_ 5 (1d10) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Thugs are ruthless enforcers skilled at intimidation and violence. They work for money and have few scruples.",
"features": [
{
diff --git a/parser/monsters/tiger.json b/parser/monsters/tiger.json
index 4ae4a11..becc263 100644
--- a/parser/monsters/tiger.json
+++ b/parser/monsters/tiger.json
@@ -29,7 +29,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/treant.json b/parser/monsters/treant.json
index acdb175..b9fb1a9 100644
--- a/parser/monsters/treant.json
+++ b/parser/monsters/treant.json
@@ -38,12 +38,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/tribal_warrior.json b/parser/monsters/tribal_warrior.json
index c0ff134..8562125 100644
--- a/parser/monsters/tribal_warrior.json
+++ b/parser/monsters/tribal_warrior.json
@@ -35,7 +35,10 @@
"text": "_Melee or _Ranged Weapon Attack:__ +3 to hit, reach 5 ft. or range 20/60 ft., one target. _Hit:_ 4 (1d6 + 1) piercing damage, or 5 (1d8 + 1) piercing damage if used with two hands to make a melee attack."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Tribal warriors live beyond civilization, most often subsisting on fishing and hunting. Each tribe acts in accordance with the wishes of its chief, who is the greatest or oldest warrior of the tribe or a tribe member blessed by the gods.",
"features": [
{
diff --git a/parser/monsters/triceratops.json b/parser/monsters/triceratops.json
index 02ac9b0..1464a29 100644
--- a/parser/monsters/triceratops.json
+++ b/parser/monsters/triceratops.json
@@ -24,12 +24,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/troll.json b/parser/monsters/troll.json
index 40b6751..aef2d01 100644
--- a/parser/monsters/troll.json
+++ b/parser/monsters/troll.json
@@ -28,12 +28,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/tyrannosaurus_rex.json b/parser/monsters/tyrannosaurus_rex.json
index f0921b7..755085c 100644
--- a/parser/monsters/tyrannosaurus_rex.json
+++ b/parser/monsters/tyrannosaurus_rex.json
@@ -26,12 +26,10 @@
"cha": 9
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/unicorn.json b/parser/monsters/unicorn.json
index fa9ff39..a2e9622 100644
--- a/parser/monsters/unicorn.json
+++ b/parser/monsters/unicorn.json
@@ -44,7 +44,10 @@
"cha": 16
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/vampire.json b/parser/monsters/vampire.json
index 81fa5bc..5e92082 100644
--- a/parser/monsters/vampire.json
+++ b/parser/monsters/vampire.json
@@ -56,12 +56,10 @@
"cha": 18
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/vampire_spawn.json b/parser/monsters/vampire_spawn.json
index 2421e91..dc8ed81 100644
--- a/parser/monsters/vampire_spawn.json
+++ b/parser/monsters/vampire_spawn.json
@@ -55,12 +55,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/veteran.json b/parser/monsters/veteran.json
index 8186d1b..1db6bb7 100644
--- a/parser/monsters/veteran.json
+++ b/parser/monsters/veteran.json
@@ -48,7 +48,10 @@
"text": "_Ranged Weapon Attack:_ +3 to hit, range 100/400 ft., one target. _Hit:_ 6 (1d10 + 1) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "Veterans are professional fighters that take up arms for pay or to protect something they believe in or value. Their ranks include soldiers retired from long service and warriors who never served anyone but themselves.",
"features": [
{
diff --git a/parser/monsters/violet_fungus.json b/parser/monsters/violet_fungus.json
index 599f5c0..c185fd8 100644
--- a/parser/monsters/violet_fungus.json
+++ b/parser/monsters/violet_fungus.json
@@ -39,7 +39,10 @@
"cha": 1
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/vrock.json b/parser/monsters/vrock.json
index 38ec4fb..82f1470 100644
--- a/parser/monsters/vrock.json
+++ b/parser/monsters/vrock.json
@@ -71,12 +71,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 15
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 15
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/vulture.json b/parser/monsters/vulture.json
index 32d1d27..131a0ab 100644
--- a/parser/monsters/vulture.json
+++ b/parser/monsters/vulture.json
@@ -26,7 +26,10 @@
"cha": 4
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/warhorse.json b/parser/monsters/warhorse.json
index af6b966..bf23226 100644
--- a/parser/monsters/warhorse.json
+++ b/parser/monsters/warhorse.json
@@ -24,7 +24,10 @@
"cha": 7
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/warhorse_skeleton.json b/parser/monsters/warhorse_skeleton.json
index c813ddc..3a7c632 100644
--- a/parser/monsters/warhorse_skeleton.json
+++ b/parser/monsters/warhorse_skeleton.json
@@ -45,12 +45,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [
- {
- "name": "barding scraps",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "barding scraps",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/water_elemental.json b/parser/monsters/water_elemental.json
index 5927e8c..a0503e4 100644
--- a/parser/monsters/water_elemental.json
+++ b/parser/monsters/water_elemental.json
@@ -87,12 +87,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 14
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 14
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/weasel.json b/parser/monsters/weasel.json
index 0a3e24d..395b1aa 100644
--- a/parser/monsters/weasel.json
+++ b/parser/monsters/weasel.json
@@ -27,7 +27,10 @@
"cha": 3
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/werebear.json b/parser/monsters/werebear.json
index b5d48ee..70aee52 100644
--- a/parser/monsters/werebear.json
+++ b/parser/monsters/werebear.json
@@ -45,12 +45,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 10
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 10
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/wereboar.json b/parser/monsters/wereboar.json
index 955e84e..b8dcf1a 100644
--- a/parser/monsters/wereboar.json
+++ b/parser/monsters/wereboar.json
@@ -45,12 +45,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 10
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 10
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/wererat.json b/parser/monsters/wererat.json
index c95c1ec..2ffca21 100644
--- a/parser/monsters/wererat.json
+++ b/parser/monsters/wererat.json
@@ -48,7 +48,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/weretiger.json b/parser/monsters/weretiger.json
index f01f174..0b738e5 100644
--- a/parser/monsters/weretiger.json
+++ b/parser/monsters/weretiger.json
@@ -48,7 +48,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/werewolf.json b/parser/monsters/werewolf.json
index b402eba..2d79168 100644
--- a/parser/monsters/werewolf.json
+++ b/parser/monsters/werewolf.json
@@ -46,12 +46,10 @@
"cha": 10
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 11
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 11
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/white_dragon_wyrmling.json b/parser/monsters/white_dragon_wyrmling.json
index 71e9360..becbeb3 100644
--- a/parser/monsters/white_dragon_wyrmling.json
+++ b/parser/monsters/white_dragon_wyrmling.json
@@ -40,12 +40,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 16
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 16
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/wight.json b/parser/monsters/wight.json
index 65a7223..50874cb 100644
--- a/parser/monsters/wight.json
+++ b/parser/monsters/wight.json
@@ -85,7 +85,10 @@
"text": "_Ranged Weapon Attack:_ +4 to hit, range 150/600 ft., one target. _Hit:_ 6 (1d8 + 2) piercing damage."
}
],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/will_o_wisp.json b/parser/monsters/will_o_wisp.json
index 4de8a56..a1a7a48 100644
--- a/parser/monsters/will_o_wisp.json
+++ b/parser/monsters/will_o_wisp.json
@@ -103,7 +103,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/winter_wolf.json b/parser/monsters/winter_wolf.json
index b824a70..a92533a 100644
--- a/parser/monsters/winter_wolf.json
+++ b/parser/monsters/winter_wolf.json
@@ -32,12 +32,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "The arctic-dwelling winter wolf is as large as a dire wolf but has snow-white fur and pale blue eyes. Frost giants use these evil creatures as guards and hunting companions, putting the wolves' deadly breath weapon to use against their foes. Winter wolves communicate with one another using growls and barks, but they speak Common and Giant well enough to follow simple conversations.",
"features": [
{
diff --git a/parser/monsters/wolf.json b/parser/monsters/wolf.json
index 9a7cf86..5dc9a67 100644
--- a/parser/monsters/wolf.json
+++ b/parser/monsters/wolf.json
@@ -27,12 +27,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/worg.json b/parser/monsters/worg.json
index 1f4a5c3..a6efbc2 100644
--- a/parser/monsters/worg.json
+++ b/parser/monsters/worg.json
@@ -28,12 +28,10 @@
"cha": 8
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "A worg is an evil predator that delights in hunting and devouring creatures weaker than itself. Cunning and malevolent, worgs roam across the remote wilderness or are raised by goblins and hobgoblins. Those creatures use worgs as mounts, but a worg will turn on its rider if it feels mistreated or malnourished. Worgs speak in their own language and Goblin, and a few learn to speak Common as well.",
"features": [
{
diff --git a/parser/monsters/wraith.json b/parser/monsters/wraith.json
index a130886..64e15b4 100644
--- a/parser/monsters/wraith.json
+++ b/parser/monsters/wraith.json
@@ -110,7 +110,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/wyvern.json b/parser/monsters/wyvern.json
index 52e7702..cdd5195 100644
--- a/parser/monsters/wyvern.json
+++ b/parser/monsters/wyvern.json
@@ -28,12 +28,10 @@
"cha": 6
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 13
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 13
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/xorn.json b/parser/monsters/xorn.json
index cfea6cd..65585d6 100644
--- a/parser/monsters/xorn.json
+++ b/parser/monsters/xorn.json
@@ -38,12 +38,10 @@
"cha": 11
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 19
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 19
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_black_dragon.json b/parser/monsters/young_black_dragon.json
index 629767b..fe16df5 100644
--- a/parser/monsters/young_black_dragon.json
+++ b/parser/monsters/young_black_dragon.json
@@ -40,12 +40,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_blue_dragon.json b/parser/monsters/young_blue_dragon.json
index 9add82c..9f171c5 100644
--- a/parser/monsters/young_blue_dragon.json
+++ b/parser/monsters/young_blue_dragon.json
@@ -40,12 +40,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_brass_dragon.json b/parser/monsters/young_brass_dragon.json
index b018683..f2d6c4a 100644
--- a/parser/monsters/young_brass_dragon.json
+++ b/parser/monsters/young_brass_dragon.json
@@ -41,12 +41,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_bronze_dragon.json b/parser/monsters/young_bronze_dragon.json
index ef81177..d75db0e 100644
--- a/parser/monsters/young_bronze_dragon.json
+++ b/parser/monsters/young_bronze_dragon.json
@@ -41,12 +41,10 @@
"cha": 17
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_copper_dragon.json b/parser/monsters/young_copper_dragon.json
index 67d68f5..4d304cf 100644
--- a/parser/monsters/young_copper_dragon.json
+++ b/parser/monsters/young_copper_dragon.json
@@ -41,12 +41,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_gold_dragon.json b/parser/monsters/young_gold_dragon.json
index 11bf760..ef77c65 100644
--- a/parser/monsters/young_gold_dragon.json
+++ b/parser/monsters/young_gold_dragon.json
@@ -42,12 +42,10 @@
"cha": 20
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_green_dragon.json b/parser/monsters/young_green_dragon.json
index ed6281c..7d06726 100644
--- a/parser/monsters/young_green_dragon.json
+++ b/parser/monsters/young_green_dragon.json
@@ -46,12 +46,10 @@
"cha": 15
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_red_dragon.json b/parser/monsters/young_red_dragon.json
index 3a316d1..77289e6 100644
--- a/parser/monsters/young_red_dragon.json
+++ b/parser/monsters/young_red_dragon.json
@@ -40,12 +40,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_silver_dragon.json b/parser/monsters/young_silver_dragon.json
index 0624c25..2151099 100644
--- a/parser/monsters/young_silver_dragon.json
+++ b/parser/monsters/young_silver_dragon.json
@@ -42,12 +42,10 @@
"cha": 19
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 18
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 18
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/young_white_dragon.json b/parser/monsters/young_white_dragon.json
index 908198a..50fbb5f 100644
--- a/parser/monsters/young_white_dragon.json
+++ b/parser/monsters/young_white_dragon.json
@@ -40,12 +40,10 @@
"cha": 12
},
"inventory": [],
- "natural_armor": [
- {
- "name": "natural",
- "bonus": 17
- }
- ],
+ "natural_armor": {
+ "name": "natural",
+ "bonus": 17
+ },
"description": "",
"features": [
{
diff --git a/parser/monsters/zombie.json b/parser/monsters/zombie.json
index 8d6f344..9600fe9 100644
--- a/parser/monsters/zombie.json
+++ b/parser/monsters/zombie.json
@@ -38,7 +38,10 @@
"cha": 5
},
"inventory": [],
- "natural_armor": [],
+ "natural_armor": {
+ "name": "",
+ "bonus": 0
+ },
"description": "",
"features": [
{
diff --git a/parser/scrapeToJson.py b/parser/scrapeToJson.py
index 24980a1..0304d7b 100755
--- a/parser/scrapeToJson.py
+++ b/parser/scrapeToJson.py
@@ -46,7 +46,7 @@ def processMonster(data, weapons, armors, spells):
return (desc['stats'][ability] - 10) // 2
desc['inventory'] = [] # Fill with weapons and armor
# Modify ac stuff
- desc['natural_armor'] = []
+ desc['natural_armor'] = {'name': '', 'bonus': 0}
correctAC = int(desc['ac'].split(' ')[0] if ' ' in desc['ac'] else desc['ac'])
natural = ''
armorBonus = 0
@@ -93,7 +93,7 @@ def processMonster(data, weapons, armors, spells):
if armorBonus == 0 and not natural: # Got through all that and came up dry
armorBonus = 10 + getBonus('dex')
if natural:
- desc['natural_armor'].append({'name': natural, 'bonus': correctAC - armorBonus})
+ desc['natural_armor'] = {'name': natural, 'bonus': correctAC - armorBonus}
elif armorBonus != correctAC:
print('Got a bad result for {}: armor string is {}, but we calculated {}'.format(desc['name'], desc['ac'], armorBonus))
del desc['ac']
diff --git a/src/armor.cc b/src/armor.cc
index e7ed323..54284c7 100644
--- a/src/armor.cc
+++ b/src/armor.cc
@@ -1,6 +1,7 @@
#include "armor.h"
#include "creature.h"
#include "entry.h"
+#include "rules.h"
#include <string>
#include <sstream>
@@ -16,10 +17,11 @@ namespace entry{
text << genText(static_cast<const Item&>(a), c);
text << ": AC: " << a.getACBonus();
if(a.getArmorType() == "light") {
- text << " + dex (i.e., " << (a.getACBonus() + c.getBonus("dex")) << ")";
+ text << " + dex (i.e., " << (a.getACBonus() + c.getBonus(rules::Ability::Dex())) << ")";
} else if(a.getArmorType() == "medium") {
int actualBonus = a.getACBonus();
- actualBonus += (c.getBonus("dex") > 2)? 2 : c.getBonus("dex");
+ int dex = c.getBonus(rules::Ability::Dex());
+ actualBonus += (dex > 2)? 2 : dex;
text << " + dex max 2 (i.e., " << actualBonus << ")";
}
if(a.getStrRequirement() > 0) {
diff --git a/src/creature.cc b/src/creature.cc
index 53a4994..ac616ac 100644
--- a/src/creature.cc
+++ b/src/creature.cc
@@ -14,9 +14,20 @@ typedef nlohmann::json json;
using namespace std;
namespace creature {
+ template<typename T> map<T, int> makeMap(map<string, int> src) {
+ //cout << "Got here!\n";
+ map<T, int> ret;
+ for(auto& [abilityStr, val] : src) {
+ ret.insert({T(abilityStr), val});
+ }
+ //cout << "And here!\n";
+ return ret;
+ }
+
Creature::Creature(const json& data)
- : inventory(json2ptrvec<entry::Item>(data["inventory"])), stats(data["stats"]), skills(data["skills"]), creatureName(data["name"]), size(data["size"]), type(data["type"]), alignment(data["alignment"]), hdCount(data["hit_die_count"]), hdSides(data["hit_die_sides"]), speed(data["speed"]), saves(data["saves"]), langs(data["langs"]), cr(data["cr"]), proficiency(data["prof"]), dmgImmunities(json2vec<dmgType>(data["d_immunities"])), dmgResistances(json2vec<dmgType>(data["d_resistances"])), dmgVulnerabilities(json2vec<dmgType>(data["d_vulnerabilities"])), condImmunities(json2vec<dmgType>(data["c_immunities"])), features(json2ptrvec<entry::Feature>(data["features"]))
+ : inventory(json2ptrvec<entry::Item>(data["inventory"])), stats(makeMap<rules::Ability>(data["stats"])), skills(makeMap<rules::Skill>(data["skills"])), creatureName(data["name"]), size(data["size"]), type(data["type"]), alignment(data["alignment"]), hdCount(data["hit_die_count"]), hdSides(data["hit_die_sides"]), speed(data["speed"]), saves(json2vec<rules::Ability>(data["saves"])), langs(data["langs"]), cr(data["cr"]), proficiency(data["prof"]), natArmorName(data["natural_armor"]["name"]), natArmorBonus(data["natural_armor"]["bonus"]), dmgImmunities(json2vec<dmgType>(data["d_immunities"])), dmgResistances(json2vec<dmgType>(data["d_resistances"])), dmgVulnerabilities(json2vec<dmgType>(data["d_vulnerabilities"])), condImmunities(json2vec<dmgType>(data["c_immunities"])), features(json2ptrvec<entry::Feature>(data["features"]))
{
+ //cout << "...And here!\n";
// Initialize names and hp
if(((map<string, json>) data).contains("givenName")) {
givenName = data["givenName"];
@@ -24,7 +35,7 @@ namespace creature {
hp = data["hp"];
} else {
givenName = "Jerry"; //TODO: Autogenerate
- hpMax = this->getBonus("con") * hdCount;
+ hpMax = this->getBonus(rules::Ability::Con()) * hdCount;
for(int i = 0; i < hdCount; i++) {
hpMax += roll(hdSides);
}
@@ -95,15 +106,15 @@ namespace creature {
}
}
- int Creature::getSkillBonus(const string& skill) const {
- int bonus = this->getBonus(rules::skill2ability[skill]);
+ int Creature::getSkillBonus(const rules::Skill& skill) const {
+ int bonus = this->getBonus(skill.getAbility());
if(skills.contains(skill)) {
bonus += skills.at(skill) * getProficiency();
}
return bonus;
}
- int Creature::getAbilitySaveBonus(const string& ability) const {
+ int Creature::getAbilitySaveBonus(const rules::Ability& ability) const {
int bonus = this->getBonus(ability);
if(find(saves.begin(), saves.end(), ability) != saves.end()) {
bonus += getProficiency();
@@ -124,35 +135,40 @@ namespace creature {
}
}
- map<string, int> Creature::getSkills() const {
- map<string, int> s;
+ map<rules::Skill, int> Creature::getSkills() const {
+ map<rules::Skill, int> s;
for(auto skill : skills) {
- s[skill.first] = getSkillBonus(skill.first);
+ s.insert({skill.first, getSkillBonus(skill.first)});
}
return s;
}
- map<string, int> Creature::getSaves() const {
- map<string, int> s;
+ map<rules::Ability, int> Creature::getSaves() const {
+ map<rules::Ability, int> s;
for(auto save : saves) {
- s[save] = this->getBonus(save) + getProficiency();
+ s.insert({save, this->getBonus(save) + getProficiency()});
}
return s;
}
- void Creature::setScore(const string& ability, int score) {
- stats[ability] = score;
+ void Creature::setScore(const rules::Ability& ability, int score) {
+ stats.insert({ability, score});
}
- void Creature::setProfLevel(const string& skill, int level) {
- skills[skill] = level;
+ void Creature::setProfLevel(const rules::Skill& skill, int level) {
+ skills.insert({skill, level});
}
const int getAC(const Creature& c) {
- int baseBonus = 10 + c.getBonus("dex");
+ auto natArmor = c.getNaturalArmor();
+ if(! natArmor.first.empty()) {
+ return natArmor.second;
+ }
+ int dex = c.getBonus(rules::Ability::Dex());
+ int baseBonus = 10 + dex;
int miscBonus = 0;
for(auto a : getItems<entry::Armor>(c)) {
- if(c.getScore("str") < a->getStrRequirement()) {
+ if(c.getScore(rules::Ability::Str()) < a->getStrRequirement()) {
continue;
}
auto armorType = a->getArmorType();
@@ -161,9 +177,9 @@ namespace creature {
} else {
baseBonus = a->getACBonus();
if(armorType == "light") {
- baseBonus += c.getBonus("dex");
+ baseBonus += dex;
} else if(armorType == "medium") {
- baseBonus += (c.getBonus("dex") > 2)? 2 : c.getBonus("dex");
+ baseBonus += (dex > 2)? 2 : dex;
}
}
}
@@ -181,19 +197,24 @@ namespace creature {
string genText(const Creature& c) {
stringstream text;
text << c.getGivenName() << " (" << c.getCreatureName() << "): " << c.getHP() << "/" << c.getHPMax() << " hp, " << getAC(c) << " ac";
- string armor = utils::join(mapItems(creature::getItems<entry::Armor>(c)), ", ");
- if(! armor.empty()) {
- text << " (" << armor << ")";
+ if(! c.getNaturalArmor().first.empty()) {
+ text << " (" << c.getNaturalArmor().first << ")";
+ } else {
+ string armor = utils::join(mapItems(creature::getItems<entry::Armor>(c)), ", ");
+ if(! armor.empty()) {
+ text << " (" << armor << ")";
+ }
}
text << ", speed " << c.getSpeed() << "\n";
text << "A cr " << c.getCR() << " " << c.getAlignment() << " " << c.getSize() << " " << c.getType() << ".\n";
text << "Stats:\n";
- //text << setiosflags(ios::fixed) << setw(6);
- for(auto ability : rules::abilities) {
- text << " " << setw(6) << std::left << ability;
+ using namespace rules;
+ vector<rules::Ability> abilities {Ability::Str(), Ability::Dex(), Ability::Con(), Ability::Int(), Ability::Wis(), Ability::Cha()};
+ for(auto ability : abilities) {
+ text << " " << setw(6) << std::left << ability.getAbbrev();
}
text << "\n";
- for(auto ability : rules::abilities) {
+ for(auto ability : abilities) {
text << setw(7) << std::left << (to_string(c.getScore(ability)) + "(" + to_string(c.getBonus(ability)) + ")");
}
text << "\n";
@@ -201,26 +222,33 @@ namespace creature {
if(! c.getSenses().empty()) {
text << utils::join(c.getSenses(), ", ") << ". ";
}
- text << "Passive Perception " << 10 + c.getBonus("wis") << "\n";
+ text << "Passive Perception " << 10 + c.getSkillBonus(rules::Skill::Perception()) << "\n";
if(! c.getLanguages().empty()) {
text << "Languages: " << c.getLanguages() << "\n";
}
-
- text << "\nSkills:\n";
- for(auto skill : c.getSkills()) {
- text << skill.first << " (+" << skill.second << ")\n";
+ if(! c.getSkills().empty()) {
+ text << "\nSkills:\n";
+ for(auto skill : c.getSkills()) {
+ text << skill.first.getName() << " (+" << skill.second << ")\n";
+ }
}
- text << "\nSaves:\n";
- for(auto save : c.getSaves()) {
- text << save.first << " (+" << save.second << ")\n";
+ if(! c.getSaves().empty()) {
+ text << "\nSaves:\n";
+ for(auto save : c.getSaves()) {
+ text << save.first.getAbbrev() << " (+" << save.second << ")\n";
+ }
}
- text << "\nFeatures:\n";
- for(auto f: c.getFeatures()) {
- text << f->getText(c) << "\n";
+ if(! c.getFeatures().empty()) {
+ text << "\nFeatures:\n";
+ for(auto f: c.getFeatures()) {
+ text << f->getText(c) << "\n";
+ }
}
- text << "\nInventory:\n";
- for(auto i : c.getInventory()) {
- text << i->getText(c) << "\n";
+ if(! c.getInventory().empty()) {
+ text << "\nInventory:\n";
+ for(auto i : c.getInventory()) {
+ text << i->getText(c) << "\n";
+ }
}
return text.str();
diff --git a/src/creature.h b/src/creature.h
index 7327de9..1c8db21 100644
--- a/src/creature.h
+++ b/src/creature.h
@@ -1,6 +1,7 @@
#pragma once
#include "json.hpp"
#include "jsonable.h"
+#include "rules.h"
namespace entry {
class Feature;
@@ -34,10 +35,10 @@ namespace creature {
virtual ~Creature() {};
// Getters
- int getSkillBonus(const std::string& skill) const;
- int getAbilitySaveBonus(const std::string& ability) const;
- std::map<std::string, int> getSkills(void) const;
- std::map<std::string, int> getSaves(void) const;
+ int getSkillBonus(const rules::Skill& skill) const;
+ int getAbilitySaveBonus(const rules::Ability& ability) const;
+ std::map<rules::Skill, int> getSkills(void) const;
+ std::map<rules::Ability, int> getSaves(void) const;
// Inline getters
std::string getCreatureName(void) const {return creatureName;}
@@ -46,13 +47,14 @@ namespace creature {
std::string getSize(void) const {return size;}
std::string getAlignment(void) const {return alignment;}
double getCR(void) const {return cr;}
+ std::pair<std::string, int> getNaturalArmor(void) const {return {natArmorName, natArmorBonus};}
std::string getLanguages(void) const {return langs;}
int getHP(void) const {return hp;}
int getHPMax(void) const {return hpMax;}
std::vector<std::string> getSenses(void) const {return senses;}
std::string getSpeed(void) const {return speed;}
- int getScore(const std::string& ability) const {return stats.at(ability);}
- int getBonus(const std::string& ability) const {return (int) (getScore(ability) - 10) / 2;}
+ int getScore(const rules::Ability& ability) const {return stats.at(ability);}
+ int getBonus(const rules::Ability& ability) const {return (int) (getScore(ability) - 10) / 2;}
int getProficiency(void) const {return proficiency;}
std::vector<std::shared_ptr<entry::Feature>> getFeatures(void) const {return features;}
std::vector<std::shared_ptr<entry::Item>> getInventory(void) const {return inventory;}
@@ -61,8 +63,8 @@ namespace creature {
// Setters (mutators)
void setGivenName(std::string name) {givenName = name;}
void applyDamage(int amount, const std::string& type, const std::vector<std::string>& qualifiers);
- void setScore(const std::string& ability, int score);
- void setProfLevel(const std::string& skill, int level);
+ void setScore(const rules::Ability& ability, int score);
+ void setProfLevel(const rules::Skill& skill, int level);
void addInventoryItem(std::shared_ptr<entry::Item> item);
void removeInventoryItem(const std::string& itemName);
@@ -74,8 +76,8 @@ namespace creature {
int hpMax;
int hp;
std::vector<std::shared_ptr<entry::Item>> inventory;
- std::map<std::string, int> stats;
- std::map<std::string, int> skills;
+ std::map<rules::Ability, int> stats;
+ std::map<rules::Skill, int> skills;
//Immutable variables
const std::string creatureName;
@@ -85,11 +87,13 @@ namespace creature {
const int hdCount;
const int hdSides;
const std::string speed;
- const std::vector<std::string> saves;
+ const std::vector<rules::Ability> saves;
const std::vector<std::string> senses;
const std::string langs;
const double cr;
const int proficiency;
+ const std::string natArmorName;
+ const int natArmorBonus;
const std::vector<dmgType> dmgImmunities;
const std::vector<dmgType> dmgResistances;
const std::vector<dmgType> dmgVulnerabilities;
diff --git a/src/dmtool.cc b/src/dmtool.cc
index 7f2c72c..f9d32ab 100644
--- a/src/dmtool.cc
+++ b/src/dmtool.cc
@@ -17,24 +17,34 @@ void usage(string exename) {
cout << indDesc << "List creatures and objects.\n";
cout << indOpt << "cp old-path new-path\n";
cout << indDesc << "Copy old-path to new-path.\n";
+ cout << indOpt << "mv old-path new-path\n";
+ cout << indDesc << "Move old-path to new-path.\n";
cout << indOpt << "rm path\n";
cout << indDesc << "Remove existing creature, object, or directory.\n";
cout << indOpt << "roll path name\n";
cout << indDesc << "Roll a skill check, save, or attack.\n";
cout << indOpt << "damage path amount [type]\n";
cout << indDesc << "Damage creature by amount. Type defaults to \"force\".\n";
+ cout << indOpt << "heal path amount\n";
+ cout << indDesc << "Heal creature by amount.\n";
+ cout << indOpt << "reset path\n";
+ cout << indDesc << "Reset creature to full health (as if completing a long rest).\n";
cout << indOpt << "set path field value\n";
cout << indDesc << "Set a field to a new value, where field is any of:\n";
cout << indDesc << " ability (str, dex, con, int, wis, cha); value is new ability score\n";
cout << indDesc << " skill (athletics, \"sleight of hand\", etc.); value is (none|proficient|expert)\n";
- cout << indDesc << " name; value is new given name\n";
- cout << indOpt << "add path object\n";
- cout << indDesc << "Add object to creature's inventory. If it is armor or a weapon, it will automatically be equipped (if applicable)\n";
-
+ cout << indDesc << " name; value is new given name.\n";
+ cout << indOpt << "add path entry\n";
+ cout << indDesc << "Add entry to creature, where entry is an item or spell.\n";
cout << indOpt << "help\n";
cout << indDesc << "Show this help.\n";
}
+void print(string path) {
+ creature::Creature c(utils::loadJson(path));
+ cout << genText(c);
+}
+
void list(vector<string> args) {
string baseDir = settings::getString("savedir");
vector<string> listPaths;
@@ -48,8 +58,7 @@ void list(vector<string> args) {
for(auto listPath : listPaths) {
if(fs::is_regular_file(fs::status(listPath))) {
// Try loading and printing stuff about it
- creature::Creature c(utils::loadJson(listPath));
- cout << genText(c);
+ print(listPath);
}
else if(fs::is_directory(fs::status(listPath))) {
for(fs::directory_entry path : filesystem::directory_iterator(listPath)) {
@@ -64,9 +73,12 @@ void list(vector<string> args) {
}
void cp(vector<string> args) {}
+void mv(vector<string> args) {}
void rm(vector<string> args) {}
void roll(vector<string> args) {}
void damage(vector<string> args) {}
+void heal(vector<string> args) {}
+void reset(vector<string> args) {}
void set(vector<string> args) {}
void add(vector<string> args) {}
@@ -82,9 +94,12 @@ int main(int argc, char *argv[]) {
args.erase(args.begin());
if(cmd == "ls") list(args);
else if(cmd == "cp") cp(args);
+ else if(cmd == "mv") mv(args);
else if(cmd == "rm") rm(args);
else if(cmd == "roll") roll(args);
else if(cmd == "damage") damage(args);
+ else if(cmd == "heal") heal(args);
+ else if(cmd == "reset") reset(args);
else if(cmd == "set") set(args);
else if(cmd == "add") add(args);
else if(cmd == "help") usage(exename);
diff --git a/src/feature.h b/src/feature.h
index f3073d8..69112ea 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -7,10 +7,9 @@ namespace entry {
class Feature : public Entry {
public:
static std::shared_ptr<Feature> create(const nlohmann::json& data);
+ virtual ~Feature() {}
protected:
- Feature(const nlohmann::json& data) : Entry(data) {};
+ Feature(const nlohmann::json& data) : Entry(data) {}
};
-
- //std::string genText(const Feature& f, const creature::Creature& c);
}
diff --git a/src/item.h b/src/item.h
index 096513e..b0b06af 100644
--- a/src/item.h
+++ b/src/item.h
@@ -7,15 +7,17 @@ namespace entry {
class Item : public Entry {
public:
static std::shared_ptr<Item> create(const nlohmann::json& data);
+ virtual ~Item() {}
protected:
- Item(const nlohmann::json& data) : Entry(data) {};
+ Item(const nlohmann::json& data) : Entry(data) {}
};
class Substantial {
public:
virtual int getCost(void) const = 0;
virtual double getWeight(void) const = 0;
+ virtual ~Substantial() {}
};
std::string genText(const Substantial& s);
diff --git a/src/jsonable.h b/src/jsonable.h
index 4be2bec..d6866b8 100644
--- a/src/jsonable.h
+++ b/src/jsonable.h
@@ -8,6 +8,7 @@ class Jsonable {
public:
virtual nlohmann::json toJson(void) const = 0;
operator nlohmann::json() const {return toJson();}
+ virtual ~Jsonable() {}
};
template<typename T> std::vector<T> json2vec(const nlohmann::json& data) {
diff --git a/src/rules.h b/src/rules.h
index c1cc6e1..8b54e8d 100644
--- a/src/rules.h
+++ b/src/rules.h
@@ -1,57 +1,104 @@
#pragma once
+#include "jsonable.h"
#include <vector>
#include <map>
+#include <string>
+#include <iostream>
using namespace std;
namespace rules {
- static vector<string> abilities {"str", "dex", "con", "int", "wis", "cha"};
-
- static map<string, string> skill2ability {
- {"Athletics", "str"},
- {"Acrobatics", "dex"},
- {"Sleight of Hand", "dex"},
- {"Stealth", "dex"},
- {"Arcana", "int"},
- {"History", "int"},
- {"Investigation", "int"},
- {"Nature", "int"},
- {"Religion", "int"},
- {"Animal Handling", "wis"},
- {"Insight", "wis"},
- {"Medicine", "wis"},
- {"Perception", "wis"},
- {"Survival", "wis"},
- {"Deception", "cha"},
- {"Intimidation", "cha"},
- {"Performance", "cha"},
- {"Persuasion", "cha"}
- };
+ class Ability : public Jsonable {
+ public:
+ string getFull() const {return abilities.at(getAbbrev());}
+ string getAbbrev() const {return abbrev;}
+ virtual nlohmann::json toJson(void) const {
+ return getAbbrev();
+ }
+ bool operator<(const Ability& rhs) const {return getAbbrev() < rhs.getAbbrev();}
+ bool operator==(const Ability& rhs) const {return getAbbrev() == rhs.getAbbrev();}
+
+ Ability() {}
+ explicit Ability(const nlohmann::json& data) : abbrev(data) {}
+
+ virtual ~Ability() {}
- static map<string, map<string, int>> armor {
- {"light", {
- {"padded", 11},
- {"leather", 11},
- {"studded leather", 12}
- }},
- {"medium", {
- {"hide", 12},
- {"chain shirt", 13},
- {"scale mail", 14},
- {"breastplate", 14},
- {"half plate", 15}
- }},
- {"heavy", {
- {"ring mail", 14},
- {"chain mail", 16},
- {"splint", 17},
- {"plate", 18}
- }},
- {"misc", {
- {"shield", 2},
- {"ring of protection", 1}
- }}
+ static Ability Str() {return Ability("str");}
+ static Ability Dex() {return Ability("dex");}
+ static Ability Con() {return Ability("con");}
+ static Ability Int() {return Ability("int");}
+ static Ability Wis() {return Ability("wis");}
+ static Ability Cha() {return Ability("cha");}
+
+ private:
+ const string abbrev;
+
+ const map<string, string> abilities {
+ {"str", "Strength"},
+ {"dex", "Dexterity"},
+ {"con", "Constitution"},
+ {"int", "Intelligence"},
+ {"wis", "Wisdom"},
+ {"cha", "Charisma"}
+ };
};
+ class Skill : public Jsonable {
+ public:
+ string getName() const {return name;}
+ Ability getAbility() const {return Ability(skill2ability.at(getName()));}
+ virtual nlohmann::json toJson(void) const {
+ return getName();
+ }
+ bool operator<(const Skill& rhs) const {return getName() < rhs.getName();}
+ bool operator==(const Skill& rhs) const {return getName() == rhs.getName();}
+
+ virtual ~Skill() {}
+
+ static Skill Athletics() {return Skill("Athletics");}
+ static Skill Acrobatics() {return Skill("Acrobatics");}
+ static Skill SleightOfHand() {return Skill("Sleight of Hand");}
+ static Skill Stealth() {return Skill("Stealth");}
+ static Skill Arcana() {return Skill("Arcana");}
+ static Skill History() {return Skill("History");}
+ static Skill Investigation() {return Skill("Investigation");}
+ static Skill Nature() {return Skill("Nature");}
+ static Skill Religion() {return Skill("Religion");}
+ static Skill AnimalHandling() {return Skill("Animal Handling");}
+ static Skill Insight() {return Skill("Insight");}
+ static Skill Medicine() {return Skill("Medicine");}
+ static Skill Perception() {return Skill("Perception");}
+ static Skill Survival() {return Skill("Survival");}
+ static Skill Deception() {return Skill("Deception");}
+ static Skill Intimidation() {return Skill("Intimidation");}
+ static Skill Performance() {return Skill("Performance");}
+ static Skill Persuasion() {return Skill("Persuasion");}
+
+ explicit Skill(const nlohmann::json& data) : name(data) {}
+
+ private:
+ const string name;
+
+ const map<string, string> skill2ability {
+ {"Athletics", "str"},
+ {"Acrobatics", "dex"},
+ {"Sleight of Hand", "dex"},
+ {"Stealth", "dex"},
+ {"Arcana", "int"},
+ {"History", "int"},
+ {"Investigation", "int"},
+ {"Nature", "int"},
+ {"Religion", "int"},
+ {"Animal Handling", "wis"},
+ {"Insight", "wis"},
+ {"Medicine", "wis"},
+ {"Perception", "wis"},
+ {"Survival", "wis"},
+ {"Deception", "cha"},
+ {"Intimidation", "cha"},
+ {"Performance", "cha"},
+ {"Persuasion", "cha"}
+ };
+ };
}
diff --git a/src/spellcasting.cc b/src/spellcasting.cc
index 62af6de..e36fd5b 100644
--- a/src/spellcasting.cc
+++ b/src/spellcasting.cc
@@ -33,7 +33,7 @@ namespace entry {
string genText(const Spellcasting& s, const creature::Creature& c) {
stringstream text;
text << genText(static_cast<const Feature&>(s), c);
- text << ": Spellcasting ability: " << s.getAbility();
+ text << ": Spellcasting ability: " << s.getAbility().getFull();
text << " (spell save DC " << 8 + c.getBonus(s.getAbility()) + c.getProficiency();
text << ", +" << c.getBonus(s.getAbility()) + c.getProficiency() << " to hit with spell attacks).";
if(s.isInnate()) {
diff --git a/src/spellcasting.h b/src/spellcasting.h
index 0ea235c..654a386 100644
--- a/src/spellcasting.h
+++ b/src/spellcasting.h
@@ -3,6 +3,7 @@
#include "json.hpp"
#include "spell.h"
#include "jsonable.h"
+#include "rules.h"
typedef nlohmann::json json;
@@ -23,11 +24,11 @@ namespace entry {
class Spellcasting : public Feature {
public:
- Spellcasting(const json& data, const json& base) : Feature(base), innate(data["innate"]), ability(data["spellcasting_ability"]), spellsBySlot(json2vec<SlotLevel>(data["levels"])) {}
+ Spellcasting(const json& data, const json& base) : Feature(base), innate(data["innate"]), ability(rules::Ability(data["spellcasting_ability"])), spellsBySlot(json2vec<SlotLevel>(data["levels"])) {}
virtual ~Spellcasting() {}
bool isInnate(void) const {return innate;}
- std::string getAbility(void) const {return ability;}
+ rules::Ability getAbility(void) const {return ability;}
std::vector<SlotLevel> getSpellsBySlot(void) const {return spellsBySlot;}
virtual std::string getText(const creature::Creature& c) const;
@@ -41,7 +42,7 @@ namespace entry {
private:
const bool innate;
- const std::string ability;
+ const rules::Ability ability;
const std::vector<SlotLevel> spellsBySlot;
};
diff --git a/src/weapon.cc b/src/weapon.cc
index 3a42e80..af75736 100644
--- a/src/weapon.cc
+++ b/src/weapon.cc
@@ -1,5 +1,6 @@
#include "weapon.h"
#include "creature.h"
+#include "rules.h"
#include <string>
#include <sstream>
#include <algorithm>
@@ -22,9 +23,9 @@ namespace entry {
stringstream text;
text << genText(static_cast<const Item&>(w), c);
// Determine best ability bonus
- int abilityBonus = c.getBonus("str");
+ int abilityBonus = c.getBonus(rules::Ability::Str());
if(w.getProperties().count("finesse")) {
- abilityBonus = max(abilityBonus, c.getBonus("dex"));
+ abilityBonus = max(abilityBonus, c.getBonus(rules::Ability::Dex()));
}
text << ": +" << abilityBonus + c.getProficiency() << " to hit, ";
if(w.getReach() > 0) {