initial commit

pull/1/head
Michael Hansen 4 years ago
parent 8219ebcc54
commit 9def2a15ba
  1. 1
      .gitignore
  2. 22
      Dockerfile
  3. 11
      Gemfile
  4. 71
      Gemfile.lock
  5. 111
      src/app.rb
  6. BIN
      src/data/caliban.ttf
  7. BIN
      src/data/gold.pdf
  8. 1971
      src/data/lifepaths/dwarf.json
  9. 2048
      src/data/lifepaths/elf.json
  10. 11811
      src/data/lifepaths/man.json
  11. 1595
      src/data/lifepaths/orc.json
  12. 1740
      src/data/lifepaths/roden.json
  13. 1172
      src/data/lifepaths/wizard.json
  14. 971
      src/data/lifepaths/wolf.json
  15. 152
      src/data/resources/dwarf.json
  16. 176
      src/data/resources/elf.json
  17. 434
      src/data/resources/man.json
  18. 211
      src/data/resources/orc.json
  19. 139
      src/data/resources/roden.json
  20. 42
      src/data/resources/wolf.json
  21. 2749
      src/data/skills.json
  22. 114
      src/data/starting_stat_pts/dwarf.json
  23. 146
      src/data/starting_stat_pts/elf.json
  24. 90
      src/data/starting_stat_pts/man.json
  25. 98
      src/data/starting_stat_pts/orc.json
  26. 74
      src/data/starting_stat_pts/roden.json
  27. 58
      src/data/starting_stat_pts/wolf.json
  28. 4733
      src/data/traits.json
  29. 230
      src/lib/cache.rb
  30. 46
      src/lib/data.rb
  31. 147
      src/lib/pdf.rb
  32. 9
      src/public/css/bootstrap.min.css
  33. 129
      src/public/css/style.css
  34. BIN
      src/public/fonts/post-mediaeval.ttf
  35. 610
      src/public/js/angular-resource.js
  36. 927
      src/public/js/angular-route.js
  37. 210
      src/public/js/angular.min.js
  38. 9
      src/public/js/bootstrap.min.js
  39. 1018
      src/public/js/burning-classes.js
  40. 226
      src/public/js/burning-modal.js
  41. 335
      src/public/js/burning-serialize.js
  42. 398
      src/public/js/burning-service.js
  43. 140
      src/public/js/burning-util.js
  44. 3446
      src/public/js/burning.js
  45. 6
      src/public/js/jquery-1.10.2.min.js
  46. 5
      src/public/js/server_settings.js
  47. 4116
      src/public/js/ui-bootstrap-tpls-0.11.0.js
  48. 58
      src/views/index.erb
  49. 20
      src/views/partials/choose_appropriate_weapons.erb
  50. 12
      src/views/partials/choose_character.erb
  51. 44
      src/views/partials/choose_stat_penalty.erb
  52. 42
      src/views/partials/choose_trait.erb
  53. 17
      src/views/partials/choose_weapon_of_choice.erb
  54. 38
      src/views/partials/config.erb
  55. 29
      src/views/partials/emotional_attr_questions.erb
  56. 200
      src/views/partials/help.erb
  57. 818
      src/views/partials/main.erb
  58. 27
      src/views/partials/upload_character.erb

1
.gitignore vendored

@ -0,0 +1 @@
.DS_Store

@ -0,0 +1,22 @@
FROM ruby:2.6.3
EXPOSE 7878
ENV HOST=0.0.0.0 PORT=7878 RACK_ENV=development
# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
# to generate Gemfile.lock, run this in service dir:
# $ docker run --rm -v "$PWD":/app -w /app ruby:2.6.3 bundle install
COPY Gemfile Gemfile.lock /app/
RUN bundle install
COPY . /app
WORKDIR /app/src
CMD ["rerun", "-b", "--", "ruby", "./app.rb"]
#CMD ["ruby", "./app.rb"]

@ -0,0 +1,11 @@
source 'https://rubygems.org'
gem 'thin'
gem 'sinatra'
gem 'sinatra-contrib'
gem 'prawn', '2.2.2'
gem 'prawn-templates', '0.1.1'
group :development do
gem 'rerun'
end

