Merge pull request 'Custom stock files and data' (#11) from custom-stocks into main

Reviewed-on: #11
main
Daniel Asher Resnick 3 weeks ago
commit 32c91f437d
  1. 12
      CHANGELOG.md
  2. 1
      Gemfile
  3. 2
      Gemfile.lock
  4. 16
      src/app.rb
  5. 1
      src/data/custom/.gitignore
  6. 551
      src/data/dark_elf/lifepaths.json
  7. 231
      src/data/dark_elf/resources.json
  8. 3837
      src/data/gold/lifepaths/dwarf.json
  9. 3969
      src/data/gold/lifepaths/elf.json
  10. 23373
      src/data/gold/lifepaths/man.json
  11. 3061
      src/data/gold/lifepaths/orc.json
  12. 3325
      src/data/gold/lifepaths/roden.json
  13. 1835
      src/data/gold/lifepaths/wolf.json
  14. 307
      src/data/gold/resources/dwarf.json
  15. 355
      src/data/gold/resources/elf.json
  16. 871
      src/data/gold/resources/man.json
  17. 425
      src/data/gold/resources/orc.json
  18. 281
      src/data/gold/resources/roden.json
  19. 87
      src/data/gold/resources/wolf.json
  20. 114
      src/data/gold/starting_stat_pts/dwarf.json
  21. 146
      src/data/gold/starting_stat_pts/elf.json
  22. 90
      src/data/gold/starting_stat_pts/man.json
  23. 98
      src/data/gold/starting_stat_pts/orc.json
  24. 74
      src/data/gold/starting_stat_pts/roden.json
  25. 58
      src/data/gold/starting_stat_pts/wolf.json
  26. 130
      src/data/gold/stocks/dwarf.json
  27. 161
      src/data/gold/stocks/elf.json
  28. 99
      src/data/gold/stocks/man.json
  29. 114
      src/data/gold/stocks/orc.json
  30. 90
      src/data/gold/stocks/roden.json
  31. 75
      src/data/gold/stocks/wolf.json
  32. 1151
      src/data/troll/lifepaths.json
  33. 117
      src/data/troll/resources.json
  34. 82
      src/data/troll/starting_stat_pts.json
  35. 100
      src/data/troll/stock.json
  36. 2330
      src/data/wizard/lifepaths.json
  37. 15
      src/lib/data.rb
  38. 27
      src/lib/data/custom.rb
  39. 8
      src/lib/data/dark_elf.rb
  40. 22
      src/lib/data/gold.rb
  41. 17
      src/lib/data/troll.rb
  42. 5
      src/lib/data/wizard.rb
  43. 34
      src/lib/stock.rb
  44. 47
      src/public/js/burning-serialize.js
  45. 205
      src/public/js/burning-service.js
  46. 452
      src/public/js/burning.js
  47. 4
      src/public/js/server_settings.js
  48. 9
      src/views/partials/main.erb
  49. 133
      tests/data/custom/test.lifepaths
  50. 25
      tests/data/custom/test.resources
  51. 39
      tests/data/custom/test.skills
  52. 95
      tests/data/custom/test.stock
  53. 55
      tests/data/custom/test.traits

@ -11,6 +11,16 @@ and this project adheres to [Semantic Versioning](semver).
- Custom upload for your own data files
- Updates to Roden and Great Wolves files (currently the data comes from Monster Burner and not Codex)
## [3.0.0] - 2023-09-03
### Added
- Custom stocks can now be added to a server
- Stock data moved from code to dedicated data file
- Data files split into stock, lifepath, skills, and traits files, with designated extensions
- "Born" lifepaths with arbitrary names
### Fixed
- Spite shade calculation
## [2.3.0] - 2019-07-28
### Added
- Display emotional attribute traits on PDF
@ -59,4 +69,4 @@ and this project adheres to [Semantic Versioning](semver).
[changelog]: https://keepachangelog.com/en/1.0.0/
[semver]: https://semver.org/spec/v2.0.0.html
[semver]: https://semver.org/spec/v2.0.0.html

@ -5,6 +5,7 @@ gem 'sinatra'
gem 'sinatra-contrib'
gem 'prawn'
gem 'prawn-templates'
gem 'deep_merge', '~> 1.2', '>= 1.2.1'
group :development do
gem 'rerun'

@ -4,6 +4,7 @@ GEM
Ascii85 (1.1.0)
afm (0.2.2)
daemons (1.4.1)
deep_merge (1.2.2)
eventmachine (1.2.7)
ffi (1.15.5)
hashery (2.1.2)
@ -58,6 +59,7 @@ PLATFORMS
x86_64-linux
DEPENDENCIES
deep_merge (~> 1.2, >= 1.2.1)
prawn
prawn-templates
rerun

@ -49,24 +49,20 @@ get '/traits' do
json DATA[:traits]
end
get '/lifepaths/:stock' do
if DATA[:stocks].include? params['stock']
json DATA[:lifepaths][params['stock']]
else
404
end
get '/stocks' do
json DATA[:stocks]
end
get '/starting_stat_pts/:stock' do
if DATA[:stocks].include? params['stock']
json DATA[:stat_pts][params['stock']]
get '/lifepaths/:stock' do
if DATA[:stocks].keys.include? params['stock']
json DATA[:lifepaths][params['stock']]
else
404
end
end
get '/resources/:stock' do
if DATA[:stocks].include? params['stock']
if DATA[:stocks].keys.include? params['stock']
json DATA[:resources][params['stock']]
else
404

@ -1,296 +1,299 @@
{
"Path Of Spite Subsetting": {
"Griever": {
"time": 3,
"res": 0,
"skills": [
[
3,
"Sorrow Of Truth",
"Dark Elf-wise"
]
],
"traits": [
1,
"Spite"
]
},
"Wastrel": {
"time": 25,
"res": 3,
"skills": [
[
6,
"Scavenging",
"Brawling",
"Forest-wise",
"Wasteland-wise",
"Animal-wise"
]
],
"traits": [
2,
"Filthy",
"Feral Elf"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Thief": {
"time": 18,
"res": 6,
"stat": [
[
"stock": "elf",
"settings": {
"Path Of Spite Subsetting": {
"Griever": {
"time": 3,
"res": 0,
"skills": [
[
3,
"Sorrow Of Truth",
"Dark Elf-wise"
]
],
"traits": [
1,
"pm"
"Spite"
]
],
"skills": [
[
6,
"Lock Pick",
"Stealthy",
"Climbing",
"Sleight Of Hand",
"Dirge Of Night"
},
"Wastrel": {
"time": 25,
"res": 3,
"skills": [
[
6,
"Scavenging",
"Brawling",
"Forest-wise",
"Wasteland-wise",
"Animal-wise"
]
],
"traits": [
2,
"Filthy",
"Feral Elf"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
1,
"Thief"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Assassin": {
"time": 15,
"res": 6,
"stat": [
[
},
"Thief": {
"time": 18,
"res": 6,
"stat": [
[
1,
"pm"
]
],
"skills": [
[
6,
"Lock Pick",
"Stealthy",
"Climbing",
"Sleight Of Hand",
"Dirge Of Night"
]
],
"traits": [
1,
"p"
]
],
"skills": [
[
7,
"Intimidation",
"Poisons",
"Escape Artist",
"Knives",
"Garotte",
"Keen Of Terror"
]
],
"traits": [
1,
"Murderous",
"Callous",
"Cold Blooded"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Stalker": {
"time": 20,
"res": 8,
"skills": [
[
8,
"Hunting",
"Elf-wise",
"Tracking",
"Trapper",
"Observation",
"Stealthy",
"Throwing",
"Javelin",
"Supplication To Shadows"
"Thief"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
1,
"Saturnine"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Deceiver": {
"time": 35,
"res": 10,
"stat": [
[
},
"Assassin": {
"time": 15,
"res": 6,
"stat": [
[
1,
"p"
]
],
"skills": [
[
7,
"Intimidation",
"Poisons",
"Escape Artist",
"Knives",
"Garotte",
"Keen Of Terror"
]
],
"traits": [
1,
"m"
]
],
"skills": [
[
7,
"Sleight Of Hand",
"Disguise",
"Inconspicuous",
"Rhyme Of The Unraveller"
"Murderous",
"Callous",
"Cold Blooded"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
1,
"Deceptive"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Liar": {
"time": 25,
"res": 8,
"stat": [
[
},
"Stalker": {
"time": 20,
"res": 8,
"skills": [
[
8,
"Hunting",
"Elf-wise",
"Tracking",
"Trapper",
"Observation",
"Stealthy",
"Throwing",
"Javelin",
"Supplication To Shadows"
]
],
"traits": [
1,
"m"
]
],
"skills": [
[
6,
"Falsehood",
"Soothing Platitudes",
"Persuasion",
"Twisted Tongue"
"Saturnine"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
1,
"Compulsive Liar"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
},
"Siren": {
"time": 55,
"res": 20,
"stat": [
[
},
"Deceiver": {
"time": 35,
"res": 10,
"stat": [
[
1,
"m"
]
],
"skills": [
[
7,
"Sleight Of Hand",
"Disguise",
"Inconspicuous",
"Rhyme Of The Unraveller"
]
],
"traits": [
1,
"pm"
]
],
"skills": [
[
9,
"Seduction",
"Etiquette",
"Persuasion",
"Soothing Platitudes",
"Gossip-wise",
"Fugue Of Discord",
"Litany Of Fools"
"Deceptive"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
2,
"Charismatic",
"Femme Fatale/Homme Fatale"
],
"requires": "Assassin, Deceiver or Liar",
"requires_expr": [
"assassin",
"deceiver",
"liar"
]
},
"Eremite": {
"time": 150,
"res": 15,
"stat": [
[
},
"Liar": {
"time": 25,
"res": 8,
"stat": [
[
1,
"m"
]
],
"skills": [
[
6,
"Falsehood",
"Soothing Platitudes",
"Persuasion",
"Twisted Tongue"
]
],
"traits": [
1,
"m"
]
],
"skills": [
[
12,
"Philosophy",
"Ugly Truth",
"Obscure History",
"Symbology",
"Strategy",
"Elf-wise",
"Orc-wise",
"Dwarf-wise",
"Man-wise",
"Paean To The Dark Fire"
"Compulsive Liar"
],
"requires": "Griever",
"requires_expr": [
"griever"
]
],
"traits": [
2,
"Remote",
"Cold"
],
"requires": "Siren, Wastrel or Stalker",
"requires_expr": [
"siren",
"wastrel",
"stalker"
]
},
"Recluse": {
"time": 225,
"res": 25,
"stat": [
[
1,
"p"
},
"Siren": {
"time": 55,
"res": 20,
"stat": [
[
1,
"pm"
]
],
"skills": [
[
9,
"Seduction",
"Etiquette",
"Persuasion",
"Soothing Platitudes",
"Gossip-wise",
"Fugue Of Discord",
"Litany Of Fools"
]
],
"traits": [
2,
"Charismatic",
"Femme Fatale/Homme Fatale"
],
"requires": "Assassin, Deceiver or Liar",
"requires_expr": [
"assassin",
"deceiver",
"liar"
]
],
"skills": [
[
},
"Eremite": {
"time": 150,
"res": 15,
"stat": [
[
1,
"m"
]
],
"skills": [
[
12,
"Philosophy",
"Ugly Truth",
"Obscure History",
"Symbology",
"Strategy",
"Elf-wise",
"Orc-wise",
"Dwarf-wise",
"Man-wise",
"Paean To The Dark Fire"
]
],
"traits": [
2,
"Ancient History",
"Dwarf-wise",
"Elven Politics-wise",
"Cut Of The Quickened Mind"
"Remote",
"Cold"
],
[
5,
"General"
"requires": "Siren, Wastrel or Stalker",
"requires_expr": [
"siren",
"wastrel",
"stalker"
]
],
"traits": [
1,
"Vengeful"
],
"requires": "Eremite or any three Dark Elf lifepaths",
"requires_expr": [
"+or",
[
"eremite"
},
"Recluse": {
"time": 225,
"res": 25,
"stat": [
[
1,
"p"
]
],
"skills": [
[
2,
"Ancient History",
"Dwarf-wise",
"Elven Politics-wise",
"Cut Of The Quickened Mind"
],
[
5,
"General"
]
],
"traits": [
1,
"Vengeful"
],
[
"+has_n_lifepaths_in",
3,
"path of spite subsetting:griever",
"path of spite subsetting:wastrel",
"path of spite subsetting:thief",
"path of spite subsetting:assassin",
"path of spite subsetting:stalker",
"path of spite subsetting:deceiver",
"path of spite subsetting:liar",
"path of spite subsetting:siren"
"requires": "Eremite or any three Dark Elf lifepaths",
"requires_expr": [
"+or",
[
"eremite"
],
[
"+has_n_lifepaths_in",
3,
"path of spite subsetting:griever",
"path of spite subsetting:wastrel",
"path of spite subsetting:thief",
"path of spite subsetting:assassin",
"path of spite subsetting:stalker",
"path of spite subsetting:deceiver",
"path of spite subsetting:liar",
"path of spite subsetting:siren"
]
]
]
}
}
}
}
}

@ -1,114 +1,117 @@
[
{
"name": "Bitter Poison",
"type": "gear",
"rp": 10
},
{
"name": "Spiteful Poison",
"type": "gear",
"rp": 20
},
{
"name": "Lock Picks",
"type": "gear",
"rp": 10
},
{
"name": "Long Knife",
"type": "gear",
"rp": 5
},
{
"name": "Barbed Javelins",
"type": "gear",
"rp": 3
},
{
"name": "Garrote",
"type": "gear",
"rp": 3
},
{
"name": "Caltrops",
"type": "gear",
"rp": 3
},
{
"name": "Tools Of The Trade",
"type": "gear",
"rp": 9
},
{
"name": "Cloak Of Darkness",
"type": "gear",
"rp": 30
},
{
"name": "Climbing Claws",
"type": "gear",
"rp": 5
},
{
"name": "Remote Refuge",
"type": "property",
"resources": [
{
"name": "Wasteland",
"rp": 20
},
{
"name": "Isolated Manor And Moorland",
"rp": 50
},
{
"name": "Hidden Fortress",
"rp": 100
},
{
"name": "Dark Forest, Cove Or Lonely Mountain",
"rp": 150
},
{
"name": "Safe House",
"rp": 25
}
]
},
{
"name": "Morlin Armor",
"type": "gear",
"resources": [
{
"name": "Light Mail",
"rp": 30
},
{
"name": "Heavy Mail",
"rp": 40
},
{
"name": "Plated Mail",
"rp": 100
}
]
},
{
"name": "Morlin Weapons",
"type": "gear",
"resources": [
{
"name": "+1 speed",
"rp": 15
},
{
"name": "+1 VA",
"rp": 15
},
{
"name": "+1 Power",
"rp": 30
}
]
}
]
{
"stock": "elf",
"resources": [
{
"name": "Bitter Poison",
"type": "gear",
"rp": 10
},
{
"name": "Spiteful Poison",
"type": "gear",
"rp": 20
},
{
"name": "Lock Picks",
"type": "gear",
"rp": 10
},
{
"name": "Long Knife",
"type": "gear",
"rp": 5
},
{
"name": "Barbed Javelins",
"type": "gear",
"rp": 3
},
{
"name": "Garrote",
"type": "gear",
"rp": 3
},
{
"name": "Caltrops",
"type": "gear",
"rp": 3
},
{
"name": "Tools Of The Trade",
"type": "gear",
"rp": 9
},
{
"name": "Cloak Of Darkness",
"type": "gear",
"rp": 30
},
{
"name": "Climbing Claws",
"type": "gear",
"rp": 5
},
{
"name": "Remote Refuge",
"type": "property",
"resources": [
{
"name": "Wasteland",
"rp": 20
},
{
"name": "Isolated Manor And Moorland",
"rp": 50
},
{
"name": "Hidden Fortress",
"rp": 100
},
{
"name": "Dark Forest, Cove Or Lonely Mountain",
"rp": 150
},
{
"name": "Safe House",
"rp": 25
}
]
},
{
"name": "Morlin Armor",
"type": "gear",
"resources": [
{
"name": "Light Mail",
"rp": 30
},
{
"name": "Heavy Mail",
"rp": 40
},
{
"name": "Plated Mail",
"rp": 100
}
]
},
{
"name": "Morlin Weapons",
"type": "gear",
"resources": [
{
"name": "+1 speed",
"rp": 15
},
{
"name": "+1 VA",
"rp": 15
},
{
"name": "+1 Power",
"rp": 30
}
]
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,152 +1,155 @@
[
{
"name": "Shoddy Arms",
"rp": 5,
"type": "gear"
},
{
"name": "Dwarven Arms",
"rp": 20,
"type": "gear"
},
{
"name": "Shoddy Crossbow",
"rp": 6,
"type": "gear"
},
{
"name": "Dwarven Arbalest",
"rp": 20,
"type": "gear"
},
{
"name": "Dwarven-made Light Mail",
"rp": 9,
"type": "gear"
},
{
"name": "Dwarven-made Heavy Mail",
"rp": 10,
"type": "gear"
},
{
"name": "Dwarven-made Plated Mail",
"rp": 20,
"type": "gear"
},
{
"name": "Dwarven Mail",
"rp": 100,
"type": "gear"
},
{
"name": "Forge Mask",
"rp": 40,
"type": "gear"
},
{
"name": "Dwarven Shield",
"rp": 20,
"type": "gear"
},
{
"name": "Riding Mount Or Pack Animal",
"rp": 8,
"type": "gear"
},
{
"name": "Clothes",
"rp": 1,
"type": "gear"
},
{
"name": "Traveling Gear",
"rp": 1,
"type": "gear"
},
{
"name": "Sturdy Shoes",
"rp": 1,
"type": "gear"
},
{
"name": "Finery",
"rp": 5,
"type": "gear"
},
{
"name": "Chronicles",
"rp": 15,
"type": "gear"
},
{
"name": "Keg O' Nog",
"rp": 20,
"type": "gear"
},
{
"name": "Small Dwarven House",
"rp": 10,
"type": "property"
},
{
"name": "Large Dwarven House",
"rp": 15,
"type": "property"
},
{
"name": "A Dwarven Hall",
"rp": 30,
"type": "property"
},
{
"name": "A Graybeard's Hold",
"rp": 40,
"type": "property"
},
{
"name": "An Engineer's Hold",
"rp": 45,
"type": "property"
},
{
"name": "A Master Artificer's Hold",
"rp": 60,
"type": "property"
},
{
"name": "A Warden's Hold",
"rp": 75,
"type": "property"
},
{
"name": "A High Captain's Hold",
"rp": 90,
"type": "property"
},
{
"name": "A Prince's Hold",
"rp": 105,
"type": "property"
},
{
"name": "A Workshop",
"rp": 60,
"type": "property"
},
{
"name": "Dwarven Tools",
"rp": 10,
"type": "gear"
},
{
"name": "Shoddy Tools",
"rp": 5,
"type": "gear"
},
{
"name": "Carts And Baggage",
"rp": 15,
"type": "gear"
}
]
{
"stock": "dwarf",
"resources": [
{
"name": "Shoddy Arms",
"rp": 5,
"type": "gear"
},
{
"name": "Dwarven Arms",
"rp": 20,
"type": "gear"
},
{
"name": "Shoddy Crossbow",
"rp": 6,
"type": "gear"
},
{
"name": "Dwarven Arbalest",
"rp": 20,
"type": "gear"
},
{
"name": "Dwarven-made Light Mail",
"rp": 9,
"type": "gear"
},
{
"name": "Dwarven-made Heavy Mail",
"rp": 10,
"type": "gear"
},
{
"name": "Dwarven-made Plated Mail",
"rp": 20,
"type": "gear"
},
{
"name": "Dwarven Mail",
"rp": 100,
"type": "gear"
},
{
"name": "Forge Mask",
"rp": 40,
"type": "gear"
},
{
"name": "Dwarven Shield",
"rp": 20,
"type": "gear"
},
{
"name": "Riding Mount Or Pack Animal",
"rp": 8,
"type": "gear"
},
{
"name": "Clothes",
"rp": 1,
"type": "gear"
},
{
"name": "Traveling Gear",
"rp": 1,
"type": "gear"
},
{
"name": "Sturdy Shoes",
"rp": 1,
"type": "gear"
},
{
"name": "Finery",
"rp": 5,
"type": "gear"
},
{
"name": "Chronicles",
"rp": 15,
"type": "gear"
},
{
"name": "Keg O' Nog",
"rp": 20,
"type": "gear"
},
{
"name": "Small Dwarven House",
"rp": 10,
"type": "property"
},
{
"name": "Large Dwarven House",
"rp": 15,
"type": "property"
},
{
"name": "A Dwarven Hall",
"rp": 30,
"type": "property"
},
{
"name": "A Graybeard's Hold",
"rp": 40,
"type": "property"
},
{
"name": "An Engineer's Hold",
"rp": 45,
"type": "property"
},
{
"name": "A Master Artificer's Hold",
"rp": 60,
"type": "property"
},
{
"name": "A Warden's Hold",
"rp": 75,
"type": "property"
},
{
"name": "A High Captain's Hold",
"rp": 90,
"type": "property"
},
{
"name": "A Prince's Hold",
"rp": 105,
"type": "property"
},
{
"name": "A Workshop",
"rp": 60,
"type": "property"
},
{
"name": "Dwarven Tools",
"rp": 10,
"type": "gear"
},
{
"name": "Shoddy Tools",
"rp": 5,
"type": "gear"
},
{
"name": "Carts And Baggage",
"rp": 15,
"type": "gear"
}
]
}

@ -1,176 +1,179 @@
[
{
"name": "Run Of The Mill Bow",
"type": "gear",
"rp": 5
},
{
"name": "Run Of The Mill Arms",
"type": "gear",
"rp": 5
},
{
"name": "Reinforced Leather",
"type": "gear",
"rp": 3
},
{
"name": "Light Mail",
"type": "gear",
"rp": 6
},
{
"name": "Heavy Mail",
"type": "gear",
"rp": 10
},
{
"name": "Plated Mail",
"type": "gear",
"rp": 20
},
{
"name": "Elven Armor",
"type": "gear",
"resources": [
{
"name": "Gambeson",
"rp": 9
},
{
"name": "Reinforced Leather",
"resources": null,
"rp": 20
},
{
"name": "Light Mail",
"resources": null,
"rp": 30
},
{
"name": "Heavy Mail",
"rp": 40
},
{
"name": "Plated Mail",
"rp": 75
}
]
},
{
"name": "Elven Arms",
"type": "gear",
"rp": 15
},
{
"name": "Elven Bow",
"type": "gear",
"rp": 25
},
{
"name": "Elven Cloak",
"type": "gear",
"rp": 30
},
{
"name": "Elven Steed",
"type": "gear",
"rp": 8
},
{
"name": "Elven Clothes",
"type": "gear",
"rp": 2
},
{
"name": "Elven Shoes",
"type": "gear",
"rp": 1
},
{
"name": "Elven Finery",
"type": "gear",
"rp": 5
},
{
"name": "Elven Rope",
"type": "gear",
"rp": 12
},
{
"name": "Elven Bread",
"type": "gear",
"rp": 10
},
{
"name": "Elven Mirrorwine",
"type": "gear",
"rp": 8
},
{
"name": "Starlight",
"type": "gear",
"rp": 50
},
{
"name": "Tome Of Lore",
"type": "gear",
"rp": 20
},
{
"name": "Elven Instrument",
"type": "gear",
"rp": 6
},
{
"name": "Personal Effects",
"type": "gear",
"rp": 1
},
{
"name": "Elven Smithy",
"type": "property",
"rp": 50
},
{
"name": "Artisan's Shop",
"type": "property",
"rp": 60
},
{
"name": "Skill Tools",
"type": "gear",
"rp": 9
},
{
"name": "Elven Ship",
"type": "gear",
"rp": 80
},
{
"name": "Elven Land",
"type": "property",
"resources": [
{
"name": "Pastoral",
"rp": 20
},
{
"name": "Large Country Manor And Land",
"rp": 50
},
{
"name": "Palace",
"rp": 100
},
{
"name": "A Forest, Bay Or Mountain",
"rp": 150
},
{
"name": "Apartment In The Citadel",
"rp": 25
}
]
}
]
{
"stock": "elf",
"resources": [
{
"name": "Run Of The Mill Bow",
"type": "gear",
"rp": 5
},
{
"name": "Run Of The Mill Arms",
"type": "gear",
"rp": 5
},
{
"name": "Reinforced Leather",
"type": "gear",
"rp": 3
},
{
"name": "Light Mail",
"type": "gear",
"rp": 6
},
{
"name": "Heavy Mail",
"type": "gear",
"rp": 10
},
{
"name": "Plated Mail",
"type": "gear",
"rp": 20
},
{
"name": "Elven Armor",
"type": "gear",
"resources": [
{
"name": "Gambeson",
"rp": 9
},
{
"name": "Reinforced Leather",
"resources": null,
"rp": 20
},
{
"name": "Light Mail",
"resources": null,
"rp": 30
},
{
"name": "Heavy Mail",
"rp": 40
},
{
"name": "Plated Mail",
"rp": 75
}
]
},
{
"name": "Elven Arms",
"type": "gear",
"rp": 15
},
{
"name": "Elven Bow",
"type": "gear",
"rp": 25
},
{
"name": "Elven Cloak",
"type": "gear",
"rp": 30
},
{
"name": "Elven Steed",
"type": "gear",
"rp": 8
},
{
"name": "Elven Clothes",
"type": "gear",
"rp": 2
},