|
|
|
require 'json'
|
|
|
|
|
|
|
|
module CharredData
|
|
|
|
def self.merge_data!(to, from)
|
|
|
|
from.keys.each do |k|
|
|
|
|
to[k] = from[k]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.lifepath_requirements(expr)
|
|
|
|
if expr.is_a? Numeric
|
|
|
|
[]
|
|
|
|
elsif expr.is_a? String
|
|
|
|
if expr.start_with? "+"
|
|
|
|
[]
|
|
|
|
else
|
|
|
|
expr
|
|
|
|
end
|
|
|
|
elsif expr.is_a? Array
|
|
|
|
(expr.map { |e| self.lifepath_requirements(e) }).flatten
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.load_wizard_burner(data)
|
|
|
|
puts 'Loading wizard burner'
|
|
|
|
file = File.read('data/lifepaths/wizard.json')
|
|
|
|
wizard_data = JSON.parse(file)
|
|
|
|
|
|
|
|
file = File.read('data/wizard_skills.json')
|
|
|
|
wizard_skills = JSON.parse(file)
|
|
|
|
self.merge_data!(data[:skills], wizard_skills)
|
|
|
|
|
|
|
|
file = File.read('data/wizard_traits.json')
|
|
|
|
wizard_traits = JSON.parse(file)
|
|
|
|
self.merge_data!(data[:traits], wizard_traits)
|
|
|
|
|
|
|
|
man = data[:lifepaths]['man']
|
|
|
|
|
|
|
|
man['College of Magic Setting'] = wizard_data['College of Magic Setting']
|
|
|
|
man['Death Cult Setting'] = wizard_data['Death Cult Setting']
|
|
|
|
|
|
|
|
self.merge_data!(data[:lifepaths]['orc']['Servant Of The Dark Blood Subsetting'], wizard_data['Servant Of The Dark Blood Subsetting'])
|
|
|
|
|
|
|
|
[
|
|
|
|
'Peasant Setting',
|
|
|
|
'Villager Setting',
|
|
|
|
'City Dweller Setting',
|
|
|
|
'Noble Court Subsetting',
|
|
|
|
'Outcast Subsetting'
|
|
|
|
].each do |setting|
|
|
|
|
self.merge_data!(man[setting], wizard_data[setting])
|
|
|
|
end
|
|
|
|
|
|
|
|
[
|
|
|
|
'Peasant Setting',
|
|
|
|
'Villager Setting',
|
|
|
|
'City Dweller Setting',
|
|
|
|
'Seafaring Setting',
|
|
|
|
'Servitude And Captive Setting'
|
|
|
|
].each do |setting|
|
|
|
|
self.merge_data!(man[setting], {
|
|
|
|
'Gifted Child' => wizard_data['Special Gifted Lifepaths']['Gifted Child']
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
[
|
|
|
|
'Noble Court Subsetting',
|
|
|
|
'Religious Subsetting',
|
|
|
|
'Outcast Subsetting',
|
|
|
|
'Professional Soldier Subsetting'
|
|
|
|
].each do |setting|
|
|
|
|
self.merge_data!(man[setting], {
|
|
|
|
'Apt Pupil' => wizard_data['Special Gifted Lifepaths']['Apt Pupil']
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
leads_short = {
|
|
|
|
'College of Magic Setting' => 'College',
|
|
|
|
'Death Cult Setting' => 'Death',
|
|
|
|
}
|
|
|
|
|
|
|
|
# backfill leads
|
|
|
|
leads_short.keys.each do |wiz_set|
|
|
|
|
wizard_data[wiz_set].keys.each do |wiz_lp|
|
|
|
|
lifepath = wizard_data[wiz_set][wiz_lp]
|
|
|
|
next if !lifepath['requires_expr']
|
|
|
|
|
|
|
|
requirements = self.lifepath_requirements(lifepath['requires_expr'])
|
|
|
|
|
|
|
|
requirements.each do |req|
|
|
|
|
setting = nil
|
|
|
|
req_lp = req
|
|
|
|
setting, req_lp = req.split(':') if req.include? ':'
|
|
|
|
|
|
|
|
man.keys.each do |man_set|
|
|
|
|
next if wiz_set.downcase == man_set.downcase
|
|
|
|
next if setting && setting != man_set.downcase
|
|
|
|
man[man_set].keys.each do |man_lp|
|
|
|
|
next if req_lp != man_lp.downcase
|
|
|
|
|
|
|
|
#puts "adding #{wiz_set}:#{wiz_lp} lead to #{man_set}:#{man_lp}"
|
|
|
|
|
|
|
|
man[man_set][man_lp]['key_leads'] |= [wiz_set]
|
|
|
|
man[man_set][man_lp]['leads'] |= [leads_short[wiz_set]]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# backfill Apt Pupil == Neophyte Sorcerer connection
|
|
|
|
man.keys.each do |man_set|
|
|
|
|
man[man_set].keys.each do |man_lp|
|
|
|
|
requirements = self.lifepath_requirements(man[man_set][man_lp]['requires_expr'])
|
|
|
|
next if requirements.include? 'apt pupil'
|
|
|
|
requirements.each do |req|
|
|
|
|
setting = nil
|
|
|
|
req_lp = req
|
|
|
|
setting, req_lp = req.split(':') if req.include? ':'
|
|
|
|
|
|
|
|
next unless req_lp.downcase == 'neophyte sorcerer'
|
|
|
|
|
|
|
|
if man[man_set][man_lp]['requires_expr'].include? 'neophyte sorcerer'
|
|
|
|
man[man_set][man_lp]['requires_expr'] |= ['apt pupil']
|
|
|
|
else
|
|
|
|
puts "warning, could not add apt pupil to deep requirements array at #{man_set}:#{man_lp}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
data[:lifepaths]['man'] = man
|
|
|
|
puts 'loaded!'
|
|
|
|
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
|