From 9def2a15ba39314203e0982a86b2795b02461b40 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 11 Jul 2019 22:23:12 -0700 Subject: [PATCH] initial commit --- .gitignore | 1 + Dockerfile | 22 + Gemfile | 11 + Gemfile.lock | 71 + src/app.rb | 111 + src/data/caliban.ttf | Bin 0 -> 46160 bytes src/data/gold.pdf | Bin 0 -> 296401 bytes src/data/lifepaths/dwarf.json | 1971 +++ src/data/lifepaths/elf.json | 2048 +++ src/data/lifepaths/man.json | 11811 ++++++++++++++++ src/data/lifepaths/orc.json | 1595 +++ src/data/lifepaths/roden.json | 1740 +++ src/data/lifepaths/wizard.json | 1172 ++ src/data/lifepaths/wolf.json | 971 ++ src/data/resources/dwarf.json | 152 + src/data/resources/elf.json | 176 + src/data/resources/man.json | 434 + src/data/resources/orc.json | 211 + src/data/resources/roden.json | 139 + src/data/resources/wolf.json | 42 + src/data/skills.json | 2749 ++++ src/data/starting_stat_pts/dwarf.json | 114 + src/data/starting_stat_pts/elf.json | 146 + src/data/starting_stat_pts/man.json | 90 + src/data/starting_stat_pts/orc.json | 98 + src/data/starting_stat_pts/roden.json | 74 + src/data/starting_stat_pts/wolf.json | 58 + src/data/traits.json | 4733 +++++++ src/lib/cache.rb | 230 + src/lib/data.rb | 46 + src/lib/pdf.rb | 147 + src/public/css/bootstrap.min.css | 9 + src/public/css/style.css | 129 + src/public/fonts/post-mediaeval.ttf | Bin 0 -> 113072 bytes src/public/js/angular-resource.js | 610 + src/public/js/angular-route.js | 927 ++ src/public/js/angular.min.js | 210 + src/public/js/bootstrap.min.js | 9 + src/public/js/burning-classes.js | 1018 ++ src/public/js/burning-modal.js | 226 + src/public/js/burning-serialize.js | 335 + src/public/js/burning-service.js | 398 + src/public/js/burning-util.js | 140 + src/public/js/burning.js | 3446 +++++ src/public/js/jquery-1.10.2.min.js | 6 + src/public/js/server_settings.js | 5 + src/public/js/ui-bootstrap-tpls-0.11.0.js | 4116 ++++++ src/views/index.erb | 58 + .../partials/choose_appropriate_weapons.erb | 20 + src/views/partials/choose_character.erb | 12 + src/views/partials/choose_stat_penalty.erb | 44 + src/views/partials/choose_trait.erb | 42 + .../partials/choose_weapon_of_choice.erb | 17 + src/views/partials/config.erb | 38 + .../partials/emotional_attr_questions.erb | 29 + src/views/partials/help.erb | 200 + src/views/partials/main.erb | 818 ++ src/views/partials/upload_character.erb | 27 + 58 files changed, 44052 insertions(+) create mode 100644 .gitignore create mode 100755 Dockerfile create mode 100755 Gemfile create mode 100755 Gemfile.lock create mode 100755 src/app.rb create mode 100755 src/data/caliban.ttf create mode 100755 src/data/gold.pdf create mode 100755 src/data/lifepaths/dwarf.json create mode 100755 src/data/lifepaths/elf.json create mode 100755 src/data/lifepaths/man.json create mode 100755 src/data/lifepaths/orc.json create mode 100755 src/data/lifepaths/roden.json create mode 100755 src/data/lifepaths/wizard.json create mode 100755 src/data/lifepaths/wolf.json create mode 100755 src/data/resources/dwarf.json create mode 100755 src/data/resources/elf.json create mode 100755 src/data/resources/man.json create mode 100755 src/data/resources/orc.json create mode 100755 src/data/resources/roden.json create mode 100755 src/data/resources/wolf.json create mode 100755 src/data/skills.json create mode 100755 src/data/starting_stat_pts/dwarf.json create mode 100755 src/data/starting_stat_pts/elf.json create mode 100755 src/data/starting_stat_pts/man.json create mode 100755 src/data/starting_stat_pts/orc.json create mode 100755 src/data/starting_stat_pts/roden.json create mode 100755 src/data/starting_stat_pts/wolf.json create mode 100755 src/data/traits.json create mode 100755 src/lib/cache.rb create mode 100755 src/lib/data.rb create mode 100755 src/lib/pdf.rb create mode 100755 src/public/css/bootstrap.min.css create mode 100755 src/public/css/style.css create mode 100755 src/public/fonts/post-mediaeval.ttf create mode 100755 src/public/js/angular-resource.js create mode 100755 src/public/js/angular-route.js create mode 100755 src/public/js/angular.min.js create mode 100755 src/public/js/bootstrap.min.js create mode 100755 src/public/js/burning-classes.js create mode 100755 src/public/js/burning-modal.js create mode 100755 src/public/js/burning-serialize.js create mode 100755 src/public/js/burning-service.js create mode 100755 src/public/js/burning-util.js create mode 100755 src/public/js/burning.js create mode 100755 src/public/js/jquery-1.10.2.min.js create mode 100755 src/public/js/server_settings.js create mode 100755 src/public/js/ui-bootstrap-tpls-0.11.0.js create mode 100755 src/views/index.erb create mode 100755 src/views/partials/choose_appropriate_weapons.erb create mode 100755 src/views/partials/choose_character.erb create mode 100755 src/views/partials/choose_stat_penalty.erb create mode 100755 src/views/partials/choose_trait.erb create mode 100755 src/views/partials/choose_weapon_of_choice.erb create mode 100755 src/views/partials/config.erb create mode 100755 src/views/partials/emotional_attr_questions.erb create mode 100755 src/views/partials/help.erb create mode 100755 src/views/partials/main.erb create mode 100755 src/views/partials/upload_character.erb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..5376d77 --- /dev/null +++ b/Dockerfile @@ -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"] \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100755 index 0000000..5228531 --- /dev/null +++ b/Gemfile @@ -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 \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100755 index 0000000..3c6664b --- /dev/null +++ b/Gemfile.lock @@ -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 diff --git a/src/app.rb b/src/app.rb new file mode 100755 index 0000000..2088f0c --- /dev/null +++ b/src/app.rb @@ -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 '
<%= char %>
', :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 \ No newline at end of file diff --git a/src/data/caliban.ttf b/src/data/caliban.ttf new file mode 100755 index 0000000000000000000000000000000000000000..63d12353cd2f2edb265a42fdf8d7f66b6b23ee82 GIT binary patch literal 46160 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%0A^#zoJ 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 Lhd=n1f%y6V_YCRQ literal 0 HcmV?d00001 diff --git a/src/data/gold.pdf b/src/data/gold.pdf new file mode 100755 index 0000000000000000000000000000000000000000..29b834ecfe1b6fa53d6d9153f059f693e5b1a6b9 GIT binary patch literal 296401 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 XRG(37hjE_hlVzn(KmXhqH9!3qI@Nts literal 0 HcmV?d00001 diff --git a/src/data/lifepaths/dwarf.json b/src/data/lifepaths/dwarf.json new file mode 100755 index 0000000..8383906 --- /dev/null +++ b/src/data/lifepaths/dwarf.json @@ -0,0 +1,1971 @@ +{ + "Clansman Setting": { + "Born Clansman": { + "time": 20, + "res": 10, + "leads": [ + "Guilder" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Accustomed To The Dark", + "Bearded", + "Greed", + "Oathsworn", + "Shaped From Earth And Stone", + "Stout", + "Tough" + ], + "key_leads": [ + "Guilder Setting" + ] + }, + "Tender": { + "time": 20, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Host" + ], + "skills": [ + [ + 5, + "Farming", + "Crop-wise", + "Hills-wise" + ] + ], + "traits": [ + 2, + "Cursing" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting" + ] + }, + "Herder": { + "time": 15, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Host" + ], + "skills": [ + [ + 5, + "Animal Husbandry", + "Flock-wise", + "Fence Building", + "Climbing" + ] + ], + "traits": [ + 2, + "Booming Voice", + "Affinity For Sheep And Goats" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting" + ] + }, + "Tinkerer": { + "time": 35, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Guilder", + "Outcast" + ], + "skills": [ + [ + 4, + "Stuff-wise", + "Mending", + "Scavenging" + ] + ], + "traits": [ + 2, + "Curious", + "Tinkerer" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Outcast Subsetting" + ] + }, + "Delver": { + "time": 20, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Host" + ], + "skills": [ + [ + 4, + "Tunnel-wise", + "Gas Pocket-wise", + "Excavation" + ] + ], + "traits": [ + 1, + "Deep Sense" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting" + ] + }, + "Miller": { + "time": 30, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Guilder", + "Host" + ], + "skills": [ + [ + 6, + "Grain Appraisal", + "Miller", + "Mending", + "Brewer", + "Grain-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting" + ] + }, + "Brewer": { + "time": 40, + "res": 40, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Host", + "Outcast" + ], + "skills": [ + [ + 5, + "Beer Appraisal", + "Nogger", + "Miller", + "Beer-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Miller, Longbeard, Seneschal, Captain or Drunk", + "requires_expr": [ + "miller", + "longbeard", + "seneschal", + "captain", + "drunk" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting", + "Dwarven Outcast Subsetting" + ] + }, + "Foreman": { + "time": 35, + "res": 25, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Host", + "Artificer" + ], + "skills": [ + [ + 5, + "Ore-wise", + "Vein-wise", + "Engineering" + ] + ], + "traits": [ + 1 + ], + "requires": "Delver, Artificer's Ardent or Engineer", + "requires_expr": [ + "delver", + "artificer setting:ardent", + "engineer" + ], + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting", + "Artificer Setting" + ] + }, + "Husband/wife": { + "time": 70, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Guilder", + "Host", + "Outcast" + ], + "skills": [ + [ + 5, + "Clan-wise", + "Family-wise", + "Haggling", + "Soothing Platitudes" + ] + ], + "traits": [ + 2, + "Dispute-settler", + "Pragmatic Outlook" + ], + "restriction": "husband/wife cannot be the character's second lifepath", + "key_leads": [ + "Guilder Setting", + "Dwarven Host Subsetting", + "Dwarven Outcast Subsetting" + ] + }, + "Longbeard": { + "time": 77, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Host", + "Outcast" + ], + "skills": [ + [ + 6, + "Coarse Persuasion", + "Ugly Truth", + "Guilder-wise", + "Host-wise" + ] + ], + "traits": [ + 2, + "Folksy Wisdom", + "Oathswearer" + ], + "requires": "Foreman, Graybeard, Artificer, Trader, Seneschal, Adventurer or Husband/Wife", + "requires_expr": [ + "foreman", + "graybeard", + "artificer", + "trader", + "seneschal", + "adventurer", + "husband/wife" + ], + "key_leads": [ + "Dwarven Host Subsetting", + "Dwarven Outcast Subsetting" + ] + } + }, + "Guilder Setting": { + "Born Guilder": { + "time": 21, + "res": 5, + "leads": [ + "Clansman" + ], + "skills": [ + [ + 4, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Accustomed To The Dark", + "Bearded", + "Greed", + "Oathsworn", + "Shaped From Earth And Stone", + "Stout", + "Tough" + ], + "key_leads": [ + "Clansman Setting" + ] + }, + "Wordbearer": { + "time": 15, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Clansman", + "Host" + ], + "skills": [ + [ + 5, + "Hold-wise", + "Rumour-wise", + "Oratory", + "Clan History" + ] + ], + "traits": [ + 1, + "Quirky", + "Iron Memory", + "Quick-step" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Host Subsetting" + ] + }, + "Hauler": { + "time": 10, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Clansman", + "Host" + ], + "skills": [ + [ + 5, + "Hauling", + "Wagon-wise", + "Cargo-wise", + "Road-wise" + ] + ], + "traits": [ + 2, + "Lifting Heavy Things" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Host Subsetting" + ] + }, + "Carter": { + "time": 20, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Clansman", + "Outcast" + ], + "skills": [ + [ + 5, + "Animal Husbandry", + "Driving", + "Mending", + "Mule-wise" + ] + ], + "traits": [ + 1, + "Patient", + "Iron Nose" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Outcast Subsetting" + ] + }, + "Hawker": { + "time": 15, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Clansman", + "Outcast", + "Host" + ], + "skills": [ + [ + 6, + "Inconspicuous", + "Conspicuous", + "Streetwise", + "Haggling", + "Spiel-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Apprentice": { + "time": 15, + "res": 20, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Clansman", + "Artificer" + ], + "skills": [ + [ + 4, + "Carving", + "Tanner", + "Carpentry", + "Scutwork-wise" + ] + ], + "traits": [ + 1, + "Seen Not Heard" + ], + "key_leads": [ + "Clansman Setting", + "Artificer Setting" + ] + }, + "Journeyman": { + "time": 25, + "res": 25, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Clansman", + "Host", + "Artificer" + ], + "skills": [ + [ + 7, + "Haggling", + "Reputation-wise", + "Cartwright", + "Mending", + "Black Metal Artifice" + ] + ], + "traits": [ + 1, + "Hungry" + ], + "requires": "Apprentice or any Ardent lifepath", + "requires_expr": [ + "apprentice", + "ardent" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Host Subsetting", + "Artificer Setting" + ] + }, + "Craftsman": { + "time": 45, + "res": 45, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Clansman", + "Artificer" + ], + "skills": [ + [ + 4, + "Appraisal", + "Shipwright", + "Artificer-wise" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Journeyman, Artificer, Artillerist or Engineer", + "requires_expr": [ + "journeyman", + "artificer", + "artillerist", + "engineer" + ], + "key_leads": [ + "Clansman Setting", + "Artificer Setting" + ] + }, + "Trader": { + "time": 45, + "res": 70, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Clansman", + "Outcast" + ], + "skills": [ + [ + 7, + "Stentorious Debate", + "Shrewd Appraisal", + "Haggling", + "Persuasion" + ] + ], + "traits": [ + 1 + ], + "requires": "Hawker, Journeyman, Adventurer or Husband/Wife", + "requires_expr": [ + "hawker", + "journeyman", + "adventurer", + "husband/wife" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Outcast Subsetting" + ] + } + }, + "Artificer Setting": { + "Born Artificer": { + "time": 20, + "res": 15, + "leads": [ + "Clansman" + ], + "skills": [ + [ + 2, + "Dwarven Rune Script" + ], + [ + 3, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Accustomed To The Dark", + "Bearded", + "Greed", + "Oathsworn", + "Shaped From Earth And Stone", + "Stout", + "Tough" + ], + "key_leads": [ + "Clansman Setting" + ] + }, + "Ardent": { + "time": 21, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Clansman", + "Noble", + "Host", + "Guilder" + ], + "skills": [ + [ + 4, + "Firebuilding", + "Soothing Platitudes", + "Soot-wise" + ] + ], + "traits": [ + 2, + "Humility", + "Hard Work" + ], + "key_leads": [ + "Clansman Setting", + "Dwarven Noble Setting", + "Dwarven Host Subsetting", + "Guilder Setting" + ] + }, + "Tyro Artificer": { + "time": 21, + "res": 20, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Host", + "Guilder" + ], + "skills": [ + [ + 5, + "Black Metal Artifice", + "Mending", + "Dwarven Art-wise" + ] + ], + "traits": [ + 1, + "Determined" + ], + "requires": "Artificer's Ardent or Journeyman", + "requires_expr": [ + "artificer setting:ardent", + "journeyman" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting", + "Guilder Setting" + ] + }, + "Artificer": { + "time": 30, + "res": 35, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 8, + "Stone Artifice", + "Etching", + "White Metal Artifice", + "Gem Artifice" + ] + ], + "traits": [ + 1, + "Stolid" + ], + "requires": "Tyro or Craftsman", + "requires_expr": [ + "tyro artificer", + "craftsman" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Mask Bearer": { + "time": 55, + "res": 50, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Host", + "Noble" + ], + "skills": [ + [ + 6, + "Jargon", + "Fire And Steel-wise", + "War Art" + ] + ], + "traits": [ + 1 + ], + "requires": "Artificer", + "requires_expr": [ + "artificer" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting", + "Dwarven Noble Setting" + ] + }, + "Master Of Arches": { + "time": 75, + "res": 75, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 8, + "Lithography", + "Sculpture", + "Hallmaster", + "Symbology", + "Etiquette" + ] + ], + "traits": [ + 2, + "Confident", + "Patient" + ], + "requires": "Artificer", + "requires_expr": [ + "artificer" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Master Of Forges": { + "time": 75, + "res": 75, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 6, + "Forge Artifice", + "Appraisal", + "Engineering", + "Command", + "Maker's Mark-wise" + ] + ], + "traits": [ + 1, + "Meticulous", + "Estimation" + ], + "requires": "Mask Bearer", + "requires_expr": [ + "mask bearer" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Master Engraver": { + "time": 100, + "res": 60, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 4, + "Reason Of Old Stone", + "Stone-wise", + "Mountain-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Master of Arches", + "requires_expr": [ + "master of arches" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + } + }, + "Dwarven Noble Setting": { + "Born Noble": { + "time": 21, + "res": 10, + "leads": [ + "Guilder", + "Artificer" + ], + "skills": [ + [ + 2, + "Dwarven Rune Script" + ], + [ + 4, + "General" + ] + ], + "traits": [ + 2, + "Dvergar" + ], + "common_traits": [ + "Accustomed To The Dark", + "Bearded", + "Greed", + "Oathsworn", + "Shaped From Earth And Stone", + "Stout", + "Tough" + ], + "key_leads": [ + "Guilder Setting", + "Artificer Setting" + ] + }, + "Abecedart": { + "time": 20, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Artificer" + ], + "skills": [ + [ + 4, + "Chronology Of Kings", + "Etiquette", + "Obscure Text-wise" + ] + ], + "traits": [ + 1, + "Know It All" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Artificer Setting" + ] + }, + "Ardent": { + "time": 25, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Guilder", + "Artificer", + "Outcast" + ], + "skills": [ + [ + 4, + "Sing", + "Soothing Platitudes", + "Accounting", + "Whispered Secrets-wise" + ] + ], + "traits": [ + 2, + "Humility In The Face Of Your Betters" + ], + "key_leads": [ + "Guilder Setting", + "Artificer Setting", + "Dwarven Outcast Subsetting" + ] + }, + "Axe Bearer": { + "time": 20, + "res": 25, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 8, + "Axe", + "Armor Training", + "Shield Training", + "Formation Fighting", + "Throwing" + ] + ], + "traits": [ + 1, + "Proud" + ], + "requires": "Noble Ardent or Banner Bearer", + "requires_expr": [ + "dwarven noble setting:ardent", + "banner bearer" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Chronicler": { + "time": 50, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Host", + "Guilder", + "Artificer" + ], + "skills": [ + [ + 9, + "Illuminations", + "Ancient History", + "Clan-wise", + "Dwarf-wise", + "Poetry", + "Cartography", + "Etiquette", + "Symbology", + "Oath-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Abecedart, Khirurgeon or Graybeard", + "requires_expr": [ + "abecedart", + "khirurgeon", + "graybeard" + ], + "key_leads": [ + "Dwarven Host Subsetting", + "Guilder Setting", + "Artificer Setting" + ] + }, + "Seneschal": { + "time": 55, + "res": 50, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Host", + "Guilder" + ], + "skills": [ + [ + 5, + "Etiquette", + "Command", + "Estate Management", + "Hold-wise" + ] + ], + "traits": [ + 1, + "Practical" + ], + "requires": "Trader, Longbeard, Quartermaster, Chronicler, Khirurgeon or Graybeard", + "requires_expr": [ + "trader", + "longbeard", + "quartermaster", + "chronicler", + "khirurgeon", + "graybeard" + ], + "key_leads": [ + "Dwarven Host Subsetting", + "Guilder Setting" + ] + }, + "Treasurer": { + "time": 75, + "res": 100, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 6, + "Accounting", + "Etiquette", + "Treasure-wise", + "Administration" + ] + ], + "traits": [ + 2, + "Dangerous Obsession", + "Rainman" + ], + "requires": "Seneschal, Artificer or Warden", + "requires_expr": [ + "seneschal", + "artificer", + "warden" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "High Captain": { + "time": 75, + "res": 75, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 5, + "Command", + "Strategy", + "Conspicuous" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 2, + "Muttering", + "Stentorious Voice" + ], + "requires": "Noble Axe Bearer and either Captain or Warden", + "requires_expr": [ + "+and", + [ + "dwarven noble setting:axe bearer" + ], + [ + "captain", + "warden" + ] + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + }, + "Prince": { + "time": 100, + "res": 200, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Host" + ], + "skills": [ + [ + 8, + "Conspicuous", + "Etiquette", + "Intimidation", + "Oratory", + "Command", + "Burden Of The Crown-wise" + ] + ], + "traits": [ + 2, + "Grumbling", + "Galvanizing Presence", + "Baleful Stare" + ], + "requires": "Born Noble and Noble Axe Bearer", + "requires_expr": [ + "+and", + [ + "born noble" + ], + [ + "dwarven noble setting:axe bearer" + ] + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting" + ] + } + }, + "Dwarven Host Subsetting": { + "Foot Soldier": { + "time": 10, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Clansman", + "Guilder" + ], + "skills": [ + [ + 6, + "Foraging", + "Brawling", + "Hammer", + "Armor Training", + "Shield Training", + "Cadence-wise" + ] + ], + "traits": [ + 1, + "Salt Of The Earth" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Clansman Setting", + "Guilder Setting" + ] + }, + "Arbalester": { + "time": 12, + "res": 12, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Clansman", + "Guilder" + ], + "skills": [ + [ + 5, + "Crossbow", + "Mending", + "Fletcher", + "Artillery Hand", + "Windage-wise" + ] + ], + "traits": [ + 1, + "Squinty" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Clansman Setting", + "Guilder Setting" + ] + }, + "Banner Bearer": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Clansman", + "Guilder" + ], + "skills": [ + [ + 4, + "Conspicuous", + "Banner-wise", + "Intimidation" + ] + ], + "traits": [ + 2, + "Resigned (To Death)", + "Obsessive" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Clansman Setting", + "Guilder Setting" + ] + }, + "Horncaller": { + "time": 7, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Clansman", + "Guilder" + ], + "skills": [ + [ + 5, + "Links", + "Conspicuous", + "Cadence-wise", + "Suicidal Bravery-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Clansman Setting", + "Guilder Setting" + ] + }, + "Axe Bearer": { + "time": 15, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Noble" + ], + "skills": [ + [ + 9, + "Foraging", + "Axe", + "Conspicuous", + "Intimidation", + "Armor Training", + "Shield Training", + "Formation Fighting", + "Throwing" + ] + ], + "traits": [ + 1, + "Swaggering" + ], + "requires": "Noble Ardent, Graybeard or Banner Bearer", + "requires_expr": [ + "dwarven noble setting:ardent", + "graybeard", + "banner bearer" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Dwarven Noble Setting" + ] + }, + "Graybeard": { + "time": 20, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Noble" + ], + "skills": [ + [ + 5, + "Intimidation", + "Field Dressing", + "Command", + "Campaign-wise" + ] + ], + "traits": [ + 2, + "Chuffing", + "Oddly Likeable" + ], + "requires": "Axe Bearer, Longbeard or three Host lifepaths", + "requires_expr": [ + "+or", + [ + "axe bearer" + ], + [ + "longbeard" + ], + [ + "+has_n_lifepaths_in", + 3, + "dwarven host subsetting:foot soldier", + "dwarven host subsetting:arbalester", + "dwarven host subsetting:banner bearer", + "dwarven host subsetting:horncaller", + "dwarven host subsetting:axe bearer", + "dwarven host subsetting:graybeard", + "dwarven host subsetting:khirurgeon", + "dwarven host subsetting:quartermaster", + "dwarven host subsetting:captain", + "dwarven host subsetting:artillerist", + "dwarven host subsetting:engineer", + "dwarven host subsetting:warden" + ] + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Dwarven Noble Setting" + ] + }, + "Khirurgeon": { + "time": 25, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Noble" + ], + "skills": [ + [ + 6, + "Khirurgy", + "Soothing Platitudes", + "Cooking", + "Infection-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Abecedart, Seneschal or Graybeard", + "requires_expr": [ + "abecedart", + "seneschal", + "graybeard" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Dwarven Noble Setting" + ] + }, + "Quartermaster": { + "time": 50, + "res": 35, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Noble" + ], + "skills": [ + [ + 7, + "Logistics", + "Accounting", + "Strategy", + "Supply-wise", + "Host-wise" + ] + ], + "traits": [ + 1, + "No-nonsense" + ], + "requires": "Seneschal, Treasurer, Trader or Graybeard", + "requires_expr": [ + "seneschal", + "treasurer", + "trader", + "graybeard" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Dwarven Noble Setting" + ] + }, + "Captain": { + "time": 55, + "res": 40, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Guilder", + "Noble" + ], + "skills": [ + [ + 7, + "Command", + "Conspicuous", + "Formation Fighting", + "Strategy", + "Cartography", + "Graybeard-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Prince or Graybeard", + "requires_expr": [ + "prince", + "graybeard" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Guilder Setting", + "Dwarven Noble Setting" + ] + }, + "Artillerist": { + "time": 55, + "res": 45, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Noble", + "Artificer" + ], + "skills": [ + [ + 5, + "Artillerist", + "Mending", + "Carpentry", + "Structural Weakness-wise" + ] + ], + "traits": [ + 1, + "Complaining" + ], + "requires": "Mask Bearer, Craftsman, Foreman or three Arbalester lifepaths", + "requires_expr": [ + "+or", + [ + "mask bearer" + ], + [ + "craftsman" + ], + [ + "foreman" + ], + [ + "+has_n_lifepaths_in", + 3, + "arbalester" + ] + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Noble Setting", + "Artificer Setting" + ] + }, + "Engineer": { + "time": 60, + "res": 50, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Noble", + "Artificer" + ], + "skills": [ + [ + 6, + "Jargon", + "War Engineer", + "Scavenging", + "Leverage-wise" + ] + ], + "traits": [ + 2, + "Estimation" + ], + "requires": "Artillerist or Mask Bearer", + "requires_expr": [ + "artillerist", + "mask bearer" + ], + "key_leads": [ + "Dwarven Noble Setting", + "Artificer Setting" + ] + }, + "Warden": { + "time": 75, + "res": 65, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Noble" + ], + "skills": [ + [ + 7, + "Conspicuous", + "Oratory", + "Observation", + "Strategy", + "Etiquette", + "Champion-wise" + ] + ], + "traits": [ + 1, + "Chuntering", + "Hard As Nails" + ], + "requires": "Prince, Captain or High Captain", + "requires_expr": [ + "prince", + "captain", + "high captain" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Noble Setting" + ] + } + }, + "Dwarven Outcast Subsetting": { + "Adventurer": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Clansman", + "Guilder" + ], + "skills": [ + [ + 12, + "Survival", + "Climbing", + "Knots", + "Herbalism", + "Haggling", + "Firebuilding", + "Brawling", + "Knives", + "Sword", + "Crossbow", + "Lock Pick", + "Appraisal", + "Obscure History", + "Symbology", + "Lost Treasures-wise" + ] + ], + "traits": [ + 2, + "Adventurer", + "Boaster" + ], + "key_leads": [ + "Clansman Setting", + "Guilder Setting" + ] + }, + "Gambler": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Clansman" + ], + "skills": [ + [ + 5, + "Games Of Chance", + "Observation", + "Sleight Of Hand", + "Cheat-wise" + ] + ], + "traits": [ + 2, + "Stone-faced" + ], + "key_leads": [ + "Clansman Setting" + ] + }, + "Oathbreaker": { + "time": 20, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Clansman" + ], + "skills": [ + [ + 4, + "Ugly Truth", + "Falsehood", + "Oath-wise" + ] + ], + "traits": [ + 2, + "Oathbreaker", + "Bitter" + ], + "key_leads": [ + "Clansman Setting" + ] + }, + "Drunk": { + "time": 10, + "res": 5, + "leads": [ + "Clansman" + ], + "skills": [ + [ + 4, + "Stentorious Singing", + "Drunking", + "Tavern Tales-wise" + ] + ], + "traits": [ + 2, + "Drunk", + "Despondent" + ], + "key_leads": [ + "Clansman Setting" + ] + }, + "Coward": { + "time": 15, + "res": 5, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Host", + "Clansman", + "Guilder", + "Noble", + "Artificer" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Ugly Truth", + "Oratory", + "Hypocritical Bastards-wise" + ] + ], + "traits": [ + 3, + "Branded A Coward" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Dwarven Host Subsetting", + "Clansman Setting", + "Guilder Setting", + "Dwarven Noble Setting", + "Artificer Setting" + ] + }, + "Rune Caster": { + "time": 20, + "res": 6, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Clansman", + "Guilder", + "Noble", + "Artificer" + ], + "skills": [ + [ + 5, + "Rune Casting", + "Foraging", + "Scavenging", + "Bad End-wise" + ] + ], + "traits": [ + 2, + "Slave To Fate" + ], + "key_leads": [ + "Dwarven Outcast Subsetting", + "Clansman Setting", + "Guilder Setting", + "Dwarven Noble Setting", + "Artificer Setting" + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/elf.json b/src/data/lifepaths/elf.json new file mode 100755 index 0000000..b9224e2 --- /dev/null +++ b/src/data/lifepaths/elf.json @@ -0,0 +1,2048 @@ +{ + "Wilderlands Setting": { + "Born Wilder Elf": { + "time": 20, + "res": 5, + "leads": [ + "Citadel" + ], + "skills": [ + [ + 2, + "Sing", + "Elven Script" + ], + [ + 4, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Born Under The Silver Stars", + "Essence Of The Earth", + "Fair And Statuesque", + "First Born", + "Grief", + "Keen Sight" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Rider": { + "time": 20, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 6, + "Riding", + "Gift Of Speed", + "Lay Of The Horse" + ] + ], + "traits": [ + 1, + "Oikofugic" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Harvester": { + "time": 50, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Protector" + ], + "skills": [ + [ + 5, + "Round Of Harvest", + "Farming", + "Firebuilding", + "Animal Husbandry", + "Mending" + ] + ], + "traits": [ + 1, + "Seasoned" + ], + "key_leads": [ + "Protector Subsetting" + ] + }, + "Gatherer": { + "time": 40, + "res": 3, + "skills": [ + [ + 5, + "Rhyme Of The Gatherer", + "Herb-wise", + "Orienteering" + ] + ], + "traits": [ + 1, + "Rough Hands" + ] + }, + "Fisherman": { + "time": 50, + "res": 8, + "leads": [ + "Citadel" + ], + "skills": [ + [ + 9, + "Hymn Of Scales And Fins", + "Pilot", + "Boatwright", + "Knots", + "Mending", + "Cooking", + "Seamanship", + "Rigging" + ] + ], + "traits": [ + 1, + "Wary" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Shepherd": { + "time": 45, + "res": 6, + "leads": [ + "Citadel" + ], + "skills": [ + [ + 4, + "Song Of Flocks And Herds", + "Climbing", + "Wolf-wise" + ] + ], + "traits": [ + 1, + "Never Cry Wolf" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Wanderer": { + "time": 75, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Citadel" + ], + "skills": [ + [ + 6, + "Song Of Paths And Ways", + "Air Of Gates", + "Foraging", + "Road-wise" + ] + ], + "traits": [ + 1, + "Oikofugic" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Huntsman": { + "time": 45, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 7, + "Call Of The Wild", + "Javelin", + "Bow", + "Tracking", + "Stealthy", + "Observation" + ] + ], + "traits": [ + 1, + "Watchful" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Chandler": { + "time": 50, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 5, + "Chant Of Offering", + "Haggling", + "Conspicuous", + "Appraisal" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Weaver": { + "time": 50, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel" + ], + "skills": [ + [ + 5, + "Weaving Way", + "Threading Chant", + "Mending" + ] + ], + "traits": [ + 1, + "Fateful" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Forester": { + "time": 90, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 6, + "Song Of Arbors", + "Forest-wise", + "Tree-wise", + "Song Of The Eldar" + ] + ], + "traits": [ + 2, + "Stern" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Vintner": { + "time": 60, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel" + ], + "skills": [ + [ + 7, + "Purple Song", + "Vine-wise", + "Cooper", + "Vintage-wise", + "Terroir-wise" + ] + ], + "traits": [ + 1, + "Rarified" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Miller": { + "time": 60, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel" + ], + "skills": [ + [ + 6, + "Grain Song", + "Mending", + "Carpentry", + "Mill-wise", + "Grain-wise" + ] + ], + "traits": [ + 1, + "Earthen" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Song Singer": { + "time": 45, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 6, + "Song Of Songs", + "Song Of Soothing", + "Lament Of The Westering Sun", + "Oratory" + ] + ], + "traits": [ + 1, + "Vocal" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Spouse": { + "time": 75, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 5, + "Song Of Soothing", + "Rhyme Of Rules", + "Song Of Feasting", + "Fealty-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Patriarch/matriarch": { + "time": 100, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel" + ], + "skills": [ + [ + 6, + "Homesong", + "Lyric Of Healing", + "Dignity Of The Wilderlands" + ] + ], + "traits": [ + 1, + "Patriarchal/matriarchal" + ], + "requires": "Spouse", + "requires_expr": [ + "spouse" + ], + "key_leads": [ + "Citadel Setting" + ] + }, + "Elder": { + "time": 150, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel", + "Etharch" + ], + "skills": [ + [ + 5, + "Verse Of Decision", + "Council Caller" + ] + ], + "traits": [ + 2, + "Wise Aphorisms" + ], + "requires": "Character must be 750 years old after taking this path or the oldest character in the group by 100 years.", + "requires_expr": [ + "+age_greater_than", + 600 + ], + "key_leads": [ + "Citadel Setting", + "Etharch Setting" + ] + } + }, + "Citadel Setting": { + "Citadel Born": { + "time": 20, + "res": 7, + "leads": [ + "Wilderlands" + ], + "skills": [ + [ + 2, + "Elven Script", + "Sing" + ], + [ + 5, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Born Under The Silver Stars", + "Essence Of The Earth", + "Fair And Statuesque", + "First Born", + "Grief", + "Keen Sight" + ], + "key_leads": [ + "Wilderlands Setting" + ] + }, + "Servitor": { + "time": 20, + "res": 5, + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 5, + "Hauling", + "Observation", + "Citadel-wise", + "Althing-wise" + ] + ], + "traits": [ + 2, + "Humility", + "Lifting Heavy Things" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Wanderer": { + "time": 75, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands" + ], + "skills": [ + [ + 6, + "Song Of Paths And Ways", + "Air Of Gates", + "Scavenging", + "Streetwise" + ] + ], + "traits": [ + 1, + "Lonesome" + ], + "key_leads": [ + "Wilderlands Setting" + ] + }, + "Song Singer": { + "time": 25, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 5, + "Sing", + "Song Of Songs", + "Song Of Soothing", + "Lament Of Stars" + ] + ], + "traits": [ + 1, + "Voice In The Crowd" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Student": { + "time": 20, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 6, + "Lyric Of Law", + "Ballad Of History", + "Elven Script", + "Etiquette", + "Oratory" + ] + ], + "traits": [ + 1, + "Educated" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Clothier": { + "time": 75, + "res": 20, + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 7, + "Threading Chant", + "Embroidery", + "Leathercraft", + "Weaving Way" + ] + ], + "traits": [ + 1, + "Well Dressed" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Soldier-protector": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Protector", + "Etharch" + ], + "skills": [ + [ + 8, + "Alarm", + "Armor Training", + "Shield Training", + "Sword", + "Bow", + "Knives", + "Fletcher", + "Mending" + ] + ], + "traits": [ + 1, + "Dutiful" + ], + "requires": "Wanderer, Seafarer, Spouse, Rider, Huntsman, or any Etharch or Protector lifepath", + "requires_expr": [ + "wanderer", + "seafarer", + "spouse", + "rider", + "huntsman", + "etharch setting:born etharch", + "etharch setting:student", + "etharch setting:attendant", + "etharch setting:second", + "etharch setting:sword singer", + "etharch setting:steward", + "etharch setting:prince/princess", + "etharch setting:etharch", + "protector subsetting:rider", + "protector subsetting:herald", + "protector subsetting:soother", + "protector subsetting:ranger", + "protector subsetting:bowyer", + "protector subsetting:spearbearer", + "protector subsetting:sword singer", + "protector subsetting:outrider", + "protector subsetting:lancer", + "protector subsetting:lieutenant", + "protector subsetting:captain", + "protector subsetting:armorer", + "protector subsetting:bladesmith", + "protector subsetting:lord protector" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Seafarer": { + "time": 50, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 9, + "Weathersong", + "Rope Chant", + "Rhyme Of The Mariner", + "Seamanship", + "Pilot", + "Spear" + ] + ], + "traits": [ + 1, + "Call Of The Sea", + "Rower" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Sea Captain": { + "time": 100, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Protector", + "Etharch" + ], + "skills": [ + [ + 8, + "Slip Of Currents", + "Supplication To The Wind", + "Command", + "Oratory", + "Sword" + ] + ], + "traits": [ + 1 + ], + "requires": "Seafarer, Adjutant, Lieutenant or Sword Singer", + "requires_expr": [ + "seafarer", + "adjutant", + "lieutenant", + "sword singer" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Novice": { + "time": 10, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands" + ], + "skills": [ + [ + 4, + "Mending", + "Craft-wise", + "Elven Artifact-wise" + ] + ], + "traits": [ + 2, + "Loyal" + ], + "key_leads": [ + "Wilderlands Setting" + ] + }, + "Shaper": { + "time": 35, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 6, + "Woodcraft", + "Stonecraft", + "Smithcraft" + ] + ], + "traits": [ + 1, + "Long Fingered" + ], + "requires": "Novice", + "requires_expr": [ + "novice" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Jeweler": { + "time": 75, + "res": 20, + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 5, + "Jewelcraft", + "Gemcraft", + "Appraisal" + ] + ], + "traits": [ + 2, + "Patient", + "Nimble" + ], + "requires": "Shaper", + "requires_expr": [ + "shaper" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Artisan": { + "time": 150, + "res": 40, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Protector", + "Etharch" + ], + "skills": [ + [ + 6, + "Archcraft", + "Stonecraft", + "Canticle Of Years", + "Antiphon Union Training" + ] + ], + "traits": [ + 1 + ], + "requires": "Shaper", + "requires_expr": [ + "shaper" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Keel Master": { + "time": 100, + "res": 25, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 6, + "Shipwright", + "Ship-wise", + "Carving" + ] + ], + "traits": [ + 2, + "Perfectionist" + ], + "requires": "Shaper", + "requires_expr": [ + "shaper" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Artist": { + "time": 60, + "res": 12, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands" + ], + "skills": [ + [ + 5, + "Song Of Form", + "Painting" + ] + ], + "traits": [ + 2, + "Appreciation For Beauty" + ], + "key_leads": [ + "Wilderlands Setting" + ] + }, + "Bard": { + "time": 65, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 11, + "Song Of Merriment", + "Lament Of Mourning", + "Verse Of Friendship", + "Tract Of Enmity", + "Oratory", + "Conspicuous", + "Lyre", + "Flute" + ] + ], + "traits": [ + 1 + ], + "requires": "Song Singer", + "requires_expr": [ + "song singer" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Adjutant": { + "time": 75, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Protector" + ], + "skills": [ + [ + 7, + "Code Of Citadels", + "Etiquette", + "Administration", + "Etharch-wise", + "Citadel-wise", + "Protector-wise" + ] + ], + "traits": [ + 2, + "Organized", + "Patient" + ], + "requires": "Herald, Attendant, Student or Spouse", + "requires_expr": [ + "herald", + "attendant", + "student", + "spouse" + ], + "key_leads": [ + "Wilderlands Setting", + "Protector Subsetting" + ] + }, + "Loremaster": { + "time": 200, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Etharch" + ], + "skills": [ + [ + 10, + "Ancient And Obscure History", + "Research", + "Ballad Of History", + "Lyric Of Law", + "Canticle Of Years", + "Rhyme Of Tongues" + ] + ], + "traits": [ + 1 + ], + "requires": "Bard, Adjutant, Steward or Patriarch/Martriarch", + "requires_expr": [ + "bard", + "adjutant", + "steward", + "patriarch/matriarch" + ], + "key_leads": [ + "Wilderlands Setting", + "Etharch Setting" + ] + }, + "Althing": { + "time": 250, + "res": 100, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 10, + "Council Caller", + "Song Of Silence", + "Persuasion", + "Soothing Platitudes", + "Ugly Truth", + "Administration" + ] + ], + "traits": [ + 2, + "Servant Of The Citadel" + ], + "requires": "Loremaster, Bard, Artisan, Steward, Captain, Sea Captain or Patriarch/Martriarch", + "requires_expr": [ + "loremaster", + "bard", + "artisan", + "steward", + "captain", + "sea captain", + "patriarch/matriarch" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + } + }, + "Etharch Setting": { + "Born Etharch": { + "time": 25, + "res": 10, + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 2, + "Elven Script", + "Etiquette", + "Sing" + ], + [ + 5, + "General" + ] + ], + "traits": [ + 2, + "Etharchal", + "Fea", + "Aman" + ], + "common_traits": [ + "Born Under The Silver Stars", + "Essence Of The Earth", + "Fair And Statuesque", + "First Born", + "Grief", + "Keen Sight" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Student": { + "time": 25, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 9, + "Ages Of The Etharch", + "Lyric Of Law", + "Ballad Of History", + "Oratory", + "Calligraphy", + "Song Of The Eldar" + ] + ], + "traits": [ + 1, + "Learned" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Attendant": { + "time": 25, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector" + ], + "skills": [ + [ + 4, + "Etiquette", + "Riding", + "Brawling", + "Sword" + ] + ], + "traits": [ + 2, + "Calm Demeanor" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Second": { + "time": 35, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 8, + "Song Of Bonding", + "Sword", + "Knives", + "Bow", + "Mending", + "Riding", + "Mounted Combat Training" + ] + ], + "traits": [ + 2, + "Lesson Of One", + "Patient" + ], + "requires": "Attendant, Bowyer, Spearbearer, Seafarer or Soldier-Protector", + "requires_expr": [ + "attendant", + "bowyer", + "spearbearer", + "seafarer", + "soldier-protector" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Sword Singer": { + "time": 40, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 10, + "Song Of The Sword", + "Sword", + "Armor Training", + "Shield Training", + "Knives", + "Brawling" + ] + ], + "traits": [ + 1, + "Fealty To The Fea", + "Cool Headed" + ], + "requires": "Second, Lancer or Lieutenant", + "requires_expr": [ + "second", + "lancer", + "lieutenant" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Steward": { + "time": 110, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 8, + "Estate Management", + "Accounting", + "Etiquette", + "Estate-wise", + "Intrigue-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Lieutenant, Artisan, Bard, Loremaster, Adjutant, Sea Captain or Patriarch/Martriarch", + "requires_expr": [ + "lieutenant", + "artisan", + "bard", + "loremaster", + "adjutant", + "sea captain", + "patriarch/matriarch" + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Prince/princess": { + "time": 150, + "res": 100, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 6, + "Song Of Lordship", + "Voice Of Ages" + ], + [ + 4, + "General" + ] + ], + "traits": [ + 1, + "Prince/princess Of The Blood" + ], + "requires": "Fea trait and Sword Singer", + "requires_expr": [ + "+and", + [ + "+trait", + "fea" + ], + [ + "sword singer" + ] + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + }, + "Etharch": { + "time": 250, + "res": 200, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Citadel", + "Protector" + ], + "skills": [ + [ + 8, + "Council Caller", + "Voice Of Thunder", + "Doom Sayer", + "Discerner" + ], + [ + 4, + "General" + ] + ], + "traits": [ + 2, + "Lord Of Ages" + ], + "requires": "Aman trait and either Loremaster or Prince", + "requires_expr": [ + "+and", + [ + "+trait", + "aman" + ], + [ + "loremaster", + "prince/princess" + ] + ], + "key_leads": [ + "Citadel Setting", + "Protector Subsetting" + ] + } + }, + "Protector Subsetting": { + "Rider": { + "time": 15, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 6, + "Riding", + "Animal Husbandry", + "Gift Of Speed", + "Lay Of The Horse" + ] + ], + "traits": [ + 1, + "Smells Like A Horse" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Herald": { + "time": 35, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 8, + "Paean Of Deeds", + "Mornsong", + "Evensong", + "Recitation Of Ages", + "Silver Trumpet" + ] + ], + "traits": [ + 2, + "Stoic" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Soother": { + "time": 30, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 6, + "Lyric Of Healing", + "Song Of Soothing", + "Doom Of Strength", + "Foraging" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Ranger": { + "time": 45, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Wilderlands" + ], + "skills": [ + [ + 10, + "Observation", + "Stealthy", + "Bow", + "Foraging", + "Rhyme Of The Pathfinder", + "Song Of Soothing", + "Threne Of The Chameleon", + "Lyric Of Healing" + ] + ], + "traits": [ + 1, + "Grey Mantle", + "Sprinter" + ], + "requires": "Forester, Wanderer, Bowyer or Second", + "requires_expr": [ + "forester", + "wanderer", + "bowyer", + "second" + ], + "key_leads": [ + "Wilderlands Setting" + ] + }, + "Bowyer": { + "time": 20, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 5, + "Bowcraft", + "Mending", + "Bow", + "Bow-wise" + ] + ], + "traits": [ + 1, + "Circumspect" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Spearbearer": { + "time": 20, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 8, + "Spearcraft", + "Spear", + "Armor Training", + "Formation Fighting" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Sword Singer": { + "time": 30, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 10, + "Sword", + "Armor Training", + "Shield Training", + "Knives", + "Brawling", + "Song Of The Sword" + ] + ], + "traits": [ + 1, + "Sword Of The White Towers" + ], + "requires": "Second, Soldier-Protector, Soother, Spouse or Spearbearer", + "requires_expr": [ + "second", + "soldier-protector", + "soother", + "spouse", + "spearbearer" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Outrider": { + "time": 20, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Citadel", + "Wilderlands" + ], + "skills": [ + [ + 9, + "Bow", + "Spear", + "Observation", + "Trails-wise", + "Mounted Combat: Bowman Training", + "Animal Husbandry", + "Mending", + "Stealthy" + ] + ], + "traits": [ + 1, + "Daring" + ], + "requires": "Rider", + "requires_expr": [ + "rider" + ], + "key_leads": [ + "Citadel Setting", + "Wilderlands Setting" + ] + }, + "Lancer": { + "time": 50, + "res": 12, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 10, + "Song Of Burning Bright", + "Lament For The Fallen", + "Lance", + "Mounted Combat Training", + "Shield Training", + "Armor Training" + ] + ], + "traits": [ + 1 + ], + "requires": "Outrider or Second", + "requires_expr": [ + "outrider", + "second" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Lieutenant": { + "time": 65, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 7, + "Paean Of Deeds", + "Command", + "Sword", + "Shield Training", + "Formation Fighting" + ] + ], + "traits": [ + 1, + "Ear To The Ground" + ], + "requires": "Sword Singer, Lancer, Sea Captain or two Bowyer/Spearbearer lifepaths", + "requires_expr": [ + "+or", + [ + "sword singer", + "lancer", + "sea captain" + ], + [ + "+has_n_lifepaths_in", + 2, + "bowyer", + "spearbearer" + ] + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Captain": { + "time": 85, + "res": 15, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 9, + "Oratory", + "Sword", + "Command", + "Tactics", + "Formation Fighting", + "Monody Of The March", + "Silent Fury", + "Hymn Of Victory" + ] + ], + "traits": [ + 2, + "Sworn To The Lord Protector (Or Etharch Or Althing)" + ], + "requires": "Lieutenant, Prince, Sea Captain, Steward or two Sword Singer lifepaths", + "requires_expr": [ + "+or", + [ + "lieutenant", + "prince/princess", + "sea captain", + "steward" + ], + [ + "+has_n_lifepaths_in", + 2, + "sword singer" + ] + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + }, + "Armorer": { + "time": 90, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 7, + "Armorer", + "Etching", + "Sewing", + "Tanner", + "Antiphon Union Training" + ] + ], + "traits": [ + 1, + "Patient" + ], + "requires": "Shaper or Bladesmith", + "requires_expr": [ + "shaper", + "bladesmith" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Bladesmith": { + "time": 80, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Wilderlands", + "Citadel" + ], + "skills": [ + [ + 5, + "Riddle Of Steel", + "Etching", + "Elven Blade-wise" + ] + ], + "traits": [ + 1, + "Acute" + ], + "requires": "Armorer, Shaper, Bowyer or Spearbearer", + "requires_expr": [ + "armorer", + "shaper", + "bowyer", + "spearbearer" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting" + ] + }, + "Lord Protector": { + "time": 125, + "res": 60, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Wilderlands", + "Citadel", + "Protector", + "Etharch" + ], + "skills": [ + [ + 10, + "Strain Of Far Sight", + "Anthem Of Courage", + "Ballad Of Rage", + "Command", + "Formation Fighting", + "Administration", + "Logistics", + "Strategy" + ] + ], + "traits": [ + 1, + "Sworn To Protect" + ], + "requires": "Captain or Prince", + "requires_expr": [ + "captain", + "prince/princess" + ], + "key_leads": [ + "Wilderlands Setting", + "Citadel Setting", + "Protector Subsetting", + "Etharch Setting" + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/man.json b/src/data/lifepaths/man.json new file mode 100755 index 0000000..a3f228b --- /dev/null +++ b/src/data/lifepaths/man.json @@ -0,0 +1,11811 @@ +{ + "Peasant Setting": { + "Born Peasant": { + "time": 8, + "res": 3, + "leads": [ + "Servitude", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 2 + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Farmer": { + "time": 8, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Soldier", + "Servitude" + ], + "skills": [ + [ + 8, + "Farming", + "Mending", + "Animal Husbandry", + "Weaving", + "Cooking", + "Sewing", + "Firebuilding", + "Sing" + ] + ], + "traits": [ + 1, + "Hoarding" + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting", + "Servitude And Captive Setting" + ] + }, + "Head Of Household": { + "time": 15, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Soldier" + ], + "skills": [ + [ + 8, + "Carpentry", + "Hunting", + "Haggling", + "Almanac" + ] + ], + "traits": [ + 2 + ], + "restrict": "May not be the character's second lifepath.", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting" + ] + }, + "Midwife": { + "time": 10, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast" + ], + "skills": [ + [ + 7, + "Animal Husbandry", + "Herbalism", + "Midwifery", + "Omen-wise" + ] + ], + "traits": [ + 2, + "Bedside Manner" + ], + "requires": "Any female gender-specific lifepath (Lady, for example), Farmer or Itinerant Priest.", + "requires_expr": [ + "farmer", + "itinerant priest", + "augur", + "midwife", + "country wife", + "village wife", + "city wife", + "serving wench", + "alewife", + "young lady", + "lady", + "nurse", + "weather witch", + "governess", + "crazy witch", + "dame" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Lazy Stayabout": { + "time": 7, + "res": 3, + "leads": [ + "Outcast", + "Servitude", + "Soldier" + ], + "skills": [ + [ + 3, + "Lazy-wise", + "Peasant-wise", + "Wife-wise", + "Work-wise" + ] + ], + "traits": [ + 1, + "A Little Fat" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Conscript": { + "time": 1, + "res": 4, + "leads": [ + "Outcast", + "Servitude", + "Soldier" + ], + "skills": [ + [ + 2, + "Foraging", + "Battle-wise", + "Rumour-wise" + ] + ], + "traits": [ + 1, + "Flee From Battle" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Peasant Pilgrim": { + "time": 3, + "res": 4, + "leads": [ + "Villager", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 3, + "Doctrine", + "Pilgrimage-wise", + "Saint-wise" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 2, + "Road Weary", + "Alms-taker" + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Miller": { + "time": 7, + "res": 15, + "leads": [ + "Villager" + ], + "skills": [ + [ + 5, + "Miller", + "Brewer", + "Mending", + "Carpentry" + ] + ], + "traits": [ + 1, + "Lord's Favorite" + ], + "key_leads": [ + "Villager Setting" + ] + }, + "Fisherman": { + "time": 6, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Seafaring" + ], + "skills": [ + [ + 6, + "Fishing", + "Rigging", + "Knots", + "Mending", + "Cooking", + "Boatwright" + ] + ], + "traits": [ + 2, + "Superstitious" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Seafaring Setting" + ] + }, + "Shepherd": { + "time": 4, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Outcast" + ], + "skills": [ + [ + 5, + "Animal Husbandry", + "Sing", + "Climbing", + "Flute" + ] + ], + "traits": [ + 1, + "Cry Wolf" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Woodcutter": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Outcast" + ], + "skills": [ + [ + 5, + "Firebuilding", + "Mending", + "Foraging", + "Orienteering", + "Tree-wise", + "Tree Cutting" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Hunter": { + "time": 5, + "res": 6, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 7, + "Hunting", + "Tracking", + "Stealthy", + "Cooking", + "Orienteering", + "Javelin", + "Bow" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Trapper": { + "time": 5, + "res": 8, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 6, + "Trapper", + "Stealthy", + "Tracking", + "Cooking", + "Haggling", + "Taxidermy" + ] + ], + "traits": [ + 1, + "Foul Smelling" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Peddler": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 7, + "Mending", + "Sing", + "Haggling", + "Chandler", + "Persuasion", + "Inconspicuous", + "Falsehood" + ] + ], + "traits": [ + 2, + "Blank Stare", + "Glib", + "Eidetic Memory" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Elder": { + "time": 15, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast" + ], + "skills": [ + [ + 6, + "Observation", + "Persuasion", + "Ugly Truth", + "Peasant-wise", + "Local History" + ] + ], + "traits": [ + 1, + "Crotchety" + ], + "requires": "The character must have at least 4 lifepaths and start the game over 50 years old.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 4 + ], + [ + "+age_greater_than", + 35 + ] + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Augur": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Servitude", + "Outcast" + ], + "skills": [ + [ + 4, + "Astrology", + "Sorcery", + "Falsehood", + "Ugly Truth", + "Omen-wise" + ] + ], + "traits": [ + 2, + "Disturbed", + "Dreamer", + "Cassandra", + "Touch Of Ages" + ], + "requires": "Midwife, Country Wife or must be female and character has no more than three lifepaths total.", + "requires_expr": [ + "+or", + [ + "midwife", + "country wife" + ], + [ + "+and", + [ + "+sex", + "female" + ], + [ + "+has_n_lifepaths_or_less", + 2 + ] + ] + ], + "key_leads": [ + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Itinerant Priest": { + "time": 6, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "City", + "Religious" + ], + "skills": [ + [ + 7, + "Oratory", + "Suasion", + "Chandler", + "Riding", + "Write", + "Read", + "Doctrine" + ] + ], + "traits": [ + 2, + "Dusty", + "Faithful" + ], + "requires": "Any Acolyte lifepath from any setting.", + "requires_expr": [ + "acolyte", + "failed acolyte", + "temple acolyte", + "religious acolyte" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "City Dweller Setting", + "Religious Subsetting" + ] + }, + "Recluse Wizard": { + "time": 15, + "res": 28, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Villager", + "City", + "Court" + ], + "skills": [ + [ + 7, + "Astrology", + "Alchemy", + "Enchanting", + "Illuminations", + "Ancient History", + "Obscure History" + ] + ], + "traits": [ + 2, + "Batshit", + "Gifted" + ], + "requires": "A previous lifepath that contains the sorcery skill.", + "requires_expr": [ + "augur", + "sorcerer", + "court sorcerer", + "rogue wizard", + "wizard of war" + ], + "key_leads": [ + "Outcast Subsetting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Country Wife": { + "time": 10, + "res": 5, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Religious" + ], + "skills": [ + [ + 2, + "Child Rearing", + "Cooking" + ] + ], + "traits": [ + 1 + ], + "note": "A player who takes the Country Wife lifepath may also choose her husband's lifepath from the Peasant setting and may choose from his skills: she gets half of his skill points rounded down. She also receives half of her husband's resource points.", + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Religious Subsetting" + ] + } + }, + "Villager Setting": { + "Village Born": { + "time": 10, + "res": 4, + "leads": [ + "Peasant", + "Servitude", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 2 + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Kid": { + "time": 4, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "Trouble-wise", + "Throwing", + "Inconspicuous" + ] + ], + "traits": [ + 1, + "Bad Egg", + "Good For Nothing", + "Fleet Of Foot" + ], + "restrict": "If chosen this must be the second lifepath and may only be taken once.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Idiot": { + "time": 10, + "res": 4, + "leads": [ + "Outcast", + "Peasant" + ], + "skills": [ + [ + 4, + "Inconspicuous", + "Conspicuous", + "Ugly Truth", + "Village Secrets-wise" + ] + ], + "traits": [ + 1, + "Problems", + "Alcoholic", + "Abused", + "Handicapped" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting" + ] + }, + "Pilgrim": { + "time": 2, + "res": 4, + "leads": [ + "Religious", + "Servitude", + "City" + ], + "skills": [ + [ + 5, + "Religious Rumor-wise", + "Road-wise", + "Shrine-wise", + "Alms-wise", + "Relic-wise", + "Doctrine" + ] + ], + "traits": [ + 2, + "Collector" + ], + "key_leads": [ + "Religious Subsetting", + "Servitude And Captive Setting", + "City Dweller Setting" + ] + }, + "Conscript": { + "time": 1, + "res": 5, + "leads": [ + "Servitude", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 2, + "Foraging", + "Baggage Train-wise" + ] + ], + "traits": [ + 1, + "Hide Before Battle" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Groom": { + "time": 4, + "res": 7, + "leads": [ + "Peasant", + "City", + "Soldier" + ], + "skills": [ + [ + 4, + "Animal Husbandry", + "Riding", + "Mending", + "Horse-wise", + "Road-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Peasant Setting", + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Runner": { + "time": 4, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Peasant", + "Soldier" + ], + "skills": [ + [ + 3, + "Streetwise", + "Inconspicuous", + "Shortcut-wise" + ] + ], + "traits": [ + 1, + "Skinny", + "Fleet Of Foot" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Professional Soldier Subsetting" + ] + }, + "Village Peddler": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Servitude", + "City", + "Outcast" + ], + "skills": [ + [ + 7, + "Mending", + "Sing", + "Haggling", + "Chandler", + "Persuasion", + "Inconspicuous", + "Falsehood" + ] + ], + "traits": [ + 2, + "Odd" + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Shopkeeper": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Peasant" + ], + "skills": [ + [ + 5, + "Haggling", + "Accounting", + "Observation", + "Merchant-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting" + ] + }, + "Clerk": { + "time": 4, + "res": 9, + "leads": [ + "City", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 4, + "Bureaucracy", + "Write", + "Read", + "Contract-wise" + ] + ], + "traits": [ + 1, + "Cramped Hands", + "Mind For Small Details" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Sailor": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Peasant", + "Servitude", + "Seafaring" + ], + "skills": [ + [ + 6, + "Rigging", + "Knots", + "Brawling", + "Mending", + "Sing", + "Fishing" + ] + ], + "traits": [ + 1, + "Superstitious", + "Sea Legs" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Peasant Setting", + "Servitude And Captive Setting", + "Seafaring Setting" + ] + }, + "Laborer": { + "time": 4, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude", + "Peasant" + ], + "skills": [ + [ + 2, + "Ditch Digging", + "Latrine-wise" + ] + ], + "traits": [ + 2, + "Calloused", + "Starved", + "Broken", + "Hardened", + "Numb" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting", + "Peasant Setting" + ] + }, + "Miner": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude", + "Peasant" + ], + "skills": [ + [ + 2, + "Mining", + "Cave-in-wise" + ] + ], + "traits": [ + 3, + "Black Lung", + "Drunk", + "Superstitious" + ], + "requires": "Laborer, Conscript, Farmer or Foot Soldier.", + "requires_expr": [ + "laborer", + "conscript", + "farmer", + "foot soldier" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting", + "Peasant Setting" + ] + }, + "Taskmaster": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 5, + "Intimidation", + "Brawling", + "Sing", + "Conspicuous", + "Lazy Bastard-wise" + ] + ], + "traits": [ + 1, + "Hard-hearted", + "Mean", + "Barker", + "Booming Voice" + ], + "requires": "Village Sergeant or any Soldier lifepath.", + "requires_expr": [ + "village sergeant", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Serving Wench (Bitter)": { + "display_name": "Serving Wench", + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 4, + "Soothing Platitudes", + "Ugly Truth", + "Customer-wise", + "Sleight Of Hand" + ] + ], + "traits": [ + 2, + "Extremely Bitter", + "Ugly", + "Drop Dead Gorgeous", + "Buxom" + ], + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Serving Wench (Ugly)": { + "display_name": "Serving Wench", + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 4, + "Soothing Platitudes", + "Ugly Truth", + "Customer-wise", + "Sleight Of Hand" + ] + ], + "traits": [ + 2, + "Ugly", + "Extremely Bitter", + "Drop Dead Gorgeous", + "Buxom" + ], + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Serving Wench (Gorgeous)": { + "display_name": "Serving Wench", + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 4, + "Soothing Platitudes", + "Ugly Truth", + "Customer-wise", + "Sleight Of Hand" + ] + ], + "traits": [ + 2, + "Drop Dead Gorgeous", + "Ugly", + "Extremely Bitter", + "Buxom" + ], + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Serving Wench (Buxom)": { + "display_name": "Serving Wench", + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 4, + "Soothing Platitudes", + "Ugly Truth", + "Customer-wise", + "Sleight Of Hand" + ] + ], + "traits": [ + 2, + "Buxom", + "Drop Dead Gorgeous", + "Ugly", + "Extremely Bitter" + ], + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Hosteller": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Peasant" + ], + "skills": [ + [ + 5, + "Cooking", + "Mending", + "Accounting", + "Soothing Platitudes", + "Guest-wise" + ] + ], + "traits": [ + 1, + "Fixed Smile", + "Gossip" + ], + "restrict": "May not be the character's second lifepath.", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting" + ] + }, + "Village Guard": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Peasant", + "Servitude" + ], + "skills": [ + [ + 4, + "Appropriate Weapons", + "Intimidation", + "Brawling", + "Graft-wise", + "Village-wise", + "Guard-wise" + ] + ], + "traits": [ + 1, + "Thug" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Peasant Setting", + "Servitude And Captive Setting" + ] + }, + "Village Sergeant": { + "time": 5, + "res": 9, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "Servitude", + "Court" + ], + "skills": [ + [ + 6, + "Command", + "Intimidation", + "Field Dressing", + "Appropriate Weapons", + "Shield Training", + "Armor Training", + "Bribe-wise", + "Wealthy-wise" + ] + ], + "traits": [ + 1, + "Overworked", + "Underpaid" + ], + "requires": "Village Guard, Squire, Freebooter, Sergeant-At-Arms or Man-At-Arms.", + "requires_expr": [ + "village guard", + "squire", + "freebooter", + "sergeant-at-arms", + "man-at-arms" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Corrupt Sergeant": { + "time": 5, + "res": 12, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "Servitude", + "Court" + ], + "skills": [ + [ + 6, + "Intimidation", + "Appropriate Weapons", + "Shield Training", + "Armor Training", + "Bribe-wise", + "Wealthy-wise", + "Criminal-wise" + ] + ], + "traits": [ + 1, + "Predatory" + ], + "requires": "Village Guard, Squire, Freebooter, Sergeant-At-Arms or Man-At-Arms.", + "requires_expr": [ + "village guard", + "squire", + "freebooter", + "sergeant-at-arms", + "man-at-arms" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Tailor": { + "time": 5, + "res": 12, + "leads": [ + "City", + "Peasant" + ], + "skills": [ + [ + 5, + "Sewing", + "Embroidery", + "Clothing-wise" + ] + ], + "traits": [ + 1, + "Frippery" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting" + ] + }, + "Tax Collector": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Intimidation", + "Accounting", + "Haggling", + "Persuasion" + ] + ], + "traits": [ + 1, + "Hard-hearted", + "Manhunter" + ], + "restrict": "May not be the character's second lifepath.", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Cobbler": { + "time": 8, + "res": 20, + "leads": [ + "City", + "Peasant", + "Soldier" + ], + "skills": [ + [ + 4, + "Cobbler", + "Shoe-wise", + "Feet-wise", + "Leather-wise", + "Nail-wise" + ] + ], + "traits": [ + 1, + "Comfortable Shoes" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Professional Soldier Subsetting" + ] + }, + "Farrier": { + "time": 5, + "res": 12, + "leads": [ + "City", + "Peasant", + "Soldier" + ], + "skills": [ + [ + 4, + "Blacksmith", + "Animal Husbandry", + "Horse-wise", + "Haggling" + ] + ], + "traits": [ + 1, + "A Bit Deaf" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Professional Soldier Subsetting" + ] + }, + "Butcher": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Butchery", + "Cooking", + "Guts-wise", + "Anatomy" + ] + ], + "traits": [ + 2, + "Prominent Scar", + "Thick Skin", + "Stinky", + "Muttering" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Barber": { + "time": 7, + "res": 16, + "leads": [ + "City", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 5, + "Bloodletting", + "Anatomy", + "Apothecary", + "Villager-wise", + "Gossip-wise" + ] + ], + "traits": [ + 1, + "Agreeable", + "Seemingly Concerned" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Brewer": { + "time": 8, + "res": 15, + "leads": [ + "City", + "Peasant", + "Court" + ], + "skills": [ + [ + 4, + "Brewer", + "Miller", + "Grain-wise", + "Brew-wise" + ] + ], + "traits": [ + 1, + "Reeks Of Alcohol", + "Ruddy Complexion" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Acolyte": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Servitude", + "City", + "Religious" + ], + "skills": [ + [ + 6, + "Doctrine", + "Bureaucracy", + "Write", + "Read", + "Ritual", + "Religious History", + "Temple-wise" + ] + ], + "traits": [ + 2, + "Tonsured", + "Early Riser", + "Broken", + "Perfect Pitch" + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "City Dweller Setting", + "Religious Subsetting" + ] + }, + "Failed Acolyte": { + "time": 6, + "res": 8, + "leads": [ + "Soldier", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Temple-wise", + "Dirty Secrets-wise", + "Doctrine", + "Religious History" + ] + ], + "traits": [ + 2, + "Bitter" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Village Priest": { + "time": 8, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 5, + "Oratory", + "Suasion", + "Symbology" + ] + ], + "traits": [ + 2, + "Vested", + "Devout", + "Faithful" + ], + "requires": "Acolyte", + "requires_expr": [ + "acolyte" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Venal Priest": { + "time": 9, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 6, + "Persuasion", + "Soothing Platitudes", + "Falsehood" + ] + ], + "traits": [ + 2, + "Venal", + "Vested" + ], + "requires": "Acolyte, Clerk, Student or any Religious setting lifepath.", + "requires_expr": [ + "acolyte", + "clerk", + "student", + "religious subsetting:castrati", + "religious subsetting:pardoner", + "religious subsetting:zealous convert", + "religious subsetting:military order", + "religious subsetting:grave digger", + "religious subsetting:porter", + "religious subsetting:notary", + "religious subsetting:custodian", + "religious subsetting:interpreter", + "religious subsetting:archivist", + "religious subsetting:itinerant monk", + "religious subsetting:cloistered monk/nun", + "religious subsetting:temple acolyte", + "religious subsetting:priest", + "religious subsetting:exorcist", + "religious subsetting:inquisitor", + "religious subsetting:theologian", + "religious subsetting:archpriest", + "religious subsetting:canon", + "religious subsetting:abbot/abbess", + "religious subsetting:bishop" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Apprentice": { + "time": 7, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Peasant", + "Soldier", + "Seafaring" + ], + "skills": [ + [ + 6, + "Mending", + "Blacksmith", + "Carpentry", + "Tanner", + "Potter", + "Cooper" + ] + ], + "traits": [ + 2, + "Broken In", + "Back-breaking Labor" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Professional Soldier Subsetting", + "Seafaring Setting" + ] + }, + "Journeyman": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "City", + "Peasant", + "Soldier", + "Seafaring" + ], + "skills": [ + [ + 5, + "Haggling", + "Appraisal", + "Write", + "Read" + ] + ], + "traits": [ + 1, + "Made Man", + "Geometric" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Professional Soldier Subsetting", + "Seafaring Setting" + ] + }, + "Cloth Dyer": { + "time": 5, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Peasant" + ], + "skills": [ + [ + 6, + "Cloth Dyeing", + "Dye Manufacture", + "Accounting", + "Haggling", + "Fabric-wise", + "Mineral-wise" + ] + ], + "traits": [ + 1, + "Many-colored Hands" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting" + ] + }, + "Bowyer": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Bowyer", + "Fletcher", + "Mending", + "Bow", + "Bow-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Apprentice, Huntsman, Forester or Archer", + "requires_expr": [ + "apprentice", + "huntsman", + "forester", + "archer" + ], + "key_leads": [ + "City Dweller Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Master Craftsman": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 6, + "Craftsman-wise", + "Artisan-wise", + "Materials-wise", + "Tools-wise" + ], + [ + 3, + "General" + ] + ], + "traits": [ + 1, + "Perfectionist", + "Early Riser", + "Stubborn", + "Healthy" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Vintner": { + "time": 10, + "res": 40, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "Peasant", + "City" + ], + "skills": [ + [ + 4, + "Vintner", + "Wine Tasting", + "Estate Management", + "Grape-wise" + ] + ], + "traits": [ + 1, + "Patient", + "Lugubrious" + ], + "restrict": "May not be the character's second lifepath.", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "Noble Court Subsetting", + "Peasant Setting", + "City Dweller Setting" + ] + }, + "Apiarist": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Court", + "Peasant" + ], + "skills": [ + [ + 4, + "Insect Husbandry", + "Carpentry", + "Firebuilding", + "Honey-wise" + ] + ], + "traits": [ + 2, + "Stung Once (Once)", + "Beespeaker" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Peasant Setting" + ] + }, + "Mining Engineer": { + "time": 8, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Court", + "Soldier" + ], + "skills": [ + [ + 5, + "Prospecting", + "Engineering", + "Ore-wise", + "Rock-wise", + "Command" + ] + ], + "traits": [ + 1, + "Grim", + "Agoraphobic", + "Deep Sense" + ], + "requires": "Apprentice, Miner, Student or Journeyman", + "requires_expr": [ + "apprentice", + "miner", + "student", + "journeyman" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Town Official": { + "time": 5, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 8, + "Rule Of Law", + "Persuasion", + "Etiquette", + "Interrogation", + "Falsehood", + "Town-wise" + ] + ], + "traits": [ + 1, + "Pragmatic" + ], + "requires": "Clerk, Priest or Student", + "requires_expr": [ + "clerk", + "priest", + "student" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Merchant": { + "time": 7, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Seafaring" + ], + "skills": [ + [ + 6, + "Accounting", + "Persuasion", + "Falsehood", + "Haggling", + "Wholesale-wise", + "Landlord-wise" + ] + ], + "traits": [ + 1, + "Distracted" + ], + "requires": "Accountant, Sea Captain, Shopkeeper, Smuggler, Fence, Vintner or Chamberlain", + "requires_expr": [ + "accountant", + "ship's captain", + "shopkeeper", + "smuggler", + "fence", + "vintner", + "chamberlain" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Seafaring Setting" + ] + }, + "Village Wife": { + "time": 8, + "res": 5, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Religious", + "City", + "Servitude" + ], + "skills": [ + [ + 2, + "Child Rearing", + "Cooking" + ] + ], + "traits": [ + 1 + ], + "note": "A player who takes the Village Wife lifepath may also choose her husband's lifepath from the Villager setting and may choose from his skills: she gets half of his skill points rounded down. She also receives half of her husband's resource points.", + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Religious Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting" + ] + } + }, + "City Dweller Setting": { + "City Born": { + "time": 12, + "res": 10, + "leads": [ + "Servitude", + "Court", + "Noble", + "Outcast" + ], + "skills": [ + [ + 4, + "General" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Servitude And Captive Setting", + "Noble Court Subsetting", + "Noble Setting", + "Outcast Subsetting" + ] + }, + "Runner": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Soldier" + ], + "skills": [ + [ + 3, + "Streetwise", + "Inconspicuous" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting" + ] + }, + "Urchin": { + "time": 2, + "res": 4, + "leads": [ + "Outcast", + "Servitude", + "Villager" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Falsehood", + "Streetwise", + "Stealthy" + ] + ], + "traits": [ + 1, + "Sickly", + "Fleet Of Foot", + "Unheeded" + ], + "restrict": "If taken, must be the character's second or third lifepath.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 2 + ] + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Beggar": { + "time": 5, + "res": 4, + "leads": [ + "Outcast", + "Servitude", + "Villager" + ], + "skills": [ + [ + 6, + "City-wise", + "City Guard-wise", + "Wealth-wise", + "Inconspicuous", + "Persuasion", + "Falsehood" + ] + ], + "traits": [ + 1, + "Lame", + "Downtrodden", + "Hurt", + "Broken" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Courier": { + "time": 4, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Soldier" + ], + "skills": [ + [ + 4, + "Riding", + "Streetwise", + "Countryside-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting" + ] + }, + "Laborer": { + "time": 4, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude", + "Peasant" + ], + "skills": [ + [ + 2, + "Ditch Digging", + "Hauling" + ] + ], + "traits": [ + 2, + "Drunk", + "Mind-numbing Work" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting", + "Peasant Setting" + ] + }, + "Pilgrim": { + "time": 2, + "res": 3, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Religious", + "Servitude", + "Villager" + ], + "skills": [ + [ + 4, + "Religious Diatribe", + "City-wise", + "Shrine-wise", + "Doctrine" + ] + ], + "traits": [ + 2, + "Tall Tale Teller", + "Stinky" + ], + "key_leads": [ + "Religious Subsetting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Groom": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Soldier" + ], + "skills": [ + [ + 6, + "Road-wise", + "Driving", + "Riding", + "Animal Husbandry", + "Mending", + "City-wise", + "Traveler-wise" + ] + ], + "traits": [ + 1, + "Peripatetic" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Professional Soldier Subsetting" + ] + }, + "Duelist": { + "time": 4, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude" + ], + "skills": [ + [ + 7, + "Sword", + "Brawling", + "Two-fisted Fighting Training", + "Streetwise", + "Haggling", + "Conspicuous", + "Trial By Combat-wise" + ] + ], + "traits": [ + 1, + "Mercenary", + "Cold-blooded", + "Fearless" + ], + "requires": "Squire or any outcast or soldier lifepath or any guard lifepath.", + "requires_expr": [ + "squire", + "outcast subsetting:urchin", + "outcast subsetting:apostate", + "outcast subsetting:blackmailer", + "outcast subsetting:kidnapper", + "outcast subsetting:pillager", + "outcast subsetting:vagrant", + "outcast subsetting:cripple", + "outcast subsetting:poacher", + "outcast subsetting:deranged", + "outcast subsetting:outlaw", + "outcast subsetting:fence", + "outcast subsetting:gravedigger", + "outcast subsetting:ratcatcher", + "outcast subsetting:beggar", + "outcast subsetting:leper", + "outcast subsetting:prostitute", + "outcast subsetting:whoremonger", + "outcast subsetting:itinerant performer", + "outcast subsetting:insurrectionist", + "outcast subsetting:cultist", + "outcast subsetting:poisoner", + "outcast subsetting:thug", + "outcast subsetting:desperate killer", + "outcast subsetting:bandit", + "outcast subsetting:pirate", + "outcast subsetting:smuggler", + "outcast subsetting:freebooter", + "outcast subsetting:strider", + "outcast subsetting:mad summoner", + "outcast subsetting:rogue wizard", + "outcast subsetting:crazy witch", + "outcast subsetting:heretic priest", + "outcast subsetting:thinker", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain", + "village guard", + "city guard", + "guard captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Coin Clipper": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Court" + ], + "skills": [ + [ + 5, + "Streetwise", + "Forgery", + "Falsehood", + "Intimidation", + "Counterfeiting", + "Coin-wise" + ] + ], + "traits": [ + 1, + "Light Sleeper" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Pickpocket": { + "time": 4, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Outcast", + "Villager", + "Servitude" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Streetwise", + "Sleight Of Hand", + "Crowd-wise" + ] + ], + "traits": [ + 1, + "Plain Faced" + ], + "key_leads": [ + "Outcast Subsetting", + "Villager Setting", + "Servitude And Captive Setting" + ] + }, + "Street Thug": { + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude" + ], + "skills": [ + [ + 5, + "Brawling", + "Intimidation", + "Streetwise", + "Darkened Streets-wise" + ] + ], + "traits": [ + 1, + "Cruel", + "Street Smart" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Criminal": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Servitude" + ], + "skills": [ + [ + 6, + "Inconspicuous", + "Streetwise", + "Intimidation", + "Knives", + "Climbing" + ] + ], + "traits": [ + 2, + "Cynical", + "Poker Face", + "Rainman", + "Alert" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Confidence Man": { + "time": 4, + "res": 12, + "leads": [ + "Soldier", + "Outcast", + "Villager" + ], + "skills": [ + [ + 5, + "Falsehood", + "Inconspicuous", + "Disguise", + "Persuasion", + "Grift-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Villager Setting" + ] + }, + "City Peddler": { + "time": 5, + "res": 10, + "leads": [ + "Villager", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 7, + "Mending", + "Sing", + "Haggling", + "Chandler", + "Persuasion", + "Inconspicuous", + "Falsehood" + ] + ], + "traits": [ + 1, + "The Story" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Sailor": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Peasant", + "Servitude", + "Seafaring" + ], + "skills": [ + [ + 5, + "Rigging", + "Knots", + "Brawling", + "Mending", + "Sing", + "Gambling" + ] + ], + "traits": [ + 1, + "Superstitious", + "Sea Legs" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Peasant Setting", + "Servitude And Captive Setting", + "Seafaring Setting" + ] + }, + "Student": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 11, + "Write", + "Read", + "Philosophy", + "Rule Of Law", + "History", + "Symbology", + "Anatomy", + "Astrology", + "Inconspicuous", + "Streetwise", + "City-wise" + ] + ], + "traits": [ + 3, + "Rabble-rouser", + "Drunk", + "Geometric" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Ganymede": { + "time": 5, + "res": 15, + "leads": [ + "Outcast", + "Servitude", + "Court" + ], + "skills": [ + [ + 5, + "Fashion-wise", + "Inconspicuous", + "Conspicuous", + "Soothing Platitudes" + ] + ], + "traits": [ + 2, + "Catamite", + "Flamboyant", + "Comely", + "Sharp Dresser" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Dilettante": { + "time": 3, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Court", + "Outcast" + ], + "skills": [ + [ + 4, + "Sorcery-wise", + "Obscure History", + "Falsehood" + ] + ], + "traits": [ + 1, + "Superstitious", + "Entropic", + "Cipher" + ], + "key_leads": [ + "Villager Setting", + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Neophyte Sorcerer": { + "time": 6, + "res": 12, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Outcast", + "Servitude" + ], + "skills": [ + [ + 6, + "Write", + "Read", + "Research", + "Symbology", + "Great Masters-wise" + ] + ], + "traits": [ + 1, + "Extremely Respectful Of One's Betters", + "Bitter", + "Gifted" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Temple Acolyte": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Outcast", + "Servitude", + "Religious" + ], + "skills": [ + [ + 5, + "Doctrine", + "Bureaucracy", + "Write", + "Read", + "Temple-wise" + ] + ], + "traits": [ + 1, + "Believer", + "Tonsured", + "Faithful" + ], + "key_leads": [ + "Peasant Setting", + "Outcast Subsetting", + "Servitude And Captive Setting", + "Religious Subsetting" + ] + }, + "Sculptor": { + "time": 5, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Peasant", + "Court" + ], + "skills": [ + [ + 6, + "Sculpture", + "Mason", + "Blacksmith", + "Carpentry", + "Stone-wise" + ] + ], + "traits": [ + 2, + "Passionate" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Painter": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Peasant", + "Court" + ], + "skills": [ + [ + 5, + "Painting", + "Illuminations", + "Anatomy", + "Paint-wise" + ] + ], + "traits": [ + 2, + "Odd", + "Perspective", + "Greater Muse" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Composer": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Peasant", + "Court" + ], + "skills": [ + [ + 5, + "Music Composition", + "Poetry", + "Sing", + "Musical Instrument" + ] + ], + "traits": [ + 2, + "Isoteric", + "Remote" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Dramaturge": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Peasant", + "Court" + ], + "skills": [ + [ + 5, + "Playwright", + "Composition", + "Write", + "Drama-wise" + ] + ], + "traits": [ + 1, + "Other Life" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Performer": { + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 6, + "Acting", + "Persuasion", + "Sing", + "Falsehood", + "Conspicuous", + "Sleight Of Hand", + "Musical Instrument" + ] + ], + "traits": [ + 2, + "Colorful" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Tinkerer": { + "time": 7, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 5, + "Mending", + "Scavenging", + "Junk-wise" + ] + ], + "traits": [ + 2 + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Coal Man": { + "time": 4, + "res": 5, + "leads": [ + "Servitude", + "Peasant", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 4, + "Firebuilding", + "Streetwise", + "Charcoal-wise", + "Haggling" + ] + ], + "traits": [ + 2, + "Hacking Cough" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Peasant Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Seamstress": { + "time": 5, + "res": 10, + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 4, + "Sewing", + "Embroidery", + "Clothing-wise", + "Fashion-wise" + ] + ], + "traits": [ + 1, + "Fretful", + "Sharp Dresser" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Barkeep": { + "time": 5, + "res": 15, + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 4, + "Drink-wise", + "Drunk-wise", + "Persuasion" + ] + ], + "traits": [ + 1, + "Good Listener" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Shopkeeper": { + "time": 6, + "res": 16, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 4, + "Merchant-wise", + "Haggling", + "Accounting", + "Observation" + ] + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Baker": { + "time": 6, + "res": 10, + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 5, + "Baking", + "Cooking", + "Daily Bread-wise", + "Sweet Tooth-wise" + ] + ], + "traits": [ + 1, + "Floury" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Alewife": { + "time": 6, + "res": 12, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Court", + "Peasant", + "Villager" + ], + "skills": [ + [ + 5, + "Brewer", + "Mending", + "Drinking", + "Administration", + "Drunk Husband-wise" + ] + ], + "traits": [ + 1, + "Domineering Presence" + ], + "restrict": "Character must be female", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Noble Court Subsetting", + "Peasant Setting", + "Villager Setting" + ] + }, + "Conner": { + "time": 6, + "res": 12, + "leads": [ + "Court", + "Peasant", + "Villager" + ], + "skills": [ + [ + 5, + "Brewer", + "Mending", + "Drinking", + "Cooper", + "Beer-wise" + ] + ], + "traits": [ + 1, + "Red Cheeks", + "Drunk" + ], + "key_leads": [ + "Noble Court Subsetting", + "Peasant Setting", + "Villager Setting" + ] + }, + "Clerk": { + "time": 4, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 4, + "Bureaucracy", + "Write", + "Read", + "Accounting", + "Bribe-wise", + "Paperwork-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Scribe": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 5, + "Write", + "Illuminations", + "Read", + "Handwriting-wise" + ] + ], + "traits": [ + 1, + "Near-sighted", + "Cramped Hands" + ], + "requires": "Student, Acolyte or Clerk", + "requires_expr": [ + "student", + "acolyte", + "clerk" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Accountant": { + "time": 10, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 4, + "Accounting", + "Bureaucracy", + "Write", + "Read", + "Ledger-wise" + ] + ], + "traits": [ + 1, + "Bored" + ], + "requires": "Clerk, Young Lady or Student", + "requires_expr": [ + "clerk", + "young lady", + "student" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Scholar": { + "time": 10, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Court" + ], + "skills": [ + [ + 11, + "Read", + "Research", + "History", + "Philosophy", + "Symbology", + "Instruction", + "Illuminations", + "Foreign Languages", + "Ancient Languages" + ] + ], + "traits": [ + 1, + "Know It All", + "Bookworm" + ], + "requires": "Scribe, Thinker, Archivist, Interpreter, Custodian, Bishop or any sorcerous lifepath", + "requires_expr": [ + "scribe", + "thinker", + "archivist", + "interpreter", + "custodian", + "bishop", + "augur", + "sorcerer", + "court sorcerer", + "rogue wizard", + "wizard of war", + "neophyte sorcerer" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Moneylender": { + "time": 8, + "res": 20, + "leads": [ + "Villager", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Currency-wise", + "Haggling", + "Accounting" + ] + ], + "traits": [ + 1, + "Penny-wise" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Tax Collector": { + "time": 5, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 4, + "Intimidation", + "Accounting", + "Haggling", + "Interrogation" + ] + ], + "traits": [ + 1, + "Hard-hearted" + ], + "restrict": "May not be the character's second lifepath.", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Taskmaster": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 5, + "Intimidation", + "Brawling", + "Sing", + "Conspicuous", + "Laborer-wise" + ] + ], + "traits": [ + 1, + "Intimidating", + "Dreadful" + ], + "restrict": "May not be the character's second lifepath", + "requires_expr": [ + "+has_n_lifepaths_or_more", + 2 + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Mercenary Captain": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "Seafaring", + "Outcast" + ], + "skills": [ + [ + 6, + "Pilot", + "Fat Merchant-wise", + "Sword", + "Climbing", + "Intimidation" + ] + ], + "traits": [ + 2, + "Predatory" + ], + "requires": "Sailor, Pirate or Knight", + "requires_expr": [ + "sailor", + "pirate", + "knight" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Seafaring Setting", + "Outcast Subsetting" + ] + }, + "City Guard": { + "time": 5, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast" + ], + "skills": [ + [ + 5, + "Brawling", + "Intimidation", + "Drinking", + "Appropriate Weapons", + "Armor Training" + ] + ], + "traits": [ + 1, + "Drunk" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Sergeant-at-arms": { + "time": 6, + "res": 11, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Outcast" + ], + "skills": [ + [ + 6, + "Intimidation", + "Appropriate Weapons", + "Armor Training", + "Field Dressing" + ] + ], + "traits": [ + 1, + "Overworked" + ], + "requires": "Any Guard lifepath, Marine, First Mate, Foot Soldier, Freebooter, Squire, Man-At-Arms, Cavalryman", + "requires_expr": [ + "village guard", + "city guard", + "guard captain", + "marine", + "first mate", + "foot soldier", + "freebooter", + "squire", + "man-at-arms", + "cavalryman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Guard Captain": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "Outcast", + "Court" + ], + "skills": [ + [ + 6, + "Etiquette", + "Riding", + "Intimidation", + "Command", + "Appropriate Weapons" + ] + ], + "traits": [ + 1, + "Exasperated" + ], + "requires": "Knight, Captain or any Sergeant", + "requires_expr": [ + "knight", + "captain", + "village sergeant", + "corrupt sergeant", + "sergeant-at-arms", + "sergeant" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Apprentice": { + "time": 7, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Soldier", + "Seafaring" + ], + "skills": [ + [ + 6, + "Mending", + "Write", + "Read", + "Hauling", + "Driving", + "Ditch Digging" + ] + ], + "traits": [ + 2, + "Broken In", + "Back-breaking Labor" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Professional Soldier Subsetting", + "Seafaring Setting" + ] + }, + "Apprentice Artisan": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Soldier" + ], + "skills": [ + [ + 8, + "Artisan-wise", + "Mason", + "Blacksmith", + "Coppersmith", + "Whitesmith", + "Carpentry", + "Write", + "Read", + "Jargon" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting" + ] + }, + "Journeyman": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Soldier", + "Seafaring" + ], + "skills": [ + [ + 7, + "Haggling", + "Appraisal", + "Blacksmith", + "Carpentry", + "Tanner", + "Potter", + "Cooper" + ] + ], + "traits": [ + 1, + "Made Man", + "Geometric" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Professional Soldier Subsetting", + "Seafaring Setting" + ] + }, + "Engraver": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Court" + ], + "skills": [ + [ + 4, + "Engraving", + "Etching", + "Jargon" + ] + ], + "traits": [ + 1, + "Gentle But Firm" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Noble Court Subsetting" + ] + }, + "Saddler": { + "time": 8, + "res": 25, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Villager", + "Soldier", + "Court" + ], + "skills": [ + [ + 6, + "Saddlery", + "Tanner", + "Sewing", + "Embroidery", + "Mending", + "Mount-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Villager Setting", + "Professional Soldier Subsetting", + "Noble Court Subsetting" + ] + }, + "Armorer": { + "time": 10, + "res": 25, + "leads": [ + "Soldier", + "Court", + "Outcast" + ], + "skills": [ + [ + 7, + "Swordsman-wise", + "Blacksmith", + "Tanner", + "Armorer", + "Weaponsmith" + ] + ], + "traits": [ + 1, + "Diligent" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Plumber": { + "time": 7, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "Outcast" + ], + "skills": [ + [ + 5, + "Plumbing", + "Engineering", + "Coppersmith", + "Waterworks-wise" + ] + ], + "traits": [ + 1, + "A Touch Of Madness" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Locksmith": { + "time": 8, + "res": 13, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager" + ], + "skills": [ + [ + 4, + "Locksmith", + "Haggling", + "Lock-wise" + ] + ], + "traits": [ + 1, + "Steady Hands" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting" + ] + }, + "Jeweler": { + "time": 9, + "res": 20, + "leads": [ + "Villager", + "Peasant" + ], + "skills": [ + [ + 5, + "Jeweler", + "Lapidary", + "Appraisal", + "Haggling", + "Falsehood" + ] + ], + "traits": [ + 1, + "Guarded" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting" + ] + }, + "Gaol Warden": { + "time": 4, + "res": 15, + "leads": [ + "Outcast", + "Court", + "Soldier", + "Villager" + ], + "skills": [ + [ + 4, + "Administration", + "Etiquette", + "Gaol-wise", + "Everybody's Innocent-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Born Noble, Merchant, Sergeant, Man-At-Arms or Judge", + "requires_expr": [ + "born noble", + "merchant", + "sergeant", + "man-at-arms", + "judge" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting", + "Professional Soldier Subsetting", + "Villager Setting" + ] + }, + "Advocate": { + "time": 6, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Court", + "Villager" + ], + "skills": [ + [ + 6, + "Rule Of Law", + "Bureaucracy", + "Persuasion", + "History", + "Rhetoric" + ] + ], + "traits": [ + 1, + "Shrewd" + ], + "requires": "Student or Young Lady", + "requires_expr": [ + "student", + "young lady" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting", + "Villager Setting" + ] + }, + "Doctor": { + "time": 7, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Court", + "Villager" + ], + "skills": [ + [ + 6, + "Anatomy", + "Apothecary", + "Bloodletting", + "Surgery", + "Soothing Platitudes" + ] + ], + "traits": [ + 2, + "Frustrated" + ], + "requires": "Student or Young Lady", + "requires_expr": [ + "student", + "young lady" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting", + "Villager Setting" + ] + }, + "Physician": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 6, + "Herbalism", + "Apothecary", + "Anatomy", + "Research", + "Herbalist-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Midwife, Young Lady or Student", + "requires_expr": [ + "midwife", + "young lady", + "student" + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Hospital Warden": { + "time": 4, + "res": 15, + "leads": [ + "Outcast", + "Servitude", + "Religious" + ], + "skills": [ + [ + 5, + "Administration", + "Beggar-wise", + "Vagrant-wise", + "Leper-wise" + ] + ], + "traits": [ + 2, + "Overworked", + "Generous", + "Venal", + "Hypochondriac" + ], + "requires": "Any Noble, Noble Court or Religious lifepath", + "requires_expr": [ + "noble setting:born noble", + "noble setting:bastard", + "noble setting:page", + "noble setting:student", + "noble setting:squire", + "noble setting:arcane devotee", + "noble setting:religious acolyte", + "noble setting:young lady", + "noble setting:knight", + "noble setting:lady", + "noble setting:lord", + "noble setting:dame", + "noble setting:baron", + "noble setting:viscount", + "noble setting:count", + "noble setting:duke", + "noble setting:noble prince", + "noble setting:prince of the blood", + "noble court subsetting:minstrel", + "noble court subsetting:court jester", + "noble court subsetting:court artist", + "noble court subsetting:servant", + "noble court subsetting:nurse", + "noble court subsetting:groom", + "noble court subsetting:gardener", + "noble court subsetting:torturer", + "noble court subsetting:forester", + "noble court subsetting:student", + "noble court subsetting:page", + "noble court subsetting:man-at-arms", + "noble court subsetting:falconer", + "noble court subsetting:huntsman", + "noble court subsetting:herald", + "noble court subsetting:court chef", + "noble court subsetting:squire", + "noble court subsetting:young lady", + "noble court subsetting:knight", + "noble court subsetting:courtier", + "noble court subsetting:governess", + "noble court subsetting:chaplain", + "noble court subsetting:court sorcerer", + "noble court subsetting:court lawyer", + "noble court subsetting:court doctor", + "noble court subsetting:chronicler", + "noble court subsetting:armorer", + "noble court subsetting:atilliator", + "noble court subsetting:court priest", + "noble court subsetting:steward", + "noble court subsetting:master of horses", + "noble court subsetting:master of hounds", + "noble court subsetting:hostage", + "noble court subsetting:bailiff", + "noble court subsetting:justicar", + "noble court subsetting:coroner", + "noble court subsetting:constable", + "noble court subsetting:treasurer", + "noble court subsetting:chamberlain", + "noble court subsetting:advisor to the court", + "religious subsetting:castrati", + "religious subsetting:pardoner", + "religious subsetting:zealous convert", + "religious subsetting:military order", + "religious subsetting:grave digger", + "religious subsetting:porter", + "religious subsetting:notary", + "religious subsetting:custodian", + "religious subsetting:interpreter", + "religious subsetting:archivist", + "religious subsetting:itinerant monk", + "religious subsetting:cloistered monk/nun", + "religious subsetting:temple acolyte", + "religious subsetting:priest", + "religious subsetting:exorcist", + "religious subsetting:inquisitor", + "religious subsetting:theologian", + "religious subsetting:archpriest", + "religious subsetting:canon", + "religious subsetting:abbot/abbess", + "religious subsetting:bishop" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Religious Subsetting" + ] + }, + "Banker": { + "time": 10, + "res": 60, + "leads": [ + "Court", + "Noble" + ], + "skills": [ + [ + 4, + "Accounting", + "Administration", + "Currency-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 1, + "Intense" + ], + "requires": "Merchant, Moneylender, Steward, Accountant or Chamberlain", + "requires_expr": [ + "merchant", + "moneylender", + "steward", + "accountant", + "chamberlain" + ], + "key_leads": [ + "Noble Court Subsetting", + "Noble Setting" + ] + }, + "Merchant": { + "time": 6, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Court" + ], + "skills": [ + [ + 6, + "Accounting", + "Haggling", + "Supplier-wise", + "Lord-wise", + "Peasant-wise" + ] + ], + "requires": "Master Craftsman, Master of Horses, Master of Hounds, Moneylender, Steward, Jeweler, Saddler, Armorer, Cobbler, Courtier or Chamberlain", + "requires_expr": [ + "master craftsman", + "master of horses", + "master of hounds", + "moneylender", + "steward", + "jeweler", + "saddler", + "armorer", + "cobbler", + "courtier", + "chamberlain" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Noble Court Subsetting" + ] + }, + "Sorcerer": { + "time": 6, + "res": 32, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Court" + ], + "skills": [ + [ + 6, + "Sorcery", + "Enchanting", + "Calligraphy" + ] + ], + "traits": [ + 1 + ], + "requires": "Neophyte Sorcerer, Arcane Devotee or Weather Witch", + "requires_expr": [ + "neophyte sorcerer", + "arcane devotee", + "weather witch" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Temple Priest": { + "time": 5, + "res": 20, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 8, + "Church Politics-wise", + "Doctrine", + "Oratory", + "Suasion", + "Symbology" + ] + ], + "traits": [ + 2, + "Vested", + "Aloof", + "Imperious", + "Strong-willed" + ], + "requires": "Religious Acolyte, Temple Acolyte or Military Order", + "requires_expr": [ + "religious acolyte", + "temple acolyte", + "military order" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Judge": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "Villager" + ], + "skills": [ + [ + 5, + "Rule Of Law", + "Amercement", + "Criminal-wise", + "Interrogation" + ] + ], + "traits": [ + 2, + "Ornery", + "Quick-witted" + ], + "requires": "Town Official, Tax Collector, Bailiff or Justicar", + "requires_expr": [ + "town official", + "tax collector", + "bailiff", + "justicar" + ], + "key_leads": [ + "Noble Court Subsetting", + "Villager Setting" + ] + }, + "Municipal Minister": { + "time": 9, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Court", + "Outcast" + ], + "skills": [ + [ + 6, + "Persuasion", + "Rule Of Law", + "Administration", + "Oratory", + "Law-wise", + "Minister-wise" + ] + ], + "requires": "Town Official, Scholar, Priest, Bishop, Captain, Sea Captain, Artisan, Master Craftsman, Knight, Courtier or Master of Horses", + "requires_expr": [ + "town official", + "scholar", + "priest", + "bishop", + "captain", + "ship's captain", + "artisan", + "master craftsman", + "knight", + "courtier", + "master of horses" + ], + "key_leads": [ + "Villager Setting", + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Artisan": { + "time": 10, + "res": 45, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "Court" + ], + "skills": [ + [ + 9, + "Jargon", + "Mason", + "Engineering", + "Architect" + ] + ], + "traits": [ + 1, + "Self-confident" + ], + "requires": "Apprentice Artisan, Engineer or Master Craftsman", + "requires_expr": [ + "apprentice artisan", + "engineer", + "master craftsman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Noble Court Subsetting" + ] + }, + "Master Craftsman": { + "time": 10, + "res": 45, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Court", + "Soldier" + ], + "skills": [ + [ + 6, + "Craftsman-wise", + "Artisan-wise", + "Materials-wise", + "Tools-wise" + ], + [ + 3, + "General" + ] + ], + "traits": [ + 2, + "Ambitious", + "Charismatic" + ], + "requires": "Journeyman and one of the following: Locksmith, Plumber, Engraver, Saddler, Blacksmith, Armorer, Atilliator, Cobbler, Bowyer or Taskmaster", + "requires_expr": [ + "+and", + [ + "journeyman" + ], + [ + "locksmith", + "plumber", + "engraver", + "saddler", + "blacksmith", + "armorer", + "atilliator", + "cobbler", + "bowyer", + "taskmaster" + ] + ], + "key_leads": [ + "Villager Setting", + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Bishop": { + "time": 12, + "res": 60, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "Religious" + ], + "skills": [ + [ + 5, + "Etiquette", + "Bureaucracy", + "Ritual", + "Church-wise", + "City-wise" + ] + ], + "traits": [ + 1, + "Holier" + ], + "requires": "Archpriest, Canon, Steward, Chamberlain or the Your Grace trait", + "requires_expr": [ + "+or", + [ + "archpriest", + "canon", + "steward", + "chamberlain" + ], + [ + "+trait", + "your grace" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Religious Subsetting" + ] + }, + "Magnate": { + "time": 12, + "res": 75, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Noble", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 6, + "Administration", + "Merchant-wise", + "Court-wise", + "Commodities-wise", + "Pirates-wise", + "Bandit-wise" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 2, + "Self-satisfied", + "Greedy", + "Affinity For Business" + ], + "requires": "Merchant or Master of Horses", + "requires_expr": [ + "merchant", + "master of horses" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "City Wife": { + "time": 6, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Religious" + ], + "skills": [ + [ + 2, + "Child Rearing", + "Husband-wise" + ] + ], + "traits": [ + 1 + ], + "note": "A player who takes the City Wife lifepath may also choose her husband's lifepath from the City Dweller setting and may choose from his skills: she gets half of his skill points rounded down. She also receives a quarter of her husband's resource points.", + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Religious Subsetting" + ] + } + }, + "Noble Setting": { + "Born Noble": { + "time": 8, + "res": 15, + "leads": [ + "Peasant", + "Villager", + "City", + "Noble", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 5, + "General" + ] + ], + "traits": [ + 1, + "Mark Of Privilege", + "Your Lordship", + "Your Grace", + "Your Eminence" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Bastard": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Soldier", + "City", + "Religious" + ], + "skills": [ + [ + 4, + "Family Secret-wise", + "Etiquette", + "Extortion" + ] + ], + "traits": [ + 2, + "Bastard", + "Bitter", + "Cynical", + "Happy-go-lucky" + ], + "restrict": "This must be the character's second lifepath, and may only be taken once", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting", + "Religious Subsetting" + ] + }, + "Page": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude" + ], + "skills": [ + [ + 7, + "Riding", + "Brawling", + "Write", + "Read", + "Sword", + "Etiquette" + ] + ], + "traits": [ + 1 + ], + "restrict": "This must be the character's second lifepath, and may only be taken once", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting" + ] + }, + "Student": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Court" + ], + "skills": [ + [ + 8, + "Write", + "Read", + "Rule Of Law", + "Oratory", + "Doctrine", + "Etiquette" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Squire": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 9, + "Sword", + "Mounted Combat Training", + "Shield Training", + "Armor Training", + "Lance", + "Knives", + "Crossbow" + ] + ], + "traits": [ + 1 + ], + "requires": "Page or any Professional Soldier lifepath", + "requires_expr": [ + "page", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Arcane Devotee": { + "time": 6, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Court", + "Outcast" + ], + "skills": [ + [ + 6, + "Calligraphy", + "Write", + "Read", + "Research", + "Symbology" + ] + ], + "traits": [ + 2, + "Base Humility", + "Gifted" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Religious Acolyte": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Religious", + "Court" + ], + "skills": [ + [ + 6, + "Doctrine", + "Bureaucracy", + "Write", + "Read", + "Etiquette" + ] + ], + "traits": [ + 2, + "Tonsured", + "Faithful" + ], + "key_leads": [ + "City Dweller Setting", + "Religious Subsetting", + "Noble Court Subsetting" + ] + }, + "Young Lady": { + "time": 10, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Religious", + "Court" + ], + "skills": [ + [ + 11, + "Write", + "Read", + "Etiquette", + "Astrology", + "Musical Instrument", + "Composition", + "Field Dressing", + "Apothecary", + "Doctrine" + ] + ], + "traits": [ + 2 + ], + "restrict": "This must be the character's second or third lifepath, and may only be taken once. Character must be female.", + "requires_expr": [ + "+and", + [ + "+sex", + "female" + ], + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 2 + ] + ], + "key_leads": [ + "City Dweller Setting", + "Religious Subsetting", + "Noble Court Subsetting" + ] + }, + "Knight": { + "time": 5, + "res": 20, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Outcast", + "Religious" + ], + "skills": [ + [ + 10, + "Mounted Combat Training", + "Shield Training", + "Armor Training", + "Appropriate Weapons", + "Intimidation", + "Hunting", + "Conspicuous" + ] + ], + "traits": [ + 2, + "Sworn Homage" + ], + "requires": "Squire or Cavalryman", + "requires_expr": [ + "squire", + "cavalryman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Outcast Subsetting", + "Religious Subsetting" + ] + }, + "Lady": { + "time": 5, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Religious", + "Court" + ], + "skills": [ + [ + 11, + "Etiquette", + "Estate Management", + "Persuasion", + "Seduction", + "Inconspicuous", + "Doctrine", + "Husband-wise", + "Estate-wise", + "Staff-wise", + "Court-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Young Lady, Courtier, Knight or City Wife with Magnate or Bishop chosen as the husband's lifepath", + "requires_expr": [ + "young lady", + "courtier", + "knight", + "city wife" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Religious Subsetting", + "Noble Court Subsetting" + ] + }, + "Lord": { + "time": 7, + "res": 50, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Court" + ], + "skills": [ + [ + 6, + "Hunting", + "Dance", + "Sing", + "Falconry", + "Estate Management" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Knight or the Your Lordship trait", + "requires_expr": [ + "+or", + [ + "knight" + ], + [ + "+trait", + "your lordship" + ] + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Dame": { + "time": 7, + "res": 40, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Court", + "Outcast", + "Religious" + ], + "skills": [ + [ + 3, + "Estate Management", + "Noble-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Lady, City Wife with Magnate or Bishop as the husband's lifepath or the Your Lordship trait", + "requires_expr": [ + "+or", + [ + "lady", + "city wife" + ], + [ + "+trait", + "your lordship" + ] + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Outcast Subsetting", + "Religious Subsetting" + ] + }, + "Baron": { + "time": 8, + "res": 60, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 1, + "General" + ] + ], + "traits": [ + 1, + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "Knight and the Your Lordship trait; or Magnate, Master of Horses, Steward, Lord, Constable or Justicar", + "requires_expr": [ + "+or", + [ + "+and", + [ + "knight" + ], + [ + "+trait", + "your lordship" + ] + ], + [ + "magnate", + "master of horses", + "steward", + "lord", + "constable", + "justicar" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Viscount": { + "time": 9, + "res": 65, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 2, + "General" + ] + ], + "traits": [ + 1, + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "Knight and the Your Eminence trait; or Magnate, Baron, Constable or Justicar", + "requires_expr": [ + "+or", + [ + "+and", + [ + "knight" + ], + [ + "+trait", + "your eminence" + ] + ], + [ + "magnate", + "baron", + "constable", + "justicar" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Count": { + "time": 10, + "res": 70, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 1, + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "Knight and the Your Eminence trait; or Magnate, Constable or Justicar", + "requires_expr": [ + "+or", + [ + "+and", + [ + "knight" + ], + [ + "+trait", + "your eminence" + ] + ], + [ + "magnate", + "constable", + "justicar" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Duke": { + "time": 10, + "res": 90, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 1, + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "Count or Knight and the Your Grace trait", + "requires_expr": [ + "+or", + [ + "+and", + [ + "knight" + ], + [ + "+trait", + "your grace" + ] + ], + [ + "count" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Noble Prince": { + "time": 10, + "res": 100, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Court", + "Soldier" + ], + "skills": [ + [ + 4, + "General" + ] + ], + "traits": [ + 1, + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "Duke or Knight and the Your Grace trait", + "requires_expr": [ + "+or", + [ + "+and", + [ + "knight" + ], + [ + "+trait", + "your grace" + ] + ], + [ + "duke" + ] + ], + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Prince Of The Blood": { + "time": "*", + "time_expr": [ + "+range", + 2, + 20 + ], + "res": 60, + "leads": [ + "Court", + "Soldier", + "Religious" + ], + "skills": [ + [ + 2, + "General" + ] + ], + "traits": [ + 2, + "Born To Be King", + "Noblesse Oblige", + "Regal Bearing", + "Pompous", + "Sharp Dresser", + "Callous" + ], + "requires": "The Your Grace trait and express permission from the GM and all players in the current game", + "requires_expr": [ + "+trait", + "your grace" + ], + "note": "Players may take the Prince of the Blood lifepath for any appropriate length of time, between 2 and 20 years.", + "key_leads": [ + "Noble Court Subsetting", + "Professional Soldier Subsetting", + "Religious Subsetting" + ] + } + }, + "Noble Court Subsetting": { + "Minstrel": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Villager" + ], + "skills": [ + [ + 5, + "Poetry", + "Sing", + "Musical Instrument" + ] + ], + "traits": [ + 1, + "Recondite" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Villager Setting" + ] + }, + "Court Jester": { + "time": 5, + "res": 10, + "leads": [ + "Outcast", + "Servitude" + ], + "skills": [ + [ + 7, + "Sing", + "Sleight Of Hand", + "Climbing", + "Conspicuous", + "Throwing", + "Ugly Truth" + ] + ], + "traits": [ + 3, + "Scapegoat", + "Aura Of Innocence" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Court Artist": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Outcast" + ], + "skills": [ + [ + 5, + "Sculpture", + "Painting", + "Engraving", + "Seduction", + "Genius-wise" + ] + ], + "traits": [ + 1, + "Romantic" + ], + "requires": "Court Jester, Painter, Thinker, Scholar or Sculptor", + "requires_expr": [ + "court jester", + "painter", + "thinker", + "scholar", + "sculptor" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Servant": { + "time": 6, + "res": 7, + "leads": [ + "Outcast", + "Servitude" + ], + "skills": [ + [ + 4, + "Inconspicuous", + "Etiquette", + "Court Gossip-wise" + ] + ], + "traits": [ + 2, + "Veneer Of Obedience", + "Lifting Heavy Things", + "Bored" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Nurse": { + "time": 6, + "res": 7, + "leads": [ + "Outcast", + "Servitude", + "Villager" + ], + "skills": [ + [ + 5, + "Child Rearing", + "Etiquette", + "Court Gossip-wise", + "Field Dressing", + "Child-wise" + ] + ], + "traits": [ + 2, + "Maternal" + ], + "restrict": "Character must be female.", + "requires_expr": [ + "+sex", + "female" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Groom": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Villager", + "Soldier" + ], + "skills": [ + [ + 5, + "Animal Husbandry", + "Riding", + "Mending", + "Border-wise", + "Road-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Professional Soldier Subsetting" + ] + }, + "Gardener": { + "time": 10, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Servitude" + ], + "skills": [ + [ + 7, + "Plant-wise", + "Flower-wise", + "Tree-wise", + "Pest-wise", + "Herbalism", + "Farming", + "Almanac" + ] + ], + "traits": [ + 2, + "Earthy Smell", + "Salt Of The Earth", + "Down To Earth", + "Affinity For Plants" + ], + "key_leads": [ + "City Dweller Setting", + "Servitude And Captive Setting" + ] + }, + "Torturer": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Servitude", + "Soldier" + ], + "skills": [ + [ + 5, + "Interrogation", + "Torture", + "Anatomy", + "Torture Devices-wise" + ] + ], + "traits": [ + 1, + "Unsavory Madman" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Forester": { + "time": 7, + "res": 9, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "Soldier", + "Villager", + "Outcast" + ], + "skills": [ + [ + 8, + "Observation", + "Orienteering", + "Foraging", + "Survival", + "Tracking", + "Trapper", + "Cudgel", + "Staff", + "Bow", + "Poacher-wise", + "Park-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Student": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Noble", + "Religious" + ], + "skills": [ + [ + 9, + "Write", + "Read", + "Rule Of Law", + "Oratory", + "Doctrine", + "Etiquette" + ] + ], + "traits": [ + 1, + "Dangerous", + "Geometric" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Setting", + "Religious Subsetting" + ] + }, + "Page": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Noble" + ], + "skills": [ + [ + 6, + "Riding", + "Brawling", + "Write", + "Read", + "Sword" + ] + ], + "traits": [ + 1 + ], + "restrict": "This must be the character's second lifepath, and may only be taken once.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Noble Setting" + ] + }, + "Man-at-arms": { + "time": 6, + "res": 12, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Outcast" + ], + "skills": [ + [ + 8, + "Mounted Combat Training", + "Shield Training", + "Armor Training", + "Brawling", + "Intimidation", + "Etiquette", + "Appropriate Weapons" + ] + ], + "traits": [ + 1 + ], + "requires": "Page, Squire or any Professional Soldier lifepath", + "requires_expr": [ + "page", + "squire", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Falconer": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "Soldier", + "City" + ], + "skills": [ + [ + 4, + "Falconry", + "Animal Husbandry", + "Hunting" + ] + ], + "traits": [ + 2, + "Boaster", + "Wierd", + "Birdie Talk" + ], + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Huntsman": { + "time": 5, + "res": 12, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "Soldier" + ], + "skills": [ + [ + 8, + "Hunting", + "Animal Husbandry", + "Forest-wise", + "Stealthy", + "Cooking", + "Tracking", + "Orienteering", + "Crossbow" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting" + ] + }, + "Herald": { + "time": 4, + "res": 10, + "leads": [ + "Soldier", + "Servitude", + "City" + ], + "skills": [ + [ + 4, + "Heraldry", + "Noble-wise" + ] + ], + "traits": [ + 1, + "Formalist", + "Rainman", + "Eidetic Memory" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Servitude And Captive Setting", + "City Dweller Setting" + ] + }, + "Court Chef": { + "time": 5, + "res": 14, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "City" + ], + "skills": [ + [ + 5, + "Cooking", + "Sing", + "Herbalism", + "Falsehood" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Outcast Subsetting", + "City Dweller Setting" + ] + }, + "Squire": { + "time": 5, + "res": 14, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast", + "Noble" + ], + "skills": [ + [ + 9, + "Sword", + "Armor Training", + "Shield Training", + "Lance", + "Brawling", + "Mounted Combat Training", + "Etiquette" + ] + ], + "traits": [ + 1, + "Pragmatic", + "Tough", + "Determined" + ], + "requires": "Corrupt Sergeant, Village Sergeant, Sergeant, Veteran, Page or Man-At-Arms", + "requires_expr": [ + "corrupt sergeant", + "village sergeant", + "sergeant", + "veteran", + "page", + "man-at-arms" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Noble Setting" + ] + }, + "Young Lady": { + "time": 9, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Noble", + "Religious" + ], + "skills": [ + [ + 10, + "Write", + "Read", + "Etiquette", + "Poetry", + "Astrology", + "Musical Instrument", + "Composition", + "Field Dressing", + "Apothecary", + "Court Gossip-wise" + ] + ], + "traits": [ + 1 + ], + "restrict": "This must be the character's second or third lifepath, and may only be taken once. Character must be female.", + "requires_expr": [ + "+and", + [ + "+sex", + "female" + ], + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 2 + ] + ], + "key_leads": [ + "City Dweller Setting", + "Noble Setting", + "Religious Subsetting" + ] + }, + "Knight": { + "time": 6, + "res": 20, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Noble", + "Outcast" + ], + "skills": [ + [ + 11, + "Conspicuous", + "Intimidation", + "Falconry", + "Mounted Combat Training", + "Shield Training", + "Armor Training", + "Appropriate Weapons" + ] + ], + "traits": [ + 1, + "Sworn Homage", + "Sense Of Entitlement" + ], + "requires": "Squire or Cavalryman", + "requires_expr": [ + "squire", + "cavalryman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Noble Setting", + "Outcast Subsetting" + ] + }, + "Courtier": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Noble" + ], + "skills": [ + [ + 8, + "Etiquette", + "Observation", + "Persuasion", + "Seduction", + "Inconspicuous", + "Court Gossip-wise", + "Noble-wise" + ] + ], + "traits": [ + 2, + "Rapier Wit" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Setting" + ] + }, + "Governess": { + "time": 8, + "res": 12, + "leads": [ + "Outcast", + "Servitude", + "Villager" + ], + "skills": [ + [ + 7, + "Family-wise", + "Administration", + "Intimidation", + "Etiquette", + "Persuasion", + "Ugly Truth" + ] + ], + "traits": [ + 1, + "Dismissive", + "You Should Know Better Than That!", + "Bitter" + ], + "requires": "Nurse, Midwife, Lady or any Wife lifepath", + "requires_expr": [ + "nurse", + "midwife", + "lady", + "country wife", + "village wife", + "city wife" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Chaplain": { + "time": 5, + "res": 18, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "City", + "Religious", + "Servitude" + ], + "skills": [ + [ + 8, + "Oratory", + "Doctrine", + "Riding", + "Armor Training", + "Mounted Combat Training", + "Shield Training", + "Appropriate Weapons" + ] + ], + "traits": [ + 1 + ], + "requires": "Any Priest lifepath or Military Order", + "requires_expr": [ + "itinerant priest", + "village priest", + "venal priest", + "temple priest", + "court priest", + "heretic priest", + "priest", + "archpriest", + "military order" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Religious Subsetting", + "Servitude And Captive Setting" + ] + }, + "Court Sorcerer": { + "time": 8, + "res": 32, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "City" + ], + "skills": [ + [ + 7, + "Etiquette", + "Falsehood", + "Astrology", + "Alchemy", + "Sorcery" + ] + ], + "traits": [ + 1, + "Inscrutable", + "Gifted", + "Second Sight" + ], + "requires": "Arcane Devotee, Rogue Wizard or Sorcerer", + "requires_expr": [ + "arcane devotee", + "rogue wizard", + "sorcerer" + ], + "key_leads": [ + "Outcast Subsetting", + "City Dweller Setting" + ] + }, + "Court Lawyer": { + "time": 8, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Religious" + ], + "skills": [ + [ + 6, + "Etiquette", + "Oratory", + "Persuasion", + "Rule Of Law", + "History" + ] + ], + "traits": [ + 1, + "Rhetorical", + "Evasive" + ], + "requires": "Student or Advocate", + "requires_expr": [ + "student", + "advocate" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Religious Subsetting" + ] + }, + "Court Doctor": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast" + ], + "skills": [ + [ + 7, + "Etiquette", + "Apothecary", + "Bloodletting", + "Surgery", + "Anatomy", + "Astrology", + "Falsehood" + ] + ], + "traits": [ + 1, + "Incomprehensible Diagnosis" + ], + "requires": "Student, Itinerant Monk, Cloistered Monk/Nun or Priest", + "requires_expr": [ + "student", + "itinerant monk", + "cloistered monk/nun", + "priest" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Chronicler": { + "time": 10, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Villager" + ], + "skills": [ + [ + 6, + "Composition", + "History", + "Etiquette", + "Illuminations", + "Obscure History" + ] + ], + "traits": [ + 2, + "Prone To Exaggeration", + "Flatterer", + "Denouncer", + "Cynical", + "Righteous" + ], + "requires": "Student, Custodian, Interpreter, Archivist or Young Lady", + "requires_expr": [ + "student", + "custodian", + "interpreter", + "archivist", + "young lady" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Villager Setting" + ] + }, + "Armorer": { + "time": 7, + "res": 25, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 9, + "Etching", + "Armorer", + "Blacksmith", + "Tanner", + "Sewing", + "Weaponsmith" + ] + ], + "traits": [ + 1, + "Proud" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Atilliator": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City" + ], + "skills": [ + [ + 6, + "Atilliator", + "Carpentry", + "Carving" + ] + ], + "traits": [ + 1, + "Professionally Diligent" + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Court Priest": { + "time": 6, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "City", + "Religious" + ], + "skills": [ + [ + 5, + "Etiquette", + "History", + "Symbology", + "Doctrine", + "Persuasion" + ] + ], + "traits": [ + 2, + "Royal Favorite", + "Faithful" + ], + "requires": "Chaplain, Priest or Religious Acolyte", + "requires_expr": [ + "chaplain", + "priest", + "religious acolyte" + ], + "key_leads": [ + "Outcast Subsetting", + "City Dweller Setting", + "Religious Subsetting" + ] + }, + "Steward": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Noble", + "Outcast", + "Religious" + ], + "skills": [ + [ + 5, + "Estate Management", + "Accounting", + "Observation", + "Manor-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Town Official, Municipal Minister, Judge, Court Lawyer, Court Doctor, Governess, Young Lady, Magnate or Lord", + "requires_expr": [ + "town official", + "municipal minister", + "judge", + "court lawyer", + "court doctor", + "governess", + "young lady", + "magnate", + "lord" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Setting", + "Outcast Subsetting", + "Religious Subsetting" + ] + }, + "Master Of Horses": { + "time": 8, + "res": 40, + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 4, + "Horse Husbandry", + "Appraisal", + "Horse-wise" + ] + ], + "traits": [ + 1, + "Love Of The Horse", + "Low Speech", + "Affinity For Horses" + ], + "requires": "Captain, Baron, Saddler, Merchant or Magnate", + "requires_expr": [ + "captain", + "baron", + "saddler", + "merchant", + "magnate" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Master Of Hounds": { + "time": 7, + "res": 20, + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 7, + "Dog Husbandry", + "Dog-wise", + "Hunting", + "Instruction", + "Mimicry" + ] + ], + "traits": [ + 1, + "Dog Lover", + "Pigpen", + "Emotional", + "Iron Stomach" + ], + "requires": "Captain, Baron, Saddler, Merchant or Magnate", + "requires_expr": [ + "captain", + "baron", + "saddler", + "merchant", + "magnate" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Hostage": { + "time": 6, + "res": "*", + "res_expr": [ + "+mult_prev", + 0.5 + ], + "leads": [ + "City", + "Noble", + "Soldier", + "Religious" + ], + "skills": [ + [ + 4, + "Etiquette", + "Court-wise", + "Foreign Languages", + "Foreign History" + ] + ], + "traits": [ + 1, + "Homesick", + "Bored", + "Darling Of The Court" + ], + "requires": "Any lifepath from the Noble setting", + "requires_expr": [ + "noble setting:born noble", + "noble setting:bastard", + "noble setting:page", + "noble setting:student", + "noble setting:squire", + "noble setting:arcane devotee", + "noble setting:religious acolyte", + "noble setting:young lady", + "noble setting:knight", + "noble setting:lady", + "noble setting:lord", + "noble setting:dame", + "noble setting:baron", + "noble setting:viscount", + "noble setting:count", + "noble setting:duke", + "noble setting:noble prince", + "noble setting:prince of the blood" + ], + "note": "Hostage gives resource points equal to half of the character's previous lifepath.", + "key_leads": [ + "City Dweller Setting", + "Noble Setting", + "Professional Soldier Subsetting", + "Religious Subsetting" + ] + }, + "Bailiff": { + "time": 4, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "City", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 7, + "Intimidation", + "Interrogation", + "Rule Of Law", + "Outlaw-wise", + "Village-wise", + "City-wise", + "Tax-wise" + ] + ], + "traits": [ + 1, + "Nose For Trouble" + ], + "requires": "Knight or the Your Lordship trait", + "requires_expr": [ + "+or", + [ + "knight" + ], + [ + "+trait", + "your lordship" + ] + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Justicar": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "City", + "Soldier", + "Religious", + "Outcast" + ], + "skills": [ + [ + 6, + "Rule Of Law", + "Amercement", + "Interrogation", + "Criminal-wise", + "Circuit-wise" + ] + ], + "traits": [ + 1, + "Stern Demeanor", + "Amenable To Other Options" + ], + "requires": "Judge, Captain, Bailiff or Lord", + "requires_expr": [ + "judge", + "captain", + "bailiff", + "lord" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Religious Subsetting", + "Outcast Subsetting" + ] + }, + "Coroner": { + "time": 6, + "res": 15, + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 5, + "Rule Of Law", + "Anatomy", + "Writ-wise", + "Observation" + ] + ], + "traits": [ + 1, + "Hard-hearted", + "Seen It All" + ], + "requires": "Steward, Town Official, Municipal Minister, Judge, Court Lawyer, Court Doctor, Magnate or Lord", + "requires_expr": [ + "steward", + "town official", + "municipal minister", + "judge", + "court lawyer", + "court doctor", + "magnate", + "lord" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Constable": { + "time": 6, + "res": 50, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 5, + "Command", + "Heraldry", + "Logistics", + "Kingdom-wise", + "Obligation-wise", + "Soldier-wise", + "Cavalry-wise" + ] + ], + "traits": [ + 1, + "Weight Of The World" + ], + "requires": "Captain, Baron, Viscount, Count, Duke or Prince", + "requires_expr": [ + "captain", + "baron", + "viscount", + "count", + "duke", + "noble prince", + "prince of the blood" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Treasurer": { + "time": 7, + "res": 45, + "leads": [ + "City", + "Soldier", + "Religious" + ], + "skills": [ + [ + 5, + "Accounting", + "Estate Management", + "Tax-wise", + "Debt-wise" + ] + ], + "traits": [ + 1, + "Pecunious", + "Lavish Taste" + ], + "requires": "Steward, Town Official, Municipal Minister, Judge, Court Lawyer, Court Doctor, Magnate, Baron, Bishop, Viscount, Count or Duke", + "requires_expr": [ + "steward", + "town official", + "municipal minister", + "judge", + "court lawyer", + "court doctor", + "magnate", + "baron", + "bishop", + "viscount", + "count", + "duke" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Religious Subsetting" + ] + }, + "Chamberlain": { + "time": 7, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Soldier", + "Religious" + ], + "skills": [ + [ + 5, + "Soothing Platitudes", + "Persuasion", + "Ugly Truth" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 1 + ], + "Requires": "Scholar, Steward, Town Official, Municipal Minister, Judge, Court Lawyer, Court Doctor, Magnate, Baron, Bishop, Viscount, Count or Duke", + "requires_expr": [ + "scholar", + "steward", + "town official", + "municipal minister", + "judge", + "court lawyer", + "court doctor", + "magnate", + "baron", + "bishop", + "viscount", + "count", + "duke" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Religious Subsetting" + ] + }, + "Advisor To The Court": { + "time": "*", + "time_expr": [ + "+range", + 1, + 3 + ], + "res": "*", + "res_expr": [ + "+mult_time", + 10 + ], + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Noble", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + "*", + "General" + ] + ], + "skills_expr": [ + "+mult_time", + 1 + ], + "traits": [ + 1 + ], + "requires": "Thinker, Captain, Sea Captain, Magnate, Master Craftsman, Artisan, Bishop, Rogue Wizard, Mad Summoner, Heretic Priest, Dame, Baron, Viscount, Count, Duke or Prince", + "requires_expr": [ + "thinker", + "captain", + "ship's captain", + "magnate", + "master craftsman", + "artisan", + "bishop", + "rogue wizard", + "mad summoner", + "heretic priest", + "dame", + "baron", + "viscount", + "count", + "duke", + "noble prince", + "prince of the blood" + ], + "note": "This lifepath can be one to three years long, player chooses tenure. Character earns 1 general skill point and 10 resource points per year. The stat and trait points are earned once.", + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Servitude And Captive Setting": { + "Born Slave": { + "time": 12, + "res": 5, + "stat": [ + [ + -1, + "pm" + ] + ], + "leads": [ + "Soldier", + "Outcast" + ], + "skills": [ + [ + 1, + "Slavery-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 3, + "Broken", + "Scarred", + "Maimed", + "Lame" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Ditch Digging": { + "time": 4, + "res": 4, + "leads": [ + "Soldier", + "Outcast" + ], + "skills": [ + [ + 3, + "Ditch Digging", + "Sing", + "Boss-wise" + ] + ], + "traits": [ + 2, + "Blisters", + "Back-breaking Labor" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Servant": { + "time": 5, + "res": 6, + "leads": [ + "Outcast", + "Soldier", + "City", + "Court" + ], + "skills": [ + [ + 2, + "Soothing Platitudes", + "Gossip-wise" + ] + ], + "traits": [ + 2, + "Mind-numbing Work", + "Obsequious" + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Field Laborer": { + "time": 6, + "res": 5, + "leads": [ + "Outcast", + "Soldier" + ], + "skills": [ + [ + 7, + "Farming", + "Mending", + "Sing", + "Hauling", + "Driving", + "Fall Grass-wise" + ] + ], + "traits": [ + 3, + "Hope" + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Captive Of War": { + "time": 4, + "res": 4, + "leads": [ + "Outcast", + "Soldier", + "City" + ], + "skills": [ + [ + 2, + "Cell-wise", + "Chain-wise" + ] + ], + "traits": [ + 2, + "Claustrophobic", + "Resigned To Fate" + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Gaol": { + "time": 3, + "res": 3, + "leads": [ + "Outcast", + "Soldier", + "City" + ], + "skills": [ + [ + 3, + "Gaol-wise", + "Ratiquette" + ] + ], + "traits": [ + 2, + "Involuntary Shudders" + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Harem Slave": { + "time": 5, + "res": 4, + "leads": [ + "Outcast" + ], + "skills": [ + [ + 3, + "Falsehood", + "Seduction" + ] + ], + "traits": [ + 2, + "Numb", + "Worldly" + ], + "key_leads": [ + "Outcast Subsetting" + ] + }, + "Bondsman": { + "time": 7, + "res": 7, + "leads": [ + "Peasant", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 0 + ] + ], + "traits": [ + 2, + "Lucky" + ], + "note": "The player may choose his Bondsman's owner's lifepath from the Noble, City Dweller, Soldier or Villager setting. The Bondsman may purchase from owner's skills with one quarter of that path's skill points (minimum of 1).", + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + } + }, + "Outcast Subsetting": { + "Urchin": { + "time": 4, + "res": 3, + "leads": [ + "Peasant", + "Soldier", + "Servitude" + ], + "skills": [ + [ + 4, + "Inconspicuous", + "Streetwise", + "Sleight Of Hand" + ] + ], + "traits": [ + 2, + "Addicted", + "The Story" + ], + "restrict": "Must be the second lifepath chosen and may only be taken once.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting", + "Servitude And Captive Setting" + ] + }, + "Apostate": { + "time": 3, + "res": 6, + "leads": [ + "City", + "Soldier", + "Religious" + ], + "skills": [ + [ + 4, + "Doctrine", + "Heretical Doctrine", + "Foreign Doctrine" + ] + ], + "traits": [ + 1, + "Apostate" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Religious Subsetting" + ] + }, + "Blackmailer": { + "time": 3, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Soldier", + "Villager", + "Seafaring" + ], + "skills": [ + [ + 4, + "Extortion", + "Forgery", + "Ugly Truth", + "Falsehood", + "Bribe-wise" + ] + ], + "traits": [ + 2, + "Cold Hearted" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Villager Setting", + "Seafaring Setting" + ] + }, + "Kidnapper": { + "time": 3, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Soldier", + "Villager", + "Seafaring" + ], + "skills": [ + [ + 5, + "Interrogation", + "Torture", + "Intimidation", + "Ransom-wise" + ] + ], + "traits": [ + 2, + "Hard-hearted" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Villager Setting", + "Seafaring Setting" + ] + }, + "Pillager": { + "time": 4, + "res": 7, + "leads": [ + "Soldier", + "City", + "Servitude", + "Seafaring" + ], + "skills": [ + [ + 4, + "Scavenging", + "Foraging", + "Army-wise", + "Battle-wise", + "Haggling" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Seafaring Setting" + ] + }, + "Vagrant": { + "time": 3, + "res": 5, + "leads": [ + "City", + "Soldier", + "Servitude" + ], + "skills": [ + [ + 4, + "Road-wise", + "Hostel-wise", + "Hospital-wise", + "Inconspicuous" + ] + ], + "traits": [ + 2 + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting", + "Servitude And Captive Setting" + ] + }, + "Cripple (Lame)": { + "display_name": "Cripple", + "time": 6, + "res": 3, + "leads": [ + "Servitude", + "City" + ], + "skills": [ + [ + 6, + "Begging", + "Inconspicuous", + "Conspicuous" + ] + ], + "traits": [ + 2, + "Lame", + "Missing Limb" + ], + "key_leads": [ + "Servitude And Captive Setting", + "City Dweller Setting" + ] + }, + "Cripple (Missing Limb)": { + "display_name": "Cripple", + "time": 6, + "res": 3, + "leads": [ + "Servitude", + "City" + ], + "skills": [ + [ + 6, + "Begging", + "Inconspicuous", + "Conspicuous" + ] + ], + "traits": [ + 2, + "Missing Limb", + "Lame" + ], + "key_leads": [ + "Servitude And Captive Setting", + "City Dweller Setting" + ] + }, + "Poacher": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Servitude", + "Soldier", + "Villager" + ], + "skills": [ + [ + 6, + "Royal Parks-wise", + "Hunting", + "Stealthy", + "Tracking", + "Orienteering" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Villager Setting" + ] + }, + "Deranged": { + "time": 6, + "res": 3, + "leads": [ + "Servitude" + ], + "skills": [ + [ + 3, + "Inconspicuous", + "Quack-wise" + ] + ], + "traits": [ + 2, + "Sick", + "Phobia", + "Lunatic", + "Linguist", + "Possessed" + ], + "key_leads": [ + "Servitude And Captive Setting" + ] + }, + "Outlaw": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager", + "Peasant", + "Seafaring" + ], + "skills": [ + [ + 5, + "Authority-wise", + "Inconspicuous", + "Conspicuous" + ] + ], + "traits": [ + 1, + "Outlaw" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Peasant Setting", + "Seafaring Setting" + ] + }, + "Fence": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Servitude", + "City", + "Soldier" + ], + "skills": [ + [ + 6, + "Appraisal", + "Haggling", + "Inconspicuous", + "Streetwise", + "Guard-wise" + ] + ], + "traits": [ + 2, + "Shrewd" + ], + "requires": "Shopkeeper, Barkeep, Moneylender or an additional prior Outcast lifepath or criminal-type Lifepath from City Dweller", + "requires_expr": [ + "shopkeeper", + "barkeep", + "outcast subsetting:urchin", + "outcast subsetting:apostate", + "outcast subsetting:blackmailer", + "outcast subsetting:kidnapper", + "outcast subsetting:pillager", + "outcast subsetting:vagrant", + "outcast subsetting:cripple", + "outcast subsetting:poacher", + "outcast subsetting:deranged", + "outcast subsetting:outlaw", + "outcast subsetting:fence", + "outcast subsetting:gravedigger", + "outcast subsetting:ratcatcher", + "outcast subsetting:beggar", + "outcast subsetting:leper", + "outcast subsetting:prostitute", + "outcast subsetting:whoremonger", + "outcast subsetting:itinerant performer", + "outcast subsetting:insurrectionist", + "outcast subsetting:cultist", + "outcast subsetting:poisoner", + "outcast subsetting:thug", + "outcast subsetting:desperate killer", + "outcast subsetting:bandit", + "outcast subsetting:pirate", + "outcast subsetting:smuggler", + "outcast subsetting:freebooter", + "outcast subsetting:strider", + "outcast subsetting:mad summoner", + "outcast subsetting:rogue wizard", + "outcast subsetting:crazy witch", + "outcast subsetting:heretic priest", + "outcast subsetting:thinker", + "moneylender", + "city dweller setting:coin clipper", + "city dweller setting:pickpocket", + "city dweller setting:criminal", + "city dweller setting:street thug", + "city dweller setting:confidence man" + ], + "key_leads": [ + "Servitude And Captive Setting", + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Gravedigger": { + "time": 5, + "res": 4, + "leads": [ + "Soldier", + "Servitude" + ], + "skills": [ + [ + 6, + "Ditch Digging", + "Philosophy", + "Grave-wise", + "Cemetery-wise", + "Bone-wise" + ] + ], + "traits": [ + 3, + "Bitter" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Servitude And Captive Setting" + ] + }, + "Ratcatcher": { + "time": 5, + "res": 4, + "leads": [ + "Rats" + ], + "skills": [ + [ + 4, + "Trapper", + "Poisons", + "Ratiquette" + ] + ], + "traits": [ + 2, + "Diseased", + "Rat-speak" + ], + "key_leads": [ + "Rats" + ] + }, + "Beggar": { + "time": 3, + "res": 5, + "leads": [ + "Peasant", + "Soldier", + "Villager" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Conspicuous", + "Streetwise", + "Falsehood" + ] + ], + "traits": [ + 2, + "The Story" + ], + "key_leads": [ + "Peasant Setting", + "Professional Soldier Subsetting", + "Villager Setting" + ] + }, + "Leper": { + "time": 4, + "res": 3, + "stat": [ + [ + -1, + "p" + ] + ], + "leads": [ + "Servitude", + "Peasant" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Hospital-wise", + "Priest-wise", + "Pilgrim-wise" + ] + ], + "traits": [ + 3, + "Leprosy", + "Unbeliever", + "White-gold Wielder" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Peasant Setting" + ] + }, + "Prostitute": { + "time": 5, + "res": 6, + "leads": [ + "Peasant", + "Villager", + "City", + "Servitude" + ], + "skills": [ + [ + 3, + "Conspicuous", + "Inconspicuous", + "Persuasion", + "Falsehood", + "Haggling", + "Soothing Platitudes" + ] + ], + "traits": [ + 2, + "Tolerant" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Servitude And Captive Setting" + ] + }, + "Whoremonger": { + "time": 6, + "res": 12, + "leads": [ + "Villager", + "City", + "Soldier" + ], + "skills": [ + [ + 5, + "Intimidation", + "Haggling", + "Prostitute-wise", + "City-wise", + "Guard-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Corrupt Sergeant, Venal Priest, Shopkeeper, Barkeep, Moneylender or an additional prior Outcast lifepath or criminal-type lifepath from City Dweller", + "requires_expr": [ + "corrupt sergeant", + "venal priest", + "shopkeeper", + "barkeep", + "outcast subsetting:urchin", + "outcast subsetting:apostate", + "outcast subsetting:blackmailer", + "outcast subsetting:kidnapper", + "outcast subsetting:pillager", + "outcast subsetting:vagrant", + "outcast subsetting:cripple", + "outcast subsetting:poacher", + "outcast subsetting:deranged", + "outcast subsetting:outlaw", + "outcast subsetting:fence", + "outcast subsetting:gravedigger", + "outcast subsetting:ratcatcher", + "outcast subsetting:beggar", + "outcast subsetting:leper", + "outcast subsetting:prostitute", + "outcast subsetting:whoremonger", + "outcast subsetting:itinerant performer", + "outcast subsetting:insurrectionist", + "outcast subsetting:cultist", + "outcast subsetting:poisoner", + "outcast subsetting:thug", + "outcast subsetting:desperate killer", + "outcast subsetting:bandit", + "outcast subsetting:pirate", + "outcast subsetting:smuggler", + "outcast subsetting:freebooter", + "outcast subsetting:strider", + "outcast subsetting:mad summoner", + "outcast subsetting:rogue wizard", + "outcast subsetting:crazy witch", + "outcast subsetting:heretic priest", + "outcast subsetting:thinker", + "moneylender", + "city dweller setting:coin clipper", + "city dweller setting:pickpocket", + "city dweller setting:criminal", + "city dweller setting:street thug", + "city dweller setting:confidence man" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Itinerant Performer": { + "time": 4, + "res": 5, + "leads": [ + "Peasant", + "Villager", + "City", + "Soldier" + ], + "skills": [ + [ + 8, + "Cooking", + "Sewing", + "Acting", + "Sleight Of Hand", + "Haggling", + "Mending", + "Disguise" + ] + ], + "traits": [ + 2, + "Odd" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Insurrectionist": { + "time": 3, + "res": 5, + "leads": [ + "City", + "Soldier" + ], + "skills": [ + [ + 4, + "Philosophy", + "Rule Of Law", + "Doctrine", + "Oratory", + "Arson" + ] + ], + "traits": [ + 2, + "Zealot" + ], + "key_leads": [ + "City Dweller Setting", + "Professional Soldier Subsetting" + ] + }, + "Cultist": { + "time": 4, + "res": 8, + "leads": [ + "Peasant", + "Servitude", + "Soldier" + ], + "skills": [ + [ + 5, + "Cult Doctrine", + "Inconspicuous", + "Conspicuous", + "Falsehood", + "Persuasion" + ] + ], + "traits": [ + 2, + "Zealot", + "Rabble-rouser", + "Speaker Of The Secret Language" + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Poisoner": { + "time": 5, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Villager", + "Court" + ], + "skills": [ + [ + 5, + "Poisons", + "Cooking", + "Inconspicuous", + "Disguise" + ] + ], + "traits": [ + 2, + "Off-kilter" + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Noble Court Subsetting" + ] + }, + "Thug": { + "time": 4, + "res": 7, + "leads": [ + "Soldier", + "City" + ], + "skills": [ + [ + 4, + "Streetwise", + "Murder-wise", + "Guard-wise", + "Brawling" + ] + ], + "traits": [ + 2, + "Cold-blooded", + "Jaded" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Desperate Killer": { + "time": 3, + "res": 5, + "leads": [ + "Soldier", + "City", + "Servitude" + ], + "skills": [ + [ + 5, + "Appropriate Weapons", + "Inconspicuous", + "Assassination-wise" + ] + ], + "traits": [ + 2, + "Desperate", + "Murderous", + "Cold Hearted", + "Hard-hearted" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting" + ] + }, + "Bandit": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Peasant" + ], + "skills": [ + [ + 4, + "Appropriate Weapons", + "Intimidation", + "Stealthy", + "Caravan-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Peasant Setting" + ] + }, + "Pirate": { + "time": 4, + "res": 5, + "leads": [ + "Seafaring", + "City", + "Villager" + ], + "skills": [ + [ + 6, + "Pirate Cove-wise", + "Rigging", + "Knots", + "Knives", + "Sea-wise", + "Map-wise" + ] + ], + "traits": [ + 2, + "Problem With Authority", + "Scurvy", + "Maimed", + "Crippled", + "Lame" + ], + "key_leads": [ + "Seafaring Setting", + "City Dweller Setting", + "Villager Setting" + ] + }, + "Smuggler": { + "time": 4, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager" + ], + "skills": [ + [ + 6, + "Persuasion", + "Falsehood", + "Appraisal", + "Law-wise", + "Forgery", + "Stealthy", + "Inconspicuous" + ] + ], + "traits": [ + 2, + "Paranoid" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting" + ] + }, + "Freebooter": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Peasant", + "Servitude" + ], + "skills": [ + [ + 8, + "Intimidation", + "Appropriate Weapons", + "Countryside-wise", + "Fortress-wise", + "Mercenary Company-wise", + "Foreign Languages", + "War-wise", + "Loot-wise", + "Extortion-wise" + ] + ], + "traits": [ + 2, + "Cold-blooded", + "Merciless" + ], + "requires": "Bandit, Smuggler, Squire, Knight, City Guard, Village Guard, Marine or any Professional Soldier lifepath", + "requires_expr": [ + "bandit", + "smuggler", + "squire", + "knight", + "city guard", + "village guard", + "marine", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Peasant Setting", + "Servitude And Captive Setting" + ] + }, + "Strider": { + "time": 5, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Peasant", + "Servitude" + ], + "skills": [ + [ + 9, + "Forest-wise", + "Orienteering", + "Foraging", + "Tracking", + "Firebuilding", + "Riding", + "Stealthy", + "Appropriate Weapons" + ] + ], + "traits": [ + 2, + "Loner" + ], + "requires": "Born Noble, Hunter, Trapper, Huntsman or Scout", + "requires_expr": [ + "born noble", + "hunter", + "trapper", + "huntsman", + "scout" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Peasant Setting", + "Servitude And Captive Setting" + ] + }, + "Mad Summoner": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "City", + "Seafaring" + ], + "skills": [ + [ + 6, + "Summoning", + "Enchanting", + "Demonology", + "Empyrealia" + ] + ], + "traits": [ + 2, + "Mad", + "Fear Of Cheese", + "Fear Of Wet Noises", + "Alarming" + ], + "requires": "Cultist, Augur, Neophyte Sorcerer or Arcane Devotee", + "requires_expr": [ + "cultist", + "augur", + "neophyte sorcerer", + "arcane devotee" + ], + "key_leads": [ + "Peasant Setting", + "City Dweller Setting", + "Seafaring Setting" + ] + }, + "Rogue Wizard": { + "time": 6, + "res": 24, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Servitude", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 8, + "Sorcery", + "Inconspicuous", + "Graveyard-wise", + "Astrology", + "Bloodletting", + "Ugly Truth", + "Apocalypse-wise", + "Enchanting", + "Alchemy" + ] + ], + "traits": [ + 3, + "Spooky", + "Aura Of Fear", + "Obscure Aura" + ], + "requires": "Cultist, Augur, Neophyte Sorcerer or Arcane Devotee", + "requires_expr": [ + "cultist", + "augur", + "neophyte sorcerer", + "arcane devotee" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Crazy Witch": { + "time": 6, + "res": 6, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Peasant", + "Servitude", + "Villager" + ], + "skills": [ + [ + 5, + "Folklore", + "Herbalism", + "Poisons", + "Summoning", + "Profanity-wise" + ] + ], + "traits": [ + 2, + "A Little Crazy", + "Gifted", + "Mark Of The Beast" + ], + "requires": "Weather Witch, Young Lady, Augur or Midwife", + "requires_expr": [ + "weather witch", + "young lady", + "augur", + "midwife" + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "Villager Setting" + ] + }, + "Heretic Priest": { + "time": 7, + "res": 6, + "leads": [ + "Peasant", + "Servitude" + ], + "skills": [ + [ + 7, + "Heretical Doctrine", + "Oratory", + "Apostate-wise", + "Demonology", + "Summoner-wise", + "Cultist-wise" + ] + ], + "traits": [ + 2, + "Lunatic", + "Overbearing Loony", + "Faith In Dead Gods" + ], + "requires": "Acolyte, Cultist, Apostate, Theologian, Venal Priest, Interpreter or Archivist", + "requires_expr": [ + "acolyte", + "cultist", + "apostate", + "theologian", + "venal priest", + "interpreter", + "archivist" + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting" + ] + }, + "Thinker": { + "time": 15, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Noble", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 6, + "Philosophy", + "Strategy", + "Strategy Games", + "Calligraphy", + "History", + "Painting" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 2 + ], + "restrict": "Thinker can only be taken if the character's starting age will be 36 years or older.", + "requires_expr": [ + "+age_greater_than", + 21 + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Professional Soldier Subsetting": { + "Runner": { + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 4, + "Inconspicuous", + "Stealthy", + "Sing" + ] + ], + "traits": [ + 2, + "Skinny", + "Fleet Of Foot", + "Sprinter" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Apprentice": { + "time": 4, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "City", + "Villager", + "Peasant" + ], + "skills": [ + [ + 6, + "Mending", + "Write", + "Read", + "Hauling", + "Driving", + "Ditch Digging" + ] + ], + "traits": [ + 2, + "Exhausted", + "Back-breaking Labor" + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Peasant Setting" + ] + }, + "Musician": { + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Servitude" + ], + "skills": [ + [ + 4, + "Musical Instrument", + "Conspicuous", + "Riding" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Servitude And Captive Setting" + ] + }, + "Foot Soldier": { + "time": 3, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 6, + "Soldiering", + "Appropriate Weapons", + "Shield Training", + "Brawling", + "Foraging", + "Firebuilding" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Archer": { + "time": 3, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Bow", + "Fletcher", + "Brawling", + "Foraging", + "Firebuilding" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Crossbowman": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Crossbow", + "Fletcher", + "Brawling", + "Foraging", + "Firebuilding" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Sailor": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Seafaring", + "Outcast", + "Villager", + "Servitude" + ], + "skills": [ + [ + 6, + "Seamanship", + "Rigging", + "Knots", + "Mending", + "Navigation", + "Knives", + "Sword" + ] + ], + "traits": [ + 1, + "Iron Stomach", + "Sea Legs", + "Affinity For Rope" + ], + "key_leads": [ + "Seafaring Setting", + "Outcast Subsetting", + "Villager Setting", + "Servitude And Captive Setting" + ] + }, + "Herald": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Court" + ], + "skills": [ + [ + 4, + "Oratory", + "Conspicuous", + "Riding", + "Heraldry", + "Bannerman-wise" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Bannerman": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Court" + ], + "skills": [ + [ + 5, + "Conspicuous", + "Riding", + "Appropriate Weapons", + "Armor Training" + ] + ], + "traits": [ + 2, + "Honored", + "Brutal", + "Aggressive" + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Scout": { + "time": 3, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Peasant", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Stealthy", + "Foraging", + "Orienteering", + "Appropriate Weapons", + "Observation" + ] + ], + "traits": [ + 1 + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Sergeant": { + "time": 5, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Court" + ], + "skills": [ + [ + 6, + "Intimidation", + "Command", + "Field Dressing", + "Appropriate Weapons" + ] + ], + "traits": [ + 1 + ], + "requires": "Squire, Village Guard, City Guard or Foot Soldier", + "requires_expr": [ + "squire", + "village guard", + "city guard", + "foot soldier" + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Veteran": { + "time": 8, + "res": 20, + "leads": [ + "Outcast", + "Court" + ], + "skills": [ + [ + 5, + "Soldier-wise", + "Soldiering", + "Campaign History", + "Tactics" + ] + ], + "traits": [ + 2, + "Stubborn", + "Maimed" + ], + "requires": "Sergeant, Sergeant-At-Arms, Knight, Military Order or Freebooter", + "requires_expr": [ + "sergeant", + "sergeant-at-arms", + "knight", + "military order", + "freebooter" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Cavalryman": { + "time": 4, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Villager", + "Servitude", + "Court" + ], + "skills": [ + [ + 10, + "Riding", + "Mounted Combat Training", + "Armor Training", + "Shield Training", + "Appropriate Weapons", + "Horse-wise", + "Haggling" + ] + ], + "traits": [ + 1 + ], + "requires": "A prior lifepath having to do with horses - Knight, Squire, Groom, Master of Horses, etc.", + "requires_expr": [ + "knight", + "squire", + "groom", + "master of horses", + "farrier", + "military order" + ], + "key_leads": [ + "Villager Setting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Journeyman": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Villager", + "Peasant", + "Outcast" + ], + "skills": [ + [ + 5, + "Blacksmith", + "Appraisal", + "Haggling", + "Ridiculous Request-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "Villager Setting", + "Peasant Setting", + "Outcast Subsetting" + ] + }, + "Armorer": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 9, + "Mending", + "Blacksmith", + "Armorer", + "Weaponsmith", + "Etching", + "Tanner" + ] + ], + "traits": [ + 1 + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Atilliator": { + "time": 10, + "res": 22, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Court", + "City", + "Outcast" + ], + "skills": [ + [ + 6, + "Atilliator", + "Carpentry", + "Carving", + "Blacksmith", + "Tanner" + ] + ], + "traits": [ + 1 + ], + "requires": "Journeyman", + "requires_expr": [ + "journeyman" + ], + "key_leads": [ + "Noble Court Subsetting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Chaplain": { + "time": 5, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Court", + "City", + "Outcast", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 6, + "Oratory", + "Riding", + "Armor Training", + "Mounted Combat Training", + "Appropriate Weapons" + ] + ], + "traits": [ + 1, + "Idealogue", + "Psychotic" + ], + "requires": "Any Priest lifepath or Military Order", + "requires_expr": [ + "itinerant priest", + "village priest", + "venal priest", + "temple priest", + "court priest", + "heretic priest", + "priest", + "archpriest", + "military order" + ], + "key_leads": [ + "Noble Court Subsetting", + "City Dweller Setting", + "Outcast Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Engineer": { + "time": 5, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "City", + "Outcast" + ], + "skills": [ + [ + 6, + "Artillerist", + "Engineering", + "Fortifications" + ] + ], + "traits": [ + 1, + "Smart", + "Sense Of Distance" + ], + "requires": "Student, Engineer, Mining Engineer or Artillerist's Mate", + "requires_expr": [ + "student", + "engineer", + "mining engineer", + "artillerist's mate" + ], + "key_leads": [ + "Noble Court Subsetting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Wizard Of War": { + "time": 4, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Court", + "City", + "Outcast" + ], + "skills": [ + [ + 7, + "Sorcery", + "Strategy Games", + "Soldier-wise", + "War-wise", + "Haggling", + "Cartography" + ] + ], + "traits": [ + 1, + "Arrogant" + ], + "requires": "Neophyte Sorcerer, Arcane Devotee, Weather Witch, Rogue Wizard or Mad Summoner", + "requires_expr": [ + "neophyte sorcerer", + "arcane devotee", + "weather witch", + "rogue wizard", + "mad summoner" + ], + "key_leads": [ + "Noble Court Subsetting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Quartermaster": { + "time": 5, + "res": 17, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "City", + "Court" + ], + "skills": [ + [ + 6, + "Administration", + "Accounting", + "Haggling", + "Logistics" + ] + ], + "traits": [ + 1, + "Light Sleeper" + ], + "requires": "Sergeant, Veteran, Steward, Ship's Captain, Guard Captain, Merchant, Man-At-Arms, Smuggler, Constable or Lord", + "requires_expr": [ + "sergeant", + "veteran", + "steward", + "ship's captain", + "guard captain", + "merchant", + "man-at-arms", + "smuggler", + "constable", + "lord" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Captain": { + "time": 6, + "res": 35, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 9, + "Command", + "Contract-wise", + "Haggling", + "Oratory", + "Appropriate Weapons", + "Field Dressing", + "Riding", + "Strategy" + ] + ], + "traits": [ + 2, + "Savvy" + ], + "requires": "Guard Captain, Knight, Lord, Constable or two Freebooter lifepaths", + "requires_expr": [ + "+or", + [ + "guard captain", + "knight", + "lord", + "constable" + ], + [ + "+has_n_lifepaths_in", + 2, + "freebooter" + ] + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Seafaring Setting": { + "Son Of A Gun": { + "time": 8, + "res": 3, + "leads": [ + "Servitude", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 2, + "Sea Legs" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Boy": { + "time": 4, + "res": 8, + "leads": [ + "City", + "Servitude", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 4, + "Sailor-wise", + "Ship-wise", + "Captain-wise" + ] + ], + "traits": [ + 1, + "Veneer Of Obedience", + "Curses Like A Sailor", + "Sprinter" + ], + "restrict": "If chosen this must be the second lifepath and may only be taken once.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "City Dweller Setting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Galley Slave": { + "time": 6, + "res": 3, + "leads": [ + "Servitude", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 3, + "Slave Deck-wise", + "Taskmaster-wise", + "Sing", + "Seamanship", + "Knots" + ] + ], + "traits": [ + 3, + "Tasting The Lash", + "Eating Maggots", + "Following The Beat", + "Iron Stomach", + "Bottomless Stomach", + "Gnawing Hunger" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Ratcatcher": { + "time": 6, + "res": 4, + "leads": [ + "Outcast", + "Servitude", + "City" + ], + "skills": [ + [ + 5, + "Trapper", + "Poisons", + "Ratiquette" + ] + ], + "traits": [ + 3, + "Bilge-drinker", + "Rat-speak", + "Feral" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "City Dweller Setting" + ] + }, + "Landsman": { + "time": 4, + "res": 5, + "leads": [ + "Servitude", + "Soldier", + "Outcast" + ], + "skills": [ + [ + 3, + "Seamanship", + "Knots", + "Brawling", + "Rope-wise" + ] + ], + "traits": [ + 1, + "Cursing", + "Aches And Pains" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "Outcast Subsetting" + ] + }, + "Drummer": { + "time": 5, + "res": 6, + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 3, + "Drum", + "Sing", + "Drum Maker" + ] + ], + "traits": [ + 2, + "Incessant Tapping" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Sailor": { + "time": 5, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Servitude", + "Soldier", + "City", + "Outcast" + ], + "skills": [ + [ + 6, + "Seamanship", + "Rigging", + "Knots", + "Brawling", + "Sing", + "Sea-wise", + "Gambling" + ] + ], + "traits": [ + 2, + "Drunk" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting", + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Crazy Old Sailor": { + "time": 10, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Servitude", + "Outcast" + ], + "skills": [ + [ + 3, + "Ugly Truth", + "Intimidation", + "Omen-wise" + ] + ], + "traits": [ + 3, + "Superstitious", + "Metal Plate In The Skull", + "He's A Jonah, That One" + ], + "requires": "Sailor, Pirate or Mercenary Captain and that the character take this path sometime in his 40s", + "requires_expr": [ + "+and", + [ + "sailor", + "pirate", + "mercenary captain" + ], + [ + "+age_greater_than", + 39 + ], + [ + "+age_less_than", + 50 + ] + ], + "key_leads": [ + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Purser": { + "time": 4, + "res": 9, + "leads": [ + "Servitude", + "Soldier" + ], + "skills": [ + [ + 4, + "Accounting", + "Crew-wise", + "Supply-wise", + "Ship-wise" + ] + ], + "traits": [ + 2, + "Gnawing Hunger", + "Bitter" + ], + "requires": "Clerk, Student or Sailor", + "requires_expr": [ + "clerk", + "student", + "sailor" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Signalman": { + "time": 5, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Servitude", + "Soldier" + ], + "skills": [ + [ + 5, + "Signaling", + "Observation", + "Cryptography" + ] + ], + "traits": [ + 1, + "Cryptic" + ], + "key_leads": [ + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Pilot": { + "time": 4, + "res": 8, + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 5, + "Pilot", + "Ship-wise", + "Observation", + "Shoal-wise" + ] + ], + "traits": [ + 2, + "Blisters", + "Light Sleeper", + "Bored", + "Paranoid About The Ship" + ], + "requires": "Sailor, Pirate or Mercenary Captain", + "requires_expr": [ + "sailor", + "pirate", + "mercenary captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Marine": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 4, + "Appropriate Weapons", + "Knots", + "Intimidation" + ] + ], + "traits": [ + 1, + "Bruiser", + "Sea Legs" + ], + "requires": "Sailor, Pirate or Mercenary Captain", + "requires_expr": [ + "sailor", + "pirate", + "mercenary captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Bosun": { + "time": 5, + "res": 8, + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 3, + "Intimidation", + "Brawling", + "Sailor-wise" + ] + ], + "traits": [ + 1, + "Mean", + "Obedient" + ], + "requires": "Sailor, Pirate or Mercenary Captain", + "requires_expr": [ + "sailor", + "pirate", + "mercenary captain" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Sailmaker": { + "time": 5, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 5, + "Sewing", + "Weaving", + "Mending", + "Sail-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Sailor, Pirate, Seamstress", + "requires_expr": [ + "sailor", + "pirate", + "seamstress" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Ship's Doctor": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 8, + "Apothecary", + "Bloodletting", + "Surgery", + "Anatomy", + "Astrology", + "Falsehood", + "Tar-wise", + "Scurvy-wise" + ] + ], + "traits": [ + 3, + "Incomprehensible Diagnosis", + "Ugly Reputation" + ], + "requires": "Doctor, Court Doctor, Physician, Barber or Student", + "requires_expr": [ + "doctor", + "court doctor", + "physician", + "barber", + "student" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Ship's Cook": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 6, + "Cooking", + "Firebuilding", + "Sing", + "Falsehood", + "Mystery Meat-wise" + ] + ], + "traits": [ + 3, + "Crippled", + "Cookie", + "Maggot Connoisseur" + ], + "requires": "Sailor or Pirate", + "requires_expr": [ + "sailor", + "pirate" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Ship's Chaplain": { + "time": 5, + "res": 15, + "leads": [ + "Villager", + "City", + "Religious", + "Soldier" + ], + "skills": [ + [ + 4, + "Oratory", + "Doctrine", + "Ship-wise" + ] + ], + "traits": [ + 2, + "World Weary", + "Burial At Sea", + "Secretly Worships The Black Sea God" + ], + "requires": "Chaplain, Military Order, Temple Acolyte or Religious Acolyte", + "requires_expr": [ + "chaplain", + "military order", + "temple acolyte", + "religious acolyte" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Religious Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Weather Witch": { + "time": 5, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Servitude", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 6, + "Sea-wise", + "Summoning", + "Spirit Binding", + "Superstition-wise", + "Navigation", + "Astrology" + ] + ], + "traits": [ + 2, + "Weather Sense" + ], + "requires": "Augur, Neophyte Sorcerer, Arcane Devotee or Rogue Wizard", + "requires_expr": [ + "augur", + "neophyte sorcerer", + "arcane devotee", + "rogue wizard" + ], + "key_leads": [ + "Servitude And Captive Setting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Navigator": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 6, + "Navigation", + "Sea-wise", + "Cartography", + "Astrology", + "Current-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Pilot, Mercenary Captain, Sailor or Student", + "requires_expr": [ + "pilot", + "mercenary captain", + "sailor", + "student" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Carpenter's Mate": { + "time": 6, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "Servitude", + "Villager", + "Outcast" + ], + "skills": [ + [ + 3, + "Mending", + "Gambling", + "Wood-wise" + ] + ], + "traits": [ + 1, + "Cursing", + "Bull's-eye Spitter" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "Servitude And Captive Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Ship's Carpenter": { + "time": 4, + "res": 16, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Carpentry", + "Shipwright", + "Boatwright", + "Ship-wise" + ] + ], + "traits": [ + 1, + "I Know This Ship Like My Own Hands" + ], + "requires": "Apprentice, Carpenter's Mate", + "requires_expr": [ + "apprentice", + "carpenter's mate" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Artillerist's Mate": { + "time": 4, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 4, + "Mending", + "Carpentry", + "Artillerist" + ] + ], + "traits": [ + 1, + "Disturbingly Confident" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Engineer": { + "time": 4, + "res": 25, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 6, + "Engineering", + "Munitions", + "Artillerist", + "Carpentry", + "Mending" + ] + ], + "traits": [ + 1, + "It Just Might Work!" + ], + "requires": "Artillerist's Mate, Student, Ship's Carpenter, Engineer or Journeyman", + "requires_expr": [ + "artillerist's mate", + "student", + "ship's carpenter", + "engineer", + "journeyman" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Officer's Mate": { + "time": 4, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Servitude", + "Outcast", + "Soldier", + "City" + ], + "skills": [ + [ + 4, + "Etiquette", + "Captain-wise", + "Seamanship" + ] + ], + "traits": [ + 3, + "Pegboy" + ], + "requires": "Born Noble, Page or Son of a Gun", + "restrict": "If chosen, this lifepath must be the character's second.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ], + [ + "born noble", + "page", + "son of a gun" + ] + ], + "key_leads": [ + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting" + ] + }, + "Steward": { + "time": 6, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Accounting", + "Ship Management", + "Haggling", + "Merchant-wise", + "Appraisal" + ] + ], + "traits": [ + 1 + ], + "requires": "Purser, Merchant, Steward or Accountant", + "requires_expr": [ + "purser", + "merchant", + "steward", + "accountant" + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "First Mate": { + "time": 6, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Soldier", + "City", + "Servitude", + "Outcast" + ], + "skills": [ + [ + 5, + "Intimidation", + "Command", + "Conspicuous", + "Seaman-wise", + "Sword" + ] + ], + "traits": [ + 1 + ], + "requires": "Knight or any two Sailor/Seafaring lifepaths", + "requires_expr": [ + "+or", + [ + "knight" + ], + [ + "+has_n_lifepaths_in", + 2, + "seafaring setting:boy", + "seafaring setting:galley slave", + "seafaring setting:ratcatcher", + "seafaring setting:landsman", + "seafaring setting:drummer", + "sailor", + "seafaring setting:crazy old sailor", + "seafaring setting:purser", + "seafaring setting:signalman", + "seafaring setting:pilot", + "seafaring setting:marine", + "seafaring setting:bosun", + "seafaring setting:sailmaker", + "seafaring setting:ship's doctor", + "seafaring setting:ship's cook", + "seafaring setting:ship's chaplain", + "seafaring setting:weather witch", + "seafaring setting:navigator", + "seafaring setting:carpenter's mate", + "seafaring setting:ship's carpenter", + "seafaring setting:artillerist's mate", + "seafaring setting:engineer", + "seafaring setting:officer's mate", + "seafaring setting:steward", + "seafaring setting:first mate", + "seafaring setting:ship's captain" + ] + ], + "key_leads": [ + "Professional Soldier Subsetting", + "City Dweller Setting", + "Servitude And Captive Setting", + "Outcast Subsetting" + ] + }, + "Ship's Captain": { + "time": 7, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 6, + "Command", + "Oratory", + "Ship-wise", + "Sea-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 2, + "Stern Demeanor" + ], + "requires": "First Mate, Knight, Military Order or two Mercenary Captain lifepaths", + "requires_expr": [ + "+or", + [ + "first mate", + "knight", + "military order" + ], + [ + "+has_n_lifepaths_in", + 2, + "mercenary captain" + ] + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Religious Subsetting": { + "Castrati": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Court" + ], + "skills": [ + [ + 7, + "Sing", + "Persuasion", + "Falsehood", + "Etiquette", + "Administration", + "Rule Of Law" + ] + ], + "traits": [ + 3, + "Eunuch", + "Scheming" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Pardoner": { + "time": 5, + "res": 12, + "leads": [ + "Peasant", + "City", + "Villager", + "Outcast" + ], + "skills": [ + [ + 5, + "Persuasion", + "Falsehood", + "Intimidation", + "Doctrine" + ] + ], + "traits": [ + 1, + "Pardoner", + "Corrupt" + ], + "key_leads": [ + "Peasant Setting", + "City Dweller Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Zealous Convert": { + "time": 4, + "res": 10, + "leads": [ + "Outcast", + "Peasant", + "Servitude", + "Court" + ], + "skills": [ + [ + 4, + "Religious Diatribe", + "Doctrine", + "Rhetoric" + ] + ], + "traits": [ + 3, + "Infallible Religious Logic", + "Righteous", + "Firm", + "Demagogue" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Servitude And Captive Setting", + "Noble Court Subsetting" + ] + }, + "Military Order": { + "time": 3, + "res": 7, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "City", + "Noble", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 5, + "Doctrine", + "Riding", + "Armor Training", + "Appropriate Weapons" + ] + ], + "traits": [ + 2, + "Disciplined", + "Fanatical Devotion", + "Sworn To The Order" + ], + "requires": "Squire, Knight or any lifepath from the Professional Soldier setting", + "requires_expr": [ + "squire", + "knight", + "professional soldier subsetting:runner", + "professional soldier subsetting:apprentice", + "professional soldier subsetting:musician", + "professional soldier subsetting:foot soldier", + "professional soldier subsetting:archer", + "professional soldier subsetting:crossbowman", + "professional soldier subsetting:sailor", + "professional soldier subsetting:herald", + "professional soldier subsetting:bannerman", + "professional soldier subsetting:scout", + "professional soldier subsetting:sergeant", + "professional soldier subsetting:veteran", + "professional soldier subsetting:cavalryman", + "professional soldier subsetting:journeyman", + "professional soldier subsetting:armorer", + "professional soldier subsetting:atilliator", + "professional soldier subsetting:chaplain", + "professional soldier subsetting:engineer", + "professional soldier subsetting:wizard of war", + "professional soldier subsetting:quartermaster", + "professional soldier subsetting:captain" + ], + "key_leads": [ + "Villager Setting", + "City Dweller Setting", + "Noble Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Grave Digger": { + "time": 4, + "res": 6, + "leads": [ + "Outcast", + "Servitude", + "City", + "Villager" + ], + "skills": [ + [ + 4, + "Digging", + "Grave-wise", + "Cemetery-wise" + ] + ], + "traits": [ + 2, + "Superstitious", + "Burial Rites" + ], + "key_leads": [ + "Outcast Subsetting", + "Servitude And Captive Setting", + "City Dweller Setting", + "Villager Setting" + ] + }, + "Porter": { + "time": 3, + "res": 5, + "leads": [ + "Outcast", + "Villager", + "Peasant" + ], + "skills": [ + [ + 4, + "Temple-wise", + "Priest-wise", + "Worshipper-wise", + "Church Treasure-wise" + ] + ], + "traits": [ + 1, + "Keys To The Church", + "Familiar Face" + ], + "key_leads": [ + "Outcast Subsetting", + "Villager Setting", + "Peasant Setting" + ] + }, + "Notary": { + "time": 4, + "res": 15, + "leads": [ + "City", + "Outcast", + "Court" + ], + "skills": [ + [ + 4, + "Rule Of Law", + "Bureaucracy", + "Church Law", + "Bribe-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Clerk, Young Lady or Student", + "requires_expr": [ + "clerk", + "young lady", + "student" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Custodian": { + "time": 5, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast" + ], + "skills": [ + [ + 7, + "Relic-wise", + "Observation", + "Obscure History", + "Religious History", + "Folklore", + "Saint-wise" + ] + ], + "traits": [ + 2, + "Strange", + "Erudite", + "Obsessed", + "Arcane" + ], + "requires": "Student, Young Lady, Cloistered Monk/Nun, Temple Acolyte, Inquisitor, Exorcist or Theologian", + "requires_expr": [ + "student", + "young lady", + "cloistered monk/nun", + "temple acolyte", + "inquisitor", + "exorcist", + "theologian" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting" + ] + }, + "Interpreter": { + "time": 5, + "res": 10, + "leads": [ + "City", + "Court", + "Villager" + ], + "skills": [ + [ + 7, + "Read", + "Ancient Languages", + "Instruction", + "Write", + "Doctrine", + "Foreign Languages" + ] + ], + "traits": [ + 2, + "Ink-stained Hands", + "Condescending" + ], + "requires": "Student, Young Lady, Temple Acolyte, Exorcist or Theologian", + "requires_expr": [ + "student", + "young lady", + "temple acolyte", + "exorcist", + "theologian" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Villager Setting" + ] + }, + "Archivist": { + "time": 7, + "res": 8, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Villager", + "Court" + ], + "skills": [ + [ + 5, + "Research", + "Library-wise", + "Ancient History", + "Symbology" + ] + ], + "traits": [ + 1, + "Myopic", + "Affinity For Books And Scrolls" + ], + "requires": "Student, Young Lady, Temple Acolyte, Exorcist or Theologian", + "requires_expr": [ + "student", + "young lady", + "temple acolyte", + "exorcist", + "theologian" + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Noble Court Subsetting" + ] + }, + "Itinerant Monk": { + "time": 6, + "res": 6, + "leads": [ + "Peasant", + "Villager", + "Outcast" + ], + "skills": [ + [ + 7, + "Doctrine", + "Suasion", + "Meditation", + "Begging", + "Alms-wise", + "Streetwise", + "Road-wise" + ] + ], + "traits": [ + 2, + "Tonsured" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "Outcast Subsetting" + ] + }, + "Cloistered Monk/nun": { + "time": 10, + "res": 12, + "leads": [ + "Peasant", + "Outcast", + "Court" + ], + "skills": [ + [ + 6, + "Research", + "History", + "Meditation", + "Monastic Ritual", + "Vintner", + "Symbology" + ] + ], + "traits": [ + 1, + "Tonsured", + "Restless", + "Bored" + ], + "key_leads": [ + "Peasant Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Temple Acolyte": { + "time": 6, + "res": 5, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Soldier" + ], + "skills": [ + [ + 4, + "Write", + "Read", + "Doctrine", + "Temple-wise" + ] + ], + "traits": [ + 1, + "Tonsured", + "Obedient", + "Faithful" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting" + ] + }, + "Priest": { + "time": 5, + "res": 18, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Villager", + "Outcast", + "Soldier", + "Court" + ], + "skills": [ + [ + 7, + "Oratory", + "Suasion", + "Write", + "Read", + "Doctrine", + "Ritual", + "Symbology", + "Religious History" + ] + ], + "traits": [ + 2, + "Vested" + ], + "requires": "Temple Acolyte or Religious Acolyte", + "requires_expr": [ + "temple acolyte", + "religious acolyte" + ], + "key_leads": [ + "Villager Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Noble Court Subsetting" + ] + }, + "Exorcist": { + "time": 6, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "City", + "Court" + ], + "skills": [ + [ + 9, + "Doctrine", + "Obscure History", + "Observation", + "Church Law", + "Symbology", + "Demonology", + "Ancient Languages", + "Exorcist Ritual" + ] + ], + "traits": [ + 2, + "Skeptical", + "Haunted", + "Possessed", + "Lost Faith", + "Faithful" + ], + "requires": "Temple Priest, Itinerant Priest, Priest, Court Priest or Archivist", + "requires_expr": [ + "temple priest", + "itinerant priest", + "priest", + "court priest", + "archivist" + ], + "key_leads": [ + "Outcast Subsetting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Inquisitor": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Soldier", + "City", + "Court" + ], + "skills": [ + [ + 6, + "Doctrine", + "Interrogation", + "Torture", + "Heresy-wise" + ] + ], + "traits": [ + 2, + "Suspicious", + "Merciless", + "Cold-blooded", + "Righteous" + ], + "requires": "Temple Priest, Itinerant Priest, Priest, Court Priest, Judge or Justicar", + "requires_expr": [ + "temple priest", + "itinerant priest", + "priest", + "court priest", + "judge", + "justicar" + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "City Dweller Setting", + "Noble Court Subsetting" + ] + }, + "Theologian": { + "time": 10, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Villager", + "Court" + ], + "skills": [ + [ + 10, + "Doctrine", + "Rhetoric", + "Philosophy", + "History", + "Religious History", + "Church Law", + "Obscure History", + "Read", + "Write" + ] + ], + "traits": [ + 2, + "Learned", + "Insightful", + "Bookworm", + "Academic" + ], + "requires": "Scribe, Archivist, Court Lawyer, Advocate, Custodian, Interpreter, Priest or Bishop", + "requires_expr": [ + "scribe", + "archivist", + "court lawyer", + "advocate", + "custodian", + "interpreter", + "priest", + "bishop" + ], + "key_leads": [ + "City Dweller Setting", + "Villager Setting", + "Noble Court Subsetting" + ] + }, + "Archpriest": { + "time": 5, + "res": 25, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "City", + "Outcast", + "Court" + ], + "skills": [ + [ + 10, + "Oratory", + "Suasion", + "Write", + "Read", + "Doctrine", + "History", + "Religious History", + "Ritual", + "Church-wise", + "Parish-wise", + "Tithe-wise" + ] + ], + "traits": [ + 2, + "Imperious Demeanor" + ], + "requires": "Temple Priest, Itinerant Priest, Priest, Court Priest or Chaplain", + "requires_expr": [ + "temple priest", + "itinerant priest", + "priest", + "court priest", + "chaplain" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Canon": { + "time": 10, + "res": 45, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "City", + "Outcast", + "Court" + ], + "skills": [ + [ + 6, + "Rule Of Law", + "Church Law", + "Administration", + "Doctrine", + "Church-wise" + ] + ], + "traits": [ + 1, + "Authoritative" + ], + "requires": "Archpriest, Theologian or Abbot", + "requires_expr": [ + "archpriest", + "theologian", + "abbot/abbess" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Abbot/abbess": { + "time": 10, + "res": 45, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "City", + "Outcast", + "Court" + ], + "skills": [ + [ + 6, + "Administration", + "Accounting", + "Vintner", + "Wine Tasting", + "Royal Secret-wise", + "Abbey-wise" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Itinerant Monk, Cloistered Monk/Nun, Theologian or Vintner", + "requires_expr": [ + "itinerant monk", + "cloistered monk/nun", + "theologian", + "vintner" + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + }, + "Bishop": { + "time": 8, + "res": 45, + "leads": [ + "City", + "Outcast", + "Court" + ], + "skills": [ + [ + 7, + "Religious History", + "Intimidation", + "Ritual", + "Symbology", + "History", + "Obscure History" + ] + ], + "traits": [ + 2, + "Domineering Presence" + ], + "requires": "Archpriest, Baron, Viscount, Count, Duke or Prince and the Your Grace trait", + "requires_expr": [ + "+and", + [ + "archpriest", + "baron", + "viscount", + "count", + "duke", + "noble prince", + "prince of the blood" + ], + [ + "+trait", + "your grace" + ] + ], + "key_leads": [ + "City Dweller Setting", + "Outcast Subsetting", + "Noble Court Subsetting" + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/orc.json b/src/data/lifepaths/orc.json new file mode 100755 index 0000000..6e94420 --- /dev/null +++ b/src/data/lifepaths/orc.json @@ -0,0 +1,1595 @@ +{ + "Chattel Setting": { + "Born Chattel": { + "time": 10, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion", + "Servant" + ], + "skills": [ + [ + 2, + "General" + ] + ], + "traits": [ + 1 + ], + "common_traits": [ + "Cannibal", + "Cold Black Blood", + "Breeder", + "Fanged And Clawed", + "Loathsome And Twisted", + "Lynx-eyed, Like Burning Coals", + "Vile Language" + ], + "key_leads": [ + "Black Legion Subsetting", + "Servant Of The Dark Blood Subsetting" + ] + }, + "Cattle Slave": { + "time": 5, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 2, + "Animal Husbandry" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Screaming", + "Shouting", + "Kicking The Beast" + ] + }, + "Scavenger": { + "time": 3, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion" + ], + "skills": [ + [ + 3, + "Foraging", + "Inconspicuous" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Running (Away)", + "Hiding", + "Stealing", + "Scavenger" + ], + "key_leads": [ + "Black Legion Subsetting" + ] + }, + "Forge Slave": { + "time": 5, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 2, + "Ditch Digging" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Pain Life", + "Back-breaking Labor", + "Numb" + ] + }, + "Hauler": { + "time": 5, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 2, + "Driving", + "Beast Of Burden-wise" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Back-breaking Labor", + "Cursing", + "Spitting", + "Yowling" + ] + }, + "Cutter Slave": { + "time": 5, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 2, + "Tree Pulling", + "Ditch Digging" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Hatred Of Forests", + "Back-breaking Labor" + ] + }, + "Tunneler": { + "time": 4, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 2, + "Ditch Digging", + "Tunnel-wise" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Back-breaking Labor", + "Black Lung" + ] + }, + "Ravager": { + "time": 3, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion" + ], + "skills": [ + [ + 4, + "Brawling", + "Cudgel", + "Intimidation" + ] + ], + "traits": [ + 2, + "Pack Hunter" + ], + "key_leads": [ + "Black Legion Subsetting" + ] + }, + "Woodcutter": { + "time": 7, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 4, + "Rude Carpentry", + "Mending", + "Intimidation" + ] + ], + "traits": [ + 1 + ], + "requires": "Cutter Slave", + "requires_expr": [ + "cutter slave" + ] + }, + "Butcher": { + "time": 7, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 4, + "Butchery", + "Tanner", + "Intimidation" + ] + ], + "traits": [ + 1 + ], + "requires": "Cattle Slave", + "requires_expr": [ + "cattle slave" + ] + }, + "Forger": { + "time": 7, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 5, + "Blacksmith", + "Intimidation" + ] + ], + "traits": [ + 2, + "Singed" + ], + "requires": "Forge Slave", + "requires_expr": [ + "forge slave" + ] + }, + "Pitwright": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 4, + "Mining", + "Intimidation" + ] + ], + "traits": [ + 1, + "Deep Sense" + ], + "requires": "Tunneler", + "requires_expr": [ + "tunneler" + ] + }, + "Edge Grinder": { + "time": 10, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Black Legion" + ], + "skills": [ + [ + 6, + "Mending", + "Weaponsmith", + "Armorer", + "Tanner" + ] + ], + "traits": [ + 2, + "Suspicious" + ], + "requires": "He Who Grinds the Edges of our Axes to Glinting Sharpness requires Forger", + "requires_expr": [ + "forger" + ], + "key_leads": [ + "Black Legion Subsetting" + ] + }, + "Whipmaster": { + "time": 9, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Black Legion" + ], + "skills": [ + [ + 4, + "Interrogation", + "Intimidation", + "Brawling", + "Orcish Torture" + ] + ], + "traits": [ + 1, + "Where There's A Whip, There's A Way" + ], + "requires": "Pitwright, Forger, four Slave life paths, or any Great and Black, or Legion lifepath", + "requires_expr": [ + "+or", + [ + "pitwright", + "forger" + ], + [ + "+has_n_lifepaths_in", + 4, + "cattle slave", + "forge slave", + "cutter slave" + ], + [ + "great and black setting:born great", + "great and black setting:the rites", + "great and black setting:servant of the gate", + "great and black setting:follower", + "great and black setting:black destroyer", + "great and black setting:named", + "great and black setting:siege master", + "great and black setting:gate forger", + "great and black setting:whisperer", + "great and black setting:great one", + "black legion subsetting:goblin", + "black legion subsetting:sun blotter", + "black legion subsetting:nightseeker", + "black legion subsetting:legioner", + "black legion subsetting:hatred bearer", + "black legion subsetting:despair shouter", + "black legion subsetting:black hunter", + "black legion subsetting:astride the beast", + "black legion subsetting:bears the lash", + "black legion subsetting:packmaster", + "black legion subsetting:head taker", + "black legion subsetting:troll lord" + ] + ], + "key_leads": [ + "Black Legion Subsetting" + ] + } + }, + "Great And Black Setting": { + "Born Great": { + "time": 10, + "res": 5, + "leads": [ + "Servant" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 2, + "Born To Rule Them All", + "Enemy Of The Sun" + ], + "common_traits": [ + "Cannibal", + "Cold Black Blood", + "Breeder", + "Fanged And Clawed", + "Loathsome And Twisted", + "Lynx-eyed, Like Burning Coals", + "Vile Language" + ], + "key_leads": [ + "Servant Of The Dark Blood Subsetting" + ] + }, + "The Rites": { + "time": 3, + "res": 3, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion", + "Servant" + ], + "skills": [ + [ + 5, + "Brawling", + "Intimidation", + "Orcish Torture" + ] + ], + "traits": [ + 2, + "Life Is Death", + "Sprinter" + ], + "restrict": "The Rites may only be taken once and it must be the character's second lifepath.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Black Legion Subsetting", + "Servant Of The Dark Blood Subsetting" + ] + }, + "Servant Of The Gate": { + "time": 4, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion", + "Chattel" + ], + "skills": [ + [ + 2, + "Soothing Platitudes", + "Ditch Digging" + ] + ], + "traits": [ + 1, + "Humble Before My Master", + "Hauling", + "Back-breaking Labor" + ], + "key_leads": [ + "Black Legion Subsetting", + "Chattel Setting" + ] + }, + "Follower": { + "time": 5, + "res": 9, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Black Legion", + "Chattel" + ], + "skills": [ + [ + 8, + "Armor Training", + "Axe", + "Bow", + "Knives", + "Mace", + "Riding", + "Shield Training", + "Clan-wise" + ] + ], + "traits": [ + 1, + "Silent Hatred" + ], + "requires": "He Who Walks in the Named's Shadow requires The Rites or Astride the Beast", + "requires_expr": [ + "the rites", + "astride the beast" + ], + "key_leads": [ + "Black Legion Subsetting", + "Chattel Setting" + ] + }, + "Black Destroyer": { + "time": 6, + "res": 12, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 7, + "Mounted Combat Training", + "Great Wolf Husbandry", + "Riding", + "Axe", + "Spear" + ] + ], + "traits": [ + 2, + "Intense Hatred", + "Low Cunning" + ], + "requires": "He Whose Skin is like Winter Night, Whose Mere Presence Causes Those Beneath Him to Shiver in Terror and Cower Beneath his Wicked Blade requires Follower, Astride the Beast or Head Taker", + "requires_expr": [ + "follower", + "astride the beast", + "head taker" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Named": { + "time": 8, + "res": 25, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Command", + "Brutal Intimidation", + "Orcish Torture" + ] + ], + "traits": [ + 2, + "Savage Consequences" + ], + "requires": "He Who is Mighty and Earned the Ancient Right to be Named requires Black Destroyer, Troll Lord or Head Taker", + "requires_expr": [ + "black destroyer", + "troll lord", + "head taker" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Siege Master": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Siege Engineer", + "Artillerist", + "Mending" + ] + ], + "traits": [ + 1, + "The Bigger They Come...", + "Brutish Efficiency" + ], + "requires": "Servant of the Gate", + "requires_expr": [ + "servant of the gate" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Gate Forger": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Mason", + "Bastions Of Hatred", + "Mining" + ] + ], + "traits": [ + 1, + "Rare Talent" + ], + "requires": "Siege Master", + "requires_expr": [ + "siege master" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Whisperer": { + "time": 9, + "res": 40, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Servant" + ], + "skills": [ + [ + 5, + "Poisonous Platitudes", + "Falsehood", + "Persuasion", + "Clan-wise", + "Ambition-wise" + ] + ], + "traits": [ + 2, + "Forked Tongue", + "Poisonous Ambition" + ], + "requires": "Slave to the Dark, Whipmaster, Gate Forger or Bears the Lash", + "requires_expr": [ + "slave to the dark", + "whipmaster", + "gate forger", + "bears the lash" + ], + "key_leads": [ + "Servant Of The Dark Blood Subsetting" + ] + }, + "Great One": { + "time": 20, + "res": 60, + "stat": [ + [ + 2, + "m" + ], + [ + 2, + "p" + ] + ], + "leads": [ + "Black Legion" + ], + "skills": [ + [ + 5, + "Command", + "Strategy", + "Name Ritual" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 2, + "Flights Of Murderous Fancy", + "Unrelenting Hatred" + ], + "requires": "Named and the Born to Rule Them All trait", + "requires_expr": [ + "+and", + [ + "named" + ], + [ + "+trait", + "born to rule them all" + ] + ], + "key_leads": [ + "Black Legion Subsetting" + ] + } + }, + "Black Legion Subsetting": { + "Goblin": { + "time": 3, + "res": 2, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 2, + "Foraging", + "Brawling" + ] + ], + "traits": [ + 2, + "Tasting The Lash", + "Exhausted", + "Running (Away)", + "Charging Blindly", + "Marching" + ], + "restrict": "Born Great orcs may not take this path.", + "requires_expr": [ + "+not", + [ + "born great" + ] + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Sun Blotter": { + "time": 3, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 2, + "Bow", + "Mending", + "Fletcher" + ] + ], + "traits": [ + 1, + "Hiding", + "Running (Away)" + ], + "restrict": "Born Great orcs may not take this path.", + "requires_expr": [ + "+not", + [ + "born great" + ] + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Nightseeker": { + "time": 4, + "res": 4, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Orienteering", + "Tracking", + "Trapper", + "Stealthy", + "Climbing", + "Garrote" + ] + ], + "traits": [ + 1, + "Tasting The Lash" + ], + "requires": "He Who Lurks in the Twilight and Seeks Our Enemies requires Legioner, Sun Blotter, Scavenger or Ravager", + "restrict": "Born Great orcs may not take this path.", + "requires_expr": [ + "+and", + [ + "legioner", + "sun blotter", + "scavenger", + "ravager" + ], + [ + "+not", + [ + "born great" + ] + ] + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Legioner": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 4, + "Spear", + "Shield Training", + "Brawling", + "Foraging" + ] + ], + "traits": [ + 1 + ], + "requires": "Ravager, Whipmaster or Goblin", + "restrict": "Born Great orcs may not take this path.", + "requires_expr": [ + "+and", + [ + "ravager", + "whipmaster", + "goblin" + ], + [ + "+not", + [ + "born great" + ] + ] + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Hatred Bearer": { + "time": 1, + "res": 15, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 3, + "Conspicuous", + "Black Legion-wise" + ] + ], + "traits": [ + 1, + "Psychotic", + "Paranoid", + "Booming Voice" + ], + "requires": "The Rites, Legioner or Whipmaster", + "requires_expr": [ + "the rites", + "legioner", + "whipmaster" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Despair Shouter": { + "time": 3, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 3, + "Brazen Horn Of Despair", + "Intimidation", + "Brawling" + ] + ], + "traits": [ + 2, + "Reviled" + ], + "requires": "The Rites, Legioner or Whipmaster", + "requires_expr": [ + "the rites", + "legioner", + "whipmaster" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Black Hunter": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Bow", + "Hunting", + "Field Dressing", + "Stealthy" + ] + ], + "traits": [ + 1, + "Black Bile Poison" + ], + "requires": "He Who is Fell and Stalks the Night requires Follower, Ravager or Nightseeker", + "requires_expr": [ + "follower", + "ravager", + "nightseeker" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Astride The Beast": { + "time": 5, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel", + "Great" + ], + "skills": [ + [ + 8, + "Mounted Combat Training", + "Riding", + "Great Wolf Husbandry", + "Intimidation", + "Spear", + "Armor Training" + ] + ], + "traits": [ + 1, + "Brash", + "Cry Of Doom" + ], + "requires": "He Who Sits Astride the Howling Black Beast requires Black Hunter or Follower", + "requires_expr": [ + "black hunter", + "follower" + ], + "key_leads": [ + "Chattel Setting", + "Great And Black Setting" + ] + }, + "Bears The Lash": { + "time": 6, + "res": 9, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Chattel", + "Great" + ], + "skills": [ + [ + 6, + "Whip-wise", + "Intimidation", + "Orcish Torture", + "Command", + "Sword", + "Brawling" + ] + ], + "traits": [ + 1, + "Where There's A Whip, There's A Way" + ], + "requires": "He Who Bears the Lash and Drives Us Ever On requires Whipmaster, Black Hunter, Astride the Beast or The Rites", + "requires_expr": [ + "whipmaster", + "black hunter", + "astride the beast", + "the rites" + ], + "key_leads": [ + "Chattel Setting", + "Great And Black Setting" + ] + }, + "Packmaster": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Chattel", + "Great" + ], + "skills": [ + [ + 5, + "Great Wolf Husbandry", + "Great Wolf-wise", + "Pack-wise", + "Mending" + ] + ], + "traits": [ + 1, + "Flea-bitten", + "Where There's A Whip, There's A Way", + "Show No Fear" + ], + "requires": "He Who Rules the Black Wolf Pack requires Bears the Lash, Follower, Whipmaster, Master of Eight or Knower of Secrets]", + "requires_expr": [ + "bears the lash", + "follower", + "whipmaster", + "master of eight", + "knower of secrets" + ], + "key_leads": [ + "Chattel Setting", + "Great And Black Setting" + ] + }, + "Head Taker": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel", + "Great" + ], + "skills": [ + [ + 5, + "Command", + "Brutal Intimidation", + "Axe", + "Brawling" + ] + ], + "traits": [ + 2, + "Unrelenting Savagery", + "Fondness For Elven Blood", + "Taste For Man-flesh" + ], + "requires": "He Who Cleaves the Heads of his Enemies From Their Shoulders and Sets Them Upon Stakes for All to See requires Bears the Lash, Black Destroyer or Named", + "requires_expr": [ + "bears the lash", + "black destroyer", + "named" + ], + "key_leads": [ + "Chattel Setting", + "Great And Black Setting" + ] + }, + "Troll Lord": { + "time": 5, + "res": 20, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Great", + "Servant" + ], + "skills": [ + [ + 6, + "Troll-wise", + "Troll Etiquette", + "Hammer", + "Shield Training" + ] + ], + "traits": [ + 2, + "Arrogant", + "Troll Speak" + ], + "requires": "Bears the Lash, Pack Master or Named", + "requires_expr": [ + "bears the lash", + "packmaster", + "named" + ], + "key_leads": [ + "Great And Black Setting", + "Servant Of The Dark Blood Subsetting" + ] + } + }, + "Servant Of The Dark Blood Subsetting": { + "Slave To The Dark": { + "time": 6, + "res": 3, + "leads": [ + "Chattel" + ], + "skills": [ + [ + 2, + "Servant-wise" + ] + ], + "traits": [ + 2, + "Fearful Respect Of The Servants", + "Naked Hatred" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Drinker Of The Dark": { + "time": 5, + "res": 6, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 3, + "Doctrine Of Night's Blood" + ] + ], + "traits": [ + 3, + "Stark Madness", + "Blasphemer", + "Void Embrace" + ], + "requires": "Slave to the Dark", + "requires_expr": [ + "slave to the dark" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Bloodletter": { + "time": 5, + "res": 6, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Chattel" + ], + "skills": [ + [ + 5, + "Rituals Of Blood", + "Orcish Torture", + "Intimidation", + "Knives" + ] + ], + "traits": [ + 1 + ], + "requires": "Drinker of the Dark", + "requires_expr": [ + "drinker of the dark" + ], + "key_leads": [ + "Chattel Setting" + ] + }, + "Knower Of Secrets": { + "time": 6, + "res": 7, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Chattel", + "Black Legion" + ], + "skills": [ + [ + 4, + "Rituals Of Night", + "Vile Poisoner", + "Foraging" + ] + ], + "traits": [ + 1 + ], + "requires": "Drinker of the Dark", + "requires_expr": [ + "drinker of the dark" + ], + "key_leads": [ + "Chattel Setting", + "Black Legion Subsetting" + ] + }, + "Master Of Eight": { + "time": 8, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Chattel", + "Black Legion" + ], + "skills": [ + [ + 7, + "Spider Husbandry", + "Riding", + "Mounted Combat Training", + "Web-wise", + "Climbing" + ] + ], + "traits": [ + 2, + "Batshit", + "Affinity For Spiders" + ], + "requires": "Knower of Secrets", + "requires_expr": [ + "knower of secrets" + ], + "key_leads": [ + "Chattel Setting", + "Black Legion Subsetting" + ] + }, + "Master Of Blood": { + "time": 7, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 4, + "Rituals-wise", + "Animal Husbandry", + "Orc-wise", + "Elf-wise", + "Wolf-wise" + ] + ], + "traits": [ + 2, + "Where There's A Whip, There's A Way" + ], + "requires": "Bloodletter", + "requires_expr": [ + "bloodletter" + ] + }, + "Master Of Darkness": { + "time": 7, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 3, + "Cave-wise", + "Tunnel-wise" + ] + ], + "traits": [ + 1 + ], + "requires": "Knower of Secrets", + "requires_expr": [ + "knower of secrets" + ] + }, + "Dark Summoner": { + "time": 10, + "res": 12, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 3, + "Darkness-wise" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Master of Darkness", + "requires_expr": [ + "master of darkness" + ] + }, + "Blood Summoner": { + "time": 10, + "res": 12, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 3, + "Poison-wise", + "Bat-wise", + "Troll-wise" + ], + [ + 1, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "Master of Blood", + "requires_expr": [ + "master of blood" + ] + }, + "Servant": { + "time": 50, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 2, + "Great And Black-wise", + "Name Ritual" + ], + [ + 2, + "General" + ] + ], + "traits": [ + 1 + ], + "requires": "The Born to Rule Them All trait and Dark Summoner or Blood Summoner", + "requires_expr": [ + "+and", + [ + "dark summoner", + "blood summoner" + ], + [ + "+trait", + "born to rule them all" + ] + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/roden.json b/src/data/lifepaths/roden.json new file mode 100755 index 0000000..6cf3b47 --- /dev/null +++ b/src/data/lifepaths/roden.json @@ -0,0 +1,1740 @@ +{ + "Field Setting": { + "Born To The Fields": { + "time": 8, + "res": 0, + "leads": [ + "Society" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 3, + "Vegetarian" + ], + "common_traits": [ + "Aecer's Likeness", + "Coat Of Fur", + "Communal", + "Enlarged Incisors", + "Quick-blooded", + "Tail", + "Large Ears" + ], + "key_leads": [ + "Society Subsetting" + ] + }, + "Hand": { + "time": 3, + "res": 3, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile" + ], + "skills": [ + [ + 4, + "Sing", + "Work-wise", + "Back-breaking Labor" + ] + ], + "traits": [ + 1, + "Toiling" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Woodsen": { + "time": 6, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile" + ], + "skills": [ + [ + 4, + "Tree Cutting", + "Tree-wise", + "Mending", + "Orienteering" + ] + ], + "traits": [ + 1, + "Independent" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Bee Keeper": { + "time": 7, + "res": 9, + "skills": [ + [ + 5, + "Bee Husbandry", + "Firebuilding", + "Bee-wise", + "Flower-wise", + "Honey-wise" + ] + ], + "traits": [ + 1, + "Thick-skinned", + "Beespeaker" + ] + }, + "Gatherer": { + "time": 8, + "res": 10, + "leads": [ + "Exile" + ], + "skills": [ + [ + 4, + "Foraging", + "Herbalism", + "Nut And Berry-wise" + ] + ], + "traits": [ + 1, + "Adventurous Palate" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Farmer": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 3, + "Farming", + "Mending", + "Seed-wise" + ] + ], + "traits": [ + 1, + "Hoarder", + "Slow" + ] + }, + "Miller": { + "time 9": null, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 5, + "Miller", + "Grain-wise", + "Haggling" + ] + ], + "traits": [ + 1, + "Industrious" + ] + }, + "Mead-maker": { + "time": 9, + "res": 14, + "skills": [ + [ + 5, + "Brewer", + "Mead-wise", + "Haggling", + "Cooper" + ] + ], + "traits": [ + 1, + "Beloved" + ] + }, + "Baker": { + "time": 7, + "res": 12, + "skills": [ + [ + 4, + "Cooking", + "Firebuilding", + "Bread-wise" + ] + ], + "traits": [ + 1, + "Keen Sense Of Taste", + "Fragrant", + "Sweet-tooth" + ] + }, + "Weaver": { + "time": 8, + "res": 15, + "skills": [ + [ + 6, + "Weaving", + "Sewing", + "Embroidery", + "Soothing Platitudes", + "Sing" + ] + ], + "traits": [ + 1, + "Calloused Fingers" + ] + }, + "Apprentice": { + "time": 4, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 4, + "Mending", + "Blacksmith", + "Carpentry", + "Potter", + "Mason" + ] + ], + "traits": [ + 1, + "Gopher" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Crafter": { + "time": 10, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 8, + "Haggling", + "Jargon", + "Instruction", + "Apprentice-wise" + ] + ], + "traits": [ + 1, + "Serious", + "Diligent" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ] + }, + "Healer": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 6, + "Herbalism", + "Field Dressing", + "Apothecary", + "Ugly Truth", + "Hurt-wise" + ] + ], + "traits": [ + 1, + "Compassionate", + "Bedside Manner" + ] + }, + "Trader": { + "time": 8, + "res": 6, + "leads": [ + "Exile" + ], + "skills": [ + [ + 6, + "Haggling", + "Appraisal", + "Accounting", + "Conspicuous", + "Village-wise" + ] + ], + "traits": [ + 1, + "Opportunist" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Deputy": { + "time": 4, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 7, + "Spear", + "Bow", + "Brawling", + "Shield Training", + "Trouble-wise" + ] + ], + "traits": [ + 1, + "Alarmist" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Sheriff": { + "time": 8, + "res": 8, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 7, + "Rule Of Law", + "Command", + "Intimidation", + "Interrogation", + "Sword" + ] + ], + "traits": [ + 1, + "Suspicious" + ] + }, + "Mayor": { + "time": 10, + "res": 20, + "skills": [ + [ + 8, + "Oratory", + "Persuasion", + "Rule Of Law", + "Etiquette", + "Haggling", + "Petitioner-wise" + ] + ], + "traits": [ + 1, + "Hand-shaker", + "Practiced Smile" + ], + "requires": "Requires the character to be at minimum 17 yrs old before taking it.", + "requires_expr": [ + "+age_greater_than", + 16 + ] + }, + "Brother/sister": { + "time": 5, + "res": 14, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 6, + "Doctrine", + "Read", + "Write", + "Meditation", + "Shrine-wise", + "Prayer-wise" + ] + ], + "traits": [ + 2, + "Humble", + "Ordained", + "Faithful" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Missionary": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 5, + "Suasion", + "Preaching", + "Intimidation", + "Below-wise", + "Brawling", + "Man-wise" + ] + ], + "traits": [ + 2, + "Tough", + "Zealot", + "Righteous" + ], + "requires": "Brother/Sister", + "requires_expr": [ + "brother/sister" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Father/mother": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 5, + "Suasion", + "Oratory", + "Illuminations", + "Calligraphy", + "Sing" + ] + ], + "traits": [ + 3, + "Patient", + "Friendly Face", + "Portly" + ], + "requires": "Brother/Sister", + "requires_expr": [ + "brother/sister" + ] + }, + "Abbot/abbess": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 10, + "Oratory", + "Conspicuous", + "History", + "Research", + "Cartography", + "Poetry", + "Etiquette" + ] + ], + "traits": [ + 1, + "Revered", + "Wise" + ], + "requires": "Father/Mother", + "requires_expr": [ + "father/mother" + ] + } + }, + "Below Setting": { + "Born Below": { + "time": 6, + "res": 0, + "leads": [ + "Society" + ], + "skills": [ + [ + 3, + "General" + ] + ], + "traits": [ + 3, + "Tunnel Vision" + ], + "common_traits": [ + "Aecer's Likeness", + "Coat Of Fur", + "Communal", + "Enlarged Incisors", + "Quick-blooded", + "Tail", + "Large Ears" + ], + "key_leads": [ + "Society Subsetting" + ] + }, + "Pinky": { + "time": 2, + "res": 2, + "stat": [ + [ + -1, + "m" + ] + ], + "skills": [ + [ + 3, + "Soothing Platitudes", + "Below-wise" + ] + ], + "traits": [ + 2, + "Confusing Rant", + "Distracted", + "Clumsy", + "Lucky" + ] + }, + "Scavenger": { + "time": 4, + "res": 3, + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 6, + "Inconspicuous", + "Survival", + "Appraisal", + "Brawling", + "Junk-wise" + ] + ], + "traits": [ + 1, + "Greedy", + "Iron Stomach", + "Callous" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Scratcher": { + "time": 6, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 5, + "Tunneling", + "Tunnel-wise", + "Mending" + ] + ], + "traits": [ + 1, + "Deep Sense", + "Hacking Cough" + ] + }, + "Snitch": { + "time": 4, + "res": 3, + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 4, + "Inconspicuous", + "Falsehood", + "Haggling", + "Secret-wise" + ] + ], + "traits": [ + 1, + "Cowardly", + "Two-faced" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "The Gauntlet": { + "time": 1, + "res": 4, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Society" + ], + "skills": [ + [ + 5, + "Brawling", + "Soothing Platitudes", + "Hazing-wise", + "Pecking Order-wise" + ] + ], + "traits": [ + 1, + "Skulking", + "Abused" + ], + "key_leads": [ + "Society Subsetting" + ] + }, + "Apprentice": { + "time": 6, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 3, + "Mending", + "Blacksmith", + "Bribe-wise" + ] + ], + "traits": [ + 1, + "Gopher" + ], + "requires": "The Gauntlet", + "requires_expr": [ + "the gauntlet" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Bladesmith": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Society" + ], + "skills": [ + [ + 7, + "Haggling", + "Instruction", + "Blacksmith", + "Knife-wise", + "Sword-wise" + ] + ], + "traits": [ + 1, + "Secretive" + ], + "requires": "Apprentice", + "requires_expr": [ + "apprentice" + ], + "key_leads": [ + "Society Subsetting" + ] + }, + "Kidnapper": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 7, + "Inconspicuous", + "Knots", + "Haggling", + "Cudgel", + "Intimidation", + "Child-wise" + ] + ], + "traits": [ + 1, + "Callous" + ], + "requires": "The Gauntlet", + "requires_expr": [ + "the gauntlet" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Fingers": { + "time": 6, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 4, + "Sleight Of Hand", + "Inconspicuous", + "Knives", + "Streetwise" + ] + ], + "traits": [ + 1, + "Light Touch", + "Cocky" + ], + "requires": "The Gauntlet", + "requires_expr": [ + "the gauntlet" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Sneak-thief": { + "time": 7, + "res": 6, + "skills": [ + [ + 5, + "Stealthy", + "Lock Pick", + "Knives", + "Roof-wise", + "Window-wise" + ] + ], + "traits": [ + 1, + "Cool-headed", + "Soft Step" + ], + "requires": "The Gauntlet", + "requires_expr": [ + "the gauntlet" + ] + }, + "Burglar": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "pm" + ] + ], + "skills": [ + [ + 8, + "Observation", + "Climbing", + "Throwing", + "Knots", + "Interrogation", + "Locksmith", + "Loot-wise" + ] + ], + "traits": [ + 1, + "Quiet", + "Confident" + ], + "requires": "Sneak-Thief, Sheriff, or Shadow", + "requires_expr": [ + "sneak-thief", + "sheriff", + "shadow" + ] + }, + "Bruiser": { + "time": 6, + "res": 8, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Exile", + "Society" + ], + "skills": [ + [ + 7, + "Weapon Of Choice", + "Intimidation", + "Extortion", + "Crossbow", + "Shield Training" + ] + ], + "traits": [ + 1, + "Mean", + "Brutal", + "Dumb" + ], + "requires": "The Gauntlet", + "requires_expr": [ + "the gauntlet" + ], + "key_leads": [ + "Exile Subsetting", + "Society Subsetting" + ] + }, + "Fence": { + "time": 7, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 7, + "Appraisal", + "Haggling", + "Falsehood", + "Antique-wise", + "Fake-wise" + ] + ], + "traits": [ + 1, + "Poker Face" + ] + }, + "Sawbones": { + "time": 8, + "res": 15, + "leads": [ + "Exile" + ], + "skills": [ + [ + 6, + "Field Dressing", + "Apothecary", + "Surgery", + "Poisons", + "Haggling" + ] + ], + "traits": [ + 1, + "Practical", + "Impersonal" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Negotiator": { + "time": 8, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Society" + ], + "skills": [ + [ + 6, + "Persuasion", + "Deal-wise", + "Haggling", + "Intimidation", + "Oratory" + ] + ], + "traits": [ + 1, + "Calm Demeanor", + "Good Listener" + ], + "key_leads": [ + "Society Subsetting" + ] + }, + "The Brain": { + "time": 9, + "res": 13, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Society" + ], + "skills": [ + [ + 13, + "Soothing Platitudes", + "Read", + "Write", + "Research", + "Astrology", + "Strategy", + "Logistics", + "Falsehood", + "History", + "Obscure History", + "World Domination-wise" + ] + ], + "traits": [ + 2, + "Genius", + "Condescending", + "Academic", + "Frustrated" + ], + "requires": "One completely mundane lifepath like Bee Keeper, Scavenger, or Hermit", + "key_leads": [ + "Society Subsetting" + ] + }, + "Mastermind": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "skills": [ + [ + 13, + "Intimidation", + "Persuasion", + "Oratory", + "Falsehood", + "Command", + "Below-wise", + "Sword", + "Clique-wise", + "Nest-wise", + "Traitor-wise" + ] + ], + "traits": [ + 3, + "Ambitious", + "Ruthless", + "Suspicious" + ], + "requires": "The Gauntlet and either Negotiator or The Brain", + "requires_expr": [ + "+and", + [ + "the gauntlet" + ], + [ + "+or", + [ + "negotiator" + ], + [ + "the brain" + ] + ] + ] + } + }, + "Exile Subsetting": { + "Carnivore": { + "time": 4, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Below", + "Society" + ], + "skills": [ + [ + 6, + "Hunting", + "Cooking", + "Tracking", + "Trapper", + "Bow", + "Spear", + "Forest-wise" + ] + ], + "traits": [ + 1, + "Gnawing Hunger", + "Aggressive Carnivore" + ], + "requires": "Born to the Fields", + "requires_expr": [ + "born to the fields" + ], + "key_leads": [ + "Below Setting", + "Society Subsetting" + ] + }, + "Scrub": { + "time": 3, + "res": 3, + "stat": [ + [ + -1, + "m" + ], + [ + -1, + "p" + ] + ], + "leads": [ + "Field", + "Society" + ], + "skills": [ + [ + 5, + "Inconspicuous", + "Soothing Platitudes", + "Kick Me-wise", + "Bully-wise", + "Nest-wise", + "Below-wise", + "Village-wise", + "Cat-wise" + ] + ], + "traits": [ + 3, + "Abused", + "Non-confrontational", + "Meek" + ], + "requires": "Born Below", + "requires_exp": [ + "born below" + ], + "key_leads": [ + "Field Setting", + "Society Subsetting" + ] + }, + "Diseased": { + "time": 3, + "res": 3, + "stat": [ + [ + -1, + "p" + ] + ], + "skills": [ + [ + 5, + "Survival", + "Foraging", + "Disease-wise", + "Lynch Mob-wise", + "Hospital-wise" + ] + ], + "traits": [ + 2, + "Contagious", + "Bitter" + ] + }, + "Hermit": { + "time": 10, + "res": 2, + "leads": [ + "Field", + "Society" + ], + "skills": [ + [ + 9, + "Philosophy", + "Astrology", + "Rhetoric", + "Oratory", + "Foraging", + "Books-wise", + "Lost Secrets-wise" + ] + ], + "traits": [ + 3, + "Philosophical", + "Boring" + ], + "key_leads": [ + "Field Setting", + "Society Subsetting" + ] + }, + "Bushwhacker": { + "time": 5, + "res": 5, + "stat": [ + [ + 1, + "p" + ] + ], + "leads": [ + "Field", + "Below", + "Society" + ], + "skills": [ + [ + 4, + "Weapon Of Choice", + "Intimidation", + "Stealthy", + "Bow", + "Ambush-wise" + ] + ], + "traits": [ + 1, + "Desperate" + ], + "key_leads": [ + "Field Setting", + "Below Setting", + "Society Subsetting" + ] + }, + "Corsair": { + "time": 6, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Field", + "Below", + "Society" + ], + "skills": [ + [ + 8, + "Rigging", + "Knots", + "Navigation", + "Mending", + "Appropriate Weapons", + "Intimidation", + "Ship-wise", + "Bay-wise" + ] + ], + "traits": [ + 1, + "Ruthless", + "Sea Legs" + ], + "key_leads": [ + "Field Setting", + "Below Setting", + "Society Subsetting" + ] + }, + "Bandit King": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Field", + "Below", + "Society" + ], + "skills": [ + [ + 6, + "Intimidation", + "Command", + "Sword", + "Bandit-wise", + "Caravan-wise" + ] + ], + "traits": [ + 2, + "Scheming", + "Daring" + ], + "requires": "Bushwhacker, Sheriff, or Bruiser", + "requires_expr": [ + "bushwhacker", + "sheriff", + "bruiser" + ], + "key_leads": [ + "Field Setting", + "Below Setting", + "Society Subsetting" + ] + }, + "Albino": { + "time": 10, + "res": 25, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "skills": [ + [ + 8, + "Astrology", + "Ugly Truth", + "Read", + "Write", + "Sorcery", + "Spirit Binding" + ] + ], + "traits": [ + 2, + "Albino", + "Feared", + "Gifted", + "Misunderstood" + ], + "note": "Choose one of Sorcery or Summoning, not both." + } + }, + "Society Subsetting": { + "Initiate": { + "time": 3, + "res": 2, + "leads": [ + "Exile" + ], + "skills": [ + [ + 3, + "Doctrine", + "Society-wise" + ] + ], + "traits": [ + 2, + "Broken Spirit" + ], + "key_leads": [ + "Exile Subsetting" + ] + }, + "Cultist": { + "time": 4, + "res": 4, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 5, + "Rhetoric", + "Suasion", + "Cudgel", + "Conversion-wise" + ] + ], + "traits": [ + 1, + "Zealot", + "Defensive" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Shadow": { + "time": 6, + "res": 6, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 6, + "Stealthy", + "Observation", + "Inconspicuous", + "Climbing", + "Tail-wise" + ] + ], + "traits": [ + 1, + "Cautious" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Arsonist": { + "time": 6, + "res": 6, + "skills": [ + [ + 7, + "Firebuilding", + "Arson", + "Inconspicuous", + "Firebombs", + "Lock Pick", + "Arson-wise" + ] + ], + "traits": [ + 1, + "Pyromaniac" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Murderer": { + "time": 6, + "res": 7, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 8, + "Knives", + "Stealthy", + "Intimidation", + "Inconspicuous", + "Garrote", + "Anatomy", + "Crossbow", + "Murder-wise" + ] + ], + "traits": [ + 1, + "Murderous", + "Cold-hearted", + "Single-minded" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Willard": { + "time": 5, + "res": 5, + "skills": [ + [ + 5, + "Animal Husbandry", + "Inconspicuous", + "Command", + "Ratiquette" + ] + ], + "traits": [ + 2, + "Rat-squeak", + "Bitter", + "Weird" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Perverter": { + "time": 8, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Field", + "Below", + "Exile" + ], + "skills": [ + [ + 6, + "Disguise", + "Preaching", + "Inconspicuous", + "Falsehood", + "Dupe-wise" + ] + ], + "traits": [ + 1, + "Scheming" + ], + "requires": "Cultist or Missionary", + "requires_expr": [ + "cultist", + "missionary" + ], + "key_leads": [ + "Field Setting", + "Below Setting", + "Exile Subsetting" + ] + }, + "Poisoner": { + "time": 6, + "res": 7, + "skills": [ + [ + 6, + "Disguise", + "Preaching", + "Inconspicuous", + "Falsehood", + "Dupe-wise" + ] + ], + "traits": [ + 1, + "Sadist", + "Nauseous" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Guardian": { + "time": 6, + "res": 9, + "stat": [ + [ + 1, + "p" + ] + ], + "skills": [ + [ + 8, + "Weapon Of Choice", + "Brawling", + "Armor Training", + "Shield Training", + "Intimidation" + ] + ], + "traits": [ + 2, + "Merciless", + "Loyal" + ], + "requires": "Initiate", + "requires_expr": [ + "initiate" + ] + }, + "Preacher": { + "time": 8, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "skills": [ + [ + 6, + "Preaching", + "Conspicuous", + "Symbology", + "Obscure History" + ] + ], + "traits": [ + 2, + "Obsessed", + "Righteous" + ], + "requires": "Requires Initiate and either Brother/Sister or Cultist", + "requires_expr": [ + "+and", + [ + "initiate" + ], + [ + "brother/sister", + "cultist" + ] + ] + }, + "Visionary": { + "time": 10, + "res": 30, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Exile", + "Below" + ], + "skills": [ + [ + 13, + "Command", + "Astrology", + "Research", + "Interrogation", + "Torture", + "Observation", + "Poetry", + "Cult-wise", + "Inner Workings-wise", + "Undermining-wise" + ] + ], + "traits": [ + 4, + "Megalomaniac", + "Imperious Demeanor", + "Visionary Faith", + "Dreamer" + ], + "requires": "Preacher", + "requires_expr": [ + "preacher" + ], + "key_leads": [ + "Exile Subsetting", + "Below Setting" + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/wizard.json b/src/data/lifepaths/wizard.json new file mode 100755 index 0000000..f4148ad --- /dev/null +++ b/src/data/lifepaths/wizard.json @@ -0,0 +1,1172 @@ +{ + "Special Gifted Lifepaths": { + "Gifted Child": { + "time": 9, + "res": 4, + "leads": [ + "Outcast", + "Court", + "Religious" + ], + "skills": [ + [ + 2, + "General" + ] + ], + "traits": [ + 1, + "Misunderstood", + "Gifted", + "Abused", + "Spirit Familiar" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting", + "Religious Subsetting" + ] + }, + "Apt Pupil": { + "time": 3, + "res": 8, + "leads": [ + "Outcast", + "Soldier", + "Servitude" + ], + "skills": [ + [ + 3, + "Obscure History", + "Ugly Truth", + "Intimidation" + ] + ], + "traits": [ + 1, + "Believer", + "Gifted", + "Tainted Legacy" + ], + "requires": "Must be character's second or third lifepath. It may not be taken twice.", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 2 + ] + ], + "key_leads": [ + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Servitude And Captive Setting" + ] + } + }, + "Peasant Setting": { + "Speaker of Names": { + "time": 7, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "Village" + ], + "skills": [ + [ + 6, + "Spirit Binding", + "Circination", + "Paths-wise", + "Spirit-wise", + "Domain-wise" + ] + ], + "traits": [ + 2, + "Well Traveled", + "Brook No Fools", + "Fey Blood" + ], + "requires": "Augur, Crazy Witch, Neophyte Sorcerer or Elder", + "requires_expr": [ + "augur", + "crazy witch", + "neophyte sorcerer", + "elder" + ], + "key_leads": [ + "Outcast Subsetting", + "Villager Setting" + ] + } + }, + "Villager Setting": { + "Wizard's Apprentice": { + "time": 7, + "res": 10, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "City", + "Outcast", + "Servitude" + ], + "skills": [ + [ + 6, + "Read", + "Foraging", + "Symbology", + "Circination", + "Pig-wise", + "Bone Headed-wise" + ] + ], + "traits": [ + 2, + "Always in the Way", + "Atravieso", + "Gifted", + "Assistant Pig-Keeper" + ], + "key_leads": [ + "Peasant Setting", + "City Dweller Setting", + "Outcast Subsetting", + "Servitude And Captive Setting" + ] + }, + "Hedge Wizard": { + "time": 8, + "res": 24, + "stat": [ + [ + 1, + "p" + ], + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "City", + "Outcast" + ], + "skills": [ + [ + 7, + "Sorcery", + "Enchanting", + "Alchemy", + "Obscure History", + "Pest-wise", + "Fool-wise" + ] + ], + "traits": [ + 2, + "Low Born", + "Impressive Hat", + "Never a Moment of Peace" + ], + "requires": "Wizard's Apprentice, Neophyte Sorcerer, Apt Pupil or Junior Student. This character may not have the Mark of Privilege", + "requires_expr": [ + "+and", + [ + "wizard's apprentice", + "neophyte sorcerer", + "apt pupil", + "junior student" + ], + [ + "+not", + [ + "mark of privilege" + ] + ] + ], + "key_leads": [ + "Peasant Setting", + "City Dweller Setting", + "Outcast Subsetting" + ] + } + }, + "City Dweller Setting": { + "Evangelist": { + "time": 3, + "res": 6, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Court", + "Religious" + ], + "skills": [ + [ + 5, + "Empyrealia", + "Demonology", + "Oratory", + "Cultist-wise" + ] + ], + "traits": [ + 2, + "Believer", + "Fiery" + ], + "requires": "Dilettante or any summoner or religious lifepath", + "requires_expr": [ + "dilettante", + "religious subsetting:castrati", + "religious subsetting:pardoner", + "religious subsetting:zealous convert", + "religious subsetting:military order", + "religious subsetting:grave digger", + "religious subsetting:porter", + "religious subsetting:notary", + "religious subsetting:custodian", + "religious subsetting:interpreter", + "religious subsetting:archivist", + "religious subsetting:itinerant monk", + "religious subsetting:cloistered monk/nun", + "religious subsetting:temple acolyte", + "religious subsetting:priest", + "religious subsetting:exorcist", + "religious subsetting:inquisitor", + "religious subsetting:theologian", + "religious subsetting:archpriest", + "religious subsetting:canon", + "religious subsetting:abbot/abbess", + "religious subsetting:bishop", + "outcast subsetting:mad summoner", + "outcast subsetting:crazy witch", + "seafaring setting:weather witch", + "noble court subsetting:court summoner" + ], + "key_leads": [ + "Outcast Subsetting", + "Noble Court Subsetting", + "Religious Subsetting" + ] + } + }, + "Noble Court Subsetting": { + "Court Enchanter": { + "time": 8, + "res": 20, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Outcast", + "City" + ], + "skills": [ + [ + 5, + "Etiquette", + "Astrology", + "Alchemy", + "Enchanting", + "Excuses-wise" + ] + ], + "traits": [ + 2, + "Late", + "Harried" + ], + "requires": "Senior Student, Neophyte Sorcerer, Apt Pupil or Wizard's Apprentice", + "requires_expr": [ + "senior student", + "neophyte sorcerer", + "apt pupil", + "wizard's apprentice" + ], + "key_leads": [ + "Outcast Subsetting", + "City Dweller Setting" + ] + }, + "Court Summoner": { + "time": 8, + "res": 30, + "stat": [ + [ + 1, + "pm" + ] + ], + "leads": [ + "Outcast", + "Peasant", + "Village" + ], + "skills": [ + [ + 6, + "Etiquette", + "Astrology", + "Summoning", + "Circination", + "Bargaining", + "Inane Request-wise", + "Promise-wise" + ] + ], + "traits": [ + 2, + "Dismissive", + "Polite", + "Arrogant", + "Frustrated", + "Faust" + ], + "requires": "Senior Student, Mad Summoner, Apt Pupil or Wizard's Apprentice", + "requires_expr": [ + "senior student", + "outcast subsetting:mad summoner", + "apt pupil", + "wizard's apprentice" + ], + "key_leads": [ + "Outcast Subsetting", + "Peasant Setting", + "Villager Setting" + ] + } + }, + "Outcast Setting": { + "Demented Inventor": { + "time": 7, + "res": 15, + "stat": [ + [ + 1, + "m" + ] + ], + "leads": [ + "Peasant", + "Village" + ], + "skills": [ + [ + 6, + "Mad Invention-wise", + "Mending", + "Enchanting", + "Blacksmith", + "Whitesmith" + ] + ], + "traits": [ + 2, + "Demented", + "Tinker" + ], + "requires": "Rogue Wizard, Apt Pupil or Wizard's Apprentice", + "requires_expr": [ + "rogue wizard", + "apt pupil", + "villager setting:wizard's apprentice" + ], + "key_leads": [ + "Peasant Setting", + "Villager Setting" + ] + }, + "Evil Necromancer": { + "time": 10, + "res": 20, + "stat": [ + [ + 1, + "m" + ], + [ + 1, + "p" + ] + ], + "skills": [ + [ + 4, + "Death Art", + "Anatomy", + "Graveyard-wise" + ] + ], + "traits": [ + 2, + "Corrupted", + "Evil" + ], + "requires": "Coroner, Death Cultist, Cultist or Apt Pupil", + "requires_expr": [ + "noble court subsetting:coroner", + "death cult setting:death cultist", + "cultist", + "apt pupil" + ] + } + }, + "College of Magic Setting": { + "Supplicant": { + "time": 1, + "res": 3, + "leads": [ + "Peasant", + "Servitude", + "Soldier" + ], + "skills": [ + [ + 2, + "Animal Husbandry", + "Firebuilding" + ] + ], + "traits": [ + 2, + "Broken In", + "Gifted", + "Second Sight", + "Fey Blood" + ], + "requires": "Must be second lifepath. May not be taken twice", + "requires_expr": [ + "+and", + [ + "+has_n_lifepaths_or_more", + 1 + ], + [ + "+has_n_lifepaths_or_less", + 1 + ] + ], + "key_leads": [ + "Peasant Setting", + "Servitude And Captive Setting", + "Professional Soldier Subsetting" + ] + }, + "Junior Student": { + "time": 2, + "res": 5, + "leads": [ + "City", + "Court", + "Outcast" + ], + "skills": [ + [ + 8, + "Read", + "Write", + "Ancient History", + "Circination", + "Illuminations", + "Astrology", + "Symbology" + ] + ], + "traits": [ + 1, + "Hazed" + ], + "requires": "Supplicant, Arcane Devotee, Apt Pupil or Neophyte Sorcerer", + "restrict": "May not be taken twice.", + "requires_expr": [ + "supplicant", + "arcane devotee", + "apt pupil", + "neophyte sorcerer" + ], + "key_leads": [ + "City Dweller Setting", + "Noble Court Subsetting", + "Outcast Subsetting" + ] + }, + "Senior Student": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Adjunct": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Master Sorcerer": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Master Enchanter": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Master Summoner": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Researcher": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Councillor": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Headmaster": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Death Cult Setting": { + "Harem Slave": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Death Cultist": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Grave Robber": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Spy": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Factotum": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Tomb Guard": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Death Priest": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + }, + "Death Artist": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + }, + "Servant of the Dark Blood Setting": { + "Master of the Weak": { + "time": 1, + "res": 1, + "leads": [ + "Peasant", + "Villager", + "City", + "Court", + "Servitude", + "Outcast", + "Soldier", + "Seafaring", + "Religious" + ], + "skills": [ + [ + 3, + "" + ] + ], + "traits": [ + 1, + "" + ], + "requires": "", + "requires_expr": [], + "key_leads": [ + "Peasant Setting", + "Villager Setting", + "City Dweller Setting", + "Noble Court Subsetting", + "Servitude And Captive Setting", + "Outcast Subsetting", + "Professional Soldier Subsetting", + "Seafaring Setting", + "Religious Subsetting" + ] + } + } +} \ No newline at end of file diff --git a/src/data/lifepaths/wolf.json b/src/data/lifepaths/wolf.json new file mode 100755 index 0000000..f4f93e9 --- /dev/null +++ b/src/data/lifepaths/wolf.json @@ -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" + ] + } + } +} \ No newline at end of file diff --git a/src/data/resources/dwarf.json b/src/data/resources/dwarf.json new file mode 100755 index 0000000..83aba51 --- /dev/null +++ b/src/data/resources/dwarf.json @@ -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" + } +] \ No newline at end of file diff --git a/src/data/resources/elf.json b/src/data/resources/elf.json new file mode 100755 index 0000000..d879d3c --- /dev/null +++ b/src/data/resources/elf.json @@ -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 + }, + { + "name": "Large Country Manor And Land", + "rp": 50 + }, + { + "name": "Palace", + "rp": 100 + }, + { + "name": "A Forest, Bay Or Mountain", + "rp": 150 + }, + { + "name": "Appartment In The Citadel", + "rp": 25 + } + ] + } +] \ No newline at end of file diff --git a/src/data/resources/man.json b/src/data/resources/man.json new file mode 100755 index 0000000..3636eba --- /dev/null +++ b/src/data/resources/man.json @@ -0,0 +1,434 @@ +[ + { + "name": "Arms", + "type": "gear", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + }, + { + "name": "Run Of The Mill Quality", + "rp": 5 + }, + { + "name": "Superior Quality", + "rp": 20 + } + ] + }, + { + "name": "Missile Weapons", + "type": "gear", + "resources": [ + { + "name": "Throwing Weapons", + "resources": [ + { + "name": "Poor Quality", + "rp": 2 + }, + { + "name": "Run Of The Mill Quality", + "rp": 3 + }, + { + "name": "Superior Quality", + "rp": 9 + } + ] + }, + { + "name": "Hunting Bow", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + }, + { + "name": "Run Of The Mill Quality", + "rp": 5 + }, + { + "name": "Superior Quality", + "rp": 15 + } + ] + }, + { + "name": "Great Bow", + "resources": [ + { + "name": "Poor Quality", + "rp": 5 + }, + { + "name": "Run Of The Mill Quality", + "rp": 10 + }, + { + "name": "Superior Quality", + "rp": 30 + } + ] + }, + { + "name": "Crossbow", + "resources": [ + { + "name": "Poor Quality", + "rp": 4 + }, + { + "name": "Run Of The Mill Quality", + "rp": 7 + }, + { + "name": "Superior Quality", + "rp": 21 + } + ] + }, + { + "name": "Heavy Crossbow", + "resources": [ + { + "name": "Poor Quality", + "rp": 6 + }, + { + "name": "Run Of The Mill Quality", + "rp": 12 + }, + { + "name": "Superior Quality", + "rp": 36 + } + ] + }, + { + "name": "Pistol", + "resources": [ + { + "name": "Poor Quality", + "rp": 8 + }, + { + "name": "Run Of The Mill Quality", + "rp": 15 + }, + { + "name": "Superior Quality", + "rp": 45 + } + ] + }, + { + "name": "Arquebus", + "resources": [ + { + "name": "Poor Quality", + "rp": 10 + }, + { + "name": "Run Of The Mill Quality", + "rp": 20 + }, + { + "name": "Superior Quality", + "rp": 60 + } + ] + } + ] + }, + { + "name": "Armor", + "type": "gear", + "resources": [ + { + "name": "Gambeson", + "resources": [ + { + "name": "Poor Quality", + "rp": 2 + }, + { + "name": "Run Of The Mill Quality", + "rp": 3 + }, + { + "name": "Superior Quality", + "rp": 12 + } + ] + }, + { + "name": "Reinforced Leather", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + }, + { + "name": "Run Of The Mill Quality", + "rp": 6 + }, + { + "name": "Superior Quality", + "rp": 24 + } + ] + }, + { + "name": "Light Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 5 + }, + { + "name": "Run Of The Mill Quality", + "rp": 10 + }, + { + "name": "Superior Quality", + "rp": 40 + } + ] + }, + { + "name": "Heavy Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 8 + }, + { + "name": "Run Of The Mill Quality", + "rp": 15 + }, + { + "name": "Superior Quality", + "rp": 60 + } + ] + }, + { + "name": "Plated Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 10 + }, + { + "name": "Run Of The Mill Quality", + "rp": 20 + }, + { + "name": "Superior Quality", + "rp": 80 + } + ] + }, + { + "name": "Full Plated Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 25 + }, + { + "name": "Run Of The Mill Quality", + "rp": 50 + }, + { + "name": "Superior Quality", + "rp": 200 + } + ] + } + ] + }, + { + "name": "Riding Mount Or Pack Animal", + "rp": 5, + "type": "gear" + }, + { + "name": "Warhorse", + "rp": 12, + "type": "gear" + }, + { + "name": "Clothes", + "rp": 1, + "type": "gear" + }, + { + "name": "Traveling Gear", + "rp": 1, + "type": "gear" + }, + { + "name": "Shoes", + "rp": 1, + "type": "gear" + }, + { + "name": "Personal Effects", + "rp": 1, + "type": "gear" + }, + { + "name": "Finery", + "rp": 5, + "type": "gear" + }, + { + "name": "Cash", + "rp": 6, + "type": "gear" + }, + { + "name": "Skill Toolkit", + "rp": 8, + "type": "gear" + }, + { + "name": "Workshop", + "rp": 20, + "type": "property" + }, + { + "name": "Companion Animal", + "rp": 3, + "type": "gear" + }, + { + "name": "Herd Of Animals", + "rp": 20, + "type": "property" + }, + { + "name": "Rent", + "rp": 5, + "type": "property" + }, + { + "name": "Property", + "type": "property", + "resources": [ + { + "name": "A Leaky Shack", + "rp": 1 + }, + { + "name": "A Small Cottage", + "rp": 3 + }, + { + "name": "A House", + "rp": 10 + }, + { + "name": "A \"Cottage Industry\" Like A Weaver", + "rp": 10 + }, + { + "name": "A Villa Or Farm", + "rp": 15 + }, + { + "name": "A Small Business", + "rp": 20 + }, + { + "name": "Moderate-sized Business", + "rp": 30 + }, + { + "name": "A Manor Or Small Estate", + "rp": 40 + }, + { + "name": "An Urban Hotel", + "rp": 40 + }, + { + "name": "A Well-paid Position (Like Mayor)", + "rp": 45 + }, + { + "name": "A Successful Small Business", + "rp": 60 + }, + { + "name": "A Large Business", + "rp": 60 + }, + { + "name": "A Keep", + "rp": 60 + }, + { + "name": "A Fortress", + "rp": 75 + }, + { + "name": "A Moderate-sized Estate", + "rp": 75 + }, + { + "name": "A Castle With Attendant Town", + "rp": 90 + }, + { + "name": "A Large Estate", + "rp": 90 + }, + { + "name": "A Palace", + "rp": 105 + }, + { + "name": "A Government Position In A Prosperous Town", + "rp": 105 + } + ] + }, + { + "name": "Boat", + "type": "property", + "resources": [ + { + "name": "A Rowboat Or Skiff", + "rp": 5 + }, + { + "name": "A Longboat", + "rp": 10 + }, + { + "name": "A Junk", + "rp": 15 + }, + { + "name": "A Felucca", + "rp": 30 + }, + { + "name": "A Carrack", + "rp": 60 + }, + { + "name": "A Caravel", + "rp": 75 + }, + { + "name": "Treasure Ship", + "rp": 105 + } + ] + } +] \ No newline at end of file diff --git a/src/data/resources/orc.json b/src/data/resources/orc.json new file mode 100755 index 0000000..4885ff2 --- /dev/null +++ b/src/data/resources/orc.json @@ -0,0 +1,211 @@ +[ + { + "name": "Rags", + "rp": 1, + "type": "gear" + }, + { + "name": "Traveling Gear", + "rp": 3, + "type": "gear" + }, + { + "name": "Hobnailed Boots", + "rp": 1, + "type": "gear" + }, + { + "name": "Orc Arms", + "type": "gear", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + }, + { + "name": "Run Of The Mill Quality", + "rp": 5 + } + ] + }, + { + "name": "Armor", + "type": "gear", + "resources": [ + { + "name": "Hides", + "resources": [ + { + "name": "Poor Quality", + "rp": 1 + } + ] + }, + { + "name": "Reinforced Hides", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + } + ] + }, + { + "name": "Reinforced Leather", + "resources": [ + { + "name": "Run Of The Mill Quality", + "rp": 8 + }, + { + "name": "Superior Quality", + "rp": 25 + } + ] + }, + { + "name": "Light Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 5 + }, + { + "name": "Run Of The Mill Quality", + "rp": 12 + } + ] + }, + { + "name": "Heavy Mail", + "resources": [ + { + "name": "Poor Quality", + "rp": 8 + }, + { + "name": "Run Of The Mill Quality", + "rp": 20 + } + ] + } + ] + }, + { + "name": "Missile Weapons", + "type": "gear", + "resources": [ + { + "name": "Bow", + "resources": [ + { + "name": "Poor Quality", + "rp": 3 + }, + { + "name": "Run Of The Mill Quality", + "rp": 5 + } + ] + }, + { + "name": "Crossbow", + "resources": [ + { + "name": "Poor Quality", + "rp": 4 + }, + { + "name": "Run Of The Mill Quality", + "rp": 6 + } + ] + }, + { + "name": "Iron-cased Bombs", + "resources": null, + "rp": 10 + } + ] + }, + { + "name": "Black Iron Helmet", + "rp": 5, + "type": "gear" + }, + { + "name": "Black Iron Shield", + "rp": 4, + "type": "gear" + }, + { + "name": "Riding Mount Or Pack Animal", + "rp": 5, + "type": "gear" + }, + { + "name": "Great Wolf Mount", + "rp": 15, + "type": "gear" + }, + { + "name": "Whip", + "rp": 2, + "type": "gear" + }, + { + "name": "Poison", + "rp": 5, + "type": "gear" + }, + { + "name": "Brazen Horn", + "rp": 9, + "type": "gear" + }, + { + "name": "Clan Banner", + "rp": 9, + "type": "gear" + }, + { + "name": "Skill Tools", + "rp": 9, + "type": "gear" + }, + { + "name": "Riding Harness For Wolf", + "rp": 5, + "type": "gear" + }, + { + "name": "Servant's Black Robes", + "rp": 1, + "type": "gear" + }, + { + "name": "Servant's Leather Apron", + "rp": 1, + "type": "gear" + }, + { + "name": "Ceremonial Knives", + "rp": 3, + "type": "gear" + }, + { + "name": "Ceremonial Axe Or Sword", + "rp": 7, + "type": "gear" + }, + { + "name": "Servant's Tools Of The Trade", + "rp": 7, + "type": "gear" + }, + { + "name": "Poisoner's Toolkit", + "rp": 7, + "type": "gear" + } +] \ No newline at end of file diff --git a/src/data/resources/roden.json b/src/data/resources/roden.json new file mode 100755 index 0000000..a5344c2 --- /dev/null +++ b/src/data/resources/roden.json @@ -0,0 +1,139 @@ +[ + { + "name": "Arms", + "rp": 5, + "type": "gear" + }, + { + "name": "Roden Throwing Blades", + "rp": 15, + "type": "gear" + }, + { + "name": "Wooden Shield", + "rp": 2, + "type": "gear" + }, + { + "name": "Armor", + "type": "gear", + "resources": [ + { + "name": "Gambeson", + "rp": 5 + }, + { + "name": "Reinforced Leather", + "rp": 10 + }, + { + "name": "Light Mail", + "rp": 15 + }, + { + "name": "Heavy Mail", + "rp": 20 + } + ] + }, + { + "name": "Property", + "type": "property", + "resources": [ + { + "name": "Rat's Nest Property", + "resources": [ + { + "name": "Den", + "rp": 7 + }, + { + "name": "Nest", + "rp": 10 + }, + { + "name": "Apiary", + "rp": 10 + }, + { + "name": "Fields", + "rp": 15 + } + ] + } + ] + }, + { + "name": "Workshop", + "type": "property", + "rp": 20 + }, + { + "name": "Animal Herd", + "type": "property", + "rp": 10 + }, + { + "name": "Clothes", + "type": "gear", + "rp": 1 + }, + { + "name": "Traveling Gear", + "type": "gear", + "rp": 1 + }, + { + "name": "Shoes", + "type": "gear", + "rp": 3 + }, + { + "name": "Tool Kit", + "type": "gear", + "rp": 9 + }, + { + "name": "Firebombs", + "type": "gear", + "rp": 20 + }, + { + "name": "Robes Of The Ordained", + "type": "gear", + "rp": 1 + }, + { + "name": "Honeyed Oatcakes", + "type": "gear", + "rp": 5 + }, + { + "name": "Dandewine", + "type": "gear", + "rp": 5 + }, + { + "name": "Blood Blossom", + "type": "gear", + "rp": 5 + }, + { + "name": "Visionary Cult", + "type": "affiliation", + "resources": [ + { + "name": "1d Cult", + "rp": 10 + }, + { + "name": "2d Cult", + "rp": 25 + }, + { + "name": "3d Cult", + "rp": 50 + } + ] + } +] \ No newline at end of file diff --git a/src/data/resources/wolf.json b/src/data/resources/wolf.json new file mode 100755 index 0000000..e51c10a --- /dev/null +++ b/src/data/resources/wolf.json @@ -0,0 +1,42 @@ +[ + { + "name": "Territory", + "type": "property", + "resources": [ + { + "name": "Barren", + "rp": 5 + }, + { + "name": "Wild Grounds", + "rp": 10 + }, + { + "name": "Plentiful Range", + "rp": 15 + } + ] + }, + { + "name": "Armor", + "type": "gear", + "resources": [ + { + "name": "Plated Leather Chanfron", + "rp": 3 + }, + { + "name": "Leather Collar", + "rp": 2 + }, + { + "name": "Plated Body Armor", + "rp": 6 + }, + { + "name": "Leather Greaves And Cuissarts", + "rp": 2 + } + ] + } +] \ No newline at end of file diff --git a/src/data/skills.json b/src/data/skills.json new file mode 100755 index 0000000..816266e --- /dev/null +++ b/src/data/skills.json @@ -0,0 +1,2749 @@ +{ + "Accounting": { + "roots": [ + "Perception" + ] + }, + "Acting": { + "roots": [ + "Perception" + ] + }, + "Administration": { + "roots": [ + "Perception" + ] + }, + "Ages Of The Etharch": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Alchemy": { + "roots": [ + "Perception" + ] + }, + "Almanac": { + "roots": [ + "Perception" + ] + }, + "Althing-wise": { + "roots": [ + "Perception" + ] + }, + "Ambition-wise": { + "roots": [ + "Perception" + ] + }, + "Amercement": { + "roots": [ + "Perception" + ] + }, + "Ancestral Jaw": { + "stock": "wolfish", + "roots": [ + "Will" + ] + }, + "Ancient Languages": { + "roots": [ + "Perception" + ] + }, + "Ancient Ways": { + "stock": "wolfish", + "roots": [ + "Perception" + ] + }, + "Anatomy": { + "roots": [ + "Perception" + ] + }, + "Animal Husbandry": { + "roots": [ + "Will" + ] + }, + "Antiphon Union Training": { + "stock": "elven", + "roots": [ + "Will" + ] + }, + "Apothecary": { + "roots": [ + "Perception" + ] + }, + "Appraisal": { + "roots": [ + "Perception" + ] + }, + "Archcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Architect": { + "roots": [ + "Perception" + ] + }, + "Armor Training": { + "roots": [ + "Power", + "Speed" + ] + }, + "Armorer": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Army-wise": { + "roots": [ + "Perception" + ] + }, + "Arson": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Artificer-wise": { + "roots": [ + "Perception" + ] + }, + "Artillerist": { + "roots": [ + "Perception" + ] + }, + "Artillery Hand": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Astrology": { + "roots": [ + "Perception" + ] + }, + "Atilliator": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Aura Reading": { + "roots": [ + "Will", + "Perception" + ] + }, + "Axe": { + "roots": [ + "Power", + "Agility" + ] + }, + "Back Alley-wise": { + "roots": [ + "Perception" + ] + }, + "Bad End-wise": { + "roots": [ + "Perception" + ] + }, + "Baking": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Ballad Of History": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Banner-wise": { + "roots": [ + "Perception" + ] + }, + "Bannerman-wise": { + "roots": [ + "Perception" + ] + }, + "Bat-wise": { + "roots": [ + "Perception" + ] + }, + "Bastions Of Hatred": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Beer Appraisal": { + "stock": "dwarven", + "roots": [ + "Will", + "Perception" + ] + }, + "Beer-wise": { + "roots": [ + "Perception" + ] + }, + "Begging": { + "roots": [ + "Will" + ] + }, + "Bird Husbandry": { + "roots": [ + "Will" + ] + }, + "Black Legion-wise": { + "stock": "orcish", + "roots": [ + "Perception" + ] + }, + "Black Metal Artifice": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Blacksmith": { + "roots": [ + "Agility", + "Power" + ] + }, + "Bloodletting": { + "roots": [ + "Perception" + ] + }, + "Boatwright": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Bow": { + "roots": [ + "Agility" + ] + }, + "Bowcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Bowyer": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Boxing (Martial Arts)": { + "roots": [ + "Power", + "Agility" + ] + }, + "Brawling": { + "roots": [ + "Power" + ] + }, + "Brazen Horn Of Despair": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Brewer": { + "roots": [ + "Perception" + ] + }, + "Bribe-wise": { + "roots": [ + "Perception" + ] + }, + "Brutal Intimidation": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Burden Of The Crown-wise": { + "roots": [ + "Perception" + ] + }, + "Bureaucracy": { + "roots": [ + "Will" + ] + }, + "Butchery": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Cadence-wise": { + "roots": [ + "Perception" + ] + }, + "Call Of The Wild": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Calligraphy": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Campaign-wise": { + "roots": [ + "Perception" + ] + }, + "Cargo-wise": { + "roots": [ + "Perception" + ] + }, + "Carpentry": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Cartography": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Cartwright": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Carving": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Cave-in-wise": { + "roots": [ + "Perception" + ] + }, + "Cave-wise": { + "roots": [ + "Perception" + ] + }, + "Champion-wise": { + "roots": [ + "Perception" + ] + }, + "Chandler": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Chattel-wise": { + "roots": [ + "Perception" + ] + }, + "Cheating-wise": { + "roots": [ + "Perception" + ] + }, + "Child Rearing": { + "roots": [ + "Will" + ] + }, + "Chronology Of Kings": { + "stock": "dwarven", + "roots": [ + "Perception" + ] + }, + "Church Law": { + "roots": [ + "Perception" + ] + }, + "Citadel-wise": { + "roots": [ + "Perception" + ] + }, + "City-wise": { + "roots": [ + "Perception" + ] + }, + "Clan History": { + "stock": "dwarven", + "roots": [ + "Perception" + ] + }, + "Clan-wise": { + "roots": [ + "Perception" + ] + }, + "Climbing": { + "roots": [ + "Speed" + ] + }, + "Cloth Dyeing": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Coarse Persuasion": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Cobbler": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Code Of Citadels": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Command": { + "roots": [ + "Will" + ] + }, + "Composition": { + "roots": [ + "Will", + "Perception" + ] + }, + "Conspicuous": { + "roots": [ + "Will" + ] + }, + "Contract-wise": { + "roots": [ + "Perception" + ] + }, + "Cooking": { + "roots": [ + "Perception" + ] + }, + "Cooper": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Coppersmith": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Counterfeiting": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Countryside-wise": { + "roots": [ + "Perception" + ] + }, + "Crop-wise": { + "roots": [ + "Perception" + ] + }, + "Crossbow": { + "roots": [ + "Agility" + ] + }, + "Crowd-wise": { + "roots": [ + "Perception" + ] + }, + "Cryptography": { + "roots": [ + "Perception" + ] + }, + "Cudgel": { + "roots": [ + "Agility" + ] + }, + "Daily Bread-wise": { + "roots": [ + "Perception" + ] + }, + "Dance": { + "roots": [ + "Speed" + ] + }, + "Darkened Street-wise": { + "roots": [ + "Perception" + ] + }, + "Darkness-wise": { + "roots": [ + "Perception" + ] + }, + "Demonology": { + "roots": [ + "Perception" + ] + }, + "Digging": { + "roots": [ + "Power" + ] + }, + "Dignity Of The Wilderlands": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Disguise": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Ditch Digging": { + "roots": [ + "Power" + ] + }, + "Doctrine": { + "roots": [ + "Perception" + ] + }, + "Doctrine Of Night's Blood": { + "stock": "orcish", + "roots": [ + "Will", + "Perception" + ] + }, + "Drama-wise": { + "roots": [ + "Perception" + ] + }, + "Drinking": { + "roots": [ + "Forte" + ] + }, + "Driving": { + "roots": [ + "Will", + "Agility" + ] + }, + "Drum Maker": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Drunkard-wise": { + "roots": [ + "Perception" + ] + }, + "Drunking": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Forte" + ] + }, + "Dwarf-wise": { + "roots": [ + "Perception" + ] + }, + "Dwarven Art-wise": { + "roots": [ + "Perception" + ] + }, + "Dwarven Heroes-wise": { + "roots": [ + "Perception" + ] + }, + "Dwarven Rune Script": { + "stock": "dwarven", + "roots": [ + "Perception" + ] + }, + "Dye Manufacture": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Earth-wise": { + "roots": [ + "Perception" + ] + }, + "Elf-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Artifact-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Art-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Blade-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Citadel-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Ranger-wise": { + "roots": [ + "Perception" + ] + }, + "Elven Script": { + "stock": "elven", + "roots": [ + "Perception" + ] + }, + "Embroidery": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Empyrealia": { + "roots": [ + "Perception" + ] + }, + "Enchanting": { + "roots": [ + "Perception" + ] + }, + "Engineering": { + "roots": [ + "Perception" + ] + }, + "Engraving": { + "roots": [ + "Agility" + ] + }, + "Escape Artist": { + "stock": "wolfish", + "roots": [ + "Perception", + "Agility" + ] + }, + "Estate Management": { + "roots": [ + "Perception" + ] + }, + "Estate-wise": { + "roots": [ + "Perception" + ] + }, + "Etching": { + "roots": [ + "Agility" + ] + }, + "Etharch-wise": { + "roots": [ + "Perception" + ] + }, + "Etiquette": { + "roots": [ + "Will", + "Perception" + ] + }, + "Everybody's Innocent-wise": { + "roots": [ + "Perception" + ] + }, + "Excavation": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Perception", + "Power" + ] + }, + "Extortion": { + "roots": [ + "Will" + ] + }, + "Faith-wise": { + "roots": [ + "Perception" + ] + }, + "Falconry": { + "roots": [ + "Will", + "Perception" + ] + }, + "Falsehood": { + "roots": [ + "Will" + ] + }, + "Family-wise": { + "roots": [ + "Perception" + ] + }, + "Family Secret-wise": { + "roots": [ + "Perception" + ] + }, + "Farming": { + "roots": [ + "Perception" + ] + }, + "Fealty-wise": { + "roots": [ + "Perception" + ] + }, + "Fence Building": { + "roots": [ + "Perception" + ] + }, + "Field Dressing": { + "roots": [ + "Perception" + ] + }, + "Fire And Steel-wise": { + "roots": [ + "Perception" + ] + }, + "Firearms": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Firebombs": { + "stock": "roden", + "roots": [ + "Perception", + "Agility" + ] + }, + "Firebuilding": { + "roots": [ + "Perception" + ] + }, + "Fishing": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Fletcher": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Flock-wise": { + "roots": [ + "Perception" + ] + }, + "Folklore": { + "roots": [ + "Perception" + ] + }, + "Foraging": { + "roots": [ + "Perception" + ] + }, + "Foreign Languages": { + "roots": [ + "Perception" + ] + }, + "Forest-wise": { + "roots": [ + "Perception" + ] + }, + "Forge Artifice": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Forgery": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Formation Fighting": { + "training": 1, + "roots": [ + "Will" + ] + }, + "Fortifications": { + "roots": [ + "Perception" + ] + }, + "Gambling": { + "roots": [ + "Will", + "Perception" + ] + }, + "Games Of Chance": { + "roots": [ + "Perception" + ] + }, + "Garrote": { + "roots": [ + "Agility" + ] + }, + "Gas Pocket-wise": { + "roots": [ + "Perception" + ] + }, + "Gem Artifice": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Gemcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Genius-wise": { + "roots": [ + "Perception" + ] + }, + "Gossip-wise": { + "roots": [ + "Perception" + ] + }, + "Grain Appraisal": { + "stock": "dwarven", + "roots": [ + "Perception" + ] + }, + "Grain Song": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Grain-wise": { + "roots": [ + "Perception" + ] + }, + "Grandfather's Song": { + "stock": "wolfish", + "roots": [ + "Ancestral Taint" + ] + }, + "Graybeard-wise": { + "roots": [ + "Perception" + ] + }, + "Great And Black-wise": { + "roots": [ + "Perception" + ] + }, + "Great Masters-wise": { + "roots": [ + "Perception" + ] + }, + "Great Wolf Husbandry": { + "roots": [ + "Will" + ] + }, + "Grift-wise": { + "roots": [ + "Perception" + ] + }, + "Guilder-wise": { + "roots": [ + "Perception" + ] + }, + "Haggling": { + "roots": [ + "Will" + ] + }, + "Hallmaster": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Hammer": { + "roots": [ + "Agility" + ] + }, + "Handwriting-wise": { + "roots": [ + "Perception" + ] + }, + "Hatchet-wise": { + "roots": [ + "Perception" + ] + }, + "Hauling": { + "roots": [ + "Will", + "Power" + ] + }, + "Heraldry": { + "roots": [ + "Perception" + ] + }, + "Herbalism": { + "roots": [ + "Perception" + ] + }, + "Hills-wise": { + "roots": [ + "Perception" + ] + }, + "History": { + "roots": [ + "Perception" + ] + }, + "Hold-wise": { + "roots": [ + "Perception" + ] + }, + "Hoof-wise": { + "roots": [ + "Perception" + ] + }, + "Host-wise": { + "roots": [ + "Perception" + ] + }, + "Howling": { + "stock": "wolfish", + "roots": [ + "Will" + ] + }, + "Hunting": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Hymn Of Scales And Fins": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Illuminations": { + "roots": [ + "Agility" + ] + }, + "Imperfections-wise": { + "roots": [ + "Perception" + ] + }, + "Inconspicuous": { + "roots": [ + "Will" + ] + }, + "Infection-wise": { + "roots": [ + "Perception" + ] + }, + "Insect Husbandry": { + "roots": [ + "Will" + ] + }, + "Instruction": { + "roots": [ + "Will" + ] + }, + "Interrogation": { + "roots": [ + "Will" + ] + }, + "Intimidation": { + "roots": [ + "Will" + ] + }, + "Intrigue-wise": { + "roots": [ + "Perception" + ] + }, + "Jargon": { + "roots": [ + "Perception" + ] + }, + "Javelin": { + "roots": [ + "Agility" + ] + }, + "Jewelcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Jeweler": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Khirurgy": { + "stock": "dwarven", + "roots": [ + "Perception", + "Agility" + ] + }, + "Kingdom-wise": { + "roots": [ + "Perception" + ] + }, + "Knives": { + "roots": [ + "Agility" + ] + }, + "Knots": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Lance": { + "roots": [ + "Agility", + "Power" + ] + }, + "Lapidary": { + "roots": [ + "Perception" + ] + }, + "Leathercraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Ledger-wise": { + "roots": [ + "Perception" + ] + }, + "Leverage-wise": { + "roots": [ + "Perception" + ] + }, + "Links": { + "stock": "dwarven", + "roots": [ + "Will", + "Forte" + ] + }, + "Lithography": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Lock Pick": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Locksmith": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Logistics": { + "roots": [ + "Perception" + ] + }, + "Lost Treasures-wise": { + "roots": [ + "Perception" + ] + }, + "Lyric Of Law": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Mace": { + "roots": [ + "Power", + "Agility" + ] + }, + "Maker's Mark-wise": { + "roots": [ + "Perception" + ] + }, + "Man-wise": { + "roots": [ + "Perception" + ] + }, + "Mason": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Martial Arts": { + "roots": [ + "Power", + "Agility" + ] + }, + "Meditation": { + "roots": [ + "Will" + ] + }, + "Mending": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Mercenary Company-wise": { + "roots": [ + "Perception" + ] + }, + "Metal-wise": { + "roots": [ + "Perception" + ] + }, + "Midwifery": { + "roots": [ + "Will", + "Perception" + ] + }, + "Mill-wise": { + "roots": [ + "Perception" + ] + }, + "Miller": { + "roots": [ + "Perception" + ] + }, + "Mimicry": { + "roots": [ + "Perception" + ] + }, + "Mining": { + "roots": [ + "Perception" + ] + }, + "Monk-wise": { + "roots": [ + "Perception" + ] + }, + "Mounted Combat Training": { + "roots": [ + "Will", + "Power" + ] + }, + "Mounted Combat: Bowman Training": { + "roots": [ + "Will", + "Power" + ] + }, + "Mouth Of Hell-wise": { + "roots": [ + "Perception" + ] + }, + "Mule-wise": { + "roots": [ + "Perception" + ] + }, + "Munitions": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Music Composition": { + "roots": [ + "Will", + "Perception" + ] + }, + "Musical Instrument": { + "roots": [ + "Will", + "Agility" + ] + }, + "Mystery Meat-wise": { + "roots": [ + "Perception" + ] + }, + "Name Ritual": { + "stock": "orcish", + "roots": [ + "Will", + "Perception" + ] + }, + "Nature Of All Things": { + "stock": "wolfish", + "roots": [ + "Will", + "Perception" + ] + }, + "Navigation": { + "roots": [ + "Perception" + ] + }, + "Nogger": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Nursing": { + "stock": "wolfish", + "roots": [ + "Will", + "Perception" + ] + }, + "Oath-wise": { + "roots": [ + "Perception" + ] + }, + "Obligation-wise": { + "roots": [ + "Perception" + ] + }, + "Obscure Text-wise": { + "roots": [ + "Perception" + ] + }, + "Observation": { + "roots": [ + "Perception" + ] + }, + "Oratory": { + "roots": [ + "Will" + ] + }, + "Orc-wise": { + "roots": [ + "Perception" + ] + }, + "Ore-wise": { + "roots": [ + "Perception" + ] + }, + "Orienteering": { + "roots": [ + "Perception" + ] + }, + "Pack Etiquette": { + "stock": "wolfish", + "roots": [ + "Perception" + ] + }, + "Paean Of Deeds": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Painting": { + "roots": [ + "Will", + "Agility" + ] + }, + "Pattern-wise": { + "roots": [ + "Perception" + ] + }, + "Personal Effects-wise": { + "roots": [ + "Perception" + ] + }, + "Persuasion": { + "roots": [ + "Will" + ] + }, + "Philosophy": { + "roots": [ + "Will", + "Perception" + ] + }, + "Pilgrimage-wise": { + "roots": [ + "Perception" + ] + }, + "Pilot": { + "roots": [ + "Perception", + "Power" + ] + }, + "Playwright": { + "roots": [ + "Will", + "Perception" + ] + }, + "Plumbing": { + "roots": [ + "Perception" + ] + }, + "Poetry": { + "roots": [ + "Will" + ] + }, + "Poison-wise": { + "roots": [ + "Perception" + ] + }, + "Poisonous Platitudes": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Poisons": { + "roots": [ + "Perception" + ] + }, + "Polearm": { + "roots": [ + "Power", + "Agility" + ] + }, + "Potter": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Primal Bark": { + "stock": "wolfish", + "roots": [ + "Will" + ] + }, + "Prospecting": { + "roots": [ + "Perception" + ] + }, + "Purple Song": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Ratiquette": { + "roots": [ + "Will" + ] + }, + "Read": { + "roots": [ + "Perception" + ] + }, + "Rearing": { + "stock": "wolfish", + "roots": [ + "Will", + "Perception" + ] + }, + "Reason Of Old Stone": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Religious Diatribe": { + "roots": [ + "Will" + ] + }, + "Reputation-wise": { + "roots": [ + "Perception" + ] + }, + "Research": { + "roots": [ + "Perception" + ] + }, + "Rhetoric": { + "roots": [ + "Perception" + ] + }, + "Rhyme Of The Gatherer": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Rhyme Of The Mariner": { + "stock": "elven", + "magic": 1, + "roots": [ + "Agility", + "Speed" + ] + }, + "Rhyme Of The Pathfinder": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Rhythm Of The City-wise": { + "roots": [ + "Perception" + ] + }, + "Riddle Of Steel": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Rediculous Request-wise": { + "roots": [ + "Perception" + ] + }, + "Riding": { + "roots": [ + "Will" + ] + }, + "Rigging": { + "roots": [ + "Agility", + "Speed" + ] + }, + "Ritual": { + "roots": [ + "Will", + "Perception" + ] + }, + "Rituals Of Blood": { + "stock": "orcish", + "roots": [ + "Will" + ] + }, + "Rituals Of Night": { + "stock": "orcish", + "roots": [ + "Perception" + ] + }, + "Rituals-wise": { + "roots": [ + "Perception" + ] + }, + "Road-wise": { + "roots": [ + "Perception" + ] + }, + "Rope Chant": { + "stock": "elven", + "magic": 1, + "roots": [ + "Agility" + ] + }, + "Round Of Harvest": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Royal Secret-wise": { + "roots": [ + "Perception" + ] + }, + "Rude Carpentry": { + "stock": "orcish", + "roots": [ + "Perception", + "Agility" + ] + }, + "Rule Of Law": { + "roots": [ + "Perception" + ] + }, + "Rumour-wise": { + "roots": [ + "Perception" + ] + }, + "Rune Casting": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Saddlery": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Saint-wise": { + "roots": [ + "Perception" + ] + }, + "Savage Attack": { + "stock": "wolfish", + "roots": [ + "Agility", + "Speed" + ] + }, + "Scavenging": { + "roots": [ + "Perception" + ] + }, + "Sculpture": { + "roots": [ + "Will", + "Agility" + ] + }, + "Scutwork-wise": { + "roots": [ + "Perception" + ] + }, + "Seamanship": { + "roots": [ + "Perception" + ] + }, + "Seduction": { + "roots": [ + "Will" + ] + }, + "Servant-wise": { + "roots": [ + "Perception" + ] + }, + "Sewing": { + "roots": [ + "Agility" + ] + }, + "Shield Training": { + "roots": [ + "Agility" + ] + }, + "Ship Management": { + "roots": [ + "Perception" + ] + }, + "Ship-wise": { + "roots": [ + "Perception" + ] + }, + "Shipwright": { + "roots": [ + "Perception" + ] + }, + "Shortcut-wise": { + "roots": [ + "Perception" + ] + }, + "Shrewd Appraisal": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Siege Engineer": { + "roots": [ + "Perception" + ] + }, + "Signaling": { + "roots": [ + "Perception" + ] + }, + "Silent Fury": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Silver Trumpet": { + "stock": "elven", + "roots": [ + "Will" + ] + }, + "Sing": { + "roots": [ + "Will" + ] + }, + "Skirmish Tactics": { + "roots": [ + "Will", + "Perception" + ] + }, + "Slave Deck-wise": { + "roots": [ + "Perception" + ] + }, + "Sleight Of Hand": { + "roots": [ + "Agility" + ] + }, + "Slip Of Currents": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Smithcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Soldiering": { + "roots": [ + "Will", + "Perception" + ] + }, + "Song Of The Eldar": { + "stock": "elven", + "roots": [ + "Perception" + ] + }, + "Song Of Feasting": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Song Of Flocks And Herds": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Form": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Lordship": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Paths And Ways": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception" + ] + }, + "Song Of Soothing": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Soothing Platitudes": { + "roots": [ + "Will" + ] + }, + "Sorcery": { + "roots": [ + "Perception" + ] + }, + "Sorcery-wise": { + "roots": [ + "Perception" + ] + }, + "Spear": { + "roots": [ + "Agility" + ] + }, + "Spearcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Spider Husbandry": { + "stock": "orcish", + "roots": [ + "Will" + ] + }, + "Spirit Binding": { + "roots": [ + "Will" + ] + }, + "Spiel-wise": { + "roots": [ + "Perception" + ] + }, + "Staff": { + "roots": [ + "Agility" + ] + }, + "Starcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Stealthy": { + "roots": [ + "Speed" + ] + }, + "Stentorious Debate": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Stentorious Singing": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Stone Artifice": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Power" + ] + }, + "Stonecraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Strategy": { + "roots": [ + "Will", + "Perception" + ] + }, + "Strategy Games": { + "roots": [ + "Will", + "Perception" + ] + }, + "Streetwise": { + "roots": [ + "Perception" + ] + }, + "Structural Weakness-wise": { + "roots": [ + "Perception" + ] + }, + "Stuff-wise": { + "stock": "dwarven", + "roots": [ + "Perception" + ] + }, + "Suasion": { + "roots": [ + "Will" + ] + }, + "Suicidal Bravery-wise": { + "roots": [ + "Perception" + ] + }, + "Summoning": { + "roots": [ + "Perception" + ] + }, + "Supplier-wise": { + "roots": [ + "Perception" + ] + }, + "Supply-wise": { + "roots": [ + "Perception" + ] + }, + "Surgery": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Survival": { + "roots": [ + "Will", + "Perception" + ] + }, + "Sword": { + "roots": [ + "Agility" + ] + }, + "Symbology": { + "roots": [ + "Perception" + ] + }, + "Tactics": { + "roots": [ + "Will", + "Perception" + ] + }, + "Tall Grass-wise": { + "roots": [ + "Perception" + ] + }, + "Tanner": { + "roots": [ + "Agility", + "Forte" + ] + }, + "Taskmaster-wise": { + "roots": [ + "Perception" + ] + }, + "Tavern Tales-wise": { + "roots": [ + "Perception" + ] + }, + "Taxidermy": { + "roots": [ + "Perception" + ] + }, + "Terroir-wise": { + "roots": [ + "Perception" + ] + }, + "Theatrics": { + "roots": [ + "Will", + "Perception" + ] + }, + "The Way Of The First Hunter": { + "stock": "wolfish", + "roots": [ + "Will", + "Perception" + ] + }, + "Threading Chant": { + "stock": "elven", + "magic": 1, + "roots": [ + "Perception", + "Agility" + ] + }, + "Throwing": { + "roots": [ + "Agility" + ] + }, + "Tongue Of The Ancient One": { + "stock": "wolfish", + "roots": [ + "Perception" + ] + }, + "Torture": { + "roots": [ + "Will", + "Perception" + ] + }, + "Orcish Torture": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Tracking": { + "roots": [ + "Perception" + ] + }, + "Tragic End-wise": { + "roots": [ + "Perception" + ] + }, + "Trails-wise": { + "roots": [ + "Perception" + ] + }, + "Trapper": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Treasure-wise": { + "roots": [ + "Perception" + ] + }, + "Tree Cutting": { + "roots": [ + "Perception", + "Power" + ] + }, + "Tree Pulling": { + "stock": "orcish", + "roots": [ + "Hatred" + ] + }, + "Troll Etiquette": { + "roots": [ + "Will", + "Perception" + ] + }, + "Troll-wise": { + "roots": [ + "Perception" + ] + }, + "Tune-wise": { + "roots": [ + "Perception" + ] + }, + "Tunneling": { + "stock": "roden", + "roots": [ + "Power" + ] + }, + "Preaching": { + "stock": "roden", + "roots": [ + "Will" + ] + }, + "Tunnel-wise": { + "roots": [ + "Perception" + ] + }, + "Two-fisted Fighting Training": { + "roots": [ + "Perception" + ] + }, + "Ugly Truth": { + "roots": [ + "Perception" + ] + }, + "Vein-wise": { + "roots": [ + "Perception" + ] + }, + "Vile Poisoner": { + "stock": "orcish", + "roots": [ + "Perception", + "Agility" + ] + }, + "Village Secret-wise": { + "roots": [ + "Perception" + ] + }, + "Vine-wise": { + "roots": [ + "Perception" + ] + }, + "Vintage-wise": { + "roots": [ + "Perception" + ] + }, + "Vintner": { + "roots": [ + "Will", + "Perception" + ] + }, + "Visage-wise": { + "roots": [ + "Perception" + ] + }, + "Voice Of Thunder": { + "stock": "elven", + "roots": [ + "Will", + "Power" + ] + }, + "Wagon-wise": { + "roots": [ + "Perception" + ] + }, + "Waiting Tables": { + "roots": [ + "Will" + ] + }, + "War Art": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "War Engineer": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Perception" + ] + }, + "Weaponsmith": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Weaving": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Weaving Way": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Web-wise": { + "roots": [ + "Perception" + ] + }, + "Well-wise": { + "roots": [ + "Perception" + ] + }, + "Whip-wise": { + "roots": [ + "Perception" + ] + }, + "Whispered Secrets-wise": { + "roots": [ + "Perception" + ] + }, + "White Metal Artifice": { + "stock": "dwarven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Whitesmith": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Windage-wise": { + "roots": [ + "Perception" + ] + }, + "Wine Tasting": { + "roots": [ + "Perception" + ] + }, + "Wolf-wise": { + "roots": [ + "Perception" + ] + }, + "Wolfish Hunting": { + "stock": "wolfish", + "roots": [ + "Perception" + ] + }, + "Wood-wise": { + "roots": [ + "Perception" + ] + }, + "Woodcraft": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will", + "Agility" + ] + }, + "Write": { + "roots": [ + "Perception", + "Agility" + ] + }, + "Air Of Gates": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Alarm": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Anthem Of Courage": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Ballad Of Rage": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Canticle Of Years": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Chant Of Offering": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Council Caller": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Discerner": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Doom Of Strength": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Doom Sayer": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Evensong": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Gift Of Speed": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Hymn Of Victory": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Homesong": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lament For The Fallen": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lament Of Mourning": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lament Of Stars": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lament Of The Westering Sun": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lay Of The Horse": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Litany Of Responsibilities": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Lyric Of Healing": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Monody Of The March": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Mornsong": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Recitation Of Ages": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Rhyme Of Rules": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Rhyme Of Tongues": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Arbors": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Bonding": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Burning Bright": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Merriment": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Silence": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of Songs": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Song Of The Sword": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Strain Of Far Sight": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Supplication To The Wind": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Threne Of The Chameleon": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Tract Of Enmity": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Verse Of Decision": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Verse Of Friendship": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Voice Of Ages": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + }, + "Weathersong": { + "stock": "elven", + "magic": 1, + "roots": [ + "Will" + ] + } +} \ No newline at end of file diff --git a/src/data/starting_stat_pts/dwarf.json b/src/data/starting_stat_pts/dwarf.json new file mode 100755 index 0000000..a43513e --- /dev/null +++ b/src/data/starting_stat_pts/dwarf.json @@ -0,0 +1,114 @@ +[ + { + "range": [ + 1, + 20 + ], + "m": 6, + "p": 13 + }, + { + "range": [ + 21, + 30 + ], + "m": 7, + "p": 13 + }, + { + "range": [ + 31, + 50 + ], + "m": 7, + "p": 14 + }, + { + "range": [ + 51, + 76 + ], + "m": 8, + "p": 15 + }, + { + "range": [ + 77, + 111 + ], + "m": 8, + "p": 16 + }, + { + "range": [ + 112, + 151 + ], + "m": 9, + "p": 16 + }, + { + "range": [ + 152, + 199 + ], + "m": 9, + "p": 17 + }, + { + "range": [ + 200, + 245 + ], + "m": 10, + "p": 18 + }, + { + "range": [ + 246, + 300 + ], + "m": 11, + "p": 17 + }, + { + "range": [ + 301, + 345 + ], + "m": 11, + "p": 16 + }, + { + "range": [ + 346, + 396 + ], + "m": 12, + "p": 15 + }, + { + "range": [ + 397, + 445 + ], + "m": 11, + "p": 14 + }, + { + "range": [ + 446, + 525 + ], + "m": 11, + "p": 13 + }, + { + "range": [ + 526, + 600 + ], + "m": 10, + "p": 12 + } +] \ No newline at end of file diff --git a/src/data/starting_stat_pts/elf.json b/src/data/starting_stat_pts/elf.json new file mode 100755 index 0000000..ce2e4a8 --- /dev/null +++ b/src/data/starting_stat_pts/elf.json @@ -0,0 +1,146 @@ +[ + { + "range": [ + 1, + 25 + ], + "m": 7, + "p": 13 + }, + { + "range": [ + 26, + 60 + ], + "m": 8, + "p": 13 + }, + { + "range": [ + 61, + 100 + ], + "m": 9, + "p": 14 + }, + { + "range": [ + 101, + 125 + ], + "m": 9, + "p": 15 + }, + { + "range": [ + 126, + 160 + ], + "m": 10, + "p": 16 + }, + { + "range": [ + 161, + 225 + ], + "m": 10, + "p": 17 + }, + { + "range": [ + 226, + 325 + ], + "m": 11, + "p": 17 + }, + { + "range": [ + 326, + 425 + ], + "m": 12, + "p": 17 + }, + { + "range": [ + 426, + 525 + ], + "m": 13, + "p": 18 + }, + { + "range": [ + 526, + 625 + ], + "m": 13, + "p": 19 + }, + { + "range": [ + 626, + 725 + ], + "m": 14, + "p": 19 + }, + { + "range": [ + 726, + 825 + ], + "m": 14, + "p": 20 + }, + { + "range": [ + 826, + 925 + ], + "m": 15, + "p": 20 + }, + { + "range": [ + 926, + 1025 + ], + "m": 15, + "p": 21 + }, + { + "range": [ + 1026, + 1125 + ], + "m": 15, + "p": 22 + }, + { + "range": [ + 1126, + 1225 + ], + "m": 15, + "p": 23 + }, + { + "range": [ + 1226, + 1325 + ], + "m": 15, + "p": 24 + }, + { + "range": [ + 1326, + 9999 + ], + "m": 16, + "p": 24 + } +] \ No newline at end of file diff --git a/src/data/starting_stat_pts/man.json b/src/data/starting_stat_pts/man.json new file mode 100755 index 0000000..75d7ec6 --- /dev/null +++ b/src/data/starting_stat_pts/man.json @@ -0,0 +1,90 @@ +[ + { + "range": [ + 1, + 10 + ], + "m": 5, + "p": 10 + }, + { + "range": [ + 11, + 14 + ], + "m": 6, + "p": 13 + }, + { + "range": [ + 15, + 16 + ], + "m": 6, + "p": 16 + }, + { + "range": [ + 17, + 25 + ], + "m": 7, + "p": 16 + }, + { + "range": [ + 26, + 29 + ], + "m": 7, + "p": 15 + }, + { + "range": [ + 30, + 35 + ], + "m": 7, + "p": 14 + }, + { + "range": [ + 36, + 40 + ], + "m": 7, + "p": 13 + }, + { + "range": [ + 41, + 55 + ], + "m": 7, + "p": 12 + }, + { + "range": [ + 56, + 65 + ], + "m": 7, + "p": 11 + }, + { + "range": [ + 66, + 79 + ], + "m": 7, + "p": 10 + }, + { + "range": [ + 80, + 100 + ], + "m": 6, + "p": 9 + } +] \ No newline at end of file diff --git a/src/data/starting_stat_pts/orc.json b/src/data/starting_stat_pts/orc.json new file mode 100755 index 0000000..fb717dd --- /dev/null +++ b/src/data/starting_stat_pts/orc.json @@ -0,0 +1,98 @@ +[ + { + "range": [ + 1, + 10 + ], + "m": 3, + "p": 10 + }, + { + "range": [ + 11, + 16 + ], + "m": 4, + "p": 11 + }, + { + "range": [ + 17, + 22 + ], + "m": 5, + "p": 12 + }, + { + "range": [ + 23, + 30 + ], + "m": 5, + "p": 13 + }, + { + "range": [ + 31, + 40 + ], + "m": 6, + "p": 14 + }, + { + "range": [ + 41, + 50 + ], + "m": 6, + "p": 15 + }, + { + "range": [ + 51, + 60 + ], + "m": 7, + "p": 16 + }, + { + "range": [ + 61, + 80 + ], + "m": 7, + "p": 17 + }, + { + "range": [ + 81, + 99 + ], + "m": 8, + "p": 17 + }, + { + "range": [ + 100, + 125 + ], + "m": 8, + "p": 18 + }, + { + "range": [ + 126, + 150 + ], + "m": 9, + "p": 18 + }, + { + "range": [ + 151, + 9999 + ], + "m": 9, + "p": 19 + } +] \ No newline at end of file diff --git a/src/data/starting_stat_pts/roden.json b/src/data/starting_stat_pts/roden.json new file mode 100755 index 0000000..0f740b2 --- /dev/null +++ b/src/data/starting_stat_pts/roden.json @@ -0,0 +1,74 @@ +[ + { + "range": [ + 1, + 5 + ], + "m": 6, + "p": 10 + }, + { + "range": [ + 6, + 9 + ], + "m": 7, + "p": 13 + }, + { + "range": [ + 10, + 15 + ], + "m": 7, + "p": 14 + }, + { + "range": [ + 16, + 24 + ], + "m": 8, + "p": 15 + }, + { + "range": [ + 25, + 30 + ], + "m": 8, + "p": 14 + }, + { + "range": [ + 31, + 36 + ], + "m": 7, + "p": 13 + }, + { + "range": [ + 37, + 40 + ], + "m": 7, + "p": 12 + }, + { + "range": [ + 41, + 45 + ], + "m": 7, + "p": 11 + }, + { + "range": [ + 46, + 49 + ], + "m": 6, + "p": 10 + } +] \ No newline at end of file diff --git a/src/data/starting_stat_pts/wolf.json b/src/data/starting_stat_pts/wolf.json new file mode 100755 index 0000000..3fd3ce7 --- /dev/null +++ b/src/data/starting_stat_pts/wolf.json @@ -0,0 +1,58 @@ +[ + { + "range": [ + 1, + 1.5 + ], + "m": 6, + "p": 12 + }, + { + "range": [ + 2, + 3.5 + ], + "m": 7, + "p": 16 + }, + { + "range": [ + 4, + 5.5 + ], + "m": 7, + "p": 17 + }, + { + "range": [ + 6, + 7.5 + ], + "m": 7, + "p": 16 + }, + { + "range": [ + 8, + 9.5 + ], + "m": 6, + "p": 14 + }, + { + "range": [ + 10, + 11.5 + ], + "m": 6, + "p": 12 + }, + { + "range": [ + 12, + 15.5 + ], + "m": 5, + "p": 10 + } +] \ No newline at end of file diff --git a/src/data/traits.json b/src/data/traits.json new file mode 100755 index 0000000..fcc8277 --- /dev/null +++ b/src/data/traits.json @@ -0,0 +1,4733 @@ +{ + "Abashed": { + "cost": 1, + "type": "character" + }, + "Abnormally Long Tongue": { + "cost": 1, + "type": "character" + }, + "Abused": { + "cost": 1, + "type": "character" + }, + "Accustomed To The Dark": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "common" + ], + "desc": "Contrary to popular belief, Dwarves cannot see in the darkness. However, because they have lived many ages in halls lit by firelight and reflected sunlight, Dwarves do not suffer any penalty for twilight, starlight, candlelight, lamplight or torchlight. They do suffer from complete darkness as Men and Elves do." + }, + "Aches And Pains": { + "cost": 1, + "type": "character" + }, + "Acute": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Elven Bladesmiths tend to be very sharp -- their attention to detail and ability to reason is renowned even among the Elves. It is said that this ability to see a matter to its conclusion comes from centuries of staring at the tip of the blade. Bladesmiths may round up when factoring the root for any skill that includes Perception in its root stat.", + "bonus": [ + { + "target": [ + "+skills_having", + "+any_root", + "perception" + ], + "value": [ + "+round_up" + ] + } + ] + }, + "Addicted": { + "cost": 1, + "type": "character" + }, + "Adorable": { + "cost": 1, + "type": "character" + }, + "Adventurer": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Dwarven society is very structured and rigid. Those that break its conventions are forever branded as outsiders -- even if they're later let back into the fold. Characters who were once Adventurers bear the stain of their deeds for the rest of their lives. No matter how hard they try to hide it, other Dwarves can just smell it on them. Adventurers gain +1 Ob to all Circles tests when dealing with Artificers or Noble Born Dwarves. However, Adventurers may choose a minor affiliation (1D) outside the Dwarf hold for free." + }, + "Affinity For...": { + "cost": 4, + "type": "die", + "desc": "An Affinity trait represents something that the character loves so much, he excels at it. Players may choose one skill for which their character has an Affinity. The trait gives the character +1D to the skill." + }, + "Affinity For Plants": { + "cost": 4, + "type": "die", + "desc": "An Affinity trait represents something that the character loves so much, he excels at it. Players may choose one skill for which their character has an Affinity. The trait gives the character +1D to the skill." + }, + "Affinity For Rope": { + "cost": 4, + "type": "die", + "desc": "An Affinity trait represents something that the character loves so much, he excels at it. Players may choose one skill for which their character has an Affinity. The trait gives the character +1D to the skill." + }, + "Affinity For Books And Scrolls": { + "cost": 4, + "type": "die", + "desc": "An Affinity trait represents something that the character loves so much, he excels at it. Players may choose one skill for which their character has an Affinity. The trait gives the character +1D to the skill." + }, + "Affinity For Business": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has a hard nose for the cutthroat world of business. Affinity for Business gives +1D to any Resource test." + }, + "Affinity For Horses": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Affinity for Horses, like all Affinities, gives +1D when dealing with the subject of the trait. In this case, Animal Husbandry and Riding tests are +1D.", + "bonus": [ + { + "target": [ + "+skills", + "animal husbandry", + "riding" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Affinity For Sheep And Goats": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This trait adds +1D to any skill or stat when dealing with sheep or goats" + }, + "Affinity For Spiders": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "The Masters of Eight develops a special kinship with his spider slaves. He learns their ways and habits. This trait adds +1D to any spider-related stat or skill tests." + }, + "Aggressive": { + "cost": 1, + "type": "character" + }, + "Agoraphobic": { + "cost": 1, + "type": "character" + }, + "Agreeable": { + "cost": 1, + "type": "character" + }, + "Alarming": { + "cost": 1, + "type": "character" + }, + "Alcoholic": { + "cost": 1, + "type": "character" + }, + "Alert": { + "cost": 2, + "type": "die", + "desc": "Little, electric voices echo around the character's skull. Character may Glance Assess and Aim (+1D) when Stand and Drool hesitating. Therefore, if your character hesitates for two actions in Fight, he may shit himself and get two aiming dice. In Range and Cover, Alert grats 1D to the next shot after the character finishes hesitating." + }, + "Alms-taker": { + "cost": 1, + "type": "character" + }, + "Aloof": { + "cost": 1, + "type": "character" + }, + "Aman": { + "cost": 0, + "type": "character", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "This trait indicates the Elf is of a rare lineage -- those first to walk even among the First Born. Down through the ages, the Aman have most often tread the path of the Etharch -- they are the lords and kings of all Elves. This character need not be an Etharch himself, but he is eligible for that rank. In addition, the Elf-folk of the Wilderlands and Citadel treat him with a mixture of fear and adoration." + }, + "Ambidextrous": { + "cost": 1, + "type": "character" + }, + "Ambitious": { + "cost": 1, + "type": "character" + }, + "Amenable": { + "cost": 1, + "type": "character" + }, + "Amenable To Other Options": { + "cost": 1, + "type": "character" + }, + "Anemic": { + "cost": 1, + "type": "character" + }, + "Apostate": { + "cost": 3, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "The apostate has forsaken one religion for another. Anyone can be an apostate -- many Christians captured by the Muslims during the Crusades resorted to apostasy in order to save their lives. The Apostate character must have at least one religiously focused Belief. He also gains a 1D infamous reputation among his former co-religionists." + }, + "Appreciation For Beauty": { + "cost": 1, + "type": "character" + }, + "Apprehensive": { + "cost": 1, + "type": "character" + }, + "Arcane": { + "cost": 1, + "type": "character" + }, + "Arrogant": { + "cost": 1, + "type": "character" + }, + "Artful Dodger": { + "cost": 5, + "type": "die", + "desc": "This trait allows the character to see it coming -- he knows Destiny has it in for him and knows what she looks like. In the Fight rules, he may forfeit one action for free per exchange: He does not have to lose one when he changes one. All the other normal rules and conditions for Forfeiting apply." + }, + "Atravieso": { + "cost": 1, + "type": "die", + "desc": "Someone who is an Atravieso is always getting his hands into everything, fiddling with every little thing he can. When in any new place, or a stressful situation, the character must pass an Ob 3 Will test to resist touching and fiddling. If he fails the test, the character goes for the most fragile/breakable/dangerous objects around -- beakers in the laboratory, eggs in the hen house, detonators in the bomb shop, the queen's dress at court, etc -- and well, fiddles with them." + }, + "Aura Of Innocence": { + "cost": 2, + "type": "call_on", + "desc": "This character projects the appearance of being completely free of taint and guilt in any crime. No one would ever suspect him. This is a call-on for Falsehood or Inconspicuous when dodging guilt." + }, + "Aura Of Determination": { + "cost": 5, + "type": "call_on", + "desc": "This trait allows the character and everyone within his presence to reroll one test in a great effort." + }, + "Aura Of Fear": { + "cost": 5, + "type": "die", + "desc": "This character emanates fear. When entering his presence, all must pass a Steel test. Once the Steel test is made, the victim character does not have to test again until the next time he encounters this fearful creature." + }, + "Aura Of Holiness": { + "cost": 7, + "type": "die", + "desc": "This character is bathed in a divine light. Any character with the Lawbreaker, Dreaded, Spirit Nature or Aura of Malevolence trait must immediately take a Steel test when entering the holy character's presence. Add the holy character's Will exponent to the hesitation obstacle. In addition, the holy man's Suasion dice are always considered open-ended." + }, + "Aura Of Malevolence": { + "cost": 6, + "type": "die", + "desc": "This character is evil, and everyone knows it. Little children run away crying, dogs bark maniacally. This character, and all his cohorts within his Presence gain +2D to Intimidate or Interrogate. If the malevolent character has other characters helping him Intimidate, each character grants an additional helping dice over what they would normally give. Only one effect may be used at a time." + }, + "Aura Of Martyrdom": { + "cost": 3, + "type": "die", + "desc": "He will die for our sins. We all know it. We all want it (not that we would do anything to speed the process along...). In him we shall be redeemed. The player whose character possesses this trait earns persona artha for personal goals when talking steps in the game to martyr his character. The character must die for a lost cause -- preferably religious. Should this glorious death transpire, the character's remains instantly become holy relics. The first person to gather up those remains is granted all of the martyr's remaining artha. If he had no artha left at the time of his death, the relic grants a deeds point to its new owner. Lastly, after the artha/deeds point is spent from the remains, they become a suitable matrix for Enchanting. See the Enchanting rules in the Magic Burner." + }, + "Authoritative": { + "cost": 1, + "type": "character" + }, + "Avarice": { + "cost": 3, + "type": "die", + "restrict": [ + "dwarven", + "special" + ], + "desc": "A player may choose to make his Dwarven character especially Greedy. With this trait he can raise his character's starting Greed to whatever exponent he desires (so long as it is higher than what it would start at). The downside of this is that Greed tests always count as the type of test the character needs to advance, no matter the obstacle. If he needs a routine, the next test counts as routine. See the Greed mechanics for the ramifications of this." + }, + "Back-breaking Labor": { + "cost": 0, + "type": "call_on", + "restrict": [ + "orcish", + "mannish" + ], + "desc": "Call-on for Power or Forte when performing hard labor." + }, + "Bad Egg": { + "cost": 1, + "type": "character" + }, + "Baleful Stare": { + "cost": 0, + "type": "call_on", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "A call-on for Intimidation or Interrogation when attempting to inject gravity into a situation or to cow a subject: \"He just gives you that look.\"" + }, + "Barker": { + "cost": 1, + "type": "character" + }, + "Base Humility": { + "cost": 1, + "type": "character" + }, + "Bastard": { + "cost": 4, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "This character is the illegitimate son of a noble of rank. He will only be heir to the lands and income if all the other heirs die or join the clergy. Bastards are not looked upon kindly as they dilute claims to birthright and threaten the system of rightful inheritance. Bastards have a 1D infamous reputation among the nobility." + }, + "Batshit": { + "cost": 1, + "type": "character" + }, + "Bearded": { + "cost": 0, + "type": "character", + "restrict": [ + "dwarven", + "common" + ], + "desc": "A Dwarf's beard is a sign of rank and maturity. No male dwarf would dare go about with a bald face." + }, + "Bedside Manner": { + "cost": 1, + "type": "character" + }, + "Beespeaker": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The character understands the secret lives of bees. He can understand their signs and buzzing, but he can't really talk back to them. His Perception acts as Aura Reading on bees." + }, + "Believer": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Believers fervently accept the truth of miracles and the power of Faith. All Faith obstacles used against Believers are made at -1 Ob." + }, + "Bellicose": { + "cost": 1, + "type": "character" + }, + "Big Boned": { + "cost": 1, + "type": "character" + }, + "The Bigger They Come...": { + "cost": 0, + "type": "character", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "The Siege Master cannot resist big targets. Massive, sturdy donjons are an affront to his sensibilities. The Siege Master will always target the biggest hunk of bricks (or prettiest war machines) first and pound them into dust and ruin." + }, + "Bilge-drinker": { + "cost": 1, + "type": "character" + }, + "Birdie Talk": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character is just weird. He tweets and chirps at birds and they respond in kind -- landing on his shoulders and twittering away. This character is considered to have Low Speech for birds only." + }, + "A Bit Deaf": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The incessant clanging and banging has made this character a bit deaf. +1 Ob to all auditory-based perception tests." + }, + "Bitter": { + "cost": 1, + "type": "character" + }, + "Black Bile Poison": { + "cost": 3, + "type": "die", + "restrict": [ + "orcish" + ], + "desc": "Black Hunters know a little-known a little-known secret about Orc bile. It's toxic to other creatures. A Hunter with this training may simply vomit on his arrows or knives to poison them before a fight. The vomit stays fresh for about a half hour before it loses its potency. No roll is required. Any creature who takes a Mark result hit from such a coated barb must pass an Ob 4 Health test. Margin of failure is added to all Health and Steel test obstacles taken for the rest of the day. This poison does not affect Orcs." + }, + "Black Lung": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "This Orc is beset with a wretched hacking cough. This wheezing gives him -1 Ob to all Health Stealthy and Inconspicuous test." + }, + "Blank Stare": { + "cost": 3, + "type": "die", + "desc": "No matter the emotion, the character never shows any sign of \"getting it.\" The little light bulb never seems to come on. +1 Ob to all Persuasion and Soothing Platitudes test made against this character" + }, + "Blasphemer": { + "cost": 1, + "type": "character" + }, + "Blind": { + "cost": 1, + "type": "die", + "desc": "This character cannot see clearly. He cannot make purely visual-based Perception tests, and he is at +2 Ob to all sight-based Speed and Agility tests." + }, + "Blisters": { + "cost": 1, + "type": "character" + }, + "Bloviatic": { + "cost": 1, + "type": "character" + }, + "Boaster": { + "cost": 1, + "type": "character" + }, + "Bookworm": { + "cost": 2, + "type": "die", + "desc": "\"You've got to leave this library and go out and experience the world! Stop hiding in your books and live!\" warned the old instructor \"Yeah right,\" thought the student. \"All the knowledge I'll ever need is here...in these books!\" Characters with this trait reduce their aptitude for learning Academic skills by one." + }, + "Booming Voice": { + "cost": 2, + "type": "call_on", + "desc": "This character's voice cuts through walls and overpowers other speakers. This is a call-on for Conspicuous, Oratory or Command" + }, + "Bored": { + "cost": 1, + "type": "character" + }, + "Born To Be King": { + "cost": 5, + "type": "character", + "restrict": [ + "mannish", + "special" + ], + "desc": "This character is a son in the royal line. If he is the eldest, he is the direct heir to the throne. If he is a younger son, he bears no immediate obligation and is free to pursue his own aims. However, the character is a Prince and the obligations of said rank should play heavily on his life. He may, at some point, be called upon to take the throne!" + }, + "Born To Rule Them All": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Those Born Great and Black are marked by distinctive features -- tall stature, broad shoulders and deep-hued skin. This is the mantle of hereditary leadership among the Orcs. In order to be a Great One or a Servant, one must be Born to Rule Them All. This trait grants a 1D affiliation among Great and Black Orcs and a 1D infamous reputation among the chattel and the legion." + }, + "Born Under The Silver Stars": { + "cost": 0, + "type": "character", + "restrict": [ + "elven", + "common" + ], + "desc": "To those who look upon the Elves with clear eyes, there shimmers an unmistakable halo, like white light through a gossamer veil, like stars shining at night." + }, + "Bottomless Stomach": { + "cost": 2, + "type": "die", + "desc": "Eat and eat and eat. \"Nature's Cruel Joke.\" Characters with the Bottomless Stomach trait are at +1 Ob to all Resources tests involving food, drink and meals." + }, + "Branded A Coward": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Whether true or not, this character has been branded a coward. In Dwarven society, this stain comes not from breaking an oath, but from refusing to swear the oath in the first place. Branded a Coward grants the character a 1D infamous reputation with either Dwarven Nobles, Clansmen, Guilders, Artificers or the Host. Player's choice. And more important, this Dwarf may not swear an Oath until he has redeemed himself in the eyes of his longbeard." + }, + "Brash": { + "cost": 1, + "type": "character" + }, + "Brave": { + "cost": 1, + "type": "character" + }, + "Breeder": { + "cost": 0, + "type": "character", + "restrict": [ + "orcish", + "common" + ], + "desc": "Though they loathe life and yearn for death, Orcs are compelled by their accursed nature to procreate often and quickly." + }, + "Broken": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "-1 Ob to all Intimidation, Interrogation, Command and Seduction tests used against this character. His Will has been broken." + }, + "Broken In": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The Apprentice is stripped of his pride and ego. The player must remove any lifepath traits related to pride or status -- Noblesse Oblige for example." + }, + "Broken Man": { + "cost": 1, + "type": "character" + }, + "Brooding": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "The Great One is prone to profound mood swings. If ever beaten in a Duel of Wits or surpassed in a social skill test, the Great One must succumb to this trait. He must hesitate for his full hesitation (minimum of two actions). While Brooding, the player may invoke his Flights of Murderous Fancy trait. (Note that in order to access that trait, the Great One must have this trait.) If the Great One does not have the Flights of Murderous Fancy trait, he simply fumes for a few moments as he broods and then returns to his regular state of mind." + }, + "Bruiser": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The marine has spent his days at sea a-betitn' and a-brawlin'. Take your bets, gents! This trait is a call-on for Brawling" + }, + "Brusque": { + "cost": 1, + "type": "character" + }, + "Brutal": { + "cost": 1, + "type": "character" + }, + "Brutish Efficiency": { + "cost": 0, + "type": "call_on", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "This trait acts as a call-on for Siege Engineer" + }, + "Bulbous Nose": { + "cost": 1, + "type": "character" + }, + "Bull's-eye Spitter": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "\"I spit in yer eye!\" In calm weather and good light, this character simply does not miss his target, WHen spitting in the fight rules, it's a \"longer\" weapon, it costs one action to use, and it gives your opponent +1 Ob to his next test. Use this in Duel of Wits and give your opponent +1D to his next action. Use this against a sorcerer to distract him -- counts as a may not. Use this in Range and Cover and count your days numbered. This trait may only be used once per opponent--ever." + }, + "Burial Rites": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ] + }, + "Burial At Sea": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "+1D to Consecration and Purification Faith tests for performing burial rites at sea. Player also earns a persona point for each player character he buries at sea." + }, + "Buxom": { + "cost": 1, + "type": "character" + }, + "Cadaverous": { + "cost": 1, + "type": "character" + }, + "Calm Demeanor": { + "cost": 0, + "type": "call_on", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The Elven Attendant learns that an implacable visage is crucial to winning favor and advancement in the Elven court. To portray fear and agitation is to betray oneself. Call-on for Steel in the Duel of Wits" + }, + "Call Of The Sea": { + "cost": 1, + "type": "character" + }, + "Callous": { + "cost": 1, + "type": "character" + }, + "Calloused": { + "cost": 1, + "type": "character" + }, + "Callow": { + "cost": 1, + "type": "character" + }, + "Cannibal": { + "cost": 0, + "type": "character", + "restrict": [ + "orcish", + "common" + ], + "desc": "So vile are they, Orcs will not hesitate to slay and eat their companions." + }, + "Catamite": { + "cost": 1, + "type": "character", + "restrict": [ + "mannish", + "special" + ], + "desc": "Catamite has been chosen as the trait name to represent the openly homosexual characters in the Burning Wheel. Honestly it was a pejorative medieval term -- a slur. It is how society would refer to them, not necessarily how they refer to themselves. Any Character may be homosexual via the player's choice, but by taking the Catamite trait the player is acknowledging that his character is open about his orientation. The ramifications of such a decision in a conservative medieval society are grist for great game situations" + }, + "Charging Blindly": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Add +1D to Steel tests when at the van of an attack and charging across the field of battle." + }, + "Charismatic": { + "cost": 2, + "type": "call_on", + "desc": "There is something magnetic and enigmatic about this character that draws people to him. People generally enjoy his company. This is a call-on for Persuasion or Oratory. Pick one." + }, + "Charming": { + "cost": 2, + "type": "call_on", + "desc": "Suave and likable, this character possesses a certain je ne sais quoi that makes him affable (despite his cowardly, murderous personality). Call-on for Soothing Platitudes or Seduction. Pick One." + }, + "Child Prodigy": { + "cost": 2, + "type": "die", + "desc": "This trait is only available to one or two lifepath characters. The player may add +3D to the Perception or Will exponent of the character, or may shade shift one skill. Abuse this at your peril." + }, + "Chosen One": { + "cost": 5, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "If a player's characters possesses the Faithful trait, he may purchase this trait to make the Faith shade gray." + }, + "Chronologue": { + "cost": 1, + "type": "character", + "desc": "An innate sense of time plagues this character. He always knows what time it is." + }, + "Chuffing": { + "cost": 1, + "type": "character" + }, + "Chuntering": { + "cost": 1, + "type": "character" + }, + "Cipher": { + "cost": 5, + "type": "die", + "desc": "It is not that the character is completely nondescript, but there is something about him that makes people not notice him. This trait shade shifts Inconspicuous to gray, but adds +1 Ob to all Circles tests." + }, + "Circumspect": { + "cost": 1, + "type": "character" + }, + "Claustrophobic": { + "cost": 1, + "type": "die", + "desc": "Claustrophobia is a specific phobia applying to enclosed spaces. A character afflicted with this trait will not willingly enter small spaces like prison cells, closets, tunnels, trunks or even cramped rooms. If he should find himself in an enclosed space for a long period of time (more than a minute or two), he becomes agitated and eventually hysterical -- the character must pass a Steel test. If failed, he must either Swoon or Run and Scream." + }, + "Clumsy": { + "cost": 1, + "type": "die", + "desc": "The character tends to trip or drop things at the wrong moment. Use this trait to further color failed tests involving holding precious or fragile things. A Clumsy character will always drop what he is holding in a rather spectacular manner if he fails a test." + }, + "Cold Black Blood": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "common" + ], + "desc": "The cold substance of night runs through their veins, rendering these tomrented souls immortal. But it also makes them susceptible to the sun's burning rays. Orcs suffer +2 Ob to all tests while abroad in the sunlight. If it is cloudy, dawn or twilight, the penalty is only +1 Ob. But the night deadens their nerves as well: Cold Black Blood reduces hesitation obstacles by two for pain, but not fear or wonderment." + }, + "Cold-blooded": { + "cost": 2, + "type": "die", + "desc": "This murderous soul has had a bellyful of killing and he won't hesitate to do more. Reduce hesitation for death, violence and pain by one. Do not reduce hesitation for surprise or wonderment" + }, + "Cold Hearted": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Reduce hesitation for surprise and fear (including Intimidation) by one. Pain hesitation is not reduced." + }, + "Collector": { + "cost": 1, + "type": "character" + }, + "Color Blind": { + "cost": 1, + "type": "character" + }, + "Colorful": { + "cost": 1, + "type": "character" + }, + "Comely": { + "cost": 1, + "type": "character" + }, + "Comfortable Shoes": { + "cost": 1, + "type": "character" + }, + "Commanding Aura": { + "cost": 6, + "type": "die", + "desc": "This character possesses an imperious and imposing demeanor. His merest words seem like fiat and his statements like edicts. His lessers feel compelled to obey. Add +1D to the character's Command skill. He may also help all those in his presence with any Steel tests they are compelled to make.", + "bonus": [ + { + "target": [ + "+skills", + "command" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Complaining": { + "cost": 1, + "type": "character" + }, + "Compulsive Liar": { + "cost": 1, + "type": "character" + }, + "Condescending": { + "cost": 1, + "type": "character" + }, + "Connected": { + "cost": 4, + "type": "die", + "desc": "This character has connections that belie his station. You may add one of the following new settings to your Circles: City dweller, Villager, Professional Soldier or Outcast (or equivalent from non-Mannish settings)." + }, + "Confident": { + "cost": 1, + "type": "character" + }, + "Contortionist": { + "cost": 2, + "type": "call_on", + "desc": "A Contortionist can bend and twist the body into odd positioins. Call-on for Speed and Agility in thight situations." + }, + "Cookie": { + "cost": 1, + "type": "character" + }, + "Cool Headed": { + "cost": 2, + "type": "die", + "desc": "Cool heads keep calm in crazy situations. Reduce hesitation from surprise and fear (not pain) by one." + }, + "Corrupt": { + "cost": 1, + "type": "character" + }, + "Cowardly": { + "cost": 1, + "type": "die", + "desc": "This is not the most flattering trait. Cowardly characters will not willingly put themselves at bodily risk and tend to run from danger -- or at least be conveniently absent: +1 hesitation", + "bonus": [ + { + "target": [ + "+attr", + "hesitation" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Cramped Hands": { + "cost": 1, + "type": "character" + }, + "Crippled": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character is missing a limb or is horribly disfigured. Choose one stat. It cannot start higher than exponent 3 and it is capped at exponent 4. If this restriction creates an excess of stat points during character burning, the extra points are discarded." + }, + "Crotchety": { + "cost": 1, + "type": "character" + }, + "Cruel": { + "cost": 1, + "type": "character" + }, + "Cry Of Doom": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "He Who Sits Astride the Howling Black Beast learns to howl like a Great Wolf. He may deliver a potent and terrifying war cray from the back of his charging mount. The Cry adds +2D to Intimidation when mounted and bearing down on your prey. Intimidation requires two actions. Also using the Cry the Orc may call his wolf to him over great distances -- communicating with him as if he himself were a wolf." + }, + "Cry Wolf": { + "cost": 1, + "type": "character" + }, + "Cryptic": { + "cost": 1, + "type": "character" + }, + "Curious": { + "cost": 1, + "type": "character" + }, + "Curses Like A Sailor": { + "cost": 1, + "type": "character" + }, + "Cursing": { + "cost": 1, + "type": "character" + }, + "Cynical": { + "cost": 1, + "type": "character" + }, + "Dangerous": { + "cost": 1, + "type": "character" + }, + "Dangerous Obsession": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Treasurers spend too much time with the Prince's hoard. They eat, sleep and drink coins and riches. They dream about -- cannot stop thinking about -- fantastic wealth. This trait adds +1D to starting Greed.", + "bonus": [ + { + "target": [ + "+attr", + "greed" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Daring": { + "cost": 1, + "type": "character" + }, + "Darling Of The Court": { + "cost": 3, + "type": "die", + "desc": "The character is beloved at court. Increase any reputation by +1D" + }, + "Deadly Precision": { + "cost": 5, + "type": "die", + "desc": "Deadly Precision allows the character to choose one weapon skill that he favours. Use his skill exponent in place of his Power stat when factoring his IMS for weapons under this skill." + }, + "Deaf": { + "cost": 4, + "type": "die", + "desc": "This character cannot make auditory-based Perception tests, and is +2 Ob to all Perception tests in general." + }, + "Debauched": { + "cost": 1, + "type": "character" + }, + "Deep Sense": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This trait turns the character's Perception into an Orienteering-like skill when underground. He can discern directions, depth and inclination like surface dwellers can see the lay of the land, time of day and the weather." + }, + "Deep Sleeper": { + "cost": 3, + "type": "die", + "desc": "Deep Sleepers are very difficult to rouse from sleep. Loud noises, shouts, even calling their own names won't do it. To wake from sleep before the appointed time, this character must pass an Ob 5 Will test." + }, + "Deferential": { + "cost": 1, + "type": "character" + }, + "Demagogue": { + "cost": 1, + "type": "character" + }, + "Denouncer": { + "cost": 1, + "type": "character" + }, + "Desperate": { + "cost": 1, + "type": "character" + }, + "Despondent": { + "cost": 1, + "type": "character" + }, + "Determined": { + "cost": 1, + "type": "character" + }, + "Dexterity Of The Cat": { + "cost": 2, + "type": "call_on", + "desc": "This trait can be called on when the character is trying to navigate narrow ledges, branches, rope or walkways. Call-on for Climbing or related Speed tests." + }, + "Devout": { + "cost": 1, + "type": "character" + }, + "Diligent": { + "cost": 1, + "type": "character" + }, + "Diminutive Hands": { + "cost": 1, + "type": "character" + }, + "Diminutive Stature": { + "cost": 1, + "type": "character", + "desc": "Characters of Diminutive Stature are no taller than five feet (1.6 paces). This is the stature of Dwarves and Roden." + }, + "Diseased": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character possesses an honest-to-god communicable disease. He is covered with scabs and sores, he stinks like a corpse and he can't sleep due to the itching. Should he ever fail a Health test for recovery from an injury he loses 1D from his Health as his illness overcomes him. Any physical contact with him necessitates a Health test. Obstacles is equal to 10 minus the Diseased's Health. Failure means the character who came into contact with him is now Diseased as well." + }, + "Disciplined": { + "cost": 1, + "type": "character" + }, + "Dismissive": { + "cost": 1, + "type": "character" + }, + "Dispute-settler": { + "cost": 0, + "type": "call_on", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This skill acts as a call-on for Persuasion, Coarse Persuasion or Oratory when trying to settle a dispute between two characters." + }, + "Distracted": { + "cost": 1, + "type": "character" + }, + "Disturbed": { + "cost": 1, + "type": "character" + }, + "Disturbingly Confident": { + "cost": 1, + "type": "character" + }, + "Disturbingly Large Mouth": { + "cost": 1, + "type": "character" + }, + "Dog Lover": { + "cost": 1, + "type": "character" + }, + "Dog-faced Boy": { + "cost": 1, + "type": "character" + }, + "Domineering": { + "cost": 1, + "type": "character" + }, + "Domineering Presence": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Characters with Domineering Presence may, one per scene, make their verbal maneuver first in a Duel of Wits. In the case of a Rebuttal versus Point (or something similar), this trait doesn't have any effect. But if a Bishop is attempting to Dismiss while his opponent is making a Point, then the Bishop player makes his point and rolls his dice first. If he fails to win the Duel, then the other player may respond." + }, + "Dour": { + "cost": 1, + "type": "character" + }, + "Down To Earth": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character is very grounded. He understands the natural order and lives by it. Use this skill as a call-on for Farming, Plant-wise or any other earthy skill the GM approves. Pick one." + }, + "Downtrodden": { + "cost": 1, + "type": "character" + }, + "Dramatic": { + "cost": 2, + "type": "call_on", + "desc": "Whatever happens to the character, it is very entertaining and overwrought when he tells you about it later. This trait can be called on for Acting and Theatrics." + }, + "Dreadful": { + "cost": 2, + "type": "call_on", + "desc": "This character is so horrible to look upon, dread fills the hearts of his enemies and friends. The character can use this trait as a call-on for Intimidation and Interrogation." + }, + "Dreamer": { + "cost": 3, + "type": "die", + "desc": "This character's dreams have a lifelike and portentous quality. The prime function of this trait is to allow the character to have visions in his dreams. These visions are always relevant to the game at hand. The player then becomes the intermediary for this information between the GM and the rest of the group." + }, + "Driven": { + "cost": 2, + "type": "call_on", + "desc": "There is a distant goal which drives this character on. Something burns in his mind that will make all this suffering, hardship and pain worth it in the end. This trait is a call-on for one skill that is related to one of the goals listed in the character's Beliefs. Choose the skill before play starts." + }, + "Drop-dead Gorgeous": { + "cost": 1, + "type": "character" + }, + "Drunk": { + "cost": 1, + "type": "character" + }, + "Dusty": { + "cost": 1, + "type": "character" + }, + "Dutiful": { + "cost": 1, + "type": "character" + }, + "Dvergar": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Dvergar are original, mythical Dwarves. Dwarven nobility all lay claim of the blood ties to these ancient forebears. This trait grants a 1D affiliation with other Dwarven nobility and a 1D reputation among all Dwarves as noble. Characters with this trait suffer a +1 Ob to all Inconspicuous tests among Dwarves." + }, + "Eagle Eye": { + "cost": 4, + "type": "die", + "desc": "Eagle Eye allows the character to see great distances clearly. For the purposes of shooting skill tests, characters with Eagel Eye count extreme range as optimal in the Range and Cover rules." + }, + "Ear For Voices": { + "cost": 3, + "type": "die", + "desc": "The character always remembers a voice and is able to pick out conversations over distance and noise. An Ob 3 Perception test allows the character to hear perfectly that conversation across the busy bar." + }, + "Ear To The Ground": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The harried Lieutenant serves his Captain as best he can. If the player purchases a relationship with an important or powerful captain, increase his base Circle by one." + }, + "Early Riser": { + "cost": 1, + "type": "character" + }, + "Earthen": { + "cost": 1, + "type": "character" + }, + "Earthy Smell": { + "cost": 1, + "type": "character" + }, + "Eating Maggots": { + "cost": 1, + "type": "character" + }, + "Ebullient": { + "cost": 1, + "type": "character" + }, + "Educated": { + "cost": 1, + "type": "character" + }, + "Effete": { + "cost": 1, + "type": "character" + }, + "Eidetic Memory": { + "cost": 4, + "type": "die", + "desc": "The character has the ability to remember nearly anything that he has read or seen. The player is allowed to consult the GM on occasion about certain important character memories. Whenever there is a question about whether or not the character remembers something, it is assumed that he does. The GM can provide the necessary information to the player." + }, + "Eldritch Sink": { + "cost": 8, + "type": "die", + "desc": "Magic does not and cannot directly affect this character. This includes both beneficial and detrimental effects. This isn't the best trait for sorcerers, as it would negate the Gifted trait." + }, + "Emotional": { + "cost": 1, + "type": "character" + }, + "Enemy Of The Sun": { + "cost": 3, + "type": "die", + "restrict": [ + "orcish", + "special" + ], + "desc": "The greatest, most fearsome of Orcs have been bred to resist the pure rays of the sun. They may travel by day and suffer no obstacle penalties as under the Cold Black Blood Orc common trait." + }, + "Entropic": { + "cost": 5, + "type": "die", + "desc": "Things fall apart around the character. Any mechanic that involves something breaking--armor or materials, for example-- counts double in its effect. One breach counts as two, one lost armor die counts as two. Any DoF mechanic for catastrophic failure is weighted by +1 toward the worst result. Any roll that results in complete failure indicates that something broke. Oops. This trait affects everyone and everything in the character's presence, including himself." + }, + "Erudite": { + "cost": 1, + "type": "character" + }, + "Esoteric": { + "cost": 1, + "type": "character" + }, + "Essence Of The Earth": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "common" + ], + "desc": "Elves do not feel the effects of earthly cold and heat as do Men; they do not fall ill; they are ageless and will only pass on when the Earth ends. Elves do not have to take Health tests for illness, and they gain +1D to Health and Forte tests for resisting fatigue and poison. Yet, they are not deathless: Elves may be killed by violence or may waste away due to Grief." + }, + "Estimation": { + "cost": 2, + "type": "die", + "restrict": [ + "dwarven" + ], + "desc": "Dwarven Engineers often share with each other their vast knowledge. \"How far do y' think that is?\" \"Hunnert paces?\" \"Nah,hunnert seven and an eight, easy.\" Using this training skill, a Dwarf may add a +1D any skill that requires an estimation of distance, depth or height: building a bridge, carving out a hall or even leaping a chasm. Be warned though, estimating incorrectly can be calamitous. If the test is failed, the results are catastrophic." + }, + "Etharchal": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "This character is of Elven noble stock. His facial features, bearing, accent and manners are distinct from those born in the wilds or the citadel. His heritage is recognizable at a glance. Grats a 1D affiliation with Elven Etharchs. This compounds with all other appropriate affiliations." + }, + "Eunuch": { + "cost": 1, + "type": "character" + }, + "Evasive": { + "cost": 1, + "type": "character" + }, + "Exasperated": { + "cost": 1, + "type": "character" + }, + "Exhausted": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "mannish", + "lifepath" + ], + "desc": "Pushed to the brink of his endurance one too many times, this character is simply exhausted. +1 Ob to all Health tests." + }, + "Exile": { + "cost": 2, + "type": "die", + "restrict": [ + "elven", + "special" + ], + "desc": "This Elf has committed some crime that has nearly earned him the title of enemy among his people. Rather than dishonor him with such a stigma, his people instead sent him into exile. Ultimately, though, it is a death sentence. The exile cannot journey West. Should his Grief overtake him, he'll have no succor and will simply waste away. This trait adds +1D to starting Grief, and a 1D infamous reputation among all Elves." + }, + "Exorcism Ritualist": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The exorcism ritualist knows how to drive demons from the possessed. He gains a +1D advantage to Faith when using the Purification miracle to exorcise demons." + }, + "Extra Digit": { + "cost": 1, + "type": "character" + }, + "Extremely Bitter": { + "cost": 1, + "type": "character" + }, + "Extremely Respectful Of One's Betters": { + "cost": 1, + "type": "character" + }, + "Extrovert": { + "cost": 3, + "type": "die", + "desc": "The character may reduce his aptitude for learning social skills by one." + }, + "Eye Of The Hunter": { + "cost": 3, + "type": "die", + "desc": "Characters with Eye of the Hunter count their Perception exponent as Observation for detecting Stealthy, Camouflage or similarly concealed characters." + }, + "Faded": { + "cost": 1, + "type": "character" + }, + "Fair And Statuesque": { + "cost": 0, + "type": "character", + "restrict": [ + "elven", + "common" + ], + "desc": "Elves are fair and beautiful to all who look upon them. The Elven form inclines toward tall and slender, rounded by graceful curves." + }, + "Faithful": { + "cost": 5, + "type": "die", + "restrict": [ + "mannish", + "roden", + "special" + ], + "desc": "This trait is required in order to open the Faith attribute. With Faith, the character is able to perform miracles. The Faith section of this chapter describes how to start the attribute. The Emotional Magic section of the Burning Wheel describes its mechanics." + }, + "Familiar Face": { + "cost": 2, + "type": "die", + "desc": "Of course he's my friend. I've seen him around here dozens of times! Familiar face is a call-on for Circles tests." + }, + "Family Heirloom": { + "cost": 5, + "type": "die", + "desc": "A Family Heirloom is an item of great value or power that symbolizes the (once great) might of the family. A character may only take this trait if he starts with 20 or fewer resource points. The trait allows the player to take one item from any list that costs 50 rps or less." + }, + "Fanatical Devotion": { + "cost": 1, + "type": "character" + }, + "Fanged And Clawed": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "common" + ], + "desc": "The mouth of an Orc is a violent organ, well suited to tearing flesh and shouting blasphemies. Orcs may use their Fanged Maw as a weapon: The bite is a Power 1, WS 1, VA 1, Add 2, shortest length weapon. Claws like steel shards protrude from their gnarled fingers. They may be used as weapons: Power 1, VS X, VA -, Add 2, shortest length. They act like knives for purposes of positioning and fighting distance." + }, + "Fastidious": { + "cost": 1, + "type": "character" + }, + "Fateful": { + "cost": 1, + "type": "character" + }, + "Fea": { + "cost": 0, + "type": "character", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The Fêa trait denotes that this Elf has been born into a family whose lineage typically holds the rank of prince. This character need not hold the rank of prince himself, but possessing this trait indicates that he is eligible for the rank. This trait is required if the player wishes to take the Prince lifepath for his character." + }, + "Fealty To The Fea": { + "cost": 0, + "type": "character", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Sword Singers trained in the palace of the Etharch are traditionally considered the Prince's own bodyguard. They report directly to him in times of peace and war." + }, + "Fear Of Cheese": { + "cost": 1, + "type": "character" + }, + "Fear Of Wet Noises": { + "cost": 1, + "type": "character" + }, + "Fearful Respect Of The Servants": { + "cost": 1, + "type": "character" + }, + "Fearless": { + "cost": 3, + "type": "die", + "desc": "This character is practically immune to fear. Reduce hesitation for pain, fear and the shock of gore or death by three. Hesitation for wonderment or surprise is not reduced." + }, + "Feral": { + "cost": 1, + "type": "character" + }, + "Fervent Believer": { + "cost": 1, + "type": "character" + }, + "Fey Blood": { + "cost": 4, + "type": "die", + "desc": "The blood of the elder folk runs through him. This character may choose one trait from the Elf, Dwarf or Orc trait list. Lifepath and common Racial traits are free, normal costs apply to Special Traits." + }, + "Firm": { + "cost": 1, + "type": "character" + }, + "First Born": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "common" + ], + "desc": "Elves are made from the very fabric of nature-- wind, air, wood and water. Thus, they know its secrets very well: they know how to preserve much of its power-- even when it is taken and shaped into something new. It is this intimate knowledge that allows the Elves to weave their songs. Their unadulterated essence grants them insight into their world unmatched by the races of Men, Dwarves or Orcs. Due to this, Elves Perception maximum is 9 rather than 8." + }, + "Fixed Smile": { + "cost": 1, + "type": "character" + }, + "Flamboyant": { + "cost": 1, + "type": "character" + }, + "Flatterer": { + "cost": 1, + "type": "character" + }, + "Flea-bitten": { + "cost": 1, + "type": "character" + }, + "Fleet Of Foot": { + "cost": 2, + "type": "call_on", + "desc": "Fleet of foot is a call-on for Speed when racing or positioning." + }, + "Flights Of Murderous Fancy": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "While under the effects of the Brooding trait, the Great One is beset by the winged visions of his horrid and vile fantasies. These tempting little morsels dance in his mind's eye: Tearing the Elven captain limb from limb, turning pesky knights into dinnerware or slaughtering his entire clan in order get them to shut up, for example. After being humiliated in a social skill test or Duel of Wits, such visions become irresistible. While Brooding, the Orc player may design a Flight of Murderous Fancy to focus on. He must name a task and the vivid details of how he'll accomplish said task. He may then FoRK his Hatred into any and all tests- stat, skill, Steel, Health or whatever-- while on the job. When he sates his fancy (and accomplishes the goal), the player immediately earns a persona point. Tapping into the Flights of Murderous Fancy trait counts as a routine test for Hatred." + }, + "Flip": { + "cost": 1, + "type": "character" + }, + "Floury": { + "cost": 1, + "type": "character" + }, + "Folksy Wisdom": { + "cost": 1, + "type": "character" + }, + "Following The Beat": { + "cost": 1, + "type": "character" + }, + "Fondness For Elven Blood": { + "cost": 1, + "type": "character" + }, + "Forked Tongue": { + "cost": 0, + "type": "call_on", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "This trait is a call-on for Falsehood." + }, + "Formalist": { + "cost": 1, + "type": "character" + }, + "Fortitude": { + "cost": 2, + "type": "call_on", + "desc": "When others would quit from exhaustion, this character will heave to and give it one more try. Call-on for Forte." + }, + "Foul Smelling": { + "cost": 1, + "type": "character" + }, + "Frail": { + "cost": 4, + "type": "die", + "desc": "Weakness saps vitality. This character is less vigorous than his companions. Perhaps due to an overactive life of the mind? Subtract one from Power or Forte. Also, the maximum for the Frait stat is reduced to exponent 5." + }, + "Frippery": { + "cost": 1, + "type": "character" + }, + "Frustrated": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Why can't anything go the way it was planned? Why? WHY?!! Gah! You're all imbeciles!" + }, + "Galvanizing Presence": { + "cost": 0, + "type": "call_on", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Galvanizing Presence is a call-on for command or Conspicuous" + }, + "Garrulous": { + "cost": 1, + "type": "character" + }, + "Gelid": { + "cost": 1, + "type": "character" + }, + "Generous": { + "cost": 1, + "type": "character" + }, + "Genial": { + "cost": 1, + "type": "character" + }, + "Gentle But Firm": { + "cost": 1, + "type": "character" + }, + "Geometric": { + "cost": 3, + "type": "die", + "desc": "Geometry is the mother of invention. Forget what the other guy says. This trait gives +1D to any skill that utilizes mathematics or measurements." + }, + "Gerbil Brain": { + "cost": 1, + "type": "character" + }, + "Gifted": { + "cost": 5, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "This trait is required for the character to be able to cast spells, enchant artifacts, speak with the dead or summon spirits. Without it, Sorcery, Summoning and Enchanting are merely academic pursuits. With the Gifted trait, the character can manipulate magic. See Sorcery in the Burning Wheel for more." + }, + "Glib": { + "cost": 2, + "type": "call_on", + "desc": "This character is a believable storyteller. his manner and expressions are earnest and appropriate. This trait is a call-on for Soothing Platitudes, Falsehood and Seduction." + }, + "Gloryhound": { + "cost": 3, + "type": "die", + "desc": "A gloryhound cannot restrain himself when he sees a chance for \"glory\". He charges into the fray heedless of safety, tactics or plans. Glory includes: maidens fair, enemy sorcereres commanding undead hordes, large monsters, enemy knights, and enemy kings. Gloryhounds may add an additional Steel reaction: For Glory! While hesitating from a failed Steel test (and choosing this reaction) the Gloryhound must Close, In range and Cover he must use Steel. In Fight he must Close and attempt to Charge. He may not do anything else." + }, + "Gluttonous": { + "cost": 1, + "type": "character" + }, + "Gnawing Hunger": { + "cost": 1, + "type": "character" + }, + "Good For Nothing": { + "cost": 1, + "type": "character" + }, + "Gossip": { + "cost": 1, + "type": "character" + }, + "Graceful": { + "cost": 4, + "type": "call_on", + "desc": "This character is fluid and flowing in motion. This trait me be called-on for Speed tests and for social skills requiring grace or presence. This is a special, double effect call-on. The pricing is correct." + }, + "Grand": { + "cost": 1, + "type": "character" + }, + "Greasy": { + "cost": 1, + "type": "character" + }, + "Greater Muse": { + "cost": 6, + "type": "die", + "desc": "Under the influence of his muse, this character is a virtuoso. The player must choose an art form and one of the his character's skills that it inspires. When the art is being performed or witnessed, the dependent skill shade shifts one step lighter. A character cannot be his own muse." + }, + "Greed": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "common" + ], + "desc": "Deep in the heart of every Dwarf lies a terrible seed, a lust for wealth and beauty. Some Dwarves master it; others succumb. It is a powerful emotion that drives many a Dwarf from his comfortable life and compels him to perform terrible acts or zealously create works of inestimable craft. See the Dwarven Greed section in this chapter for more on this emotional attribute." + }, + "Greedy": { + "cost": 1, + "type": "character" + }, + "Grey Mantle": { + "cost": 1, + "type": "character" + }, + "Grief": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "common" + ], + "desc": "Years of emotion and strife take their toll, and eventually all Elves begin to feel Grief tug at their hearts. See the Elven Grief section for the mechanics of this trait." + }, + "Grim": { + "cost": 1, + "type": "character" + }, + "Grudgekeeper": { + "cost": 1, + "type": "die", + "restrict": [ + "dwarven", + "special" + ], + "desc": "This character contains within him the capacity to maintain terrible enmity for perceived slights. He swears grudges like others swear oaths. The Grudgekeeper trait allows the player to replace his Oathsword Belief with a Grudge, Rather than a promise or an oath he swears revenge. Grudges follow the same mechanics as oaths. If the character has the Oathswearer trait, it combines with Grudgekeeper. He may only pronounce grudges -- rather than oaths -- between two characters. They must write them into their Beliefs as if they were oaths." + }, + "Grumbling": { + "cost": 1, + "type": "character" + }, + "Guarded": { + "cost": 1, + "type": "character" + }, + "Hacking Cough": { + "cost": 1, + "type": "character" + }, + "Hairy": { + "cost": 1, + "type": "character" + }, + "Half-elf": { + "cost": 1, + "type": "character", + "restrict": [ + "elven" + ], + "desc": null + }, + "Halitosis": { + "cost": 1, + "type": "character" + }, + "Hand-eye Coordination": { + "cost": 3, + "type": "die", + "desc": "The character may round up when factoring roots for skills with the Perception/Agility root.", + "bonus": [ + { + "target": [ + "+skills_having", + "+all_root", + "perception", + "agility" + ], + "value": [ + "+round_up" + ] + } + ] + }, + "Hands Of Iron": { + "cost": 4, + "type": "die", + "desc": "The character's fists (and feet) have been toughened that his hands count as a Power 1 weapon (like a stone, knife or dagger)." + }, + "Handsome": { + "cost": 1, + "type": "character" + }, + "Happy-go-lucky": { + "cost": 1, + "type": "character" + }, + "Hard As Nails": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "The Warden may choose to ignore one wound once per conflict. He may do so as long as the wounded dice penalty is not greater than his current Will. So if he's only got a 1D of Will left, he can't ignore a traumatic wound, but he can ignore a light." + }, + "Hard-hearted": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "They always have excuses, and this character has heard them all. He may add four successes to any body of argument in a duel of Wits where his opponent is trying to weasel out of an obligation." + }, + "Hard Work": { + "cost": 1, + "type": "character" + }, + "Hardened": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Hard labor has turned this character's back to stone and his muscles to iron. Round up when factoring Health." + }, + "Hatred Of Forests": { + "cost": 1, + "type": "character" + }, + "Haunted": { + "cost": 1, + "type": "character" + }, + "He's A Jonah, That One": { + "cost": 1, + "type": "character" + }, + "Healthy": { + "cost": 2, + "type": "call_on", + "desc": "No matter what the character does or how he live his life, he still maintains the glow of fitness. Call-on for Health tests." + }, + "Hide Before Battle": { + "cost": 1, + "type": "character" + }, + "Hiding": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Goblins learn very quickly that it's better to hide from their masters than be caught or volunteered. Add +1D to Stealthy.", + "bonus": [ + { + "target": [ + "+skills", + "stealthy" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Hoarding": { + "cost": 1, + "type": "character" + }, + "Holier": { + "cost": 1, + "type": "character" + }, + "Hollow Bones": { + "cost": 1, + "type": "character" + }, + "Homesick": { + "cost": 1, + "type": "character" + }, + "Honored": { + "cost": 1, + "type": "character" + }, + "Hope": { + "cost": 1, + "type": "character" + }, + "Horsefriend": { + "cost": 1, + "type": "character" + }, + "Humble Before My Master": { + "cost": 1, + "type": "character" + }, + "Humility": { + "cost": 1, + "type": "character" + }, + "Humility In The Face Of Your Betters": { + "cost": 1, + "type": "character" + }, + "Hungry": { + "cost": 1, + "type": "character" + }, + "Hurt": { + "cost": 1, + "type": "character" + }, + "Hypochondriac": { + "cost": 1, + "type": "character" + }, + "I Know This Ship Like My Own Hands": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The carpenter is a strange bloke, but he definitely knows tehh ship. This trait acts as a call-on for any ability used in trying to figure out something about the sailor's ship -- be it the location of something lost or the knowledge to repair terrible damage." + }, + "Idealistic": { + "cost": 1, + "type": "character" + }, + "Idealogue": { + "cost": 1, + "type": "character" + }, + "Impecunious": { + "cost": 1, + "type": "character" + }, + "Imperious": { + "cost": 1, + "type": "character" + }, + "Imperious Demeanor": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Use this trait as a call-on for Circles when dealing with anyone of lower rank or station." + }, + "Impulsive": { + "cost": 1, + "type": "character" + }, + "Incessant Tapping": { + "cost": 1, + "type": "character" + }, + "Incomprehensible Diagnosis": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Call-on for Falsehood when trying to hide the true facts of a medical diagnosis." + }, + "Inconsiderate": { + "cost": 1, + "type": "character" + }, + "Indecisive": { + "cost": 1, + "type": "character" + }, + "Ineffable Feature": { + "cost": 1, + "type": "character", + "desc": "An Ineffable Feature is a facial or bodily feature that cannot be altered or destroyed. Or if it is somehow destroyed or removed, it grows back the same as it was before." + }, + "Infallible Religious Logic": { + "cost": 1, + "type": "character" + }, + "Ink-stained Hands": { + "cost": 1, + "type": "character" + }, + "Inscrutable": { + "cost": 1, + "type": "character" + }, + "Insightful": { + "cost": 1, + "type": "character" + }, + "Insomniac": { + "cost": 1, + "type": "character" + }, + "Inspirational": { + "cost": 2, + "type": "call_on", + "desc": "The character innervates and motivates other people by his mere presence. Can be used as a call-on for Oratory and Command." + }, + "Intense Hatred": { + "cost": 1, + "type": "character" + }, + "Intractable": { + "cost": 1, + "type": "character" + }, + "Inured": { + "cost": 1, + "type": "character" + }, + "Invisible Friend": { + "cost": 1, + "type": "character" + }, + "Involuntary Shudders": { + "cost": 1, + "type": "character" + }, + "Iron Memory": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Wordbearers are taught tricks of the memory so that they never forget the missives they are commissioned to recite. Players whose characters have this trait, who have forgotten a vital game-important detail, may make an Ob 3 Perception test to recall it." + }, + "Iron Nails": { + "cost": 1, + "type": "character" + }, + "Iron Nose": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This character has smelled the worst of it. He never has to take a Steel, Health or Forte test due to nauseating smells." + }, + "Iron Stomach": { + "cost": 2, + "type": "call_on", + "desc": "This character can eat nearly anything and not get sick, even while enduring stomach-churning gross-out jokes. Call-on for Forte tests against illness or poison." + }, + "Iron Will": { + "cost": 3, + "type": "die", + "desc": "Characters with Iron Will are resistant to Interrogation and Seduction. Any attempts at bending them are made at double obstacle penalty. In a Duel of Wits in which the opposing skill is Interrogation or Seduction, the player may double his body of argument." + }, + "It Just Might Work!": { + "cost": 1, + "type": "character" + }, + "Jaded": { + "cost": 4, + "type": "die", + "desc": "So many years and so much humanity has this character seen, life seems to be an endless repetition of petty struggles. \"I tire of this game...\" Reduce hesitation for surprise or shock by three." + }, + "Jaunty": { + "cost": 1, + "type": "character" + }, + "Jealous": { + "cost": 1, + "type": "character" + }, + "Joan Of Arc": { + "cost": 1, + "type": "character" + }, + "Keen Sense Of Humor": { + "cost": 1, + "type": "character" + }, + "Keen Sight": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "common" + ], + "desc": "Like an eagle, Elves may see a great distance with perfect clarity. Add +1D to all Perception-based (or Observation-based) field maneuvers for Range and Cover or any Perception test involving seeing long distance. Elves may also see in starlight as if it were day. They suffer no obstacle penalties for dim light. Smoke and haze still bar their vision -- normal penalties apply. On complete darkness Elves suffer +4 Ob like Men or Dwarves." + }, + "Keen Taste": { + "cost": 5, + "type": "die", + "desc": "This trait can be used to determine the ingredients of a substance sampled by taste. The player can combine this trait with any one of his applicable skills. Using his knowledge and this inborn talent, he can decipher the ingredients or components of a material, substance or compound. If a character had Prospecting and Keen Taste, he could taste earth and determine what components are contained therein. Such an action requires a successful Perception test at an obstacle equal to what it would normally take to create or spot his substance. This test is open-ended. Keen Taste can also be used as a call-on for Alchemy, Apothecary, Herbalism, Wine Tasting, Cooking and Baking." + }, + "Keys To The Church": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "At one point, some church official thought it was a good idea to appoint this character a Doorkeeper and grant him keys to the church. It was he who locked the doors and guarded the reliquaries. This grants him a 1D affiliation with the church. If he acquitted his duties well, he gains a 1D reputation (local, no power) within the Church. If he took liberties with his duties, he gains a 1d infamous reputation (and +1 Ob to all Circles tests dealing with the Church). This compounds with other reputations and affiliations in the church." + }, + "Kicking The Beast": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "It is the Cattle Slaves' responsibility to move any herd animals owned by the clan. Should any animals go missing, the Goblins become the herd. Characters with this trait may use their Power or Agility, or a weapon skill, to motivate any herd animal (in lieu of Animal Husbandry, Riding or Driving). The animals do suffer wounds from any extreme behavior." + }, + "The Killer": { + "cost": 5, + "type": "die", + "desc": "This character is always aware of what is going on around him -- always looking one way while acting on something else. In Fight, The Killer trait reduces all shooting and throwing actions by one action. In Range and Cover, The Killer grants a +1D advantage to maneuver tests." + }, + "Know It All": { + "cost": 1, + "type": "character" + }, + "Laconic": { + "cost": 1, + "type": "character" + }, + "Lame": { + "cost": 1, + "type": "die", + "desc": "One of the character's legs is deformed or permanently injured causing the character to walk with a pronounced limp. Reduce the character's stride by one. In addition, the character may not benefit from any skill or trait that increases the stride (like Sprinter).", + "bonus": [ + { + "target": [ + "+attr", + "stride" + ], + "value": [ + "+add", + -1 + ] + } + ] + }, + "Landlubber": { + "cost": 1, + "type": "die", + "desc": "\"I think I'm gonna throw up.\" \"I can't swim!\" Look at the landlubber, seasick and staggering around the deck. This character is +1 Ob to all Health tests and attempts at good judgement while at sea." + }, + "Lavish Taste": { + "cost": 1, + "type": "character" + }, + "Lazy": { + "cost": 1, + "type": "character" + }, + "Learned": { + "cost": 1, + "type": "character" + }, + "Leprosy": { + "cost": 1, + "type": "character" + }, + "Lesser Muse": { + "cost": 5, + "type": "die", + "desc": "The beauty of art inspires this character to wild heights. The player must choose an art form and a skill it inspires. When under the influence of his Muse, the character gains +2 open-ended dice to all \"inspired\" skill tests. A character cannot be his own Muse. He cannot recite poetry to himself while he is madly hacking away at his enemies." + }, + "Lesson Of One": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "A Second is a Sword Singer in training. One of the rituals of this rigorous regimen is to dissolve the ego entirely. The Second learns to think, act and be his master -- his own psyche is stripped bare. This forms an intense bond between the two Elves, one that typically lasts beyond the Second's elevation to Sword Singer himself. If the player purchases an important relationship with his mentor he gains a 1D reputation as his student; if he purchases a powerful relationship, he gains a 2D reputation." + }, + "Life Is Death": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Reduce hesitation obstacles due to injury and pain by two." + }, + "Lifting Heavy Things": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "dwarven", + "lifepath" + ], + "desc": "Call-on for Power when lifting something that is obviously too heavy, bulky or cumbersome for the character." + }, + "Light Sleeper": { + "cost": 2, + "type": "die", + "desc": "Light sleepers are easily roused from slumber. They are always allowed the benefit of a Perception test to wake up when a noise is heard or someone is creeping about their room. Make the test as if they were awake. If the character has Observation, that can be used in place of Perception. If the test is passed, the character is instantly awake and ready to go. Also, Light Sleeper adds +1 Ob to all Health tests for recovering Tax." + }, + "Linguist": { + "cost": 3, + "type": "die", + "desc": "This character is passionate about languages. They are a puzzle to solve, a mystery to unravel, a game he enjoys and is naturally good at. Reduce aptitude for learning the Foreign Language skill by 1. Acts as a call-on for the Foreign Languages skill." + }, + "Lithe": { + "cost": 2, + "type": "call_on", + "desc": "This character has fluid grace inherent to his movements. Lithe characters tend to be thin and muscular. Call-on for Dance or any other athletic-type skill. Choose one before starting the game." + }, + "A Little Crazy": { + "cost": 1, + "type": "character" + }, + "A Little Fat": { + "cost": 1, + "type": "character" + }, + "Loathsome And Twisted": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "common" + ], + "desc": "Orcs are repellent, event to their own kind, and especially to Elves, Men and Dwarves. Their bodies are bent and squad, with ugly, long arms and sickening charred flesh: Orc stat maximums are straight 8s. This trait also unlocks the Hatred emotional attribute for Orcs." + }, + "Loner": { + "cost": 1, + "type": "character" + }, + "Lonesome": { + "cost": 1, + "type": "character" + }, + "Long Fingered": { + "cost": 1, + "type": "character" + }, + "Long Of Limb": { + "cost": 4, + "type": "die", + "desc": "Abnormally long arms or legs. Long of Limb increases the character's bare-fisted reach in positioning tests to long. If used with a weapon, increase the weapon length by one step." + }, + "Lord Of Ages": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "This character is the lord and master of an Elven dominion. He governs the Althings, Princes, Captains and Lords. He is ancient and powerful -- his life spans the ages. The Lord of Ages trait grants +1D to one reputation or affiliations the player chooses for this character." + }, + "Lord's Favorite": { + "cost": 1, + "type": "character" + }, + "Lost": { + "cost": 1, + "type": "die", + "desc": "This character never knows where he is or what direction he is going. Explicit directions are required to get him anywhere, and even that rarely works. Double obstacle penalties to all Orienteering or Navigation tests and any Perception test used to find the right direction." + }, + "Lost Faith": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Answer the Faith questions from the standpoint of \"before\" the character gained this trait, then circle it and write \"LOST\" next to it. The player has no access to the character's Faith attribute. Then write into the character's Beliefs the reason why he no longer believes. Should that Belief (or Beliefs) change into one of renewed faith (via an appropriate in-game situation) and the player spent a deeds point during the conflict, he may reopen his attribute. Erase the circle and \"LOST.\" Once restored, the player may perform miracles as per the standard rules." + }, + "Louis Wu": { + "cost": 2, + "type": "die", + "desc": "When surprised or shocked by a revelation (especially when called on to make a Steel test for such instances), this character is prone to fits of laughter. He may replace \"Stand and Drool\" with \"Belly Laugh\" in his hesitation options. If this doesn't infuriate friends and foes alike, something is wrong in the world." + }, + "Love Of The Horse": { + "cost": 1, + "type": "character" + }, + "Low Cunning": { + "cost": 4, + "type": "call_on", + "restrict": [ + "orcish" + ], + "desc": "This is a call-on for any skill used in betraying a superior." + }, + "Low Speech": { + "cost": 3, + "type": "die", + "desc": "The knowledge of the language of animals and beasts is known to you. Choose one type of animalia: birds, horses and beasts of burden, beasts of the wild, reptiles and scaly beasts, fish or insects. This trait may be taken multiple times. Additional Low Speech categories cost +1 trait point." + }, + "Loyal": { + "cost": 3, + "type": "die", + "desc": "There is an old saying: \"Death is lighter than a feather, but duty is heavier than a mountain.\" This character lives by these words. The player may add an additional Belief centered around his Loyalty to another character. Should this trait ever be voted off, the character loses the Belief as well; should the Belief be changed, the trait is lost." + }, + "Lucky": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "There's always the lucky ones. Always. They make the rest of us look like shlubs while they skate through life. This trait can be used in a number of ways. First, it can be used as a call-on for any ability. This can only be used once per adventure. Second, it can be used to buy off one failed roll to save the character's life once-- a failed armor test, a flubbed Speed test, etc. The test is passed and the trait is lost. Lastly if the player makes a random in-game guess (via roleplay), the guess is always right-- so long as the player isn't aware the guess is right." + }, + "Lunatic": { + "cost": 1, + "type": "character", + "desc": "This character always knows the phase of the moon." + }, + "Lustrous": { + "cost": 1, + "type": "character" + }, + "Lynx-eyed, Like Burning Coals": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "common" + ], + "desc": "An Orc's eyes glow red with the inner fire of despite and hatred. Orcs can see clearly in darkness and shadows. They never suffer a penalty for such conditions." + }, + "Mad": { + "cost": 1, + "type": "character" + }, + "Made Man": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "A good craftsman is always in demand; and good craftsmen always look out for one another. 1D affiliation for being a journeyman craftsman." + }, + "Maggot Connoisseur": { + "cost": 1, + "type": "character" + }, + "Maimed": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has been horribly maimed during his career. Choose the nature of the disfigurement and associate it with one physical stat, all tests against that stat are +2 Ob. If Forte is chosen, the penalty transfers over to Health, or the mortal wound is reduced by one." + }, + "Man Of Few Words": { + "cost": 1, + "type": "character" + }, + "Manhunter": { + "cost": 3, + "type": "die", + "desc": "This trait grants the ability to detect strong emotion in others, namely fear, nerves, elation and arousal. The character's Perception acts as the Aura Reading skill (but only for the non-spell detection uses)." + }, + "Manly": { + "cost": 1, + "type": "character" + }, + "Marching": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Orcs with this trait actually know how to march in step. Add +1D to Speed for any marching or travel tests, and +1D to Health tests for fatigue, when marching in formation under the lash." + }, + "Mark Of Privilege": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Those born into nobility bear certain features-- telltale signs of their lineage. Their nose, their bearing, their skin or even their speech mark them as one of the privileged. This confers a 1D affiliation with nobility but also adds +1 Ob to all Inconspicuous or Falsehood tests when masquerading as someone lower than your station." + }, + "Mark Of The Beast": { + "cost": 1, + "type": "character" + }, + "Massive Stature": { + "cost": 4, + "type": "die", + "desc": "This character is the size of a Troll. Due to his imposing bulk, his weapon length categories are increased by one step. If wielding a \"longest\" weapon, he may count his weapn longer than longest!" + }, + "Maternal": { + "cost": 1, + "type": "character" + }, + "Matriarchal": { + "cost": 1, + "type": "character" + }, + "Maudlin": { + "cost": 1, + "type": "character" + }, + "Mean": { + "cost": 1, + "type": "character" + }, + "Melodamatic Family": { + "cost": 1, + "type": "character" + }, + "Mercenary": { + "cost": 1, + "type": "character" + }, + "Merciful": { + "cost": 1, + "type": "character" + }, + "Merciless": { + "cost": 1, + "type": "character" + }, + "Metal Plate In The Skull": { + "cost": 1, + "type": "character" + }, + "Meticulous": { + "cost": 2, + "type": "call_on", + "desc": "The Meticulous character is neat and organized to the point of obsessiveness. All non-physical/martial arts skill tests take the maximum time required. The trait may be used as a call-on for one academic, craftsman, artisan or military skill of the player's choosing. For Dwarven characters, the skill must relate to the character's Greed idiom." + }, + "Mind For Small Details": { + "cost": 1, + "type": "character" + }, + "Mind-numbing Work": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Call-on for Will when performing mind-numbing, repetitive work." + }, + "Mind Over Matter": { + "cost": 3, + "type": "die", + "desc": "With this trait, a player may add one point from his physical pool to his mental pool. This trait has no effect after character burning." + }, + "Misanthropic": { + "cost": 1, + "type": "character" + }, + "Misplaced Aura": { + "cost": 3, + "type": "die", + "desc": "Character has the aura of another type of person or creature. The player and the GM must design this aura-- complete with character stock, Beliefs, Instincts and trait-- before play begins. Any Aura Reading tests made against this character see the Misplaced Aura instead of the real one. However, the Aura Reader can see the Misplaced Aura trait if he gets at least four successes on his test." + }, + "Missing Digit": { + "cost": 1, + "type": "character" + }, + "Missing Eye": { + "cost": 3, + "type": "die", + "desc": "This trait increases most sight-based Perception obstacles by +1 to +2 Ob depending on the situation." + }, + "Missing Hand": { + "cost": 1, + "type": "die", + "desc": "A missing hand reduces Agility by 1, and obviously prevents the character from performing any action with two hands.", + "bonus": [ + { + "target": [ + "+stat", + "agility" + ], + "value": [ + "+add", + -1 + ] + } + ] + }, + "Missing Limb": { + "cost": 1, + "type": "die", + "desc": "Missing limbs have serious effect on how the character is played. A missing arm sets the Agility cap at 5, and obviously prevents the character from performing any action with two hands. A missing leg sets the Speed cap at 4 and reduces the stride by two." + }, + "Monastic": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The diligent daily rituals of monastic life are detailed and difficult. This trait grants +1D to Faith for consecration, Guidance or Revelation miracles while praying in a monastery." + }, + "Mourner": { + "cost": 3, + "type": "die", + "restrict": [ + "elven", + "special" + ], + "desc": "The Mourner is obsessed with his Grief. He is morose. The player may add any amount to his starting Grief that he sees fit, up to a maximum of exponent 9. In addition, all laments are made at +2 Ob, and any time the character's Grief is one test from advancing, the next test -- regardless of its difficulty -- advances him. Grief clings to this character's spirit and cannot be shaken." + }, + "Murderous": { + "cost": 1, + "type": "character" + }, + "Mute": { + "cost": 1, + "type": "character" + }, + "Muttering": { + "cost": 1, + "type": "character" + }, + "Myopic": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has terrible vision. He can barely see what is in front of his face. +2 Ob to all visual-based Perception tests." + }, + "Naked Hatred": { + "cost": 1, + "type": "character" + }, + "Narcoleptic": { + "cost": 1, + "type": "character" + }, + "Near-sighted": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Too much time spent reading in candlelight has strained this character's vision. +1 Ob to all tests requiring long-distance vision including: Bow, Crossbow, Throwing, and Range and Cover Field Maneuvers." + }, + "Never Cry Wolf": { + "cost": 1, + "type": "character" + }, + "Nihilistic": { + "cost": 1, + "type": "character" + }, + "Night Owl": { + "cost": 1, + "type": "character" + }, + "Nimble": { + "cost": 2, + "type": "call_on", + "desc": "Nimble characters are capable of great acts of dexterity with their hands. Nimble may be called-on for Agility tests or one skill with Agility in its root. Choose the skill during character burning." + }, + "No-nonsense": { + "cost": 1, + "type": "character" + }, + "Noblesse Oblige": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character was born into nobility. He has been raised with the idea that not only is he privileged, but he is obligated to perform his duty to society. The player may add a fourth Belief to his character. It must be one of the following: It is my duty to guard society and uphold its interests; I govern from duty, heritage and right; rulership is my natural and ordained task; the opinions of commoners are uneducated, therefore worthless; I am responsible for the people; my reverence is to the crown; rule of the many strips society of its strength and divides it into unfriendly fragments; rulership by minds unaccustomed to privilege is impossible; wealth, birth and intellect mark an individual to undertake governance." + }, + "Nose For Trouble": { + "cost": 1, + "type": "character" + }, + "Nose Of The Bloodhound": { + "cost": 4, + "type": "die", + "desc": "A character with the Nose of the Bloodhound trait can tell a person's or animal's identity via scent and an Ob 1 Perception test. Nose of the Bloodhound also counts as a call-on for Tracking." + }, + "Numb": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "mannish", + "lifepath" + ], + "desc": "This character has lived life under the whip. The Numb trait gives the character pronounced scars along his back, shoulders and legs. Also, the character does not feel the +1 Ob effects of superficial wounds. Three superficials still equal -1D." + }, + "Oathbreaker": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "A character who breaks an oath, lies while under oath or fails to fulfill an oath is forever marked as an Oathbreaker. While Oathbreakers are tolerated in Dwarven society, they are also mistrusted. No oaths may be sworn with an Oathbreaker until he has somehow resolved his initial betrayal. Also, the player must choose a relationship at the start of play that encompasses his broken oath. Lastly, Oathbreaker grants a 1D infamous reputation among the Nobles, Host, Artificers, Guilders or Clans. Player's choice." + }, + "Oathswearer": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Long has it been the tradition of the great Dwarven Princes to go before the Longbeards of the clan to receive their blessings and swear an oath to protect them and uphold the traditions of their forefathers. Oathswearer is perhaps the most vital trait in Dwarven culture. Though all Dwarves are Oathsworn, only those with the Oathswearer trait may pronounce a binding pact. Any oath taken while not under the guidance of an Oathswearer is not binding. Any oath pronounced before an Oathswearer must be written into teh character's Beliefs. It usually replaces one of the character's existing three Beliefs. It can be used to replace the fourth, Oathsworn trait belief only if that oath has been satisfied. If an Oathswearer demands a character's word, and the character refuses, the Oathswearer can, at his discretion, brand him a coward. It is a stain that all Dwarves recognize, and no oaths or agreements are made with cowards. The character is given the Branded a Coward trait." + }, + "Oathsworn": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "common" + ], + "desc": "All Dwarves have stern values hammered into their skulls from a very early age. In fact, Dwarven society is a complex and interlocking network of promises and traditions. The most prime among them is: \"honor the oath.\" To break an oath is to break tradition that has seen Dwarves through many dark ages. It is a terrible crime and one not easily forgiven or forgotten. Due to this trait, all Dwarf characters start the game with an additional (fourth) Belief. This Belief must come in the form of an oath, and represents a pre-game bond between the Dwarf an one of his relationships. Oaths that pertain to the situation in play fill one of the standard three Belief slots. Acceptable oaths are: the soldier's oath: \"I owe Burri a debt of honor;\" the uncle's: \"I swore to recover the crown for my brother;\" the prince's vow: \"My father's last words were to rule wisely; this I swore;\" and the drunk promises his wife: \"I vow never to go near the beer again.\" Yes, the requirements of an oath mean a Dwarf character must start with a relationship." + }, + "Obscure Aura": { + "cost": 3, + "type": "die", + "desc": "Tests to read this character's Aura are made at a double obstacle penalty. This penalty does not apply to detecting spells cast by or on the character." + }, + "Obedient": { + "cost": 0, + "type": "character", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Wolves who are chosen to become Dark Friends tend to be particularly obedient. While their masters can be extremely generous\\'97feeding their wolves much fresh meat-they are also extremely violent and punishing. Rarely do they hesitate to kill a disobedient wolf. Lastly, a Dark Friend has an intuitive understanding of the powers the Blood Summoners what knows the might of success and the calamity of failure. It is far better to aid the former and prevent the latter." + }, + "Obliging": { + "cost": 1, + "type": "character" + }, + "Obsessed": { + "cost": 1, + "type": "character" + }, + "Obsessive": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This Dwarf spends a little too much time talking about certain things. Obsessive must relate to the character's Greed idiom and adds +1D to starting Greed.", + "bonus": [ + { + "target": [ + "+attr", + "greed" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Obstinate": { + "cost": 1, + "type": "character" + }, + "Odd": { + "cost": 1, + "type": "character" + }, + "Oddly Likeable": { + "cost": 0, + "type": "character", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "No matter how outrageous his deeds or words, there's just something about this Dwarf that's charming and likeable." + }, + "Odious": { + "cost": 1, + "type": "character" + }, + "Off-kilter": { + "cost": 1, + "type": "character" + }, + "Oikofugic": { + "cost": 1, + "type": "character" + }, + "Organized": { + "cost": 0, + "type": "call_on", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Call-on for Administration, Estate Management or Accounting." + }, + "Ornery": { + "cost": 1, + "type": "character" + }, + "Other Life": { + "cost": 1, + "type": "character" + }, + "Outlaw": { + "cost": 3, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "The Outlaw is a very particular person in medieval society. A player who chooses the Outlaw trait for his character must consent to a few conditions: First, his character has either committed a grievous crime or is perceived as an enemy of the established order. Second, no law applies to this character-- he has no rights whatsoever. He cannot appeal to the courts or the mercy of a judge for anything. Any man or beast may kill the outlaw and suffers no legal penalty for it. When the Outlaw trait is taken, the player must divide his resource points into two pools. Any resource points from City, Noble or Religious lifepaths go into one pool: The player may spend them as per the normal rules. However, he does not get access to the City/Noble/Religious resources until the Outlaw trait is voted off. The character's remaining resource points may be spent as normal on gear, affiliations, relationships, etc. Outlaws gain a 1D infamous reputation among town and city folk and the nobility." + }, + "Overbite": { + "cost": 1, + "type": "character" + }, + "Overworked": { + "cost": 1, + "type": "character" + }, + "Pack Hunter": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Ravagers hunt with one another in an instinctual fashion. This trait adds +1D to all Steel tests so long as the Orcs equal their enemy's numbers. It also adds +1D to all engagement and positioning tests (in Fight) and field maneuvers (in Range and over) when attacking in a group (as small as two Orcs)." + }, + "Pain Life": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Pain Life reduces hesitation due to pain by one." + }, + "Palsy": { + "cost": 2, + "type": "die", + "desc": "The shakes. Manifestations of this can be minor or only arise under certain conditions. But whenever it does arise, the character has serious difficutly performing delicate work with the hands. +1 Ob to any delicate work on Agility- or Perception/Agility-rooted skills." + }, + "Paranoid": { + "cost": 1, + "type": "character" + }, + "Paranoid About The Ship": { + "cost": 1, + "type": "character" + }, + "Paranoid Ear": { + "cost": 3, + "type": "die", + "desc": "A character with Paranoid Ear uses his Perception exponent as Observation for detecting Stealthy (or Chameleoned) characters." + }, + "Pardoner": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "A pardoner has an interesting reputation in society-- he is publiclyy reviled and secretly loved. A character with this trait has been given a special dispensation from the church to pardon the sins of the faithful and devout. With the Pardoner trait, a player can provide the opportunity for any character with the Gullible, Superstitious or Believer traits to change one of their Beliefs. The change can happen any time, so long as the Pardoner has a say in it and the new Belief relates to the church, god, absolution or sin. In addition, this trait gives a 1D reputation among the lay folk; which also counts as an infamous reputation in the church (+1 Ob to Circles tests in ecclesiastical or church settings). This compounds with other reputations and affiliations in the church." + }, + "Pariah": { + "cost": 1, + "type": "character" + }, + "Passionate": { + "cost": 1, + "type": "character" + }, + "Patient": { + "cost": 1, + "type": "character" + }, + "Patriarchal": { + "cost": 1, + "type": "character" + }, + "Patriarchal/matriarchal": { + "cost": 1, + "type": "character" + }, + "Pegboy": { + "cost": 1, + "type": "character" + }, + "Penetrating Gaze": { + "cost": 4, + "type": "die", + "desc": "Penetrating Gaze reduces obstacle penalties for visibility and darkness by two." + }, + "Penny-wise": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Call-on for Resources. This character keeps track of all his expenses, all the way down to the penny!" + }, + "Perfect Pitch": { + "cost": 2, + "type": "call_on", + "desc": "Perfect Pitch bestows the heavenly ability to identify or reproduce any pitch heard. Obviously this can be greatly useful in music. Call-on for singing and musical instrument skills." + }, + "Perfectionist": { + "cost": 1, + "type": "character" + }, + "Peripatetic": { + "cost": 1, + "type": "character" + }, + "Perspective": { + "cost": 0, + "type": "call_on", + "desc": "this artist possesses the incredible ability to represent three-dimensional objects and depth relationships on a two-dimensional surface. This trait acts as a call-on for any situation in which such an ability would prove useful." + }, + "Phobia": { + "cost": 3, + "type": "die", + "desc": "Choose any one of the numerous phobias floating around out in the world. If faced with the object of his phobia, a character must make a Steel Test at +2 Ob hesitation." + }, + "Pickled": { + "cost": 3, + "type": "die", + "desc": "This character may ignore all starting Health penalties for having an unhealthy lifestyle and whatnot. The character must pursue the unhealthy lifestyle in game." + }, + "Pigpen": { + "cost": 1, + "type": "character" + }, + "Plain Faced": { + "cost": 2, + "type": "call_on", + "desc": "The character just looks like anyone else (of his race and class) and is quite difficult to identify in a crowd. Call-on for Inconspicuous." + }, + "Poised": { + "cost": 3, + "type": "call_on", + "desc": "Despite being caught in extremely compromising circumstances, this character remains unflustered. Poised counts as a call-on for resisting the effects of Obfuscate and Incite actions. It also counts as a call-on for Etiquette." + }, + "Pointed Ears": { + "cost": 1, + "type": "character" + }, + "Poisonous Ambition": { + "cost": 1, + "type": "character" + }, + "Poker Face": { + "cost": 2, + "type": "call_on", + "desc": "More than just an inscrutable stone face, Poker Face is all about giving the face you need to mislead your opponent. This trait can be used as a call-on for Falsehood and Gambling/Games of Chance." + }, + "Pompous": { + "cost": 1, + "type": "character" + }, + "Possessed": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This special trait may only be chosen after consultation with the GM and/or the other players. If it is taken, the character is possessed by a dæmon, spirit or seraph. Choose one appropriate trait to be made manifest through the human vessel from the d-mon/seraph list in the Monster Burner. I recommend that Lawbreaker come along with any and all choices, but it is not required. Once the nature of the possession is determined, the player and the GM need to devise a separate set of Beliefs and Instincts for the possessing spirit. When these come into conflict with the character's own BITs, a versus Will test must be made-- the spirit against the character. Use the appropriate Will from the stat blocks in the MOnster Burner. Whoever wins the test can enact his Belief or Instinct. A Possessed person can be exercised as per the Faith mechanics in the Burning Wheel. Whether or not he wants to be exorcised is another matter. Also, the Possessed character's aura (for Aura REading) will show the additional trait and additional set of Beliefs and Instincts." + }, + "Power Behind The Throne": { + "cost": 5, + "type": "die", + "desc": "A character with this trait has extended his tendrils of power from his traditional Circles into a new setting. You may add one of the following settings to your Circles-- Religious, Noble Court or Noble (or equivalent)." + }, + "Practical": { + "cost": 1, + "type": "character" + }, + "Practiced Precision": { + "cost": 2, + "type": "die", + "desc": "The match appeared in his hand and in a tiny blur of motion, his pipe was lit. This character has a trademark act that he has repeated so frequently that it has become a single action-- like lighting a pipe with a match. Normally this would cost at least three \"actions\" in game, but the Practiced Precision trait reduces that cost to one action. Players must decide what \"trademark act\" their character will practice before the character enters into the game. Combat-related actions may be Practiced Precision trademarks. They are only reduced by one action, rather than reduced to one action." + }, + "Pragmatic Outlook": { + "cost": 1, + "type": "character" + }, + "Predatory": { + "cost": 1, + "type": "character" + }, + "Prince/princess Of The Blood": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Among the Fêa, this Elf is a ruling prince and destined to one day be Etharch. By taking the Prince lifepath, the player is creating a character who is directly related to either the ruling Etharch or his forebears. A Prince of the Blood, though not an Etharch himself, is in line for the Elven crown. This trait adds +1D to the Elf's starting base Circles rating. Prince of the Blood requries the Fêa trait as well.", + "bonus": [ + { + "target": [ + "+attr", + "circles" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Problems": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "If anyone has problems, it's the village idiot. This trait can manifest in two ways. The charater can either be maladjusted and unable to perform socially, or he can be metnally handicapped in some way. If social problems are chosen, the character has double aptitude requirements for social skills and +2 Ob to all Will and social skill tests. If mental problems are chosen, the character has double aptitude requirements for all Perception rooted skills and +2 Ob for all academic, craftsman and artisan skills." + }, + "Profuse Sweat": { + "cost": 1, + "type": "character" + }, + "Prominent Scar": { + "cost": 1, + "type": "character" + }, + "Prone To Exaggeration": { + "cost": 1, + "type": "character" + }, + "Proud": { + "cost": 1, + "type": "character" + }, + "Psychotic": { + "cost": 1, + "type": "character" + }, + "Querulous": { + "cost": 1, + "type": "character" + }, + "Quick-step": { + "cost": 0, + "type": "call_on", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Wordbearers must hustle from the Miller to the Brewer, from the Quartermaster to the Khirurgeon, and from the Trader to the Longbeard. This trait acts as a call-on for any Speed test where the Dwarf is hurrying or hustling (including running to escape or maneuvering for a positioning test)." + }, + "Quick Study": { + "cost": 3, + "type": "die", + "desc": "A character with this trait reduces his Perception aptitude by one." + }, + "Quick-witted": { + "cost": 4, + "type": "die", + "desc": "Quick-witted reduces hesitation by one action and grants the character +1D to any Rebuttal action in the Duel of Wits." + }, + "Quickened Pulse": { + "cost": 3, + "type": "die", + "desc": "There was a moment of electric hesitation between them; their eyes flashed and fenced. But when the assassin lunged it was too late. The thin man was already at his throat. This trait allows the character to round up when factoring Reflexes." + }, + "Quiescent": { + "cost": 2, + "type": "die", + "desc": "Buying this trait allows the player to neutralize and remove one required lifepath trait." + }, + "Quiet": { + "cost": 2, + "type": "call_on", + "desc": "Quiet characters walk quietly, talk quietly, eat quietly and often startle their friends with unheralded appearances. This trait can be used as a call-on for Stealthy." + }, + "Quirky": { + "cost": 1, + "type": "character" + }, + "Rabble-rouser": { + "cost": 1, + "type": "character" + }, + "Rainman": { + "cost": 2, + "type": "die", + "desc": "If the character can see it, he can count it. The tallying happens instantaneously and is utterly involuntary. This inevitably leads to the character constantly muttering numbers and figures and driving his companions crazy." + }, + "Rapier Wit": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has a lightning-quick mind and a sharp tongue; he never hesitates to offer a cutting remark. In a Duel of Wits, if the player can interject a searing bon mot while his opponent is speaking, he gains +2D to his next verbal action. If the character with the Rapier Wit does not win the test, or if the action is a failed Dismiss, Rapier Wit may not be used again in the duel." + }, + "Rare Talent": { + "cost": 0, + "type": "call_on", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Amazingly, and against all expectations, this Orc is actually talented with his hands and mind. The player may choose one craftsman or artisan-type skill for shich this trait acts as a call-on. No wonder he was promoted to Gate Forger." + }, + "Rarified": { + "cost": 1, + "type": "character" + }, + "Rash": { + "cost": 1, + "type": "character" + }, + "Rat-speak": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Squeak, Squeak, I say! This character has Low Speech for rats and vermin." + }, + "Reckless": { + "cost": 1, + "type": "character" + }, + "Recondite": { + "cost": 1, + "type": "character" + }, + "Red Cheeks": { + "cost": 1, + "type": "character" + }, + "Red-blooded": { + "cost": 1, + "type": "character" + }, + "Reeks Of Alcohol": { + "cost": 1, + "type": "character" + }, + "Regal Bearing": { + "cost": 1, + "type": "character" + }, + "Reincarnated": { + "cost": 1, + "type": "character" + }, + "Remarkable Flatulence": { + "cost": 1, + "type": "character" + }, + "Remote": { + "cost": 1, + "type": "character" + }, + "Resigned (To Death)": { + "cost": 2, + "type": "call_on", + "desc": "This character realizes that he is going to die and has accepted that fact. This trait acts as a call on for Steel test in which the character rightly assumes he is going to die -- when the cause is hopeless, he's badly wounded, everyone else is dead, etc." + }, + "Resigned To Fate": { + "cost": 1, + "type": "character" + }, + "Resolute": { + "cost": 1, + "type": "character" + }, + "Restless": { + "cost": 1, + "type": "character" + }, + "Reviled": { + "cost": 1, + "type": "character" + }, + "Rhetorical": { + "cost": 1, + "type": "character" + }, + "Righteous": { + "cost": 1, + "type": "character" + }, + "Road Weary": { + "cost": 1, + "type": "character" + }, + "Robust": { + "cost": 3, + "type": "die", + "desc": "The player may add one point from his mental pool to his physical pool in character burning. Thereafter Robust acts as a character trait." + }, + "Romantic": { + "cost": 1, + "type": "character" + }, + "Rough Hands": { + "cost": 1, + "type": "character" + }, + "Rower": { + "cost": 2, + "type": "die", + "desc": "+1D to Power to motivate an oar-driven seagoing vessel." + }, + "Royal Favorite": { + "cost": 1, + "type": "character" + }, + "Ruddy Complexion": { + "cost": 1, + "type": "character" + }, + "Running (Away)": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Increase the character's stride by one when he's running in fear, surprise or terror -- and not necessarily just from a failed Steel test." + }, + "Sadistic": { + "cost": 1, + "type": "character" + }, + "Sailor's Oath": { + "cost": 1, + "type": "character" + }, + "Salt Of The Earth": { + "cost": 1, + "type": "character" + }, + "Sane": { + "cost": 1, + "type": "character" + }, + "Savage Consequences": { + "cost": 0, + "type": "character", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "The Named pays back any slight or injury two-fold. You wound him, he cripples you. You best half his clan, he slaughters two of your cities." + }, + "Savvy": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Captains are self-reliant and clever men -- when they want something, they know how to ask so people listen. This is a call-on for Circles." + }, + "Scapegoat": { + "cost": 1, + "type": "character" + }, + "Scarred": { + "cost": 1, + "type": "character" + }, + "Scavenger": { + "cost": 2, + "type": "call_on", + "desc": "This is a call-on for the Scavenging skill" + }, + "Scheming": { + "cost": 2, + "type": "die", + "desc": "Scheming characters are always plotting and planning. It doesn't even have to be for their benefit of gain -- sometimes they just plot and plan to see their cleverness at work. Combined with Murderous or Ambitious this can be a very problematic trait. Scheming also allows the player to add +1D to his body of argument in a Duel of Wits." + }, + "Screaming": { + "cost": 1, + "type": "character" + }, + "Sea Legs": { + "cost": 2, + "type": "call_on", + "desc": "Call-on for Speed when aboard a ship. Also this characer doesn't get seasick." + }, + "Seasoned": { + "cost": 1, + "type": "character" + }, + "Second Sight": { + "cost": 4, + "type": "die", + "desc": "With Second Sight, the character peer vaguely into the shifting shadows of the spirit world. It is a powerful, multifaceted ability. Through an act of concentration, he can push through the veil of reality to see the other side. This costs one action in Fight but otherwise can be done at will. The Second Sight grants the ability to discern if something is magical or not. Test Perception: high power magic (major miracles, Mjolnir, the Burning Wheel, Ob 10 spells, Strength 10 spirits, etc.), Ob1; moderately-powered magic (minor miracles, Ob 5 spells, a risen corpse, the Belt of Flying, Dragon Slaying Sword, Spirit Weapons, Strength 5-spirits), Ob 5; low power magic (Red Spectacles, Bless/Curse, Ob 2 spells, Strength 2 spirits etc.), Ob 8. If successful, the character knows the item, person or effect is magical. He doesn't know exactly what the magic does. Second Sight is one of the abilities that allows a character to use the Aura Reading skill. See the Aura Reading skill in this book for obstacles. Second Sight allows the mage to FoRK Aura Reading into Sorcery or Summoning (so long as he is using his sight). Second Sight turns Perception into Observation for detecting Stealthy or Inconspicuous characters. Any physical actions taken (running, jumping, fighting, etc.) while using Second Sight suffer a +1 Ob penalty." + }, + "Secretive": { + "cost": 1, + "type": "character" + }, + "Secretly Worships The Black Sea God": { + "cost": 1, + "type": "character" + }, + "Seemingly Concerned": { + "cost": 1, + "type": "character" + }, + "Seen It All": { + "cost": 1, + "type": "character" + }, + "Seen Not Heard": { + "cost": 1, + "type": "character" + }, + "Self-confident": { + "cost": 1, + "type": "character" + }, + "Self-satisfied": { + "cost": 1, + "type": "character" + }, + "Sense Of Direction": { + "cost": 2, + "type": "call_on", + "desc": "Characters with this trait have a harder time getting lost because they always have a general idea which direction they came from. Sense of Direction can be called on to aid Orienteering and Navigation. This trait is not universal: a farmer has no Sense of Direction at sea; a ranger has no Sense of Direction underground; a sailor doesn't do so well in the mountains." + }, + "Sense Of Distance": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "With and Ob 2 Perception test (plus disadvantages for weather and light), this character can correctly guess any distance." + }, + "Sense Of Entitlement": { + "cost": 1, + "type": "character" + }, + "Servant Of The Citadel": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The Althing is the most powerful Elven citizen barring the Lord Protector. He is the ruler of a vast and ancient Citadel -- heir to a tradition stretching back nearly to the dawn of time. Such as it is, the Althing tends to take his job pretty seriously. If the player takes it seriously and adds both a Belief and Instinct relating to the welfare of his city -- and these are relevant to the game at hand -- the character gets a 2D reputation and 2D major affiliation in and around the citadel. These may be improved with additional resource point allocations." + }, + "Shaped From Earth And Stone": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "common" + ], + "desc": "In the first age, when the earth was barren, Dwarves were created by the One Who Most Dearly Loves to Shape With His Hands. Dwarves were born beneath the earth and it was long before they came forth into the light of the sun. In these dark ages, they grew familiar with the ores, veins, rocks, and sediments that were the sky, ocean and earth. Attendant with their appreciation of raw materials is a love of building and shaping. Due to their heritage above all else it is craftsmanship and the beauty of that which is wrought by skill that Dwarves love most. And since they were Born Under Earth, metals, stones and gems are their first love -- far beyond cloth, wood or leather. This trait also gives the Dwarves access to natural magic abilities -- open-ended/special skills for most of their crafts and arts." + }, + "Sharp Dresser": { + "cost": 1, + "type": "character" + }, + "Shouting": { + "cost": 1, + "type": "character" + }, + "Show No Fear": { + "cost": 4, + "type": "call_on", + "desc": "This is a call-on for Steel when confronted or against impossible odds." + }, + "Shrewd": { + "cost": 1, + "type": "character" + }, + "Sick": { + "cost": 1, + "type": "character" + }, + "Sickly": { + "cost": 2, + "type": "die", + "desc": "This character is prone to illness. Permanently subtract -1D of Health and cap Health at B5", + "bonus": [ + { + "target": [ + "+attr", + "health" + ], + "value": [ + "+add", + -1 + ] + } + ] + }, + "Sight Of The Bat": { + "cost": 6, + "type": "die", + "desc": "This is a scary supernatural trait. It negates all penalties for darkness or dim light." + }, + "Silent Hatred": { + "cost": 1, + "type": "character" + }, + "Singed": { + "cost": 1, + "type": "character" + }, + "Sixth Sense": { + "cost": 3, + "type": "die", + "desc": "This character gets a twinge in his brain (or eye, or heart, or stomach) when a life-threatening event or phenomenon is near. This trait counts as a very special Instinct: Always get a twinge in the head from impending danger. It's broad and breaks all the rules for Instincts, but that's why it's a trait. At any point where the player is about to send his character into a life-threatening situation, the GM is obligated to warn him, \"You've got a bad feeling about this.\" The precise nature of the danger is not revealed. Also, it is the player's responsibility to remind the GM that he has Sixth Sense. If ever there is a dispute surrounding its use, apply the guidelines for using Instincts to the trait." + }, + "Skeptical": { + "cost": 1, + "type": "character" + }, + "Skin Of An Apple": { + "cost": 1, + "type": "character" + }, + "Skinny": { + "cost": 1, + "type": "character" + }, + "Slave To Fate": { + "cost": 0, + "type": "character", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "The Rune Caster is plagued with fleeting visions of what could be and what might have been. He sees his own fate intertwined with all the other doomed strands; there is no other path to walk but the one he is on." + }, + "Stout": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "common" + ], + "desc": "Dwarves are smaller than Men in stature, but they tend to be a bit thicker around the middle, with attendant broader hands, feet and arms. Thought tough and doughty, Dwarves' stout frames also hinders them slightly. Speed must always be lower than their Power or Forte (whichever is higher), even if this limites advancements. Their stride is 6. Dwarven nature allows for a Forte maximum of 9 rather than 8 and a Speed maximum of 6 rather than 8." + }, + "Tough": { + "cost": 2, + "type": "die", + "desc": "A tough character may round up when determining his mortal wound." + }, + "Slayer": { + "cost": 4, + "type": "die", + "restrict": [ + "elven", + "special" + ], + "desc": "This Elf has been marked as a slayer of his kin. In his past, his rage overcame his Grief and compassion, and he slew one of his own. Now he is marked as enemy and hunted by his own people. +1D to starting Grief, a 2D infamous reputation (all Elven people) as a Slayer, and +1D to Intimidate/Silent Fury any Elf." + }, + "Sleek": { + "cost": 1, + "type": "character" + }, + "Sleep-talker": { + "cost": 1, + "type": "character" + }, + "Slippery": { + "cost": 3, + "type": "die", + "desc": "This character is hard to get a hold of -- he wriggles and squirms his way out of nearly any grip. This character may use his Speed or Agility rather than Power to escape from and avoid Locks." + }, + "Slow": { + "cost": 2, + "type": "die", + "desc": "Slow to react and slow on the uptake, he's not the sharpest knife in the drawer. +1 Ob to all Perception tests and increase base hesitation by one." + }, + "Smells Like A Horse": { + "cost": 1, + "type": "character" + }, + "Solipsistic": { + "cost": 1, + "type": "character" + }, + "Somnambulist": { + "cost": 1, + "type": "character" + }, + "Sonorous Voice": { + "cost": 2, + "type": "call_on", + "desc": "This character's voice sounds sweet and melodious to the ear. So delightful is the sound that it can be used as a call-on for Seduction, Persuasion and Suasion tests." + }, + "Spartacus": { + "cost": 3, + "type": "die", + "desc": "This character is a hero among the slaves, outcasts and soldiery. You may add one of the following settings to your Circles: Servitude, Outcast or Professional Soldier." + }, + "Spectacular": { + "cost": 1, + "type": "character" + }, + "Spitting": { + "cost": 1, + "type": "character" + }, + "Sprinter": { + "cost": 4, + "type": "die", + "desc": "This trait increases the stride of the character by one. For Orcs and Men that'd be from 7 to 8. This can grant a substantial bonus to positioning tests, as the character will very likely have the highest stride and gain a bonus die for it.", + "bonus": [ + { + "target": [ + "+attr", + "stride" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Squinty": { + "cost": 1, + "type": "character" + }, + "Stark Madness": { + "cost": 1, + "type": "character", + "restrict": [ + "orcish", + "lifepath" + ] + }, + "Starved": { + "cost": 1, + "type": "character" + }, + "Stealing": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Should a player whose character has this trait take a kleptomaniacal Instinct, he may use Stealing as a call-on for Sleight of Hand. If no such Instinct is taken, this character is the first one accused when anything is stolen in the clan." + }, + "Stentorious Voice": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "Call-On for Conspicuous, Stentorious Debate and Oratory. Characters who have this trait are at a double obstacle penalty for all Singing skill tests." + }, + "Stern Demeanor": { + "cost": 1, + "type": "character" + }, + "Stinky": { + "cost": 1, + "type": "character" + }, + "Stoic": { + "cost": 3, + "type": "die", + "desc": "The Stoic character simply does not flinch in the face of danger. Reduce overall hesitation by one.", + "bonus": [ + { + "target": [ + "+attr", + "hesitation" + ], + "value": [ + "+add", + -1 + ] + } + ] + }, + "Stolid": { + "cost": 1, + "type": "character" + }, + "Stone-faced": { + "cost": 0, + "type": "die", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This trait cancels the effects of the Discerner song and any other trait or special ability that allows the character to be \"read.\" However, it doesn't count against Aura Reading with the Mage sense or Second Sight. It also adds +2D to Falsehood and Gambling." + }, + "Strong-willed": { + "cost": 1, + "type": "character" + }, + "The Story": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character is adept at playing to his audience -- he's always got the right story on hand to impress them and win them to his side. Call-on for Falsehood." + }, + "Strange": { + "cost": 1, + "type": "character" + }, + "Strapping": { + "cost": 1, + "type": "character" + }, + "Street Smart": { + "cost": 4, + "type": "call_on", + "desc": "This character understands the dangers and customs of city living. This trait may be used as a call-on for Streetwise, City-wise and Circles in the City Dweller Setting (The pricing is correct for this trait.)" + }, + "Stubborn": { + "cost": 3, + "type": "die", + "desc": "This trait adds +2D to the character's body of argument in a Duel of Wits that contravenes one of his Beliefs." + }, + "Stung Once (Once)": { + "cost": 1, + "type": "character" + }, + "Stupid": { + "cost": 3, + "type": "die", + "desc": "+1 Ob to all social skills and spells affecting and used by this character." + }, + "Stutter": { + "cost": 1, + "type": "character" + }, + "Superstitious": { + "cost": 1, + "type": "character" + }, + "Suspicious": { + "cost": 1, + "type": "character" + }, + "Swaggering": { + "cost": 1, + "type": "character" + }, + "Sword Of The White Towers": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Sword Singers are revered among the Elven hosts. Take a 1D affiliation with the Swords of the White Towers -- Elven sword singers who have sworn to protect their land and citadels." + }, + "Sworn Homage": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The knigght must swear homage to his lord, the king. He promises fealty to his lord; to guard his land and fight in his wars with armor, horse and sword; to manage his land in good stead, to collect and pay taxes; and generally obey the law and uphold the peace. The player doesn't have to write a Belief for this, though it is encouraged. The Sworn Homage trait indicates the belief is internalized. This trait grants a 1D affiliation with the nobility. Should the character fail to perform his duties, then he may be stripped of rank. This compounds with other noble affiliations like Mark of Privelege." + }, + "Sworn To Protect": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "If the Lord Protector's player uses one of his Beliefs to describe his vow to defend the citadel/wilderlands/royalty, and such a vow is relevant to the current game, the Lord Protector receives a 2D reputation (he's the boss) and a 2D major affiliation within the Protectors. These may be further improved upon with resource points" + }, + "Sworn To The Lord Protector": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The Captain has sworn a vow to loyally serve his lord. This trait grants a free relationship with the Lord Protector provided the player writes a Belief about him. If the player decides not to write a Belief or the Belief changes, the trait becomes a character trait. If he later writes a Belief about the Lord Protector, the trait is reactivated." + }, + "Sworn To The Lord Protector (Or Etharch Or Althing)": { + "cost": 0, + "type": "die", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "The character has sworn a vow to loyally serve his lord. This trait grants a free relationship with the chosen lord provided the player writes a Belief about him. If the player decides not to write a Belief or the Belief changes, the trait becomes a character trait. If he later writes a Belief about the lord, the trait is reactivated." + }, + "Sworn To The Order": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "A knight of a holy military order may add an additional (fourth) Belief dictated by his particular Order (poverty, chastity, protection of pilgrims, etc.). Sworn to the Order replaces the Noblesse Oblige trait and Belief." + }, + "Taciturn": { + "cost": 1, + "type": "character" + }, + "Tainted Legacy": { + "cost": 5, + "type": "die", + "desc": "This character's ancestors have mated with something unholy and have tainted the bloodline forever: a curse that will never be lifted, a twisted yoke to bear. The player may choose one trait from a dæmon, vampyr, satyr, red cap, raksha, ophidia, kocista-noga, giant or dragon (which are found in the Monster Burner). Tainted Legacy also incurs an Inconspicuous penalty. The character always counts as having the \"different race\" penalty (+2 Ob) -- his taint has certain odd outward signs." + }, + "Tall Tale Teller": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has seen it all. At least he says he has. His yarn is always wilder, larger and more incredible than his companions' stories. The player may add +1D to Persuasion, Seduction, Interrogation or Falsehood tests so long as he can come up with an appropriate tale." + }, + "Taste For Man-flesh": { + "cost": 1, + "type": "character" + }, + "Tasting The Lash": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "mannish", + "lifepath" + ], + "desc": "When another character cracks a whip across his back and gives an order, the player must obey the orders (as long as the orders aren't to \"stick that knife in your throat\" or something similar). He can be driven to attack, to flee, to drop his weapon, fall to his knees or just plain row the boat. This trait does not allow a reroll, it merely forces an action. Thus it can be used to cow opponents or send your reluctant underlings into the fray." + }, + "Temperamental": { + "cost": 1, + "type": "character" + }, + "Tenacious": { + "cost": 4, + "type": "die", + "desc": "A Tenacious character has a one-track mind. Once he is fixed on something he keeps after it. If a Tenacious character's body of argument in a Duel of Wits is reduced to zero or below this trait puts it back up to one die. This allows the character to play out the next volley (or more if his die isn't lost). Once that one die is reduced however, the argument is over." + }, + "Tenuous": { + "cost": 1, + "type": "character" + }, + "Thick Skin": { + "cost": 1, + "type": "die", + "desc": "This character is unaffected by insults, nettling and nagging. Incite actions in the Duel of Wits are +2 Ob against this character." + }, + "Thousand-yard Stare": { + "cost": 2, + "type": "die", + "desc": "This character has seen so much death, shock, inhumanity and horror that nothing phases him anymore. This trait reduces hesitation by three against pain, violence and intimidation but increases hesitation by two against surprise and Wonderment-type spell effects. This character may not Run and Scream. Characters with this trait tend to be quiet, remote and cold. They also never seem to look into your eyes. Rather, their gaze is always fixed a thousand yards behind you." + }, + "Thug": { + "cost": 1, + "type": "character" + }, + "Thunderous Snoring": { + "cost": 1, + "type": "character" + }, + "Tidy Aspect": { + "cost": 1, + "type": "character", + "desc": "Even under the most adverse conditions, the character's clothes and appearance are neat and clean." + }, + "Timid": { + "cost": 1, + "type": "character" + }, + "Tinkerer": { + "cost": 0, + "type": "call_on", + "restrict": [ + "dwarven", + "lifepath" + ], + "desc": "This trait acts as a call-on for Mending or Black-Metal Artifice when trying to cobble together something new or weird." + }, + "Tolerant": { + "cost": 1, + "type": "character" + }, + "Tongueless": { + "cost": 2, + "type": "die", + "desc": "This character's tongue has been cut out, either as an act of criminal malice, as cruel punishment or as religious service. The character may not properly speak. This is a pretty big handicap in a game where all communication is done via speech." + }, + "Tonsured": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This character has symbolically shaved his head as part of the ritual of initiation into his religious order. The Tonsured trait grants a 1D affiliation with a monastic or religious order. Also, the character is authorized to officiate the rituals of his order, whatever the players and GM decide they are. This compounds with other reputations and affiliations in the church." + }, + "Touch Of Ages": { + "cost": 7, + "type": "die", + "desc": "This trait allows the character to \"read\" objects through her touch. A successful Perception test will give impressions present in the object: strong emotion arcana and even age. Type/name of object, Ob 1. Age of object, Ob 2. Length of the time the object has been in its current location, Ob 3. Recent events surrounding the object that left physical evidence, Ob 4. Recent events taht left no physical mark, Ob 5. Past events that left their mark, Ob 6. Past events that left no mark, Ob 7." + }, + "Touch Of The Devil": { + "cost": 7, + "type": "die", + "desc": "This is an odd but powerful trait. With the touch of the Devil, a character's hands become sensitive and finely tuned instruments. If when making a Perception test, the player can describe how his character is using his hands to sense the disturbance/noise, Perception counts as Gray shade. Detecting soft foot steps on a stone floor, impressions on a piece of paper, cracks in a vial or the breeze through a keyhole, for example. If used in a versus test against Stealthy, Touch of the Devil counts as Observation. Surgery, Pottery, Carpentry, Sewing, Whitesmithing, Etching, Engraving, Carving, Lapidary, and Jewelcraft may root from Gray Perception. WHenever a character with this trait is wounded he suffers an additional automatic superficial wound. These count toward the \"three superficial wounds\" limit and toward incapacitation." + }, + "Touch Of Madness": { + "cost": 1, + "type": "character" + }, + "Tough As Nails": { + "cost": 6, + "type": "die", + "desc": "Pain and suffering are a picnic. This character is not required to make Steel test for pain exhaustion or deprivation. He just clambers to his feet and keeps going. If kicked back to the ground, he crawls." + }, + "Troll Speak": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Orc Troll Lords learn to communicate with Trolls, not only in the Vile Language, but in the bruteæs own language as well. This character may understand spoken Trollish and speak it himself." + }, + "Trusting": { + "cost": 1, + "type": "character" + }, + "Trustworthy": { + "cost": 1, + "type": "character" + }, + "Turgid": { + "cost": 1, + "type": "character" + }, + "Ugly": { + "cost": 1, + "type": "character" + }, + "Ugly Reputation": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The Ship's Doctor has something of an unpleasant reputation with the sailiors. This trait grants a 1D infamous reputation among sailors and seafarers. \"Oh, you were a 'doctor'.\"" + }, + "Unbeliever": { + "cost": 1, + "type": "character" + }, + "Unbreakable": { + "cost": 5, + "type": "die", + "restrict": [ + "elven", + "special" + ], + "desc": "This Elf is possessed of an unbreakable spirit. Grief seems to have no effect on him whatsoever. Subtract -2D from starting Grief. In addition, all Grief tests are taken at -1 Ob", + "bonus": [ + { + "target": [ + "+attr", + "grief" + ], + "value": [ + "+add", + -2 + ] + } + ] + }, + "Unctuous": { + "cost": 3, + "type": "die", + "desc": "The personality of this character is so caustic that he is distasteful and difficult to be around. +2 Ob to the character's Persuasion, Seduction, Haggling and Oratory tests. It does not affect Command or even Intimidation." + }, + "Underbite": { + "cost": 1, + "type": "character" + }, + "Underpaid": { + "cost": 1, + "type": "character" + }, + "Uneasy": { + "cost": 1, + "type": "character" + }, + "Unheeded": { + "cost": 0, + "type": "call_on", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "No one notices this character. Call-on for Inconspicuous." + }, + "Unlucky": { + "cost": 1, + "type": "die", + "desc": "The Unlucky character has a hard life. Whenever the player makes an arbitrary decision about something in game, it's always wrong. If for example, the character comes to a fork in the road, and the player just shrugs, \"I dunno. I go left\" It's the wrong direction -- doesn't matter what the \"truth\" is, that's his luck. Unlucky may be bought off in game. If the player utterly succeeds at a test at a crucial moment -- all successes, glowing results, victory, etc -- the player may opt to turn the success into a dismal, catastrophic and hopefully hilarious failure. Doing so immediately earns the player a fate point and persona point. Unlucky is then removed from his trait list." + }, + "Unrelenting Hatred": { + "cost": 1, + "type": "character" + }, + "Unrelenting Savagery": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Head-Takers earn their position through their ability to master their blood lust. When in battle, or when committing murder, this character may FoRK his Hatred into any weapon skill or Power test. However the player who controls this character must take his actions too far. When he uses this trait he must describe an act so horrid and vile it causes the other players to flinch and grimace. Failure to evoke the savage nature of the Head-Taker is cause for loss of the trait in the Trait Vote. Invoking this trait also counts as a routine test for Hatred." + }, + "Unsavory Madman": { + "cost": 1, + "type": "character" + }, + "Urbane": { + "cost": 1, + "type": "character" + }, + "Venal": { + "cost": 1, + "type": "character" + }, + "Veneer Of Obedience": { + "cost": 1, + "type": "character" + }, + "Vested": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Priests become vested in their Order. In Western/Christian canon, the vestment is called a surplice. It is their choir dress, the vestment for processions, the official priestly dress of the lower clergy, the vestment worn by the priest in administering the sacraments and when giving blessings. The right to wear a surplice shows that the character is at the very least a member of the lower clergy. This trait grants a 1D affiliation with the church and its faithful parishioners. This compounds with other reputations and affiliations in the church." + }, + "Vigor Of Youth": { + "cost": 5, + "type": "die", + "restrict": [ + "mannish", + "special" + ], + "desc": "Though old, this character possesses the strength and vitality of his youth. If starting the game older than 40 years, a character with this trait uses these stat pools: 7 mental and 14 physical." + }, + "Vile Language": { + "cost": 0, + "type": "character", + "restrict": [ + "orcish", + "common" + ], + "desc": "Orcs speak a special language of shadow, chill and blight. They share this tongue with corrupt vermin, shades, Great Wolves, Trolls and certain Great Spiders." + }, + "Virtuous": { + "cost": 3, + "type": "die", + "restrict": [ + "dwarven", + "special" + ], + "desc": "This Dwarf is virtuous, honorable, and restrained. He may add +2D to his Steel when making a test against Greed. He also may reduce his starting Greed by -1D." + }, + "Vitriolic": { + "cost": 1, + "type": "character" + }, + "Vocal": { + "cost": 1, + "type": "character" + }, + "Voice In The Crowd": { + "cost": 1, + "type": "character" + }, + "Void Embrace": { + "cost": 4, + "type": "die", + "restrict": [ + "orcish" + ], + "desc": "Drinkers of the Dark are immersed in shivering pools of arcane energies. They are taught to imbibe, inhale and exhale the Dark Blood and survive. This trait transforms the Orc's Hatred into a vehicle for enormous power. However, Orcs are unable to tap their innate power without Rituals. Void Embrace is an emotional attribute with its own shade and exponent. It is used to resist tax, sustain spells (rather than Will), and is used to maintain a spell after a distraction. Any Orc may be taught the Rituals, but without Void Embrace, he cannot resist the tax and thus will be permanently crippled or worse. Void Embrace can also be used to enhance certain rolls by spending a persona point to tap the Void. See the Void Embrace section of the Orc chapter for more details. If Void Embrace is advanced to exponent 10, the Orc goes mad or commits suicide. Either way he is removed from play." + }, + "Wary": { + "cost": 1, + "type": "character" + }, + "Watchful": { + "cost": 0, + "type": "character", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Ghosts of the Deeping Wood always prefer to watch from afar before revealing their presence." + }, + "Weak-willed": { + "cost": 2, + "type": "die", + "desc": "This character is pliable like tapioca. In a Duel of Wits, this character can only ever use the Not a Big Deal rules for his body of argument." + }, + "Weather Sense": { + "cost": 2, + "type": "die", + "desc": "\"My joints ache; storm's coming.\" With a twinge in the knee, a stiffening of the joints, back pain or headaches, Weather Sense clues a character into impending weather. Unless the GM plays with strict house weather rules -- I don't -- the Weather Sense in essence gives the player the ability to dictate the weather. Why else would a player pick this trait unless he were concerned about having the right weather for something or other? Anyway, I say let him predict it based on the Perception obstacles below -- and let his predictions come true. Useless vague predictions (\"Rain soon\"), Ob 1. Accurate weather, Ob 2. Approximate location, Ob 3. Approximate time, Ob 4. Accurate time, Ob 5. Each obstacle tier includes all the other effects under it." + }, + "Weight Of The World": { + "cost": 1, + "type": "character" + }, + "Wierd": { + "cost": 1, + "type": "character" + }, + "Well Appointed": { + "cost": 1, + "type": "character" + }, + "Well Dressed": { + "cost": 1, + "type": "character" + }, + "Where There's A Whip, There's A Way": { + "cost": 0, + "type": "die", + "restrict": [ + "orcish", + "lifepath" + ], + "desc": "Orcs live by the rule of the lash. With a whip in hand and lads to lash, an Orc taskmaster feels that nothing can stop him! An Orc with this trait and a whip can force another -- any character -- to reroll a failed test once per session as if he had a call-on for this particular test. This effect is automatic as long as the player is bellowing and flailing around like he has a whip in his hand (and his character actually has a whip). This is how Orcs make slaves of their captives. A few sessions of accepting the whip will no doubt earn you the Tasting the Lash trait in the vote." + }, + "White-gold Wielder": { + "cost": 1, + "type": "character" + }, + "Wise Aphorisms": { + "cost": 0, + "type": "call_on", + "restrict": [ + "elven", + "lifepath" + ], + "desc": "Elves are full of pertinent old sayings. Use this as a call-on for Persuasion, Oratory, Interrogation or Seduction if the player can come up with some appropriately spacious dialogue to throw into play at the right moment." + }, + "Wolf's Snout": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Wolves have an exceptional sense of smell. Wolf's Snout grants +1D to Perception for assesses, and +1D to Tracking and Howling skill tests. This bonus is also added to Perception for determining Reflexes. This trait counts as Observation when combined with Woodland Ear." + }, + "Wolverine": { + "cost": 5, + "type": "die", + "desc": "Characters with the Wolverine trait recover faster than others from wounds and illness. May be used as a call-on for Health for recovery from a wound or illness. Wolverine can also be used to buy off a botched recovery test. If used in this way, the test is considered passed, but the trait is lost in the bargain." + }, + "World Weary": { + "cost": 1, + "type": "die", + "restrict": [ + "elven", + "special" + ], + "desc": "Certain Elves feel a weariness creep into their bones. The constant trial and tribulation that marks the passing of years begins to drag them down. Reduce hesitation by one but increase Grief by one.", + "bonus": [ + { + "target": [ + "+attr", + "hesitation" + ], + "value": [ + "+add", + -1 + ] + }, + { + "target": [ + "+attr", + "grief" + ], + "value": [ + "+add", + 1 + ] + } + ] + }, + "Worldly": { + "cost": 1, + "type": "character" + }, + "Xenophobic": { + "cost": 1, + "type": "character" + }, + "You Should Know Better Than That!": { + "cost": 1, + "type": "character" + }, + "Your Eminence": { + "cost": 0, + "type": "character", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Viscounts and Counts are referred to as \"Your Eminence.\" This trait indicates that the character was born into this rank. He need not have ever been a count himself, but it is his birthright to be addressed as one. A character must have this trait in order to take the Count or Viscount lifepaths." + }, + "Your Grace": { + "cost": 0, + "type": "character", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "Dukes and Bishops bear the appellation of Your Grace. To fail to refer to them by title is to lose one's head or the sanctity of one's mortal soul. The character need not have experienced the actual duties of a Duke or Bishop, but the rank is his to flaunt. This trait is required for the Duke or the Bishop lifepaths." + }, + "Your Lordship": { + "cost": 0, + "type": "character", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "This trait simply indicates that the character was born into lower nobility. He need not ever have led the life of a lord. Indeed to do so would require the Lord lifepath. However, his birthright is that of a lord, and he is accustomed to being addressed as \"Your Lordship.\" Failure to do so is an insult. A character must have the Your Lordship trait in order to take the Lord lifepath." + }, + "Yowling": { + "cost": 1, + "type": "character" + }, + "Zealot": { + "cost": 0, + "type": "die", + "restrict": [ + "mannish", + "lifepath" + ], + "desc": "The Zealot is a fervent believer. He has taken hold of a doctrine and made it his own. The Zealot trait allows the player to add an additional (fourth) Belief to his character. The Belief must relate to the doctrine of his cult or sect." + }, + "Aecer's Likeness": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden are, in essence, upright and acutely intelligent rodents. Their defining feature is their pronounced incisors curving down from their extended snouts. Covered in fur, Roden bear large ears and long tails. Their feet are long and thickly padded, making shoes unnecessary." + }, + "Coat Of Fur": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "common" + ], + "desc": "All Roden have a short coat of fur. While Field Roden coloration ranges from sawdust to chocolate, those Below tend to be deep, dark brown, gray, or black. Roden fur offers them protection from the elements. They can withstand rain and cold with little worry. This trait acts as a call-on for Health or Forte tests related to weather or wet." + }, + "Communal": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden prefer the company of others and safety of numbers. They live in close-knit villages made up of large, extended families, and refer to their homes as 'nests.' It is quite rare to find one alone, and usually such loners are exiles. All Roden start with a 1D affiliation with their family and their nest. Name the nest and its location." + }, + "Enlarged Incisors": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden incisors grow continually through life and need to be filed regularly. These incisors are often quite sharp, and can be used to bite opponents if the situation becomes desperate. +1 Power, Add 2, VA - , Shortest, WS 2." + }, + "Quick-blooded": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden have fast metabolisms that take their toll on them over time. Roden live shorter lives than Men, reaching old age by 40. They have a Stride of 8." + }, + "Tail": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden tails range from 1/2 to 1 pace long. Field Born often have furry tails, while those Below often have bald ones." + }, + "Large Ears": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden have large, sensitive ears that sit atop their heads. These give them excellent hearing. +1D to Perception rolls." + }, + "Pack Rat": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "common" + ], + "desc": "Anything might be useful later on, so Roden are loathe to throw away anything." + }, + "Skittish": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "common" + ], + "desc": "Roden are instinctively afraid of loud noises and surprises. Increase hesitation by 1 for Steel tests caused by fear or surprise. Hesitation for more than one action indicates the Roden must flee." + }, + "Aggressive Carnivore": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "A Carnivore's blood runs hot, and he is quick to anger. He relies on confrontation to deal with most problems. Call-on for Intimidation. Must enter combat in Aggressive Stance." + }, + "Alarmist": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Deputies aren't necessarily cowards, but they know the best way to deal with trouble is to bring in reinforcements... fast! \"Shout when surprised or hesitating\" must be added as an additional Instinct." + }, + "Broken Spirit": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "His spirit is gone and he is ready to accept whatever is offered. Reduce by one any obstacles to motivate this character via Preaching, Oratory or Suasion." + }, + "Confusing Rant": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Pinkies are a bit \"off\" in their thinking and tend to be socially retarded. Those that speak to one often come away dazed by a bombardment of trivia, non sequiturs, and bad jokes. During a Duel of Wits, this trait grants the character +3D to Incite. The only hesitation option is to \"Stand and Blink.\" All attempts to Intimidate or Command a Confusing Ranter are at +2 Ob. Also, Ranters are at a +2 Ob to all Oratory and Rhetoric tests." + }, + "Defensive": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Those that malign the Society misunderstand the Society. They've got it completely wrong, and here's why..." + }, + "Feared": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The ignorant fear the unknown, and the Albino is a terrible mystery. Choose a 1D infamous reputation." + }, + "Genius": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Every idea is unique and brilliant, every plan sure-fire and flawless. It is only a matter of time before such brilliance is properly recognized and rewarded. Genius is a call-on for one non-martial or athletic skill of the player's choosing." + }, + "Good Listener": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The Negotiator seems to pay attention to and understand what people say. This encourages others to continue speaking and open up to him. May be used as a call-on for Haggling, Persuasion, and Seduction." + }, + "Gopher": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "What's a gopher do? He goes for this; he goes for that. He fetches water; he fetches tools." + }, + "Hand-shaker": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The tools of the politician's trade. May be used as a call-on for Oratory or Persuasion when he's shaking hands." + }, + "Humble": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "All are equal before Aecer, and the wise continually remind themselves of this fact. 1D reputation among the faithful as exceptionally humble." + }, + "Impersonal": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The opposite of Bedside Manner. Dull the pain, collect payment, say goodbye. Too many faces, and they're not worth the trouble." + }, + "Light Touch": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The key to a successful \"lift\" is in the fingers. May be used as a call-on for Sleight of Hand." + }, + "Megalomaniac": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The Visionary is a gift from Heaven to the mortal world. It is his destiny to lead and shape the future in his image. +2D to Conspicuous and always add an extra die when helping or FoRKing with Conspicuous.", + "bonus": [ + { + "target": [ + "+skills", + "conspicuous" + ], + "value": [ + "+add", + 2 + ] + } + ] + }, + "Misunderstood": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Those with the Superstitious trait will not deal kindly with an Albino. Don't they realize that you are just trying to help? \"Just listen! No, stop! Don't run away!\" *sigh*. 1D infamous reputation among the Superstitious." + }, + "Opportunist": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Never let a passerby pass you by. Never ignore a good deal or a potential sucker." + }, + "Ordained": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "This Roden is one of Aecer's Ordained. He is responsible for carrying out the rituals and rites. Ordained characters are always treated with respect by the Field Roden. 1D affiliation with the Roden faithful." + }, + "Practiced Smile": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Smile for all the pretty people!" + }, + "Pyromaniac": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The fire is lovely and pure. It cleanses and purifies and burns and sings and calls out in waking dreams. Call-on for Firebuilding" + }, + "Rat-squeak": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "This character can talk to and understand rats and mice." + }, + "Revered": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The Abbot is a pillar of piety and virtue in the community. May be used as a call-on for Oratory or Suasion." + }, + "Sadist": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Causing pain and suffering in others is a highly entertaining and enjoyable pastime. May be used as a call-on for Torture." + }, + "Serious": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "A Crafter takes his skill very seriously. A joke or song at the tavern is fine, but keep it outside the workshop or else!" + }, + "Single-minded": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Once a Murderer sets his mind, there is very little that can redirect him. Call-on for Steel when \"on the job.\"" + }, + "Soft Step": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The Burglar walks in a particular fashion, feeling each step before putting his weight on it. May be used as a call-on for Climbing and Stealthy." + }, + "Toiling": { + "cost": 0, + "type": "call_on", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Laborers are used to working long hours doing the same mindless, repetitive tasks. Call-on for Back Breaking Labor when doing mindless, repetitive tasks." + }, + "Tunnel Vision": { + "cost": 0, + "type": "die", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "The Below is a dark place and those who live there have adapted. May see as normal in low-lit areas, but not in complete darkness. Those looking directly into these eyes will see glowing, green orbs staring back. Reduces penalties for dim light by one step." + }, + "Vegetarian": { + "cost": 0, + "type": "character", + "restrict": [ + "roden", + "lifepath" + ], + "desc": "Field Born are naturally vegetarians, consuming grains, fruits, berries, and nuts." + }, + "Clawed": { + "cost": 2, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "This Roden's hands are typically like a man's but with longer fingers. The Clawed trait results in hard, elongated fingernails that can be used as tools or weapons. +1 Power, Add 2, VA -, Speed 3, Shortest." + }, + "Club Tail": { + "cost": 2, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "This tail is thicker and stiffer than most. It can be a surprising weapon during a melee. +2 Power, Add 2, VA - , Speed 2, Long. May not be combined with Whip Tail." + }, + "Coat Of Darkness": { + "cost": 5, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "Some of those Below have adapted almost supernaturally to the dark. When attempting to Stealth in areas of darkness and shadow, this fur adds +2D to the roll. May not be combined with Fur of the Fields." + }, + "Extra-long Fur": { + "cost": 1, + "type": "character", + "restrict": [ + "roden", + "special" + ], + "desc": "Fur that normally is no deeper than a finger's length now grows up to four times longer! Knots, tangles, and clumps require extra time to manage." + }, + "Fur Of The Fields": { + "cost": 5, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "Roden with this trait have a wondrous coat of fur that allows them to blend into any field or woodland terrain. When attempting to Stealth in such areas, this fur adds two dice (+2D) to the roll. May not be combined with Coat of Darkness." + }, + "Naked": { + "cost": 1, + "type": "character", + "restrict": [ + "roden", + "special" + ], + "desc": "Roden with this trait have no fur, and their pink skin is laid bare, though whiskers still poke out from their muzzles. Sunburn is common and clothing is required." + }, + "Night Eyed": { + "cost": 4, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "With this trait, a Roden is able to see even in complete darkness. However, daylight causes a +1 Ob to all tests." + }, + "Pouched Cheeks": { + "cost": 2, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "These cheeks are very elastic and may be used to carry a surprising amount of fruits, nuts, and vegetables. Consider it feasible to place up to 6 apples in each cheek. Knives and other sharp objects are carried at the bearer's own risk!" + }, + "Sharpened Incisors": { + "cost": 5, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "This Roden's teeth are extra sharp. Add 1, VA 1, Speed 3, Shortest." + }, + "Visionary Faith": { + "cost": 5, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "Visionaries draw their power from their followers, not divine favor. This trait grants a B3 Faith attribute. The attribute may not be increased with the Faith questions. Instead, it is increased by purchasing a Visionary Cult (see Monster Burner page 130). Any miracles performed with Visionary Faith only affect the believers and nothing or no one else." + }, + "Whip Tail": { + "cost": 4, + "type": "die", + "restrict": [ + "roden", + "special" + ], + "desc": "These tails are typically one or two paces longer than most others and tend to be slender. Power 0, Add 1, VA - , Speed 3, Longer. May not be combined with Club Tail." + }, + "Crushing Jaws": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Great Wolves have powerful jaws honed into deadly hunting weapons. Crushing Jaws count as: Pow +3, Add 2, VA 2, Short, Speed 2 weapon. May Lock and Strike on the same action." + }, + "Deep Fur": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Heavy and thick fur protects Great Wolves against the cold of their harsh environment. They can tolerate extremely cold temperatures, whereas extended times of hot weather tend to agitate them. This trait allows the wolf to ignore penalties/tests relating to cold weather. However, extended time in hot weather causes +1 Ob to all tests. The color a wolf's pelt can range from pure white, to pure black, to mottled gray, to brown, to sandy, and even to reddish and ochre." + }, + "Great Lupine Form": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Great Wolves possess the basic form common to wolves. They have a rangy, muscular body set on high and powerful legs with large, well- padded feet. They have long snouts and massive, protruding jaws. Their fm is a crown of coarse guard hairs supported by a nigh-impermeable layer of soft under-fm. Their most prominent feature is, of course, their massive size. Great wolves stand three to five feet at the shoulder and can weigh 200-600 lbs. Great\\'b7 Wolves have a maximum exponent of 6 for Agility (from their lack of hands), other stat maximums are 8. Wolves Charge in Fight with a +2D bonus rather than the standard +1D." + }, + "Lupine Intellect": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Without a doubt, Great Wolves are intelligent creatures. They possess a personality and intellect equivalent to that of Men and Orcs. Never assume that just because he doesn't live in cities, write with a pen or eat with a knife, the wolf is a dumb brute. Far from it. In fact, many would attest to the fact that wolves possess a superior culture to that of Men! Even so, Great Wolves are not tool-using creatures. Though they understand a great many things, they generally don't use (or even need) tools to accomplish the tasks in their daily lives. Any wolf attempting to use tools like hammers, swords or scissors should suffer quadruple obstacle penalties." + }, + "Long-legged": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Great Wolves have a Stride of 11" + }, + "Wolf's Eyes": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Though vision is not their strongest sense, wolves do possess the advantage of being able to see well in low light. Wolves reduce obstacle penalties for dim light, darkness and haze by one step." + }, + "Woodland Ear": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "common" + ], + "desc": "Wolves have extraordinary hearing. The Woodland Ear allows wolves to discern different animal calls and add +1D to Perception tests for assesses, Tracking and Hunting. This bonus is also added to Perception for determining Reflexes. This trait counts as Observation when combined with Wolf's Snout." + }, + "Ancestral Taint": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Spirit Hunters are said to be the Chosen Ones of the Great Grandfather- chosen to take up his eternal struggle against the spirits, speech-twisters, and demons that seek to overcome wolf-kind. Once a wolf begins to sing the howls of the Spirit Hunters, he grows closer to the Great Grandfather; in fact he begins to take on a bit of his essence. The more the Spirit-Howler sings the ancient songs, the more the Taint grows within him. See the Ancestral Taint Mechanics in the Spirit Hunter section for more on this." + }, + "Broken Wolf": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Wolves who are captured by Men or Orcs are broken into the ways of their new masters. More than just being submissive, wolves with the Broken trait obey the strange laws and requirements of their new Dominants. -1 to Will exponent when accepting commands or a Duel of Wits from a Dominant." + }, + "Brutality": { + "cost": 0, + "type": "call_on", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Black Destroyers react to challenges with a ferocity and brutality far above what is necessary or even appropriate. This brutality has garnered them quite a both within the Legion and without. Use this trait as a call-on for Intimidation." + }, + "Demented": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Wolves born to the Legion are different from their wild brethren. They are twisted and unbalanced-quick to anger and too quick to kill. Wild Wolves find them disturbing and uncouth." + }, + "Dominant": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "There are only ever two Dominants in a pack, a male and female pair. These two serve as the mother and father of the group, guiding them to new hunting grounds and producing more offspring to strengthen and expand the pack. This trait grants a 1D affiliation with a pack and a 1D reputation within that pack as a Dominant." + }, + "Great Cunning": { + "cost": 0, + "type": "call_on", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Ebon Tyrants are the Dominants of the vast Black Destroyer packs. More than just savage1y and brutality are required to attain this rank. Great Cunning is a necessity. This trait acts as a call-on for Strategy, Tactics, and any \"wise\" tested for insight." + }, + "Howl Of Doom": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Together the wolf and rider howl, stabbing their victims with cold fear as they charge. The Wolf can howl and force his enemies to make a Steel test\\'97add +4D to the Intimidation test when using the Howl of Doom. This Howl requires 2 actions to perform and cannot be done on the charge\\'97it must be done beforehand. In Range and Cover, it positions with 2D. In Fight it counts as the Longest weapon." + }, + "Odor Of Spirits": { + "cost": 0, + "type": "character", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "This woif stinks of spirits. The packs shun him, and the Spirit Hunters harry him. Only the Haunts and Ghosts accept him." + }, + "Piercing Gaze": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "The eyes of Ghost of the Deeping Wood burn like glittering coals. This trait is a call-on for Intimidation. Also, anyone attempting to deceive the wolf (using Falsehood, Persuasion, Soothing Platitudes) is at a +1 Ob. Burning flames flash implacably behind his eyes and hint at the terrible fate of liars." + }, + "Preternaturally Calm": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Ghosts of the Deeping Wood possess a calmness that rivals the most serene glade on a starry summer night. Reduce Hesitation by 2.", + "bonus": [ + { + "target": [ + "+attr", + "hesitation" + ], + "value": [ + "+add", + -2 + ] + } + ] + }, + "Wolfish Scavenger": { + "cost": 0, + "type": "call_on", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "This wolf has a nose for finding all sorts of odd bits. This is a call-on for the Scavenger or Foraging skills." + }, + "Spirit Ears": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Spirit-Howlers become attuned to the spirit world as their Taint grows. A wolf with this trait has the ability to hear those of the spirit-nature. Counts as Observation for detecting the movements of spirits, demons and other creatures of spirit nature. Obstacle to detect spirits is 10 minus their Strength. Wolves may use their Woodland Ear in combination with this Trait, but not their Wolf's Snout." + }, + "Spirit Nose": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "The Taint suffuses the Spirit Hunter. Using his Spirit Nose he may add his Wolf's Snout to detect spirits (as Spirit Ears above). Also, Spirit Nose allows Spirit Hunters to Track spirits, even those who leave no marks or do not touch the ground. Use the obstacles listed with the Tracking skill and be creative." + }, + "Stained": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "The Last Wolf is the scapegoat of the pack. All of the anger and frustration is taken out on his hide. No matter how he elevates himself throughout his life, the Last Wolf always bears this stain on his very heart. This trait grants a 1D reputation as a Last Wolf." + }, + "Stink Of The Ancient": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Great Wolves can smell a Ghost when he is near. His scent is distinct, a mix of Ancient Ways and twisted speech that covers his coat like the blood of the hunted. This stink causes fear, trepidation and even hatred in Great Wolves. They do not look kindly upon one who so tampers with the will of the Grandfather. This trait grans a 1D infamous reputation among the packs as a Ghost of the Deeping Wood." + }, + "Submissive": { + "cost": 0, + "type": "die", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Wolves learn to submit a Dominant wolf at a very young age. Any wolf in the pack who is not part of the Dominant pair is Submissive. These wolves follow the lead of their superiors and often beg for certain permissions, including permission to eat from a kill. Being Submissive in the pack connotes no weakness. It merely shows that the wolf understands the natural order of things. This trait grants a 1D affiliation with a pack or a free relationship with a master/dominant character. Prominent Submissive behaviors include: looking away from the Dominant's gaze, crouching with head to the ground before the Dominant, rolling over and exposing the belly to the Dominant, and nibbling or licking the Dominant's chin. Lastly, wolves may possess both the Dominant and Submissive traits. These wolves will rule their pack they rightly should, but might also submit to stronger Dominants -- be they wolf, Man or Orc." + }, + "Wanderlust": { + "cost": 0, + "type": "character", + "restrict": [ + "wolfish", + "lifepath" + ], + "desc": "Lone Wolves tend to be overtaken by a wanderlust when they leave their packs. They roam the deep and dark woods, high mountains, lonely tundras and long paths in of a mate, a territory or even darker secrets." + }, + "Aura Of Terror": { + "cost": 6, + "type": "character", + "restrict": [ + "wolfish", + "special" + ], + "desc": "Ancient fear rolls off this wolf in waves. Add +2D to Intimidation tests." + }, + "Changeling Coat": { + "cost": 3, + "type": "character", + "restrict": [ + "wolfish", + "special" + ], + "desc": "This wolf was born to be a trickster. His coat shifts patterns and colors at will. Add +1D to Stealthy and Inconspicuous tests." + }, + "Chosen Wolf": { + "cost": 3, + "type": "character", + "restrict": [ + "wolfish", + "special" + ], + "desc": "Only certain wolves are chosen to become Spirit Hunters. On certain nights in the dead of winter, the Spirit Hunters will come to the territories and seek out lone wolves. Those who are chosen receive a special scent and are marked to become Spirit Hunters. This trait is required to be able to take the Spirit-Chaser lifepath. It grants a lD affiliation with the Spirit Hunters." + }, + "Fearsome Beast": { + "cost": 2, + "type": "call_on", + "restrict": [ + "wolfish", + "special" + ], + "desc": "There is something odd and unsettling about this wolf-something very old and frightening. Use this trait as a call-on for Intimidation." + }, + "Frost Coat": { + "cost": 2, + "type": "call_on", + "restrict": [ + "wolfish", + "special" + ], + "desc": "The pelt of this wolf is like glittering ice. Use this trait as a call-on for Stealthy when stalking the tundra and arctic wastes." + }, + "Ghost Coat": { + "cost": 4, + "type": "call_on", + "restrict": [ + "wolfish", + "special" + ], + "desc": "This wolf's coat shifts subtly from dark to light, from mottled to clear, depending on what land he stalks and haunts. Use this for a call-on for Stealthy in any terrain." + }, + "Mangy Coat": { + "cost": 1, + "type": "character", + "restrict": [ + "wolfish", + "special" + ], + "desc": "This wolf's fur is rough, tangled, unkempt, and even balding in some places." + }, + "Mark Of The Ancient": { + "cost": 5, + "type": "die", + "restrict": [ + "wolfish", + "special" + ], + "desc": "Some pups are born with a certain mark, which is often considered shameful by the packs. Such rare wolves are descendants from the Ancient, the first wolf who created the world. The packs believe such wolves are cursed and destined for a life of mayhem. This trait is required for using the skills Tongue of the Ancient and Ancient Ways." + }, + "Formidable Bark": { + "cost": 2, + "type": "call_on", + "restrict": [ + "wolfish", + "special" + ], + "desc": "The voice of this wolf is strong and clear, easily piercing the dense woods and cutting through dampening fog. Use this trait as a call-on for Howling and Command. Combined with Fearsome Beast, this trait adds +1D to all Intimidation tests." + }, + "Raven-friend": { + "cost": 1, + "type": "die", + "restrict": [ + "wolfish", + "special" + ], + "desc": "Wolves and ravens have a special relationship. Not only do they aid one another on the hunt-ravens will circle a herd to mark it for wolves, and wolves will allow ravens to feed at their kills -- they are also great friends. Wolves and ravens enjoy taunting each other and playing endless and dangerous games of tag. This trait grants either a free relationship with a raven or a 1D affiliation with a conspiracy of ravens. This trait signifies a wolf who is especially fond of ravens and who is well thought of by the birds. While the whole pack may play, he is the only pack member who can understand the quacks and squawks of raven speech." + }, + "Shadow Coat": { + "cost": 2, + "type": "call_on", + "restrict": [ + "wolfish", + "special" + ], + "desc": "The form of this wolf is perfectly suited to stalking in the shadows of the woods. Use this trait as a call-on for Stealthy when stalking the forests and valleys." + } +} \ No newline at end of file diff --git a/src/lib/cache.rb b/src/lib/cache.rb new file mode 100755 index 0000000..83dcb35 --- /dev/null +++ b/src/lib/cache.rb @@ -0,0 +1,230 @@ +# A really simple MRU cache, especially for session[:id] so we don't have +# to go to Couch to get the account information. +# +# In you Sinatra app, simple declare this in your application +# +# def self.cache +# @@cache ||= Mu::Cache.new :max_size => 1024, :max_time => 30.0 +# end +# +# and then wrap your cachable Couch-queries or HAML fragments with +# +# Application.cache.fetch session[:id] do +# couch.get session[:id] rescue nil +# end +module Mu +class Cache + # Each entry in the cache that simultaneously exists both in the + # hash as well in the list below giving us O(1) deletes + class Entry + attr_accessor :key, :val, :next, :prev, :time + + def initialize key=nil, val=nil + @time = Time.now + @key = key + @val = val + end + + def inspect + "#" + end + end + + # A simple doubly-linked list of entries with basic operations to + # push/pop/shift and delete a specific entry. + class List + attr_reader :head + attr_reader :tail + + def push entry + if not @tail + @head = @tail = entry + else + @tail.next = entry + entry.prev = @tail + entry.next = nil + @tail = entry + end + end + + alias_method :<<, :push + + def pop + return nil if not @tail + + entry = @tail + @tail = entry.prev + if @tail + @tail.next = nil + else + @head = nil + end + + entry.next = nil + entry.prev = nil + return entry + end + + def shift + return nil if not @head + + entry = @head + @head = entry.next + if @head + @head.prev = nil + else + @tail = nil + end + + entry.next = nil + entry.prev = nil + return entry + end + + def delete entry + if not entry.prev and not entry.next + @head = @tail = nil + return + end + + if not entry.prev and entry.next + @head = entry.next + entry.next.prev = nil + entry.next = nil + return + end + + if entry.prev and not entry.next + @tail = entry.prev + entry.prev.next = nil + entry.prev = nil + return + end + + entry.prev.next = entry.next + entry.next.prev = entry.prev + entry.next = nil + entry.prev = nil + end + + def clear + @head = @tail = nil + end + end + + attr_reader :max_size, :max_time + + def initialize opts={} + @max_size = opts.fetch :max_size, 1024 + @max_time = opts.fetch :max_time, 1.0 + @hash = Hash.new + @list = List.new + end + + def clear + hash.clear + list.clear + end + + def size + hash.size + end + + # Forcefully delete an entry from the cache. Returns the value of the + # deleted key, if one exists. + def delete key + entry = hash.delete key + if entry + list.delete entry + return entry.val + end + return nil + end + + # Store the key => val into the cache. If it's already there, then just + # update the entry and move it to the back. Otherwise insert a new + # entry and move it to the back + def store key, val + purge + entry = hash[key] + if entry + update entry, val + else + insert key, val + end + return val + end + + def member? key + purge + hash.member? key + end + + alias_method :[]=, :store + + # Look up the key in the cache and if it's there refresh it. Otherwise + # yield to get the value and insert that into the cache. The usage is + # as follows: + # val = cache.fetch key do + # some expensive operation that returns val + # end + def fetch key, refresh=true, &block + purge + entry = hash[key] + + if entry + update entry if refresh + return entry.val + end + + val = yield rescue nil + return if not val + + insert key, val + return val + end + + private + + # If the cache is getting too long, then remove the oldest entry (which + # is in the front of the list) + def purge opts={} + size = opts.fetch :max_size, @max_size + time = opts.fetch :max_time, @max_time + + # Make sure that the cache doesn't grow beyond a certain size, no + # matter how recent the entries are + hash.delete list.shift.key while hash.size > size + + # Then purge entries in the list that've been there longer than a + # certain duration + now = Time.now + while not hash.empty? and now - list.head.time >= time + hash.delete list.shift.key + end + end + + # Update an entry with an optionally new value. This moves the the + # entry to the back of the queue so that it doesn't "expire" during + # the next purge. This also assumes that the entry is not present + # in the cache. + def update entry, val=nil + entry.time = Time.now + entry.val = val if val + list.delete entry + list << entry + return entry + end + + # Inserts a new entry to the "back" of the queue. This assumes that + # the entry does not already exist in the hash + def insert key, val + entry = Entry.new(key, val) + hash[key] = entry + list << entry + return entry + end + + attr_reader :hash, :list +end +end # Mu \ No newline at end of file diff --git a/src/lib/data.rb b/src/lib/data.rb new file mode 100755 index 0000000..dfbb97b --- /dev/null +++ b/src/lib/data.rb @@ -0,0 +1,46 @@ +require 'json' + +module CharredData + def self.load_wizard_burner(data) + + data + end + + def self.load_data + file = File.read('data/skills.json') + skills = JSON.parse(file) + + file = File.read('data/traits.json') + traits = JSON.parse(file) + + lifepaths = {} + resources = {} + stat_pts = {} + + stocks = ['dwarf', 'elf', 'man', 'orc', 'roden', 'wolf'] + + stocks.each do |stock| + file = File.read("data/lifepaths/#{stock}.json") + lifepaths[stock] = JSON.parse(file) + + file = File.read("data/resources/#{stock}.json") + resources[stock] = JSON.parse(file) + + file = File.read("data/starting_stat_pts/#{stock}.json") + stat_pts[stock] = JSON.parse(file) + end + + data = { + :stocks => stocks, + :skills => skills, + :traits => traits, + :lifepaths => lifepaths, + :resources => resources, + :stat_pts => stat_pts + } + + data = self.load_wizard_burner(data) + + data + end +end \ No newline at end of file diff --git a/src/lib/pdf.rb b/src/lib/pdf.rb new file mode 100755 index 0000000..17187a0 --- /dev/null +++ b/src/lib/pdf.rb @@ -0,0 +1,147 @@ +require 'prawn' +require 'prawn/templates' + +class CharSheet + def initialize(character) + @character = character + @t1 = 16 + @t2 = 12 + @t3 = 10 + end + + def render_skill(pdf, skilldef, at) + skill, shade, exponent = skilldef + x, y = at + + pdf.text_box skill, :at => [x, y + 10], :width => 95, :height => 15, :overflow => :shrink_to_fit, :valign => :bottom, :size => @t1 + + self.render_shade_exponent(pdf, shade, exponent, [x+101.5, y-0.8], 13.5, -0.2) + end + + def render_shade_exponent(pdf, shade, exponent, at, xs = 13, ys = 0.5) + x, y = at + pdf.draw_text shade, :at => [x, y], :size => @t2 + pdf.draw_text (exponent.to_s), :at => [x+xs, y+ys], :size => @t2 + end + + def render(logger) + pdf = Prawn::Document.new(:template => 'data/gold.pdf') + pdf.font 'data/caliban.ttf' + pdf.default_leading -4 + + logger.info @character + + <<-GRID + (0...40).each do |x| + (0...30).each do |y| + if x % 5 == 0 && y % 5 == 0 + pdf.stroke_color "ff0000" + else + pdf.stroke_color "cccccc" + end + pdf.stroke_circle [x * 20, y * 20], 1 + end + end + + pdf.go_to_page(2) + + (0...40).each do |x| + (0...30).each do |y| + if x % 5 == 0 && y % 5 == 0 + pdf.stroke_color "ff0000" + else + pdf.stroke_color "cccccc" + end + pdf.stroke_circle [x * 20, y * 20], 1 + end + end + GRID + + pdf.draw_text @character['name'], :at => [5, 490], :size => @t1 + pdf.draw_text @character['stock'].capitalize, :at => [84, 490], :size => @t1 + pdf.draw_text @character['age'], :at => [165, 490], :size => @t1 + pdf.text_box @character['lifepaths'].join(', '), :at => [245, 499], :width => 100, :size => @t2 + + character_traits = @character['traits'].select {|t| t[1] == 'character'}.map {|t| t[0] } + die_traits = @character['traits'].select {|t| t[1] == 'die'}.map {|t| t[0] } + call_on_traits = @character['traits'].select {|t| t[1] == 'call_on'}.map {|t| t[0] } + + pdf.text_box character_traits.join("\n"), :at => [5, 214], :width => 110, :size => @t2 + pdf.text_box die_traits.join("\n"), :at => [122, 214], :width => 110, :size => @t2 + pdf.text_box call_on_traits.join("\n"), :at => [241, 207], :width => 110, :size => @t2 + + gear = @character['gear'] + @character['property'] + #gear = gear.map {|g| g.split(', ').join(' - ') } + pdf.text_box gear.join(', '), :at => [30, 55], :width => 280, :size => @t2 + + relationships = @character['relationships'] + @character['reputations'] + @character['affiliations'] + pdf.text_box relationships.join("\n"), :at => [5, 136], :width => 80, :size => @t2 + + per_apt = 10 - @character['stats']['perception'][1] + wil_apt = 10 - @character['stats']['will'][1] + agi_apt = 10 - @character['stats']['agility'][1] + spd_apt = 10 - @character['stats']['speed'][1] + pow_apt = 10 - @character['stats']['power'][1] + for_apt = 10 - @character['stats']['forte'][1] + + pdf.draw_text per_apt, :at => [433, 207], :size => @t2 + pdf.draw_text wil_apt, :at => [482, 207], :size => @t2 + pdf.draw_text agi_apt, :at => [539, 207], :size => @t2 + pdf.draw_text spd_apt, :at => [593, 207], :size => @t2 + pdf.draw_text pow_apt, :at => [647, 207], :size => @t2 + pdf.draw_text for_apt, :at => [699, 207], :size => @t2 + + pdf.go_to_page(2) + + wil_stat = @character['stats']['will'] + per_stat = @character['stats']['perception'] + pow_stat = @character['stats']['power'] + for_stat = @character['stats']['forte'] + agi_stat = @character['stats']['agility'] + spd_stat = @character['stats']['speed'] + + self.render_shade_exponent(pdf, wil_stat[0], wil_stat[1], [54, 501]) + self.render_shade_exponent(pdf, per_stat[0], per_stat[1], [54, 462]) + self.render_shade_exponent(pdf, pow_stat[0], pow_stat[1], [166, 501]) + self.render_shade_exponent(pdf, for_stat[0], for_stat[1], [166, 462]) + self.render_shade_exponent(pdf, agi_stat[0], agi_stat[1], [276.5, 501]) + self.render_shade_exponent(pdf, spd_stat[0], spd_stat[1], [276.5, 462]) + + hlt_attr = @character['attributes']['health'] + stl_attr = @character['attributes']['steel'] + cir_attr = @character['attributes']['circles'] + res_attr = @character['attributes']['resources'] + ref_attr = @character['attributes']['reflexes'] + mor_attr = @character['attributes']['mortal wound'] + str_attr = @character['attributes']['stride'] + hes_attr = @character['attributes']['hesitation'] + + self.render_shade_exponent(pdf, hlt_attr[0], hlt_attr[1], [52, 396.5]) + self.render_shade_exponent(pdf, stl_attr[0], stl_attr[1], [52, 351.5]) + self.render_shade_exponent(pdf, cir_attr[0], cir_attr[1], [54, 296]) + self.render_shade_exponent(pdf, res_attr[0], res_attr[1], [54, 249.5]) + self.render_shade_exponent(pdf, ref_attr[0], ref_attr[1], [279, 396.5]) + self.render_shade_exponent(pdf, mor_attr[0], mor_attr[1], [278.5, 346]) + + pdf.draw_text str_attr[1], :at => [264, 428], :size => @t2 + pdf.draw_text hes_attr[1], :at => [53, 318], :size => @t2 + + + skills_left = @character['skills'][0...13] + skills_right = @character['skills'][13...26] + + if skills_left + skills_left.each_with_index do |s, i| + self.render_skill(pdf, s, [372, 495 - (i*20.3)]) + end + end + + if skills_right + skills_right.each_with_index do |s, i| + self.render_skill(pdf, s, [551, 495 - (i*20.3)]) + end + end + + pdf.render + end +end diff --git a/src/public/css/bootstrap.min.css b/src/public/css/bootstrap.min.css new file mode 100755 index 0000000..3deec34 --- /dev/null +++ b/src/public/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v3.0.2 by @fat and @mdo + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#c09853}.text-warning:hover{color:#a47e3c}.text-danger{color:#b94a48}.text-danger:hover{color:#953b39}.text-success{color:#468847}.text-success:hover{color:#356635}.text-info{color:#3a87ad}.text-info:hover{color:#2d6987}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.container{width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.container{width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.container{width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .open>a .caret,.nav .open>a:hover .caret,.nav .open>a:focus .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-pills>li.active>a .caret,.nav-pills>li.active>a:hover .caret,.nav-pills>li.active>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:auto}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-heading>.dropdown .caret{border-color:#333 transparent}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-heading>.dropdown .caret{border-color:#fff transparent}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading>.dropdown .caret{border-color:#468847 transparent}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading>.dropdown .caret{border-color:#c09853 transparent}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading>.dropdown .caret{border-color:#b94a48 transparent}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading>.dropdown .caret{border-color:#3a87ad transparent}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/src/public/css/style.css b/src/public/css/style.css new file mode 100755 index 0000000..583bba6 --- /dev/null +++ b/src/public/css/style.css @@ -0,0 +1,129 @@ +.container { + margin-top: 0.5em; +} + +@font-face { + font-family: "Post Mediaeval"; + src: url("/fonts/post-mediaeval.ttf") format("truetype"); +} + +.navbar-default { + background: linear-gradient(0deg, #000000, #333333); + +} + +.navbar-default .navbar-brand { + font-family: "Post Mediaeval", sans-serif; + color: #D5AD6D; /*if no support for background-clip*/ + background: -webkit-linear-gradient(transparent, transparent), +-webkit-linear-gradient(top, rgba(213,173,109,1) 0%, rgba(213,173,109,1) 26%, rgba(226,186,120,1) 35%, rgba(163,126,67,1) 45%, rgba(145,112,59,1) 61%, rgba(213,173,109,1) 100%); + background: -o-linear-gradient(transparent, transparent); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + letter-spacing: 0.3px; +} + +.navbar-default .navbar-nav a { + color: #FFFFFF !important; +} + +.navbar-default .navbar-nav a:hover { + color: #CCCCCC !important; +} + +.panel-heading +{ + background-color: #F5F5F5; +} + +.panel-heading h4 +{ + font-size: 1.5em; +} + +.highlight +{ + background-color: #ff0000; +} + +/* Make iframes invisible. */ +iframe +{ + width: 0px; + height: 0px; + border: 0px solid #000000; +} + +/* See http://www.abeautifulsite.net/blog/2013/08/whipping-file-inputs-into-shape-with-bootstrap-3/ */ +.btn-file { + position: relative; + overflow: hidden; +} +.btn-file input[type=file] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 999px; + text-align: right; + filter: alpha(opacity=0); + opacity: 0; + background: red; + cursor: inherit; + display: block; +} +input[readonly] { + background-color: white !important; + cursor: text !important; +} + + +/* Code for making Table of Contents work on help page */ +#toc.nav-tabs{ + /*width: 140px;*/ + margin-top: 20px; + border-radius: 4px; + border: 1px solid #ddd; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.067); +} +#toc.nav-tabs li{ + margin: 0; + border-top: 1px solid #ddd; +} +#toc.nav-tabs li:first-child{ + border-top: none; +} +#toc.nav-tabs li a{ + margin: 0; + padding: 8px 16px; + border-radius: 0; +} +#toc.nav-tabs li.active a, #toc.nav-tabs li.active a:hover{ + color: #fff; + background: #0088cc; + border: 1px solid #0088cc; +} +#toc.nav-tabs li:first-child a{ + border-radius: 4px 4px 0 0; +} +#toc.nav-tabs li:last-child a{ + border-radius: 0 0 4px 4px; +} +#toc.nav-tabs.affix{ + top: 30px; /* Set the top position of pinned element */ +} + +/* help page */ +/* +#help p +{ + padding-left: 1em; +} +*/ + +#versiontext +{ + color: #808080; + font-size: 10px; +} diff --git a/src/public/fonts/post-mediaeval.ttf b/src/public/fonts/post-mediaeval.ttf new file mode 100755 index 0000000000000000000000000000000000000000..6a83d1db95677dc306efaa5a9a1ef87c557a9074 GIT binary patch literal 113072 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 literal 0 HcmV?d00001 diff --git a/src/public/js/angular-resource.js b/src/public/js/angular-resource.js new file mode 100755 index 0000000..7014984 --- /dev/null +++ b/src/public/js/angular-resource.js @@ -0,0 +1,610 @@ +/** + * @license AngularJS v1.2.16 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +var $resourceMinErr = angular.$$minErr('$resource'); + +// Helper functions and regex to lookup a dotted path on an object +// stopping at undefined/null. The path must be composed of ASCII +// identifiers (just like $parse) +var MEMBER_NAME_REGEX = /^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/; + +function isValidDottedPath(path) { + return (path != null && path !== '' && path !== 'hasOwnProperty' && + MEMBER_NAME_REGEX.test('.' + path)); +} + +function lookupDottedPath(obj, path) { + if (!isValidDottedPath(path)) { + throw $resourceMinErr('badmember', 'Dotted member path "@{0}" is invalid.', path); + } + var keys = path.split('.'); + for (var i = 0, ii = keys.length; i < ii && obj !== undefined; i++) { + var key = keys[i]; + obj = (obj !== null) ? obj[key] : undefined; + } + return obj; +} + +/** + * Create a shallow copy of an object and clear other fields from the destination + */ +function shallowClearAndCopy(src, dst) { + dst = dst || {}; + + angular.forEach(dst, function(value, key){ + delete dst[key]; + }); + + for (var key in src) { + if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + + return dst; +} + +/** + * @ngdoc module + * @name ngResource + * @description + * + * # ngResource + * + * The `ngResource` module provides interaction support with RESTful services + * via the $resource service. + * + * + *

+ * + * See {@link ngResource.$resource `$resource`} for usage. + */ + +/** + * @ngdoc service + * @name $resource + * @requires $http + * + * @description + * A factory which creates a resource object that lets you interact with + * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources. + * + * The returned resource object has action methods which provide high-level behaviors without + * the need to interact with the low level {@link ng.$http $http} service. + * + * Requires the {@link ngResource `ngResource`} module to be installed. + * + * @param {string} url A parametrized URL template with parameters prefixed by `:` as in + * `/user/:username`. If you are using a URL with a port number (e.g. + * `http://example.com:8080/api`), it will be respected. + * + * If you are using a url with a suffix, just add the suffix, like this: + * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')` + * or even `$resource('http://example.com/resource/:resource_id.:format')` + * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be + * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you + * can escape it with `/\.`. + * + * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in + * `actions` methods. If any of the parameter value is a function, it will be executed every time + * when a param value needs to be obtained for a request (unless the param was overridden). + * + * Each key value in the parameter object is first bound to url template if present and then any + * excess keys are appended to the url search query after the `?`. + * + * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in + * URL `/path/greet?salutation=Hello`. + * + * If the parameter value is prefixed with `@` then the value of that parameter is extracted from + * the data object (useful for non-GET operations). + * + * @param {Object.=} actions Hash with declaration of custom action that should extend + * the default set of resource actions. The declaration should be created in the format of {@link + * ng.$http#usage_parameters $http.config}: + * + * {action1: {method:?, params:?, isArray:?, headers:?, ...}, + * action2: {method:?, params:?, isArray:?, headers:?, ...}, + * ...} + * + * Where: + * + * - **`action`** – {string} – The name of action. This name becomes the name of the method on + * your resource object. + * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, + * `DELETE`, and `JSONP`. + * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of + * the parameter value is a function, it will be executed every time when a param value needs to + * be obtained for a request (unless the param was overridden). + * - **`url`** – {string} – action specific `url` override. The url templating is supported just + * like for the resource-level urls. + * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, + * see `returns` section. + * - **`transformRequest`** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * - **`transformResponse`** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body and headers and returns its transformed (typically deserialized) version. + * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that + * should abort the request when resolved. + * - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See + * [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5) + * for more information. + * - **`responseType`** - `{string}` - see + * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType). + * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods - + * `response` and `responseError`. Both `response` and `responseError` interceptors get called + * with `http response` object. See {@link ng.$http $http interceptors}. + * + * @returns {Object} A resource "class" object with methods for the default set of resource actions + * optionally extended with custom `actions`. The default set contains these actions: + * ```js + * { 'get': {method:'GET'}, + * 'save': {method:'POST'}, + * 'query': {method:'GET', isArray:true}, + * 'remove': {method:'DELETE'}, + * 'delete': {method:'DELETE'} }; + * ``` + * + * Calling these methods invoke an {@link ng.$http} with the specified http method, + * destination and parameters. When the data is returned from the server then the object is an + * instance of the resource class. The actions `save`, `remove` and `delete` are available on it + * as methods with the `$` prefix. This allows you to easily perform CRUD operations (create, + * read, update, delete) on server-side data like this: + * ```js + * var User = $resource('/user/:userId', {userId:'@id'}); + * var user = User.get({userId:123}, function() { + * user.abc = true; + * user.$save(); + * }); + * ``` + * + * It is important to realize that invoking a $resource object method immediately returns an + * empty reference (object or array depending on `isArray`). Once the data is returned from the + * server the existing reference is populated with the actual data. This is a useful trick since + * usually the resource is assigned to a model which is then rendered by the view. Having an empty + * object results in no rendering, once the data arrives from the server then the object is + * populated with the data and the view automatically re-renders itself showing the new data. This + * means that in most cases one never has to write a callback function for the action methods. + * + * The action methods on the class object or instance object can be invoked with the following + * parameters: + * + * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])` + * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])` + * - non-GET instance actions: `instance.$action([parameters], [success], [error])` + * + * Success callback is called with (value, responseHeaders) arguments. Error callback is called + * with (httpResponse) argument. + * + * Class actions return empty instance (with additional properties below). + * Instance actions return promise of the action. + * + * The Resource instances and collection have these additional properties: + * + * - `$promise`: the {@link ng.$q promise} of the original server interaction that created this + * instance or collection. + * + * On success, the promise is resolved with the same resource instance or collection object, + * updated with data from server. This makes it easy to use in + * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view + * rendering until the resource(s) are loaded. + * + * On failure, the promise is resolved with the {@link ng.$http http response} object, without + * the `resource` property. + * + * If an interceptor object was provided, the promise will instead be resolved with the value + * returned by the interceptor. + * + * - `$resolved`: `true` after first server interaction is completed (either with success or + * rejection), `false` before that. Knowing if the Resource has been resolved is useful in + * data-binding. + * + * @example + * + * # Credit card resource + * + * ```js + // Define CreditCard class + var CreditCard = $resource('/user/:userId/card/:cardId', + {userId:123, cardId:'@id'}, { + charge: {method:'POST', params:{charge:true}} + }); + + // We can retrieve a collection from the server + var cards = CreditCard.query(function() { + // GET: /user/123/card + // server returns: [ {id:456, number:'1234', name:'Smith'} ]; + + var card = cards[0]; + // each item is an instance of CreditCard + expect(card instanceof CreditCard).toEqual(true); + card.name = "J. Smith"; + // non GET methods are mapped onto the instances + card.$save(); + // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'} + // server returns: {id:456, number:'1234', name: 'J. Smith'}; + + // our custom method is mapped as well. + card.$charge({amount:9.99}); + // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'} + }); + + // we can create an instance as well + var newCard = new CreditCard({number:'0123'}); + newCard.name = "Mike Smith"; + newCard.$save(); + // POST: /user/123/card {number:'0123', name:'Mike Smith'} + // server returns: {id:789, number:'0123', name: 'Mike Smith'}; + expect(newCard.id).toEqual(789); + * ``` + * + * The object returned from this function execution is a resource "class" which has "static" method + * for each action in the definition. + * + * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and + * `headers`. + * When the data is returned from the server then the object is an instance of the resource type and + * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD + * operations (create, read, update, delete) on server-side data. + + ```js + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}, function(user) { + user.abc = true; + user.$save(); + }); + ``` + * + * It's worth noting that the success callback for `get`, `query` and other methods gets passed + * in the response that came from the server as well as $http header getter function, so one + * could rewrite the above example and get access to http headers as: + * + ```js + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}, function(u, getResponseHeaders){ + u.abc = true; + u.$save(function(u, putResponseHeaders) { + //u => saved user object + //putResponseHeaders => $http header getter + }); + }); + ``` + * + * You can also access the raw `$http` promise via the `$promise` property on the object returned + * + ``` + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}) + .$promise.then(function(user) { + $scope.user = user; + }); + ``` + + * # Creating a custom 'PUT' request + * In this example we create a custom method on our resource to make a PUT request + * ```js + * var app = angular.module('app', ['ngResource', 'ngRoute']); + * + * // Some APIs expect a PUT request in the format URL/object/ID + * // Here we are creating an 'update' method + * app.factory('Notes', ['$resource', function($resource) { + * return $resource('/notes/:id', null, + * { + * 'update': { method:'PUT' } + * }); + * }]); + * + * // In our controller we get the ID from the URL using ngRoute and $routeParams + * // We pass in $routeParams and our Notes factory along with $scope + * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes', + function($scope, $routeParams, Notes) { + * // First get a note object from the factory + * var note = Notes.get({ id:$routeParams.id }); + * $id = note.id; + * + * // Now call update passing in the ID first then the object you are updating + * Notes.update({ id:$id }, note); + * + * // This will PUT /notes/ID with the note object in the request payload + * }]); + * ``` + */ +angular.module('ngResource', ['ng']). + factory('$resource', ['$http', '$q', function($http, $q) { + + var DEFAULT_ACTIONS = { + 'get': {method:'GET'}, + 'save': {method:'POST'}, + 'query': {method:'GET', isArray:true}, + 'remove': {method:'DELETE'}, + 'delete': {method:'DELETE'} + }; + var noop = angular.noop, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy, + isFunction = angular.isFunction; + + /** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); + } + + + /** + * This method is intended for encoding *key* or *value* parts of query component. We need a + * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't + * have to be encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); + } + + function Route(template, defaults) { + this.template = template; + this.defaults = defaults || {}; + this.urlParams = {}; + } + + Route.prototype = { + setUrlParams: function(config, params, actionUrl) { + var self = this, + url = actionUrl || self.template, + val, + encodedVal; + + var urlParams = self.urlParams = {}; + forEach(url.split(/\W/), function(param){ + if (param === 'hasOwnProperty') { + throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name."); + } + if (!(new RegExp("^\\d+$").test(param)) && param && + (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) { + urlParams[param] = true; + } + }); + url = url.replace(/\\:/g, ':'); + + params = params || {}; + forEach(self.urlParams, function(_, urlParam){ + val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; + if (angular.isDefined(val) && val !== null) { + encodedVal = encodeUriSegment(val); + url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) { + return encodedVal + p1; + }); + } else { + url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match, + leadingSlashes, tail) { + if (tail.charAt(0) == '/') { + return tail; + } else { + return leadingSlashes + tail; + } + }); + } + }); + + // strip trailing slashes and set the url + url = url.replace(/\/+$/, '') || '/'; + // then replace collapse `/.` if found in the last URL path segment before the query + // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x` + url = url.replace(/\/\.(?=\w+($|\?))/, '.'); + // replace escaped `/\.` with `/.` + config.url = url.replace(/\/\\\./, '/.'); + + + // set params - delegate param encoding to $http + forEach(params, function(value, key){ + if (!self.urlParams[key]) { + config.params = config.params || {}; + config.params[key] = value; + } + }); + } + }; + + + function resourceFactory(url, paramDefaults, actions) { + var route = new Route(url); + + actions = extend({}, DEFAULT_ACTIONS, actions); + + function extractParams(data, actionParams){ + var ids = {}; + actionParams = extend({}, paramDefaults, actionParams); + forEach(actionParams, function(value, key){ + if (isFunction(value)) { value = value(); } + ids[key] = value && value.charAt && value.charAt(0) == '@' ? + lookupDottedPath(data, value.substr(1)) : value; + }); + return ids; + } + + function defaultResponseInterceptor(response) { + return response.resource; + } + + function Resource(value){ + shallowClearAndCopy(value || {}, this); + } + + forEach(actions, function(action, name) { + var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method); + + Resource[name] = function(a1, a2, a3, a4) { + var params = {}, data, success, error; + + /* jshint -W086 */ /* (purposefully fall through case statements) */ + switch(arguments.length) { + case 4: + error = a4; + success = a3; + //fallthrough + case 3: + case 2: + if (isFunction(a2)) { + if (isFunction(a1)) { + success = a1; + error = a2; + break; + } + + success = a2; + error = a3; + //fallthrough + } else { + params = a1; + data = a2; + success = a3; + break; + } + case 1: + if (isFunction(a1)) success = a1; + else if (hasBody) data = a1; + else params = a1; + break; + case 0: break; + default: + throw $resourceMinErr('badargs', + "Expected up to 4 arguments [params, data, success, error], got {0} arguments", + arguments.length); + } + /* jshint +W086 */ /* (purposefully fall through case statements) */ + + var isInstanceCall = this instanceof Resource; + var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data)); + var httpConfig = {}; + var responseInterceptor = action.interceptor && action.interceptor.response || + defaultResponseInterceptor; + var responseErrorInterceptor = action.interceptor && action.interceptor.responseError || + undefined; + + forEach(action, function(value, key) { + if (key != 'params' && key != 'isArray' && key != 'interceptor') { + httpConfig[key] = copy(value); + } + }); + + if (hasBody) httpConfig.data = data; + route.setUrlParams(httpConfig, + extend({}, extractParams(data, action.params || {}), params), + action.url); + + var promise = $http(httpConfig).then(function(response) { + var data = response.data, + promise = value.$promise; + + if (data) { + // Need to convert action.isArray to boolean in case it is undefined + // jshint -W018 + if (angular.isArray(data) !== (!!action.isArray)) { + throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected ' + + 'response to contain an {0} but got an {1}', + action.isArray?'array':'object', angular.isArray(data)?'array':'object'); + } + // jshint +W018 + if (action.isArray) { + value.length = 0; + forEach(data, function(item) { + value.push(new Resource(item)); + }); + } else { + shallowClearAndCopy(data, value); + value.$promise = promise; + } + } + + value.$resolved = true; + + response.resource = value; + + return response; + }, function(response) { + value.$resolved = true; + + (error||noop)(response); + + return $q.reject(response); + }); + + promise = promise.then( + function(response) { + var value = responseInterceptor(response); + (success||noop)(value, response.headers); + return value; + }, + responseErrorInterceptor); + + if (!isInstanceCall) { + // we are creating instance / collection + // - set the initial promise + // - return the instance / collection + value.$promise = promise; + value.$resolved = false; + + return value; + } + + // instance call + return promise; + }; + + + Resource.prototype['$' + name] = function(params, success, error) { + if (isFunction(params)) { + error = success; success = params; params = {}; + } + var result = Resource[name].call(this, params, this, success, error); + return result.$promise || result; + }; + }); + + Resource.bind = function(additionalParamDefaults){ + return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions); + }; + + return Resource; + } + + return resourceFactory; + }]); + + +})(window, window.angular); diff --git a/src/public/js/angular-route.js b/src/public/js/angular-route.js new file mode 100755 index 0000000..f7ebda8 --- /dev/null +++ b/src/public/js/angular-route.js @@ -0,0 +1,927 @@ +/** + * @license AngularJS v1.2.16 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/** + * @ngdoc module + * @name ngRoute + * @description + * + * # ngRoute + * + * The `ngRoute` module provides routing and deeplinking services and directives for angular apps. + * + * ## Example + * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`. + * + * + *
+ */ + /* global -ngRouteModule */ +var ngRouteModule = angular.module('ngRoute', ['ng']). + provider('$route', $RouteProvider); + +/** + * @ngdoc provider + * @name $routeProvider + * @function + * + * @description + * + * Used for configuring routes. + * + * ## Example + * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`. + * + * ## Dependencies + * Requires the {@link ngRoute `ngRoute`} module to be installed. + */ +function $RouteProvider(){ + function inherit(parent, extra) { + return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra); + } + + var routes = {}; + + /** + * @ngdoc method + * @name $routeProvider#when + * + * @param {string} path Route path (matched against `$location.path`). If `$location.path` + * contains redundant trailing slash or is missing one, the route will still match and the + * `$location.path` will be updated to add or drop the trailing slash to exactly match the + * route definition. + * + * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up + * to the next slash are matched and stored in `$routeParams` under the given `name` + * when the route matches. + * * `path` can contain named groups starting with a colon and ending with a star: + * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name` + * when the route matches. + * * `path` can contain optional named groups with a question mark: e.g.`:name?`. + * + * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match + * `/color/brown/largecode/code/with/slashes/edit` and extract: + * + * * `color: brown` + * * `largecode: code/with/slashes`. + * + * + * @param {Object} route Mapping information to be assigned to `$route.current` on route + * match. + * + * Object properties: + * + * - `controller` – `{(string|function()=}` – Controller fn that should be associated with + * newly created scope or the name of a {@link angular.Module#controller registered + * controller} if passed as a string. + * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be + * published to scope under the `controllerAs` name. + * - `template` – `{string=|function()=}` – html template as a string or a function that + * returns an html template as a string which should be used by {@link + * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives. + * This property takes precedence over `templateUrl`. + * + * If `template` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html + * template that should be used by {@link ngRoute.directive:ngView ngView}. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `resolve` - `{Object.=}` - An optional map of dependencies which should + * be injected into the controller. If any of these dependencies are promises, the router + * will wait for them all to be resolved or one to be rejected before the controller is + * instantiated. + * If all the promises are resolved successfully, the values of the resolved promises are + * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is + * fired. If any of the promises are rejected the + * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object + * is: + * + * - `key` – `{string}`: a name of a dependency to be injected into the controller. + * - `factory` - `{string|function}`: If `string` then it is an alias for a service. + * Otherwise if function, then it is {@link auto.$injector#invoke injected} + * and the return value is treated as the dependency. If the result is a promise, it is + * resolved before its value is injected into the controller. Be aware that + * `ngRoute.$routeParams` will still refer to the previous route within these resolve + * functions. Use `$route.current.params` to access the new route parameters, instead. + * + * - `redirectTo` – {(string|function())=} – value to update + * {@link ng.$location $location} path with and trigger route redirection. + * + * If `redirectTo` is a function, it will be called with the following parameters: + * + * - `{Object.}` - route parameters extracted from the current + * `$location.path()` by applying the current route templateUrl. + * - `{string}` - current `$location.path()` + * - `{Object}` - current `$location.search()` + * + * The custom `redirectTo` function is expected to return a string which will be used + * to update `$location.path()` and `$location.search()`. + * + * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()` + * or `$location.hash()` changes. + * + * If the option is set to `false` and url in the browser changes, then + * `$routeUpdate` event is broadcasted on the root scope. + * + * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive + * + * If the option is set to `true`, then the particular route can be matched without being + * case sensitive + * + * @returns {Object} self + * + * @description + * Adds a new route definition to the `$route` service. + */ + this.when = function(path, route) { + routes[path] = angular.extend( + {reloadOnSearch: true}, + route, + path && pathRegExp(path, route) + ); + + // create redirection for trailing slashes + if (path) { + var redirectPath = (path[path.length-1] == '/') + ? path.substr(0, path.length-1) + : path +'/'; + + routes[redirectPath] = angular.extend( + {redirectTo: path}, + pathRegExp(redirectPath, route) + ); + } + + return this; + }; + + /** + * @param path {string} path + * @param opts {Object} options + * @return {?Object} + * + * @description + * Normalizes the given path, returning a regular expression + * and the original path. + * + * Inspired by pathRexp in visionmedia/express/lib/utils.js. + */ + function pathRegExp(path, opts) { + var insensitive = opts.caseInsensitiveMatch, + ret = { + originalPath: path, + regexp: path + }, + keys = ret.keys = []; + + path = path + .replace(/([().])/g, '\\$1') + .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option){ + var optional = option === '?' ? option : null; + var star = option === '*' ? option : null; + keys.push({ name: key, optional: !!optional }); + slash = slash || ''; + return '' + + (optional ? '' : slash) + + '(?:' + + (optional ? slash : '') + + (star && '(.+?)' || '([^/]+)') + + (optional || '') + + ')' + + (optional || ''); + }) + .replace(/([\/$\*])/g, '\\$1'); + + ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : ''); + return ret; + } + + /** + * @ngdoc method + * @name $routeProvider#otherwise + * + * @description + * Sets route definition that will be used on route change when no other route definition + * is matched. + * + * @param {Object} params Mapping information to be assigned to `$route.current`. + * @returns {Object} self + */ + this.otherwise = function(params) { + this.when(null, params); + return this; + }; + + + this.$get = ['$rootScope', + '$location', + '$routeParams', + '$q', + '$injector', + '$http', + '$templateCache', + '$sce', + function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) { + + /** + * @ngdoc service + * @name $route + * @requires $location + * @requires $routeParams + * + * @property {Object} current Reference to the current route definition. + * The route definition contains: + * + * - `controller`: The controller constructor as define in route definition. + * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for + * controller instantiation. The `locals` contain + * the resolved values of the `resolve` map. Additionally the `locals` also contain: + * + * - `$scope` - The current route scope. + * - `$template` - The current route template HTML. + * + * @property {Object} routes Object with all route configuration Objects as its properties. + * + * @description + * `$route` is used for deep-linking URLs to controllers and views (HTML partials). + * It watches `$location.url()` and tries to map the path to an existing route definition. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API. + * + * The `$route` service is typically used in conjunction with the + * {@link ngRoute.directive:ngView `ngView`} directive and the + * {@link ngRoute.$routeParams `$routeParams`} service. + * + * @example + * This example shows how changing the URL hash causes the `$route` to match a route against the + * URL, and the `ngView` pulls in the partial. + * + * Note that this example is using {@link ng.directive:script inlined templates} + * to get it working on jsfiddle as well. + * + * + * + *
+ * Choose: + * Moby | + * Moby: Ch1 | + * Gatsby | + * Gatsby: Ch4 | + * Scarlet Letter
+ * + *
+ * + *
+ * + *
$location.path() = {{$location.path()}}
+ *
$route.current.templateUrl = {{$route.current.templateUrl}}
+ *
$route.current.params = {{$route.current.params}}
+ *
$route.current.scope.name = {{$route.current.scope.name}}
+ *
$routeParams = {{$routeParams}}
+ *
+ *
+ * + * + * controller: {{name}}
+ * Book Id: {{params.bookId}}
+ *
+ * + * + * controller: {{name}}
+ * Book Id: {{params.bookId}}
+ * Chapter Id: {{params.chapterId}} + *
+ * + * + * angular.module('ngRouteExample', ['ngRoute']) + * + * .controller('MainController', function($scope, $route, $routeParams, $location) { + * $scope.$route = $route; + * $scope.$location = $location; + * $scope.$routeParams = $routeParams; + * }) + * + * .controller('BookController', function($scope, $routeParams) { + * $scope.name = "BookController"; + * $scope.params = $routeParams; + * }) + * + * .controller('ChapterController', function($scope, $routeParams) { + * $scope.name = "ChapterController"; + * $scope.params = $routeParams; + * }) + * + * .config(function($routeProvider, $locationProvider) { + * $routeProvider + * .when('/Book/:bookId', { + * templateUrl: 'book.html', + * controller: 'BookController', + * resolve: { + * // I will cause a 1 second delay + * delay: function($q, $timeout) { + * var delay = $q.defer(); + * $timeout(delay.resolve, 1000); + * return delay.promise; + * } + * } + * }) + * .when('/Book/:bookId/ch/:chapterId', { + * templateUrl: 'chapter.html', + * controller: 'ChapterController' + * }); + * + * // configure html5 to get links working on jsfiddle + * $locationProvider.html5Mode(true); + * }); + * + * + * + * + * it('should load and compile correct template', function() { + * element(by.linkText('Moby: Ch1')).click(); + * var content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: ChapterController/); + * expect(content).toMatch(/Book Id\: Moby/); + * expect(content).toMatch(/Chapter Id\: 1/); + * + * element(by.partialLinkText('Scarlet')).click(); + * + * content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: BookController/); + * expect(content).toMatch(/Book Id\: Scarlet/); + * }); + * + *
+ */ + + /** + * @ngdoc event + * @name $route#$routeChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a route change. At this point the route services starts + * resolving all of the dependencies needed for the route change to occur. + * Typically this involves fetching the view template as well as any dependencies + * defined in `resolve` route property. Once all of the dependencies are resolved + * `$routeChangeSuccess` is fired. + * + * @param {Object} angularEvent Synthetic event object. + * @param {Route} next Future route information. + * @param {Route} current Current route information. + */ + + /** + * @ngdoc event + * @name $route#$routeChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a route dependencies are resolved. + * {@link ngRoute.directive:ngView ngView} listens for the directive + * to instantiate the controller and render the view. + * + * @param {Object} angularEvent Synthetic event object. + * @param {Route} current Current route information. + * @param {Route|Undefined} previous Previous route information, or undefined if current is + * first route entered. + */ + + /** + * @ngdoc event + * @name $route#$routeChangeError + * @eventType broadcast on root scope + * @description + * Broadcasted if any of the resolve promises are rejected. + * + * @param {Object} angularEvent Synthetic event object + * @param {Route} current Current route information. + * @param {Route} previous Previous route information. + * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise. + */ + + /** + * @ngdoc event + * @name $route#$routeUpdate + * @eventType broadcast on root scope + * @description + * + * The `reloadOnSearch` property has been set to false, and we are reusing the same + * instance of the Controller. + */ + + var forceReload = false, + $route = { + routes: routes, + + /** + * @ngdoc method + * @name $route#reload + * + * @description + * Causes `$route` service to reload the current route even if + * {@link ng.$location $location} hasn't changed. + * + * As a result of that, {@link ngRoute.directive:ngView ngView} + * creates new scope, reinstantiates the controller. + */ + reload: function() { + forceReload = true; + $rootScope.$evalAsync(updateRoute); + } + }; + + $rootScope.$on('$locationChangeSuccess', updateRoute); + + return $route; + + ///////////////////////////////////////////////////// + + /** + * @param on {string} current url + * @param route {Object} route regexp to match the url against + * @return {?Object} + * + * @description + * Check if the route matches the current url. + * + * Inspired by match in + * visionmedia/express/lib/router/router.js. + */ + function switchRouteMatcher(on, route) { + var keys = route.keys, + params = {}; + + if (!route.regexp) return null; + + var m = route.regexp.exec(on); + if (!m) return null; + + for (var i = 1, len = m.length; i < len; ++i) { + var key = keys[i - 1]; + + var val = 'string' == typeof m[i] + ? decodeURIComponent(m[i]) + : m[i]; + + if (key && val) { + params[key.name] = val; + } + } + return params; + } + + function updateRoute() { + var next = parseRoute(), + last = $route.current; + + if (next && last && next.$$route === last.$$route + && angular.equals(next.pathParams, last.pathParams) + && !next.reloadOnSearch && !forceReload) { + last.params = next.params; + angular.copy(last.params, $routeParams); + $rootScope.$broadcast('$routeUpdate', last); + } else if (next || last) { + forceReload = false; + $rootScope.$broadcast('$routeChangeStart', next, last); + $route.current = next; + if (next) { + if (next.redirectTo) { + if (angular.isString(next.redirectTo)) { + $location.path(interpolate(next.redirectTo, next.params)).search(next.params) + .replace(); + } else { + $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search())) + .replace(); + } + } + } + + $q.when(next). + then(function() { + if (next) { + var locals = angular.extend({}, next.resolve), + template, templateUrl; + + angular.forEach(locals, function(value, key) { + locals[key] = angular.isString(value) ? + $injector.get(value) : $injector.invoke(value); + }); + + if (angular.isDefined(template = next.template)) { + if (angular.isFunction(template)) { + template = template(next.params); + } + } else if (angular.isDefined(templateUrl = next.templateUrl)) { + if (angular.isFunction(templateUrl)) { + templateUrl = templateUrl(next.params); + } + templateUrl = $sce.getTrustedResourceUrl(templateUrl); + if (angular.isDefined(templateUrl)) { + next.loadedTemplateUrl = templateUrl; + template = $http.get(templateUrl, {cache: $templateCache}). + then(function(response) { return response.data; }); + } + } + if (angular.isDefined(template)) { + locals['$template'] = template; + } + return $q.all(locals); + } + }). + // after route change + then(function(locals) { + if (next == $route.current) { + if (next) { + next.locals = locals; + angular.copy(next.params, $routeParams); + } + $rootScope.$broadcast('$routeChangeSuccess', next, last); + } + }, function(error) { + if (next == $route.current) { + $rootScope.$broadcast('$routeChangeError', next, last, error); + } + }); + } + } + + + /** + * @returns {Object} the current active route, by matching it against the URL + */ + function parseRoute() { + // Match a route + var params, match; + angular.forEach(routes, function(route, path) { + if (!match && (params = switchRouteMatcher($location.path(), route))) { + match = inherit(route, { + params: angular.extend({}, $location.search(), params), + pathParams: params}); + match.$$route = route; + } + }); + // No route matched; fallback to "otherwise" route + return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}}); + } + + /** + * @returns {string} interpolation of the redirect path with the parameters + */ + function interpolate(string, params) { + var result = []; + angular.forEach((string||'').split(':'), function(segment, i) { + if (i === 0) { + result.push(segment); + } else { + var segmentMatch = segment.match(/(\w+)(.*)/); + var key = segmentMatch[1]; + result.push(params[key]); + result.push(segmentMatch[2] || ''); + delete params[key]; + } + }); + return result.join(''); + } + }]; +} + +ngRouteModule.provider('$routeParams', $RouteParamsProvider); + + +/** + * @ngdoc service + * @name $routeParams + * @requires $route + * + * @description + * The `$routeParams` service allows you to retrieve the current set of route parameters. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * The route parameters are a combination of {@link ng.$location `$location`}'s + * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}. + * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched. + * + * In case of parameter name collision, `path` params take precedence over `search` params. + * + * The service guarantees that the identity of the `$routeParams` object will remain unchanged + * (but its properties will likely change) even when a route change occurs. + * + * Note that the `$routeParams` are only updated *after* a route change completes successfully. + * This means that you cannot rely on `$routeParams` being correct in route resolve functions. + * Instead you can use `$route.current.params` to access the new route's parameters. + * + * @example + * ```js + * // Given: + * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby + * // Route: /Chapter/:chapterId/Section/:sectionId + * // + * // Then + * $routeParams ==> {chapterId:1, sectionId:2, search:'moby'} + * ``` + */ +function $RouteParamsProvider() { + this.$get = function() { return {}; }; +} + +ngRouteModule.directive('ngView', ngViewFactory); +ngRouteModule.directive('ngView', ngViewFillContentFactory); + + +/** + * @ngdoc directive + * @name ngView + * @restrict ECA + * + * @description + * # Overview + * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by + * including the rendered template of the current route into the main layout (`index.html`) file. + * Every time the current route changes, the included view changes with it according to the + * configuration of the `$route` service. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * @animations + * enter - animation is used to bring new content into the browser. + * leave - animation is used to animate existing content away. + * + * The enter and leave animation occur concurrently. + * + * @scope + * @priority 400 + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll + * $anchorScroll} to scroll the viewport after the view is updated. + * + * - If the attribute is not set, disable scrolling. + * - If the attribute is set without value, enable scrolling. + * - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated + * as an expression yields a truthy value. + * @example + + +
+ Choose: + Moby | + Moby: Ch1 | + Gatsby | + Gatsby: Ch4 | + Scarlet Letter
+ +
+
+
+
+ +
$location.path() = {{main.$location.path()}}
+
$route.current.templateUrl = {{main.$route.current.templateUrl}}
+
$route.current.params = {{main.$route.current.params}}
+
$route.current.scope.name = {{main.$route.current.scope.name}}
+
$routeParams = {{main.$routeParams}}
+
+
+ + +
+ controller: {{book.name}}
+ Book Id: {{book.params.bookId}}
+
+
+ + +
+ controller: {{chapter.name}}
+ Book Id: {{chapter.params.bookId}}
+ Chapter Id: {{chapter.params.chapterId}} +
+
+ + + .view-animate-container { + position:relative; + height:100px!important; + position:relative; + background:white; + border:1px solid black; + height:40px; + overflow:hidden; + } + + .view-animate { + padding:10px; + } + + .view-animate.ng-enter, .view-animate.ng-leave { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + + display:block; + width:100%; + border-left:1px solid black; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + padding:10px; + } + + .view-animate.ng-enter { + left:100%; + } + .view-animate.ng-enter.ng-enter-active { + left:0; + } + .view-animate.ng-leave.ng-leave-active { + left:-100%; + } + + + + angular.module('ngViewExample', ['ngRoute', 'ngAnimate']) + .config(['$routeProvider', '$locationProvider', + function($routeProvider, $locationProvider) { + $routeProvider + .when('/Book/:bookId', { + templateUrl: 'book.html', + controller: 'BookCtrl', + controllerAs: 'book' + }) + .when('/Book/:bookId/ch/:chapterId', { + templateUrl: 'chapter.html', + controller: 'ChapterCtrl', + controllerAs: 'chapter' + }); + + // configure html5 to get links working on jsfiddle + $locationProvider.html5Mode(true); + }]) + .controller('MainCtrl', ['$route', '$routeParams', '$location', + function($route, $routeParams, $location) { + this.$route = $route; + this.$location = $location; + this.$routeParams = $routeParams; + }]) + .controller('BookCtrl', ['$routeParams', function($routeParams) { + this.name = "BookCtrl"; + this.params = $routeParams; + }]) + .controller('ChapterCtrl', ['$routeParams', function($routeParams) { + this.name = "ChapterCtrl"; + this.params = $routeParams; + }]); + + + + + it('should load and compile correct template', function() { + element(by.linkText('Moby: Ch1')).click(); + var content = element(by.css('[ng-view]')).getText(); + expect(content).toMatch(/controller\: ChapterCtrl/); + expect(content).toMatch(/Book Id\: Moby/); + expect(content).toMatch(/Chapter Id\: 1/); + + element(by.partialLinkText('Scarlet')).click(); + + content = element(by.css('[ng-view]')).getText(); + expect(content).toMatch(/controller\: BookCtrl/); + expect(content).toMatch(/Book Id\: Scarlet/); + }); + +
+ */ + + +/** + * @ngdoc event + * @name ngView#$viewContentLoaded + * @eventType emit on the current ngView scope + * @description + * Emitted every time the ngView content is reloaded. + */ +ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate']; +function ngViewFactory( $route, $anchorScroll, $animate) { + return { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + link: function(scope, $element, attr, ctrl, $transclude) { + var currentScope, + currentElement, + previousElement, + autoScrollExp = attr.autoscroll, + onloadExp = attr.onload || ''; + + scope.$on('$routeChangeSuccess', update); + update(); + + function cleanupLastView() { + if(previousElement) { + previousElement.remove(); + previousElement = null; + } + if(currentScope) { + currentScope.$destroy(); + currentScope = null; + } + if(currentElement) { + $animate.leave(currentElement, function() { + previousElement = null; + }); + previousElement = currentElement; + currentElement = null; + } + } + + function update() { + var locals = $route.current && $route.current.locals, + template = locals && locals.$template; + + if (angular.isDefined(template)) { + var newScope = scope.$new(); + var current = $route.current; + + // Note: This will also link all children of ng-view that were contained in the original + // html. If that content contains controllers, ... they could pollute/change the scope. + // However, using ng-view on an element with additional content does not make sense... + // Note: We can't remove them in the cloneAttchFn of $transclude as that + // function is called before linking the content, which would apply child + // directives to non existing elements. + var clone = $transclude(newScope, function(clone) { + $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () { + if (angular.isDefined(autoScrollExp) + && (!autoScrollExp || scope.$eval(autoScrollExp))) { + $anchorScroll(); + } + }); + cleanupLastView(); + }); + + currentElement = clone; + currentScope = current.scope = newScope; + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } else { + cleanupLastView(); + } + } + } + }; +} + +// This directive is called during the $transclude call of the first `ngView` directive. +// It will replace and compile the content of the element with the loaded template. +// We need this directive so that the element content is already filled when +// the link function of another directive on the same element as ngView +// is called. +ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route']; +function ngViewFillContentFactory($compile, $controller, $route) { + return { + restrict: 'ECA', + priority: -400, + link: function(scope, $element) { + var current = $route.current, + locals = current.locals; + + $element.html(locals.$template); + + var link = $compile($element.contents()); + + if (current.controller) { + locals.$scope = scope; + var controller = $controller(current.controller, locals); + if (current.controllerAs) { + scope[current.controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + } + }; +} + + +})(window, window.angular); diff --git a/src/public/js/angular.min.js b/src/public/js/angular.min.js new file mode 100755 index 0000000..43f31f6 --- /dev/null +++ b/src/public/js/angular.min.js @@ -0,0 +1,210 @@ +/* + AngularJS v1.2.16 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(O,U,s){'use strict';function t(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.16/"+(b?b+"/":"")+a;for(c=1;c").append(b).html();try{return 3===b[0].nodeType?K(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/, +function(a,b){return"<"+K(b)})}catch(d){return K(c)}}function Xb(b){try{return decodeURIComponent(b)}catch(a){}}function Yb(b){var a={},c,d;q((b||"").split("&"),function(b){b&&(c=b.split("="),d=Xb(c[0]),B(d)&&(b=B(c[1])?Xb(c[1]):!0,a[d]?M(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Zb(b){var a=[];q(b,function(b,d){M(b)?q(b,function(b){a.push(za(d,!0)+(!0===b?"":"="+za(b,!0)))}):a.push(za(d,!0)+(!0===b?"":"="+za(b,!0)))});return a.length?a.join("&"):""}function wb(b){return za(b, +!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function za(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Wc(b,a){function c(a){a&&d.push(a)}var d=[b],e,g,f=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;q(f,function(a){f[a]=!0;c(U.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(q(b.querySelectorAll("."+a),c),q(b.querySelectorAll("."+ +a+"\\:"),c),q(b.querySelectorAll("["+a+"]"),c))});q(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):q(a.attributes,function(b){!e&&f[b.name]&&(e=a,g=b.value)})}});e&&a(e,g?[g]:[])}function $b(b,a){var c=function(){b=y(b);if(b.injector()){var c=b[0]===U?"document":ha(b);throw Pa("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=ac(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate", +function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(O&&!d.test(O.name))return c();O.name=O.name.replace(d,"");Ea.resumeBootstrap=function(b){q(b,function(b){a.push(b)});c()}}function fb(b,a){a=a||"_";return b.replace(Xc,function(b,d){return(d?a:"")+b.toLowerCase()})}function xb(b,a,c){if(!b)throw Pa("areq",a||"?",c||"required");return b}function Ra(b,a,c){c&&M(b)&&(b=b[b.length-1]);xb(P(b),a,"not a function, got "+(b&&"object"==typeof b? +b.constructor.name||"Object":typeof b));return b}function Aa(b,a){if("hasOwnProperty"===b)throw Pa("badname",a);}function bc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,g=a.length,f=0;f "+e[1]+a.replace(le,"<$1>")+e[2]; +d.removeChild(d.firstChild);for(a=e[0];a--;)d=d.lastChild;a=0;for(e=d.childNodes.length;a=S?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ia(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=bb()):c=b;return a+":"+c}function Va(b){q(b,this.put,this)}function oc(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(oe, +""),c=c.match(pe),q(c[1].split(qe),function(b){b.replace(re,function(b,c,d){a.push(d)})})),b.$inject=a):M(b)?(c=b.length-1,Ra(b[c],"fn"),a=b.slice(0,c)):Ra(b,"fn",!0);return a}function ac(b){function a(a){return function(b,c){if(X(b))q(b,Rb(a));else return a(b,c)}}function c(a,b){Aa(a,"service");if(P(b)||M(b))b=n.instantiate(b);if(!b.$get)throw Wa("pget",a);return m[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,g,h;q(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(w(a))for(c= +Sa(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,g=0,h=d.length;g 4096 bytes)!"));else{if(l.cookie!==da)for(da=l.cookie,d=da.split("; "),Q={},g=0;gk&&this.remove(p.key),b},get:function(a){if(k").parent()[0])});var g=L(a,b,a,c,d,e);ma(a,"ng-scope");return function(b,c,d){xb(b,"scope");var e=c?Ja.clone.call(a):a;q(d,function(a,b){e.data("$"+b+"Controller",a)});d=0;for(var f=e.length;darguments.length&& +(b=a,a=s);D&&(c=lb);return p(a,b,c)}var I,x,v,A,R,H,lb={},da;I=c===g?d:Ub(d,new Hb(y(g),d.$attr));x=I.$$element;if(Q){var T=/^\s*([@=&])(\??)\s*(\w*)\s*$/;f=y(g);H=e.$new(!0);ia&&ia===Q.$$originalDirective?f.data("$isolateScope",H):f.data("$isolateScopeNoTemplate",H);ma(f,"ng-isolate-scope");q(Q.scope,function(a,c){var d=a.match(T)||[],g=d[3]||c,f="?"==d[2],d=d[1],l,m,n,p;H.$$isolateBindings[c]=d+g;switch(d){case "@":I.$observe(g,function(a){H[c]=a});I.$$observers[g].$$scope=e;I[g]&&(H[c]=b(I[g])(e)); +break;case "=":if(f&&!I[g])break;m=r(I[g]);p=m.literal?xa:function(a,b){return a===b};n=m.assign||function(){l=H[c]=m(e);throw ja("nonassign",I[g],Q.name);};l=H[c]=m(e);H.$watch(function(){var a=m(e);p(a,H[c])||(p(a,l)?n(e,a=H[c]):H[c]=a);return l=a},null,m.literal);break;case "&":m=r(I[g]);H[c]=function(a){return m(e,a)};break;default:throw ja("iscp",Q.name,c,a);}})}da=p&&u;L&&q(L,function(a){var b={$scope:a===Q||a.$$isolateScope?H:e,$element:x,$attrs:I,$transclude:da},c;R=a.controller;"@"==R&&(R= +I[a.name]);c=z(R,b);lb[a.name]=c;D||x.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});f=0;for(v=l.length;fG.priority)break;if(V=G.scope)A=A||G,G.templateUrl||(K("new/isolated scope",Q,G,Z),X(V)&&(Q=G));t=G.name;!G.templateUrl&&G.controller&&(V=G.controller,L=L||{},K("'"+t+"' controller",L[t],G,Z),L[t]=G);if(V=G.transclude)E=!0,G.$$tlb||(K("transclusion",T,G,Z),T=G),"element"==V?(D=!0,v=G.priority, +V=H(c,ra,W),Z=d.$$element=y(U.createComment(" "+t+": "+d[t]+" ")),c=Z[0],mb(g,y(ya.call(V,0)),c),Xa=x(V,e,v,f&&f.name,{nonTlbTranscludeDirective:T})):(V=y(Eb(c)).contents(),Z.empty(),Xa=x(V,e));if(G.template)if(K("template",ia,G,Z),ia=G,V=P(G.template)?G.template(Z,d):G.template,V=Y(V),G.replace){f=G;V=Cb.test(V)?y(V):[];c=V[0];if(1!=V.length||1!==c.nodeType)throw ja("tplrt",t,"");mb(g,Z,c);S={$attr:{}};V=da(c,[],S);var $=a.splice(N+1,a.length-(N+1));Q&&pc(V);a=a.concat(V).concat($);B(d,S);S=a.length}else Z.html(V); +if(G.templateUrl)K("template",ia,G,Z),ia=G,G.replace&&(f=G),J=C(a.splice(N,a.length-N),Z,d,g,Xa,l,n,{controllerDirectives:L,newIsolateScopeDirective:Q,templateDirective:ia,nonTlbTranscludeDirective:T}),S=a.length;else if(G.compile)try{O=G.compile(Z,d,Xa),P(O)?u(null,O,ra,W):O&&u(O.pre,O.post,ra,W)}catch(aa){m(aa,ha(Z))}G.terminal&&(J.terminal=!0,v=Math.max(v,G.priority))}J.scope=A&&!0===A.scope;J.transclude=E&&Xa;p.hasElementTranscludeDirective=D;return J}function pc(a){for(var b=0,c=a.length;bp.priority)&&-1!=p.restrict.indexOf(g)&&(n&&(p=Tb(p,{$$start:n,$$end:r})),b.push(p),k=p)}catch(F){m(F)}}return k}function B(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,g){"class"==g?(ma(e,b),a["class"]=(a["class"]? +a["class"]+" ":"")+b):"style"==g?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==g.charAt(0)||a.hasOwnProperty(g)||(a[g]=b,d[g]=c[g])})}function C(a,b,c,d,e,g,f,l){var k=[],m,r,z=b[0],u=a.shift(),F=D({},u,{templateUrl:null,transclude:null,replace:null,$$originalDirective:u}),x=P(u.templateUrl)?u.templateUrl(b,c):u.templateUrl;b.empty();n.get(v.getTrustedResourceUrl(x),{cache:p}).success(function(n){var p,J;n=Y(n);if(u.replace){n=Cb.test(n)?y(n):[];p=n[0];if(1!=n.length|| +1!==p.nodeType)throw ja("tplrt",u.name,x);n={$attr:{}};mb(d,b,p);var v=da(p,[],n);X(u.scope)&&pc(v);a=v.concat(a);B(c,n)}else p=z,b.html(n);a.unshift(F);m=ia(a,p,c,e,b,u,g,f,l);q(d,function(a,c){a==p&&(d[c]=b[0])});for(r=L(b[0].childNodes,e);k.length;){n=k.shift();J=k.shift();var A=k.shift(),R=k.shift(),v=b[0];if(J!==z){var H=J.className;l.hasElementTranscludeDirective&&u.replace||(v=Eb(p));mb(A,y(J),v);ma(y(v),H)}J=m.transclude?Q(n,m.transclude):R;m(r,n,v,d,J)}k=null}).error(function(a,b,c,d){throw ja("tpload", +d.url);});return function(a,b,c,d,e){k?(k.push(b),k.push(c),k.push(d),k.push(e)):m(r,b,c,d,e)}}function E(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.namea.status? +b:n.reject(b)}var d={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},g=function(a){function b(a){var c;q(a,function(b,d){P(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=D({},a.headers),g,f,c=D({},c.common,c[K(a.method)]);b(c);b(d);a:for(g in c){a=K(g);for(f in d)if(K(f)===a)continue a;d[g]=c[g]}return d}(a);D(d,a);d.headers=g;d.method=Fa(d.method);(a=Ib(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(g[d.xsrfHeaderName||e.xsrfHeaderName]= +a);var f=[function(a){g=a.headers;var b=uc(a.data,tc(g),a.transformRequest);E(a.data)&&q(g,function(a,b){"content-type"===K(b)&&delete g[b]});E(a.withCredentials)&&!E(e.withCredentials)&&(a.withCredentials=e.withCredentials);return z(a,b,g).then(c,c)},s],h=n.when(d);for(q(v,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var k=f.shift(),h=h.then(a,k)}h.success=function(a){h.then(function(b){a(b.data, +b.status,b.headers,d)});return h};h.error=function(a){h.then(null,function(b){a(b.data,b.status,b.headers,d)});return h};return h}function z(b,c,g){function f(a,b,c,e){v&&(200<=a&&300>a?v.put(s,[a,b,sc(c),e]):v.remove(s));l(b,a,c,e);d.$$phase||d.$apply()}function l(a,c,d,e){c=Math.max(c,0);(200<=c&&300>c?p.resolve:p.reject)({data:a,status:c,headers:tc(d),config:b,statusText:e})}function k(){var a=db(r.pendingRequests,b);-1!==a&&r.pendingRequests.splice(a,1)}var p=n.defer(),z=p.promise,v,q,s=u(b.url, +b.params);r.pendingRequests.push(b);z.then(k,k);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(v=X(b.cache)?b.cache:X(e.cache)?e.cache:F);if(v)if(q=v.get(s),B(q)){if(q.then)return q.then(k,k),q;M(q)?l(q[1],q[0],ba(q[2]),q[3]):l(q,200,{},"OK")}else v.put(s,z);E(q)&&a(b.method,s,c,f,g,b.timeout,b.withCredentials,b.responseType);return z}function u(a,b){if(!b)return a;var c=[];Sc(b,function(a,b){null===a||E(a)||(M(a)||(a=[a]),q(a,function(a){X(a)&&(a=qa(a));c.push(za(b)+"="+za(a))}))});0=S&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!O.XMLHttpRequest))return new O.ActiveXObject("Microsoft.XMLHTTP");if(O.XMLHttpRequest)return new O.XMLHttpRequest;throw t("$httpBackend")("noxhr");}function Ud(){this.$get=["$browser","$window","$document",function(b,a,c){return ve(b,ue,b.defer,a.angular.callbacks,c[0])}]}function ve(b,a,c,d,e){function g(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange= +c.onload=c.onerror=null;e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;S&&8>=S?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()};e.body.appendChild(c);return d}var f=-1;return function(e,l,k,m,n,p,r,z){function u(){v=f;A&&A();x&&x.abort()}function F(a,d,e,g,f){L&&c.cancel(L);A=x=null;0===d&&(d=e?200:"file"==sa(l).protocol?404:0);a(1223===d?204:d,e,g,f||"");b.$$completeOutstandingRequest(C)}var v;b.$$incOutstandingRequestCount(); +l=l||b.url();if("jsonp"==K(e)){var J="_"+(d.counter++).toString(36);d[J]=function(a){d[J].data=a};var A=g(l.replace("JSON_CALLBACK","angular.callbacks."+J),function(){d[J].data?F(m,200,d[J].data):F(m,v||-2);d[J]=Ea.noop})}else{var x=a(e);x.open(e,l,!0);q(n,function(a,b){B(a)&&x.setRequestHeader(b,a)});x.onreadystatechange=function(){if(x&&4==x.readyState){var a=null,b=null;v!==f&&(a=x.getAllResponseHeaders(),b="response"in x?x.response:x.responseText);F(m,v||x.status,b,a,x.statusText||"")}};r&&(x.withCredentials= +!0);if(z)try{x.responseType=z}catch(s){if("json"!==z)throw s;}x.send(k||null)}if(0=h&&(n.resolve(r),m(p.$$intervalId),delete e[p.$$intervalId]);z||b.$apply()},f);e[p.$$intervalId]=n;return p}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId], +!0):!1};return d}]}function ad(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), +DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function wc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=wb(b[a]);return b.join("/")}function xc(b,a,c){b=sa(b,c);a.$$protocol= +b.protocol;a.$$host=b.hostname;a.$$port=Y(b.port)||we[b.protocol]||null}function yc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=sa(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=Yb(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function oa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ya(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Jb(b){return b.substr(0, +Ya(b).lastIndexOf("/")+1)}function zc(b,a){this.$$html5=!0;a=a||"";var c=Jb(b);xc(b,this,b);this.$$parse=function(a){var e=oa(c,a);if(!w(e))throw Kb("ipthprfx",a,c);yc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Zb(this.$$search),b=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=wc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=oa(b,d))!==s)return d=e,(e=oa(a,e))!==s?c+(oa("/",e)||e):b+d;if((e=oa(c, +d))!==s)return c+e;if(c==d+"/")return c}}function Lb(b,a){var c=Jb(b);xc(b,this,b);this.$$parse=function(d){var e=oa(b,d)||oa(c,d),e="#"==e.charAt(0)?oa(a,e):this.$$html5?e:"";if(!w(e))throw Kb("ihshprfx",d,a);yc(e,this,b);d=this.$$path;var g=/^\/?.*?:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));g.exec(e)||(d=(e=g.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Zb(this.$$search),e=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=wc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl= +b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Ya(b)==Ya(a))return a}}function Ac(b,a){this.$$html5=!0;Lb.apply(this,arguments);var c=Jb(b);this.$$rewrite=function(d){var e;if(b==Ya(d))return d;if(e=oa(c,d))return b+a+e;if(c===d+"/")return c}}function nb(b){return function(){return this[b]}}function Bc(b,a){return function(c){if(E(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Vd(){var b="",a=!1;this.hashPrefix=function(a){return B(a)?(b=a,this):b};this.html5Mode= +function(b){return B(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,g){function f(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,l=d.baseHref(),k=d.url();a?(l=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(l||"/"),e=e.history?zc:Ac):(l=Ya(k),e=Lb);h=new e(l,"#"+b);h.$$parse(h.$$rewrite(k));g.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=y(a.target);"a"!==K(b[0].nodeName);)if(b[0]===g[0]||!(b=b.parent())[0])return; +var e=b.prop("href");X(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=sa(e.animVal).href);var f=h.$$rewrite(e);e&&(!b.attr("target")&&f&&!a.isDefaultPrevented())&&(a.preventDefault(),f!=d.url()&&(h.$$parse(f),c.$apply(),O.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=k&&d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):f(b)}),c.$$phase|| +c.$digest())});var m=0;c.$watch(function(){var a=d.url(),b=h.$$replace;m&&a==h.absUrl()||(m++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),f(a))}));h.$$replace=!1;return m});return h}]}function Wd(){var b=!0,a=this;this.debugEnabled=function(a){return B(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack: +a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||C;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];q(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function fa(b,a){if("constructor"===b)throw Ba("isecfld",a);return b}function Za(b, +a){if(b){if(b.constructor===b)throw Ba("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw Ba("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw Ba("isecdom",a);}return b}function ob(b,a,c,d,e){e=e||{};a=a.split(".");for(var g,f=0;1e?Cc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,g){var f=0,h;do h=Cc(d[f++],d[f++],d[f++],d[f++],d[f++],c,a)(b,g),g=s,b=h;while(fa)for(b in l++,e)e.hasOwnProperty(b)&&!d.hasOwnProperty(b)&&(q--,delete e[b])}else e!==d&&(e=d,l++);return l},function(){p?(p=!1,b(d,d,c)):b(d,f,c);if(h)if(X(d))if(ab(d)){f=Array(d.length);for(var a=0;as&&(y=4-s,Q[y]||(Q[y]=[]),H=P(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,H+="; newVal: "+qa(g)+"; oldVal: "+qa(f),Q[y].push(H));else if(d===c){x=!1;break a}}catch(w){p.$$phase= +null,e(w)}if(!(h=L.$$childHead||L!==this&&L.$$nextSibling))for(;L!==this&&!(h=L.$$nextSibling);)L=L.$parent}while(L=h);if((x||k.length)&&!s--)throw p.$$phase=null,a("infdig",b,qa(Q));}while(x||k.length);for(p.$$phase=null;m.length;)try{m.shift()()}catch(T){e(T)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this!==p&&(q(this.$$listenerCount,eb(null,m,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&& +(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=C,this.$on=this.$watch=function(){return C})}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){p.$$phase|| +p.$$asyncQueue.length||f.defer(function(){p.$$asyncQueue.length&&p.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){e(b)}finally{p.$$phase=null;try{p.$digest()}catch(c){throw e(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent); +var e=this;return function(){c[db(c,b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,g=this,f=!1,h={name:a,targetScope:g,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},l=[h].concat(ya.call(arguments,1)),k,m;do{d=g.$$listeners[a]||c;h.currentScope=g;k=0;for(m=d.length;kc.msieDocumentMode)throw ua("iequirks");var e=ba(ga);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Da);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b, +d(a,c))}};var g=e.parseAs,f=e.getTrusted,h=e.trustAs;q(ga,function(a,b){var c=K(b);e[Ta("parse_as_"+c)]=function(b){return g(a,b)};e[Ta("get_trusted_"+c)]=function(b){return f(a,b)};e[Ta("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function be(){this.$get=["$window","$document",function(b,a){var c={},d=Y((/android (\d+)/.exec(K((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),g=a[0]||{},f=g.documentMode,h,l=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=g.body&&g.body.style, +m=!1,n=!1;if(k){for(var p in k)if(m=l.exec(p)){h=m[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in k&&"webkit");m=!!("transition"in k||h+"Transition"in k);n=!!("animation"in k||h+"Animation"in k);!d||m&&n||(m=w(g.body.style.webkitTransition),n=w(g.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!f||7b;b=Math.abs(b);var f=b+"",h="",l=[],k=!1;if(-1!==f.indexOf("e")){var m=f.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?f="0":(h=f,k=!0)}if(k)0b)&&(h=b.toFixed(e)); +else{f=(f.split(Nc)[1]||"").length;E(e)&&(e=Math.min(Math.max(a.minFrac,f),a.maxFrac));f=Math.pow(10,e);b=Math.round(b*f)/f;b=(""+b).split(Nc);f=b[0];b=b[1]||"";var m=0,n=a.lgSize,p=a.gSize;if(f.length>=n+p)for(m=f.length-n,k=0;kb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Ob(e,a,d)}}function pb(b,a){return function(c,d){var e=c["get"+b](),g=Fa(a?"SHORT"+b:b);return d[g][e]}}function Jc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var g=0,f=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(g=Y(b[9]+b[10]),f=Y(b[9]+b[11])); +h.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));g=Y(b[4]||0)-g;f=Y(b[5]||0)-f;h=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,g,f,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var g="",f=[],h,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;w(c)&&(c=Ge.test(c)?Y(c):a(c));vb(c)&&(c=new Date(c));if(!Na(c))return c;for(;e;)(l=He.exec(e))?(f=f.concat(ya.call(l,1)),e=f.pop()):(f.push(e),e=null);q(f,function(a){h= +Ie[a];g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ce(){return function(b){return qa(b,!0)}}function De(){return function(b,a){if(!M(b)&&!w(b))return b;a=Y(a);if(w(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0a||37<=a&&40>=a)||m()});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)? +"":d.$viewValue)};var n=c.ngPattern;n&&((e=n.match(/^\/(.*)\/([gim]*)$/))?(n=RegExp(e[1],e[2]),e=function(a){return pa(d,"pattern",d.$isEmpty(a)||n.test(a),a)}):e=function(c){var e=b.$eval(n);if(!e||!e.test)throw t("ngPattern")("noregexp",n,e,ha(a));return pa(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var p=Y(c.ngMinlength);e=function(a){return pa(d,"minlength",d.$isEmpty(a)||a.length>=p,a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var r= +Y(c.ngMaxlength);e=function(a){return pa(d,"maxlength",d.$isEmpty(a)||a.length<=r,a)};d.$parsers.push(e);d.$formatters.push(e)}}function Pb(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;dS?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Fa(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Xc=/[A-Z]/g,$c={full:"1.2.16",major:1,minor:2,dot:16,codeName:"badger-enumeration"},Ua=N.cache={},gb=N.expando="ng-"+(new Date).getTime(), +me=1,Pc=O.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},Fb=O.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};N._data=function(b){return this.cache[b[this.expando]]||{}};var he=/([\:\-\_]+(.))/g,ie=/^moz([A-Z])/,Bb=t("jqLite"),je=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Cb=/<|&#?\w+;/,ke=/<([\w:]+)/,le=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ea= +{option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ea.optgroup=ea.option;ea.tbody=ea.tfoot=ea.colgroup=ea.caption=ea.thead;ea.th=ea.td;var Ja=N.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===U.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),N(O).on("load",a))},toString:function(){var b= +[];q(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?y(this[b]):y(this[this.length+b])},length:0,push:Ke,sort:[].sort,splice:[].splice},kb={};q("multiple selected checked disabled readOnly required open".split(" "),function(b){kb[K(b)]=b});var nc={};q("input select option textarea button form details".split(" "),function(b){nc[Fa(b)]=!0});q({data:jc,inheritedData:jb,scope:function(b){return y(b).data("$scope")||jb(b.parentNode||b,["$isolateScope","$scope"])}, +isolateScope:function(b){return y(b).data("$isolateScope")||y(b).data("$isolateScopeNoTemplate")},controller:kc,injector:function(b){return jb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Gb,css:function(b,a,c){a=Ta(a);if(B(c))b.style[a]=c;else{var d;8>=S&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=S&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=K(a);if(kb[d])if(B(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d)); +else return b[a]||(b.attributes.getNamedItem(a)||C).specified?d:s;else if(B(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(B(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(E(d))return e?b[e]:"";b[e]=d}var a=[];9>S?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(E(a)){if("SELECT"===Ka(b)&&b.multiple){var c=[];q(b.options,function(a){a.selected&& +c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(E(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Ne={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'}, +Nb=function(a){this.options=a};Nb.prototype={constructor:Nb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"=== +a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=B(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw Ba("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn($a.ZERO,a.fn, +this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Dc(d,this.options,this.text);return D(function(c,d,h){return e(h||a(c,d))},{assign:function(e,f,h){return ob(a(e,h),d,f,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return D(function(e,g){var f=a(e,g),h=d(e,g),l;if(!f)return s;(f=Za(f[h],c.text))&&(f.then&&c.options.unwrapPromises)&&(l=f,"$$v"in f||(l.$$v=s,l.then(function(a){l.$$v= +a})),f=f.$$v);return f},{assign:function(e,g,f){var h=d(e,f);return Za(a(e,f),c.text)[h]=g}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(g,f){for(var h=[],l=c?c(g,f):g,k=0;ka.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ob(Math[0=S&&(c.href||c.name||c.$set("href",""),a.append(U.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var g="[object SVGAnimatedString]"===wa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(g)||a.preventDefault()})}}}),zb={};q(kb,function(a,c){if("multiple"!=a){var d=na("ng-"+c);zb[d]=function(){return{priority:100,link:function(a,g,f){a.$watch(f[d],function(a){f.$set(c,!!a)})}}}}});q(["src", +"srcset","href"],function(a){var c=na("ng-"+a);zb[c]=function(){return{priority:99,link:function(d,e,g){var f=a,h=a;"href"===a&&"[object SVGAnimatedString]"===wa.call(e.prop("href"))&&(h="xlinkHref",g.$attr[h]="xlink:href",f=null);g.$observe(c,function(a){a&&(g.$set(h,a),S&&f&&e.prop(f,g[h]))})}}}});var sb={$addControl:C,$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C};Oc.$inject=["$element","$attrs","$scope","$animate"];var Qc=function(a){return["$timeout",function(c){return{name:"form", +restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,g,f){if(!g.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Pc(e[0],"submit",h);e.on("$destroy",function(){c(function(){Fb(e[0],"submit",h)},0,!1)})}var l=e.parent().controller("form"),k=g.name||g.ngForm;k&&ob(a,k,f,k);if(l)e.on("$destroy",function(){l.$removeControl(f);k&&ob(a,k,s,k);D(f,sb)})}}}}}]},dd=Qc(),qd=Qc(!0),Oe=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/, +Pe=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,Qe=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Rc={text:ub,number:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Qe.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});Je(e,"number",c);e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);return pa(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a), +e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return pa(e,"max",e.$isEmpty(a)||a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return pa(e,"number",e.$isEmpty(a)||vb(a),a)})},url:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);a=function(a){return pa(e,"url",e.$isEmpty(a)||Oe.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);a=function(a){return pa(e,"email",e.$isEmpty(a)||Pe.test(a),a)};e.$formatters.push(a); +e.$parsers.push(a)},radio:function(a,c,d,e){E(d.name)&&c.attr("name",bb());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,f=d.ngFalseValue;w(g)||(g=!0);w(f)||(f=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==g}; +e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:f})},hidden:C,button:C,submit:C,reset:C,file:C},dc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,f){f&&(Rc[K(g.type)]||Rc.text)(d,e,g,f,c,a)}}}],rb="ng-valid",qb="ng-invalid",La="ng-pristine",tb="ng-dirty",Re=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,g,f){function h(a,c){c=c?"-"+fb(c,"-"):"";f.removeClass(e,(a?qb:rb)+c); +f.addClass(e,(a?rb:qb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var l=g(d.ngModel),k=l.assign;if(!k)throw t("ngModel")("nonassign",d.ngModel,ha(e));this.$render=C;this.$isEmpty=function(a){return E(a)||""===a||null===a||a!==a};var m=e.inheritedData("$formController")||sb,n=0,p=this.$error={};e.addClass(La);h(!0);this.$setValidity=function(a,c){p[a]!== +!c&&(c?(p[a]&&n--,n||(h(!0),this.$valid=!0,this.$invalid=!1)):(h(!1),this.$invalid=!0,this.$valid=!1,n++),p[a]=!c,h(c,a),m.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;f.removeClass(e,tb);f.addClass(e,La)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,f.removeClass(e,La),f.addClass(e,tb),m.$setDirty());q(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,k(a,d),q(this.$viewChangeListeners, +function(a){try{a()}catch(d){c(d)}}))};var r=this;a.$watch(function(){var c=l(a);if(r.$modelValue!==c){var d=r.$formatters,e=d.length;for(r.$modelValue=c;e--;)c=d[e](c);r.$viewValue!==c&&(r.$viewValue=c,r.$render())}return c})}],Fd=function(){return{require:["ngModel","^?form"],controller:Re,link:function(a,c,d,e){var g=e[0],f=e[1]||sb;f.$addControl(g);a.$on("$destroy",function(){f.$removeControl(g)})}}},Hd=aa({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}), +ec=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},Gd=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!E(a)){var c=[];a&&q(a.split(g),function(a){a&& +c.push(ca(a))});return c}});e.$formatters.push(function(a){return M(a)?a.join(", "):s});e.$isEmpty=function(a){return!a||!a.length}}}},Se=/^(true|false|\d+)$/,Id=function(){return{priority:100,compile:function(a,c){return Se.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a)})}}}},id=va(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),kd=["$interpolate", +function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],jd=["$sce","$parse",function(a,c){return function(d,e,g){e.addClass("ng-binding").data("$binding",g.ngBindHtml);var f=c(g.ngBindHtml);d.$watch(function(){return(f(d)||"").toString()},function(c){e.html(a.getTrustedHtml(f(d))||"")})}}],ld=Pb("",!0),nd=Pb("Odd",0),md=Pb("Even",1),od=va({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}), +pd=[function(){return{scope:!0,controller:"@",priority:500}}],fc={};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=na("ng-"+a);fc[c]=["$parse",function(d){return{compile:function(e,g){var f=d(g[c]);return function(c,d,e){d.on(K(a),function(a){c.$apply(function(){f(c,{$event:a})})})}}}}]});var sd=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A", +$$tlb:!0,link:function(c,d,e,g,f){var h,l,k;c.$watch(e.ngIf,function(g){Qa(g)?l||(l=c.$new(),f(l,function(c){c[c.length++]=U.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)})):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=yb(h.clone),a.leave(k,function(){k=null}),h=null))})}}}],td=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ea.noop,compile:function(f, +h){var l=h.ngInclude||h.src,k=h.onload||"",m=h.autoscroll;return function(f,h,q,s,u){var F=0,v,y,A,x=function(){y&&(y.remove(),y=null);v&&(v.$destroy(),v=null);A&&(e.leave(A,function(){y=null}),y=A,A=null)};f.$watch(g.parseAsResourceUrl(l),function(g){var l=function(){!B(m)||m&&!f.$eval(m)||d()},q=++F;g?(a.get(g,{cache:c}).success(function(a){if(q===F){var c=f.$new();s.template=a;a=u(c,function(a){x();e.enter(a,null,h,l)});v=c;A=a;v.$emit("$includeContentLoaded");f.$eval(k)}}).error(function(){q=== +F&&x()}),f.$emit("$includeContentRequested")):(x(),s.template=null)})}}}}],Jd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,g){d.html(g.template);a(d.contents())(c)}}}],ud=va({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),vd=va({terminal:!0,priority:1E3}),wd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,f){var h=f.count,l=f.$attr.when&&g.attr(f.$attr.when),k=f.offset|| +0,m=e.$eval(l)||{},n={},p=c.startSymbol(),r=c.endSymbol(),s=/^when(Minus)?(.+)$/;q(f,function(a,c){s.test(c)&&(m[K(c.replace("when","").replace("Minus","-"))]=g.attr(f.$attr[c]))});q(m,function(a,e){n[e]=c(a.replace(d,p+h+"-"+k+r))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-k));return n[c](e,g,!0)},function(a){g.text(a)})}}}],xd=["$parse","$animate",function(a,c){var d=t("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0, +link:function(e,g,f,h,l){var k=f.ngRepeat,m=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),n,p,r,s,u,F,v={$id:Ia};if(!m)throw d("iexp",k);f=m[1];h=m[2];(m=m[3])?(n=a(m),p=function(a,c,d){F&&(v[F]=a);v[u]=c;v.$index=d;return n(e,v)}):(r=function(a,c){return Ia(c)},s=function(a){return a});m=f.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!m)throw d("iidexp",f);u=m[3]||m[1];F=m[2];var B={};e.$watchCollection(h,function(a){var f,h,m=g[0],n,v={},H,R,w,C,T,t, +E=[];if(ab(a))T=a,n=p||r;else{n=p||s;T=[];for(w in a)a.hasOwnProperty(w)&&"$"!=w.charAt(0)&&T.push(w);T.sort()}H=T.length;h=E.length=T.length;for(f=0;fA;)z.pop().element.remove()}for(;x.length>I;)x.pop()[0].element.remove()}var k;if(!(k=t.match(d)))throw Te("iexp",t,ha(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],p=c(k[3]||""),q= +c(k[2]?k[1]:m),y=c(k[7]),w=k[8]?c(k[8]):null,x=[[{element:f,label:""}]];u&&(a(u)(e),u.removeClass("ng-scope"),u.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=y(e)||[],d={},h,k,l,p,t,v,u;if(r)for(k=[],p=0,v=x.length;p@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}'); +//# sourceMappingURL=angular.min.js.map diff --git a/src/public/js/bootstrap.min.js b/src/public/js/bootstrap.min.js new file mode 100755 index 0000000..0e668e8 --- /dev/null +++ b/src/public/js/bootstrap.min.js @@ -0,0 +1,9 @@ +/*! + * Bootstrap v3.0.2 by @fat and @mdo + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/src/public/js/burning-classes.js b/src/public/js/burning-classes.js new file mode 100755 index 0000000..1e4847d --- /dev/null +++ b/src/public/js/burning-classes.js @@ -0,0 +1,1018 @@ + +/**** Class LifepathID ****/ +function LifepathID(settingName, lifepathName) +{ + this.id = [settingName, lifepathName]; + this.hashKey = LifepathID_hashHey; + return this; +} +// Return a string represending this lifepath that can be used as a key in a hash +function LifepathID_hashHey(){ + return this.id[0] + ":" + this.id[1]; +} +/**** End Class LifepathID ****/ + +/**** Class TimeRange ****/ +function TimeRange(expression) +{ + this.defaultVal = 1; + this.min = 1; + this.max = 1; + + if( expression[0] != "+range" ){ + console.log("Error: Unknown lifepath time expression type " + expression[0]); + return; + } + + this.min = parseInt(expression[1]); + this.max = parseInt(expression[2]); + this.defaultVal = this.min; +} +/**** End Class TimeRange ****/ + +/**** Class DisplayLifepath ****/ +function DisplayLifepath(setting, name, jsonLifepath){ + this.setting = setting; + this.name = name; + this.displayName = getOrDefault(jsonLifepath, "display_name", name, null); + + this.timeRange = null; + this.timeIsChoosable = false; + if ( jsonLifepath.time == "*" ){ + if ( null == jsonLifepath.time_expr ){ + console.log("Error: Lifepath with variable time is missing time_expr attribute"); + this.time = 1; + } + else { + this.timeRange = new TimeRange(jsonLifepath.time_expr); + this.time = this.timeRange.defaultVal; + this.timeIsChoosable = true; + } + } + else { + this.time = getAsNumOrDefault(jsonLifepath, "time", -1, "time field is not set in lifepath " + name + " or is not a number"); + } + + this.stat = getOrDefault(jsonLifepath, "stat", [], null); + this.leads = getOrDefault(jsonLifepath, "leads", [], null); + this.keyLeads = getOrDefault(jsonLifepath, "key_leads", [], null); + this.restrict = jsonLifepath["restrict"]; + this.requires = jsonLifepath["requires"]; + this.note = jsonLifepath["note"]; + this.weaponOfChoice = null; + + this.resourcePtsIsCalculated = false; + if ( jsonLifepath.res == "*" ){ + // Figure out the resource point calculation + var expr = jsonLifepath.res_expr + if ( null == expr ){ + console.log("Error: Lifepath with calculated resources is missing res_expr attribute"); + this.resourcePts = -1; + } + else if( expr[0] == '+mult_time'){ + this.resourcePtsIsCalculated = true; + var mult = parseInt(expr[1]) + this.innerCalculateResourcePoints = function(prevLifepath){ + this.resourcePts = this.time * mult; + } + } + else if( expr[0] == '+mult_prev'){ + this.resourcePtsIsCalculated = true; + var mult = expr[1] + this.innerCalculateResourcePoints = function(prevLifepath){ + if(prevLifepath){ + this.resourcePts = Math.floor(prevLifepath.resourcePts * mult); + } + else { + this.resourcePts = -1; + } + } + } + else { + console.log("Unknown res_expr type " + expr[0]); + this.resourcePts = -1; + } + } + else { + this.resourcePts = getAsNumOrDefault(jsonLifepath, "res", -1, "res field is not set in lifepath " + name + " or is not a number"); + } + + skills = jsonLifepath.skills + this.lifepathSkillPts = 0; + this.generalSkillPts = 0; + this.skills = []; + this.brutalLifeDOF = 0; + this.brutalLifeTraitName = null; + + this.generalSkillPtsIsCalculated = false; + if ( skills && skills.length > 0){ + for(var j = 0; j < skills.length; j++){ + var skillsCategory = skills[j]; + + // Is this the General skills category? + if( skillsCategory[1] == "General" ){ + if (skillsCategory[0] == '*') { + var expr = jsonLifepath.skills_expr + if ( null == expr ){ + console.log("Error: Lifepath with calculated general skillpoints is missing skills_expr attribute"); + this.generalSkillPts = -1; + } + else if( expr[0] == '+mult_time'){ + this.generalSkillPtsIsCalculated = true; + // Need a new variable name for this since javascript variables + // are scoped to the function, not to the block. + var multGenSkill = parseInt(expr[1]) + this.innerCalculateGeneralSkillPoints = function(){ + this.generalSkillPts = this.time * multGenSkill; + } + } + else { + console.log("Unknown skills_expr type " + expr[0]); + this.resourcePts = -1; + } + } else { + this.generalSkillPts += skillsCategory[0]; + } + } + else { + this.lifepathSkillPts += skillsCategory[0]; + this.skills = this.skills.concat(skillsCategory.slice(1)); + } + } + } + + traits = jsonLifepath.traits + if ( traits && traits.length > 0){ + this.traitPts = traits[0]; + this.traits = traits.slice(1); + } + else{ + this.traitPts = 0; + this.traits = []; + } + + this.commonTraits = [] + if( jsonLifepath.common_traits){ + this.commonTraits = jsonLifepath.common_traits + } + + this.displayLeads = function(){ + return listToStr(this.leads); + } + + this.displaySkills = function(){ + s = ""; + if ( this.lifepathSkillPts > 0 ){ + s += this.lifepathSkillPts + " pts: " + listToStr(this.skills); + } + if ( this.generalSkillPts > 0 ){ + if ( s.length > 0 ) + s += "; "; + s += this.generalSkillPts + " pts: General"; + } + return s; + } + + this.displayTraits = function(){ + var l = this.traits; + if ( l.length == 0 ) + l = ['-']; + return listToStr(l); + } + + this.displayStat = function(){ + var l = this.stat; + var s = ""; + for(var i = 0; i < l.length; i++){ + stat = l[i]; + + if ( i > 0 ) { + s += ", "; + } + + if(stat[1] == 'p'){ + if (stat[0] >= 0) + s += "+" + s += stat[0] + " P"; + } + else if (stat[1] == 'm'){ + if (stat[0] >= 0) + s += "+" + s += stat[0] + " M"; + } + else if (stat[1] == 'pm' || stat[1] == 'mp'){ + if (stat[0] >= 0) + s += "+" + s += stat[0] + " P/M"; + } + } + + if (s.length == 0){ + s = "-"; + } + + return s; + } + + this.calculateResourcePoints = function(prevLifepath){ + if(this.resourcePtsIsCalculated){ + this.innerCalculateResourcePoints(prevLifepath); + } + } + + this.calculateGeneralSkillPoints = function(){ + if(this.generalSkillPtsIsCalculated){ + this.innerCalculateGeneralSkillPoints(); + } + } + + /* Modify the skill points, resource points, trait points, and stat points + on this object based on the diminishing returns rules and the previously taken lifepaths: + + - The second time a lifepath is taken .... if there is no second trait, subtract 1 from the trait points on the path. + - The third time he only receives half the skill and resource points but no trait or stat points. + - The fourth time the character only earns half the resource points and nothing else except years. + + The passed 'selectedLifepaths' object should be the list of DisplayLifepaths BEFORE this lifepath is added. + */ + this.modifyForDiminishingReturns = function(selectedLifepaths){ + var times = 0; + for(var i = 0; i < selectedLifepaths.length; i++){ + if (selectedLifepaths[i].displayName == this.displayName){ + times++; + } + } + + if( times == 1 ){ + // Second time + if(this.traits.length < 2 && this.traitPts > 0){ + this.traitPts--; + } + } + else if( times == 2 ){ + // Third time + this.generalSkillPts = Math.floor(this.generalSkillPts/2); + this.lifepathSkillPts = Math.floor(this.lifepathSkillPts/2); + this.resourcePts = Math.floor(this.resourcePts/2); + this.stat = []; + this.traitPts = 0; + } + else if( times >= 3 ){ + // Fourth time + this.generalSkillPts = 0; + this.lifepathSkillPts = 0; + this.resourcePts = Math.floor(this.resourcePts/2); + this.stat = []; + this.traitPts = 0; + } + } + + this.applyBrutalLife = function(selectedLifepaths){ + // Number of lifepaths taken including this one. + var num = selectedLifepaths.length + 1; + + if ( num > 4 ){ + this.brutalLifeDOF = Math.floor(Math.random()*6+1); + if (this.brutalLifeDOF == 1 || num > 9 && this.brutalLifeDOF == 2){ + switch(num){ + case 5: + this.brutalLifeTraitName = "Missing Digit"; + break; + case 6: + this.brutalLifeTraitName = "Lame"; + break; + case 7: + this.brutalLifeTraitName = "Missing Eye"; + break; + case 8: + this.brutalLifeTraitName = "Missing Hand"; + break; + case 9: + this.brutalLifeTraitName = "Missing Limb"; + break; + default: + this.brutalLifeTraitName = "Missing Limb"; + } + } + } + } + + this.replaceWeaponOfChoice = function() { + if( this.weaponOfChoice ){ + replaceWeaponOfChoice(this, this.weaponOfChoice); + } + } + +} + +/**** End Class DisplayLifepath ****/ + +/**** Class StartingStatPoints ****/ +function StartingStatPoints(startingStatPointsJson){ + this.startingStatPoints = startingStatPointsJson; + + // Returns mental, physical + this.lookup = function(age){ + rc = [0,0]; + if (this.startingStatPoints){ + for(var i = 0; i < this.startingStatPoints.length; i++){ + var e = this.startingStatPoints[i] + if ( e.range[0] <= age && e.range[1] >= age ){ + rc = [e.m, e.p]; + break; + } + } + } + return rc; + } +} +/**** End Class StartingStatPoints ****/ + +/**** Class DisplayStat ****/ +function DisplayStat(name){ + this.name = name; + this.shade = "B"; + // Number of mental stat points spent on this stat. + this.mentalPointsSpent = 0; + // Number of physical stat points spent on this stat. + this.physicalPointsSpent = 0; + // Number of stat points that can be spent on either physical or mental that were spent on this stat. + this.eitherPointsSpent = 0; + this.bonus = 0; + + if ( name == "Will" || name == "Perception" ) + this.type = "m"; + else + this.type = "p"; + + this.exp = function(){ + var exp = this.mentalPointsSpent + this.physicalPointsSpent + this.eitherPointsSpent; + if ( this.shade == 'G' ){ + // 5 of the summed points were used for shade shifting. + exp -= 5; + } + + exp += this.bonus; + + return exp; + } + + this.specificPointsSpent = function(){ + if("m" == this.type){ + return this.mentalPointsSpent; + } + else { + return this.physicalPointsSpent; + } + } + + this.setSpecificPointsSpent = function(v){ + if("m" == this.type){ + this.mentalPointsSpent = v; + } + else { + this.physicalPointsSpent = v; + } + + } +} +/**** End Class DisplayStat ****/ + +/**** Class DisplaySkill ****/ +// skillsdata should be the JSON skills data from the server. +function DisplaySkill(name, skillsdata){ + this.name = name; + + this.roots = [] + this.stock = null; + this.isMagic = false; + + var data = skillsdata[name]; + if ( ! data ) { + + // No defined data found. If this is a -wise, we know they are all rooted in perception. + if( endsWith(name, "-wise") ){ + this.roots = ['Perception']; + } + else { + name = getGeneralSkillNameFor(name); + var data = skillsdata[name]; + if ( ! data ) + { + console.log("Error: couldn't load data about skill " + name); + } + } + } + + if ( data ) + { + this.roots = data.roots; + if ( "stock" in data ){ + this.stock = data.stock; + } + + this.isMagic = ("magic" in data); + } + + // Is this a training skill (i.e. can't be advanced)? + this.isTraining = name.toLowerCase().substring(name.length-"training".length) == "training"; + this.isTraining = this.isTraining || (data && ("training" in data)); + + this.costToOpen = 1 + if( this.isMagic ){ + this.costToOpen = 2; + } + + this.lifepathPointsSpent = 0; + this.generalPointsSpent = 0; + this.bonus = 0; + this.roundUp = false; + + this.pointsSpent = function(){ + return this.lifepathPointsSpent + this.generalPointsSpent; + } + + this.displayRoots = function(){ + var s = ""; + for(var i = 0; i < this.roots.length; i++){ + if ( i > 0 ) + s += "/"; + s += this.roots[i]; + } + return s; + } + + this.shade = function(statsByName){ + return computeStatAverage(statsByName, this.roots)[0]; + } + + this.exp = function(statsByName){ + var sum = this.lifepathPointsSpent + this.generalPointsSpent; + if ( sum == 0 ){ + return 0; + } else { + var shadeAndExp = computeStatAverage(statsByName, this.roots); + + var round = Math.floor; + if (this.roundUp) + round = Math.ceil + + return round(shadeAndExp[1]/2) + sum - this.costToOpen + this.bonus; + } + } + + this.notes = function(){ + if ( this.isMagic ){ + return "open-ended"; + } + else { + return ""; + } + } + +} +/**** End Class DisplaySkill ****/ + +/**** Class DisplayTrait ****/ + +// traitdata should be the JSON trait data from the server. +function DisplayTrait(name, traitdata){ + this.name = name; + + var data = traitdata[name]; + + if ( ! data ){ + console.log("Error: undefined trait " + name + ". Treating as a character trait."); + this.cost = 0; + this.type = "character"; + //this.name += "*"; + this.stock = null; + this.category = null; + this.desc = null; + } + else { + + // If cost is 0, there is no cost; trait cannot be bought + this.cost = data["cost"] + this.type = data["type"] + this.desc = data["desc"]; + this.bonus = data["bonus"]; + + var rawRestrict = data["restrict"] + // Stock is one of mannish, dwarven, elven, orcish. If there is no restriction, it is set to null. + this.stock = null; + // Category is common, lifepath, or special + this.category = null; + + if ( rawRestrict ){ + for(var i = 0; i < rawRestrict.length; i++){ + var flag = rawRestrict[i]; + if( flag == "common" || flag == "lifepath" || flag == "special"){ + if ( !this.category ) + this.category = []; + this.category.push(flag); + } + else if ( flag == "mannish" || flag == "dwarven" || flag == "elven" || flag == "orcish" ){ + if ( !this.stock ) + this.stock = []; + this.stock.push(flag); + } + } + } + } + + this.typeForDisplay = function(){ + if(this.type == "character") + return "character" + else if (this.type == "call_on") + return "call-on" + else if (this.type == "die") + return "die" + else + return "?" + } + + this.nameForListDisplay = this.name + " ("+this.typeForDisplay()+", "+ this.cost + (this.cost == 1 ? "pt" : "pts") + ")"; + +} + +/**** End Class DisplayTrait ****/ + +/**** Class DisplayRelationship ****/ +function DisplayRelationship(desc, importance, isImmedFam, isOtherFam, isRomantic, isForbidden, isHateful){ + this.desc = desc; + this.importance = importance; + this.isImmedFam = isImmedFam; + this.isOtherFam = isOtherFam; + this.isRomantic = isRomantic; + this.isForbidden = isForbidden; + this.isHateful = isHateful; + + // Calculate cost of current relationship + this.cost = 0; + if (importance == "minor"){ + this.cost = 5; + } else if (importance == "significant"){ + this.cost = 10; + } else if (importance == "powerful"){ + this.cost = 15; + } + if ( isImmedFam ) + this.cost -= 2; + if ( isOtherFam ) + this.cost -= 1; + if ( isRomantic ) + this.cost -= 2; + if ( isForbidden ) + this.cost -= 1; + if ( isHateful ) + this.cost -= 2; + + if ( this.cost < 0 ) + this.cost = 0; + + this.forDisplay = function(){ + var s = this.desc; + s += "; " + this.importance + if( this.isImmedFam ) + s += ", immed. fam."; + if( this.isOtherFam ) + s += ", family"; + if( this.isRomantic) + s += ", romantic"; + if( this.isForbidden) + s += ", forbidden"; + if( this.isHateful) + s += ", hateful"; + return s; + } +} +/**** End Class DisplayRelationship ****/ + +/**** Class DisplayGear ****/ +function DisplayGear(desc, cost){ + this.desc = desc; + this.cost = cost; + + this.forDisplay = function(){ + return this.desc; + } +} +/**** End Class DisplayGear ****/ + +/**** Class DisplayAffiliation ****/ +function DisplayAffiliation(desc, importance){ + this.desc = desc; + this.importance = importance; + + // Calculate cost of current relationship + this.cost = 0; + this.dice = 0; + if (importance == "small"){ + this.cost = 10; + this.dice = 1; + } else if (importance == "large"){ + this.cost = 25; + this.dice = 2; + } else if (importance == "national"){ + this.cost = 50; + this.dice = 3; + } + + this.forDisplay = function(){ + var s = this.desc; + s += "; " + this.importance + return s; + } +} +/**** End Class DisplayAffiliation ****/ + +/**** Class DisplayReputation ****/ +function DisplayReputation (desc, importance){ + this.desc = desc; + this.importance = importance; + + // Calculate cost of current relationship + this.cost = 0; + this.dice = 0; + if (importance == "local"){ + this.cost = 7; + this.dice = 1; + } else if (importance == "regional"){ + this.cost = 25; + this.dice = 2; + } else if (importance == "national"){ + this.cost = 45; + this.dice = 3; + } + + this.forDisplay = function(){ + var s = this.desc; + s += "; " + this.importance + return s; + } +} +/**** End Class DisplayReputation ****/ + +/**** Class Alert ****/ +function Alert(desc, type){ + this.desc = desc; + if(type != 'warn' && type != 'succ'){ + console.log("Alert constructor: unknown type " + type); + type = 'warn'; + } + + this.type = type; +} +/**** End Class Alert ****/ + +/**** Class PTGS ****/ +function PTGS() { + this.su = 0 + this.li = 0 + this.mi = 0 + this.se = 0 + this.tr = 0 + this.mo = 0 + + this.calculate = function(forte, mortal) { + this.su = Math.floor(forte/2)+1 + + /* Put Light, Midi, Severe, and Traumatic as far right as possible, then + * move them backwards to satisfy the constraint that they may only be + * as far apart as half forte rounded up. + */ + + gap = Math.ceil(forte/2) + + var tol = [mortal-4,mortal-3,mortal-2, mortal-1] + for(i = 0; i < 4; i++) { + last = this.su + if (i > 0) + last = tol[i-1]; + + if (tol[i] - last > gap) + tol[i] = last+gap + + if (tol[i] < this.su) + tol[i] = this.su; + } + + this.li = tol[0] + this.mi = tol[1] + this.se = tol[2] + this.tr = tol[3] + this.mo = mortal + } +} +/**** End PTGS ****/ + +/**** Class TraitBonus ****/ +// Bonuses for a single trait +function TraitBonus(traitName, traitExpr) { + this.traitName = traitName; + this.traitExpr = traitExpr; + + this.shadeBonusForSkill = {}; + this.shadeBonusForAttr = {}; + this.addBonusForStat = {}; + this.addBonusForAttr = {}; + this.addBonusForSkill = {}; + this.addBonusForStatPool = {}; + this.addBonusForReputation = {}; + this.setBonusForStatMax = {}; + this.setBonusForAttrMax = {}; + this.addBonusForStatMax = {}; + this.addBonusForAttrMax = {}; + + this.roundingBonusForSkillsWithAnyRootIn = {}; + this.roundingBonusForSkillsWithAllRootsIn = {}; + this.roundingBonusForSkill = function(displaySkill) { + var bonus = false; + + for(var i = 0; i < displaySkill.roots.length; i++) { + var root = displaySkill.roots[i]; + var b = this.roundingBonusForSkillsWithAnyRootIn[root]; + if (b) { + bonus = true; + break; + } + } + + if (bonus) + return true; + + // If there is no criteria for roundingBonusForSkillsWithAllRootsIn, fail + if (hashValues(this.roundingBonusForSkillsWithAllRootsIn).length == 0) + return false; + + bonus = true; + for (var key in this.roundingBonusForSkillsWithAllRootsIn) { + var hasRoot = false; + for(var i = 0; i < displaySkill.roots.length; i++) { + var root = displaySkill.roots[i]; + if (root == key) { + hasRoot = true; + break; + } + } + + if (!hasRoot) { + bonus = false; + break; + } + } + + return bonus; + } + + // Parse the trait expression. It has the form: + /* + [ + { + target: [+skills, +choose], + value: [+add, 2] + }, + { + target: [+total_physical, +choose], + value: [+add, 1] + } + ] + */ + + this.parseStatOrAttrBonus = function(target, value){ + var type = target[0]; + target = target.slice(1); + for(var i = 0; i < target.length; i++){ + target[i] = capitalizeEachWord(target[i]); + if (value[0] == '+add') { + // [+add, 1] + if (type == '+stat') { + this.addBonusForStat[target[i]] = value[1]; + } else { + this.addBonusForAttr[target[i]] = value[1]; + } + } else { + console.log("TraitBonus.parseStatOrAttrBonus: unknown value operation ", value[0]); + } + } + } + + this.parseTotalPoolBonus = function(target, value) { + this.addBonusForStatPool[target[1]] = value[1]; + } + + this.parseStatOrAttrMaxBonus = function(target, value){ + var type = target[0]; + target = target.slice(1); + for(var i = 0; i < target.length; i++){ + target[i] = capitalizeEachWord(target[i]); + if (value[0] == '+add') { + // [+add, 1] + if (type == '+stat') { + this.addBonusForStatMax[target[i]] = value[1]; + } else { + this.addBonusForAttrMax[target[i]] = value[1]; + } + } else if (value[0] == '+set') { + // [+set, 1] + if (type == '+stat') { + this.setBonusForStatMax[target[i]] = value[1]; + } else { + this.setBonusForAttrMax[target[i]] = value[1]; + } + } else { + console.log("TraitBonus.parseStatOrAttrMaxBonus: unknown value operation ", value[0]); + } + } + } + + this.parseSkillsBonus = function(target, value){ + var type = target[0]; + target = target.slice(1); + for(var i = 0; i < target.length; i++){ + target[i] = capitalizeEachWord(target[i]); + if (value[0] == '+add') { + // [+add, 1] + this.addBonusForSkill[target[i]] = value[1]; + } else { + console.log("TraitBonus.parseSkillsBonus: unknown value operation ", value[0]); + } + } + } + + this.parseSkillsHavingBonus = function(target, value){ + var type = target[0]; + var anyOrAll = target[1]; + target = target.slice(2); + + for(var i = 0; i < target.length; i++){ + target[i] = capitalizeEachWord(target[i]); + if (value[0] == '+round_up') { + // [+round_up] + + if (anyOrAll == '+any_root') { + this.roundingBonusForSkillsWithAnyRootIn[target[i]] = true; + } else { + this.roundingBonusForSkillsWithAllRootsIn[target[i]] = true; + } + } else { + console.log("TraitBonus.parseSkillsHavingBonus: unknown value operation ", value[0]); + } + } + } + + if (this.traitExpr == null) { + // No bonuses on this trait + return; + } + + for(var i = 0; i < traitExpr.length; i++){ + target = traitExpr[i].target; + value = traitExpr[i].value; + + if (target[0] == '+stat' || target[0] == '+attr') { + this.parseStatOrAttrBonus(target, value); + } else if (target[0] == '+pool') { + this.parseTotalPoolBonus(target, value); + } else if (target[0] == '+stat_max' || target[0] == '+attr_max') { + this.parseStatOrAttrMaxBonus(target, value); + } else if (target[0] == '+skills') { + this.parseSkillsBonus(target, value); + } else if (target[0] == '+skills_having') { + this.parseSkillsHavingBonus(target, value); + } else { + console.log("TraitBonus: unknown expression type ", target); + } + } + + +} +/**** End TraitBonus ****/ + +/**** Class TraitBonuses ****/ +// Aggregates together the bonuses for all traits. +function TraitBonuses() { + this.traits = {}; + + // Add a trait who's bonuses we want to later be able to lookup. + this.addTrait = function(trait, traitExpr) { + this.traits[trait] = new TraitBonus(trait, traitExpr.bonus); + } + + this.delTrait = function(trait) { + delete this.traits[trait]; + } + + this.getAddBonusesFor = function(what, key) { + var bonus = 0; + for (var traitName in this.traits) { + traitBonus = this.traits[traitName]; + var v = 0 + if (what == "stat") { + v = getOrDefault(traitBonus.addBonusForStat, key, 0, null); + } else if (what == "attr") { + v = getOrDefault(traitBonus.addBonusForAttr, key, 0, null); + } else if (what == "skill") { + v = getOrDefault(traitBonus.addBonusForSkill, key, 0, null); + } else if (what == "statmax") { + v = getOrDefault(traitBonus.addBonusForStatMax, key, 0, null); + } else if (what == "attrmax") { + v = getOrDefault(traitBonus.addBonusForAttrMax, key, 0, null); + } else if (what == "pool") { + v = getOrDefault(traitBonus.addBonusForStatPool, key, 0, null); + } + + bonus += v + } + return bonus; + } + + this.getSetBonusesFor = function(what, key) { + var bonus = -1; + for (var traitName in this.traits) { + traitBonus = this.traits[traitName]; + var v = 0 + if (what == "statmax") { + v = getOrDefault(traitBonus.setBonusForStatMax, key, -1, null); + } else if (what == "attrmax") { + v = getOrDefault(traitBonus.setBonusForAttrMax, key, -1, null); + } + + // Of all the bonuses that try to set this stat/attr max, + // take the minimum. + if (v > -1) { + if (bonus == -1 || bonus > v) { + bonus = v + } + } + } + return bonus; + } + + this.getAddBonusesForStat = function(stat) { + return this.getAddBonusesFor("stat", stat); + } + + this.getAddBonusesForAttr = function(attr) { + return this.getAddBonusesFor("attr", attr); + } + + this.getAddBonusesForSkill = function(skill) { + return this.getAddBonusesFor("skill", skill); + } + + this.getAddBonusesForAttrMax = function(attr) { + return this.getAddBonusesFor("attrmax", attr); + } + + this.getAddBonusesForStatMax = function(stat) { + return this.getAddBonusesFor("statmax", stat); + } + + // catg should be 'physical' or 'mental' + this.getAddBonusesForStatPool = function(catg) { + return this.getAddBonusesFor("pool", catg); + } + + // If there is a bonus that sets the max value of the attribute, + // return the value it should be set to. Otherwise, return -1. + this.getSetBonusesForAttrMax = function(attr) { + return this.getSetBonusesFor("attrmax", attr); + } + + // If there is a bonus that sets the max value of the stat, + // return the value it should be set to. Otherwise, return -1. + this.getSetBonusesForStatMax = function(stat) { + return this.getSetBonusesFor("statmax", stat); + } + + this.getRoundUpBonusForSkill = function(displaySkill) { + for (var traitName in this.traits) { + traitBonus = this.traits[traitName]; + + if (traitBonus.roundingBonusForSkill(displaySkill)) { + return true; + } + } + return false; + } + +/* + // Returns the type of choice needed if a trait needs the user to + // choose a Stat, Skill, Reputation, etc. + this.choiceNeeded(trait_expr) + + // Return any 'shift to X' bonuses for the named skill. + // Returns the shade to shift to. + this.getShadeBonusesForSkill(skill) + this.getShadeBonusesForAttr(attr) + + this.getAddBonusesForReputation(reputationName) + +*/ + // See function areLifepathRequirementsSatisfied($scope, rexpr){ +} + +/**** End TraitBonuses ****/ + diff --git a/src/public/js/burning-modal.js b/src/public/js/burning-modal.js new file mode 100755 index 0000000..1b30aa5 --- /dev/null +++ b/src/public/js/burning-modal.js @@ -0,0 +1,226 @@ +// For use with the angular ui bootstrap Modal call +function AppropriateWeaponsModalCtrl($scope, $modalInstance, lifepathName, chosen) { + $scope.chosen = {} + for(var i = 0; i < chosen.length; i++){ + $scope.chosen[chosen[i]] = true; + } + + $scope.lifepathName = lifepathName; + + $scope.weaponSkillsNames = function(){ + return weaponSkillsNames(); + } + + $scope.ok = function(){ + var chosen = []; + for(key in $scope.chosen){ + if( $scope.chosen[key] == true ){ + chosen.push(key); + } + } + + $modalInstance.close(chosen); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + +} + +// For use with the angular ui bootstrap Modal call +function WeaponOfChoiceModalCtrl($scope, $modalInstance, lifepathName) { + $scope.chosen = [weaponSkillsNames()[0]]; + $scope.lifepathName = lifepathName; + + $scope.weaponSkillsNames = function(){ + return weaponSkillsNames(); + } + + $scope.ok = function(){ + $modalInstance.close($scope.chosen[0]); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + +} + +// For use with the angular ui bootstrap Modal call +function EmotionalAttributeModalCtrl($scope, $modalInstance, attributeName, questions, displayEmotionalMath) { + $scope.attributeName = attributeName; + + //$scope.questions = ["Where do you live?"]; + $scope.questions = questions; + $scope.displayEmotionalMath = displayEmotionalMath; + + $scope.ok = function(){ + $modalInstance.close($scope.questions); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + + $scope.formatModifier = function(val){ + if ( null == val ) + return "?"; + + if(val > 0){ + return "+"+val; + } + else { + return val.toString(); + } + } +} + +function ChooseCharacterModalCtrl($scope, $modalInstance, characterStorage, message) { + $scope.characterStorage = characterStorage; + + $scope.message = message; + + $scope.characterIdAndName = null; + if(characterStorage.characterIdAndNames.length > 0){ + $scope.characterIdAndName = characterStorage.characterIdAndNames[0]; + } + + $scope.ok = function(characterIdAndName){ + $modalInstance.close(characterIdAndName); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; +} + +function TraitSearchModalCtrl($scope, $modalInstance, specialTraitsForDisplay, unspentTraitPoints, totalTraitPoints) { + $scope.specialTraitsForDisplay = specialTraitsForDisplay; + + $scope.data = {currentTrait: specialTraitsForDisplay[0]} + + $scope.unspentTraitPoints = unspentTraitPoints; + $scope.totalTraitPoints = totalTraitPoints; + + // See https://github.com/angular/angular.js/wiki/Understanding-Scopes + // It explains the reason we can't simply make a typeFilter property on this scope + // and have it work from the modal. We need to make a non-primitive type + // for this to work. + $scope.filters = {typeFilter: "", costFilter: "", canAfford: true} + + $scope.makeCostFilterFunc = function(){ + var matches = $scope.filters.costFilter.match(/([<=>])\s*(\d+)/); + if(! matches){ + //console.log("ChooseCharacterModalCtrl.makeCostFilterFunc: invalid expression"); + return null; + } + + var operand = parseInt(matches[2]); + + if(matches[1] == '<'){ + return function(val){ + return val < operand; + } + } + else if(matches[1] == '>'){ + return function(val){ + return val > operand; + } + } + else { + return function(val){ + return val == operand; + } + } + } + + + $scope.filteredTraits = function(){ + var list = []; + + var costFunc = $scope.makeCostFilterFunc(); + + var currentTraitInList = false; + + for(var i = 0; i < $scope.specialTraitsForDisplay.length;i++){ + var trait = $scope.specialTraitsForDisplay[i]; + if($scope.filters.typeFilter != "" && trait.type != $scope.filters.typeFilter) + continue; + + if(costFunc && !costFunc(trait.cost)) + continue; + + if($scope.filters.canAfford && trait.cost > $scope.unspentTraitPoints) + continue; + + if($scope.data.currentTrait && $scope.data.currentTrait.name == trait.name) + currentTraitInList = true; + + list.push(trait); + } + + if(!currentTraitInList) + $scope.data.currentTrait = list[0]; + + return list; + } + + $scope.ok = function(){ + $modalInstance.close($scope.data.currentTrait); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; +} + +function UploadCharacterModalCtrl($scope, $modalInstance) { + $scope.ok = function(){ + $modalInstance.close(); + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; +} + +// For use with the angular ui bootstrap Modal call +function StatPenaltyModalCtrl($scope, $modalInstance, lifepath, amount) { + $scope.amount = amount; + $scope.lifepath = lifepath; + $scope.unspentAmount = amount; + + $scope.pool = { + 'physical': 0, + 'mental': 0 + } + + $scope.ok = function(){ + if ($scope.unspentAmount == 0) { + $modalInstance.close($scope.pool); + } + } + + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + + $scope.incrementPool = function(pool){ + if ($scope.unspentAmount <= 0) + return; + + $scope.pool[pool]++; + $scope.unspentAmount--; + } + + $scope.decrementPool = function(pool){ + if ($scope.pool[pool] <= 0) + return; + + $scope.pool[pool]--; + $scope.unspentAmount++; + } + +} + diff --git a/src/public/js/burning-serialize.js b/src/public/js/burning-serialize.js new file mode 100755 index 0000000..20a00f7 --- /dev/null +++ b/src/public/js/burning-serialize.js @@ -0,0 +1,335 @@ +function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropriateWeapons){ + $scope.name = charStruct.name; + $scope.gender = charStruct.gender; + $scope.stock = charStruct.stock; + + // Appropriate weapons must be loaded before calculateLifepathSkills is called. + if(serverSettings.storageType != 'server'){ + appropriateWeapons.appropriateWeapons = charStruct.approp_weapons; + } + + calculateGearSelectionLists($scope, burningData); + calculatePropertySelectionLists($scope, burningData); + + // Load lifepaths + var selectedLifepaths = []; + for(var i = 0; i < charStruct.lifepaths.length; i++){ + var lp = charStruct.lifepaths[i]; + // lp[0] is setting name, lp[1] is lifepath name. + // lp[2] is brutalLifeDOF, lp[3] is brutalLifeTraitName, + // lp[4] is lifepath time, if it's variable and the user selected a value + // lp[5] is the replacement skill for 'Weapon Of Choice' if it's present. + // lp[6] is the replacement stat array, if present. This is needed if the + // lifepath had a stat penalty. + + var setting = burningData.lifepaths[$scope.stock][lp[0]]; + if (!setting) + return; + + var lifepath = setting[lp[1]]; + if (!lifepath) + return; + displayLp = new DisplayLifepath(lp[0], lp[1], lifepath); + displayLp.brutalLifeDOF = lp[2]; + displayLp.brutalLifeTraitName = lp[3]; + if (displayLp.timeIsChoosable && lp[4] != null) + displayLp.time = lp[4]; + + if (lp[5] != null) + displayLp.weaponOfChoice = lp[5]; + + if (lp[6] != null) + displayLp.stat = lp[6] + + var prevLifepath = null; + if(selectedLifepaths.length > 0) + prevLifepath = selectedLifepaths[selectedLifepaths.length-1]; + displayLp.calculateResourcePoints(prevLifepath); + + displayLp.modifyForDiminishingReturns(selectedLifepaths); + selectedLifepaths.push(displayLp); + } + $scope.selectedLifepaths = selectedLifepaths; + + // Load stat points + for(var i = 0; i < charStruct.stats.length; i++){ + var stat = charStruct.stats[i]; + var displayStat = $scope.statsByName[stat.name]; + if ( displayStat ){ + displayStat.shade = stat.shade + displayStat.mentalPointsSpent = stat.mentalPoints + displayStat.physicalPointsSpent = stat.physicalPoints + displayStat.eitherPointsSpent = stat.eitherPoints + } + } + + + calculateAge($scope); + calculateTotalStatPoints($scope, burningData); + calculateUnspentStatPoints($scope); + calculateLifepathSkills($scope, burningData, appropriateWeapons); + calculatePTGS($scope); + + // Load skills + for(var i = 0; i < charStruct.skills.lifepath.length; i++){ + var skill = charStruct.skills.lifepath[i]; + var displaySkill = $scope.lifepathSkills[skill.name]; + if ( displaySkill ){ + displaySkill.lifepathPointsSpent = skill.lifepathPoints; + displaySkill.generalPointsSpent = skill.generalPoints; + } + } + + // General skills must be added. + for(var i = 0; i < charStruct.skills.general.length; i++){ + var skill = charStruct.skills.general[i]; + + var displaySkill = null; + if (skill.name in burningData.skills && !(skill.name in $scope.lifepathSkills)){ + displaySkill = new DisplaySkill(skill.name, burningData.skills); + $scope.generalSkills[skill.name] = displaySkill; + } + + if ( displaySkill ){ + displaySkill.lifepathPointsSpent = skill.lifepathPoints; + displaySkill.generalPointsSpent = skill.generalPoints; + } + } + + calculateTotalSkillPoints($scope); + openRequiredSkills($scope); + calculateUnspentSkillPoints($scope); + calculateSettingNames($scope, burningData); + calculateCurrentSettingLifepathNames($scope, burningData); + calculateLifepathTraits($scope, burningData); + setCommonTraits($scope, burningData); + purchaseRequiredTraits($scope, burningData); + calculateUnspentTraitPoints($scope); + addBrutalLifeRequiredTraits($scope, burningData); + + // Load Traits + for(var i = 0; i < charStruct.traits.length; i++){ + var trait = charStruct.traits[i]; + if( $scope.purchasedTraits[trait.name] ){ + continue; + } + + var displayTrait = new DisplayTrait(trait.name, burningData.traits); + $scope.purchasedTraits[trait.name] = displayTrait; + + if( $scope.lifepathTraits[trait.name] ){ + $scope.unspentTraitPoints -= 1; + } + else { + $scope.unspentTraitPoints -= displayTrait.cost; + } + } + calculateTraitWarnings($scope, burningData); + + // Load Resources + $scope.gear = {}; + for(var i = 0; i < charStruct.gear.length; i++){ + var gear = charStruct.gear[i]; + $scope.gear[gear.desc] = new DisplayGear(gear.desc, gear.cost); + } + + $scope.property = {}; + for(var i = 0; i < charStruct.property.length; i++){ + var property = charStruct.property[i]; + $scope.property[property.desc] = new DisplayGear(property.desc, property.cost); + } + + $scope.relationships = {}; + for(var i = 0; i < charStruct.relationships.length; i++){ + var rel = charStruct.relationships[i]; + $scope.relationships[rel.desc] = new DisplayRelationship( + rel.desc, + rel.importance, + rel.isImmedFam, + rel.isOtherFam, + rel.isRomantic, + rel.isForbidden, + rel.isHateful + ); + } + + $scope.affiliations = {}; + for(var i = 0; i < charStruct.affiliations.length; i++){ + var affil = charStruct.affiliations[i]; + $scope.affiliations[affil.desc] = new DisplayAffiliation(affil.desc, affil.importance); + } + + $scope.reputations = {}; + for(var i = 0; i < charStruct.reputations.length; i++){ + var rep = charStruct.reputations[i]; + $scope.reputations[rep.desc] = new DisplayReputation(rep.desc, rep.importance); + } + + calculateTotalResourcePoints($scope); + calculateUnspentResourcePoints($scope); + applyBonusesFromTraits($scope); + + // Load attribute modifying questions + $scope.attributeModifierQuestionResults = loadAttributeModifierQuestionResultsFromSave($scope, charStruct.attr_mod_questions); + + $scope.brutalLifeWithdrawn = charStruct.brutal_life_withdrawn; + +} + +function convertCurrentCharacterToStruct($scope, appropriateWeapons) { + // To serialize: + // - Serialized version + // - Character name + // - Stock + // - Gender + // - A list Lifepath names, with setting: [setting, lifepath] + // - How many points were spent on which stat + // - A list of skills that points were spent on, and how many points + // - A list of traits + // - A list of gear, property, relationships, reputations, and affiliations + // - A hash containing the answers to attribute-modifying questions + // - If we are not using the server storage backend, save the appropriate weapons settings + + // Structure: + var chardata = { + "serialize_version": serializeVersion, + "name" : $scope.name, + "gender" : $scope.gender, + "stock" : $scope.stock, + }; + + var lifepaths = []; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + var lp = [displayLp.setting, displayLp.name, displayLp.brutalLifeDOF, displayLp.brutalLifeTraitName]; + if( displayLp.timeIsChoosable ){ + lp.push(displayLp.time); + } else { + lp.push(null); + } + + if( displayLp.weaponOfChoice ){ + lp.push(displayLp.weaponOfChoice); + } else { + lp.push(null); + } + + lp[6] = displayLp.stat; + + lifepaths.push(lp); + } + chardata.lifepaths = lifepaths; + + var stats = []; + for(var i = 0; i < $scope.stats.length; i++){ + var displayStat = $scope.stats[i]; + + stats.push({ + "name" : displayStat.name, + "shade" : displayStat.shade, + "mentalPoints" : displayStat.mentalPointsSpent, + "physicalPoints" : displayStat.physicalPointsSpent, + "eitherPoints" : displayStat.eitherPointsSpent + }); + } + chardata.stats = stats; + + + var lifepathSkills = []; + var generalSkills = []; + var addSkillTo = function(list, displaySkill){ + list.push({ + "name" : displaySkill.name, + "lifepathPoints" : displaySkill.lifepathPointsSpent, + "generalPoints" : displaySkill.generalPointsSpent, + }); + } + for(var key in $scope.lifepathSkills){ + var displaySkill = $scope.lifepathSkills[key]; + addSkillTo(lifepathSkills, displaySkill); + } + for(var key in $scope.generalSkills){ + var displaySkill = $scope.generalSkills[key]; + addSkillTo(generalSkills, displaySkill); + } + chardata.skills = { + "lifepath" : lifepathSkills, + "general" : generalSkills, + }; + + var traits = []; + for(var key in $scope.purchasedTraits){ + var displayTrait = $scope.purchasedTraits[key]; + traits.push({ + "name" : displayTrait.name + }); + } + chardata.traits = traits; + + // Resources + var serializeResource = function(resourceHash, coder){ + var resourceList = hashValues(resourceHash); + var res = []; + for(var i = 0; i < resourceList.length; i++){ + var display = resourceList[i]; + res.push( coder(display) ); + } + return res; + } + + var res = serializeResource( $scope.gear, function(display){ + return { + "cost" : display.cost, + "desc" : display.desc + }; + }); + chardata.gear = res; + + var res = serializeResource( $scope.property, function(display){ + return { + "cost" : display.cost, + "desc" : display.desc + }; + }); + chardata.property = res; + + var res = serializeResource( $scope.relationships, function(display){ + return { + "desc" : display.desc, + "importance" : display.importance, + "isImmedFam" : display.isImmedFam, + "isOtherFam" : display.isOtherFam, + "isRomantic" : display.isRomantic, + "isForbidden" : display.isForbidden, + "isHateful" : display.isHateful + }; + }); + chardata.relationships = res; + + var res = serializeResource( $scope.affiliations, function(display){ + return { + "desc" : display.desc, + "importance" : display.importance + }; + }); + chardata.affiliations = res; + + var res = serializeResource( $scope.reputations, function(display){ + return { + "desc" : display.desc, + "importance" : display.importance + }; + }); + chardata.reputations = res; + + chardata.attr_mod_questions = convertAttributeModifierQuestionResultsForSave($scope); + + chardata.brutal_life_withdrawn = $scope.brutalLifeWithdrawn; + + if(serverSettings.storageType != 'server'){ + chardata.approp_weapons = appropriateWeapons.appropriateWeapons; + } + + return chardata; +} + diff --git a/src/public/js/burning-service.js b/src/public/js/burning-service.js new file mode 100755 index 0000000..98c51f3 --- /dev/null +++ b/src/public/js/burning-service.js @@ -0,0 +1,398 @@ + +/**** Class Settings (Angular Service) ****/ +function Settings() { + this.enforceLifepathReqts = true; + this.enforcePointLimits = true; + this.displayEmotionalMath = false; +} +/**** End Class Settings ****/ + +/**** Class AppropriateWeaponsService (Angular Service) ****/ +function AppropriateWeaponsService($modal, $http) { + // This class will store a hash which maps lifepath names to a list of + // weapons that are appropriate for that lifepath. + this.appropriateWeapons = {}; + + var myself = this; + + this.loadFromServer = function(){ + if(serverSettings.storageType != 'server'){ + return; + } + + $http.get("/get_approp_weapons/user1", {'timeout': 3000} ). + success(function(data,status,headers,config){ + if (data){ + myself.appropriateWeapons = data + } + console.log("Loaded saved appropriate weapons"); + }). + error(function(data,status,headers,config){ + console.log("Error: Loading appropriate weapons from server failed: HTTP code " + status + ": " + data); + }); + } + + this.saveToServer = function(){ + if(serverSettings.storageType != 'server'){ + return; + } + + var json = angular.toJson(myself.appropriateWeapons, true); + $http.post("/update_approp_weapons/user1", json). + success(function(data,status,headers,config){ + console.log("Saved appropriate weapons"); + }). + error(function(data,status,headers,config){ + console.log("Error: Saving appropriate weapons to server failed: HTTP code " + status + ": " + data); + }); + } + + this.loadFromServer(); + + // Replace the 'Appropriate Weapons' entry on the lifepath with the given list. + this.replaceAppropriateWeapons = function (displayLp, replacementList){ + var newList = []; + if ( ! replacementList ){ + // There is no replacement for Appropriate Weapons, so leave it alone. + return; + } + + var replacementHash = listToHash(replacementList); + + for(var i = 0; i < displayLp.skills.length; i++){ + var skillName = displayLp.skills[i]; + if(skillName != 'Appropriate Weapons' && ! replacementHash[skillName]) + { + newList.push(displayLp.skills[i]); + } + } + displayLp.skills = newList.concat(replacementList); + } + + this.replaceAppropriateWeaponsUsingSaved = function (displayLp){ + this.replaceAppropriateWeapons(displayLp, this.appropriateWeapons[displayLp.name]); + } + + this.hasAppropriateWeapons = function (displayLp){ + var has = false; + for(var i = 0; i < displayLp.skills.length; i++){ + if(displayLp.skills[i] == 'Appropriate Weapons') + { + has = true; + break; + } + } + return has; + } + + var myself = this; + + this.selectAppropriateWeapons = function (displayLp, onSelect){ + if( this.hasAppropriateWeapons(displayLp) ){ + this.selectAppropriateWeaponsByLifepathName(displayLp.name, function(selected){ + myself.replaceAppropriateWeapons(displayLp, selected); + + if ( onSelect ){ + onSelect(); + } + }) + } + } + + this.selectAppropriateWeaponsByLifepathName = function (lifepathName, onSelect){ + var modalInstance = $modal.open({ + templateUrl: '/choose_appropriate_weapons_partial', + controller: AppropriateWeaponsModalCtrl, + resolve: { + lifepathName: function () { + return lifepathName; + }, + chosen: function () { + if ( myself.appropriateWeapons[lifepathName] ) + return myself.appropriateWeapons[lifepathName]; + else + return []; + } + } + }); + + modalInstance.result.then(function (selected) { + console.log("Modal: User selected:"); + console.log(selected); + myself.appropriateWeapons[lifepathName] = selected; + myself.saveToServer(); + if ( onSelect ){ + onSelect(selected); + } + }, function () { + console.log("Modal: User cancelled"); + }); + } +} +/**** End Class AppropriateWeaponsService ****/ + +// Replace the 'Weapon of Choice' entry on the lifepath with the given weapon. +function replaceWeaponOfChoice(displayLp, weapon){ + var newList = []; + + if ( ! weapon ){ + // There is no replacement, so leave it alone. + return; + } + + for(var i = 0; i < displayLp.skills.length; i++){ + var skillName = displayLp.skills[i]; + if(skillName != 'Weapon Of Choice' && skillName != weapon) + { + newList.push(displayLp.skills[i]); + } + } + newList.push(weapon); + displayLp.skills = newList; +} + +/**** Class WeaponOfChoiceService (Angular Service) ****/ +function WeaponOfChoiceService($modal, $http) { + + var myself = this; + + this.hasWeaponOfChoice = function (displayLp){ + var has = false; + for(var i = 0; i < displayLp.skills.length; i++){ + if(displayLp.skills[i] == 'Weapon Of Choice') + { + has = true; + break; + } + } + return has; + } + + this.selectWeaponOfChoice = function (displayLp, onSelect){ + if( this.hasWeaponOfChoice(displayLp) ){ + this.selectWeaponOfChoiceByModal(displayLp.name, function(selected){ + displayLp.weaponOfChoice = selected; + replaceWeaponOfChoice(displayLp, selected); + + if ( onSelect ){ + onSelect(); + } + }) + } + } + + this.selectWeaponOfChoiceByModal = function (lifepathName, onSelect){ + var modalInstance = $modal.open({ + templateUrl: '/choose_weapon_of_choice_partial', + controller: WeaponOfChoiceModalCtrl, + resolve: { + lifepathName: function () { + return lifepathName; + } + } + }); + + modalInstance.result.then(function (selected) { + console.log("Modal: User selected:"); + console.log(selected); + if ( onSelect ){ + onSelect(selected); + } + }, function () { + console.log("Modal: User cancelled"); + }); + } + + +} + +/**** End Class WeaponOfChoiceService ****/ + +/**** Class CharacterStorageService ****/ +function CharacterStorageService($http) { + this.currentCharacter = null; + + this.characterIdAndNames = []; + + myself = this; + + /* Load character names from server */ + this.loadCharacterNames = function(){ + $http.get("/list_chars/user1", {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.characterIdAndNames = data; + console.log("Loaded saved character names"); + }). + error(function(data,status,headers,config){ + console.log("Error: Loading saved character names from server failed: HTTP code " + status + ": " + data); + }); + } + + this.loadCharacterNames(); +} + +/**** End Class CharacterStorageService ****/ + +/**** Class BurningDataService (Angular Service) ****/ +// This service is used to load the lifepaths, skills, traits, etc. from the server. +function BurningDataService($http) { + /* JSON Data structure representing lifepaths. The structure is: + stock: + setting_name: + lifepath_name: + time: N + ... + */ + this.lifepaths = {}; + + /* JSON data structure representing all available skills. The structure is: + skill_name: + roots: [root1, root2, ...] + skill_name: + roots: [root1, root2, ...] + + */ + this.skills = {}; + + /* JSON data structure representing all available traits */ + this.traits = {}; + + /* JSON data structure representing all available resources (gear/property) */ + this.resources = {}; + + // A hash of StartingStatPoints objects keyed by stock. + this.startingStatPts = {}; + + this.dataSetsLoaded = 0; + // Total data sets: + // lifepaths: 6 (man, dwarf, elf, orc, roden, wolf) + // stat points: 6 (man, dwarf, elf, orc, roden, wolf) + // skills + // traits + // resources: 6 (man, dwarf, elf, orc, roden, wolf) + // TOTAL: 20 + this.totalDataSets = 20; + this.onAllDatasetsLoaded = null; + this.registerOnAllDatasetsLoaded = function(callback){ + if ( this.dataSetsLoaded >= this.totalDataSets ){ + callback(); + } + this.onAllDatasetsLoaded = callback; + } + + this.datasetLoaded = function(){ + this.dataSetsLoaded += 1; + if ( this.onAllDatasetsLoaded && (this.dataSetsLoaded >= this.totalDataSets) ){ + this.onAllDatasetsLoaded(); + } + if ( this.dataSetsLoaded > this.totalDataSets){ + console.log("Error: the totalDataSets setting in BurningDataService is too low! This will cause wierd errors. Please adjust it"); + } + } + + var myself = this; + + /* Load lifepaths from server */ + var loadLifepathsForStock = function(stock){ + if( ! isValidStock(stock) ){ + console.log("Loading lifepaths failed: asked to load lifepaths for invalid stock " + stock); + return + } + + $http.get("/lifepaths/" + stock, {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.lifepaths[stock] = data; + myself.datasetLoaded(); + console.log("Loaded "+stock+" lifepaths. " + Object.keys(myself.lifepaths).length + " settings"); + }). + error(function(data,status,headers,config){ + myself.datasetLoaded(); + console.log("Error: Getting "+stock+" lifepaths from server failed: HTTP code " + status + ": " + data); + }); + } + + loadLifepathsForStock("man"); + loadLifepathsForStock("dwarf"); + loadLifepathsForStock("elf"); + loadLifepathsForStock("orc"); + loadLifepathsForStock("roden"); + loadLifepathsForStock("wolf"); + + /* Load starting stat points table from server */ + var loadStartingStatPtsForStock = function(stock){ + if( ! isValidStock(stock) ){ + console.log("Loading starting stat points failed: asked to load pts for invalid stock " + stock); + return + } + + $http.get("/starting_stat_pts/" + stock, {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.startingStatPts[stock] = new StartingStatPoints(data); + myself.datasetLoaded(); + console.log("Loaded "+stock+" starting stat points. "); + }). + error(function(data,status,headers,config){ + myself.datasetLoaded(); + console.log("Error: Getting "+stock+" stat points from server failed: HTTP code " + status + ": " + data); + }); + } + + loadStartingStatPtsForStock("man"); + loadStartingStatPtsForStock("dwarf"); + loadStartingStatPtsForStock("elf"); + loadStartingStatPtsForStock("orc"); + loadStartingStatPtsForStock("roden"); + loadStartingStatPtsForStock("wolf"); + + /* Load starting stat points table from server */ + var loadResourcesForStock = function(stock){ + if( ! isValidStock(stock) ){ + console.log("Loading resources failed: asked to load for invalid stock " + stock); + return + } + + $http.get("/resources/" + stock, {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.resources[stock] = data; + myself.datasetLoaded(); + console.log("Loaded "+stock+" resources. "); + }). + error(function(data,status,headers,config){ + myself.datasetLoaded(); + console.log("Error: Getting "+stock+" stat points from server failed: HTTP code " + status + ": " + data); + }); + } + + loadResourcesForStock("man"); + loadResourcesForStock("dwarf"); + loadResourcesForStock("elf"); + loadResourcesForStock("orc"); + loadResourcesForStock("roden"); + loadResourcesForStock("wolf"); + + /* Load skills from server */ + $http.get("/skills", {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.skills = data; + myself.datasetLoaded(); + console.log("Loaded skills. "); + }). + error(function(data,status,headers,config){ + myself.datasetLoaded(); + console.log("Error: Getting skills from server failed: HTTP code " + status + ": " + data); + }); + + /* Load traits from server */ + $http.get("/traits", {'timeout': 3000} ). + success(function(data,status,headers,config){ + myself.traits = data; + myself.datasetLoaded(); + console.log("Loaded traits. "); + }). + error(function(data,status,headers,config){ + myself.datasetLoaded(); + console.log("Error: Getting traits from server failed: HTTP code " + status + ": " + data); + }); +} +/**** End BurningDataService ****/ + diff --git a/src/public/js/burning-util.js b/src/public/js/burning-util.js new file mode 100755 index 0000000..4cb2af8 --- /dev/null +++ b/src/public/js/burning-util.js @@ -0,0 +1,140 @@ +/* + Notes: + + - Type LifepathID: A specific lifepath is identified by the setting name, lifepath name tuple. This identifier is stored as + an array of two elements. +*/ + +/**** IE Hacks ****/ +if ( typeof console === "undefined" ) +{ + FakeConsole = function(){ + this.log = function log(s){ }; + } + + console = new FakeConsole(); +} + +if (!Object.keys) { + Object.keys = function (obj) { + var keys = [], k; + for (k in obj) { + if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); + } + } + return keys; + }; +} + +/**** End IE Hacks ****/ + +/**** Utility ****/ +function getOrDefault(obj, key, def, err){ + if (key in obj ){ + return obj[key]; + } + else { + if ( err ) + console.log(err); + return def; + } +} + +function getAsNumOrDefault(obj, key, def, err){ + v = getOrDefault(obj, key, def, err); + if ( isNaN(v) ){ + if ( err ) + console.log(err); + return def; + } + else { + return v; + } +} + +function listToStr(list){ + var s = ""; + + for(var i = 0; i < list.length; i++){ + if ( i > 0 ) { + s = s + ", " + list[i]; + } + else { + s = list[i]; + } + } + return s; +} + +function hashValues(hash){ + var l = []; + for(var key in hash){ + l.push(hash[key]); + } + return l; +} + +function hashKeys(hash){ + var l = []; + for(var key in hash){ + l.push(key); + } + return l; +} + +function listToHash(list){ + var h = {}; + for(var i = 0; i < list.length; i++){ + h[list[i]] = true; + } + return h; +} + +/* + Divide amt into num buckets. If there are buckets that have a value one higher than others, those higher-valued buckets are + at the beginning. +*/ +function divideIntoBuckets(amt, num){ + var result = []; + var base = Math.floor(amt / num); + var rem = amt % num; + + for(var i = 0; i < num; i++){ + result[i] = base; + if ( rem > 0 ){ + result[i]++; + rem--; + } + } + + return result; +} + +function endsWith(string, substring) +{ + var l = substring.length; + return string.length >= l && string.substring(string.length-l) == substring; +} + +function beginsWith(string, substring) +{ + var l = substring.length; + return string.length >= l && string.substring(0, substring.length) == substring; +} + +function capitalizeEachWord(string) +{ + return string.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); +} + +function getFrameByName(name) { + for (var i = 0; i < frames.length; i++) + if (frames[i].name == name) + return frames[i]; + + return null; +} + +/**** End Utility ****/ + diff --git a/src/public/js/burning.js b/src/public/js/burning.js new file mode 100755 index 0000000..7accf41 --- /dev/null +++ b/src/public/js/burning.js @@ -0,0 +1,3446 @@ + +/** +This is the version of the serialized character structure used by convertCurrentCharacterToStruct +and loadCurrentCharacterFromStruct. +TODO: the appropriate weapons choices need to be saved with the character! +*/ +var serializeVersion = 1; + +function handleIframeLoad(frameName) +{ + var frame = getFrameByName(frameName); + if ( frame != null ) + { + result = frame.document.getElementsByTagName("pre")[0].innerHTML; + + // The form's onload handler gets called when the main page is first loaded as well. + // We detect this condition by checking if the iframes contents are not empty. + if ( result.length > 0 ){ + // At this point we've uploaded a character data file and the server has sent the response (being the JSON-encoded character data) + // into the file upload iframe. We need to get the BurningCtrl $scope and call loadCurrentCharacterFromStruct with the data. + var scope = angular.element($("#accordion_main")).scope(); + try{ + var charStruct = angular.fromJson(result); + if( ! characterStructValid(charStruct) ){ + scope.$apply( + function(){ + scope.addAlert('tools', "That is not a valid character file."); + }); + } + scope.$apply( + function(){ + scope.loadCurrentCharacterFromStruct(charStruct); + } + ); + } + catch(e){ + console.log("Loading character failed: " + e); + scope.$apply( + function(){ + scope.addAlert('tools', "That is not a valid character file."); + }); + } + } + } +} + +/**** Angular ****/ + +var burningModule = angular.module('burning',['ngRoute', 'ui.bootstrap']); + +// Define the settings service +burningModule.service('settings', Settings); +burningModule.service('appropriateWeapons', AppropriateWeaponsService); +burningModule.service('characterStorage', CharacterStorageService); +burningModule.service('burningData', BurningDataService); +burningModule.service('weaponOfChoice', WeaponOfChoiceService); + +/* Set up URL routes. Different URLs map to different HTML fragments (templates)*/ +burningModule.config(function($routeProvider) { + $routeProvider. + when('/', {controller: BurningCtrl, templateUrl:'/main_partial'}). + when('/config', {controller: ConfigCtrl, templateUrl:'/config_partial'}). + when('/help', {controller: ConfigCtrl, templateUrl:'/help_partial'}). + otherwise({redirectTo:'/'}); +}); + +/* On the help page we need to use in-page links for the table of contents. + To make this work with Angular we need the following (see http://stackoverflow.com/questions/14712223/how-to-handle-anchor-hash-linking-in-angularjs) +*/ +burningModule.run(function($rootScope, $location, $anchorScroll, $routeParams) { + //when the route is changed scroll to the proper element. + $rootScope.$on('$routeChangeSuccess', function(newRoute, oldRoute) { + if($routeParams.scrollTo){ + $location.hash($routeParams.scrollTo); + $anchorScroll(); + } + }); +}); + +function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapons, weaponOfChoice, characterStorage, burningData){ + + $scope.basicAttributeNames = ["Mortal Wound", "Reflexes", "Health", "Steel", "Hesitation", "Stride", "Circles", "Resources"]; + + /** + This function is used when calculating the hierarchical select lists of gear or property + to display to the user. + + Parameters: + listForSelect: two-dimensional array, where the first index picks the level in the hierarchy, + and the second index is an item in that level of the hierarchy. + currentItem: An array indexed by level in the hierarchy, whos value is the currently + selected item at that level. + index: The starting level in the hierarchy for which we should recalculate the lower levels + of the lists. + */ + $scope.calculateHierarchyListForSelectN = function(listForSelect, currentItem, index){ + if(index < 1) + return; + + while(index < 3){ + + if(!currentItem[index-1] || !currentItem[index-1].resources) { + listForSelect[index] = []; + currentItem[index] = {}; + } + else { + listForSelect[index] = currentItem[index-1].resources; + currentItem[index] = listForSelect[index][0]; + } + + index++; + } + } + + // Initialize the controller variables to the default empty state, except for the passed parameters which override defaults. + $scope.initialize = function(stock){ + $scope.enforceLifepathReqts = settings.enforceLifepathReqts + $scope.enforcePointLimits = settings.enforcePointLimits + + /* A list of DisplayLifepath. */ + $scope.selectedLifepaths = []; + + $scope.statNames = ["Will", "Perception", "Power", "Forte", "Agility", "Speed"]; + $scope.stats = []; + $scope.statsByName = {}; + // Skill exponent calculations require all the stats, and the Hatred attribute. + $scope.statsForSkillCalc = {}; + for(var i = 0; i < $scope.statNames.length; i++){ + var n = $scope.statNames[i]; + var stat = new DisplayStat(n); + $scope.stats.push(stat); + $scope.statsByName[n] = stat; + $scope.statsForSkillCalc[n] = stat; + } + $scope.statsForSkillCalc["Hatred"] = { + "exp": function(){ + // Note: this function can't be called until $scope.attribute is defined! + return $scope.attribute("Hatred").exp; + }, + "calcshade": function(){ + return $scope.attribute("Hatred").shade; + } + }; + $scope.statsForSkillCalc["Ancestral Taint"] = { + "exp": function(){ + // Note: this function can't be called until $scope.attribute is defined! + return $scope.attribute("Ancestral Taint").exp; + }, + "calcshade": function(){ + return $scope.attribute("Ancestral Taint").shade; + } + }; + // Setting names for use in the Add Lifepath section + $scope.settingNames = ["Loading..."] + $scope.currentSettingLifepathNames = []; + // The currently selected lifepath + $scope.currentSettingLifepath = "Loading..."; + + $scope.currentRelationshipDesc = ""; + $scope.currentRelationshipImportance = "minor"; + $scope.currentRelationshipIsImmedFam = false; + $scope.currentRelationshipIsOtherFam = false; + $scope.currentRelationshipIsRomantic = false; + $scope.currentRelationshipIsForbidden = false; + $scope.currentRelationshipIsHateful = false; + + $scope.relationships = {}; + + $scope.currentGearDesc = ""; + $scope.currentGearCost = ""; + + $scope.gear = {}; + + $scope.currentPropertyDesc = ""; + $scope.currentPropertyCost = ""; + + $scope.property = {}; + + $scope.currentAffiliationDesc = ""; + $scope.currentAffiliationImportance = "small"; + + $scope.affiliations = {}; + + $scope.currentReputationDesc = ""; + $scope.currentReputationImportance = "local"; + + $scope.reputations = {}; + + // Hash containing total stat points categorized by + // type (physical, mental, either) + $scope.totalStatPoints = {"physical" : 0, "mental" : 0, "either" : 0} + $scope.unspentStatPoints = {"physical" : 0, "mental" : 0, "either" : 0} + + $scope.totalSkillPoints = {"lifepath" : 0, "general" : 0} + $scope.unspentSkillPoints = {"lifepath" : 0, "general" : 0} + + // Character name + $scope.name = ""; + + // Character stock. One of man, dwarf, orc, elf + if ( ! isValidStock(stock) ){ + console.log("Invalid stock '"+stock+"' passed to BurningCtrl.initialize. Defaulting to man"); + stock = "man"; + } + + $scope.stock = stock; + + // Character id (server side id) + $scope.charid = null; + + // Character age + $scope.age = 0; + + // Character gender + $scope.gender = "female"; + + /* Currently seleted setting in the add-lifepath section */ + $scope.currentSetting = "(Select Setting)"; + + /* Custom wise that the user has currently entered. */ + $scope.customWiseName = ""; + + /* Skills that character earned from lifepaths */ + $scope.lifepathSkills = {}; + + /* Skills that character added that use general skill points */ + $scope.generalSkills = {}; + + /* Traits that the character has chosen */ + $scope.purchasedTraits = {}; + + /* Traits that are required from lifepaths */ + $scope.requiredTraits = {}; + + /* Stock common traits */ + $scope.commonTraits = {}; + + /* Traits that are on the character's lifepaths, but not necessarily taken */ + $scope.lifepathTraits = {}; + + /* Modifiers to attributes based on the answers to questions. This applies to Greed, Steel, etc. + The hash is keyed by attribute name, and the value is a list of yes/no questions, their answers, + and the modifier applied for a yes answer. + */ + $scope.attributeModifierQuestionResults = {}; + + $scope.attributeBonuses = {}; + + /* Used to keep track of whether the user shade-shifted an attribute, for those attributes that + allow shade shifting */ + $scope.attributeShade = {'Steel': 'B', 'Grief' : 'B', 'Greed' : 'B', 'Hatred' : 'B'}; + + $scope.ptgs = new PTGS(); + + /* List of traits to show in the Choose Special Trait dropdown */ + $scope.specialTraitsForDisplay = []; + + $scope.totalTraitPoints = 0; + $scope.unspentTraitPoints = 0; + + $scope.totalResourcePoints = 0; + $scope.unspentResourcePoints = 0; + + $scope.currentGeneralSkill = "Loading...."; + + $scope.currentLifepathTrait = "Loading...."; + + $scope.currentSpecialTrait = "Loading..."; + + // Messages that warn the character of traits they must take to satisfy lifepath requirements + $scope.lifepathTraitWarnings = []; + + // Warnings shown when there is an error saving character or creating character sheet. + $scope.alerts = { + 'tools' : {}, + 'resources' : {}, + 'trait' : {} + }; + + $scope.characterStorage = characterStorage + + $scope.resourceAdderToShow = 'gear'; + + // If this is true, then the user had added a lifepath to an Orc character that added a + // brutal life trait, and then the character removed that lifepath. According to the rules + // they can never gain more lifepaths after this action. + $scope.brutalLifeWithdrawn = false; + + calculateGearSelectionLists($scope, burningData); + calculatePropertySelectionLists($scope, burningData); + + $scope.serverSettings = serverSettings; + + } + + $scope.initialize("man"); + + if ( characterStorage.currentCharacter ){ + //console.log("Loading current character"); + loadCurrentCharacterFromStruct($scope, characterStorage.currentCharacter, burningData, appropriateWeapons); + } + + $scope.hashValues = hashValues; + + $scope.generateName = function(){ + + $http.get("/namegen/" + $scope.gender, {'timeout': 3000} ). + success(function(data,status,headers,config){ + $scope.name = data; + }). + error(function(data,status,headers,config){ + console.log("Error: generating name failed: " + data); + }); + } + + if ( $scope.name.length == 0 ){ + $scope.generateName(); + } + + $scope.hasTrait = function(traitName){ + return (traitName in $scope.commonTraits) || (traitName in $scope.purchasedTraits) || (traitName in $scope.requiredTraits); + } + + + $scope.attributeNames = function(){ + var result = $scope.basicAttributeNames.slice(); + if ( $scope.stock == "orc" ){ + result.push("Hatred"); + } + else if ( $scope.stock == "elf" ){ + result.push("Grief"); + } + else if ( $scope.stock == "dwarf" ){ + result.push("Greed"); + } + else if ( ($scope.stock == "man" || $scope.stock == "roden") && $scope.hasTrait("Faithful") ){ + result.push("Faith"); + } + else if ( $scope.stock == "wolf" && $scope.hasTrait("Chosen Wolf") ){ + result.push("Ancestral Taint"); + } + return result; + } + + + $scope.onGenderChange = function(){ + if ($scope.name.length == 0) { + $scope.generateName(); + } + calculateCurrentSettingLifepathNames($scope, burningData); + } + + $scope.onStockChange = function(){ + var oldName = $scope.name; + + // Make a blank character sheet + $scope.initialize($scope.stock); + + if ( oldName.length == 0 ){ + $scope.generateName(); + } else { + $scope.name = oldName; + } + + calculateSettingNames($scope, burningData); + calculateCurrentSettingLifepathNames($scope, burningData); + calculateSpecialTraitsForDisplay($scope, burningData); + } + + $scope.onSettingChange = function(){ + + calculateCurrentSettingLifepathNames($scope, burningData); + } + + $scope.calculateAge = function(){ + calculateAge($scope); + } + + $scope.onLifepathTimeChange = function(lp){ + calculateAge($scope); + lp.calculateResourcePoints(null); + calculateTotalResourcePoints($scope); + calculateUnspentResourcePoints($scope); + + lp.calculateGeneralSkillPoints(); + calculateTotalSkillPoints($scope); + openRequiredSkills($scope); + calculateUnspentSkillPoints($scope); + removeLifepathSkillsFromGeneralSkills($scope); + calculateUnspentSkillPoints($scope); + } + + burningData.registerOnAllDatasetsLoaded(function(){ + onLifepathsLoad($scope, burningData); + }); + + $scope.$on('$locationChangeStart', function(event, nextUrl, currentUrl) { + var changingToMe = nextUrl.substring(nextUrl.length-3) == "/#/"; + var changingFromMe = currentUrl.substring(currentUrl.length-3) == "/#/"; + // Ignore self transitions + if( changingToMe && changingFromMe ){ + changingToMe = false; + changingFromMe = false; + } + + if ( changingFromMe ){ + //console.log("Storing current character"); + characterStorage.currentCharacter = $scope.convertCurrentCharacterToStruct(); + } + + }); + + $scope.onAddLifepathClick = function(){ + // Find the current lifepath info in the lifepaths + var setting = burningData.lifepaths[$scope.stock][$scope.currentSetting]; + if (!setting) + return; + + var lifepath = setting[$scope.currentSettingLifepath]; + if (!lifepath) + return; + + displayLp = new DisplayLifepath($scope.currentSetting, $scope.currentSettingLifepath, lifepath); + + // If this lifepath has a negative 'either' stat bonus ask the user to apply it. + var penalty = 0; + for(var i = 0; i < displayLp.stat.length; i++){ + var stat = displayLp.stat[i]; + if (stat[1] == 'pm' || stat[1] == 'mp') { + if (stat[0] < 0){ + penalty += stat[0]; + } + } + } + if (penalty < 0) { + $scope.chooseStatPenalties(displayLp, -penalty); + } + + // If the lifepath contains 'Appropriate Weapons', ask the + // user to choose those weapons. + if( appropriateWeapons.hasAppropriateWeapons(displayLp) ){ + var appropriate = appropriateWeapons.appropriateWeapons[displayLp.name]; + if ( ! appropriate ){ + // The selectAppropriateWeapons call will replace the appropriate weapons skill + // with what is selected. It will also call the passed function on successful selection. + appropriateWeapons.selectAppropriateWeapons(displayLp, function(){ + $scope.addDisplayLifepath(displayLp); + }); + return; + } + else { + appropriateWeapons.replaceAppropriateWeapons(displayLp, appropriate); + } + } + + // If the lifepath contains 'Weapon Of Choice', ask the + // user to choose the weapon. + if( weaponOfChoice.hasWeaponOfChoice(displayLp) ){ + weaponOfChoice.selectWeaponOfChoice(displayLp, function(){ + $scope.addDisplayLifepath(displayLp); + }); + return; + } + + $scope.addDisplayLifepath(displayLp); + + } + + // Add a DisplayLifepath to the list of selected lifepaths for the character. + $scope.addDisplayLifepath = function(displayLp){ + var prevLifepath = null; + if($scope.selectedLifepaths.length > 0) + prevLifepath = $scope.selectedLifepaths[$scope.selectedLifepaths.length-1]; + displayLp.calculateResourcePoints(prevLifepath); + displayLp.calculateGeneralSkillPoints(prevLifepath); + + displayLp.modifyForDiminishingReturns($scope.selectedLifepaths); + if($scope.stock == "orc"){ + displayLp.applyBrutalLife($scope.selectedLifepaths); + } + $scope.selectedLifepaths.push(displayLp); + calculateAge($scope); + calculateTotalStatPoints($scope, burningData); + calculateUnspentStatPoints($scope); + calculateLifepathSkills($scope, burningData, appropriateWeapons); + calculateTotalSkillPoints($scope); + openRequiredSkills($scope); + calculateUnspentSkillPoints($scope); + removeLifepathSkillsFromGeneralSkills($scope); + calculateUnspentSkillPoints($scope); + calculateSettingNames($scope, burningData); + calculateCurrentSettingLifepathNames($scope, burningData); + calculateLifepathTraits($scope, burningData); + setCommonTraits($scope, burningData); + purchaseRequiredTraits($scope, burningData); + calculateUnspentTraitPoints($scope); + addBrutalLifeRequiredTraits($scope, burningData); + calculateTraitWarnings($scope, burningData); + calculateTotalResourcePoints($scope); + calculateUnspentResourcePoints($scope); + applyBonusesFromTraits($scope); + } + + $scope.onRemoveLifepathClick = function(dlp){ + // Remove this dlp. Remove the last one if there are multiple. + var index = -1; + for(var i = $scope.selectedLifepaths.length-1; i >= 0; i--) { + if ( $scope.selectedLifepaths[i].name == dlp.name ){ + index = i; + break; + } + } + + // If this lifepath had a Brutal Life trait (DoF was 1) then this character can never take new lifepaths if + // this one is removed. + if ( dlp.brutalLifeTraitName ){ + $scope.brutalLifeWithdrawn = true; + } + + $scope.selectedLifepaths.splice(index,1); + calculateAge($scope); + calculateTotalStatPoints($scope, burningData); + calculateUnspentStatPoints($scope); + calculateLifepathSkills($scope, burningData, appropriateWeapons); + calculateTotalSkillPoints($scope); + openRequiredSkills($scope); + calculateUnspentSkillPoints($scope); + correctStatPoints($scope); + calculateSettingNames($scope, burningData); + calculateCurrentSettingLifepathNames($scope, burningData); + calculateLifepathTraits($scope, burningData); + setCommonTraits($scope, burningData); + purchaseRequiredTraits($scope, burningData); + calculateUnspentTraitPoints($scope); + addBrutalLifeRequiredTraits($scope, burningData); + calculateTraitWarnings($scope, burningData); + calculateTotalResourcePoints($scope); + calculateUnspentResourcePoints($scope); + applyBonusesFromTraits($scope); + } + + $scope.incrementStat = function(stat){ + + // Man stock has max 8 pts in any stat + if ( stat.exp() == 8 ) + return; + + var specificStatPoints = 0; + var eitherStatPoints = $scope.unspentStatPoints.either; + if("m" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.mental; + } + else if ("p" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.physical; + } + else{ + console.log("Error: Unknown stat type " + stat.type + " passed to incrementStat for stat " + stat.name); + return; + } + + if(specificStatPoints <= 0 && eitherStatPoints <= 0 && $scope.enforcePointLimits) + return; + + if(specificStatPoints > 0){ + specificStatPoints -= 1; + stat.setSpecificPointsSpent(stat.specificPointsSpent() + 1); + } + else { + eitherStatPoints -= 1; + stat.eitherPointsSpent += 1; + } + + $scope.unspentStatPoints.either = eitherStatPoints; + if("m" == stat.type){ + $scope.unspentStatPoints.mental = specificStatPoints; + } + else if ("p" == stat.type){ + $scope.unspentStatPoints.physical = specificStatPoints; + } + + calculatePTGS($scope); + } + + $scope.decrementStat = function(stat){ + + if(stat.exp() <= 0) + return; + + // First put back any 'either' category stat points, then the specific stat points. + if ( stat.eitherPointsSpent > 0 ){ + stat.eitherPointsSpent -= 1; + $scope.unspentStatPoints.either += 1; + } + else { + var specificStatPoints = 0; + + stat.setSpecificPointsSpent(stat.specificPointsSpent() - 1); + + if("m" == stat.type){ + $scope.unspentStatPoints.mental += 1; + } + else if ("p" == stat.type){ + $scope.unspentStatPoints.physical += 1; + } + else{ + console.log("Error: Unknown stat type " + stat.type + " passed to decrementStat for stat " + stat.name); + // Undo the decrement + stat.setSpecificPointsSpent(stat.specificPointsSpent() + 1); + return; + } + } + + calculatePTGS($scope); + } + + $scope.changeStatShade = function(stat){ + // This method toggles between Gray and Black shades. + + var toGray = function(stat) { + var specificStatPoints = 0; + var eitherStatPoints = $scope.unspentStatPoints.either; + if("m" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.mental; + } + else if ("p" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.physical; + } + else{ + console.log("Error: Unknown stat type " + stat.type + " passed to incrementStat for stat " + stat.name); + return; + } + + var cost = 5; + + if( specificStatPoints + eitherStatPoints < cost ){ + return; + } + + if( specificStatPoints >= cost){ + specificStatPoints -= cost; + stat.setSpecificPointsSpent(stat.specificPointsSpent() + cost); + cost = 0; + } + else{ + stat.setSpecificPointsSpent(stat.specificPointsSpent() + specificStatPoints); + cost = cost - specificStatPoints; + specificStatPoints = 0; + } + + eitherStatPoints -= cost; + stat.eitherPointsSpent += cost; + + stat.shade = "G"; + $scope.unspentStatPoints.either = eitherStatPoints; + if("m" == stat.type){ + $scope.unspentStatPoints.mental = specificStatPoints; + } + else if ("p" == stat.type){ + $scope.unspentStatPoints.physical = specificStatPoints; + } + } + + var toBlack = function(stat){ + var specificStatPoints = 0; + var eitherStatPoints = $scope.unspentStatPoints.either; + if("m" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.mental; + } + else if ("p" == stat.type){ + specificStatPoints = $scope.unspentStatPoints.physical; + } + else{ + console.log("Error: Unknown stat type " + stat.type + " passed to incrementStat for stat " + stat.name); + return; + } + + var cost = 5; + + // Put back 'either' points first. + if( stat.eitherPointsSpent > cost){ + eitherStatPoints += cost; + stat.eitherPointsSpent -= cost; + cost = 0; + } + else { + eitherStatPoints += stat.eitherPointsSpent; + cost = cost - stat.eitherPointsSpent; + stat.eitherPointsSpent = 0; + } + + specificStatPoints += cost; + stat.setSpecificPointsSpent(stat.specificPointsSpent() - cost); + + stat.shade = "B"; + + $scope.unspentStatPoints.either = eitherStatPoints; + if ("m" == stat.type) { + $scope.unspentStatPoints.mental = specificStatPoints; + } + else if ("p" == stat.type){ + $scope.unspentStatPoints.physical = specificStatPoints; + } + } + + if(stat.shade == 'B'){ + toGray(stat); + } + else if (stat.shade == 'G'){ + toBlack(stat); + } + else + console.log("Error: changing shade of stat failed: unknown shade " + stat.shade); + + } + + $scope.changeAttributeShade = function(attrName){ + // This method toggles between Gray and Black shades. + + var attr = $scope.attribute(attrName); + + if(attr.shade == 'B'){ + // Need 5 points to shift. + if(attr.exp < 5) + return; + + $scope.attributeShade[attrName] = 'G'; + } + else if (attr.shade == 'G'){ + $scope.attributeShade[attrName] = 'B'; + } + else + console.log("Error: changing shade of attribute failed: unknown shade " + stat.shade); + + } + + $scope.incrementSkill = function(skill){ + var cost = 1; + if (skill.pointsSpent() == 0){ + // Magical skills cost 2 points to open. + cost = skill.costToOpen; + } + + if ( $scope.unspentSkillPoints["lifepath"] + $scope.unspentSkillPoints["general"] < cost && $scope.enforcePointLimits ) + return; + + // Draw down from the lifepath specific points first, then from general. + if ( !$scope.isGeneralSkill(skill) && ($scope.unspentSkillPoints["lifepath"] > 0 || ! $scope.enforcePointLimits)) + { + var toTake = cost; + if ( toTake > $scope.unspentSkillPoints["lifepath"] ) + totake = $scope.unspentSkillPoints["lifepath"]; + + $scope.unspentSkillPoints["lifepath"] -= toTake; + skill.lifepathPointsSpent += toTake; + + cost -= toTake; + } + + if ( cost > 0 && ($scope.unspentSkillPoints["general"] > 0 || ! $scope.enforcePointLimits)) + { + $scope.unspentSkillPoints["general"] -= cost; + skill.generalPointsSpent += cost; + return; + } + } + + $scope.changeTrainingSkill = function($event, skill){ + var checkbox = $event.target; + + if ( ! checkbox.checked ){ + // If this skill is required to be open, do not allow + // unchecking + var required = skillsRequiredToBeOpened($scope.selectedLifepaths) + if (skill.name in required){ + checkbox.checked = true; + return; + } + + if ( skill.generalPointsSpent > 0 ){ + $scope.unspentSkillPoints.general += skill.generalPointsSpent; + skill.generalPointsSpent = 0; + } + + if ( skill.lifepathPointsSpent > 0 ){ + $scope.unspentSkillPoints.lifepath += skill.lifepathPointsSpent; + skill.lifepathPointsSpent = 0; + } + } else { + // User just checked the box. + + if( !$scope.isGeneralSkill(skill) ) { + if( ($scope.unspentSkillPoints.general + $scope.unspentSkillPoints.lifepath < 2) && $scope.enforcePointLimits ){ + // Not enough points + checkbox.checked = false; + return; + } + + while ( $scope.unspentSkillPoints.lifepath > 0 && skill.pointsSpent() < 2 ){ + skill.lifepathPointsSpent += 1; + $scope.unspentSkillPoints.lifepath -= 1; + } + + while ( ($scope.unspentSkillPoints.general > 0 || ! $scope.enforcePointLimits) && skill.pointsSpent() < 2 ){ + skill.generalPointsSpent += 1; + $scope.unspentSkillPoints.general -= 1; + } + } else { + // This is a general skill. Only general point may be spent. + if( $scope.unspentSkillPoints.general < 2 && $scope.enforcePointLimits ){ + // Not enough points + checkbox.checked = false; + return; + } + + $scope.unspentSkillPoints.general -= 2; + skill.generalPointsSpent += 2; + } + } + } + + /* + // Used by ng-repeat's orderBy filter to sort skills. + $scope.sortSkills = function(skill){ + return skill.exp($scope.statsByName); + } + */ + + $scope.decrementSkill = function(skill){ + // If this skill is required to be open, do not allow + // decrementing below 1. + var required = skillsRequiredToBeOpened($scope.selectedLifepaths) + if ( (skill.name in required) && skill.lifepathPointsSpent == 1 && skill.generalPointsSpent == 0 ){ + return; + } + + var cost = 1; + if (skill.pointsSpent() == skill.costToOpen){ + // Magical skills cost 2 points to open. + cost = skill.costToOpen; + } + + // Put back to the general points first, then to lifepath specific + if ( skill.generalPointsSpent > 0 ){ + var toGive = cost; + if (toGive > skill.generalPointsSpent) + toGive = skill.generalPointsSpent; + $scope.unspentSkillPoints["general"] += toGive; + skill.generalPointsSpent -= toGive; + + cost -= toGive; + } + + if ( skill.lifepathPointsSpent > 0 ){ + $scope.unspentSkillPoints["lifepath"] += cost; + skill.lifepathPointsSpent -= cost; + return; + } + } + + /* Given a skill name, add a general skill */ + $scope.addGeneralSkill = function(skillName){ + if (skillName in burningData.skills && !(skillName in $scope.lifepathSkills)){ + $scope.generalSkills[skillName] = new DisplaySkill(skillName, burningData.skills); + applyBonusesFromTraits($scope); + } + } + + /* Given a wise name, add a custom wise.*/ + $scope.addCustomWise = function(wiseName){ + wiseName = wiseName.toLowerCase(); + if(endsWith(wiseName, "-wise")){ + wiseName = wiseName.substring(0, wiseName.length-5); + } + + wiseName = capitalizeEachWord(wiseName) + "-wise"; + + $scope.generalSkills[wiseName] = new DisplaySkill(wiseName, burningData.skills); + } + + /* Given the passed display skill, determine if it's in the list of + general skills selected by the user */ + $scope.isGeneralSkill = function(displaySkill){ + return (displaySkill.name in $scope.generalSkills); + + } + + /* Given the passed display skill, remove it from the list of general skills */ + $scope.removeGeneralSkill = function(displaySkill){ + delete $scope.generalSkills[displaySkill.name]; + calculateUnspentSkillPoints($scope); + } + + // Return a hash containing all skills + $scope.allSelectedSkills = function(){ + var result = {} + for(var key in $scope.lifepathSkills){ + result[key] = $scope.lifepathSkills[key] + } + for(var key in $scope.generalSkills){ + result[key] = $scope.generalSkills[key] + } + return result; + } + + // Return a list of skill names that the character can choose + // from to add a general skill. This is all skills less the + // skills the character already has, and less the skills that + // are not allowed for the character's stock. + $scope.selectableGeneralSkills = function(){ + var result = []; + for(var key in burningData.skills){ + if ( !(key in $scope.lifepathSkills) && !(key in $scope.generalSkills) ){ + var displaySkill = burningData.skills[key]; + if ( !displaySkill.stock || restrictionStockToValidStock(displaySkill.stock) == $scope.stock ) { + result.push(key); + } + } + } + // This is hacky, but set the current model value for the dropdown + if(result.length > 0 && result.indexOf($scope.currentGeneralSkill) < 0 ){ + $scope.currentGeneralSkill = result[0]; + } + + return result.sort(); + } + + // Return a style to be applied to a skill name to indicate whether or not it's open. + $scope.skillStyle = function(skill){ + if ( skill.pointsSpent() > 0 ){ + return {"font-weight": "bold"}; + } else { + return {}; + } + } + + + // Return the value of the attribute with the specified name as a hash of [shade : S, exp : E, modifyable : flag] + $scope.attribute = function(name){ + + var computeModifiers = function(name){ + var result = 0; + + var questions = attributeModifyingQuestions($scope, name); + for(var i = 0; i < questions.length; i++){ + var q = questions[i]; + if ( q.computed ){ + result += q.compute(); + } + } + + var answers = $scope.attributeModifierQuestionResults[name]; + if ( answers ){ + for(var i = 0; i < answers.length; i++){ + var q = answers[i]; + if ("answer" in q){ + if(q.answer){ + if(q.computeModifier){ + result += q.compute(); + } + else { + result += q.modifier; + } + } + } + } + } + + return result; + } + + var computeBonus = function(name){ + var bonus = 0; + if (name in $scope.attributeBonuses) { + bonus = $scope.attributeBonuses[name]; + } + return bonus; + } + + var bonus = computeBonus(name) + + if( "Mortal Wound" == name ){ + var shadeAndExp = computeStatAverage($scope.statsByName, ["Power", "Forte"]); + return {"shade" : shadeAndExp[0], "exp" : shadeAndExp[1] + 6 + bonus}; + } + else if ( "Reflexes" == name ){ + var shadeAndExp = computeStatAverage($scope.statsByName, ["Perception", "Agility", "Speed"]); + return {"shade" : shadeAndExp[0], "exp" : shadeAndExp[1] + bonus}; + } + else if ( "Health" == name ){ + var shadeAndExp = computeStatAverage($scope.statsByName, ["Will", "Forte"]); + shadeAndExp[1] += computeModifiers(name); + return {"shade" : shadeAndExp[0], "exp" : shadeAndExp[1] + bonus, "modifyable" : true}; + } + else if ( "Steel" == name ){ + var steel = 3 + computeModifiers(name) + bonus; + if($scope.attributeShade[name] == 'G'){ + steel -= 5; + } + return {"shade" : $scope.attributeShade[name], "exp" : steel, "modifyable" : true}; + } + else if ( "Hesitation" == name ){ + return {"shade" : "", "exp" : 10 - $scope.statsByName["Will"].exp() + bonus}; + } + else if ( "Stride" == name ){ + var stride = 0; + if( $scope.stock == 'dwarf' ) + stride = 6; + else if( $scope.stock == 'elf' ) + stride = 8; + else if( $scope.stock == 'roden' ) + stride = 8; + else if( $scope.stock == 'wolf' ) + stride = 11; + else + stride = 7; + + stride += bonus; + + return {"shade" : "", "exp" : stride}; + } + else if ( "Circles" == name ){ + var v = Math.floor($scope.statsByName["Will"].exp()/2); + if (v < 1) + v = 1; + + var sum = 0; + var reputations = hashValues($scope.reputations); + for(var i = 0; i < reputations.length; i++){ + sum += reputations[i].cost; + } + var property = hashValues($scope.property); + for(var i = 0; i < property.length; i++){ + sum += property[i].cost; + } + + if ( sum >= 50 ){ + v += 1; + } + + v += bonus; + + return {"shade" : "B", "exp" : v}; + } + else if ( "Resources" == name ){ + var sum = 0; + var reputations = hashValues($scope.reputations); + for(var i = 0; i < reputations.length; i++){ + sum += reputations[i].cost; + } + var affiliations = hashValues($scope.affiliations); + for(var i = 0; i < affiliations.length; i++){ + sum += affiliations[i].cost; + } + var property = hashValues($scope.property); + for(var i = 0; i < property.length; i++){ + sum += property[i].cost; + } + return { "shade" : "B", "exp" : Math.floor(sum / 15) + bonus}; + } + else if ( "Hatred" == name ){ + var hate = computeModifiers(name); + if($scope.attributeShade[name] == 'G'){ + hate -= 5; + } + hate += bonus; + return { "shade" : $scope.attributeShade[name], "exp" : hate, "modifyable" : true}; + } + else if ( "Greed" == name ){ + var greed = computeModifiers(name); + if($scope.attributeShade[name] == 'G'){ + greed -= 5; + } + greed += bonus; + return { "shade" : $scope.attributeShade[name], "exp" : greed, "modifyable" : true}; + } + else if ( "Grief" == name ){ + var grief = computeModifiers(name); + if($scope.attributeShade[name] == 'G'){ + grief -= 5; + } + grief += bonus; + return { "shade" : $scope.attributeShade[name], "exp" : grief, "modifyable" : true}; + } + else if ( "Faith" == name ){ + var faith = 3 + computeModifiers(name); + faith += bonus; + return { "shade" : 'B', "exp" : faith, "modifyable" : true}; + } + else if ( "Ancestral Taint" == name ){ + // Taint starts +1 for Ancestral Taint (which is automatically given when Chosen Wolf is purchased) + var taint = 1 + computeModifiers(name); + taint += bonus; + return { "shade" : $scope.statsByName["Will"].shade, "exp" : taint, "modifyable" : true}; + } + + } + + $scope.distributeStats = function(){ + // Change all stats to black + for(var i = 0; i < $scope.stats.length; i++){ + $scope.stats[i].shade = 'B'; + } + + // Divide 'either' pool evenly between physical and mental + var eitherBuckets = divideIntoBuckets($scope.totalStatPoints.either, 2); + + // Divide mental between each mental stat + var mentalBuckets = divideIntoBuckets($scope.totalStatPoints.mental, 2); + var mentalEitherBuckets = divideIntoBuckets(eitherBuckets[0], 2); + + // Divide physical between each physical stat + var physicalBuckets = divideIntoBuckets($scope.totalStatPoints.physical, 4); + var physicalEitherBuckets = divideIntoBuckets(eitherBuckets[1], 4); + + $scope.statsByName.Will.mentalPointsSpent = mentalBuckets[0]; + $scope.statsByName.Will.eitherPointsSpent = mentalEitherBuckets[1]; + $scope.statsByName.Perception.mentalPointsSpent = mentalBuckets[1]; + $scope.statsByName.Perception.eitherPointsSpent = mentalEitherBuckets[0]; + + $scope.statsByName.Power.physicalPointsSpent = physicalBuckets[0]; + $scope.statsByName.Power.eitherPointsSpent = physicalEitherBuckets[3]; + $scope.statsByName.Speed.physicalPointsSpent = physicalBuckets[1] + $scope.statsByName.Speed.eitherPointsSpent = physicalEitherBuckets[2] + $scope.statsByName.Agility.physicalPointsSpent = physicalBuckets[2] + $scope.statsByName.Agility.eitherPointsSpent = physicalEitherBuckets[1] + $scope.statsByName.Forte.physicalPointsSpent = physicalBuckets[3] + $scope.statsByName.Forte.eitherPointsSpent = physicalEitherBuckets[0] + + // Sanity check + var sum = 0; + for(var i = 0; i < $scope.stats.length; i++){ + sum += $scope.stats[i].exp() - $scope.stats[i].bonus; + } + if ( sum != $scope.totalStatPoints.either + $scope.totalStatPoints.mental + $scope.totalStatPoints.physical ) { + console.log("Error: Calculation in distributeStats is incorrect."); + + for(var i = 0; i < $scope.stats.length; i++){ + $scope.stats[i].physicalPointsSpent = 0; + $scope.stats[i].mentalPointsSpent = 0; + $scope.stats[i].eitherPointsSpent = 0; + } + } + + calculateUnspentStatPoints($scope); + calculatePTGS($scope); + } + + $scope.lifepathTraitsForDisplay = function(){ + var list = []; + var traits = hashValues($scope.lifepathTraits); + for(var i = 0; i < traits.length; i++){ + if ( ! (traits[i].name in $scope.purchasedTraits) && ! (traits[i].name in $scope.requiredTraits) ){ + list.push(traits[i].name + ": 1pt"); + } + } + + if(list.length > 0 && list.indexOf($scope.currentLifepathTrait) < 0 ){ + $scope.currentLifepathTrait = list[0]; + } + + return list; + } +/* + + $scope.specialTraitsForDisplay = function(){ + var list = []; + + for(var traitName in burningData.traits) { + var trait = burningData.traits[traitName]; + + if ('restrict' in trait){ + if ( trait.restrict.indexOf(validStockToRestrictionStock($scope.stock)) >= 0 && + (trait.restrict.indexOf("special") >= 0 || trait.restrict.indexOf("character") >= 0) ){ + list.push(new DisplayTrait(traitName, burningData.traits)); + } + } else { + // No restriction! As long as cost > 0 (cost 0 is for traits with no cost; not purchaseable) + if ( trait.cost > 0 ) { + list.push(new DisplayTrait(traitName, burningData.traits)); + } + } + } + + return list; + } +*/ + + $scope.addLifepathTrait = function(traitName){ + if ( $scope.unspentTraitPoints < 1 && $scope.enforcePointLimits ) + return; + + traitName = traitName.split(":")[0]; + if ( !(traitName in $scope.purchasedTraits) && !(traitName in $scope.requiredTraits)){ + $scope.purchasedTraits[traitName] = new DisplayTrait(traitName, burningData.traits); + $scope.unspentTraitPoints -= 1; + } + calculateTraitWarnings($scope, burningData); + applyBonusesFromTraits($scope); + } + + /* Given the passed display trait, remove it from the list of purchased traits*/ + $scope.removeTrait = function(trait){ + delete $scope.purchasedTraits[trait.name]; + calculateUnspentTraitPoints($scope); + calculateTraitWarnings($scope, burningData); + applyBonusesFromTraits($scope); + } + + $scope.addSpecialTrait = function(trait){ + traitName = trait.name; + if ( !(traitName in $scope.purchasedTraits) && !(traitName in $scope.requiredTraits)){ + if ( trait.cost <= $scope.unspentTraitPoints || !$scope.enforcePointLimits){ + $scope.purchasedTraits[traitName] = trait; + $scope.unspentTraitPoints -= trait.cost; + } + else { + $scope.addAlert('trait', "You don't have enough trait points for that."); + } + } + calculateTraitWarnings($scope, burningData); + applyBonusesFromTraits($scope); + } + + $scope.convertCurrentCharacterToStruct = function(){ + return convertCurrentCharacterToStruct($scope, appropriateWeapons); + } + + $scope.loadCurrentCharacterFromStruct = function(charStruct){ + loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropriateWeapons); + } + + $scope.convertCurrentCharacterToStructForCharSheet = function(){ + // Format: + // { + // :name => string, + // :stock => string, + // :age => integer, + // :stock => string, + // :lifepaths => [string, string,...] + // :stats => { :will => ["B", 5], ...} + // :attributes => { :health => ["B", 5], ...} + // :skills => [ + // [name, shade, exponent] + // ] + // :traits => [ + // [name, type] + // ] + // } + + + // Structure: + var chardata = { + "name" : $scope.name, + "age" : $scope.age, + "stock" : $scope.stock + }; + + var lifepaths = []; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + lifepaths.push(displayLp.displayName); + } + chardata.lifepaths = lifepaths; + + var stats = {}; + for(var i = 0; i < $scope.stats.length; i++){ + var displayStat = $scope.stats[i]; + + stats[displayStat.name.toLowerCase()] = [displayStat.shade, displayStat.exp()]; + } + chardata.stats = stats; + + var attrs = {}; + var attributeNames = $scope.attributeNames(); + for(var i = 0; i < attributeNames.length; i++){ + var attr = $scope.attribute(attributeNames[i]); + attrs[attributeNames[i].toLowerCase()] = [attr.shade, attr.exp]; + } + chardata.attributes = attrs; + + var skills = []; + for(var key in $scope.lifepathSkills){ + var displaySkill = $scope.lifepathSkills[key]; + if( displaySkill.pointsSpent() > 0 ) + skills.push([displaySkill.name, displaySkill.shade($scope.statsForSkillCalc), displaySkill.exp($scope.statsForSkillCalc), displaySkill.isTraining]); + } + for(var key in $scope.generalSkills){ + var displaySkill = $scope.generalSkills[key]; + if( displaySkill.pointsSpent() > 0 ) + skills.push([displaySkill.name, displaySkill.shade($scope.statsForSkillCalc), displaySkill.exp($scope.statsForSkillCalc), displaySkill.isTraining]); + } + + chardata.skills = skills + + var traits = []; + for(var key in $scope.purchasedTraits){ + var displayTrait = $scope.purchasedTraits[key]; + traits.push([displayTrait.name, displayTrait.type]); + } + for(var key in $scope.requiredTraits){ + var displayTrait = $scope.requiredTraits[key]; + traits.push([displayTrait.name, displayTrait.type]); + } + for(var key in $scope.commonTraits){ + var displayTrait = $scope.commonTraits[key]; + traits.push([displayTrait.name, displayTrait.type]); + } + chardata.traits = traits; + + // Resources + var serializeResource = function(resourceHash, coder){ + var resourceList = hashValues(resourceHash); + var res = []; + for(var i = 0; i < resourceList.length; i++){ + var display = resourceList[i]; + res.push( coder(display) ); + } + return res; + } + + var res = serializeResource( $scope.gear, function(display){ + return display.desc + }); + chardata.gear = res; + + var res = serializeResource( $scope.property, function(display){ + return display.desc + }); + chardata.property = res; + + res = serializeResource( $scope.relationships, function(display){ + return display.desc + }); + chardata.relationships = res; + + res = serializeResource( $scope.reputations, function(display){ + return display.desc + " " + display.dice + "D"; + }); + chardata.reputations = res; + + res = serializeResource( $scope.affiliations, function(display){ + return display.desc + " " + display.dice + "D"; + }); + chardata.affiliations = res; + + chardata.attr_mod_questions = convertAttributeModifierQuestionResultsForCharsheet($scope); + + return chardata; + } + + $scope.makeCharsheetForCurrentCharacter = function(){ + var json = angular.toJson($scope.convertCurrentCharacterToStructForCharSheet(), true); + $http.post("/charsheet", json). + success(function(data,status,headers,config){ + console.log("huzzah, making charsheet succeeded. File URL: " + data); + var frame = document.getElementById("downloadframe"); + if ( frame ){ + frame.src = data; + } + }). + error(function(data,status,headers,config){ + console.log("boo, making charsheet failed: " + data); + $scope.addAlert('tools', "Generating character sheet failed: " + data); + }); + } + + // Launch a download for the current character. Since Javascript can't really + // launch a download using data from javascript, we need to pass the current character + // to the server which sends a filename back to a hidden iframe which then launches the download. + $scope.downloadCurrentCharacter = function(){ + var nameWarn = "The character must have a name before it can be downloaded."; + if( $scope.name.length == 0 ){ + $scope.addAlert('tools', nameWarn); + return; + } + else { + $scope.removeAlert('tools', nameWarn); + } + + var json = angular.toJson($scope.convertCurrentCharacterToStruct(), true); + $http.post("/download_charfile", json). + success(function(data,status,headers,config){ + console.log("huzzah, making character data file succeeded. File URL: " + data); + var frame = document.getElementById("downloadframe"); + if ( frame ){ + frame.src = data; + } + }). + error(function(data,status,headers,config){ + console.log("boo, making character data file failed: " + data); + $scope.addAlert('tools', "Generating character file failed: " + data); + }); + } + + $scope.saveCurrentCharacterToServer = function(){ + var nameWarn = "The character must have a name before it can be saved."; + if( $scope.name.length == 0 ){ + $scope.addAlert('tools', nameWarn); + return; + } + else { + $scope.removeAlert('tools', nameWarn); + } + + var json = angular.toJson($scope.convertCurrentCharacterToStruct(), true); + + var url = "/create_char/user1/" + $scope.name; + if ( $scope.charid != null ){ + url = "/update_char/user1/" + $scope.charid + "/" + $scope.name; + } + + $http.post(url, json). + success(function(data,status,headers,config){ + if ( $scope.charid == null ){ + // Create + console.log("huzzah, creating character succeeded. Character id = " + data['id']); + $scope.charid = data['id'] + characterStorage.loadCharacterNames(); + } + else { + console.log("huzzah, updating character succeeded. Character id = " + data['id']); + } + $scope.addAlert('tools', "Character was successfully saved.", 'succ'); + }). + error(function(data,status,headers,config){ + console.log("boo, saving character failed: " + data); + $scope.addAlert('tools', data); + }); + } + + $scope.loadCharacterFromServer = function(characterIdAndNameToLoad){ + if( characterIdAndNameToLoad == null ){ + $scope.addAlert('tools', "Select a character to load."); + return; + } + + $http.get("/get_char/user1/" + characterIdAndNameToLoad[0], {'timeout': 3000} ). + success(function(data,status,headers,config){ + console.log("Loaded character"); + loadCurrentCharacterFromStruct($scope, data, burningData, appropriateWeapons); + $scope.charid = characterIdAndNameToLoad[0]; + }). + error(function(data,status,headers,config){ + console.log("Error: Loading saved character from server failed: HTTP code " + status + ": " + data); + }); + } + + $scope.deleteCharacterOnServer = function(characterIdAndNameToLoad){ + if( characterIdAndNameToLoad == null ){ + $scope.addAlert('tools', "Select a character to delete."); + return; + } + + $http.get("/delete_char/user1/" + characterIdAndNameToLoad[0], {'timeout': 3000} ). + success(function(data,status,headers,config){ + console.log("Deleted character"); + characterStorage.loadCharacterNames(); + $scope.addAlert('tools', "Character was successfully deleted.", 'succ'); + }). + error(function(data,status,headers,config){ + console.log("Error: Deleting saved character from server failed: HTTP code " + status + ": " + data); + }); + } + + $scope.addResource = function(type){ + + var resource = null; + var resourceHash = null; + if(type == 'relationship'){ + resource = new DisplayRelationship( + $scope.currentRelationshipDesc, + $scope.currentRelationshipImportance, + $scope.currentRelationshipIsImmedFam, + $scope.currentRelationshipIsOtherFam, + $scope.currentRelationshipIsRomantic, + $scope.currentRelationshipIsForbidden, + $scope.currentRelationshipIsHateful + ); + resourceHash = $scope.relationships; + } + else if (type == 'gear'){ + var cost = parseInt($scope.currentGearCost); + if ( isNaN(cost) ) + return; + + resource = new DisplayGear ( + $scope.currentGearDesc, + cost + ); + resourceHash = $scope.gear; + } + else if (type == 'property'){ + var cost = parseInt($scope.currentPropertyCost); + if ( isNaN(cost) ) + return; + + resource = new DisplayGear ( + $scope.currentPropertyDesc, + cost + ); + resourceHash = $scope.property; + } + else if (type == 'affiliation'){ + resource = new DisplayAffiliation( + $scope.currentAffiliationDesc, + $scope.currentAffiliationImportance + ); + resourceHash = $scope.affiliations; + } + else if (type == 'reputation'){ + resource = new DisplayReputation( + $scope.currentReputationDesc, + $scope.currentReputationImportance + ); + resourceHash = $scope.reputations; + } + + // If this already exists, ignore the new entry. + if ( resourceHash[resource.desc] ){ + $scope.addAlert('resources', "You already have that " + type + "."); + return; + } + if ( resource.desc.length == 0 ){ + return; + } + if ( resource.cost > $scope.unspentResourcePoints && $scope.enforcePointLimits){ + $scope.addAlert('resources', "You don't have enough resource points for that."); + return; + } + + resourceHash[resource.desc] = resource; + calculateUnspentResourcePoints($scope); + + } + + $scope.addSelectListGear = function(){ + var name = ""; + var cost = 0; + for(var i = 2; i >= 0; i--){ + if($scope.currentSelectListGear[i]){ + var gear = $scope.currentSelectListGear[i]; + if(gear.cost){ + cost = gear.cost; + } + if(gear.name){ + if(name.length > 0){ + name = gear.name + ", " + name; + } + else{ + name = gear.name; + } + } + } + } + + $scope.currentGearDesc = name; + $scope.currentGearCost = cost; + $scope.addResource('gear'); + } + + $scope.addSelectListProperty = function(){ + var name = ""; + var cost = 0; + for(var i = 2; i >= 0; i--){ + if($scope.currentSelectListProperty[i]){ + var property = $scope.currentSelectListProperty[i]; + if(property.cost){ + cost = property.cost; + } + if(property.name){ + if(name.length > 0){ + name = property.name + ", " + name; + } + else{ + name = property.name; + } + } + } + } + + $scope.currentPropertyDesc = name; + $scope.currentPropertyCost = cost; + $scope.addResource('property'); + } + + $scope.removeResource = function(type, display){ + var resourceHash = null; + if(type == 'relationship'){ + resourceHash = $scope.relationships; + } + else if (type == 'gear'){ + resourceHash = $scope.gear; + } + else if (type == 'property'){ + resourceHash = $scope.property; + } + else if (type == 'affiliation'){ + resourceHash = $scope.affiliations; + } + else if (type == 'reputation'){ + resourceHash = $scope.reputations; + } + $scope.resourceAdderToShow = type; + populateUiFieldsFromDisplayResource($scope, type, resourceHash[display.desc]); + + delete resourceHash[display.desc]; + calculateUnspentResourcePoints($scope); + } + + $scope.addAlertNoTimeout = function(section, desc, type){ + if(!type) + type = 'warn'; + + var h = $scope.alerts[section]; + h[desc] = new Alert(desc, type); + $scope.alerts[section] = h; + } + + $scope.addAlert = function(section, desc, type){ + $scope.addAlertNoTimeout(section, desc, type); + + $timeout(function(){ + $scope.removeAlert(section, desc); + }, 4000); + } + + $scope.removeAlert = function(section, desc) { + var h = $scope.alerts[section]; + delete h[desc]; + $scope.alerts[section] = h; + } + + $scope.alertsOfType = function(section, type) { + var h = $scope.alerts[section]; + var rc = []; + for(key in h){ + var a = h[key]; + if(a.type == type) + rc.push(a.desc); + } + return rc; + } + + $scope.answerEmotionalAttributeQuestions = function (attributeName){ + + // If the character already has some or all of the questions answered, pass those in. + // Otherwise generate new ones. + + var questions = attributeModifyingQuestions($scope, attributeName); + if ( ! questions) + return; + + if ( attributeName in $scope.attributeModifierQuestionResults ){ + questions = $scope.attributeModifierQuestionResults[attributeName]; + } + + var modalInstance = $modal.open({ + templateUrl: '/emotional_attr_questions_partial', + controller: EmotionalAttributeModalCtrl, + resolve: { + attributeName: function() { + return attributeName; + }, + questions: function () { + return questions; + }, + displayEmotionalMath: function () { + return serverSettings.displayAttrMath; + }, + } + }); + + modalInstance.result.then(function (selected) { + $scope.attributeModifierQuestionResults[attributeName] = selected; + }, function () { + console.log("Modal: User cancelled"); + }); + } + + $scope.chooseCharacterToLoad = function() { + + var modalInstance = $modal.open({ + templateUrl: '/choose_character_partial', + controller: ChooseCharacterModalCtrl, + resolve: { + characterStorage: function() { + return $scope.characterStorage; + }, + message: function() { + return "Choose Character to Load"; + } + } + }); + + modalInstance.result.then(function (selected) { + console.log("Modal: User selected:"); + + console.log(selected); + for(var i = 0; i < selected.length; i++){ + console.log(selected[i]); + } + + $scope.loadCharacterFromServer(selected); + + }, function () { + console.log("Modal: User cancelled"); + }); + } + + $scope.chooseCharacterToDelete = function() { + + var modalInstance = $modal.open({ + templateUrl: '/choose_character_partial', + controller: ChooseCharacterModalCtrl, + resolve: { + characterStorage: function() { + return $scope.characterStorage; + }, + message: function() { + return "Choose Character to Delete"; + } + } + }); + + modalInstance.result.then(function (selected) { + console.log("Modal: User selected:"); + + console.log(selected); + for(var i = 0; i < selected.length; i++){ + console.log(selected[i]); + } + + $scope.deleteCharacterOnServer(selected); + + }, function () { + console.log("Modal: User cancelled"); + }); + } + + $scope.chooseTraitUsingAdvancedSearch = function() { + + var modalInstance = $modal.open({ + templateUrl: '/choose_trait_partial', + controller: TraitSearchModalCtrl, + resolve: { + specialTraitsForDisplay: function() { + return $scope.specialTraitsForDisplay; + }, + totalTraitPoints: function(){ + return $scope.totalTraitPoints; + }, + unspentTraitPoints: function(){ + return $scope.unspentTraitPoints; + } + } + }); + + modalInstance.result.then(function (selected) { + console.log("TraitSearchModalCtrl: User selected:"); + + console.log(selected); + + $scope.addSpecialTrait(selected); + }, function () { + console.log("Modal: User cancelled"); + }); + } + + $scope.showUploadCharacterModal = function (){ + + var modalInstance = $modal.open({ + templateUrl: '/upload_character_partial', + controller: UploadCharacterModalCtrl + }); + + modalInstance.result.then(function () { + console.log("Modal: Uploaded character"); + }, function () { + console.log("Modal: User cancelled"); + }); + } + + $scope.chooseStatPenalties = function(lifepath, amount) { + + var modalInstance = $modal.open({ + templateUrl: '/choose_stat_penalty_partial', + controller: StatPenaltyModalCtrl, + resolve: { + lifepath: function() { + return lifepath; + }, + amount: function() { + return amount; + } + } + }); + + modalInstance.result.then(function (pool) { + console.log("Modal: User selected ", pool); + + // Now we want to modify the lifepath so that the 'either' + // penalty is removed and replaced with the physical and mental + // penalties the user selected. The returned penalties are positive. + var p = -pool.physical; + var m = -pool.mental; + + for(var i = 0; i < displayLp.stat.length; i++){ + var stat = displayLp.stat[i]; + + if(stat[1] == 'p'){ + p += stat[0] + } + else if (stat[1] == 'm'){ + m += stat[0] + } + } + + displayLp.stat = [ [p, 'p'], [m, 'm'] ]; + calculateTotalStatPoints($scope, burningData); + calculateUnspentStatPoints($scope); + + }, function () { + console.log("Modal: User cancelled"); + }); + } + + +} + +function ConfigCtrl($scope, settings, appropriateWeapons) { + $scope.enforceLifepathReqts = settings.enforceLifepathReqts + $scope.enforcePointLimits = settings.enforcePointLimits + + $scope.appropriateWeapons = appropriateWeapons.appropriateWeapons; + + // Export the hashKeys function + $scope.hashKeys = hashKeys; + + $scope.currentAppropriateWeaponLifepath = null; + + $scope.applySettings = function(){ + settings.enforceLifepathReqts = $scope.enforceLifepathReqts; + settings.enforcePointLimits = $scope.enforcePointLimits; + } + + $scope.editAppropriateWeapons = function(){ + if ( $scope.currentAppropriateWeaponLifepath ){ + appropriateWeapons.selectAppropriateWeaponsByLifepathName($scope.currentAppropriateWeaponLifepath, null); + } + } + + $scope.deleteAppropriateWeapons = function(){ + if ( $scope.currentAppropriateWeaponLifepath ){ + delete appropriateWeapons.appropriateWeapons[$scope.currentAppropriateWeaponLifepath]; + } + } + +} + + +function onLifepathsLoad($scope, burningData){ + calculateSettingNames($scope, burningData); + $scope.onSettingChange(); + calculateSpecialTraitsForDisplay($scope, burningData); +} + +function calculateAge($scope){ + var age = 0; + var lastSetting = null; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + if ( lastSetting && lastSetting != displayLp.setting && $scope.stock != "wolf"){ + // New setting. Increase age by 1. Wolves don't suffer this penalty. + age += 1; + } + lastSetting = displayLp.setting; + age += displayLp.time; + } + $scope.age = age; +} + +function calculateSettingNames($scope, burningData){ + var settingNames = null; + + var lastCurrentSetting = $scope.currentSetting; + + if ( ! $scope.enforceLifepathReqts ) { + // Display all settings and subsettings + settingNames = []; + for(key in burningData.lifepaths[$scope.stock]){ + settingNames.push(key); + } + } + else if ( $scope.selectedLifepaths.length == 0 ){ + // All settings are allowed. Subsettings have no Born lifepath so don't include them. + settingNames = []; + for(key in burningData.lifepaths[$scope.stock]){ + if( key.toLowerCase().indexOf("subsetting") < 0 ){ + settingNames.push(key); + } + } + } + else { + // Only settings that are leads from the last lifepath are allowed + var lastLifepath = $scope.selectedLifepaths[$scope.selectedLifepaths.length-1]; + settingNames = []; + var all = Object.keys(burningData.lifepaths[$scope.stock]); + for(var i = 0; i < all.length; i++){ + //console.log("calculateSettingNames: checking if '"+all[i]+"' is allowed"); + var setting = all[i]; + + if ( lastLifepath.setting == setting ){ + settingNames.push(setting); + continue; + } + + if ( lastLifepath.leads ){ + for(var j = 0; j < lastLifepath.keyLeads.length; j++){ + var lead = lastLifepath.keyLeads[j]; + //console.log("calculateSettingNames: checking lead: '"+lead+"' is allowed"); + + if( setting == lead ){ + settingNames.push(setting); + } + } + } + } + } + + $scope.settingNames = settingNames; + + var currentSettingNeedsUpdate = true; + for(var i = 0; i < $scope.settingNames.length; i++){ + if( $scope.settingNames[i] == lastCurrentSetting){ + currentSettingNeedsUpdate = false; + break; + } + } + + if ( currentSettingNeedsUpdate && $scope.settingNames.length > 0 ){ + $scope.currentSetting = $scope.settingNames[0]; + } + +} + +function calculatePTGS($scope) { + $scope.ptgs.calculate($scope.statsByName['Forte'].exp(), $scope.attribute("Mortal Wound").exp) +} + + +function isBornLifepath(lifepathName) { + return lifepathName.indexOf("Born") >= 0 || + lifepathName == "Son Of A Gun" || + lifepathName == "Gifted Child"; +} + + +function calculateCurrentSettingLifepathNames($scope, burningData){ + var currentSettingLifepathNames = null; + + if($scope.enforceLifepathReqts){ + //console.log("calculateCurrentSettingLifepathNames: enforce lifepath requirements is enabled"); + currentSettingLifepathNames = []; + var all = Object.keys(burningData.lifepaths[$scope.stock][$scope.currentSetting]) + // Filter out the names that are not allowed based on the character's lifepaths. + if ( $scope.selectedLifepaths.length == 0 ){ + // Only "Born" lifepaths are allowed + for(var i = 0; i < all.length; i++){ + if ( isBornLifepath(all[i]) ){ + currentSettingLifepathNames.push(all[i]); + } + } + } + else { + var lifepathNames = Object.keys(burningData.lifepaths[$scope.stock][$scope.currentSetting]) + for(var j = 0; j < lifepathNames.length; j++){ + var lifepathName = lifepathNames[j]; + + if ( isBornLifepath(lifepathName) ) + continue; + + var rexpr = burningData.lifepaths[$scope.stock][$scope.currentSetting][lifepathName].requires_expr + if (rexpr){ + var result = areLifepathRequirementsSatisfied($scope, rexpr); + //console.log(settingName + ":" + lifepathName + " allowed: " + (result[0] ? "yes" : "no")); + //console.log("rexpr: " + rexpr); + if(result[0]){ + //console.log("calculateCurrentSettingLifepathNames: added because lifepath has reqts, which are met: " + lifepathName); + currentSettingLifepathNames.push(lifepathName); + } + else { + //console.log("calculateCurrentSettingLifepathNames: not added because lifepath has reqts, which not are met: " + lifepathName); + } + } + else { + currentSettingLifepathNames.push(lifepathName); + } + } + + } + } + else { + currentSettingLifepathNames = Object.keys(burningData.lifepaths[$scope.stock][$scope.currentSetting]); + } + + $scope.currentSettingLifepathNames = currentSettingLifepathNames; + + var currentSettingLifepathIsPresent = false; + if ( $scope.currentSettingLifepathNames.length > 0 ){ + for(var i = 0; i < $scope.currentSettingLifepathNames.length; i++){ + var name = $scope.currentSettingLifepathNames[i]; + if ( name == $scope.currentSettingLifepath ){ + currentSettingLifepathIsPresent = true; + break; + } + } + if ( ! currentSettingLifepathIsPresent ) + $scope.currentSettingLifepath = $scope.currentSettingLifepathNames[0]; + } + +} + +function calculateTotalStatPoints($scope, burningData){ + + var totalStatPoints = {"physical" : 0, "mental" : 0, "either" : 0}; + $scope.totalStatPoints = {"physical" : 0, "mental" : 0, "either" : 0}; + + var mp = burningData.startingStatPts[$scope.stock].lookup($scope.age); + totalStatPoints.mental = mp[0]; + totalStatPoints.physical = mp[1]; + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + for(var j = 0; j < displayLp.stat.length; j++){ + var stat = displayLp.stat[j] + if(stat[1] == 'p'){ + totalStatPoints.physical += stat[0]; + } + else if (stat[1] == 'm'){ + totalStatPoints.mental += stat[0]; + } + else if (stat[1] == 'pm' || stat[1] == 'mp'){ + totalStatPoints.either += stat[0]; + } + } + } + + $scope.totalStatPoints = totalStatPoints; +} + +/* + Preconditions: totalStatPoints is up to date. +*/ +function calculateUnspentStatPoints($scope){ + + var unspentStatPoints = { + "physical" : $scope.totalStatPoints.physical, + "mental" : $scope.totalStatPoints.mental, + "either" : $scope.totalStatPoints.either + } + + for(var i = 0; i < $scope.stats.length; i++){ + var stat = $scope.stats[i]; + unspentStatPoints.mental -= stat.mentalPointsSpent; + unspentStatPoints.physical -= stat.physicalPointsSpent; + unspentStatPoints.either -= stat.eitherPointsSpent; + } + + $scope.unspentStatPoints = unspentStatPoints; +} + +/* +Based on the chosen lifepaths, make a set of skills that the character +can or must take. +*/ +function calculateLifepathSkills($scope, burningData, appropriateWeapons){ + var lifepathSkills = {}; + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + + appropriateWeapons.replaceAppropriateWeaponsUsingSaved(displayLp); + displayLp.replaceWeaponOfChoice(); + + for(var j = 0; j < displayLp.skills.length; j++){ + var name = displayLp.skills[j]; + if ( name != "General"){ + lifepathSkills[name] = new DisplaySkill(name, burningData.skills); + } + } + } + + $scope.lifepathSkills = lifepathSkills; +} + +function calculateTotalSkillPoints($scope){ + var totalSkillPoints = {"lifepath" : 0, "general" : 0} + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + totalSkillPoints.lifepath += displayLp.lifepathSkillPts; + totalSkillPoints.general += displayLp.generalSkillPts; + } + + $scope.totalSkillPoints = totalSkillPoints +} + +function calculateUnspentSkillPoints($scope){ + var unspentSkillPoints = { + "lifepath" : $scope.totalSkillPoints.lifepath, + "general" : $scope.totalSkillPoints.general + } + + for(var key in $scope.lifepathSkills){ + var skill = $scope.lifepathSkills[key] + + unspentSkillPoints.lifepath -= skill.lifepathPointsSpent; + unspentSkillPoints.general -= skill.generalPointsSpent; + } + + for(var key in $scope.generalSkills){ + var skill = $scope.generalSkills[key] + + unspentSkillPoints.lifepath -= skill.lifepathPointsSpent; + unspentSkillPoints.general -= skill.generalPointsSpent; + } + + $scope.unspentSkillPoints = unspentSkillPoints; +} + +function openRequiredSkills($scope){ + var required = skillsRequiredToBeOpened($scope.selectedLifepaths); + + var unspentSkillPoints = { + "lifepath" : $scope.unspentSkillPoints.lifepath, + "general" : $scope.unspentSkillPoints.general + } + + for(var key in required){ + // Do nothing if the skill is already opened + if($scope.lifepathSkills[key].pointsSpent() > 0 ){ + continue; + } + + if($scope.lifepathSkills[key].exp($scope.statsForSkillCalc) == 0){ + if ( $scope.lifepathSkills[key].isTraining || $scope.lifepathSkills[key].isMagic ){ + $scope.lifepathSkills[key].lifepathPointsSpent += 2; + unspentSkillPoints.lifepath -= 2; + } else { + $scope.lifepathSkills[key].lifepathPointsSpent += 1; + unspentSkillPoints.lifepath -= 1; + } + } + } + + $scope.unspentSkillPoints = unspentSkillPoints; +} + +/* + Return a hash of skill names that are required to be open + due to lifepaths. +*/ +function skillsRequiredToBeOpened(lifepaths){ + var skillHash = {}; + for(var i = 0; i < lifepaths.length; i++){ + for(var j = 0; j < lifepaths[i].skills.length; j++){ + var skillName = lifepaths[i].skills[j]; + if ( ! (skillName in skillHash) ){ + skillHash[skillName] = 1; + break; + } + } + } + + return skillHash; +} + +/* + When a lifepath is removed, the stat points spent may be more than the available, + leading to a negative amount available. This method attempts to correct the situation + by lowering the spent points. +*/ +function correctStatPoints($scope){ + correctStatPointsHelperLowerPointsOfType($scope, 'physical', 'physicalPointsSpent'); + correctStatPointsHelperLowerPointsOfType($scope, 'mental', 'mentalPointsSpent'); + correctStatPointsHelperLowerPointsOfType($scope, 'either', 'eitherPointsSpent'); +} + +/* + Helper function used by correctStatPoints. This function tries to correct the deficit in + $scope.unspentStatPoints for the specified 'unspentStatField' (one of physical, mental, or either) + by unspending points from the stats, using the field 'displayStatField' + (one of physicalPointsSpent, mentalPointsSpent, eitherPointsSpent) +*/ +function correctStatPointsHelperLowerPointsOfType($scope, unspentStatField, displayStatField){ + if ( $scope.unspentStatPoints[unspentStatField] < 0 ){ + for(var i = 0; i < $scope.stats.length; i++){ + var needed = -$scope.unspentStatPoints[unspentStatField]; + if(needed == 0){ + break; + } + + if( $scope.stats[i][displayStatField] > 0 ){ + if ( $scope.stats[i][displayStatField] >= needed ){ + $scope.stats[i][displayStatField] -= needed; + $scope.unspentStatPoints[unspentStatField] += needed; + } + else { + $scope.unspentStatPoints[unspentStatField] += $scope.stats[i][displayStatField]; + $scope.stats[i][displayStatField] = 0; + } + lowered = true; + } + } + } + +} + +/* If the user adds some general skills to the character and then adds a lifepath that has those skills, + then those skills should be removed from the general list, and the points spent on them refunded. */ +function removeLifepathSkillsFromGeneralSkills($scope){ + for(var key in $scope.lifepathSkills){ + if ( key in $scope.generalSkills ){ + var displaySkill = $scope.generalSkills[key]; + $scope.unspentStatPoints.physical += displaySkill.physicalPointsSpent; + $scope.unspentStatPoints.mental += displaySkill.mentalPointsSpent; + $scope.unspentStatPoints.either += displaySkill.eitherPointsSpent; + delete $scope.generalSkills[key] + } + } +} + +function calculateLifepathTraits($scope, burningData){ + var lifepathTraits = {}; + var totalTraitPoints = 0; + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + + totalTraitPoints += displayLp.traitPts; + + for(var j = 0; j < displayLp.traits.length; j++){ + var name = displayLp.traits[j]; + + lifepathTraits[name] = new DisplayTrait(name, burningData.traits); + } + } + + $scope.lifepathTraits = lifepathTraits; + $scope.totalTraitPoints = totalTraitPoints; + $scope.unspentTraitPoints = totalTraitPoints; +} + +function setCommonTraits($scope, burningData){ + var commonTraits = {} + + if( $scope.selectedLifepaths.length == 0 ) + return; + + var common = $scope.selectedLifepaths[0].commonTraits; + if(common.length > 0){ + for(var j = 0; j < common.length; j++){ + var name = common[j]; + commonTraits[name] = new DisplayTrait(name, burningData.traits); + } + } + $scope.commonTraits = commonTraits; +} + +function purchaseRequiredTraits($scope, burningData){ + var requiredTraits = {}; + var unspentTraitPoints = $scope.unspentTraitPoints; + + var required = traitsRequiredToBeOpened($scope.selectedLifepaths); + + for(name in required){ + requiredTraits[name] = new DisplayTrait(name, burningData.traits); + unspentTraitPoints -= 1; + } + + $scope.unspentTraitPoints = unspentTraitPoints; + $scope.requiredTraits = requiredTraits; +} + +function addBrutalLifeRequiredTraits($scope, burningData){ + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var lp = $scope.selectedLifepaths[i]; + if( lp.brutalLifeTraitName ){ + var trait = new DisplayTrait(lp.brutalLifeTraitName, burningData.traits); + $scope.requiredTraits[lp.brutalLifeTraitName] = trait; + } + } +} + +/* + Return a hash of trait names that are required to be open + due to lifepaths. +*/ +function traitsRequiredToBeOpened(lifepaths){ + var traitHash = {}; + for(var i = 0; i < lifepaths.length; i++){ + for(var j = 0; j < lifepaths[i].traits.length; j++){ + var traitName = lifepaths[i].traits[j]; + if ( ! (traitName in traitHash) ){ + traitHash[traitName] = 1; + break; + } + } + } + + return traitHash; +} + +function calculateUnspentTraitPoints($scope){ + var unspentTraitPoints = $scope.totalTraitPoints; + + var required = hashValues($scope.requiredTraits); + unspentTraitPoints -= required.length; + + var purchased = hashValues($scope.purchasedTraits); + for(var i = 0; i < purchased.length; i++){ + var trait = purchased[i]; + if ( trait.name in $scope.lifepathTraits ){ + unspentTraitPoints -= 1; + } else { + unspentTraitPoints -= trait.cost; + } + } + $scope.unspentTraitPoints = unspentTraitPoints; + +} + + + +/* + rexpr are the requires_expr. Returns a two-element list. + The first element is true if the requirements are satisifed, false + otherwise. The second element are any extra conditions if the first + element is true. These extra conditions semantically descibe extra conditions + that must _later_ be met, for example "the requirements are satisfied as long as + the character takes the trait 'your grace' " + + The extra conditions supported so far are only a list of trait names. +*/ +function areLifepathRequirementsSatisfied($scope, rexpr){ + + // make lookup tables + var selectedLifepathsByName = {} + for(var i = 0; i < $scope.selectedLifepaths.length; i++) { + selectedLifepathsByName[$scope.selectedLifepaths[i].name.toLowerCase()] = true; + } + var selectedLifepathsBySettingAndName = {} + for(var i = 0; i < $scope.selectedLifepaths.length; i++) { + selectedLifepathsBySettingAndName[$scope.selectedLifepaths[i].setting.toLowerCase() + ":" + $scope.selectedLifepaths[i].name.toLowerCase()] = true; + } + + + var checkHasLifepathIn = function(rexpr){ + // This is a [+has_lifepath_in, lp1, lp2, ...] OR [lifepath, lifepath] array. + for(var i = 0; i < rexpr.length; i++){ + var s = rexpr[i] + + if(i == 0 && s.substring(0,1) == "+") + continue; + + // Does the requirement list the required lifepath as setting:name or just name? + if( s.indexOf(":") < 0 ){ + if( selectedLifepathsByName[s] ) + return [true,[]]; + } + else { + if( selectedLifepathsBySettingAndName[s] ) + return [true,[]]; + } + } + return [false,[]]; + } + + var checkHasSex = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: sex predicate is length < 2 when it must be 2"); + return [false, []]; + } + return [rexpr[1].toLowerCase() == $scope.gender.toLowerCase(), []]; + } + + var checkHasNLifepathsIn = function(rexpr){ + if (rexpr.length < 3){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: has_n_lifepaths_in predicate is length < 3 when it must be 3"); + return [false, []]; + } + + var requiredCount = rexpr[1]; + var actualCount = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var lifepath = $scope.selectedLifepaths[i] + for(var j = 2; j < rexpr.length; j++){ + var s = rexpr[j] + // Does the requirement list the required lifepath as setting:name or just name? + var lpName = null; + if( s.indexOf(":") < 0 ){ + // simple name + lpName = lifepath.name.toLowerCase(); + } else { + lpName = lifepath.setting.toLowerCase() + ":" + lifepath.name.toLowerCase(); + } + + if(lpName == s){ + actualCount += 1; + break; + } + } + } + + return [actualCount >= requiredCount, []]; + } + + var checkHasNLifepathsOrMore = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: has_n_lifepaths_or_more predicate is length < 2 when it must be 2"); + return [false, []]; + } + + return [$scope.selectedLifepaths.length >= rexpr[1], []]; + } + + var checkHasNLifepathsOrLess = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: has_n_lifepaths_or_less predicate is length < 2 when it must be 2"); + return [false, []]; + } + + return [$scope.selectedLifepaths.length <= rexpr[1], []]; + } + + var checkAgeLessThan = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: age_less_than predicate is length < 2 when it must be 2"); + return [false, []]; + } + + return [$scope.age < rexpr[1], []]; + } + + var checkAgeGreaterThan = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: age_greater_than predicate is length < 2 when it must be 2"); + return [false, []]; + } + + return [$scope.age > rexpr[1], []]; + } + + var checkTrait = function(rexpr){ + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: trait predicate is length < 2 when it must be 2"); + return [false, []]; + } + + return [true, [rexpr[1]]] + } + + var checkExpr = function(type, rexpr){ + if ( type != "or" && type != "and" ){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: checkExpr called with neither 'or' nor 'and'"); + return [false, []]; + } + + if (rexpr.length < 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: '"+type+"' expression is length < 2 when it must be 2 or more"); + return [false, []]; + } + + var result; + if ( type == "or" ){ + result = false; + } else { + result = true; + } + + var conditions = []; + for(var i = 1; i < rexpr.length; i++){ + // Each element in an expression is itself an expression or a predicate. + var newRexpr = rexpr[i]; + var evalResult = areLifepathRequirementsSatisfied($scope, newRexpr); + + if ( type == "or" ){ + if ( evalResult[0] ){ + result = true; + conditions = evalResult[1]; + break; + } + } else { + // and + if ( ! evalResult[0] ){ + result = false; + break; + } + // Append any returned conditions in newRexpr. + for(var j = 0; j < evalResult[1].length; j++){ + conditions.push(evalResult[1][j]); + } + } + } + + if ( ! result ){ + conditions = []; + } + + return [result, conditions]; + } + + var checkNotExpr = function(rexpr){ + if (rexpr.length != 2){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: '"+type+"' expression is length "+rexpr.length+" when it must exactly 2"); + return [false, []]; + } + + var evalResult = areLifepathRequirementsSatisfied($scope, rexpr[1]); + + return [!evalResult[0], evalResult[1]]; + } + + // evaluate expression + if ( rexpr.length < 1 ){ + console.log("Error in areLifepathRequirementsSatisfied when evaluating expression: expression is length 0!"); + return [false,[]]; + } + + var type = rexpr[0] + if( type == "+has_lifepath_in" || type.substring(0,1) != "+"){ + return checkHasLifepathIn(rexpr); + } else if( type == "+sex"){ + return checkHasSex(rexpr); + } else if( type == "+has_n_lifepaths_in"){ + return checkHasNLifepathsIn(rexpr); + } else if( type == "+has_n_lifepaths_or_more"){ + return checkHasNLifepathsOrMore(rexpr); + } else if( type == "+has_n_lifepaths_or_less"){ + return checkHasNLifepathsOrLess(rexpr); + } else if( type == "+age_less_than"){ + return checkAgeLessThan(rexpr); + } else if( type == "+age_greater_than"){ + return checkAgeGreaterThan(rexpr); + } else if( type == "+trait"){ + return checkTrait(rexpr); + } else if( type == "+and"){ + return checkExpr("and", rexpr) + } else if( type == "+or"){ + return checkExpr("or", rexpr); + } else if( type == "+not"){ + return checkNotExpr(rexpr); + } else { + console.log("No support for lifepath requirement expression " + type); + return [false,[]]; + } +} + +function weaponSkillsNames(){ + return ["Axe", "Bow", "Cudgel", "Crossbow", "Firearms", "Firebombs", "Hammer", "Knives", "Lance", "Mace", "Polearm", "Spear", "Staff", "Sword"] +} + +// Perform some simple validation on the char struct to ensure it seems mostly legit. +function characterStructValid(charStruct){ + if(!("serialize_version" in charStruct)) + return false; + if(!("name" in charStruct)) + return false; + if(!("gender" in charStruct)) + return false; + if(!("stock" in charStruct)) + return false; + if(!("lifepaths" in charStruct)) + return false; + if(!("stats" in charStruct)) + return false; + if(!("skills" in charStruct)) + return false; + if(!("traits" in charStruct)) + return false; + if(!("gear" in charStruct)) + return false; + if(!("property" in charStruct)) + return false; + if(!("relationships" in charStruct)) + return false; + if(!("reputations" in charStruct)) + return false; + if(!("affiliations" in charStruct)) + return false; + + return true; +} + +function calculateTraitWarnings($scope, burningData){ + + // Make lookup maps of traits using lower-case trait names + var allTakenTraitNames = {}; + for(var key in $scope.purchasedTraits){ + allTakenTraitNames[key.toLowerCase()] = 1; + } + for(var key in $scope.requiredTraits){ + allTakenTraitNames[key.toLowerCase()] = 1; + } + + var traitWarnings = []; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var selectedLifepath = $scope.selectedLifepaths[i]; + + // Check the requirements for this lifepath to see if there are extra conditions. + var rexpr = burningData.lifepaths[$scope.stock][selectedLifepath.setting][selectedLifepath.name].requires_expr + + if(rexpr){ + + var result = areLifepathRequirementsSatisfied($scope, rexpr); + for(var k = 0; k < result[1].length; k++){ + var trait = result[1][k]; + + if( ! (trait in allTakenTraitNames) ){ + traitWarnings.push("You must take the '"+trait+"' trait to satisfy the '"+selectedLifepath.name+"' lifepath requirements."); + } + } + } + } + + $scope.lifepathTraitWarnings = traitWarnings; +} + +function applyBonusesFromTraits($scope) { + var traitBonuses = new TraitBonuses(); + + //**** Calculate bonuses + for(var key in $scope.purchasedTraits){ + var displayTrait = $scope.purchasedTraits[key]; + traitBonuses.addTrait(key, displayTrait); + } + + for(var key in $scope.requiredTraits){ + var displayTrait = $scope.requiredTraits[key]; + traitBonuses.addTrait(key, displayTrait); + } + + for(var key in $scope.commonTraits){ + var displayTrait = $scope.commonTraits[key]; + traitBonuses.addTrait(key, displayTrait); + } + + + //**** Apply bonuses + + //** Skills + + for(var key in $scope.lifepathSkills) { + var displaySkill = $scope.lifepathSkills[key]; + displaySkill.bonus = traitBonuses.getAddBonusesForSkill(key); + displaySkill.roundUp = traitBonuses.getRoundUpBonusForSkill(displaySkill); + } + + for(var key in $scope.generalSkills) { + var displaySkill = $scope.generalSkills[key]; + displaySkill.bonus = traitBonuses.getAddBonusesForSkill(key); + displaySkill.roundUp = traitBonuses.getRoundUpBonusForSkill(displaySkill); + } + + + //** Attributes + var attrNames = $scope.attributeNames(); + for(var i = 0; i < attrNames.length; i++) { + var attrName = attrNames[i]; + $scope.attributeBonuses[attrName] = traitBonuses.getAddBonusesForAttr(attrName); + } + + //** Stats + for(var i = 0; i < $scope.stats.length; i++) { + var statName = $scope.stats[i].name; + $scope.stats[i].bonus = traitBonuses.getAddBonusesForStat(statName); + } + +} + +/* + Compute which traits the user can add as special traits. This value depends on character stock so + this function should be called when stock changes. +*/ +function calculateSpecialTraitsForDisplay($scope, burningData){ + var list = []; + + for(var traitName in burningData.traits) { + var trait = burningData.traits[traitName]; + + if ('restrict' in trait){ + if ( trait.restrict.indexOf(validStockToRestrictionStock($scope.stock)) >= 0 && + (trait.restrict.indexOf("special") >= 0 || trait.restrict.indexOf("character") >= 0) ){ + list.push(new DisplayTrait(traitName, burningData.traits)); + } + } else { + // No restriction! As long as cost > 0 (cost 0 is for traits with no cost; not purchaseable) + if ( trait.cost > 0 ) { + list.push(new DisplayTrait(traitName, burningData.traits)); + } + } + } + + if(list.length > 0 && list.indexOf($scope.currentSpecialTrait) < 0 ){ + $scope.currentSpecialTrait = list[0]; + } + $scope.specialTraitsForDisplay = list; +} + +function calculateTotalResourcePoints($scope){ + var totalResourcePoints = 0; + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + var displayLp = $scope.selectedLifepaths[i]; + totalResourcePoints += displayLp.resourcePts; + } + + $scope.totalResourcePoints = totalResourcePoints; +} + +function calculateUnspentResourcePoints($scope){ + var unspentResourcePoints = $scope.totalResourcePoints; + + var reduce = function(vals){ + for(var i = 0; i < vals.length; i++){ + var display = vals[i]; + unspentResourcePoints -= display.cost; + } + } + + reduce(hashValues($scope.relationships)); + reduce(hashValues($scope.gear)); + reduce(hashValues($scope.property)); + reduce(hashValues($scope.affiliations)); + reduce(hashValues($scope.reputations)); + + $scope.unspentResourcePoints = unspentResourcePoints; +} + +function isValidStock(stock){ + return stock == "man" || stock == "elf" || stock == "orc" || stock == "dwarf" || stock == "roden" || stock == "wolf"; +} + +function restrictionStockToValidStock(stock){ + + if ( stock == "mannish" ) + return "man"; + else if ( stock == "elven" ) + return "elf"; + else if ( stock == "orcish" ) + return "orc"; + else if ( stock == "dwarven" ) + return "dwarf"; + else if ( stock == "wolfish" ) + return "wolf"; + else if ( stock == "roden" ) + return "roden"; +} + +function validStockToRestrictionStock(stock){ + + if ( stock == "man" ) + return "mannish"; + else if ( stock == "elf" ) + return "elven"; + else if ( stock == "orc" ) + return "orcish"; + else if ( stock == "dwarf" ) + return "dwarven"; + else if ( stock == "roden" ) + return "roden"; + else if ( stock == "wolf" ) + return "wolfish"; +} + +function attributeModifyingQuestions($scope, attribute) +{ + var result = []; + + var ageMod = function(age){ + return function(){ + return ($scope.age > age ? 1 : 0); + } + } + + if ( attribute == "Greed" ) + { + var willMod = function(){ + return ($scope.statsByName["Will"].exp() <= 4 ? 1 : 0); + } + + var resMod = function(){ + return Math.floor($scope.totalResourcePoints/60); + } + + var twohundredMod = function(){ + return ($scope.age > 200 ? 1 : 0); + } + + var fourhundredMod = function(){ + return ($scope.age > 400 ? 1 : 0); + } + + var lpMod = function(){ + var greedyLps = {"trader":1, "mask bearer":1, "master of arches":1, "master of forges":1, "master engraver":1, "treasurer":1, "quartermaster":1, "seneschal":1, "prince":1 } + + var greed = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() in greedyLps){ + greed++; + } + } + + return greed; + } + + var relMod = function(){ + var greed = 0; + + var rels = hashValues($scope.relationships); + for(var i = 0; i < rels.length; i++){ + if ( rels[i].isHateful ){ + greed++; + if ( rels[i].isImmedFam ) + greed++; + } + else if ( rels[i].isRomantic ) { + greed--; + } + } + + return greed; + } + + result.push( + {question: "+1 Greed if Will exponent is 4 or lower.", computed: true, compute: willMod}, + {question: "+1 Greed for every 60 resource points.", computed: true, compute: resMod}, + {question: "+1 Greed for each of the following lifepaths: Trader, Mask-Bearer, Master of Arches, Master of Forges, Master Engraver, Treasurer, Quartermaster, Seneschal or Prince.", computed: true, compute: lpMod}, + {question: "Has your character coveted something owned by another?", math_label: "(+1 Greed)", modifier: 1}, + {question: "Has your character ever stolen something he coveted?", math_label: "(+1 Greed)", modifier: 1}, + {question: "Has your character ever had his prized treasure stolen from him?", math_label: "(+1 Greed)", modifier: 1}, + {question: "Has your character ever been in the presence of the master craftsmanship of the Dwarven Fathers?", math_label: "(+1 Greed)", modifier: 1}, + {question: "Has your character witnessed an outsider (Elf, Man, Orc, Roden, etc.) in possession of a work of Dwarven Art?", math_label: "(+1 Greed)", modifier: 1}, + {question: "+1 Greed if the character is over 200 years old.", computed: true, compute: ageMod(200)}, + {question: "+1 Greed if the character is over 400 years old.", computed: true, compute: ageMod(400)}, + {question: "Each romantic relationship is -1 Greed. Each hateful relationship is +1 Greed. A hateful immediate family member is +2 Greed.", computed: true, compute: relMod} + ); + } + else if ( attribute == "Health" ) + { + var stockMod = function(){ + return ($scope.stock == "orc" || $scope.stock == "dwarf" || $scope.stock == "elf" ? 1 : 0); + } + + result.push( + {question: "Does the character live in squalor and filth?", math_label: "(-1 Health)", modifier: -1}, + {question: "Is the character frail or sickly?", math_label: "(-1 Health)", modifier: -1}, + {question: "Was the character severely wounded in the past?", math_label: "(-1 Health)", modifier: -1}, + {question: "Has the character been tortured and enslaved?", math_label: "(-1 Health)", modifier: -1}, + {question: "+1 Health if the character is a Dwarf, Elf, or Orc.", computed: true, compute: stockMod}, + {question: "Is the character athletic and active?", math_label: "(+1 Health)", modifier: 1}, + {question: "Does the character live in a really clean and happy place, like the hills in the Sound of Music?", math_label: "(+1 Health)", modifier: 1} + ); + } + else if ( attribute == "Steel" ) + { + var lpMod = function() + { + // "herald":1, "bannerman":1, "scout":1, "sergeant":1, "veteran":1, "cavalryman":1, "captain":1, "military order":1} + var steelyLps = {"conscript":1, "squire":1, "knight":1, "bandit":1, "pirate":1, "military order":1, "sword singer":1}; + var steelySettings = {"professional soldier subsetting":1, "black legion subsetting":1, "dwarven host subsetting":1, "protector subsetting":1}; + + var steel = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() in steelyLps || $scope.selectedLifepaths[i].setting.toLowerCase() in steelySettings){ + steel = 1; + break; + } + } + + return steel; + } + + var woundMod = function() + { + if( lpMod() > 0 ){ + return 1; + } + else + { + return -1; + } + } + + var tortureMod = function() + { + var will = $scope.statsByName['Will'].exp(); + if( will > 4 ) + return 1; + else if ( will < 4 ) + return -1; + else + return 0; + } + + var traitMod = function() + { + return ($scope.hasTrait("Gifted") || $scope.hasTrait("Faithful") ? 1 : 0); + } + + var percMod = function() + { + return ($scope.statsByName['Perception'].exp() >= 6 ? 1 : 0); + } + + var willMod = function() + { + var will = $scope.statsByName['Will'].exp(); + var mod = 0; + if( will > 5 ) + mod++; + if( will > 7 ) + mod++; + return mod; + } + + var forteMod = function() + { + return ($scope.statsByName['Forte'].exp() >= 6 ? 1 : 0); + } + + result.push( + {question: "+1 Steel if the character taken a conscript, soldier, bandit, squire or knight type lifepath.", computed: true, compute: lpMod}, + {question: "Has the character ever been severely wounded?", math_label: "(+1 Steel if combat lifepath taken/-1 Steel if not)", computeModifier: true, compute: woundMod}, + {question: "Has the character ever murdered or killed with his own hand more than once?", math_label: "(+1 Steel)", modifier: 1}, + {question: "Has the character been tortured, enslaved or beaten terribly over time?", math_label: "(+1 Steel if Will is > 4, -1 Steel if Will < 4, +0 if Will is 4)", computeModifier: true, compute: tortureMod}, + {question: "Has the character lead a sheltered life, free of violence and pain?", math_label: "(-1 Steel)", modifier: -1}, + {question: "Has the character been raised in a competitive (but non-violent) culture - sports, debate, strategy games, courting?", math_label: "(+1 Steel)", modifier: 1}, + {question: "Has the character given birth to a child?", math_label: "(+1 Steel)", modifier: 1}, + {question: "+1 Steel if the character Gifted, Faithful or an equivalent.", computed: true, compute: traitMod}, + {question: "+1 Steel if the character's Perception exponent is 6 or higher.", computed: true, compute: percMod}, + {question: "+1 Steel if the character's Will exponent is 5 or higher; an additional +1 if it's 7 or higher.", computed: true, compute: willMod}, + {question: "+1 Steel if the character's Forte exponent is 6 or higher.", computed: true, compute: forteMod} + ); + } + else if ( attribute == "Health" ) + { + var stockMod = function(){ + return ($scope.stock == "orc" || $scope.stock == "dwarf" || $scope.stock == "elf" ? 1 : 0); + } + + result.push( + {question: "Does the character live in squalor and filth?", math_label: "(-1 Health)", modifier: -1}, + {question: "Is the character frail or sickly?", math_label: "(-1 Health)", modifier: -1}, + {question: "Was the character severely wounded in the past?", math_label: "(-1 Health)", modifier: -1}, + {question: "Has the character been tortured and enslaved?", math_label: "(-1 Health)", modifier: -1}, + {question: "+1 Health if the character is a Dwarf, Elf, or Orc.", computed: true, compute: stockMod}, + {question: "Is the character athletic and active?", math_label: "(+1 Health)", modifier: 1}, + {question: "Does the character live in a really clean and happy place, like the hills in the Sound of Music?", math_label: "(+1 Health)", modifier: 1} + ); + } + else if ( attribute == "Grief" ) + { + var protectMod = function(){ + var grief = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].setting.toLowerCase() == "protector subsetting"){ + grief = 1; + break; + } + } + + return grief; + } + + var lpMod1 = function(){ + var lps = {"lancer":1, "lieutenant":1, "captain":1}; + var lps2 = {"lord protector":1, "soother":1}; + + var grief1 = 0; + var grief2 = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() in lps) + { + grief1 = 1; + if( grief2 > 0) + break; + } + if($scope.selectedLifepaths[i].name.toLowerCase() in lps2) + { + grief2 = 1; + if( grief1 > 0) + break; + } + } + + return grief1 + grief2; + } + + var etharchMod = function(){ + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() == "born etharch"){ + return 1; + } + } + + return 0; + } + + var lpMod2 = function(){ + var lps = {"loremaster":1, "adjutant":1, "althing":1}; + + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() in lps) + return 1; + } + + return 0; + } + + var elderMod = function(){ + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if($scope.selectedLifepaths[i].name.toLowerCase() == "elder"){ + return 1; + } + } + + return 0; + } + + var lamentMod = function(){ + var skills = $scope.allSelectedSkills(); + for(key in skills) + { + var skill = skills[key]; + if( skill.exp($scope.statsForSkillCalc) > 0 && beginsWith(key.toLowerCase(), "lament") ) + return 0; + } + for(var i = 0; i < skills.length; i++){ + if( beginsWith(skills[i].name.toLowerCase(), "lament") ) + return 0; + } + + return 1; + } + + var steelMod = function(){ + var steel = $scope.attribute('Steel').exp; + var mod = 0; + if ( steel > 5 ) + mod = steel - 5; + return mod; + } + + var percMod = function(){ + return ($scope.statsByName['Perception'].exp() > 5 ? 1 : 0); + } + + result.push( + {question: "+1 Grief if the character has taken any Protector lifepath.", computed: true, compute: protectMod}, + {question: "+1 Grief if the character has been a Lancer, Lieutenant or Captain; Additional +1 if the character has been a Lord Protector or Soother", computed: true, compute: lpMod1}, + {question: "+1 Grief if the character was Born Etharch", computed: true, compute: etharchMod}, + {question: "+1 Grief if the character has been a Loremaster, Adjutant or Althing", computed: true, compute: lpMod2}, + {question: "+1 Grief if the character has taken the Elder lifepath", computed: true, compute: elderMod}, + {question: "+1 Grief if the character doesn't know any Lamentations", computed: true, compute: lamentMod}, + {question: "Does the character's history include tragedy?", math_label: "(+1 Grief)", modifier: 1}, + {question: "Has the character lived among non-Elven people?", math_label: "(+1 Grief)", modifier: 1}, + {question: "+1 Grief for each point of Steel above 5.", computed: true, compute: steelMod}, + {question: "+1 Grief if the characters Perception is above 5.", computed: true, compute: percMod}, + {question: "+1 Greed if the character is over 500 years old.", computed: true, compute: ageMod(500)}, + {question: "+1 Greed if the character is over 750 years old.", computed: true, compute: ageMod(750)}, + {question: "+1 Greed if the character is over 1000 years old.", computed: true, compute: ageMod(1000)} + ); + } + else if ( attribute == "Hatred" ) + { + var brutalMod = function(){ + var count = 0; + for(var i = 0; i < $scope.selectedLifepaths.length; i++){ + if ( $scope.selectedLifepaths[i].brutalLifeTraitName ){ + count++; + } + } + return count; + } + + var willMod = function() + { + var will = $scope.statsByName['Will'].exp(); + return (will <= 2 ? 1 : 0); + } + + var steelMod = function(){ + var steel = $scope.attribute('Steel').exp; + return (steel >= 5 ? 1 : 0); + } + + var percMod = function(){ + return ($scope.statsByName['Perception'].exp() >= 6 ? 1 : 0); + } + + var traitsMod = function(){ + var val = 0; + if($scope.hasTrait('Kicking The Beast')) + val++; + if($scope.hasTrait('Yowling')) + val++; + if($scope.hasTrait("Where There's A Whip, There's A Way")) + val++; + if($scope.hasTrait("Charging Blindly")) + val++; + if($scope.hasTrait("Cry Of Doom")) + val++; + if($scope.hasTrait("Unrelenting Savagery")) + val++; + if($scope.hasTrait("Humility")) + val++; + if($scope.hasTrait("Life Is Death")) + val++; + if($scope.hasTrait("Pain Life")) + val++; + if($scope.hasTrait("Intense Hatred")) + val++; + if($scope.hasTrait("Silent Hatred")) + val++; + if($scope.hasTrait("Savage Consequences")) + val++; + if($scope.hasTrait("Unrelenting Hatred")) + val++; + if($scope.hasTrait("Naked Hatred")) + val++; + return val; + } + + result.push( + {question: "Was the character ever horribly wounded?", math_label: "(+1 Hatred)", modifier: 1}, + {question: "+1 Hatred for each 1 rolled on the Brutal Life table.", computed: true, compute: brutalMod}, + {question: "Has the character been tortured?", math_label: "(+1 Hatred)", modifier: 1}, + {question: "Has the character ever been a slave to another?", math_label: "(+1 Hatred)", modifier: 1}, + {question: "Has the character ever killed his superior or parents?", math_label: "(+1 Hatred)", modifier: 1}, + {question: "Has the character ever attempted to command a unit of goblins in battle?", math_label: "(+1 Hatred)", modifier: 1}, + {question: "+1 Hatred if the character's Will is 2 or lower", computed: true, compute: willMod}, + {question: "+1 Hatred if the character's Steel is 5 or higher", computed: true, compute: steelMod}, + {question: "+1 Hatred if the character's Perception is 6 or higher", computed: true, compute: percMod}, + {question: "+1 Hatred for each of several hatred-related traits", computed: true, compute: traitsMod} + ); + } + else if ( attribute == "Faith" ) + { + result.push( + {question: "Is God who you trust the most?", math_label: "(+1 Faith)", modifier: 1}, + {question: "When in danger, do you consult God for aid?", math_label: "(+1 Faith)", modifier: 1}, + {question: "Is it only through God that you best serve your allies?", math_label: "(+1 Faith)", modifier: 1} + ); + } + else if ( attribute == "Ancestral Taint" ) + { + var skills = $scope.allSelectedSkills(); + + var primalBarkMod = function() { + return ("Primal Bark" in skills) ? 1 : 0; + } + + var ancestralJawMod = function() { + return ("Ancestral Jaw" in skills) ? 1 : 0; + } + + var grandfathersSongMod = function() { + return ("Grandfather's Song" in skills) ? 1 : 0; + } + + var stinkOfAncientsMod = function() { + return ($scope.hasTrait("Stink Of The Ancient") ? 1 : 0); + } + + var spiritNoseMod = function() { + return ($scope.hasTrait("Spirit Nose") ? 1 : 0); + } + + result.push( + {question: "+1 Ancestral Taint if the character has the Primal Bark skill", computed: true, compute: primalBarkMod}, + {question: "+1 Ancestral Taint if the character has the Ancestral Jaw skill", computed: true, compute: ancestralJawMod}, + {question: "+1 Ancestral Taint if the character has the Grandfather's Song skill", computed: true, compute: grandfathersSongMod}, + {question: "+1 Ancestral Taint if the character has the Stink Of The Ancients trait", computed: true, compute: stinkOfAncientsMod}, + {question: "+1 Ancestral Taint if the character has the Spirit Nose trait", computed: true, compute: spiritNoseMod} + ); + } + else { + //console.log("Error: attribute "+attribute+" doesn't have any modifying questions"); + return null; + } + return result; +} + +function convertAttributeModifierQuestionResultsForSave($scope){ + // Save only the non-computed questions that were answered. + + var result = {}; + + for (key in $scope.attributeModifierQuestionResults){ + var list = []; + + var questions = $scope.attributeModifierQuestionResults[key]; + for(var i = 0; i < questions.length; i++){ + var q = questions[i]; + if ( ("answer" in q) && (!q.computed)){ + list.push({question: q.question, answer: q.answer}); + } + } + + result[key] = list; + } + + return result; +} + +function convertAttributeModifierQuestionResultsForCharsheet($scope){ + // Save only the non-computed questions, and generate the questions for all attributes. + var result = {}; + + var questions = $scope.attributeModifierQuestionResults; + + // Generate the full set of questions for each attribute the user actually has. + var attributeNames = $scope.attributeNames(); + for(var j = 0; j < attributeNames.length; j++){ + var attribute = attributeNames[j]; + + var fullQuestions = attributeModifyingQuestions($scope, attribute) + + if(! fullQuestions){ + // Not an attribute with questions + continue; + } + + var answerHash = {}; + var answers = questions[attribute]; + if(answers){ + for(var i = 0; i < answers.length; i++){ + answerHash[answers[i].question] = answers[i].answer; + } + } + + var resultQuestions = []; + + for(var i = 0; i < fullQuestions.length; i++){ + var q = fullQuestions[i]; + + if ( q.computed ) + continue; + + if(q.question in answerHash){ + q.answer = answerHash[q.question]; + } + + resultQuestions.push(q); + } + + result[attribute] = resultQuestions; + } + + return result; +} + +function loadAttributeModifierQuestionResultsFromSave($scope, questions) +{ + var result = {}; + + // For each attribute for which questions were saved, generate the + // full set of questions, then add in the answers from the save. + // The reason we do this rather than save all questions and answers + // is 1) to save space, and 2) because we can't save the compute function + // to the server, so it needs to be added on load anyhow. + for(attribute in questions){ + var fullQuestions = attributeModifyingQuestions($scope, attribute) + + var answers = questions[attribute]; + var answerHash = {}; + for(var i = 0; i < answers.length; i++){ + answerHash[answers[i].question] = answers[i].answer; + } + + for(var i = 0; i < fullQuestions.length; i++){ + var q = fullQuestions[i]; + if(q.question in answerHash){ + q.answer = answerHash[q.question]; + } + } + + result[attribute] = fullQuestions; + } + + return result; +} + +/** +A number of skills are not defined because they are a specific instance of a general skill; for example +ancient history is a type of history, and has the same roots. This function returns the parent skill for +a specific skill. +*/ +function getGeneralSkillNameFor(skillName){ + + if ( endsWith(skillName, "History") ) + return "History"; + else if( endsWith(skillName, "Doctrine")) + return "Doctrine"; + else if( endsWith(skillName, "Ritual")) + return "Ritual"; + else if( skillName == "Flute" || skillName == "Drum" || skillName == "Lyre" ) + return "Musical Instrument"; + else if( endsWith(skillName, "Husbandry") ) + return "Animal Husbandry"; + else + return skillName; +} + +// Given n stat names, average the stats taking into account shade. Return the resulting [shade, exp] tuple. +var computeStatAverage = function(statsByName, statNames){ + var sum = 0; + var shade = 'B'; + var allGray = true; + var stats = []; + + var getShade = function(stat){ + var s = stat.shade; + if(! s){ + s = stat.calcshade(); + } + return s; + } + + if(statNames.length == 1){ + var stat = statsByName[statNames[0]]; + return [getShade(stat), stat.exp()]; + } + + // Convert names to actual DisplayStat structs. + for(var i = 0; i < statNames.length; i++){ + stats[i] = statsByName[statNames[i]]; + } + + for(var i = 0; i < stats.length; i++){ + if(getShade(stats[i]) == 'B'){ + allGray = false; + break; + } + } + + if(allGray) + shade = 'G'; + + for(var i = 0; i < stats.length; i++){ + if(getShade(stats[i]) == 'G' && !allGray){ + sum += 2; + } + + sum += stats[i].exp(); + } + + var exp = Math.floor( sum / stats.length ); + return [shade, exp]; + +} + +function calculateItemsFromList(resources, type){ + var rc = []; + for(var i = 0; i < resources.length; i++){ + var resource = resources[i]; + if(! resource.type || resource.type == type){ + if(resource.resources){ + rc.push({ "displayName" : resource.name + "...", "name": resource.name, "resources": calculateItemsFromList(resource.resources) }); + } + else + { + rc.push({ "displayName" : resource.name + " (" + resource.rp + " rps)", "name": resource.name, "cost" : resource.rp} ); + } + } + } + return rc; +} + +function calculateHierarchyListForSelect($scope, burningData, type) { + var rc = []; + var resources = burningData.resources[$scope.stock]; + + if(! resources ) + { + resources = []; + } + + return calculateItemsFromList(resources, type); + +} + +function calculateGearSelectionLists($scope, burningData) { + $scope.currentSelectListGear = []; + $scope.gearListForSelect = []; + for(var i = 0; i < 3; i++) + $scope.currentSelectListGear.push({}); + + $scope.gearListForSelect[0] = calculateHierarchyListForSelect($scope, burningData, 'gear'); + if($scope.gearListForSelect[0].length > 0) + $scope.currentSelectListGear[0] = $scope.gearListForSelect[0][0]; + + $scope.calculateHierarchyListForSelectN($scope.gearListForSelect, $scope.currentSelectListGear, 1); +} + +function calculatePropertySelectionLists($scope, burningData) { + $scope.currentSelectListProperty = []; + $scope.propertyListForSelect = []; + for(var i = 0; i < 3; i++) + $scope.currentSelectListProperty.push({}); + + $scope.propertyListForSelect[0] = calculateHierarchyListForSelect($scope, burningData, 'property'); + if($scope.propertyListForSelect[0].length > 0) + $scope.currentSelectListProperty[0] = $scope.propertyListForSelect[0][0]; + + $scope.calculateHierarchyListForSelectN($scope.propertyListForSelect, $scope.currentSelectListProperty, 1); +} + +function populateUiFieldsFromDisplayResource($scope, type, resource) { + if(type == 'relationship'){ + $scope.currentRelationshipDesc = resource.desc; + $scope.currentRelationshipImportance = resource.importance; + $scope.currentRelationshipIsImmedFam = resource.isImmedFam; + $scope.currentRelationshipIsOtherFam = resource.isOtherFam; + $scope.currentRelationshipIsRomantic = resource.isRomantic; + $scope.currentRelationshipIsForbidden = resource.isForbidden; + $scope.currentRelationshipIsHateful = resource.isHateful; + } + else if (type == 'gear'){ + $scope.currentGearCost = resource.cost; + $scope.currentGearDesc = resource.desc; + } + else if (type == 'property'){ + $scope.currentPropertyCost = resource.cost; + $scope.currentPropertyDesc = resource.desc; + } + else if (type == 'affiliation'){ + $scope.currentAffiliationDesc = resource.desc; + $scope.currentAffiliationImportance = resource.importance; + } + else if (type == 'reputation'){ + $scope.currentReputationDesc = resource.desc; + $scope.currentReputationImportance = resource.importance; + } +} diff --git a/src/public/js/jquery-1.10.2.min.js b/src/public/js/jquery-1.10.2.min.js new file mode 100755 index 0000000..da41706 --- /dev/null +++ b/src/public/js/jquery-1.10.2.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x(" + + + + diff --git a/src/views/partials/choose_appropriate_weapons.erb b/src/views/partials/choose_appropriate_weapons.erb new file mode 100755 index 0000000..38df383 --- /dev/null +++ b/src/views/partials/choose_appropriate_weapons.erb @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/src/views/partials/choose_character.erb b/src/views/partials/choose_character.erb new file mode 100755 index 0000000..7673459 --- /dev/null +++ b/src/views/partials/choose_character.erb @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/src/views/partials/choose_stat_penalty.erb b/src/views/partials/choose_stat_penalty.erb new file mode 100755 index 0000000..20faf24 --- /dev/null +++ b/src/views/partials/choose_stat_penalty.erb @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/src/views/partials/choose_trait.erb b/src/views/partials/choose_trait.erb new file mode 100755 index 0000000..e8e7da6 --- /dev/null +++ b/src/views/partials/choose_trait.erb @@ -0,0 +1,42 @@ + + + \ No newline at end of file diff --git a/src/views/partials/choose_weapon_of_choice.erb b/src/views/partials/choose_weapon_of_choice.erb new file mode 100755 index 0000000..a48154c --- /dev/null +++ b/src/views/partials/choose_weapon_of_choice.erb @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/src/views/partials/config.erb b/src/views/partials/config.erb new file mode 100755 index 0000000..4741619 --- /dev/null +++ b/src/views/partials/config.erb @@ -0,0 +1,38 @@ +
+
+
+ + Enforce lifepath requirements +
+
+ + Enforce point limits (stat points, skill points, trait points, etc.) +
+
+ + + + +
+
 
+
+
+
+ Modify Appropriate Weapons: +
+
+ +
+
+ Edit +
+
+ Delete +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/views/partials/emotional_attr_questions.erb b/src/views/partials/emotional_attr_questions.erb new file mode 100755 index 0000000..6b8b62d --- /dev/null +++ b/src/views/partials/emotional_attr_questions.erb @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/src/views/partials/help.erb b/src/views/partials/help.erb new file mode 100755 index 0000000..8fcf930 --- /dev/null +++ b/src/views/partials/help.erb @@ -0,0 +1,200 @@ +
+ +
+
+ +
+
+

Introduction

+
+ Charred (Char·ed) +
+
+
    +
  1. adj. Burned and black.
  2. +
  3. n. A portmanteau of character and editor.
  4. +
+
+

+ Welcome to Charred: the unofficial, online, Burning-Wheel Gold character burner. + The first part of this guide goes over the main features of Charred in the order that they appear + in the main view. At the end is a description of some tricks for specific stocks. +

+

Tools

+

+ This section of Charred contains features for uploading and downloading data: +

+

+ Create PDF Character Sheet. + Click this link to download a PDF version of your character so far. The character sheet format is + based on the BWHQ Official Short-Term Game Character Sheet with the answers to the + attribute-modifying questions appended to the end. +

+

+ Reset Character. + Remove all entered data from the character sheet leaving it blank. +

+

+ Download Character. + Save a copy of the current character data as a .char file on your harddrive. You can pass this + file along to other people to allow them to view your character. +

+

+ Upload Character. + Load a character that was saved as a .char file. +

+

Character

+

+ This section contains general character information. +

+

+ Name. + The character's name. Click the Gen link to regenerate a random name. +

+

+ Stock. + The character's stock. Be careful: changing the stock resets the character, so all changes are lost! +

+

+ Age. + The character's age calculated from lifepaths and leads. +

+

Lifepaths

+

+ In this section you choose the lifepaths for your character. By default only the settings and lifepaths you are + allowed to take based on the lifepath requirements and restrictions are visible. If you are interested + in just browsing what's available, in the Settings you can disable the requirements checking so that all lifepaths + may be selected. +

+

Stats and Attributes

+

+ This section shows the current allocation of stats and attributes for your character. The remaining stat points are shown + at the top, and the points allocated to each stat are shown below. The attributes, which are computed based on the stats, are shown to the right. +

+

+ Each stat can be increased or decreased by clicking the + and - buttons to the right of the exponent. If you have enough stat points remaining, + you can shade-shift a stat by clicking it's shade; for example, to shade-shift Will you will need to have 5 Mental points + (or the equivalent in Mental and Either points) unspent. +

+

+ Clicking the Distribute button automatically allocates all of the stat points evenly amongst the different stats. +

+

+ Some attributes are displayed with a 'modify' link to the right. Clicking this link allows you to answer the questions that modify that attribute. +

+

Skills

+

+ This section is used to choose the skills for your character. As you add lifepaths this section slowly fills with available skills, and the + required skills for each lifepath are opened. All opened skills are shown in bold. Additional skills can be added using the General Skills dropdown, + for which only General skill points can be spent. +

+

+ Available but unopened skills don't count as part of the character; they don't show up on the character sheet, and are only used in character burning. + An available skill can be opened by spending points towards it using the + button to the right. +

+

+ When you increase a skill's exponent, if the skill is a lifepath skill, then both lifepath and general skills may be spent on it, whereas if the + skill is a general skill only general points may be spent on it. Charred doesn't provide a mechanism for explicitly allocating the general points; + instead a simple heuristic is used: points are drawn from the lifepath points pool first if possible, then when that pool is exhaused points are + drawn from the general pool. For example, if the character has the Accounting skill from a lifepath, and has 3 lifepath and 2 general points, then + clicking + three times will exhaust the lifepath points pool leaving 2 general points unspent; clicking + twice more will exhaust the general points + pool. +

+

+ Add Custom -Wise. + This field can be used to make up a -Wise skill appropriate to the campaign. The skill will be rooted in Perception as all -wises are. +

+

Traits

+

+ This section is used to choose the traits for your character. Traits from lifepaths, which all cost 1 point, are available from the + Add Trait from Lifepath dropdown, while special traits can be chosen from the 'Special Trait' list. +

+

+ Search Traits... + This link opens a more advanced trait-choosing dialog. In the dialog you can filter traits by type, by cost, and by whether or not it's + affordable; that is, you have enough points to buy it. The filters combine, so only traits that match all criteria are shown. + The only non-trivial feature on this dialog is the Cost filter, which accepts a simple + math expression. Entering < 2 would display all traits that cost less than 2 points. Conversely > 4 would show all traits costing more + than 4. Finally = 3 would show all traits costing exactly 3 points. +

+

Resources

+

+ This section is used to purchase resources for your character from different categories: + gear, property, relationships, reputations, and affiliations. + The dropdown labelled Select Category is used to switch which category of resources will be shown. + When the dropdown labelled Select Category is changed, the interface in the Resources section is switched to the appropriate + one. +

+

+ The interfaces for the resource categories are largely self-explanatory, except for Gear and Property. For Gear and + Property there are two separate sections for adding a resource: Add, which is used to choose an item from a list, + and Custom Add, which is used to create an ad-hoc item. When choosing from a list, any item from the list ending with + an ellipsis indicates a category of items which when selected will cause a new dropdown to appear to the right. The + new dropdown may then be used to select a specific item from the category (which may itself be another category). +

+

Modifying existing resources

+

+ To modify a resource after it's been added, follow these steps: +

    +
  1. Remove the resource. Its contents will populate the 'Add' fields. For Gear and Property, the 'Add Custom' fields are populated instead.
  2. +
  3. Edit the resource.
  4. +
  5. Click 'Add' to add the resource again.
  6. +
+

+

Roden

+

+ Roden are an old stock that appeared in the Burning Wheel Revised Monster Burner, but were never updated for + Burning Wheel Gold. They have been adapted to appear in this burner, but some liberties were taken (by necessity) to + mold them to work with the Gold version. +

+

+ The revised edition defined a 'Broken' trait for Roden; in Charred it is named 'Broken Spirit'. +

+

Great Wolves

+

+ Great Wolves are an old stock that appeared in the Burning Wheel Revised Monster Burner, but were never updated for + Burning Wheel Gold. They have been adapted to appear in this burner, but some liberties were taken (by necessity) to + mold them to work with the Gold version. +

+

+ Great Wolves have an emotional attribute that only appears when a certain trait is bought. Originally the trait was named + 'Chosen One', but in Charred it appears as 'Chosen Wolf'. +

+

+ The revised edition defined a 'Broken' trait for Great Wolves; in Charred it is named 'Broken Wolf'. Similarly the previous + Hunting skill for wolves has been renamed to 'Wolfish Hunting'. +

+
+
+
\ No newline at end of file diff --git a/src/views/partials/main.erb b/src/views/partials/main.erb new file mode 100755 index 0000000..971349f --- /dev/null +++ b/src/views/partials/main.erb @@ -0,0 +1,818 @@ +
+
+
+

+ + Tools + +

+
+ + +
+
+
+
+
+ Name: +
+
+ +
+
+ Gen +
+
+ + Stock: + +
+
+ +
+
+ + Age: + + {{age}} +
+
+ + Gender: + +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
{{lp.displayName}}
+
+
+ + + + + yrs + +
+
{{lp.time}} yrs
+
{{lp.resourcePts}} res
+
{{lp.displayStat()}}
+
{{lp.displayLeads()}}
+
+ remove +
+
+
+
 
+
+
+
+
+ + Skills: + + {{lp.displaySkills()}} +
+
+
+
+
+ + Traits: + + {{lp.traitPts}} pt: {{lp.displayTraits()}} +
+
+
+
+
+ Requires: + {{lp.requires}} +
+
+
+
+
+ Restrictions: + {{lp.restrict}} +
+
+
+
+
+ Note: + {{lp.note}} +
+
+
+
+
+ Brutal Life: + Die of Fate roll was {{lp.brutalLifeDOF}}. + Unfortunately, you gained the {{lp.brutalLifeTraitName}} trait. +
+
+
+
+
+

Add Lifepath

+
+
+
+ +
+
+ +
+
+ Add +
+
+
+
+ You've removed a lifepath where the Brutal Life rules caused an unsavoury trait. Removing the lifepath + means your character chose to bow and prostrate before his betters, and cannot progress any further in + character burning. +
+
+
+
+
+ +
+
+
+
+
+ Remaining: + Physical: {{unspentStatPoints.physical}}/{{totalStatPoints.physical}} pts, + Mental: {{unspentStatPoints.mental}}/{{totalStatPoints.mental}} pts, + Either: {{unspentStatPoints.either}}/{{totalStatPoints.either}} pts +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ {{stat.name}} +
+
+ + {{stat.exp()}} +
+ + +
+
+
+
+
+
+
+ {{attrname}} +
+
+ + + + + {{attribute(attrname).shade}} + + {{attribute(attrname).exp}} +
+
+ modify +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + +
SuLiMiSeTrMo
B{{ptgs.su}}B{{ptgs.li}}B{{ptgs.mi}}B{{ptgs.se}}B{{ptgs.tr}}B{{ptgs.mo}}
+ + + + + +
+

+ + Skills + +

+
+
+
+ Remaining: + Lifepath: {{unspentSkillPoints.lifepath}}/{{totalSkillPoints.lifepath}} pts, General: {{unspentSkillPoints.general}}/{{totalSkillPoints.general}} pts +
+
+
    +
  • +
    +
    +
    + Name +
    +
    + Root +
    +
    + Shade and Exponent +
    +
    + Notes +
    +
    +
    +
  • + + +
  • +
    +
    +
    + + {{skill.name}} + +
    +
    + {{skill.displayRoots()}} +
    +
    + {{skill.shade(statsForSkillCalc)}} {{skill.exp(statsForSkillCalc)}} +
    + + +
    +
    +
    + +
    +
    + {{skill.notes()}} +
    +
    + +
    +
    +
    +
  • +
+
+
+
+

Add General Skill

+
+
+

Add Custom -Wise

+
+
+
+
+ +
+
+ Add +
+
+ +
+
+ Add +
+
+
+
+
+
+

+ + Traits + +

+
+
+
+
{{warn}}
+
+ + {{warn}} +
+ Remaining: + {{unspentTraitPoints}}/{{totalTraitPoints}} pts +
+
+
    +
  • +
    +
    +
    + Name +
    +
    + Type +
    +
    +
    +
  • +
  • +
    +
    +
    + {{trait.name}} +
    +
    + {{trait.typeForDisplay()}} +
    +
    +
    +
  • +
  • +
    +
    +
    + {{trait.name}} +
    +
    + {{trait.typeForDisplay()}} +
    +
    + +
    +
    +
    +
  • +
  • +
    +
    +
    + {{trait.name}} +
    +
    + {{trait.typeForDisplay()}} +
    +
    +
    +
  • +
+
+
+
+

Add Trait from Lifepaths

+
+
+

Add Special Trait

+
+
+
+
+ +
+
+ Add +
+
+ +
+
+ Add + | + Search traits... +
+
+
+
+
+ +
+
+
+ + {{warn}} +
+ Remaining: + {{unspentResourcePoints}}/{{totalResourcePoints}} rps +
+
+
    +
  • +
    +
    +
    + Type +
    +
    + Desc +
    +
    + Cost +
    +
    +
    +
  • +
  • +
    +
    +
    + Gear +
    +
    + {{gear.forDisplay()}} +
    +
    + {{gear.cost}} +
    +
    + remove +
    +
    +
    +
  • +
  • +
    +
    +
    + Property +
    +
    + {{property.forDisplay()}} +
    +
    + {{property.cost}} +
    +
    + remove +
    +
    +
    +
  • +
  • +
    +
    +
    + Relationship +
    +
    + {{rel.forDisplay()}} +
    +
    + {{rel.cost}} +
    +
    + remove +
    +
    +
    +
  • +
  • +
    +
    +
    + Affiliation +
    +
    + {{rel.forDisplay()}} +
    +
    + {{rel.cost}} +
    +
    + remove +
    +
    +
    +
  • +
  • +
    +
    +
    + Reputation +
    +
    + {{rel.forDisplay()}} +
    +
    + {{rel.cost}} +
    +
    + remove +
    +
    +
    +
  • +
+
+
+
+ Select Category +
+
+ +
+
+
+
+

Add Gear

+

Add Property

+

Add Relationship

+

Add Affiliation

+

Add Reputation

+
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ Add +
+
+
+
+
+
+
+
+
+

Add Custom Gear

+
+
+
+
+ +
+
+ +
+
+ Add + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ Add +
+
+
+
+
+
+
+
+
+

Add Custom Property

+
+
+
+
+ +
+
+ +
+
+ Add +
+
+
+
+
+
+ +
+
+ +
+
+ Add +
+
+
+
+ Immediate family: -2 rps +
+
+ Other family: -1 rps +
+
+ Romantic: -2 rps +
+
+ Forbidden: -1 rps +
+
+ Hateful or Rivals: -2 rps +
+
+
+
+
+
+ +
+
+ +
+
+ Add +
+
+
+
+
+
+ +
+
+ +
+
+ Add +
+
+
+
+
+ + +Charred v{{serverSettings.versionString}} \ No newline at end of file diff --git a/src/views/partials/upload_character.erb b/src/views/partials/upload_character.erb new file mode 100755 index 0000000..3c853a5 --- /dev/null +++ b/src/views/partials/upload_character.erb @@ -0,0 +1,27 @@ + +
+ + +
\ No newline at end of file

r0{ES^0{Q5N*E1YyB>F$z9V@U667(GTiyvmr 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 z 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