@ -0,0 +1,71 @@
GEM
remote: https://rubygems.org/
specs:
Ascii85 (1.0.3)
afm (0.2.2)
backports (3.15.0)
daemons (1.3.1)
eventmachine (1.2.7)
ffi (1.11.1)
hashery (2.1.2)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
multi_json (1.13.1)
mustermann (1.0.3)
pdf-core (0.7.0)
pdf-reader (2.2.0)
Ascii85 (~> 1.0.0)
afm (~> 0.2.1)
hashery (~> 2.0)
ruby-rc4
ttfunk
prawn (2.2.2)
pdf-core (~> 0.7.0)
ttfunk (~> 1.5)
prawn-templates (0.1.1)
pdf-reader (~> 2.0)
prawn (~> 2.2)
rack (2.0.7)
rack-protection (2.0.5)
rack
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
rerun (0.13.0)
listen (~> 3.0)
ruby-rc4 (0.1.5)
ruby_dep (1.5.0)
sinatra (2.0.5)
mustermann (~> 1.0)
rack (~> 2.0)
rack-protection (= 2.0.5)
tilt (~> 2.0)
sinatra-contrib (2.0.5)
backports (>= 2.8.2)
multi_json
mustermann (~> 1.0)
rack-protection (= 2.0.5)
sinatra (= 2.0.5)
tilt (>= 1.3, < 3)
thin (1.7.2)
daemons (~> 1.0, >= 1.0.9)
eventmachine (~> 1.0, >= 1.0.4)
rack (>= 1, < 3)
tilt (2.0.9)
ttfunk (1.5.1)
PLATFORMS
ruby
DEPENDENCIES
prawn (= 2.2.2)
prawn-templates (= 0.1.1)
rerun
sinatra
sinatra-contrib
thin
BUNDLED WITH
1.17.2

@ -0,0 +1,111 @@
require 'sinatra'
require 'sinatra/json'
require 'json'
require_relative 'lib/cache'
require_relative 'lib/pdf'
require_relative 'lib/data'
use Rack::Logger
set :bind, ENV['HOST']
set :port, ENV['PORT']
CACHE = Mu::Cache.new :max_size => 128, :max_time => 30.0
DATA = CharredData.load_data
helpers do
def logger
request.logger
end
end
get '/' do
erb :index
end
get /\/([\w]+)_partial/ do
partial = params['captures'].first
erb "partials/#{partial}".to_sym
end
get '/namegen/:gender' do
if params['gender'] == 'female'
['Ada', 'Belle', 'Carmen', 'Desdemona', 'Edie'].sample
elsif params['gender'] == 'male'
['Agamemnon', 'Beren', 'Cadwalader', 'Dro', 'Edgar'].sample
end
end
get '/skills' do
json DATA[:skills]
end
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
end
get '/starting_stat_pts/:stock' do
if DATA[:stocks].include? params['stock']
json DATA[:stat_pts][params['stock']]
else
404
end
end
get '/resources/:stock' do
if DATA[:stocks].include? params['stock']
json DATA[:resources][params['stock']]
else
404
end
end
post '/charsheet' do
request.body.rewind
raw = request.body.readpartial(16 * 1024)
data = JSON.parse(raw)
key = "char-#{Time.now.strftime('%Y%m%d%H%M%S%L')}-#{rand(1...10000)}"
CACHE.store key, data
"/get_file?file=#{key}&download_name=#{data['name']} Character Sheet.pdf"
end
post '/upload_charfile' do
data = params['charfile']['tempfile'].read
erb '<html><body><pre><%= char %></pre></body></html>', :locals => {:char => data}
end
post '/download_charfile' do
request.body.rewind # in case someone already read it
raw = request.body.readpartial(16 * 1024)
data = JSON.parse(raw)
key = "char-#{Time.now.strftime('%Y%m%d%H%M%S%L')}-#{rand(1...10000)}"
CACHE.store key, data
"/get_file?file=#{key}&download_name=#{data['name']} Character Sheet.char"
end
get '/get_file' do
data = nil
if params['download_name'].match(/\.pdf$/)
content_type 'application/pdf'
data = CACHE.delete(params['file'])
if data
cs = CharSheet.new(data)
data = cs.render(logger)
end
else
content_type 'application/octet-stream'
data = JSON.dump CACHE.delete(params['file'])
end
attachment params['download_name']
data
end

Binary file not shown.

Binary file not shown.

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

@ -0,0 +1,971 @@
{
"Wild Pack Setting": {
"Born To The Pack": {
"time": 1,
"res": 0,
"leads": [
"Captive"
],
"skills": [
[
2,
"Howling"
],
[
2,
"General"
]
],
"traits": [
2
],
"common_traits": [
"Crushing Jaws",
"Deep Fur",
"Great Lupine Form",
"Lupine Intellect",
"Long-legged",
"Wolf's Eyes",
"Wolf's Snout",
"Woodland Ear"
],
"key_leads": [
"Captive Subsetting"
]
},
"Yearling": {
"time": 1,
"res": 3,
"stat": [
[
1,
"p"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
8,
"Pack Etiquette",
"Stealthy",
"Wolfish Hunting",
"Tracking",
"Foraging",
"Brawling"
]
],
"traits": [
1
],
"requires": "Wolves taking this lifepath must be 1 year old.",
"requires_expr": [
"+and",
[
"+age_less_than",
1.5
],
[
"born to the pack",
"last wolf"
]
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
},
"Hunter": {
"time": 1,
"res": 3,
"stat": [
[
1,
"p"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
7,
"Wolfish Hunting",
"Hoof-wise",
"Intimidation",
"Brawling",
"Begging",
"Scent-wise"
]
],
"traits": [
1,
"Submissive"
],
"requires_expr": [
"born to the pack",
"last wolf"
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
},
"Dominant": {
"time": 1,
"res": 6,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
5,
"Intimidation",
"Command",
"Nursing",
"Brawling"
]
],
"traits": [
1,
"Dominant"
],
"requires": "Yearling, Aunt, Unce, or Last Wolf.",
"note": "Only female dominants of 3 years or older may take the Nursing skill.",
"requires_expr": [
"yearling",
"aunt",
"uncle",
"last wolf"
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
},
"Aunt": {
"time": 0.5,
"res": 3,
"stat": [
[
1,
"pm"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
4,
"Nursing",
"Pup-wise",
"Scavenging",
"Begging"
]
],
"traits": [
1,
"Submissive"
],
"requires_expr": [
"+and",
[
"born to the pack",
"last wolf"
],
[
"+sex",
"female"
]
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
},
"Uncle": {
"time": 0.5,
"res": 3,
"stat": [
[
1,
"pm"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
4,
"Rearing",
"Pup-wise",
"Scavenging",
"Begging"
]
],
"traits": [
1,
"Submissive"
],
"requires_expr": [
"+and",
[
"born to the pack",
"last wolf"
],
[
"+sex",
"male"
]
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
},
"Elder": {
"time": 2,
"res": 3,
"stat": [
[
1,
"m"
]
],
"leads": [
"Outcast"
],
"skills": [
[
7,
"Begging",
"Man-wise",
"Orc-wise",
"Elf-wise",
"Forest-wise"
]
],
"traits": [
1,
"Submissive"
],
"requires_expr": [
"+and",
[
"born to the pack",
"last wolf"
],
[
"+age_greater_than",
8.5
]
],
"key_leads": [
"Outcast Subsetting"
]
},
"Last Wolf": {
"time": 0.5,
"res": 2,
"stat": [
[
1,
"m"
]
],
"leads": [
"Captive",
"Outcast"
],
"skills": [
[
2,
"Begging",
"Pack Etiquette"
]
],
"traits": [
2,
"Submissive",
"Stained"
],
"key_leads": [
"Captive Subsetting",
"Outcast Subsetting"
]
}
},
"Slave To The Legion Setting": {
"Born To The Legion": {
"time": 1,
"res": 0,
"leads": [
"Captive"
],
"skills": [
[
2,
"Howling"
],
[
2,
"General"
]
],
"traits": [
1,
"Vile Language",
"Demented"
],
"common_traits": [
"Crushing Jaws",
"Deep Fur",
"Great Lupine Form",
"Lupine Intellect",
"Long-legged",
"Wolf's Eyes",
"Wolf's Snout",
"Woodland Ear"
],
"key_leads": [
"Captive Subsetting"
]
},
"Caged And Beaten": {
"time": 0.5,
"res": 0,
"leads": [
"Captive"
],
"skills": [
[
3,
"Pack Etiquette",
"Begging",
"Cage-wise"
]
],
"traits": [
2,
"Submissive",
"Tasting The Lash",
"Deranged"
],
"key_leads": [
"Captive Subsetting"
]
},
"Shadow-chaser": {
"time": 1,
"res": 2,
"stat": [
[
1,
"p"
]
],
"skills": [
[
8,
"Stealthy",
"Tracking",
"Trail-wise",
"Orc-wise",
"Scavenging",
"Intimidation",
"Rider Training",
"Begging"
]
],
"traits": [
1,
"Submissive",
"Tasting The Lash"
]
},
"Wayward": {
"time": 0.5,
"res": 2,
"stat": [
[
1,
"m"
]
],
"leads": [
"Outcast"
],
"skills": [
[
6,
"Wolfish Hunting",
"Foraging",
"Brawling",
"Stealthy",
"Howling",
"Escape Artist"
]
],
"traits": [
1
],
"requires": "Shadow-Chaser",
"requires_expr": [
"shadow-chaser"
],
"key_leads": [
"Outcast Subsetting"
]
},
"Bitch": {
"time": 1,
"res": 4,
"skills": [
[
5,
"Nursing",
"Rearing",
"Pup-wise",
"Scavenging",
"Begging"
]
],
"traits": [
1,
"Submissive"
],
"requires": "Must be at least 3 years old.",
"requires_expr": [
"+and",
[
"+age_greater_than",
2.5
],
[
"+sex",
"female"
]
]
},
"Howling Beast": {
"time": 1,
"res": 1,
"stat": [
[
1,
"p"
]
],
"skills": [
[
7,
"Rider Training",
"Mounted Combat",
"Savage Attack",
"Intimidation"
]
],
"traits": [
1,
"Howl Of Doom"
],
"requires": "Shadow-Chaser",
"requires_expr": [
"shadow-chaser"
]
},
"Black Destroyer": {
"time": 2,
"res": 2,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"skills": [
[
4,
"Rider Training",
"Mounted Combat",
"Savage Attack"
]
],
"traits": [
2,
"Intense Hatred",
"Great Cunning",
"Fearless",
"Cold-blooded",
"Brutality",
"Dominant",
"Submissive"
],
"requires": "Howling Beast or Ebon Tyrant",
"requires_expr": [
"howling beast",
"ebon tyrant"
]
},
"Ebon Tyrant": {
"time": 2,
"res": 6,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"skills": [
[
5,
"Conspicuous",
"Command",
"Skirmish Tactics",
"Strategy"
]
],
"traits": [
2,
"Dominant"
],
"requires": "Shadow-Chaser or Black Destroyer",
"requires_expr": [
"shadow-chaser",
"black destroyer"
]
},
"Dark Friend": {
"time": 3,
"res": 4,
"stat": [
[
1,
"m"
]
],
"leads": [
"Outcast"
],
"skills": [
[
5,
"Stealthy",
"Tracking",
"Brawling",
"Rituals-wise",
"Poisons-wise"
]
],
"traits": [
1,
"Obedient",
"Loyal",
"Fearless"
],
"requires": "Caged and Beaten",
"requires_expr": [
"caged and beaten"
],
"key_leads": [
"Outcast Subsetting"
]
}
},
"Outcast Subsetting": {
"Lone Wolf": {
"time": 1,
"res": 3,
"stat": [
[
1,
"m"
]
],
"leads": [
"Wild Pack",
"Captive",
"Spirit Hunter",
"Ghost Of The Deeping Wood"
],
"skills": [
[
4,
"Territory-wise",
"Pack-wise",
"Scavenging"
]
],
"traits": [
1,
"Wanderlust"
],
"requires": "Yearling, Last Wolf, Captured, Wandering Lost, Ancient Journeyer, Wayward, or Dark Friend.",
"requires_expr": [
"yearling",
"last wolf",
"captured and broken",
"wandering lost",
"ancient journeyer",
"wayward",
"dark friend"
],
"key_leads": [
"Wild Pack Setting",
"Captive Subsetting",
"Spirit Hunter Subsetting",
"Ghost Of The Deeping Wood Subsetting"
]
},
"Scavenger": {
"time": 1,
"res": 3,
"leads": [
"Legion",
"Wild Pack",
"Captive"
],
"skills": [
[
5,
"Scent-wise",
"Village-wise",
"Dog-wise",
"Scavenging"
]
],
"traits": [
1,
"Wolfish Scavenger"
],
"requires": "Lone Wolf, Captured and Broken, or Captured and Beaten",
"requires_expr": [
"lone wolf",
"captured and broken",
"captured and broken"
],
"key_leads": [
"Slave To The Legion Setting",
"Wild Pack Setting",
"Captive Subsetting"
]
}
},
"Captive Subsetting": {
"Captured And Broken": {
"time": 0.5,
"res": 3,
"leads": [
"Legion",
"Outcast"
],
"skills": [
[
3,
"Begging",
"Cage-wise",
"Man-wise"
]
],
"traits": [
3,
"Broken Wolf",
"Submissive"
],
"key_leads": [
"Slave To The Legion Setting",
"Outcast Subsetting"
]
}
},
"Spirit Hunter Subsetting": {
"Spirit-chaser": {
"time": 1,
"res": 3,
"stat": [
[
1,
"p"
]
],
"leads": [
"Outcast",
"Captive"
],
"skills": [
[
5,
"Primal Bark",
"Wolfish Hunting",
"The Way Of The First Hunter"
]
],
"traits": [
1
],
"requires": "Lone Wolf and the Chosen Wolf trait",
"requires_expr": [
"+and",
[
"lone wolf"
],
[
"+trait",
"chosen wolf"
]
],
"key_leads": [
"Outcast Subsetting",
"Captive Subsetting"
]
},
"Spirit-howler": {
"time": 1,
"res": 4,
"stat": [
[
1,
"pm"
]
],
"skills": [
[
3,
"Ancestral Jaw"
]
],
"traits": [
1
],
"requires": "Spirit-Chaser",
"requires_expr": [
"spirit-chaser"
]
},
"Spirit-hunter": {
"time": 2,
"res": 6,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"leads": [
"Ghost Of The Deeping Wood"
],
"skills": [
[
3,
"Grandfather's Song"
]
],
"traits": [
1,
"Spirit Nose"
],
"requires": "Spirit-Howler",
"requires_expr": [
"spirit-howler"
],
"key_leads": [
"Ghost Of The Deeping Wood Subsetting"
]
}
},
"Ghost Of The Deeping Wood Subsetting": {
"Wandering Lost": {
"time": 0.5,
"res": 0,
"stat": [
[
1,
"m"
]
],
"leads": [
"Spirit Hunter",
"Outcast"
],
"skills": [
[
2,
"Nature Of All Things"
]
],
"traits": [
1
],
"requires": "Last Wolf and Lone Wolf",
"requires_expr": [
"+and",
[
"last wolf"
],
[
"lone wolf"
]
],
"key_leads": [
"Spirit Hunter Subsetting",
"Outcast Subsetting"
]
},
"Dire Haunt": {
"time": 1,
"res": 20,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"skills": [
[
3,
"Tongue Of The Ancient One"
]
],
"traits": [
2
],
"requires": "Wandering Lost",
"requires_expr": [
"wandering lost"
]
},
"Ancient Journeyer": {
"time": 0.5,
"res": 0,
"stat": [
[
1,
"m"
]
],
"leads": [
"Spirit Hunter",
"Outcast"
],
"skills": [
[
3,
"Ancient Ways"
]
],
"traits": [
1
],
"requires": "Last Wolf and Lone Wolf",
"requires_expr": [
"+and",
[
"last wolf"
],
[
"lone wolf"
]
],
"key_leads": [
"Spirit Hunter Subsetting",
"Outcast Subsetting"
]
},
"Fell Ancient": {
"time": 2,
"res": 15,
"stat": [
[
1,
"m"
],
[
1,
"p"
]
],
"skills": [
[
3,
"Ancient Ways"
]
],
"traits": [
2,
"Reclusive",
"Calmly Paranoid",
"Odor Of Spirits"
],
"requires": "Ancient Journeyer",
"requires_expr": [
"ancient journeyer"
]
},
"Ghost Of The Wood": {
"time": 2,
"res": 10,
"stat": [
[
2,
"m"
]
],
"skills": [
[
6,
"Wolf-wise",
"Spirit-hunter-wise",
"Legion-wise",
"Path-wise",
"River-wise",
"Pack-wise"
],
[
1,
"General"
]
],
"traits": [
2,
"Preternaturally Calm",
"Watchful",
"Piercing Gaze",
"Stink Of The Ancient"
]
}
}
}

@ -0,0 +1,152 @@
[
{
"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"
}
]

@ -0,0 +1,176 @@
[
{
"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
},
{